LyoKICogIEludGVyZmFjZXMgTUlCIGdyb3VwIGltcGxlbWVudGF0aW9uIC0gaW50ZXJmYWNlcy5jCiAqCiAqLwoKLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0KHMpLiAgU2VlCiAqIHRoZSBOZXQtU05NUCdzIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBkZXRhaWxzIGFuZCBvdGhlciBjb3B5cmlnaHRzCiAqIHRoYXQgbWF5IGFwcGx5OgogKi8KLyoKICogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBjb3B5cmlnaHRlZCBieToKICogQ29weXJpZ2h0IKkgMjAwMyBTdW4gTWljcm9zeXN0ZW1zLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAqIFVzZSBpcyBzdWJqZWN0IHRvIGxpY2Vuc2UgdGVybXMgc3BlY2lmaWVkIGluIHRoZSBDT1BZSU5HIGZpbGUKICogZGlzdHJpYnV0ZWQgd2l0aCB0aGUgTmV0LVNOTVAgcGFja2FnZS4KICovCgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtY29uZmlnLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1mZWF0dXJlcy5oPgoKbmV0c25tcF9mZWF0dXJlX3Byb3ZpZGUoaW50ZXJmYWNlX2xlZ2FjeSkKCiNpZiBkZWZpbmVkKE5FVFNOTVBfSUZORVRfTkVFRFNfS0VSTkVMKSAmJiAhZGVmaW5lZChfS0VSTkVMKSAmJiAhZGVmaW5lZChORVRTTk1QX0lGTkVUX05FRURTX0tFUk5FTF9MQVRFKQojZGVmaW5lIF9LRVJORUwgMQojZGVmaW5lIF9JX0RFRklORURfS0VSTkVMCiNlbmRpZgoKI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKCiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIGRlZmluZWQoTkVUU05NUF9JRk5FVF9ORUVEU19LRVJORUwpICYmICFkZWZpbmVkKF9LRVJORUwpICYmIGRlZmluZWQoTkVUU05NUF9JRk5FVF9ORUVEU19LRVJORUxfTEFURSkKI2RlZmluZSBfS0VSTkVMIDEKI2RlZmluZSBfSV9ERUZJTkVEX0tFUk5FTAojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaWZuZGVmIFNUUkVBTV9ORUVEU19LRVJORUxfSVNMQU5EUwojaWYgSEFWRV9TWVNfU1RSRUFNX0gKI2luY2x1ZGUgPHN5cy9zdHJlYW0uaD4KI2VuZGlmCiNlbmRpZgojaWYgSEFWRV9TWVNfU09DS0VUVkFSX0gKI2luY2x1ZGUgPHN5cy9zb2NrZXR2YXIuaD4KI2VuZGlmCgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLSU9fSAojaW5jbHVkZSA8c3lzL3NvY2tpby5oPgojZW5kaWYKI2lmIEhBVkVfRkNOVExfSAojaW5jbHVkZSA8ZmNudGwuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19JT0NUTF9ICiNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX0gKI2luY2x1ZGUgPG5ldC9pZi5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JTl9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pbl92YXIuaD4KI2VuZGlmCiNpZiBIQVZFX05FVF9JRl9WQVJfSAojaW5jbHVkZSA8bmV0L2lmX3Zhci5oPgojZW5kaWYKI2lmZGVmIF9JX0RFRklORURfS0VSTkVMCiN1bmRlZiBfS0VSTkVMCiNlbmRpZgojaWZkZWYgU1RSRUFNX05FRURTX0tFUk5FTF9JU0xBTkRTCiNpZiBIQVZFX1NZU19TVFJFQU1fSAojaW5jbHVkZSA8c3lzL3N0cmVhbS5oPgojZW5kaWYKI2VuZGlmCiNpZiBIQVZFX05FVF9ST1VURV9ICiNpbmNsdWRlIDxuZXQvcm91dGUuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fU1lTVE1fSAojaW5jbHVkZSA8bmV0aW5ldC9pbl9zeXN0bS5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX0hBU0hJTkdfSAojaW5jbHVkZSA8c3lzL2hhc2hpbmcuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSU5fVkFSX0gKI2luY2x1ZGUgPG5ldGluZXQvaW5fdmFyLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRJTkVUX0lQX0gKI2luY2x1ZGUgPG5ldGluZXQvaXAuaD4KI2VuZGlmCiNpZmRlZiBORVRTTk1QX0VOQUJMRV9JUFY2CiNpZiBIQVZFX05FVElORVRfSVA2X0gKI2luY2x1ZGUgPG5ldGluZXQvaXA2Lmg+CiNlbmRpZgojZW5kaWYKI2lmIEhBVkVfU1lTX1FVRVVFX0gKI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JUF9WQVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pcF92YXIuaD4KI2VuZGlmCiNpZmRlZiBORVRTTk1QX0VOQUJMRV9JUFY2CiNpZiBIQVZFX05FVE5FVFNOTVBfRU5BQkxFX0lQVjZfSVA2X1ZBUl9ICiNpbmNsdWRlIDxuZXRpbmV0Ni9pcDZfdmFyLmg+CiNlbmRpZgojZW5kaWYKI2lmIEhBVkVfTkVUSU5FVF9JTl9QQ0JfSAojaW5jbHVkZSA8bmV0aW5ldC9pbl9wY2IuaD4KI2VuZGlmCiNpZiBIQVZFX05FVElORVRfSUZfRVRIRVJfSAojaW5jbHVkZSA8bmV0aW5ldC9pZl9ldGhlci5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX1RZUEVTX0gKI2luY2x1ZGUgPG5ldC9pZl90eXBlcy5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX0RMX0gKI2lmbmRlZiBkeW5peAojaW5jbHVkZSA8bmV0L2lmX2RsLmg+CiNlbHNlCiNpbmNsdWRlIDxzeXMvbmV0L2lmX2RsLmg+CiNlbmRpZgojZW5kaWYKI2lmIEhBVkVfSU5FVF9NSUIyX0gKI2luY2x1ZGUgPGluZXQvbWliMi5oPgojZW5kaWYKI2lmIEhBVkVfSU9DVExTX0gKI2luY2x1ZGUgPGlvY3Rscy5oPgojZW5kaWYKCiNpZmRlZiBzb2xhcmlzMgojIGluY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlICJrZXJuZWxfc3Vub3M1LmgiCiNlbHNlCiNpbmNsdWRlICJrZXJuZWwuaCIKI2VuZGlmCgojaWZkZWYgaHB1eAojaW5jbHVkZSA8c3lzL21pYi5oPgojaW5jbHVkZSA8bmV0aW5ldC9taWJfa2Vybi5oPgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXggKi8KCiNpZmRlZiBjeWd3aW4KI2luY2x1ZGUgPHdpbmRvd3MuaD4KI2VuZGlmCgojaWYgSEFWRV9TWVNfU1lTQ1RMX0gKI2luY2x1ZGUgPHN5cy9zeXNjdGwuaD4KCiNpZiBkZWZpbmVkKGZyZWVic2QzKSB8fCBkZWZpbmVkKGZyZWVic2Q0KSB8fCBkZWZpbmVkKGZyZWVic2Q1KQojICAgIGRlZmluZSBVU0VfU1lTQ1RMX0lGTElTVAojZWxzZQojIGlmIGRlZmluZWQoQ1RMX05FVCkgJiYgIWRlZmluZWQoZnJlZWJzZDIpICYmICFkZWZpbmVkKG5ldGJzZDEpCiMgIGlmZGVmIFBGX1JPVVRFCiMgICBpZmRlZiBORVRfUlRfSUZMSVNUCiMgICAgaWZuZGVmIG5ldGJzZDEKIyAgICAgZGVmaW5lIFVTRV9TWVNDVExfSUZMSVNUCiMgICAgZW5kaWYKIyAgIGVuZGlmCiMgIGVuZGlmCiMgZW5kaWYKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkZWZpbmVkKGZyZWVic2QzKSAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhBVkVfU1lTX1NZU0NUTF9IICovCgojaWYgSEFWRV9PU1JFTERBVEVfSAojaW5jbHVkZSA8b3NyZWxkYXRlLmg+CiNlbmRpZgojaWZkZWYgTkVUU05NUF9DQU5fVVNFX1NZU0NUTAojaW5jbHVkZSA8c3lzL3N5c2N0bC5oPgojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L2F1dG9fbmxpc3QuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3N5c09SVGFibGUuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2RhdGFfYWNjZXNzL2ludGVyZmFjZS5oPgoKI2luY2x1ZGUgImludGVyZmFjZXMuaCIKI2luY2x1ZGUgInN0cnVjdC5oIgojaW5jbHVkZSAidXRpbF9mdW5jcy5oIgojaW5jbHVkZSAidXRpbF9mdW5jcy9oZWFkZXJfZ2VuZXJpYy5oIgoKLyogaWYgeW91IHdhbnQgY2FjaGluZyBlbmFibGVkIGZvciBzcGVlZCByZXRyaWV2YWwgcHVycG9zZXMsIHNldCB0aGlzIHRvIDU/Ki8KI2RlZmluZSBNSU5MT0FERlJFUSAwICAgICAgICAgICAgICAgICAgICAgLyogbWluIHJlbG9hZCBmcmVxdWVuY3kgaW4gc2Vjb25kcyAqLwojaWZkZWYgbGludXgKc3RhdGljIHVuc2lnbmVkIGxvbmcgTGFzdExvYWQgPSAwOyAgICAgICAgLyogRVQgaW4gc2VjcyBhdCBsYXN0IHRhYmxlIGxvYWQgKi8KI2VuZGlmCgojZGVmaW5lIHN0YXJ0dGltZSAoKihjb25zdCBzdHJ1Y3QgdGltZXZhbCopbmV0c25tcF9nZXRfYWdlbnRfc3RhcnR0aW1lKCkpCgpzdHJ1Y3QgdmFyaWFibGUzIGludGVyZmFjZXNfdmFyaWFibGVzW10gPSB7CiAgICB7TkVUU05NUF9JRk5VTUJFUiwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pbnRlcmZhY2VzLCAxLCB7MX19LAogICAge05FVFNOTVBfSUZJTkRFWCwgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMX19LAogICAge05FVFNOTVBfSUZERVNDUiwgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAyfX0sCiAgICB7TkVUU05NUF9JRlRZUEUsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDN9fSwKICAgIHtORVRTTk1QX0lGTVRVLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCA0fX0sCiAgICB7TkVUU05NUF9JRlNQRUVELCBBU05fR0FVR0UsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgNX19LAogICAge05FVFNOTVBfSUZQSFlTQUREUkVTUywgQVNOX09DVEVUX1NUUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCA2fX0sCiNpZm5kZWYgTkVUU05NUF9OT19XUklURV9TVVBQT1JUCiNpZiBkZWZpbmVkIChXSU4zMikgfHwgZGVmaW5lZCAoY3lnd2luKQogICAge05FVFNOTVBfSUZBRE1JTlNUQVRVUywgQVNOX0lOVEVHRVIsIE5FVFNOTVBfT0xEQVBJX1JXUklURSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDd9fSwKI2Vsc2UKICAgIHtORVRTTk1QX0lGQURNSU5TVEFUVVMsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDd9fSwKI2VuZGlmCiNlbHNlICAvKiAhTkVUU05NUF9OT19XUklURV9TVVBQT1JUICovCiAgICB7TkVUU05NUF9JRkFETUlOU1RBVFVTLCBBU05fSU5URUdFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCA3fX0sCiNlbmRpZiAvKiAhTkVUU05NUF9OT19XUklURV9TVVBQT1JUICovCiAgICB7TkVUU05NUF9JRk9QRVJTVEFUVVMsIEFTTl9JTlRFR0VSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDh9fSwKICAgIHtORVRTTk1QX0lGTEFTVENIQU5HRSwgQVNOX1RJTUVUSUNLUywgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCA5fX0sCiAgICB7TkVUU05NUF9JRklOT0NURVRTLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxMH19LAogICAge05FVFNOTVBfSUZJTlVDQVNUUEtUUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTF9fSwKICAgIHtORVRTTk1QX0lGSU5OVUNBU1RQS1RTLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxMn19LAogICAge05FVFNOTVBfSUZJTkRJU0NBUkRTLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxM319LAogICAge05FVFNOTVBfSUZJTkVSUk9SUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTR9fSwKICAgIHtORVRTTk1QX0lGSU5VTktOT1dOUFJPVE9TLCBBU05fQ09VTlRFUiwgTkVUU05NUF9PTERBUElfUk9OTFksCiAgICAgdmFyX2lmRW50cnksIDMsIHsyLCAxLCAxNX19LAogICAge05FVFNOTVBfSUZPVVRPQ1RFVFMsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDE2fX0sCiAgICB7TkVUU05NUF9JRk9VVFVDQVNUUEtUUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTd9fSwKICAgIHtORVRTTk1QX0lGT1VUTlVDQVNUUEtUUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMTh9fSwKICAgIHtORVRTTk1QX0lGT1VURElTQ0FSRFMsIEFTTl9DT1VOVEVSLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDE5fX0sCiAgICB7TkVUU05NUF9JRk9VVEVSUk9SUywgQVNOX0NPVU5URVIsIE5FVFNOTVBfT0xEQVBJX1JPTkxZLAogICAgIHZhcl9pZkVudHJ5LCAzLCB7MiwgMSwgMjB9fSwKICAgIHtORVRTTk1QX0lGT1VUUUxFTiwgQVNOX0dBVUdFLCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDIxfX0sCiAgICB7TkVUU05NUF9JRlNQRUNJRklDLCBBU05fT0JKRUNUX0lELCBORVRTTk1QX09MREFQSV9ST05MWSwKICAgICB2YXJfaWZFbnRyeSwgMywgezIsIDEsIDIyfX0KfTsKCi8qCiAqIERlZmluZSB0aGUgT0lEIHBvaW50ZXIgdG8gdGhlIHRvcCBvZiB0aGUgbWliIHRyZWUgdGhhdCB3ZSdyZQogKiByZWdpc3RlcmluZyB1bmRlcm5lYXRoLCBhbmQgdGhlIE9JRCBvZiB0aGUgTUlCIG1vZHVsZSAKICovCm9pZCAgICAgICAgICAgICBpbnRlcmZhY2VzX3ZhcmlhYmxlc19vaWRbXSA9IHsgU05NUF9PSURfTUlCMiwgMiB9OwpvaWQgICAgICAgICAgICAgaW50ZXJmYWNlc19tb2R1bGVfb2lkW10gPSB7IFNOTVBfT0lEX01JQjIsIDMxIH07Cgp2b2lkCmluaXRfaW50ZXJmYWNlcyh2b2lkKQp7CiAgICAvKgogICAgICogcmVnaXN0ZXIgb3Vyc2VsdmVzIHdpdGggdGhlIGFnZW50IHRvIGhhbmRsZSBvdXIgbWliIHRyZWUgCiAgICAgKi8KICAgIFJFR0lTVEVSX01JQigibWliSUkvaW50ZXJmYWNlcyIsIGludGVyZmFjZXNfdmFyaWFibGVzLCB2YXJpYWJsZTMsCiAgICAgICAgICAgICAgICAgaW50ZXJmYWNlc192YXJpYWJsZXNfb2lkKTsKICAgIFJFR0lTVEVSX1NZU09SX0VOVFJZKGludGVyZmFjZXNfbW9kdWxlX29pZCwKICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgTUlCIG1vZHVsZSB0byBkZXNjcmliZSBnZW5lcmljIG9iamVjdHMgZm9yIG5ldHdvcmsgaW50ZXJmYWNlIHN1Yi1sYXllcnMiKTsKCiNpZm5kZWYgVVNFX1NZU0NUTF9JRkxJU1QKI2lmIEhBVkVfTkVUX0lGX01JQl9ICiAgICBpbml0X2ludGVyZmFjZXNfc2V0dXAoKTsKI2VuZGlmCiNlbmRpZgojaWZkZWYgc29sYXJpczIKICAgIGluaXRfa2VybmVsX3N1bm9zNSgpOwojZW5kaWYKfQoKI2lmZGVmIGxpbnV4Ci8qCiAqIGlmX3R5cGVfZnJvbV9uYW1lCiAqIFJldHVybiBpbnRlcmZhY2UgdHlwZSB1c2luZyB0aGUgaW50ZXJmYWNlIG5hbWUgYXMgYSBjbHVlLgogKiBSZXR1cm5zIDEgdG8gaW1wbHkgIm90aGVyIiB0eXBlIGlmIG5hbWUgbm90IHJlY29nbml6ZWQuIAogKi8Kc3RhdGljIGludAppZl90eXBlX2Zyb21fbmFtZShjb25zdCBjaGFyICpwY2NoKQp7CiAgICB0eXBlZGVmIHN0cnVjdCBfbWF0Y2hfaWYgewogICAgICAgIGludCAgICAgICAgICAgICBtaV90eXBlOwogICAgICAgIGNvbnN0IGNoYXIgICAgICptaV9uYW1lOwogICAgfSAgICAgICAgICAgICAgKnBtYXRjaF9pZiwgbWF0Y2hfaWY7CgogICAgc3RhdGljIG1hdGNoX2lmIGxtYXRjaF9pZltdID0gewogICAgICAgIHsyNCwgImxvIn0sCiAgICAgICAgezYsICJldGgifSwKICAgICAgICB7OSwgInRyIn0sCiAgICAgICAgezIzLCAicHBwIn0sCiAgICAgICAgezI4LCAic2wifSwKICAgICAgICB7MCwgMH0gICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgbGlzdCAqLwogICAgfTsKCiAgICBpbnQgICAgICAgICAgICAgaWksIGxlbjsKICAgIHJlZ2lzdGVyIHBtYXRjaF9pZiBwbTsKCiAgICBmb3IgKGlpID0gMCwgcG0gPSBsbWF0Y2hfaWY7IHBtLT5taV9uYW1lOyBwbSsrKSB7CiAgICAgICAgbGVuID0gc3RybGVuKHBtLT5taV9uYW1lKTsKICAgICAgICBpZiAoMCA9PSBzdHJuY21wKHBjY2gsIHBtLT5taV9uYW1lLCBsZW4pKSB7CiAgICAgICAgICAgIHJldHVybiAocG0tPm1pX3R5cGUpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoMSk7ICAgICAgICAgICAgICAgICAvKiBpbiBjYXNlIHNlYXJjaCBmYWlscyAqLwp9CiNlbmRpZgoKCiNpZmRlZiBsaW51eApzdGF0aWMgc3RydWN0IGlmbmV0ICppZm5ldGFkZHJfbGlzdDsKI2VuZGlmCgoKLyoKICogaGVhZGVyX2lmRW50cnkoLi4uCiAqIEFyZ3VtZW50czoKICogdnAgICAgIElOICAgICAgLSBwb2ludGVyIHRvIHZhcmlhYmxlIGVudHJ5IHRoYXQgcG9pbnRzIGhlcmUKICogbmFtZSAgICBJTi9PVVQgIC0gSU4vbmFtZSByZXF1ZXN0ZWQsIE9VVC9uYW1lIGZvdW5kCiAqIGxlbmd0aCAgSU4vT1VUICAtIGxlbmd0aCBvZiBJTi9PVVQgb2lkJ3MgCiAqIGV4YWN0ICAgSU4gICAgICAtIFRSVUUgaWYgYW4gZXhhY3QgbWF0Y2ggd2FzIHJlcXVlc3RlZAogKiB2YXJfbGVuIE9VVCAgICAgLSBsZW5ndGggb2YgdmFyaWFibGUgb3IgMCBpZiBmdW5jdGlvbiByZXR1cm5lZAogKiB3cml0ZV9tZXRob2QKICogCiAqLwojaWYgIWRlZmluZWQgKFdJTjMyKSAmJiAhZGVmaW5lZCAoY3lnd2luKQpzdGF0aWMgaW50CmhlYWRlcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKI2RlZmluZSBJRkVOVFJZX05BTUVfTEVOR1RICTEwCiAgICBvaWQgICAgICAgICAgICAgbmV3bmFtZVtNQVhfT0lEX0xFTl07CiAgICByZWdpc3RlciBpbnQgICAgaW50ZXJmYWNlOwogICAgaW50ICAgICAgICAgICAgIHJlc3VsdCwgY291bnQ7CgogICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAidmFyX2lmRW50cnk6ICIpKTsKICAgIERFQlVHTVNHT0lEKCgibWliSUkvaW50ZXJmYWNlcyIsIG5hbWUsICpsZW5ndGgpKTsKICAgIERFQlVHTVNHKCgibWliSUkvaW50ZXJmYWNlcyIsICIgJWRcbiIsIGV4YWN0KSk7CgogICAgbWVtY3B5KChjaGFyICopIG5ld25hbWUsIChjaGFyICopIHZwLT5uYW1lLAogICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICogc2l6ZW9mKG9pZCkpOwogICAgLyoKICAgICAqIGZpbmQgIm5leHQiIGludGVyZmFjZSAKICAgICAqLwogICAgY291bnQgPSBJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQoKTsKICAgIGZvciAoaW50ZXJmYWNlID0gMTsgaW50ZXJmYWNlIDw9IGNvdW50OyBpbnRlcmZhY2UrKykgewogICAgICAgIG5ld25hbWVbSUZFTlRSWV9OQU1FX0xFTkdUSF0gPSAob2lkKSBpbnRlcmZhY2U7CiAgICAgICAgcmVzdWx0ID0KICAgICAgICAgICAgc25tcF9vaWRfY29tcGFyZShuYW1lLCAqbGVuZ3RoLCBuZXduYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHZwLT5uYW1lbGVuICsgMSk7CiAgICAgICAgaWYgKChleGFjdCAmJiAocmVzdWx0ID09IDApKSB8fCAoIWV4YWN0ICYmIChyZXN1bHQgPCAwKSkpCiAgICAgICAgICAgIGJyZWFrOwogICAgfQogICAgaWYgKGludGVyZmFjZSA+IGNvdW50KSB7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiLi4uIGluZGV4IG91dCBvZiByYW5nZVxuIikpOwogICAgICAgIHJldHVybiBNQVRDSF9GQUlMRUQ7CiAgICB9CgoKICAgIG1lbWNweSgoY2hhciAqKSBuYW1lLCAoY2hhciAqKSBuZXduYW1lLAogICAgICAgICAgICgoaW50KSB2cC0+bmFtZWxlbiArIDEpICogc2l6ZW9mKG9pZCkpOwogICAgKmxlbmd0aCA9IHZwLT5uYW1lbGVuICsgMTsKICAgICp3cml0ZV9tZXRob2QgPSAwOwogICAgKnZhcl9sZW4gPSBzaXplb2YobG9uZyk7ICAgIC8qIGRlZmF1bHQgdG8gJ2xvbmcnIHJlc3VsdHMgKi8KCiAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsICIuLi4gZ2V0IEkvRiBzdGF0cyAiKSk7CiAgICBERUJVR01TR09JRCgoIm1pYklJL2ludGVyZmFjZXMiLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoIm1pYklJL2ludGVyZmFjZXMiLCAiXG4iKSk7CgogICAgcmV0dXJuIGludGVyZmFjZTsKfQoKCgp1X2NoYXIgICAgICAgICAqCnZhcl9pbnRlcmZhY2VzKHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBpZiAoaGVhZGVyX2dlbmVyaWModnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCkgPT0KICAgICAgICBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRk5VTUJFUjoKICAgICAgICBsb25nX3JldHVybiA9IEludGVyZmFjZV9TY2FuX0dldF9Db3VudCgpOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaW50ZXJmYWNlc1xuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojaWZkZWYgVVNFX1NZU0NUTF9JRkxJU1QKCnN0YXRpYyB1X2NoYXIgICppZl9saXN0ID0gMDsKc3RhdGljIGNvbnN0IHVfY2hhciAqaWZfbGlzdF9lbmQ7CnN0YXRpYyBzaXplX3QgICBpZl9saXN0X3NpemUgPSAwOwoKc3RydWN0IHNtYWxsX2lmYWRkciB7CiAgICBzdHJ1Y3QgaW5fYWRkciAgc2lmYV9hZGRyOwogICAgc3RydWN0IGluX2FkZHIgIHNpZmFfbmV0bWFzazsKICAgIHN0cnVjdCBpbl9hZGRyICBzaWZhX2Jyb2FkY2FzdDsKfTsKCmV4dGVybiBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmdldF9hZGRyZXNzKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwpleHRlcm4gY29uc3Qgc3RydWN0IGluX2FkZHIgKmdldF9pbl9hZGRyZXNzKGNvbnN0IHZvaWQgKiwgaW50LCBpbnQpOwpzdGF0aWMgaW50ICAgICAgSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50LCBzdHJ1Y3QgaWZfbXNnaGRyICosIGNoYXIgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzbWFsbF9pZmFkZHIgKik7CnN0YXRpYyBpbnQgICAgICBJbnRlcmZhY2VfR2V0X0V0aGVyX0J5X0luZGV4KGludCwgdV9jaGFyICopOwoKc3RhdGljIGludApJbnRlcmZhY2VfU2Nhbl9CeV9JbmRleChpbnQgaWluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZfbXNnaGRyICppZl9tc2csCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKmlmX25hbWUsIHN0cnVjdCBzbWFsbF9pZmFkZHIgKnNpZmEpCnsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIHN0cnVjdCBpZl9tc2doZHIgKmlmcDsKICAgIGludCAgICAgICAgICAgICBoYXZlX2lmaW5mbyA9IDAsIGhhdmVfYWRkciA9IDA7CgogICAgaWYgKE5VTEwgIT0gc2lmYSkKICAgICAgICBtZW1zZXQoc2lmYSwgMCwgc2l6ZW9mKCpzaWZhKSk7CiAgICBmb3IgKGNwID0gaWZfbGlzdDsgY3AgPCBpZl9saXN0X2VuZDsgY3AgKz0gaWZwLT5pZm1fbXNnbGVuKSB7CiAgICAgICAgaWZwID0gKHN0cnVjdCBpZl9tc2doZHIgKikgY3A7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiaWZtX3R5cGUgPSAlZCwgaWZtX2luZGV4ID0gJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgaWZwLT5pZm1fdHlwZSwgaWZwLT5pZm1faW5kZXgpKTsKCiAgICAgICAgc3dpdGNoIChpZnAtPmlmbV90eXBlKSB7CiAgICAgICAgY2FzZSBSVE1fSUZJTkZPOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHIgKmE7CgogICAgICAgICAgICAgICAgaWYgKGlmcC0+aWZtX2luZGV4ID09IGlpbmRleCkgewogICAgICAgICAgICAgICAgICAgIGEgPSBnZXRfYWRkcmVzcyhpZnAgKyAxLCBpZnAtPmlmbV9hZGRycywgUlRBX0lGUCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGEgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgc3ByaW50ZihpZl9uYW1lLCAiJS4qcyIsICgoY29uc3QgdV9jaGFyICopIGEpWzVdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKikgYSktPnNpbl96ZXJvKTsKICAgICAgICAgICAgICAgICAgICAqaWZfbXNnID0gKmlmcDsKICAgICAgICAgICAgICAgICAgICArK2hhdmVfaWZpbmZvOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgUlRNX05FV0FERFI6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHN0cnVjdCBpZmFfbXNnaGRyICppZmFwID0gKHN0cnVjdCBpZmFfbXNnaGRyICopIGNwOwoKICAgICAgICAgICAgICAgIGlmICgoTlVMTCAhPSBzaWZhKSAmJiAoaWZhcC0+aWZhbV9pbmRleCA9PSBpaW5kZXgpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmlhOwoKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIEkgZG9uJ3Qga25vdyB3aHkgdGhlIG5vcm1hbCBnZXRfYWRkcmVzcygpIGRvZXNuJ3QKICAgICAgICAgICAgICAgICAgICAgKiB3b3JrIG9uIElSSVggNi4yLiAgTWF5YmUgdGhpcyBoYXMgdG8gZG8gd2l0aCB0aGUKICAgICAgICAgICAgICAgICAgICAgKiBleGlzdGVuY2Ugb2Ygc3RydWN0IHNvY2thZGRyX25ldy4gIEhvcGVmdWxseSwgb24KICAgICAgICAgICAgICAgICAgICAgKiBvdGhlciBzeXN0ZW1zIHdlIGNhbiBzaW1wbHkgdXNlIGdldF9pbl9hZGRyZXNzCiAgICAgICAgICAgICAgICAgICAgICogdGhyZWUgdGltZXMsIHdpdGggKGlmYXArMSkgYXMgdGhlIHN0YXJ0aW5nCiAgICAgICAgICAgICAgICAgICAgICogYWRkcmVzcy4gCiAgICAgICAgICAgICAgICAgICAgICovCgogICAgICAgICAgICAgICAgICAgIHNpZmEtPnNpZmFfbmV0bWFzayA9CiAgICAgICAgICAgICAgICAgICAgICAgICooKHN0cnVjdCBpbl9hZGRyICopICgoY2hhciAqKSAoaWZhcCArIDEpICsgNCkpOwogICAgICAgICAgICAgICAgICAgIGlhID0gZ2V0X2luX2FkZHJlc3MoKGNoYXIgKikgKGlmYXAgKyAxKSArIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFwLT5pZmFtX2FkZHJzICY9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB+UlRBX05FVE1BU0ssIFJUQV9JRkEpOwogICAgICAgICAgICAgICAgICAgIGlmIChpYSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKCiAgICAgICAgICAgICAgICAgICAgc2lmYS0+c2lmYV9hZGRyID0gKmlhOwogICAgICAgICAgICAgICAgICAgIGlhID0gZ2V0X2luX2FkZHJlc3MoKGNoYXIgKikgKGlmYXAgKyAxKSArIDgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmFwLT5pZmFtX2FkZHJzICY9IH5SVEFfTkVUTUFTSywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJUQV9CUkQpOwogICAgICAgICAgICAgICAgICAgIGlmIChpYSA9PSBOVUxMKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKCiAgICAgICAgICAgICAgICAgICAgc2lmYS0+c2lmYV9icm9hZGNhc3QgPSAqaWE7CiAgICAgICAgICAgICAgICAgICAgKytoYXZlX2FkZHI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAicm91dGluZyBzb2NrZXQ6IHVua25vd24gbWVzc2FnZSB0eXBlICVkXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBpZnAtPmlmbV90eXBlKSk7CiAgICAgICAgfQogICAgfQogICAgaWYgKGhhdmVfaWZpbmZvICYmIChOVUxMID09IHNpZmEpIHx8IChoYXZlX2FkZHIpKSB7CiAgICAgICAgcmV0dXJuIDA7CiAgICB9IGVsc2UgaWYgKGhhdmVfaWZpbmZvICYmICEoaWZfbXNnLT5pZm1fZmxhZ3MgJiBJRkZfVVApKQogICAgICAgIHJldHVybiAwOwogICAgZWxzZSB7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQp9CgppbnQKSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KHZvaWQpCnsKICAgIHVfY2hhciAgICAgICAgICpjcDsKICAgIHN0cnVjdCBpZl9tc2doZHIgKmlmcDsKICAgIGxvbmcgICAgICAgICAgICBuID0gMDsKCiAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CgogICAgaWYgKGlmX2xpc3Rfc2l6ZSkgewogICAgICAgIGZvciAoY3AgPSBpZl9saXN0LCBuID0gMDsgY3AgPCBpZl9saXN0X2VuZDsgY3AgKz0gaWZwLT5pZm1fbXNnbGVuKSB7CiAgICAgICAgICAgIGlmcCA9IChzdHJ1Y3QgaWZfbXNnaGRyICopIGNwOwogICAgCiAgICAgICAgICAgIGlmIChpZnAtPmlmbV90eXBlID09IFJUTV9JRklORk8pIHsKICAgICAgICAgICAgICAgICsrbjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIHJldHVybiBuOwp9Cgp2b2lkCkludGVyZmFjZV9TY2FuX0luaXQodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIG5hbWVbXSA9IHsgQ1RMX05FVCwgUEZfUk9VVEUsIDAsIDAsIE5FVF9SVF9JRkxJU1QsIDAgfTsKICAgIHNpemVfdCAgICAgICAgICBzaXplOwoKICAgIGlmIChzeXNjdGwobmFtZSwgc2l6ZW9mKG5hbWUpIC8gc2l6ZW9mKGludCksIDAsICZzaXplLCAwLCAwKSA9PSAtMSkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJzeXNjdGwgc2l6ZSBmYWlsXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKGlmX2xpc3QgPT0gMCB8fCBpZl9saXN0X3NpemUgPCBzaXplKSB7CiAgICAgICAgICAgIGlmIChpZl9saXN0ICE9IDApIHsKICAgICAgICAgICAgICAgIGZyZWUoaWZfbGlzdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWZfbGlzdCAgICAgID0gTlVMTDsKICAgICAgICAgICAgaWZfbGlzdF9zaXplID0gMDsKICAgICAgICAgICAgaWZfbGlzdF9lbmQgID0gMDsKICAgICAgICAgICAgaWYgKChpZl9saXN0ID0gbWFsbG9jKHNpemUpKSA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAgICAgIm91dCBvZiBtZW1vcnkgYWxsb2NhdGluZyByb3V0ZSB0YWJsZSAoc2l6ZSA9ICVkKVxuIiwgc2l6ZSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWZfbGlzdF9zaXplID0gc2l6ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzaXplID0gaWZfbGlzdF9zaXplOwogICAgICAgIH0KICAgICAgICBpZiAoc3lzY3RsKG5hbWUsIHNpemVvZihuYW1lKSAvIHNpemVvZihpbnQpLAogICAgICAgICAgICAgICAgICAgaWZfbGlzdCwgJnNpemUsIDAsIDApID09IC0xKSB7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJzeXNjdGwgZ2V0IGZhaWxcbiIpOwogICAgICAgIH0KICAgICAgICBpZl9saXN0X2VuZCA9IGlmX2xpc3QgKyBzaXplOwogICAgfQp9Cgp1X2NoYXIgICAgICAgICAqCnZhcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIGludCAgICAgICAgICAgICBpbnRlcmZhY2U7CiAgICBzdHJ1Y3QgaWZfbXNnaGRyIGlmX21zZzsKICAgIHN0YXRpYyBjaGFyICAgICBpZl9uYW1lWzEwMF07CiAgICBjb25mX2lmX2xpc3QgICAqaWZfcHRyOwogICAgY2hhciAgICAgICAgICAgKmNwOwoKICAgIGludGVyZmFjZSA9CiAgICAgICAgaGVhZGVyX2lmRW50cnkodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCk7CiAgICBpZiAoaW50ZXJmYWNlID09IE1BVENIX0ZBSUxFRCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBpZiAoSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50ZXJmYWNlLCAmaWZfbXNnLCBpZl9uYW1lLCBOVUxMKSAhPSAwKQogICAgICAgIHJldHVybiBOVUxMOwogICAgaWZfcHRyID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2VudHJ5X292ZXJyaWRlc19nZXQoaWZfbmFtZSk7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gaW50ZXJmYWNlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZERVNDUjoKICAgICAgICBjcCA9IGlmX25hbWU7CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oaWZfbmFtZSk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgY3A7CiAgICBjYXNlIE5FVFNOTVBfSUZUWVBFOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT50eXBlOwogICAgICAgIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX3R5cGU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk1UVToKICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX210dTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGU1BFRUQ6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnNwZWVkOwogICAgICAgIGVsc2UgewojaWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfQkFVRFJBVEVfSUZTX1ZBTFVFCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX2JhdWRyYXRlLmlmc192YWx1ZSA8PAogICAgICAgICAgICBpZl9tc2cuaWZtX2RhdGEuaWZpX2JhdWRyYXRlLmlmc19sb2cyOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9iYXVkcmF0ZTsKI2VuZGlmCiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZQSFlTQUREUkVTUzoKICAgICAgICAvKgogICAgICAgICAqIFhYWCAKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gTlVMTDsKICAgIGNhc2UgTkVUU05NUF9JRkFETUlOU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZfbXNnLmlmbV9mbGFncyAmIElGRl9VUCA/IDEgOiAyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPUEVSU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZfbXNnLmlmbV9mbGFncyAmIElGRl9SVU5OSU5HID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgICAgICAvKgogICAgICAgICAqIGlmTGFzdENoYW5nZSAKICAgICAgICAgKi8KICAgIGNhc2UgTkVUU05NUF9JRklOT0NURVRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9pYnl0ZXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICAgKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9pcGFja2V0cyAtCiAgICAgICAgICAgIGlmX21zZy5pZm1fZGF0YS5pZmlfaW1jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5OVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9pbWNhc3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTkRJU0NBUkRTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9pcWRyb3BzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTkVSUk9SUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfaWVycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VTktOT1dOUFJPVE9TOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9ub3Byb3RvOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRPQ1RFVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZl9tc2cuaWZtX2RhdGEuaWZpX29ieXRlczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0KICAgICAgICAgICAgKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9vcGFja2V0cyAtCiAgICAgICAgICAgIGlmX21zZy5pZm1fZGF0YS5pZmlfb21jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfb21jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURElTQ0FSRFM6CiNpZmRlZiBpZl9vZHJvcHMKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmX21zZy5pZm1fZGF0YS5pZmlfb2Ryb3BzOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZfbXNnLmlmbV9kYXRhLmlmaV9vZXJyb3JzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZMQVNUQ0hBTkdFOgojaWZkZWYgaXJpeDYKICAgICAgICBsb25nX3JldHVybiA9IDA7CiNlbHNlCiAgICAgICAgaWYgKGlmX21zZy5pZm1fZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9zZWMgPT0gMCAmJgojaWYgU1RSVUNUX0lGTkVUX0hBU19JRl9MQVNUQ0hBTkdFX1RWX05TRUMKICAgICAgICAgICAgaWZfbXNnLmlmbV9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X25zZWMgPT0gMAojZWxzZQogICAgICAgICAgICBpZl9tc2cuaWZtX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfdXNlYyA9PSAwCiNlbmRpZgogICAgICAgICAgICkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIGVsc2UgaWYgKGlmX21zZy5pZm1fZGF0YS5pZmlfbGFzdGNoYW5nZS50dl9zZWMgPCBzdGFydHRpbWUudHZfc2VjKQogICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykKICAgICAgICAgICAgICAgICgoaWZfbXNnLmlmbV9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X3NlYyAtCiAgICAgICAgICAgICAgICAgIHN0YXJ0dGltZS50dl9zZWMpICogMTAwICsKICAgICAgICAgICAgICAgICAoCiNpZiBTVFJVQ1RfSUZORVRfSEFTX0lGX0xBU1RDSEFOR0VfVFZfTlNFQwogICAgICAgICAgICAgICAgICBpZl9tc2cuaWZtX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfbnNlYyAvIDEwMDAKI2Vsc2UKICAgICAgICAgICAgICAgICAgaWZfbXNnLmlmbV9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X3VzZWMKI2VuZGlmCiAgICAgICAgICAgICAgICAgIC0gc3RhcnR0aW1lLnR2X3VzZWMpIC8gMTAwMDApOwogICAgICAgIH0KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgcmV0dXJuIDA7CiAgICB9Cn0KCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0KHNob3J0ICpJbmRleCwKICAgICAgICAgICAgICAgICAgICBjaGFyICpOYW1lLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZm5ldCAqUmV0aWZuZXQsIHN0cnVjdCBpbl9pZmFkZHIgKlJldGluX2lmYWRkcikKewogICAgcmV0dXJuIDA7Cn0KCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KGludCAqSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgY2hhciAqTmFtZSwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZuZXQgKlJldGlmbmV0LCBzdHJ1Y3QgaW5faWZhZGRyICpSZXRpbl9pZmFkZHIpCnsKICAgIHJldHVybiAwOwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5vdCBVU0VfU1lTQ1RMX0lGTElTVCAqLwoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEtlcm5lbCAmIGludGVyZmFjZSBpbmZvcm1hdGlvbiwKCSAqICAgYW5kIGludGVybmFsIGZvcndhcmQgZGVjbGFyYXRpb25zCgkgKgoJICoqKioqKioqKioqKioqKioqKioqKi8KCiNpZm5kZWYgSEFWRV9ORVRfSUZfTUlCX0gKCiNpZm5kZWYgc29sYXJpczIKI2lmbmRlZiBocHV4MTEKc3RhdGljIGludCAgICAgIEludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludCwgY2hhciAqLCBzdHJ1Y3QgaWZuZXQgKiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9pZmFkZHIgKik7CnN0YXRpYyBpbnQgICAgICBJbnRlcmZhY2VfR2V0X0V0aGVyX0J5X0luZGV4KGludCwgdV9jaGFyICopOwojZWxzZQpzdGF0aWMgaW50ICAgICAgSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50LCBjaGFyICosIG5tYXBpX3BoeXN0YXQgKik7CiNlbmRpZgojZW5kaWYKCgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIFN5c3RlbSBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBmdW5jdGlvbnMKCSAqCgkgKioqKioqKioqKioqKioqKioqKioqLwoKCiNpZm5kZWYgc29sYXJpczIKI2lmbmRlZiBocHV4Cgp1X2NoYXIgICAgICAgICAqCnZhcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIHN0YXRpYyBzdHJ1Y3QgaWZuZXQgaWZuZXQ7CiAgICBpbnQgICAgICAgICAgICAgaW50ZXJmYWNlOwogICAgc3RhdGljIHN0cnVjdCBpbl9pZmFkZHIgaW5faWZhZGRyOwogICAgc3RhdGljIGNoYXIgICAgIE5hbWVbMTZdOwogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0cjsKCiAgICBpbnRlcmZhY2UgPQogICAgICAgIGhlYWRlcl9pZkVudHJ5KHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpOwogICAgaWYgKGludGVyZmFjZSA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50ZXJmYWNlLCBOYW1lLCAmaWZuZXQsICZpbl9pZmFkZHIpOwogICAgaWZfcHRyID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2VudHJ5X292ZXJyaWRlc19nZXQoTmFtZSk7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gaW50ZXJmYWNlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZERVNDUjoKICAgICAgICBjcCA9IE5hbWU7CiAgICAgICAgKnZhcl9sZW4gPSBzdHJsZW4oY3ApOwogICAgICAgIHJldHVybiAodV9jaGFyICopIGNwOwogICAgY2FzZSBORVRTTk1QX0lGVFlQRToKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+dHlwZTsKICAgICAgICBlbHNlIHsKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX1RZUEUKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl90eXBlOwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9IDE7ICAgIC8qIE9USEVSICovCiNlbmRpZgogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGTVRVOnsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAobG9uZykgaWZuZXQuaWZfbXR1OwogICAgICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgICAgIH0KICAgIGNhc2UgTkVUU05NUF9JRlNQRUVEOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT5zcGVlZDsKICAgICAgICBlbHNlIHsKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX0JBVURSQVRFCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfYmF1ZHJhdGU7CiNlbGlmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX1NQRUVECiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfc3BlZWQ7CiNlbGlmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX1RZUEUgJiYgZGVmaW5lZChJRlRfRVRIRVIpCiAgICAgICAgICAgIGlmIChpZm5ldC5pZl90eXBlID09IElGVF9FVEhFUikKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMTAwMDAwMDA7CiAgICAgICAgICAgIGlmIChpZm5ldC5pZl90eXBlID09IElGVF9QMTApCiAgICAgICAgICAgICAgICBsb25nX3JldHVybiA9IDEwMDAwMDAwOwogICAgICAgICAgICBpZiAoaWZuZXQuaWZfdHlwZSA9PSBJRlRfUDgwKQogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA4MDAwMDAwMDsKICAgICAgICAgICAgaWYgKGlmbmV0LmlmX3R5cGUgPT0gSUZUX0lTRE5CQVNJQykKICAgICAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gNjQwMDA7ICAgIC8qIEVEU1MxIG9ubHkgKi8KICAgICAgICAgICAgaWYgKGlmbmV0LmlmX3R5cGUgPT0gSUZUX0lTRE5QUklNQVJZKQogICAgICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSA2NDAwMCAqIDMwOwojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDEwMDAwMDAwOwojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlBIWVNBRERSRVNTOgogICAgICAgIEludGVyZmFjZV9HZXRfRXRoZXJfQnlfSW5kZXgoaW50ZXJmYWNlLCByZXR1cm5fYnVmKTsKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKCSp2YXJfbGVuID0gMDsKI2Vsc2UKICAgICAgICBpZiAoKHJldHVybl9idWZbMF0gPT0gMCkgJiYgKHJldHVybl9idWZbMV0gPT0gMCkgJiYKICAgICAgICAgICAgKHJldHVybl9idWZbMl0gPT0gMCkgJiYgKHJldHVybl9idWZbM10gPT0gMCkgJiYKICAgICAgICAgICAgKHJldHVybl9idWZbNF0gPT0gMCkgJiYgKHJldHVybl9idWZbNV0gPT0gMCkpCiAgICAgICAgICAgICp2YXJfbGVuID0gMDsKICAgICAgICBlbHNlCiAgICAgICAgICAgICp2YXJfbGVuID0gNjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgcmV0dXJuX2J1ZjsKICAgIGNhc2UgTkVUU05NUF9JRkFETUlOU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZmxhZ3MgJiBJRkZfVVAgPyAxIDogMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1BFUlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2ZsYWdzICYgSUZGX1JVTk5JTkcgPyAxIDogMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGTEFTVENIQU5HRToKI2lmIGRlZmluZWQoSEFWRV9TVFJVQ1RfSUZORVRfSUZfTEFTVENIQU5HRV9UVl9TRUMpICYmICEoZGVmaW5lZChmcmVlYnNkMikgJiYgX19GcmVlQlNEX3ZlcnNpb24gPCAxOTk2MDcpCiAgICAgICAgLyoKICAgICAgICAgKiBYWFggLSBTTk1QJ3MgaWZMYXN0Y2hhbmdlIGlzIHRpbWUgd2hlbiBvcC4gc3RhdHVzIGNoYW5nZWQKICAgICAgICAgKiAqIEZyZWVCU0QncyBpZl9sYXN0Y2hhbmdlIGlzIHRpbWUgd2hlbiBwYWNrZXQgd2FzIGlucHV0IG9yIG91dHB1dAogICAgICAgICAqICogKGF0IGxlYXN0IGluIDIuMS4wLVJFTEVBU0UuIENoYW5nZWQgaW4gbGF0ZXIgdmVyc2lvbnMgb2YgdGhlIGtlcm5lbD8pCiAgICAgICAgICovCiAgICAgICAgLyoKICAgICAgICAgKiBGcmVlQlNEJ3MgaWZfbGFzdGNoYW5nZSBiZWZvcmUgdGhlIDIuMS41IHJlbGVhc2UgaXMgdGhlIHRpbWUgd2hlbgogICAgICAgICAqICogYSBwYWNrZXQgd2FzIGxhc3QgaW5wdXQgb3Igb3V0cHV0LiAgSW4gdGhlIDIuMS41IGFuZCBsYXRlciByZWxlYXNlcywKICAgICAgICAgKiAqIHRoaXMgaXMgZml4ZWQsIHRodXMgdGhlIDE5OTYwNyBjb21wYXJpc29uLgogICAgICAgICAqLwogICAgICAgIGlmIChpZm5ldC5pZl9sYXN0Y2hhbmdlLnR2X3NlYyA9PSAwICYmCiAgICAgICAgICAgIGlmbmV0LmlmX2xhc3RjaGFuZ2UudHZfdXNlYyA9PSAwKQogICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgZWxzZSBpZiAoaWZuZXQuaWZfbGFzdGNoYW5nZS50dl9zZWMgPCBzdGFydHRpbWUudHZfc2VjKQogICAgICAgICAgICBsb25nX3JldHVybiA9IDA7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykKICAgICAgICAgICAgICAgICgoaWZuZXQuaWZfbGFzdGNoYW5nZS50dl9zZWMgLSBzdGFydHRpbWUudHZfc2VjKSAqIDEwMAogICAgICAgICAgICAgICAgICsgKGlmbmV0LmlmX2xhc3RjaGFuZ2UudHZfdXNlYyAtCiAgICAgICAgICAgICAgICAgICAgc3RhcnR0aW1lLnR2X3VzZWMpIC8gMTAwMDApOwogICAgICAgIH0KI2Vsc2UKI2lmIE5FVFNOTVBfTk9fRFVNTVlfVkFMVUVTCiAgICAgICAgcmV0dXJuIE5VTEw7CiNlbmRpZgogICAgICAgIGxvbmdfcmV0dXJuID0gMDsgICAgICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5PQ1RFVFM6CiNpZmRlZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9JQllURVMKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lieXRlcyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pYnl0ZXM7CiNlbmRpZgojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pcGFja2V0cyAqIDMwODsgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTlVDQVNUUEtUUzoKICAgICAgICB7CiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaXBhY2tldHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lwYWNrZXRzOwojZW5kaWYKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX0lNQ0FTVFMKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgICAgICAgICAgbG9uZ19yZXR1cm4gLT0gKHVfbG9uZykgaWZuZXQuaWZfaW1jYXN0cyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuIC09ICh1X2xvbmcpIGlmbmV0LmlmX2ltY2FzdHM7CiNlbmRpZgojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOTlVDQVNUUEtUUzoKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX0lNQ0FTVFMKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2ltY2FzdHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaW1jYXN0czsKI2VuZGlmCiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDA7ICAgICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5ESVNDQVJEUzoKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX0lRRFJPUFMKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2lxZHJvcHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaXFkcm9wczsKI2VuZGlmCiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDA7ICAgICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5FUlJPUlM6CiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pZXJyb3JzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX2llcnJvcnM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTlVOS05PV05QUk9UT1M6CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9OT1BST1RPCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9ub3Byb3RvICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX25vcHJvdG87CiNlbmRpZgojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVE9DVEVUUzoKI2lmZGVmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX09CWVRFUwojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfb2J5dGVzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29ieXRlczsKI2VuZGlmCiNlbHNlCiNpZiBORVRTTk1QX05PX0RVTU1ZX1ZBTFVFUwogICAgICAgIHJldHVybiBOVUxMOwojZW5kaWYKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29wYWNrZXRzICogMzA4OyAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVFVDQVNUUEtUUzoKICAgICAgICB7CiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfb3BhY2tldHMgJiAweGZmZmZmZmZmOwojZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29wYWNrZXRzOwojZW5kaWYKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX09NQ0FTVFMKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgICAgICAgICAgbG9uZ19yZXR1cm4gLT0gKHVfbG9uZykgaWZuZXQuaWZfb21jYXN0cyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuIC09ICh1X2xvbmcpIGlmbmV0LmlmX29tY2FzdHM7CiNlbmRpZgojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVE5VQ0FTVFBLVFM6CiNpZiBIQVZFX1NUUlVDVF9JRk5FVF9JRl9PTUNBU1RTCiNpZiBkZWZpbmVkKGFpeDQpIHx8IGRlZmluZWQoYWl4NSkgfHwgZGVmaW5lZChhaXg2KSB8fCBkZWZpbmVkKGFpeDcpCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vbWNhc3RzICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbmV0LmlmX29tY2FzdHM7CiNlbmRpZgojZWxzZQojaWYgTkVUU05NUF9OT19EVU1NWV9WQUxVRVMKICAgICAgICByZXR1cm4gTlVMTDsKI2VuZGlmCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgICAgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVERJU0NBUkRTOgojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfc25kLmlmcV9kcm9wcyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9zbmQuaWZxX2Ryb3BzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURVJST1JTOgojaWYgZGVmaW5lZChhaXg0KSB8fCBkZWZpbmVkKGFpeDUpIHx8IGRlZmluZWQoYWl4NikgfHwgZGVmaW5lZChhaXg3KQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfb2Vycm9ycyAmIDB4ZmZmZmZmZmY7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9vZXJyb3JzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUUUxFTjoKI2lmIGRlZmluZWQoYWl4NCkgfHwgZGVmaW5lZChhaXg1KSB8fCBkZWZpbmVkKGFpeDYpIHx8IGRlZmluZWQoYWl4NykKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX3NuZC5pZnFfbGVuICYgMHhmZmZmZmZmZjsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX3NuZC5pZnFfbGVuOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGU1BFQ0lGSUM6CiAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG51bGxPaWQ7CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaWZFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXggKi8KCnVfY2hhciAgICAgICAgICoKdmFyX2lmRW50cnkoc3RydWN0IHZhcmlhYmxlICp2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewojaWYgZGVmaW5lZChocHV4MTEpCiAgICBzdGF0aWMgbm1hcGlfcGh5c3RhdCBpZm5ldDsKI2Vsc2UKICAgIHN0YXRpYyBzdHJ1Y3QgaWZuZXQgaWZuZXQ7CiNlbmRpZgogICAgcmVnaXN0ZXIgaW50ICAgIGludGVyZmFjZTsKI2lmICFkZWZpbmVkKGhwdXgxMSkKICAgIHN0YXRpYyBzdHJ1Y3QgaW5faWZhZGRyIGluX2lmYWRkclZhcjsKI2VuZGlmCiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgIHN0YXRpYyBjaGFyICAgICBOYW1lW01BWF9QSFlTQUREUl9MRU5dOwojZWxzZQogICAgc3RhdGljIGNoYXIgICAgIE5hbWVbMTZdOwojZW5kaWYKICAgIHJlZ2lzdGVyIGNoYXIgICpjcDsKI2lmIEhBVkVfU1RSVUNUX0lGTkVUX0lGX0xBU1RDSEFOR0VfVFZfU0VDCiAgICBzdHJ1Y3QgdGltZXZhbCAgbm93OwojZW5kaWYKI2lmICFkZWZpbmVkKGhwdXgxMSkKICAgIHN0cnVjdCBubXBhcm1zICBocF9ubXBhcm1zOwogICAgc3RhdGljIG1pYl9pZkVudHJ5IGhwX2lmRW50cnk7CiAgICBpbnQgICAgICAgICAgICAgaHBfZmQ7CiAgICBpbnQgICAgICAgICAgICAgaHBfbGVuID0gc2l6ZW9mKGhwX2lmRW50cnkpOwojZW5kaWYKICAgIGNvbmZfaWZfbGlzdCAgICppZl9wdHI7CgogICAgaW50ZXJmYWNlID0KICAgICAgICBoZWFkZXJfaWZFbnRyeSh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKTsKICAgIGlmIChpbnRlcmZhY2UgPT0gTUFUQ0hfRkFJTEVEKQogICAgICAgIHJldHVybiBOVUxMOwoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50ZXJmYWNlLCBOYW1lLCAmaWZuZXQpOwojZWxzZQogICAgSW50ZXJmYWNlX1NjYW5fQnlfSW5kZXgoaW50ZXJmYWNlLCBOYW1lLCAmaWZuZXQsICZpbl9pZmFkZHJWYXIpOwojZW5kaWYKCiNpZiAhZGVmaW5lZChocHV4MTEpCiAgICAvKgogICAgICogQWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJmYWNlcyBpcyBhdmFpbGFibGUgdW5kZXIKICAgICAqIEhQLVVYIHRocm91Z2ggdGhlIG5ldHdvcmsgbWFuYWdlbWVudCBpbnRlcmZhY2UgJy9kZXYvbmV0bWFuJwogICAgICovCiAgICBocF9pZkVudHJ5LmlmSW5kZXggPSBpbnRlcmZhY2U7CiAgICBocF9ubXBhcm1zLm9iamlkID0gSURfaWZFbnRyeTsKICAgIGhwX25tcGFybXMuYnVmZmVyID0gKGNoYXIgKikgJmhwX2lmRW50cnk7CiAgICBocF9ubXBhcm1zLmxlbiA9ICZocF9sZW47CiAgICBpZiAoKGhwX2ZkID0gb3BlbigiL2Rldi9uZXRtYW4iLCBPX1JET05MWSkpICE9IC0xKSB7CiAgICAgICAgaWYgKGlvY3RsKGhwX2ZkLCBOTUlPR0VULCAmaHBfbm1wYXJtcykgIT0gLTEpIHsKICAgICAgICAgICAgY2xvc2UoaHBfZmQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGNsb3NlKGhwX2ZkKTsKICAgICAgICAgICAgaHBfZmQgPSAtMTsgICAgICAgICAvKiBmYWlsZWQgKi8KICAgICAgICB9CiAgICB9CiNlbmRpZgogICAgaWZfcHRyID0gbmV0c25tcF9hY2Nlc3NfaW50ZXJmYWNlX2VudHJ5X292ZXJyaWRlc19nZXQoTmFtZSk7CgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gaW50ZXJmYWNlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZERVNDUjoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGNwID0gaWZuZXQuaWZfZW50cnkuaWZEZXNjcjsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGNwID0gaHBfaWZFbnRyeS5pZkRlc2NyOwogICAgICAgIGVsc2UKICAgICAgICAgICAgY3AgPSBOYW1lOwojZW5kaWYKICAgICAgICAqdmFyX2xlbiA9IHN0cmxlbihjcCk7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgY3A7CiAgICBjYXNlIE5FVFNOTVBfSUZUWVBFOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT50eXBlOwogICAgICAgIGVsc2UgewojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZlR5cGU7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZUeXBlOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAxOyAgICAvKiBPVEhFUiAqLwojZW5kaWYKICAgICAgICB9CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk1UVTp7CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAobG9uZykgaWZuZXQuaWZfZW50cnkuaWZNdHU7CiNlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKGxvbmcpIGlmbmV0LmlmX210dTsKI2VuZGlmCiAgICAgICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICAgICAgfQogICAgY2FzZSBORVRTTk1QX0lGU1BFRUQ6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnNwZWVkOwogICAgICAgIGVsc2UgewojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZlNwZWVkOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmU3BlZWQ7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDE7ICAgLyogT1RIRVIgKi8KI2VuZGlmCiAgICAgICAgfQogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZQSFlTQUREUkVTUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgICp2YXJfbGVuID0gaWZuZXQuaWZfZW50cnkuaWZQaHlzQWRkcmVzcy5vX2xlbmd0aDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBpZm5ldC5pZl9lbnRyeS5pZlBoeXNBZGRyZXNzLm9fYnl0ZXM7CiNlbHNlCiAgICAgICAgSW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleChpbnRlcmZhY2UsIHJldHVybl9idWYpOwogICAgICAgIGlmICgocmV0dXJuX2J1ZlswXSA9PSAwKSAmJiAocmV0dXJuX2J1ZlsxXSA9PSAwKSAmJgogICAgICAgICAgICAocmV0dXJuX2J1ZlsyXSA9PSAwKSAmJiAocmV0dXJuX2J1ZlszXSA9PSAwKSAmJgogICAgICAgICAgICAocmV0dXJuX2J1Zls0XSA9PSAwKSAmJiAocmV0dXJuX2J1Zls1XSA9PSAwKSkKICAgICAgICAgICAgKnZhcl9sZW4gPSAwOwogICAgICAgIGVsc2UKICAgICAgICAgICAgKnZhcl9sZW4gPSA2OwogICAgICAgIHJldHVybiAodV9jaGFyICopIHJldHVybl9idWY7CiNlbmRpZgogICAgY2FzZSBORVRTTk1QX0lGQURNSU5TVEFUVVM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmQWRtaW47CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9mbGFncyAmIElGRl9VUCA/IDEgOiAyOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1BFUlNUQVRVUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZPcGVyOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZmxhZ3MgJiBJRkZfUlVOTklORyA/IDEgOiAyOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGTEFTVENIQU5HRToKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZMYXN0Q2hhbmdlOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmTGFzdENoYW5nZTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsgICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk9DVEVUUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZJbk9jdGV0czsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZkluT2N0ZXRzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9pcGFja2V0cyAqIDMwODsgICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VQ0FTVFBLVFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmSW5VY2FzdFBrdHM7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZJblVjYXN0UGt0czsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfaXBhY2tldHM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk5VQ0FTVFBLVFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmSW5OVWNhc3RQa3RzOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmSW5OVWNhc3RQa3RzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5ESVNDQVJEUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZJbkRpc2NhcmRzOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmSW5EaXNjYXJkczsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgMDsgICAvKiBYWFggKi8KI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORVJST1JTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZkluRXJyb3JzOwojZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfaWVycm9yczsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOVU5LTk9XTlBST1RPUzoKI2lmIGRlZmluZWQoaHB1eDExKQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZuZXQuaWZfZW50cnkuaWZJblVua25vd25Qcm90b3M7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZJblVua25vd25Qcm90b3M7CiAgICAgICAgZWxzZQogICAgICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIDA7ICAgLyogWFhYICovCiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRPQ1RFVFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmT3V0T2N0ZXRzOwojZWxzZQogICAgICAgIGlmIChocF9mZCAhPSAtMSkKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBocF9pZkVudHJ5LmlmT3V0T2N0ZXRzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm5ldC5pZl9vcGFja2V0cyAqIDMwODsgICAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUVUNBU1RQS1RTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dFVjYXN0UGt0czsKI2Vsc2UKICAgICAgICBpZiAoaHBfZmQgIT0gLTEpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaHBfaWZFbnRyeS5pZk91dFVjYXN0UGt0czsKICAgICAgICBlbHNlCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZuZXQuaWZfb3BhY2tldHM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVROVUNBU1RQS1RTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dE5VY2FzdFBrdHM7CiNlbHNlCiAgICAgICAgaWYgKGhwX2ZkICE9IC0xKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGhwX2lmRW50cnkuaWZPdXROVWNhc3RQa3RzOwogICAgICAgIGVsc2UKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSAwOyAgIC8qIFhYWCAqLwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURElTQ0FSRFM6CiNpZiBkZWZpbmVkKGhwdXgxMSkKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX2VudHJ5LmlmT3V0RGlzY2FyZHM7CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9zbmQuaWZxX2Ryb3BzOwojZW5kaWYKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURVJST1JTOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dEVycm9yczsKI2Vsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmbmV0LmlmX29lcnJvcnM7CiNlbmRpZgogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRRTEVOOgojaWYgZGVmaW5lZChocHV4MTEpCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9lbnRyeS5pZk91dFFsZW47CiNlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm5ldC5pZl9zbmQuaWZxX2xlbjsKI2VuZGlmCiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlNQRUNJRklDOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lmRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4ICovCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCnN0YXRpYyBpbnQKSUZfY21wKHZvaWQgKmFkZHIsIHZvaWQgKmVwKQp7CiAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsICIuLi4gSUZfY21wICVkICVkXG4iLAogICAgICAgICAgICAgICAgKChtaWIyX2lmRW50cnlfdCAqKSBlcCktPmlmSW5kZXgsCiAgICAgICAgICAgICAgICAoKG1pYjJfaWZFbnRyeV90ICopIGFkZHIpLT5pZkluZGV4KSk7CiAgICBpZiAoKChtaWIyX2lmRW50cnlfdCAqKSBlcCktPmlmSW5kZXggPT0KICAgICAgICAoKG1pYjJfaWZFbnRyeV90ICopIGFkZHIpLT5pZkluZGV4KQogICAgICAgIHJldHVybiAoMCk7CiAgICBlbHNlCiAgICAgICAgcmV0dXJuICgxKTsKfQoKdV9jaGFyICAgICAgICAgKgp2YXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiB2cCwKICAgICAgICAgICAgb2lkICogbmFtZSwKICAgICAgICAgICAgc2l6ZV90ICogbGVuZ3RoLAogICAgICAgICAgICBpbnQgZXhhY3QsIHNpemVfdCAqIHZhcl9sZW4sIFdyaXRlTWV0aG9kICoqIHdyaXRlX21ldGhvZCkKewogICAgaW50ICAgICAgICAgICAgIGludGVyZmFjZTsKICAgIG1pYjJfaWZFbnRyeV90ICBpZnN0YXQ7CiAgICBjb25mX2lmX2xpc3QgICAqaWZfcHRyID0gTlVMTDsKCiAgICBpbnRlcmZhY2UgPQogICAgICAgIGhlYWRlcl9pZkVudHJ5KHZwLCBuYW1lLCBsZW5ndGgsIGV4YWN0LCB2YXJfbGVuLCB3cml0ZV9tZXRob2QpOwogICAgaWYgKGludGVyZmFjZSA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgaWYgKGdldE1pYnN0YXQoTUlCX0lOVEVSRkFDRVMsICZpZnN0YXQsIHNpemVvZihtaWIyX2lmRW50cnlfdCksCiAgICAgICAgICAgICAgICAgICBHRVRfRVhBQ1QsICZJRl9jbXAsICZpbnRlcmZhY2UpICE9IDApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsICIuLi4gbm8gbWliIHN0YXRzXG4iKSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAvKgogICAgICogaG1tbS4uIHdoZXJlIHRvIGdldCB0aGUgaW50ZXJmYWNlIG5hbWUgdG8gY2hlY2sgb3ZlcnJpZGVzPwogICAgICoKICAgICAqIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KE5hbWUpOwogICAgICovCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBORVRTTk1QX0lGSU5ERVg6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZnN0YXQuaWZJbmRleDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGREVTQ1I6CiAgICAgICAgKnZhcl9sZW4gPSBpZnN0YXQuaWZEZXNjci5vX2xlbmd0aDsKICAgICAgICAodm9pZCkgbWVtY3B5KHJldHVybl9idWYsIGlmc3RhdC5pZkRlc2NyLm9fYnl0ZXMsICp2YXJfbGVuKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSByZXR1cm5fYnVmOwogICAgY2FzZSBORVRTTk1QX0lGVFlQRToKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+dHlwZTsKICAgICAgICBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZUeXBlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZNVFU6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZNdHU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlNQRUVEOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT5zcGVlZDsKICAgICAgICBlbHNlCiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZTcGVlZDsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGUEhZU0FERFJFU1M6CiAgICAgICAgKnZhcl9sZW4gPSBpZnN0YXQuaWZQaHlzQWRkcmVzcy5vX2xlbmd0aDsKICAgICAgICAodm9pZCkgbWVtY3B5KHJldHVybl9idWYsIGlmc3RhdC5pZlBoeXNBZGRyZXNzLm9fYnl0ZXMsICp2YXJfbGVuKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSByZXR1cm5fYnVmOwogICAgY2FzZSBORVRTTk1QX0lGQURNSU5TVEFUVVM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZBZG1pblN0YXR1czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1BFUlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZk9wZXJTdGF0dXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRkxBU1RDSEFOR0U6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZMYXN0Q2hhbmdlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZkluT2N0ZXRzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZkluVWNhc3RQa3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk5VQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJbk5VY2FzdFBrdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJbkRpc2NhcmRzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTkVSUk9SUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZkluRXJyb3JzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTlVOS05PV05QUk9UT1M6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZJblVua25vd25Qcm90b3M7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVE9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZk91dE9jdGV0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0VWNhc3RQa3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVROVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0TlVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZnN0YXQuaWZPdXREaXNjYXJkczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0RXJyb3JzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRRTEVOOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZzdGF0LmlmT3V0UUxlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGU1BFQ0lGSUM6Cglsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmc3RhdC5pZlNwZWNpZmljOwoJcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGRlZmF1bHQ6CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkIiwgInVua25vd24gc3ViLWlkICVkIGluIHZhcl9pZkVudHJ5XG4iLAogICAgICAgICAgICAgICAgICAgIHZwLT5tYWdpYykpOwogICAgfQogICAgcmV0dXJuIE5VTEw7Cn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc29sYXJpczIgKi8KCgoKICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqCgkgKgoJICogIEludGVybmFsIGltcGxlbWVudGF0aW9uIGZ1bmN0aW9ucwoJICoKCSAqKioqKioqKioqKioqKioqKioqKiovCgoKI2lmbmRlZiBzb2xhcmlzMgoKI2lmICFkZWZpbmVkKHN1blYzKSAmJiAhZGVmaW5lZChsaW51eCkgJiYgIWRlZmluZWQoaHB1eDExKQpzdGF0aWMgc3RydWN0IGluX2lmYWRkciBzYXZlaW5faWZhZGRyOwojZW5kaWYKI2lmICFkZWZpbmVkKGhwdXgxMSkKc3RhdGljIHN0cnVjdCBpZm5ldCAqaWZuZXRhZGRyLCBzYXZlaWZuZXQsICpzYXZlaWZuZXRhZGRyOwpzdGF0aWMgY2hhciAgICAgc2F2ZU5hbWVbMTZdOwojZW5kaWYKc3RhdGljIGludCAgICAgIHNhdmVJbmRleCA9IDA7CgovKioKKiBEZXRlcm1pbmVzIG5ldHdvcmsgaW50ZXJmYWNlIHNwZWVkLiBJdCBpcyBzeXN0ZW0gc3BlY2lmaWMuIE9ubHkgbGludXgKKiByZWFsaXphdGlvbiBpcyBtYWRlLiAKKi8KdW5zaWduZWQgaW50IGdldElmU3BlZWQoaW50IGZkLCBzdHJ1Y3QgaWZyZXEgaWZyLCB1bnNpZ25lZCBpbnQgZGVmYXVsdHNwZWVkKQp7CiNpZmRlZiBsaW51eAogICAgLyoqIHRlbXBvcmFyeSBleHBvc2UgaW50ZXJuYWwgdW50aWwgdGhpcyBtb2R1bGUgY2FuIGJlIHJlLXdyaXR0ZW4gKi8KICAgIGV4dGVybiB1bnNpZ25lZCBpbnQKICAgICAgICBuZXRzbm1wX2xpbnV4X2ludGVyZmFjZV9nZXRfaWZfc3BlZWQoaW50IGZkLCBjb25zdCBjaGFyICpuYW1lLAogICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGRlZmF1bHRzcGVlZCk7CgogICAgcmV0dXJuIG5ldHNubXBfbGludXhfaW50ZXJmYWNlX2dldF9pZl9zcGVlZChmZCwgaWZyLmlmcl9uYW1lLCBkZWZhdWx0c3BlZWQpOwojZWxzZSAvKiFsaW51eCovCQkJICAgCiAgICByZXR1cm4gZGVmYXVsdHNwZWVkOwojZW5kaWYgCn0KCnZvaWQKSW50ZXJmYWNlX1NjYW5fSW5pdCh2b2lkKQp7CiNpZmRlZiBsaW51eAogICAgY2hhciAgICAgICAgICAgIGxpbmVbMjU2XSwgaWZuYW1lX2J1Zls2NF0sICppZm5hbWUsICpwdHI7CiAgICBzdHJ1Y3QgaWZyZXEgICAgaWZycTsKICAgIHN0cnVjdCBpZm5ldCAgKippZm5ldGFkZHJfcHRyOwogICAgRklMRSAgICAgICAgICAgKmRldmluOwogICAgaW50ICAgICAgICAgICAgIGksIGZkOwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0cjsKICAgIC8qCiAgICAgKiBzY2FubGluZV8yXzI6CiAgICAgKiAgWyAgICAgICAgICAgICAgIElOICAgICAgICAgICAgICAgICAgICAgICAgXQogICAgICogICBieXRlIHBrdHMgZXJycyBkcm9wIGZpZm8gZnJhbWUgY21wcnMgbWNzdCB8CiAgICAgKiAgWyAgICAgICAgICAgICAgIE9VVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgKiAgIGJ5dGUgcGt0cyBlcnJzIGRyb3AgZmlmbyBjb2xscyBjYXJyaWVyIGNvbXByZXNzZWQKICAgICAqLwojaWZkZWYgU0NOdU1BWAogICAgdWludG1heF90ICAgICAgIHJlY19wa3QsIHJlY19vY3QsIHJlY19lcnIsIHJlY19kcm9wOwogICAgdWludG1heF90ICAgICAgIHNuZF9wa3QsIHNuZF9vY3QsIHNuZF9lcnIsIHNuZF9kcm9wLCBjb2xsOwogICAgY29uc3QgY2hhciAgICAgKnNjYW5fbGluZV8yXzIgPQogICAgICAgICIlIiAgIFNDTnVNQVggIiAlIiAgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSIgIFNDTnVNQVgKICAgICAgICAiICUqIiBTQ051TUFYICIgJSoiIFNDTnVNQVggIiAlKiIgU0NOdU1BWCAiICUqIiBTQ051TUFYCiAgICAgICAgIiAlIiAgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSIgIFNDTnVNQVggIiAlIiAgU0NOdU1BWAogICAgICAgICIgJSoiIFNDTnVNQVggIiAlIiAgU0NOdU1BWDsKICAgIGNvbnN0IGNoYXIgICAgICpzY2FuX2xpbmVfMl8wID0KICAgICAgICAiJSIgICBTQ051TUFYICIgJSIgIFNDTnVNQVggIiAlKiIgU0NOdU1BWCAiICUqIiBTQ051TUFYCiAgICAgICAgIiAlKiIgU0NOdU1BWCAiICUiICBTQ051TUFYICIgJSIgIFNDTnVNQVggIiAlKiIgU0NOdU1BWAogICAgICAgICIgJSoiIFNDTnVNQVggIiAlIiAgU0NOdU1BWDsKI2Vsc2UKICAgIHVuc2lnbmVkIGxvbmcgICByZWNfcGt0LCByZWNfb2N0LCByZWNfZXJyLCByZWNfZHJvcDsKICAgIHVuc2lnbmVkIGxvbmcgICBzbmRfcGt0LCBzbmRfb2N0LCBzbmRfZXJyLCBzbmRfZHJvcCwgY29sbDsKICAgIGNvbnN0IGNoYXIgICAgICpzY2FuX2xpbmVfMl8yID0KICAgICAgICAiJWx1ICVsdSAlbHUgJWx1ICUqbHUgJSpsdSAlKmx1ICUqbHUgJWx1ICVsdSAlbHUgJWx1ICUqbHUgJWx1IjsKICAgIGNvbnN0IGNoYXIgICAgICpzY2FuX2xpbmVfMl8wID0KICAgICAgICAiJWx1ICVsdSAlKmx1ICUqbHUgJSpsdSAlbHUgJWx1ICUqbHUgJSpsdSAlbHUiOwojZW5kaWYKICAgIGNvbnN0IGNoYXIgICAgICpzY2FuX2xpbmVfdG9fdXNlOwogICAgc3RydWN0IHRpbWV2YWwgZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZWxhcHNlZCB0aW1lICovCgojZW5kaWYKCiNpZiAhZGVmaW5lZChocHV4MTEpICYmIGRlZmluZWQoSUZORVRfU1lNQk9MKQogICAgYXV0b19ubGlzdChJRk5FVF9TWU1CT0wsIChjaGFyICopICZpZm5ldGFkZHIsIHNpemVvZihpZm5ldGFkZHIpKTsKI2VuZGlmCiAgICBzYXZlSW5kZXggPSAwOwoKCiNpZmRlZiBsaW51eAogICAgLyogIGRpc2FsbG93IHJlbG9hZGluZyBvZiBzdHJ1Y3R1cmVzIHRvbyBvZnRlbiAqLwogICAgbmV0c25tcF9nZXRfbW9ub3RvbmljX2Nsb2NrKCZldCk7CiAgICBpZiAoIGV0LnR2X3NlYyA8IExhc3RMb2FkICsgTUlOTE9BREZSRVEgKSB7ICAgICAvKiAgb25seSByZWxvYWQgc28gb2Z0ZW4gKi8KICAgICAgaWZuZXRhZGRyID0gaWZuZXRhZGRyX2xpc3Q7ICAgICAgICAgICAgICAgICAgIC8qICBpbml0aWFsaXplIHBvaW50ZXIgKi8KICAgICAgcmV0dXJuOwogICAgfQogICAgTGFzdExvYWQgPSBldC50dl9zZWM7CgogICAgLyoKICAgICAqIGZyZWUgb2xkIGxpc3Q6IAogICAgICovCiAgICB3aGlsZSAoaWZuZXRhZGRyX2xpc3QpIHsKICAgICAgICBzdHJ1Y3QgaWZuZXQgICAqb2xkID0gaWZuZXRhZGRyX2xpc3Q7CiAgICAgICAgaWZuZXRhZGRyX2xpc3QgPSBpZm5ldGFkZHJfbGlzdC0+aWZfbmV4dDsKICAgICAgICBmcmVlKG9sZC0+aWZfbmFtZSk7CiAgICAgICAgZnJlZShvbGQtPmlmX3VuaXQpOwogICAgICAgIGZyZWUob2xkKTsKICAgIH0KCiAgICBpZm5ldGFkZHIgPSAwOwogICAgaWZuZXRhZGRyX3B0ciA9ICZpZm5ldGFkZHJfbGlzdDsKCiAgICBpZiAoKGZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApIHsKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLAogICAgICAgICAgICAgICAgICAgICJzb2NrZXQgb3BlbiBmYWlsdXJlIGluIEludGVyZmFjZV9TY2FuX0luaXRcbiIpKTsKICAgICAgICByZXR1cm47IC8qKiBleGl0ICgxKTsgKiovCiAgICB9CgogICAgLyoKICAgICAqIGJ1aWxkIHVwIGlmbmV0YWRkciBsaXN0IGJ5IGhhbmQ6IAogICAgICovCgogICAgLyoKICAgICAqIGF0IGxlYXN0IGxpbnV4IHYxLjMuNTMgc2F5cyBFTUZJTEUgd2l0aG91dCByZWFzb24uLi4gCiAgICAgKi8KICAgIGlmICghKGRldmluID0gZm9wZW4oIi9wcm9jL25ldC9kZXYiLCAiciIpKSkgewogICAgICAgIGNsb3NlKGZkKTsKICAgICAgICBORVRTTk1QX0xPR09OQ0UoKExPR19FUlIsICJjYW5ub3Qgb3BlbiAvcHJvYy9uZXQvZGV2LlxuIikpOwogICAgICAgIHJldHVybjsgLyoqIGV4aXQgKDEpOyAqKi8KICAgIH0KCiAgICBpID0gMDsKCiAgICAvKgogICAgICogcmVhZCB0aGUgc2Vjb25kIGxpbmUgKGEgaGVhZGVyKSBhbmQgZGV0ZXJtaW5lIHRoZSBmaWVsZHMgd2UKICAgICAqIHNob3VsZCByZWFkIGZyb20uICBUaGlzIHNob3VsZCBiZSBkb25lIGluIGEgYmV0dGVyIHdheSBieQogICAgICogYWN0dWFsbHkgbG9va2luZyBmb3IgdGhlIGZpZWxkIG5hbWVzIHdlIHdhbnQuICBCdXQgdGhhdHMgdG9vCiAgICAgKiBtdWNoIHdvcmsgZm9yIHRvZGF5LiAgLS0gV2VzIAogICAgICovCiAgICBmZ2V0cyhsaW5lLCBzaXplb2YobGluZSksIGRldmluKTsKICAgIGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZGV2aW4pOwogICAgaWYgKHN0cnN0cihsaW5lLCAiY29tcHJlc3NlZCIpKSB7CiAgICAgICAgc2Nhbl9saW5lX3RvX3VzZSA9IHNjYW5fbGluZV8yXzI7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLAogICAgICAgICAgICAgICAgICAgICJ1c2luZyBsaW51eCAyLjIga2VybmVsIC9wcm9jL25ldC9kZXZcbiIpKTsKICAgIH0gZWxzZSB7CiAgICAgICAgc2Nhbl9saW5lX3RvX3VzZSA9IHNjYW5fbGluZV8yXzA7CiAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLAogICAgICAgICAgICAgICAgICAgICJ1c2luZyBsaW51eCAyLjAga2VybmVsIC9wcm9jL25ldC9kZXZcbiIpKTsKICAgIH0KCgogICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZGV2aW4pKSB7CiAgICAgICAgc3RydWN0IGlmbmV0ICAgKm5uZXc7CiAgICAgICAgY2hhciAgICAgICAgICAgKnN0YXRzLCAqaWZzdGFydCA9IGxpbmU7CgogICAgICAgIGlmIChsaW5lW3N0cmxlbihsaW5lKSAtIDFdID09ICdcbicpCiAgICAgICAgICAgIGxpbmVbc3RybGVuKGxpbmUpIC0gMV0gPSAnXDAnOwoKICAgICAgICB3aGlsZSAoKmlmc3RhcnQgJiYgKmlmc3RhcnQgPT0gJyAnKQogICAgICAgICAgICBpZnN0YXJ0Kys7CgogICAgICAgIGlmICghKmlmc3RhcnQgfHwgKChzdGF0cyA9IHN0cnJjaHIoaWZzdGFydCwgJzonKSkgPT0gTlVMTCkpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIi9wcm9jL25ldC9kZXYgZGF0YSBmb3JtYXQgZXJyb3IsIGxpbmUgPT18JXN8IiwgbGluZSk7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAoKHNjYW5fbGluZV90b191c2UgPT0gc2Nhbl9saW5lXzJfMikgJiYgKChzdGF0cyAtIGxpbmUpIDwgNikpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgIi9wcm9jL25ldC9kZXYgZGF0YSBmb3JtYXQgZXJyb3IsIGxpbmUgPT18JXN8IiwgbGluZSk7CiAgICAgICAgfQoKICAgICAgICAqc3RhdHMgICA9IDA7CiAgICAgICAgc3RybGNweShpZm5hbWVfYnVmLCBpZnN0YXJ0LCBzaXplb2YoaWZuYW1lX2J1ZikpOwogICAgICAgICpzdGF0cysrID0gJzonOwogICAgICAgIHdoaWxlICgqc3RhdHMgPT0gJyAnKQogICAgICAgICAgICBzdGF0cysrOwoKICAgICAgICBpZiAoKHNjYW5fbGluZV90b191c2UgPT0gc2Nhbl9saW5lXzJfMiAmJgogICAgICAgICAgICAgc3NjYW5mKHN0YXRzLCBzY2FuX2xpbmVfdG9fdXNlLCAmcmVjX29jdCwgJnJlY19wa3QsICZyZWNfZXJyLAogICAgICAgICAgICAgICAgICAgICZyZWNfZHJvcCwgJnNuZF9vY3QsICZzbmRfcGt0LCAmc25kX2VyciwgJnNuZF9kcm9wLAogICAgICAgICAgICAgICAgICAgICZjb2xsKSAhPSA5KSB8fCAoc2Nhbl9saW5lX3RvX3VzZSA9PSBzY2FuX2xpbmVfMl8wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBzc2NhbmYoc3RhdHMsIHNjYW5fbGluZV90b191c2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY19wa3QsICZyZWNfZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzbmRfcGt0LCAmc25kX2VyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29sbCkgIT0gNSkpIHsKICAgICAgICAgICAgaWYgKChzY2FuX2xpbmVfdG9fdXNlID09IHNjYW5fbGluZV8yXzIpCiAgICAgICAgICAgICAgICAmJiAhc3Ryc3RyKGxpbmUsICJObyBzdGF0aXN0aWNzIGF2YWlsYWJsZSIpKQogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwKICAgICAgICAgICAgICAgICAgICAgICAgICIvcHJvYy9uZXQvZGV2IGRhdGEgZm9ybWF0IGVycm9yLCBsaW5lID09fCVzfCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lKTsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgfQoKICAgICAgICBubmV3ID0gKHN0cnVjdCBpZm5ldCAqKSBjYWxsb2MoMSwgc2l6ZW9mKHN0cnVjdCBpZm5ldCkpOwogICAgICAgIGlmIChubmV3ID09IE5VTEwpCiAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgLyogYWxsb2MgZXJyb3IgKi8KCiAgICAgICAgLyoKICAgICAgICAgKiBjaGFpbiBpbjogCiAgICAgICAgICovCiAgICAgICAgKmlmbmV0YWRkcl9wdHIgPSBubmV3OwogICAgICAgIGlmbmV0YWRkcl9wdHIgPSAmbm5ldy0+aWZfbmV4dDsKICAgICAgICBpKys7CgogICAgICAgIC8qCiAgICAgICAgICogbGludXggcHJldmlvdXMgdG8gMS4zLn4xMyBtYXkgbWlzcyB0cmFuc21pdHRlZCBsb29wYmFjayBwa3RzOiAKICAgICAgICAgKi8KICAgICAgICBpZiAoIXN0cmNtcChpZm5hbWVfYnVmLCAibG8iKSAmJiByZWNfcGt0ID4gMCAmJiAhc25kX3BrdCkKICAgICAgICAgICAgc25kX3BrdCA9IHJlY19wa3Q7CgogICAgICAgIG5uZXctPmlmX2lwYWNrZXRzID0gcmVjX3BrdCAmIDB4ZmZmZmZmZmY7CiAgICAgICAgbm5ldy0+aWZfaWVycm9ycyA9IHJlY19lcnI7CiAgICAgICAgbm5ldy0+aWZfb3BhY2tldHMgPSBzbmRfcGt0ICYgMHhmZmZmZmZmZjsKICAgICAgICBubmV3LT5pZl9vZXJyb3JzID0gc25kX2VycjsKICAgICAgICBubmV3LT5pZl9jb2xsaXNpb25zID0gY29sbDsKICAgICAgICBpZiAoc2Nhbl9saW5lX3RvX3VzZSA9PSBzY2FuX2xpbmVfMl8yKSB7CiAgICAgICAgICAgIG5uZXctPmlmX2lieXRlcyA9IHJlY19vY3QgJiAweGZmZmZmZmZmOwogICAgICAgICAgICBubmV3LT5pZl9vYnl0ZXMgPSBzbmRfb2N0ICYgMHhmZmZmZmZmZjsKICAgICAgICAgICAgbm5ldy0+aWZfaXFkcm9wcyA9IHJlY19kcm9wOwogICAgICAgICAgICBubmV3LT5pZl9zbmQuaWZxX2Ryb3BzID0gc25kX2Ryb3A7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm5ldy0+aWZfaWJ5dGVzID0gKHJlY19wa3QgKiAzMDgpICYgMHhmZmZmZmZmZjsKICAgICAgICAgICAgbm5ldy0+aWZfb2J5dGVzID0gKHNuZF9wa3QgKiAzMDgpICYgMHhmZmZmZmZmZjsKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogaWZuYW1lcyBhcmUgZ2l2ZW4gYXMgYGAgICBldGgwJyc6IHNwbGl0IGluIGBgZXRoJycgYW5kIGBgMCcnOiAKICAgICAgICAgKi8KICAgICAgICBmb3IgKGlmbmFtZSA9IGlmbmFtZV9idWY7ICppZm5hbWUgJiYgKmlmbmFtZSA9PSAnICc7IGlmbmFtZSsrKTsKCiAgICAgICAgLyoKICAgICAgICAgKiBzZXQgbmFtZSBhbmQgaW50ZXJmYWNlIyA6IAogICAgICAgICAqLwogICAgICAgIG5uZXctPmlmX25hbWUgPSAoY2hhciAqKSBzdHJkdXAoaWZuYW1lKTsKICAgICAgICBmb3IgKHB0ciA9IG5uZXctPmlmX25hbWU7ICpwdHIgJiYgKCpwdHIgPCAnMCcgfHwgKnB0ciA+ICc5Jyk7CiAgICAgICAgICAgICBwdHIrKyk7CiAgICAgICAgbm5ldy0+aWZfdW5pdCA9IHN0cmR1cCgqcHRyID8gcHRyIDogIiIpOwogICAgICAgICpwdHIgPSAwOwoKICAgICAgICBzdHJsY3B5KGlmcnEuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmcnEuaWZyX25hbWUpKTsKICAgICAgICBpZiAoaW9jdGwoZmQsIFNJT0NHSUZBRERSLCAmaWZycSkgPCAwKQogICAgICAgICAgICBtZW1zZXQoKGNoYXIgKikgJm5uZXctPmlmX2FkZHIsIDAsIHNpemVvZihubmV3LT5pZl9hZGRyKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBubmV3LT5pZl9hZGRyID0gaWZycS5pZnJfYWRkcjsKCiAgICAgICAgc3RybGNweShpZnJxLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnJxLmlmcl9uYW1lKSk7CiAgICAgICAgaWYgKGlvY3RsKGZkLCBTSU9DR0lGQlJEQUREUiwgJmlmcnEpIDwgMCkKICAgICAgICAgICAgbWVtc2V0KChjaGFyICopICZubmV3LT5pZnVfYnJvYWRhZGRyLCAwLAogICAgICAgICAgICAgICAgICAgc2l6ZW9mKG5uZXctPmlmdV9icm9hZGFkZHIpKTsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG5uZXctPmlmdV9icm9hZGFkZHIgPSBpZnJxLmlmcl9icm9hZGFkZHI7CgogICAgICAgIHN0cmxjcHkoaWZycS5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZycS5pZnJfbmFtZSkpOwogICAgICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRk5FVE1BU0ssICZpZnJxKSA8IDApCiAgICAgICAgICAgIG1lbXNldCgoY2hhciAqKSAmbm5ldy0+aWFfc3VibmV0bWFzaywgMCwKICAgICAgICAgICAgICAgICAgIHNpemVvZihubmV3LT5pYV9zdWJuZXRtYXNrKSk7CiAgICAgICAgZWxzZQogICAgICAgICAgICBubmV3LT5pYV9zdWJuZXRtYXNrID0gaWZycS5pZnJfbmV0bWFzazsKCiAgICAgICAgc3RybGNweShpZnJxLmlmcl9uYW1lLCBpZm5hbWUsIHNpemVvZihpZnJxLmlmcl9uYW1lKSk7CiAgICAgICAgbm5ldy0+aWZfZmxhZ3MgPSBpb2N0bChmZCwgU0lPQ0dJRkZMQUdTLCAmaWZycSkgPCAwCiAgICAgICAgICAgID8gMCA6IGlmcnEuaWZyX2ZsYWdzOwoKICAgICAgICBubmV3LT5pZl90eXBlID0gMDsKCiAgICAgICAgLyoKICAgICAgICAgKiBOT1RFOiB0aGlzIGlvY3RsIGRvZXMgbm90IGd1YXJhbnRlZSA2IGJ5dGVzIG9mIGEgcGh5c2FkZHIuCiAgICAgICAgICogSW4gcGFydGljdWxhciwgYSAnc2l0MCcgaW50ZXJmYWNlIG9ubHkgYXBwZWFycyB0byBnZXQgYmFjawogICAgICAgICAqIDQgYnl0ZXMgb2Ygc2FfZGF0YS4KICAgICAgICAgKi8KICAgICAgICBtZW1zZXQoaWZycS5pZnJfaHdhZGRyLnNhX2RhdGEsICgwKSwgSUZIV0FERFJMRU4pOwogICAgICAgIHN0cmxjcHkoaWZycS5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZycS5pZnJfbmFtZSkpOwogICAgICAgIGlmIChpb2N0bChmZCwgU0lPQ0dJRkhXQUREUiwgJmlmcnEpIDwgMCkKICAgICAgICAgICAgbWVtc2V0KG5uZXctPmlmX2h3YWRkciwgKDApLCBJRkhXQUREUkxFTik7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG1lbWNweShubmV3LT5pZl9od2FkZHIsIGlmcnEuaWZyX2h3YWRkci5zYV9kYXRhLCBJRkhXQUREUkxFTik7CgojaWZkZWYgQVJQSFJEX0xPT1BCQUNLCiAgICAgICAgICAgIHN3aXRjaCAoaWZycS5pZnJfaHdhZGRyLnNhX2ZhbWlseSkgewogICAgICAgICAgICBjYXNlIEFSUEhSRF9FVEhFUjoKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSA2OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgQVJQSFJEX1RVTk5FTDoKICAgICAgICAgICAgY2FzZSBBUlBIUkRfVFVOTkVMNjoKI2lmZGVmIEFSUEhSRF9JUEdSRQogICAgICAgICAgICBjYXNlIEFSUEhSRF9JUEdSRToKI2VuZGlmCiAgICAgICAgICAgIGNhc2UgQVJQSFJEX1NJVDoKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSAxMzE7CiAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgLyogdHVubmVsICovCiAgICAgICAgICAgIGNhc2UgQVJQSFJEX1NMSVA6CiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0NTTElQOgogICAgICAgICAgICBjYXNlIEFSUEhSRF9TTElQNjoKICAgICAgICAgICAgY2FzZSBBUlBIUkRfQ1NMSVA2OgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDI4OwogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIHNsaXAgKi8KICAgICAgICAgICAgY2FzZSBBUlBIUkRfUFBQOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDIzOwogICAgICAgICAgICAgICAgYnJlYWs7ICAgICAgICAgIC8qIHBwcCAqLwogICAgICAgICAgICBjYXNlIEFSUEhSRF9MT09QQkFDSzoKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSAyNDsKICAgICAgICAgICAgICAgIGJyZWFrOyAgICAgICAgICAvKiBzb2Z0d2FyZUxvb3BiYWNrICovCiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0ZEREk6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gMTU7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBBUlBIUkRfQVJDTkVUOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDM1OwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0xPQ0FMVExLOgogICAgICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IDQyOwogICAgICAgICAgICAgICAgYnJlYWs7CiNpZmRlZiBBUlBIUkRfSElQUEkKICAgICAgICAgICAgY2FzZSBBUlBIUkRfSElQUEk6CiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gNDc7CiAgICAgICAgICAgICAgICBicmVhazsKI2VuZGlmCiNpZmRlZiBBUlBIUkRfQVRNCiAgICAgICAgICAgIGNhc2UgQVJQSFJEX0FUTToKICAgICAgICAgICAgICAgIG5uZXctPmlmX3R5cGUgPSAzNzsKICAgICAgICAgICAgICAgIGJyZWFrOwojZW5kaWYKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiBYWFg6IG1vcmUgaWZfYXJwLmg6QVJQSERSX3h4eCB0byBJQU5BaWZUeXBlIG1hcHBpbmdzLi4uIAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgfQoKICAgICAgICBzdHJsY3B5KGlmcnEuaWZyX25hbWUsIGlmbmFtZSwgc2l6ZW9mKGlmcnEuaWZyX25hbWUpKTsKICAgICAgICBubmV3LT5pZl9tZXRyaWMgPSBpb2N0bChmZCwgU0lPQ0dJRk1FVFJJQywgJmlmcnEpIDwgMAogICAgICAgICAgICA/IDAgOiBpZnJxLmlmcl9tZXRyaWM7CgojaWZkZWYgU0lPQ0dJRk1UVQogICAgICAgIHN0cmxjcHkoaWZycS5pZnJfbmFtZSwgaWZuYW1lLCBzaXplb2YoaWZycS5pZnJfbmFtZSkpOwogICAgICAgIG5uZXctPmlmX210dSA9IChpb2N0bChmZCwgU0lPQ0dJRk1UVSwgJmlmcnEpIDwgMCkKICAgICAgICAgICAgPyAwIDogaWZycS5pZnJfbXR1OwojZWxzZQogICAgICAgIG5uZXctPmlmX210dSA9IDA7CiNlbmRpZgoKICAgICAgICBpZl9wdHIgPSBuZXRzbm1wX2FjY2Vzc19pbnRlcmZhY2VfZW50cnlfb3ZlcnJpZGVzX2dldChpZm5hbWUpOwogICAgICAgIGlmIChpZl9wdHIpIHsKICAgICAgICAgICAgbm5ldy0+aWZfdHlwZSA9IGlmX3B0ci0+dHlwZTsKICAgICAgICAgICAgbm5ldy0+aWZfc3BlZWQgPSBpZl9wdHItPnNwZWVkOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGRvIG9ubHkgZ3Vlc3MgaWZfdHlwZSBmcm9tIG5hbWUsIGlmIHdlIGNvdWxkIG5vdCByZWFkCiAgICAgICAgICAgICAqICogaXQgYmVmb3JlIGZyb20gU0lPQ0dJRkhXQUREUiAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHVuc2lnbmVkIGludCBkZWZhdWx0c3BlZWQgPSBOT01JTkFMX0xJTktfU1BFRUQ7CiAgICAgICAgICAgICAgICBpZiAoIShubmV3LT5pZl9mbGFncyAmIElGRl9SVU5OSU5HKSkgewogICAgICAgICAgICAgICAgICAgIC8qIAogICAgICAgICAgICAgICAgICAgICAqIHVzZSBzcGVlZCAwIGlmIHRoZSBpZiBzcGVlZCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCAqYW5kKiB0aGUKICAgICAgICAgICAgICAgICAgICAgKiBpbnRlcmZhY2UgaXMgZG93bgogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzcGVlZCA9IDA7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAoIW5uZXctPmlmX3R5cGUpCiAgICAgICAgICAgICAgICBubmV3LT5pZl90eXBlID0gaWZfdHlwZV9mcm9tX25hbWUobm5ldy0+aWZfbmFtZSk7CiAgICAgICAgICAgIHN3aXRjaChubmV3LT5pZl90eXBlKSB7CiAgICAgICAgICAgIGNhc2UgNjoKICAgICAgICAgICAgICAgIG5uZXctPmlmX3NwZWVkID0gZ2V0SWZTcGVlZChmZCwgaWZycSwgZGVmYXVsdHNwZWVkKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDI0OgogICAgICAgICAgICAgICAgbm5ldy0+aWZfc3BlZWQgPSAxMDAwMDAwMDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIDk6CiAgICAgICAgICAgICAgICBubmV3LT5pZl9zcGVlZCA9IDQwMDAwMDA7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIG5uZXctPmlmX3NwZWVkID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKlplcm8gc3BlZWQgbWVhbnMgbGluayBwcm9ibGVtKi8KICAgICAgICAgICAgaWYobm5ldy0+aWZfc3BlZWQgPT0gMCAmJiBubmV3LT5pZl9mbGFncyAmIElGRl9VUCl7CiAgICAgICAgICAgICAgICBubmV3LT5pZl9mbGFncyAmPSB+SUZGX1JVTk5JTkc7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIChmZ2V0cyAuLi4gKi8KCiAgICBpZm5ldGFkZHIgPSBpZm5ldGFkZHJfbGlzdDsKCiAgICBpZiAoc25tcF9nZXRfZG9fZGVidWdnaW5nKCkpIHsKICAgICAgICB7CiAgICAgICAgICAgIHN0cnVjdCBpZm5ldCAgICp4ID0gaWZuZXRhZGRyOwogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlcyIsICIqIHNlZToga25vd24gaW50ZXJmYWNlczoiKSk7CiAgICAgICAgICAgIHdoaWxlICh4KSB7CiAgICAgICAgICAgICAgICBERUJVR01TRygoIm1pYklJL2ludGVyZmFjZXMiLCAiICVzIiwgeC0+aWZfbmFtZSkpOwogICAgICAgICAgICAgICAgeCA9IHgtPmlmX25leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgREVCVUdNU0coKCJtaWJJSS9pbnRlcmZhY2VzIiwgIlxuIikpOwogICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgIC8qIFhYWCAqLwogICAgfQoKICAgIGZjbG9zZShkZXZpbik7CiAgICBjbG9zZShmZCk7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbGludXggKi8KfQoKCgojaWYgZGVmaW5lZChzdW5WMykgfHwgZGVmaW5lZChsaW51eCkKLyoKICogKiogIDQuMiBCU0QgZG9lc24ndCBoYXZlIGlmYWRkcgogKiAqKiAgCiAqLwppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dChzaG9ydCAqSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgY2hhciAqTmFtZSwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZuZXQgKlJldGlmbmV0LCBzdHJ1Y3QgaW5faWZhZGRyICpkdW1teSkKewogICAgaW50IHJldHVybkluZGV4ID0gMDsKICAgIGludCByZXQ7CiAgICBpZiAoSW5kZXgpCiAgICAgICAgcmV0dXJuSW5kZXggPSAqSW5kZXg7CgogICAgcmV0ID0gSW50ZXJmYWNlX1NjYW5fTmV4dEludCggJnJldHVybkluZGV4LCBOYW1lLCBSZXRpZm5ldCwgZHVtbXkgKTsKICAgIGlmIChJbmRleCkKICAgICAgICAqSW5kZXggPSAocmV0dXJuSW5kZXggJiAweDhmZmYpOwogICAgcmV0dXJuIHJldDsKfQoKaW50CkludGVyZmFjZV9TY2FuX05leHRJbnQoaW50ICpJbmRleCwKICAgICAgICAgICAgICAgICAgICBjaGFyICpOYW1lLAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZm5ldCAqUmV0aWZuZXQsIHN0cnVjdCBpbl9pZmFkZHIgKmR1bW15KQp7CiAgICBzdHJ1Y3QgaWZuZXQgICAgaWZuZXQ7CiAgICByZWdpc3RlciBjaGFyICAqY3A7CgogICAgd2hpbGUgKGlmbmV0YWRkcikgewogICAgICAgIC8qCiAgICAgICAgICogICAgICBHZXQgdGhlICJpZm5ldCIgc3RydWN0dXJlIGFuZCBleHRyYWN0IHRoZSBkZXZpY2UgbmFtZQogICAgICAgICAqLwojaWZuZGVmIGxpbnV4CiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXRhZGRyLCAoY2hhciAqKSAmaWZuZXQsIHNpemVvZiBpZm5ldCkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX1NjYW5fTmV4dCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0LmlmX25hbWUsIChjaGFyICopIHNhdmVOYW1lLCBzaXplb2Ygc2F2ZU5hbWUpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzOkludGVyZmFjZV9TY2FuX05leHQiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgIC8qCiAgICAgICAgKiBUaGUgcHVycG9zZSBvZiB0aGlzIGNvbXBhcmlzb24gaXMgbG9zdCBpbiB0aGUgbWlzdHMgb2YgdGltZS4KICAgICAgICAqIEl0J3MgYmVlbiBhcm91bmQgYXQgbGVhc3QgY211LXNubXAgMi4xLjIgZm9yIFNVTnYzIHN5c3RlbXMgYW5kCiAgICAgICAgKiB3YXMgYXBwbGllZCB0byBsaW51eCBzeXN0ZW1zIGR1cmluZyB0aGUgY211LXNubXAtbGludXggcHJvamVjdC4KICAgICAgICAqIE5vLW9uZSBub3cga25vd3Mgd2hhdCBpdCB3YXMgaW50ZW5kZWQgZm9yLCBhbmQgaXQgYnJlYWtzIElQdjYKICAgICAgICAqIHR1bm5lbCBpbnRlcmZhY2VzLCBzbyBpdCdzIGJlZW4gbW92ZWQgb3V0IG9mIHRoZSBMaW51eCBjb2RlIGJsb2NrLgogICAgICAgICovCiAgICAgICAgaWYgKHN0cmNtcChzYXZlTmFtZSwgImlwIikgPT0gMCkgewogICAgICAgICAgICBpZm5ldGFkZHIgPSBpZm5ldC5pZl9uZXh0OwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiNlbHNlCiAgICAgICAgaWZuZXQgPSAqaWZuZXRhZGRyOwogICAgICAgIHN0cmxjcHkoc2F2ZU5hbWUsIGlmbmV0LmlmX25hbWUsIHNpemVvZihzYXZlTmFtZSkpOwojZW5kaWYKCiAgICAgICAgc2F2ZU5hbWVbc2l6ZW9mKHNhdmVOYW1lKSAtIDFdID0gJ1wwJzsKICAgICAgICBjcCA9IChjaGFyICopIHN0cmNocihzYXZlTmFtZSwgJ1wwJyk7CiNpZmRlZiBsaW51eAogICAgICAgIHN0cmxjYXQoc2F2ZU5hbWUsIGlmbmV0LmlmX3VuaXQsIHNpemVvZihzYXZlTmFtZSkpOwojZWxzZQojaWZkZWYgTkVUU05NUF9GRUFUVVJFX0NIRUNLSU4KICAgICAgICAvKiB0aGlzIGV4aXN0cyBoZXJlIGp1c3Qgc28gd2UgZG9uJ3QgY29weSBpZmRlZiBsb2dpYyBlbHNld2hlcmUgKi8KICAgICAgICBuZXRzbm1wX2ZlYXR1cmVfcmVxdWlyZShzdHJpbmdfYXBwZW5kX2ludCk7CiNlbmRpZgogICAgICAgIHN0cmluZ19hcHBlbmRfaW50KGNwLCBpZm5ldC5pZl91bml0KTsKI2VuZGlmCiAgICAgICAgaWYgKDEgfHwgc3RyY21wKHNhdmVOYW1lLCAibG8wIikgIT0gMCkgeyAgICAgICAgLyogWFhYICovCgogICAgICAgICAgICBpZiAoSW5kZXgpCiAgICAgICAgICAgICAgICAqSW5kZXggPSArK3NhdmVJbmRleDsKICAgICAgICAgICAgaWYgKFJldGlmbmV0KQogICAgICAgICAgICAgICAgKlJldGlmbmV0ID0gaWZuZXQ7CiAgICAgICAgICAgIGlmIChOYW1lKQogICAgICAgICAgICAgICAgc3RyY3B5KE5hbWUsIHNhdmVOYW1lKTsKICAgICAgICAgICAgc2F2ZWlmbmV0ID0gaWZuZXQ7CiAgICAgICAgICAgIHNhdmVpZm5ldGFkZHIgPSBpZm5ldGFkZHI7CiAgICAgICAgICAgIGlmbmV0YWRkciA9IGlmbmV0LmlmX25leHQ7CgogICAgICAgICAgICByZXR1cm4gKDEpOyAgICAgICAgIC8qIERPTkUgKi8KICAgICAgICB9CiAgICAgICAgaWZuZXRhZGRyID0gaWZuZXQuaWZfbmV4dDsKICAgIH0KICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAvKiBFT0YgKi8KfQoKI2lmZGVmIGxpbnV4CmludApJbnRlcmZhY2VfSW5kZXhfQnlfTmFtZShjaGFyICpOYW1lLCBpbnQgTGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgaWZJbmRleCA9IDA7CiAgICBjaGFyICAgICAgICAgICAgaWZOYW1lWzIwXTsKCiAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CiAgICB3aGlsZSAoSW50ZXJmYWNlX1NjYW5fTmV4dEludCgmaWZJbmRleCwgaWZOYW1lLCBOVUxMLCBOVUxMKQogICAgICAgICAgICYmIHN0cmNtcChOYW1lLCBpZk5hbWUpKTsKICAgIHJldHVybiBpZkluZGV4Owp9CiNlbmRpZgoKCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3VuVjMgfHwgbGludXggKi8KCiNpZiBkZWZpbmVkKG5ldGJzZDEpIHx8IGRlZmluZWQob3BlbmJzZDIpCiNkZWZpbmUgaWFfbmV4dCBpYV9saXN0LnRxZV9uZXh0CiNkZWZpbmUgaWZfbmV4dCBpZl9saXN0LnRxZV9uZXh0CiNlbmRpZgoKI2lmIGRlZmluZWQoaHB1eDExKQppbnQKSW50ZXJmYWNlX1NjYW5fTmV4dChzaG9ydCAqSW5kZXgsIGNoYXIgKk5hbWUsIG5tYXBpX3BoeXN0YXQgKiBSZXRpZm5ldCkKewogICAgaW50IHJldHVybkluZGV4ID0gMDsKICAgIGludCByZXQ7CiAgICBpZiAoSW5kZXgpCiAgICAgICAgcmV0dXJuSW5kZXggPSAqSW5kZXg7CgogICAgcmV0ID0gSW50ZXJmYWNlX1NjYW5fTmV4dEludCggJnJldHVybkluZGV4LCBOYW1lLCBSZXRpZm5ldCApOwogICAgaWYgKEluZGV4KQogICAgICAgICpJbmRleCA9IChyZXR1cm5JbmRleCAmIDB4OGZmZik7CiAgICByZXR1cm4gcmV0Owp9CgoKaW50CkludGVyZmFjZV9TY2FuX05leHRJbnQoaW50ICpJbmRleCwgY2hhciAqTmFtZSwgbm1hcGlfcGh5c3RhdCAqIFJldGlmbmV0KQp7CiAgICBzdGF0aWMgbm1hcGlfcGh5c3RhdCAqaWZfcHRyID0gKG5tYXBpX3BoeXN0YXQgKikgMDsKICAgIGludCAgICAgICAgICAgICBjb3VudCA9IEludGVyZmFjZV9TY2FuX0dldF9Db3VudCgpOwogICAgdW5zaWduZWQgaW50ICAgIHVsZW47CiAgICBpbnQgICAgICAgICAgICAgcmV0OwoKICAgIGlmICghaWZfcHRyKSB7CiAgICAgICAgaWYgKGNvdW50KSB7CiAgICAgICAgICAgIGlmX3B0ciA9CiAgICAgICAgICAgICAgICAobm1hcGlfcGh5c3RhdCAqKSBtYWxsb2Moc2l6ZW9mKG5tYXBpX3BoeXN0YXQpICogY291bnQpOwogICAgICAgICAgICBpZiAoaWZfcHRyID09IE5VTEwpCiAgICAgICAgICAgICAgICByZXR1cm4gKDApOwoKICAgICAgICB9IGVsc2UKICAgICAgICAgICAgcmV0dXJuICgwKTsgICAgICAgICAvKiBFT0YgKi8KICAgIH0KCiAgICBpZiAoc2F2ZUluZGV4ID49IGNvdW50KQogICAgICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgIC8qIEVPRiAqLwoKICAgIHVsZW4gPSAodW5zaWduZWQgaW50KSBjb3VudCAqc2l6ZW9mKG5tYXBpX3BoeXN0YXQpOwogICAgaWYgKChyZXQgPSBnZXRfcGh5c2ljYWxfc3RhdChpZl9wdHIsICZ1bGVuKSkgPCAwKQogICAgICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgIC8qIEVPRiAqLwoKICAgIGlmIChSZXRpZm5ldCkKICAgICAgICAqUmV0aWZuZXQgPSBpZl9wdHJbc2F2ZUluZGV4XTsKICAgIGlmIChOYW1lKQogICAgICAgIHN0cmNweShOYW1lLCBpZl9wdHJbc2F2ZUluZGV4XS5ubV9kZXZpY2UpOwogICAgc2F2ZUluZGV4Kys7CiAgICBpZiAoSW5kZXgpCiAgICAgICAgKkluZGV4ID0gc2F2ZUluZGV4OwogICAgcmV0dXJuICgxKTsgICAgICAgICAgICAgICAgIC8qIERPTkUgKi8KfQoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBocHV4MTEgKi8KaW50CkludGVyZmFjZV9TY2FuX05leHQoc2hvcnQgKkluZGV4LAogICAgICAgICAgICAgICAgICAgIGNoYXIgKk5hbWUsCiAgICAgICAgICAgICAgICAgICAgc3RydWN0IGlmbmV0ICpSZXRpZm5ldCwgc3RydWN0IGluX2lmYWRkciAqUmV0aW5faWZhZGRyKQp7CiAgICBpbnQgcmV0dXJuSW5kZXggPSAwOwogICAgaW50IHJldDsKICAgIGlmIChJbmRleCkKICAgICAgICByZXR1cm5JbmRleCA9ICpJbmRleDsKCiAgICByZXQgPSBJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCAmcmV0dXJuSW5kZXgsIE5hbWUsIFJldGlmbmV0LCBSZXRpbl9pZmFkZHIgKTsKICAgIGlmIChJbmRleCkKICAgICAgICAqSW5kZXggPSAocmV0dXJuSW5kZXggJiAweDhmZmYpOwogICAgcmV0dXJuIHJldDsKfQoKCmludApJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KGludCAqSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgY2hhciAqTmFtZSwKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaWZuZXQgKlJldGlmbmV0LCBzdHJ1Y3QgaW5faWZhZGRyICpSZXRpbl9pZmFkZHIpCnsKICAgIHN0cnVjdCBpZm5ldCAgICBpZm5ldDsKICAgIHN0cnVjdCBpbl9pZmFkZHIgKmlhLCBpbl9pZmFkZHI7CiAgICBzaG9ydCAgICAgICAgICAgaGFzX2lwYWRkciA9IDA7CiNpZiAhSEFWRV9TVFJVQ1RfSUZORVRfSUZfWE5BTUUKICAgIHJlZ2lzdGVyIGNoYXIgICpjcDsKI2VuZGlmCgogICAgd2hpbGUgKGlmbmV0YWRkcikgewogICAgICAgIC8qCiAgICAgICAgICogICAgICBHZXQgdGhlICJpZm5ldCIgc3RydWN0dXJlIGFuZCBleHRyYWN0IHRoZSBkZXZpY2UgbmFtZQogICAgICAgICAqLwogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0YWRkciwgKGNoYXIgKikgJmlmbmV0LCBzaXplb2YgaWZuZXQpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzOkludGVyZmFjZV9TY2FuX05leHQiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQojaWYgSEFWRV9TVFJVQ1RfSUZORVRfSUZfWE5BTUUKI2lmIGRlZmluZWQobmV0YnNkMSkgfHwgZGVmaW5lZChvcGVuYnNkMikKICAgICAgICBzdHJsY3B5KHNhdmVOYW1lLCBpZm5ldC5pZl94bmFtZSwgc2l6ZW9mKHNhdmVOYW1lKSk7CiNlbHNlCiAgICAgICAgaWYgKCFORVRTTk1QX0tMT09LVVAoaWZuZXQuaWZfeG5hbWUsIChjaGFyICopIHNhdmVOYW1lLCBzaXplb2Ygc2F2ZU5hbWUpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzOkludGVyZmFjZV9TY2FuX05leHQiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQojZW5kaWYKICAgICAgICBzYXZlTmFtZVtzaXplb2Yoc2F2ZU5hbWUpIC0gMV0gPSAnXDAnOwojZWxzZQogICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlmbmV0LmlmX25hbWUsIChjaGFyICopIHNhdmVOYW1lLCBzaXplb2Ygc2F2ZU5hbWUpKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzOkludGVyZmFjZV9TY2FuX05leHQiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICBzYXZlTmFtZVtzaXplb2Yoc2F2ZU5hbWUpIC0gMV0gPSAnXDAnOwogICAgICAgIGNwID0gc3RyY2hyKHNhdmVOYW1lLCAnXDAnKTsKI2lmZGVmIE5FVFNOTVBfRkVBVFVSRV9DSEVDS0lOCiAgICAgICAgLyogdGhpcyBleGlzdHMgaGVyZSBqdXN0IHNvIHdlIGRvbid0IGNvcHkgaWZkZWYgbG9naWMgZWxzZXdoZXJlICovCiAgICAgICAgbmV0c25tcF9mZWF0dXJlX3JlcXVpcmUoc3RyaW5nX2FwcGVuZF9pbnQpOwojZW5kaWYKICAgICAgICBzdHJpbmdfYXBwZW5kX2ludChjcCwgaWZuZXQuaWZfdW5pdCk7CiNlbmRpZgogICAgICAgIGlmICgxIHx8IHN0cmNtcChzYXZlTmFtZSwgImxvMCIpICE9IDApIHsgICAgICAgIC8qIFhYWCAqLwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiAgVHJ5IHRvIGZpbmQgYW4gYWRkcmVzcyBmb3IgdGhpcyBpbnRlcmZhY2UKICAgICAgICAgICAgICovCgojaWZkZWYgbmV0YnNkMQogICAgICAgICAgICBpYSA9IChzdHJ1Y3QgaW5faWZhZGRyICopIGlmbmV0LmlmX2FkZHJsaXN0LnRxaF9maXJzdDsKI2VsaWYgZGVmaW5lZChJRkFERFJfU1lNQk9MKQogICAgICAgICAgICBhdXRvX25saXN0KElGQUREUl9TWU1CT0wsIChjaGFyICopICZpYSwgc2l6ZW9mKGlhKSk7CiNlbmRpZgogICAgICAgICAgICB3aGlsZSAoaWEpIHsKICAgICAgICAgICAgICAgIGlmICghTkVUU05NUF9LTE9PS1VQKGlhLCAoY2hhciAqKSAmaW5faWZhZGRyLCBzaXplb2YoaW5faWZhZGRyKSkpIHsKICAgICAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfU2Nhbl9OZXh0IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB7CiNpZmRlZiBuZXRic2QxCiNkZWZpbmUgQ1AoeCkJKChjaGFyICopKHgpKQogICAgICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICpjcDsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHIgKnNhOwogICAgICAgICAgICAgICAgICAgIGNwID0gKENQKGluX2lmYWRkci5pYV9pZmEuaWZhX2FkZHIpIC0gQ1AoaWEpKSArCiAgICAgICAgICAgICAgICAgICAgICAgIENQKCZpbl9pZmFkZHIpOwogICAgICAgICAgICAgICAgICAgIHNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSBjcDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKHNhLT5zYV9mYW1pbHkgPT0gQUZfSU5FVCkKI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbl9pZmFkZHIuaWFfaWZwID09IGlmbmV0YWRkcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2lwYWRkciA9IDE7ICAgICAvKiB0aGlzIElGIGhhcyBJUC1hZGRyZXNzICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQojaWZkZWYgbmV0YnNkMQogICAgICAgICAgICAgICAgaWEgPSAoc3RydWN0IGluX2lmYWRkciAqKSBpbl9pZmFkZHIuaWFfaWZhLmlmYV9saXN0LgogICAgICAgICAgICAgICAgICAgIHRxZV9uZXh0OwojZWxzZQogICAgICAgICAgICAgICAgaWEgPSBpbl9pZmFkZHIuaWFfbmV4dDsKI2VuZGlmCiAgICAgICAgICAgIH0KCiNpZiAhZGVmaW5lZChuZXRic2QxKSAmJiAhZGVmaW5lZChmcmVlYnNkMikgJiYgIWRlZmluZWQob3BlbmJzZDIpICYmICFkZWZpbmVkKEhBVkVfU1RSVUNUX0lGTkVUX0lGX0FERFJMSVNUKQogICAgICAgICAgICBpZm5ldC5pZl9hZGRybGlzdCA9IChzdHJ1Y3QgaWZhZGRyICopIGlhOyAgIC8qIFdST05HIERBVEEgVFlQRTsgT05MWSBBIEZMQUcgKi8KI2VuZGlmCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGlmbmV0LmlmX2FkZHJsaXN0ID0gKHN0cnVjdCBpZmFkZHIgKikmaWEtPmlhX2lmYTsgICAKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogV1JPTkcgREFUQSBUWVBFOyBPTkxZIEEgRkxBRyAKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAoSW5kZXgpCiAgICAgICAgICAgICAgICAqSW5kZXggPSArK3NhdmVJbmRleDsKICAgICAgICAgICAgaWYgKFJldGlmbmV0KQogICAgICAgICAgICAgICAgKlJldGlmbmV0ID0gaWZuZXQ7CiAgICAgICAgICAgIGlmIChSZXRpbl9pZmFkZHIgJiYgaGFzX2lwYWRkcikgICAgIC8qIGFzc2lnbiB0aGUgaW5faWZhZGRyIG9ubHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogaWYgdGhlIElGIGhhcyBJUC1hZGRyZXNzICovCiAgICAgICAgICAgICAgICAqUmV0aW5faWZhZGRyID0gaW5faWZhZGRyOwogICAgICAgICAgICBpZiAoTmFtZSkKICAgICAgICAgICAgICAgIHN0cmNweShOYW1lLCBzYXZlTmFtZSk7CiAgICAgICAgICAgIHNhdmVpZm5ldCA9IGlmbmV0OwogICAgICAgICAgICBzYXZlaWZuZXRhZGRyID0gaWZuZXRhZGRyOwogICAgICAgICAgICBzYXZlaW5faWZhZGRyID0gaW5faWZhZGRyOwogICAgICAgICAgICBpZm5ldGFkZHIgPSBpZm5ldC5pZl9uZXh0OwoKICAgICAgICAgICAgcmV0dXJuICgxKTsgICAgICAgICAvKiBET05FICovCiAgICAgICAgfQogICAgICAgIGlmbmV0YWRkciA9IGlmbmV0LmlmX25leHQ7CiAgICB9CiAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgLyogRU9GICovCn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN1blYzIHx8IGxpbnV4ICovCgojaWYgZGVmaW5lZChocHV4MTEpCgpzdGF0aWMgaW50CkludGVyZmFjZV9TY2FuX0J5X0luZGV4KGludCBJbmRleCwgY2hhciAqTmFtZSwgbm1hcGlfcGh5c3RhdCAqIFJldGlmbmV0KQp7CiAgICBpbnQgICAgICAgICAgIGk7CgogICAgSW50ZXJmYWNlX1NjYW5fSW5pdCgpOwogICAgd2hpbGUgKEludGVyZmFjZV9TY2FuX05leHRJbnQoJmksIE5hbWUsIFJldGlmbmV0KSkgewogICAgICAgIGlmIChpID09IEluZGV4KQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChpICE9IEluZGV4KQogICAgICAgIHJldHVybiAoLTEpOyAgICAgICAgICAgIC8qIEVycm9yLCBkb2Vzbid0IGV4aXN0ICovCiAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgLyogRE9ORSAqLwp9CgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKc3RhdGljIGludApJbnRlcmZhY2VfU2Nhbl9CeV9JbmRleChpbnQgSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKk5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpZm5ldCAqUmV0aWZuZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBpbl9pZmFkZHIgKlJldGluX2lmYWRkcikKewogICAgaW50ICAgICAgICAgICBpOwoKICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKICAgIHdoaWxlIChJbnRlcmZhY2VfU2Nhbl9OZXh0SW50KCZpLCBOYW1lLCBSZXRpZm5ldCwgUmV0aW5faWZhZGRyKSkgewogICAgICAgIGlmIChpID09IEluZGV4KQogICAgICAgICAgICBicmVhazsKICAgIH0KICAgIGlmIChpICE9IEluZGV4KQogICAgICAgIHJldHVybiAoLTEpOyAgICAgICAgICAgIC8qIEVycm9yLCBkb2Vzbid0IGV4aXN0ICovCiAgICByZXR1cm4gKDApOyAgICAgICAgICAgICAgICAgLyogRE9ORSAqLwp9CgojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhwdXgxMSAqLwoKc3RhdGljIGludCAgICAgIEludGVyZmFjZV9Db3VudCA9IDA7CgojaWYgZGVmaW5lZChocHV4MTEpCgppbnQKSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KHZvaWQpCnsKICAgIGlmICghSW50ZXJmYWNlX0NvdW50KSB7CiAgICAgICAgaW50ICAgICAgICAgICAgIGZkOwogICAgICAgIHN0cnVjdCBubXBhcm1zICBwOwogICAgICAgIGludCAgICAgICAgICAgICB2YWw7CiAgICAgICAgdW5zaWduZWQgaW50ICAgIHVsZW47CiAgICAgICAgaW50ICAgICAgICAgICAgIHJldDsKCiAgICAgICAgaWYgKChmZCA9IG9wZW5fbWliKCIvZGV2L2lwIiwgT19SRE9OTFksIDAsIE5NX0FTWU5DX09GRikpID49IDApIHsKICAgICAgICAgICAgcC5vYmppZCA9IElEX2lmTnVtYmVyOwogICAgICAgICAgICBwLmJ1ZmZlciA9ICh2b2lkICopICZ2YWw7CiAgICAgICAgICAgIHVsZW4gPSBzaXplb2YoaW50KTsKICAgICAgICAgICAgcC5sZW4gPSAmdWxlbjsKICAgICAgICAgICAgaWYgKChyZXQgPSBnZXRfbWliX2luZm8oZmQsICZwKSkgPT0gMCkKICAgICAgICAgICAgICAgIEludGVyZmFjZV9Db3VudCA9IHZhbDsKICAgICAgICAgICAgY2xvc2VfbWliKGZkKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gKEludGVyZmFjZV9Db3VudCk7Cn0KCiNlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgppbnQKSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KHZvaWQpCnsKICAgIHN0YXRpYyB0aW1lX3QgICBzY2FuX3RpbWUgPSAwOwogICAgdGltZV90ICAgICAgICAgIHRpbWVfbm93ID0gdGltZShOVUxMKTsKCiAgICBpZiAoIUludGVyZmFjZV9Db3VudCB8fCAodGltZV9ub3cgPiBzY2FuX3RpbWUgKyA2MCkpIHsKICAgICAgICBzY2FuX3RpbWUgPSB0aW1lX25vdzsKICAgICAgICBJbnRlcmZhY2VfU2Nhbl9Jbml0KCk7CiAgICAgICAgSW50ZXJmYWNlX0NvdW50ID0gMDsKICAgICAgICB3aGlsZSAoSW50ZXJmYWNlX1NjYW5fTmV4dEludChOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKSAhPSAwKSB7CiAgICAgICAgICAgIEludGVyZmFjZV9Db3VudCsrOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAoSW50ZXJmYWNlX0NvdW50KTsKfQoKCnN0YXRpYyBpbnQKSW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleChpbnQgSW5kZXgsIHVfY2hhciAqIEV0aGVyQWRkcikKewogICAgaW50ICAgICAgICAgICAgIGk7CiNpZiAhKGRlZmluZWQobGludXgpIHx8IGRlZmluZWQobmV0YnNkMSkgfHwgZGVmaW5lZChic2RpMikgfHwgZGVmaW5lZChvcGVuYnNkMikpCiAgICBzdHJ1Y3QgYXJwY29tICAgYXJwY29tOwojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzIGxpbnV4IG9yIG5ldGJzZDEgKi8KICAgIHN0cnVjdCBhcnBjb20gewogICAgICAgIGNoYXIgICAgICAgICAgICBhY19lbmFkZHJbNl07CiAgICB9IGFycGNvbTsKI2lmIGRlZmluZWQobmV0YnNkMSkgfHwgZGVmaW5lZChic2RpMikgfHwgZGVmaW5lZChvcGVuYnNkMikKICAgIHN0cnVjdCBzb2NrYWRkcl9kbCBzYWRsOwogICAgc3RydWN0IGlmYWRkciAgIGlmYWRkcjsKICAgIHVfbG9uZyAgICAgICAgICBpZmFkZHJhZGRyOwojZW5kaWYKI2VuZGlmCgojaWYgZGVmaW5lZChtaXBzKSB8fCBkZWZpbmVkKGhwdXgpIHx8IGRlZmluZWQob3NmNCkgfHwgZGVmaW5lZChvc2YzKSB8fCBkZWZpbmVkKG9zZjUpCiAgICBtZW1zZXQoYXJwY29tLmFjX2VuYWRkciwgMCwgc2l6ZW9mKGFycGNvbS5hY19lbmFkZHIpKTsKI2Vsc2UKICAgIG1lbXNldCgmYXJwY29tLmFjX2VuYWRkciwgMCwgc2l6ZW9mKGFycGNvbS5hY19lbmFkZHIpKTsKI2VuZGlmCiAgICBtZW1zZXQoRXRoZXJBZGRyLCAwLCBzaXplb2YoYXJwY29tLmFjX2VuYWRkcikpOwoKICAgIGlmIChzYXZlSW5kZXggIT0gSW5kZXgpIHsgICAvKiBPcHRpbWl6YXRpb24hICovCgogICAgICAgIEludGVyZmFjZV9TY2FuX0luaXQoKTsKCiAgICAgICAgd2hpbGUgKEludGVyZmFjZV9TY2FuX05leHRJbnQoJmksIE5VTEwsIE5VTEwsIE5VTEwpICE9IDApIHsKICAgICAgICAgICAgaWYgKGkgPT0gSW5kZXgpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGkgIT0gSW5kZXgpCiAgICAgICAgICAgIHJldHVybiAoLTEpOyAgICAgICAgLyogRXJyb3IsIGRvZXNuJ3QgZXhpc3QgKi8KICAgIH0KI2lmZGVmIGZyZWVic2QyCiAgICBpZiAoc2F2ZWlmbmV0LmlmX3R5cGUgIT0gSUZUX0VUSEVSKSB7CiAgICAgICAgcmV0dXJuICgwKTsgICAgICAgICAgICAgLyogTm90IGFuIGV0aGVybmV0IGlmICovCiAgICB9CiNlbmRpZgogICAgLyoKICAgICAqICB0aGUgYXJwY29tIHN0cnVjdHVyZSBpcyBhbiBleHRlbmRlZCBpZm5ldCBzdHJ1Y3R1cmUgd2hpY2gKICAgICAqICBjb250YWlucyB0aGUgZXRoZXJuZXQgYWRkcmVzcy4KICAgICAqLwojaWZuZGVmIGxpbnV4CiNpZiAhKGRlZmluZWQobmV0YnNkMSkgfHwgZGVmaW5lZChic2RpMikgfHwgZGVmaW5lZChvcGVuYnNkMikpCiAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChzYXZlaWZuZXRhZGRyLCAoY2hhciAqKSAmYXJwY29tLCBzaXplb2YgYXJwY29tKSkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzOkludGVyZmFjZV9HZXRfRXRoZXJfQnlfSW5kZXgiLCAia2xvb2t1cCBmYWlsZWRcbiIpKTsKICAgICAgICByZXR1cm4gMDsKICAgIH0KI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXRic2QxIG9yIGJzZGkyIG9yIG9wZW5ic2QyICovCgojaWYgZGVmaW5lZChuZXRic2QxKSB8fCBkZWZpbmVkKG9wZW5ic2QyKQojZGVmaW5lIGlmX2FkZHJsaXN0IGlmX2FkZHJsaXN0LnRxaF9maXJzdAojZGVmaW5lIGlmYV9uZXh0ICAgIGlmYV9saXN0LnRxZV9uZXh0CiNlbmRpZgoKICAgIGlmYWRkcmFkZHIgPSAodW5zaWduZWQgbG9uZykgc2F2ZWlmbmV0LmlmX2FkZHJsaXN0OwogICAgd2hpbGUgKGlmYWRkcmFkZHIpIHsKICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZmFkZHJhZGRyLCAoY2hhciAqKSAmaWZhZGRyLCBzaXplb2YgaWZhZGRyKSkgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUkvaW50ZXJmYWNlczpJbnRlcmZhY2VfR2V0X0V0aGVyX0J5X0luZGV4IiwgImtsb29rdXAgZmFpbGVkXG4iKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAoIU5FVFNOTVBfS0xPT0tVUChpZmFkZHIuaWZhX2FkZHIsIChjaGFyICopICZzYWRsLCBzaXplb2Ygc2FkbCkpIHsKICAgICAgICAgICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXM6SW50ZXJmYWNlX0dldF9FdGhlcl9CeV9JbmRleCIsICJrbG9va3VwIGZhaWxlZFxuIikpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHNhZGwuc2RsX2ZhbWlseSA9PSBBRl9MSU5LCiAgICAgICAgICAgICYmIChzYXZlaWZuZXQuaWZfdHlwZSA9PSBJRlRfRVRIRVIKICAgICAgICAgICAgICAgIHx8IHNhdmVpZm5ldC5pZl90eXBlID09IElGVF9JU084ODAyNQogICAgICAgICAgICAgICAgfHwgc2F2ZWlmbmV0LmlmX3R5cGUgPT0gSUZUX0ZEREkpKSB7CiAgICAgICAgICAgIG1lbWNweShhcnBjb20uYWNfZW5hZGRyLCBzYWRsLnNkbF9kYXRhICsgc2FkbC5zZGxfbmxlbiwKICAgICAgICAgICAgICAgICAgIHNpemVvZihhcnBjb20uYWNfZW5hZGRyKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZmFkZHJhZGRyID0gKHVuc2lnbmVkIGxvbmcpIGlmYWRkci5pZmFfbmV4dDsKICAgIH0KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuZXRic2QxIG9yIGJzZGkyIG9yIG9wZW5ic2QyICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpbnV4ICovCiAgICBtZW1jcHkoYXJwY29tLmFjX2VuYWRkciwgc2F2ZWlmbmV0YWRkci0+aWZfaHdhZGRyLCA2KTsKI2VuZGlmCiAgICBpZiAoc3RybmNtcCgibG8iLCBzYXZlTmFtZSwgMikgPT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogIExvb3BiYWNrIGRvZXNuJ3QgaGF2ZSBhIEhXIGFkZHIsIHNvIHJldHVybiAwMDowMDowMDowMDowMDowMAogICAgICAgICAqLwogICAgICAgIG1lbXNldChFdGhlckFkZHIsIDAsIHNpemVvZihhcnBjb20uYWNfZW5hZGRyKSk7CgogICAgfSBlbHNlIHsKCiNpZiBkZWZpbmVkKG1pcHMpIHx8IGRlZmluZWQoaHB1eCkgfHwgZGVmaW5lZChvc2Y0KSB8fCBkZWZpbmVkKG9zZjMpCiAgICAgICAgbWVtY3B5KEV0aGVyQWRkciwgKGNoYXIgKikgYXJwY29tLmFjX2VuYWRkciwKICAgICAgICAgICAgICAgc2l6ZW9mKGFycGNvbS5hY19lbmFkZHIpKTsKI2Vsc2UKICAgICAgICBtZW1jcHkoRXRoZXJBZGRyLCAoY2hhciAqKSAmYXJwY29tLmFjX2VuYWRkciwKICAgICAgICAgICAgICAgc2l6ZW9mKGFycGNvbS5hY19lbmFkZHIpKTsKI2VuZGlmCgoKICAgIH0KICAgIHJldHVybiAoMCk7ICAgICAgICAgICAgICAgICAvKiBET05FICovCn0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaHB1eDExICovCgojZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHNvbGFyaXMyICovCgppbnQKSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBpLCBzZDsKCiAgICBpZiAoKHNkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApKSA8IDApCiAgICAgICAgcmV0dXJuICgwKTsKICAgIGlmIChpb2N0bChzZCwgU0lPQ0dJRk5VTSwgJmkpID09IC0xKSB7CiAgICAgICAgY2xvc2Uoc2QpOwogICAgICAgIHJldHVybiAoMCk7CiAgICB9IGVsc2UgewogICAgICAgIGNsb3NlKHNkKTsKICAgICAgICByZXR1cm4gKGkpOwogICAgfQp9CgppbnQKSW50ZXJmYWNlX0luZGV4X0J5X05hbWUoY2hhciAqTmFtZSwgaW50IExlbikKewogICAgcmV0dXJuIChzb2xhcmlzMl9pZl9uYW1ldG9pbmRleChOYW1lLCBMZW4pKTsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBzb2xhcmlzMiAqLwoKI2Vsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIQVZFX05FVF9JRl9NSUJfSCAqLwoKLyoKICogVGhpcyBjb2RlIGF0dGVtcHRzIHRvIGRvIHRoZSByaWdodCB0aGluZyBmb3IgRnJlZUJTRC4gIE5vdGUgdGhhdAogKiB0aGUgc3RhdGlzdGljcyBjb3VsZCBiZSBnYXRoZXJlZCB0aHJvdWdoIHVzZSBvZiBvZiB0aGUKICogbmV0LnJvdXRlLjAubGluay5pZmxpc3QuMCBzeXNjdGwgKHdoaWNoIHdlIGFscmVhZHkgdXNlIHRvIGdldCB0aGUKICogaGFyZHdhcmUgYWRkcmVzcyBvZiB0aGUgaW50ZXJmYWNlcyksIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBpZm1pYgogKiBjb2RlLCBidXQgZXZlbnR1YWxseSBJIHdpbGwgaW1wbGVtZW50IGRvdDNTdGF0cyBhbmQgd2Ugd2lsbCBoYXZlIHRvCiAqIHVzZSB0aGUgaWZtaWIgaW50ZXJmYWNlLiAgaWZtaWIgaXMgYWxzbyBhIG11Y2ggbW9yZSBuYXR1cmFsIHdheSBvZgogKiBtYXBwaW5nIHRoZSBTTk1QIE1JQiBvbnRvIHN5c2N0bCgzKS4KICovCgojaW5jbHVkZSA8bmV0L2lmLmg+CiNpbmNsdWRlIDxuZXQvaWZfZGwuaD4KI2luY2x1ZGUgPG5ldC9pZl9taWIuaD4KI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgoKc3RhdGljIGludCAgICAgIGhlYWRlcl9pbnRlcmZhY2VzKHN0cnVjdCB2YXJpYWJsZSAqLCBvaWQgKiwgc2l6ZV90ICosIGludCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAqLCBXcml0ZU1ldGhvZCAqKiB3cml0ZSk7CnN0YXRpYyBpbnQgICAgICBoZWFkZXJfaWZFbnRyeShzdHJ1Y3QgdmFyaWFibGUgKiwgb2lkICosIHNpemVfdCAqLCBpbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKiwgV3JpdGVNZXRob2QgKiogd3JpdGUpOwp1X2NoYXIgICAgICAgICAqdmFyX2lmRW50cnkoc3RydWN0IHZhcmlhYmxlICosIG9pZCAqLCBzaXplX3QgKiwgaW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICosIFdyaXRlTWV0aG9kICoqIHdyaXRlKTsKCnN0YXRpYyBjaGFyICAgICpwaHlzYWRkcmJ1ZjsKc3RhdGljIGludCAgICAgIG5waHlzYWRkcnM7CnN0cnVjdCBzb2NrYWRkcl9kbCAqKnBoeXNhZGRyczsKCnZvaWQKaW5pdF9pbnRlcmZhY2VzX3NldHVwKHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBuYWRkcnMsIGlsZW4sIGJpdDsKICAgIHN0YXRpYyBpbnQgICAgICBtaWJbNl0KICAgID0geyBDVExfTkVULCBQRl9ST1VURSwgMCwgQUZfTElOSywgTkVUX1JUX0lGTElTVCwgMCB9OwogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgc2l6ZV90ICAgICAgICAgIGxlbjsKICAgIHN0cnVjdCBydF9tc2doZHIgKnJ0bTsKICAgIHN0cnVjdCBpZl9tc2doZHIgKmlmbTsKICAgIHN0cnVjdCBpZmFfbXNnaGRyICppZmFtOwogICAgc3RydWN0IHNvY2thZGRyICpzYTsKCiAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJpbml0X2ludGVyZmFjZXNfc2V0dXBcbiIpKTsKCiAgICBuYWRkcnMgPSAwOwogICAgaWYgKHBoeXNhZGRycykKICAgICAgICBmcmVlKHBoeXNhZGRycyk7CiAgICBpZiAocGh5c2FkZHJidWYpCiAgICAgICAgZnJlZShwaHlzYWRkcmJ1Zik7CiAgICBwaHlzYWRkcmJ1ZiA9IDA7CiAgICBwaHlzYWRkcnMgPSAwOwogICAgbnBoeXNhZGRycyA9IDA7CiAgICBsZW4gPSAwOwogICAgaWYgKHN5c2N0bChtaWIsIDYsIDAsICZsZW4sIDAsIDApIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgInN5c2N0bCAxIDwgMFxuIikpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICBjcCA9IHBoeXNhZGRyYnVmID0gbWFsbG9jKGxlbik7CiAgICBpZiAocGh5c2FkZHJidWYgPT0gMCkKICAgICAgICByZXR1cm47CiAgICBpZiAoc3lzY3RsKG1pYiwgNiwgcGh5c2FkZHJidWYsICZsZW4sIDAsIDApIDwgMCkgewogICAgICAgIGZyZWUocGh5c2FkZHJidWYpOwogICAgICAgIHBoeXNhZGRyYnVmID0gMDsKICAgICAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJzeXNjdGwgMiA8IDBcbiIpKTsKICAgICAgICByZXR1cm47CiAgICB9CgogIGxvb3A6CiAgICBpbGVuID0gbGVuOwogICAgY3AgPSBwaHlzYWRkcmJ1ZjsKICAgIHdoaWxlIChpbGVuID4gMCkgewogICAgICAgIHJ0bSA9IChzdHJ1Y3QgcnRfbXNnaGRyICopIGNwOwogICAgICAgIGlmIChydG0tPnJ0bV92ZXJzaW9uICE9IFJUTV9WRVJTSU9OIHx8IHJ0bS0+cnRtX3R5cGUgIT0gUlRNX0lGSU5GTykgewogICAgICAgICAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJ2ZXJzaW9uOiVkLyVkIHR5cGU6JWQvJWRcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHJ0bS0+cnRtX3ZlcnNpb24sIFJUTV9WRVJTSU9OLCBydG0tPnJ0bV90eXBlLCBSVE1fSUZJTkZPKSk7CiAgICAgICAgICAgIGZyZWUocGh5c2FkZHJzKTsKICAgICAgICAgICAgcGh5c2FkZHJzID0gMDsKICAgICAgICAgICAgZnJlZShwaHlzYWRkcmJ1Zik7CiAgICAgICAgICAgIHBoeXNhZGRyYnVmID0gMDsKICAgICAgICB9CiAgICAgICAgaWZtID0gKHN0cnVjdCBpZl9tc2doZHIgKikgcnRtOwojaWYgZGVmaW5lZChmcmVlYnNkMykgfHwgZGVmaW5lZChmcmVlYnNkNCkgfHwgZGVmaW5lZChmcmVlYnNkNSkKICAgICAgICBpZiAocGh5c2FkZHJzICE9IDApCiAgICAgICAgICAgIHBoeXNhZGRyc1tuYWRkcnNdID0gKHZvaWQgKikgKGlmbSArIDEpOwogICAgICAgIG5hZGRycysrOwojZW5kaWYKICAgICAgICBpbGVuIC09IGlmbS0+aWZtX21zZ2xlbjsKICAgICAgICBjcCArPSBpZm0tPmlmbV9tc2dsZW47CiAgICAgICAgcnRtID0gKHN0cnVjdCBydF9tc2doZHIgKikgY3A7CiAgICAgICAgd2hpbGUgKGlsZW4gPiAwICYmIHJ0bS0+cnRtX3R5cGUgPT0gUlRNX05FV0FERFIpIHsKI2lmIGRlZmluZWQoZnJlZWJzZDMpIHx8IGRlZmluZWQoZnJlZWJzZDQpIHx8IGRlZmluZWQoZnJlZWJzZDUpCiAgICAgICAgICAgIGlsZW4gLT0gcnRtLT5ydG1fbXNnbGVuOwogICAgICAgICAgICBjcCArPSBydG0tPnJ0bV9tc2dsZW47CiNlbHNlCiAgICAgICAgICAgIGludCAgICAgICAgICAgICBpc19hbGlhcyA9IDA7CiAgICAgICAgICAgIGlmYW0gPSAoc3RydWN0IGlmYV9tc2doZHIgKikgcnRtOwogICAgICAgICAgICBpbGVuIC09IHNpemVvZigqaWZhbSk7CiAgICAgICAgICAgIGNwICs9IHNpemVvZigqaWZhbSk7CiAgICAgICAgICAgIHNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSBjcDsKI2RlZmluZSBST1VORCh4KSAoKCh4KSArIHNpemVvZihsb25nKSAtIDEpICYgfnNpemVvZihsb25nKSkKICAgICAgICAgICAgZm9yIChiaXQgPSAxOyBiaXQgJiYgaWxlbiA+IDA7IGJpdCA8PD0gMSkgewogICAgICAgICAgICAgICAgaWYgKCEoaWZhbS0+aWZhbV9hZGRycyAmIGJpdCkpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICBpbGVuIC09IFJPVU5EKHNhLT5zYV9sZW4pOwogICAgICAgICAgICAgICAgY3AgKz0gUk9VTkQoc2EtPnNhX2xlbik7CgogICAgICAgICAgICAgICAgaWYgKGJpdCA9PSBSVEFfSUZBKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBoeXNhZGRycykKI2RlZmluZSBzYXRvc2RsKHNhKSAoKHN0cnVjdCBzb2NrYWRkcl9kbCAqKShzYSkpCiAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNhZGRyc1tuYWRkcnMrK10KICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gc2F0b3NkbChzYSk7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBuYWRkcnMrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNhID0gKHN0cnVjdCBzb2NrYWRkciAqKSBjcDsKICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgcnRtID0gKHN0cnVjdCBydF9tc2doZHIgKikgY3A7CiAgICAgICAgfQogICAgfQogICAgREVCVUdNU0dUTCgoIm1pYklJOmZyZWVic2QiLCAiZm91bmQgJWQgYWRkcnNcbiIsIG5hZGRycykpOwogICAgaWYgKHBoeXNhZGRycykgewogICAgICAgIG5waHlzYWRkcnMgPSBuYWRkcnM7CiAgICAgICAgcmV0dXJuOwogICAgfQogICAgcGh5c2FkZHJzID0gbWFsbG9jKG5hZGRycyAqIHNpemVvZigqcGh5c2FkZHJzKSk7CiAgICBpZiAocGh5c2FkZHJzID09IDApCiAgICAgICAgcmV0dXJuOwogICAgbmFkZHJzID0gMDsKICAgIGdvdG8gbG9vcDsKCn0KCnN0YXRpYyBpbnQKZ2V0X3BoeXNfYWRkcmVzcyhpbnQgaWluZGV4LCBjaGFyICoqYXAsIGludCAqbGVuKQp7CiAgICBpbnQgICAgICAgICAgICAgaTsKICAgIGludCAgICAgICAgICAgICBvbmNlID0gMTsKCiAgICBkbyB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG5waHlzYWRkcnM7IGkrKykgewogICAgICAgICAgICBpZiAocGh5c2FkZHJzW2ldLT5zZGxfaW5kZXggPT0gaWluZGV4KQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChpIDwgbnBoeXNhZGRycykKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgaW5pdF9pbnRlcmZhY2VzX3NldHVwKCk7CiAgICB9IHdoaWxlIChvbmNlLS0pOwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgImdldF9waHlzX2FkZHJlc3MgJWQvJWRcbiIsIGksIG5waHlzYWRkcnMpKTsKICAgIGlmIChpIDwgbnBoeXNhZGRycykgewogICAgICAgICphcCA9IExMQUREUihwaHlzYWRkcnNbaV0pOwogICAgICAgICpsZW4gPSBwaHlzYWRkcnNbaV0tPnNkbF9hbGVuOwogICAgICAgIHJldHVybiAwOwogICAgfQogICAgcmV0dXJuIC0xOwp9CgppbnQKSW50ZXJmYWNlX1NjYW5fR2V0X0NvdW50KHZvaWQpCnsKICAgIHN0YXRpYyBpbnQgICAgICBjb3VudF9vaWRbNV0gPSB7IENUTF9ORVQsIFBGX0xJTkssIE5FVExJTktfR0VORVJJQywKICAgICAgICBJRk1JQl9TWVNURU0sIElGTUlCX0lGQ09VTlQKICAgIH07CiAgICBzaXplX3QgICAgICAgICAgbGVuOwogICAgaW50ICAgICAgICAgICAgIGNvdW50OwoKICAgIGxlbiA9IHNpemVvZiBjb3VudDsKICAgIGlmIChzeXNjdGwoY291bnRfb2lkLCA1LCAmY291bnQsICZsZW4sICh2b2lkICopIDAsIChzaXplX3QpIDApIDwgMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSTpmcmVlYnNkIiwgIkludGVyZmFjZV9TY2FuX0dldF9Db3VudCBlcnJcbiIpKTsKICAgICAgICByZXR1cm4gLTE7CiAgICB9CiAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJJbnRlcmZhY2VfU2Nhbl9HZXRfQ291bnQgJWRcbiIsIGNvdW50KSk7CiAgICByZXR1cm4gY291bnQ7Cn0KCgp1X2NoYXIgICAgICAgICAqCnZhcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBpbnQgICAgICAgICAgICAgaW50ZXJmYWNlOwogICAgc3RhdGljIGludCAgICAgIHNuYW1lWzZdID0geyBDVExfTkVULCBQRl9MSU5LLCBORVRMSU5LX0dFTkVSSUMsCiAgICAgICAgSUZNSUJfSUZEQVRBLCAwLCBJRkRBVEFfR0VORVJBTAogICAgfTsKICAgIHN0YXRpYyBzdHJ1Y3QgaWZtaWJkYXRhIGlmbWQ7CiAgICBzaXplX3QgICAgICAgICAgbGVuOwogICAgY2hhciAgICAgICAgICAgKmNwOwogICAgY29uZl9pZl9saXN0ICAgKmlmX3B0ciA9IE5VTEw7CgogICAgaW50ZXJmYWNlID0gaGVhZGVyX2lmRW50cnkodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZV9tZXRob2QpOwogICAgaWYgKGludGVyZmFjZSA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CgogICAgc25hbWVbNF0gPSBpbnRlcmZhY2U7CiAgICBsZW4gPSBzaXplb2YgaWZtZDsKICAgIGlmIChzeXNjdGwoc25hbWUsIDYsICZpZm1kLCAmbGVuLCAwLCAwKSA8IDApIHsKICAgICAgICBERUJVR01TR1RMKCgibWliSUk6ZnJlZWJzZCIsICJ2YXJfaWZFbnRyeSBzeXNjdGwgZXJyXG4iKSk7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICAvKgogICAgICogaG1tbS4uIHdoZXJlIHRvIGdldCB0aGUgaW50ZXJmYWNlIG5hbWUgdG8gY2hlY2sgb3ZlcnJpZGVzPwogICAgICoKICAgICAqIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KE5hbWUpOwogICAgICovCgogICAgc3dpdGNoICh2cC0+bWFnaWMpIHsKICAgIGNhc2UgTkVUU05NUF9JRklOREVYOgogICAgICAgIGxvbmdfcmV0dXJuID0gaW50ZXJmYWNlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZERVNDUjoKICAgICAgICBjcCA9IGlmbWQuaWZtZF9uYW1lOwogICAgICAgICp2YXJfbGVuID0gc3RybGVuKGNwKTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBjcDsKICAgIGNhc2UgTkVUU05NUF9JRlRZUEU6CiAgICAgICAgaWYgKGlmX3B0cikKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSBpZl9wdHItPnR5cGU7CiAgICAgICAgZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZtZC5pZm1kX2RhdGEuaWZpX3R5cGU7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk1UVToKICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfbXR1OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZTUEVFRDoKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IGlmX3B0ci0+c3BlZWQ7CiAgICAgICAgZWxzZQogICAgICAgIGxvbmdfcmV0dXJuID0gaWZtZC5pZm1kX2RhdGEuaWZpX2JhdWRyYXRlOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZQSFlTQUREUkVTUzoKICAgICAgICB7CiAgICAgICAgICAgIGNoYXIgICAgICAgICAgICpjcDsKICAgICAgICAgICAgaWYgKGdldF9waHlzX2FkZHJlc3MoaW50ZXJmYWNlLCAmY3AsIHZhcl9sZW4pKQogICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgIHJldHVybiBjcDsKICAgICAgICB9CiAgICBjYXNlIE5FVFNOTVBfSUZBRE1JTlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9mbGFncyAmIElGRl9VUCA/IDEgOiAyOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPUEVSU1RBVFVTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZtZC5pZm1kX2ZsYWdzICYgSUZGX1JVTk5JTkcgPyAxIDogMjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGTEFTVENIQU5HRToKICAgICAgICBpZiAoaWZtZC5pZm1kX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfc2VjID09IDAgJiYKICAgICAgICAgICAgaWZtZC5pZm1kX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfdXNlYyA9PSAwKSB7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gMDsKICAgICAgICB9IGVsc2UgaWYgKGlmbWQuaWZtZF9kYXRhLmlmaV9sYXN0Y2hhbmdlLnR2X3NlYyA8IHN0YXJ0dGltZS50dl9zZWMpIHsKICAgICAgICAgICAgbG9uZ19yZXR1cm4gPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykKICAgICAgICAgICAgICAgICgoaWZtZC5pZm1kX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfc2VjIC0KICAgICAgICAgICAgICAgICAgc3RhcnR0aW1lLnR2X3NlYykgKiAxMDAgKwogICAgICAgICAgICAgICAgICgoaWZtZC5pZm1kX2RhdGEuaWZpX2xhc3RjaGFuZ2UudHZfdXNlYyAtCiAgICAgICAgICAgICAgICAgICBzdGFydHRpbWUudHZfdXNlYykgLyAxMDAwMCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5PQ1RFVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfaWJ5dGVzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9pcGFja2V0czsKICAgICAgICBsb25nX3JldHVybiAtPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfaW1jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5OVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX2ltY2FzdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfaXFkcm9wczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5FUlJPUlM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZm1kLmlmbWRfZGF0YS5pZmlfaWVycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VTktOT1dOUFJPVE9TOgogICAgICAgIGxvbmdfcmV0dXJuID0gKHVfbG9uZykgaWZtZC5pZm1kX2RhdGEuaWZpX25vcHJvdG87CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVE9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9vYnl0ZXM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVFVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9vcGFja2V0czsKICAgICAgICBsb25nX3JldHVybiAtPSAodV9sb25nKSBpZm1kLmlmbWRfZGF0YS5pZmlfb21jYXN0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9ICh1X2xvbmcpIGlmbWQuaWZtZF9kYXRhLmlmaV9vbWNhc3RzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRESVNDQVJEUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9zbmRfZHJvcHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVEVSUk9SUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmbWQuaWZtZF9kYXRhLmlmaV9vZXJyb3JzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRRTEVOOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZtZC5pZm1kX3NuZF9sZW47CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRlNQRUNJRklDOgogICAgICAgICp2YXJfbGVuID0gbnVsbE9pZExlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBudWxsT2lkOwogICAgZGVmYXVsdDoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQiLCAidW5rbm93biBzdWItaWQgJWQgaW4gdmFyX2lmRW50cnlcbiIsCiAgICAgICAgICAgICAgICAgICAgdnAtPm1hZ2ljKSk7CiAgICB9CiAgICByZXR1cm4gTlVMTDsKfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIQVZFX05FVF9JRl9NSUJfSCAqLwojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICFVU0VfU1lTQ1RMX0lGTElTVCAqLwoKI2VsaWYgZGVmaW5lZChIQVZFX0lQSExQQVBJX0gpICAvKiBXSU4zMiBjeWd3aW4gKi8KI2luY2x1ZGUgPGlwaGxwYXBpLmg+CgojaWZuZGVmIE5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVApXcml0ZU1ldGhvZCAgICAgd3JpdGVJZkVudHJ5OwojZW5kaWYgLyogIU5FVFNOTVBfTk9fV1JJVEVfU1VQUE9SVCAqLwpsb25nICAgICAgICAgICAgYWRtaW5fc3RhdHVzID0gMDsKbG9uZyAgICAgICAgICAgIG9sZGFkbWluX3N0YXR1cyA9IDA7CgpzdGF0aWMgaW50CmhlYWRlcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqdnAsCiAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKI2RlZmluZSBJRkVOVFJZX05BTUVfTEVOR1RICTEwCiAgICBvaWQgICAgICAgICAgICAgbmV3bmFtZVtNQVhfT0lEX0xFTl07CiAgICByZWdpc3RlciBpbnQgICAgaWZJbmRleDsKICAgIGludCAgICAgICAgICAgICByZXN1bHQsIGNvdW50OwogICAgRFdPUkQgICAgICAgICAgIHN0YXR1cyA9IE5PX0VSUk9SOwogICAgRFdPUkQgICAgICAgICAgIGR3QWN0dWFsU2l6ZSA9IDA7CiAgICBQTUlCX0lGVEFCTEUgICAgcElmVGFibGUgPSBOVUxMOwoKICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwgInZhcl9pZkVudHJ5OiAiKSk7CiAgICBERUJVR01TR09JRCgoIm1pYklJL2ludGVyZmFjZXMiLCBuYW1lLCAqbGVuZ3RoKSk7CiAgICBERUJVR01TRygoIm1pYklJL2ludGVyZmFjZXMiLCAiICVkXG4iLCBleGFjdCkpOwoKICAgIG1lbWNweSgoY2hhciAqKSBuZXduYW1lLCAoY2hhciAqKSB2cC0+bmFtZSwKICAgICAgICAgICAoaW50KSB2cC0+bmFtZWxlbiAqIHNpemVvZihvaWQpKTsKICAgIC8qCiAgICAgKiBmaW5kICJuZXh0IiBpZkluZGV4IAogICAgICovCgogICAgc3RhdHVzID0gR2V0SWZUYWJsZShwSWZUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICBpZiAoc3RhdHVzID09IEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpIHsKICAgICAgICBwSWZUYWJsZSA9IG1hbGxvYyhkd0FjdHVhbFNpemUpOwogICAgICAgIGlmIChwSWZUYWJsZSkKICAgICAgICAgICAgR2V0SWZUYWJsZShwSWZUYWJsZSwgJmR3QWN0dWFsU2l6ZSwgVFJVRSk7CiAgICB9CiAgICBjb3VudCA9IHBJZlRhYmxlLT5kd051bUVudHJpZXM7CiAgICBmb3IgKGlmSW5kZXggPSAwOyBpZkluZGV4IDwgY291bnQ7IGlmSW5kZXgrKykgewogICAgICAgIG5ld25hbWVbSUZFTlRSWV9OQU1FX0xFTkdUSF0gPQogICAgICAgICAgICAob2lkKSBwSWZUYWJsZS0+dGFibGVbaWZJbmRleF0uZHdJbmRleDsKICAgICAgICByZXN1bHQgPQogICAgICAgICAgICBzbm1wX29pZF9jb21wYXJlKG5hbWUsICpsZW5ndGgsIG5ld25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgdnAtPm5hbWVsZW4gKyAxKTsKICAgICAgICBpZiAoKGV4YWN0ICYmIChyZXN1bHQgPT0gMCkpIHx8ICghZXhhY3QgJiYgKHJlc3VsdCA8IDApKSkKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICBpZiAoaWZJbmRleCA+PSBjb3VudCkgewogICAgICAgIERFQlVHTVNHVEwoKCJtaWJJSS9pbnRlcmZhY2VzIiwgIi4uLiBpbmRleCBvdXQgb2YgcmFuZ2VcbiIpKTsKICAgICAgICBjb3VudCA9IE1BVENIX0ZBSUxFRDsKICAgICAgICBnb3RvIG91dDsKICAgIH0KCiAgICBtZW1jcHkoKGNoYXIgKikgbmFtZSwgKGNoYXIgKikgbmV3bmFtZSwKICAgICAgICAgICAoKGludCkgdnAtPm5hbWVsZW4gKyAxKSAqIHNpemVvZihvaWQpKTsKICAgICpsZW5ndGggPSB2cC0+bmFtZWxlbiArIDE7CiAgICAqd3JpdGVfbWV0aG9kID0gMDsKICAgICp2YXJfbGVuID0gc2l6ZW9mKGxvbmcpOyAgICAvKiBkZWZhdWx0IHRvICdsb25nJyByZXN1bHRzICovCgogICAgREVCVUdNU0dUTCgoIm1pYklJL2ludGVyZmFjZXMiLCAiLi4uIGdldCBJL0Ygc3RhdHMgIikpOwogICAgREVCVUdNU0dPSUQoKCJtaWJJSS9pbnRlcmZhY2VzIiwgbmFtZSwgKmxlbmd0aCkpOwogICAgREVCVUdNU0coKCJtaWJJSS9pbnRlcmZhY2VzIiwgIlxuIikpOwoKICAgIGNvdW50ID0gcElmVGFibGUtPnRhYmxlW2lmSW5kZXhdLmR3SW5kZXg7Cm91dDoKICAgIGZyZWUocElmVGFibGUpOwogICAgcmV0dXJuIGNvdW50Owp9CgoKCnVfY2hhciAgICAgICAgICoKdmFyX2ludGVyZmFjZXMoc3RydWN0IHZhcmlhYmxlICogdnAsCiAgICAgICAgICAgICAgIG9pZCAqIG5hbWUsCiAgICAgICAgICAgICAgIHNpemVfdCAqIGxlbmd0aCwKICAgICAgICAgICAgICAgaW50IGV4YWN0LCBzaXplX3QgKiB2YXJfbGVuLCBXcml0ZU1ldGhvZCAqKiB3cml0ZV9tZXRob2QpCnsKICAgIGlmIChoZWFkZXJfZ2VuZXJpYyh2cCwgbmFtZSwgbGVuZ3RoLCBleGFjdCwgdmFyX2xlbiwgd3JpdGVfbWV0aG9kKSA9PQogICAgICAgIE1BVENIX0ZBSUxFRCkKICAgICAgICByZXR1cm4gTlVMTDsKCiAgICBzd2l0Y2ggKHZwLT5tYWdpYykgewogICAgY2FzZSBORVRTTk1QX0lGTlVNQkVSOgogICAgICAgIG5ldHNubXBfYXNzZXJ0KHNpemVvZihEV09SRCkgPT0gc2l6ZW9mKGxvbmdfcmV0dXJuKSk7CiAgICAgICAgR2V0TnVtYmVyT2ZJbnRlcmZhY2VzKChEV09SRCAqKSAmbG9uZ19yZXR1cm4pOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaW50ZXJmYWNlc1xuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9Cgp1X2NoYXIgICAgICAgICAqCnZhcl9pZkVudHJ5KHN0cnVjdCB2YXJpYWJsZSAqIHZwLAogICAgICAgICAgICBvaWQgKiBuYW1lLAogICAgICAgICAgICBzaXplX3QgKiBsZW5ndGgsCiAgICAgICAgICAgIGludCBleGFjdCwgc2l6ZV90ICogdmFyX2xlbiwgV3JpdGVNZXRob2QgKiogd3JpdGVfbWV0aG9kKQp7CiAgICBpbnQgICAgICAgICAgICAgaWZJbmRleDsKICAgIHN0YXRpYyBNSUJfSUZST1cgaWZSb3c7CiAgICBjb25mX2lmX2xpc3QgICAqaWZfcHRyID0gTlVMTDsKICAgIAogICAgaWZJbmRleCA9CiAgICAgICAgaGVhZGVyX2lmRW50cnkodnAsIG5hbWUsIGxlbmd0aCwgZXhhY3QsIHZhcl9sZW4sIHdyaXRlX21ldGhvZCk7CiAgICBpZiAoaWZJbmRleCA9PSBNQVRDSF9GQUlMRUQpCiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAvKgogICAgICogaG1tbS4uIHdoZXJlIHRvIGdldCB0aGUgaW50ZXJmYWNlIG5hbWUgdG8gY2hlY2sgb3ZlcnJpZGVzPwogICAgICoKICAgICAqIGlmX3B0ciA9IG5ldHNubXBfYWNjZXNzX2ludGVyZmFjZV9lbnRyeV9vdmVycmlkZXNfZ2V0KE5hbWUpOwogICAgICovCgogICAgLyoKICAgICAqIEdldCB0aGUgSWYgVGFibGUgUm93IGJ5IHBhc3NpbmcgaW5kZXggYXMgYXJndW1lbnQgCiAgICAgKi8KICAgIGlmUm93LmR3SW5kZXggPSBpZkluZGV4OwogICAgaWYgKEdldElmRW50cnkoJmlmUm93KSAhPSBOT19FUlJPUikKICAgICAgICByZXR1cm4gTlVMTDsKICAgIHN3aXRjaCAodnAtPm1hZ2ljKSB7CiAgICBjYXNlIE5FVFNOTVBfSUZJTkRFWDoKICAgICAgICBsb25nX3JldHVybiA9IGlmSW5kZXg7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRkRFU0NSOgogICAgICAgICp2YXJfbGVuID0gaWZSb3cuZHdEZXNjckxlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSBpZlJvdy5iRGVzY3I7CiAgICBjYXNlIE5FVFNOTVBfSUZUWVBFOgogICAgICAgIGlmIChpZl9wdHIpCiAgICAgICAgICAgIGxvbmdfcmV0dXJuID0gaWZfcHRyLT50eXBlOwogICAgICAgIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3VHlwZTsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGTVRVOgogICAgICAgIGxvbmdfcmV0dXJuID0gKGxvbmcpIGlmUm93LmR3TXR1OwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZTUEVFRDoKICAgICAgICBpZiAoaWZfcHRyKQogICAgICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZl9wdHItPnNwZWVkOwogICAgICAgIGVsc2UKICAgICAgICBsb25nX3JldHVybiA9IChsb25nKSBpZlJvdy5kd1NwZWVkOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZQSFlTQUREUkVTUzoKICAgICAgICAqdmFyX2xlbiA9IGlmUm93LmR3UGh5c0FkZHJMZW47CiAgICAgICAgbWVtY3B5KHJldHVybl9idWYsIGlmUm93LmJQaHlzQWRkciwgKnZhcl9sZW4pOwogICAgICAgIHJldHVybiAodV9jaGFyICopIHJldHVybl9idWY7CiAgICBjYXNlIE5FVFNOTVBfSUZBRE1JTlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3QWRtaW5TdGF0dXM7CiAgICAgICAgYWRtaW5fc3RhdHVzID0gbG9uZ19yZXR1cm47CiNpZm5kZWYgTkVUU05NUF9OT19XUklURV9TVVBQT1JUCiAgICAgICAgKndyaXRlX21ldGhvZCA9IHdyaXRlSWZFbnRyeTsKI2VuZGlmIC8qICFORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQgKi8KICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1BFUlNUQVRVUzoKICAgICAgICBsb25nX3JldHVybiA9CiAgICAgICAgICAgKE1JQl9JRl9PUEVSX1NUQVRVU19PUEVSQVRJT05BTCA9PSBpZlJvdy5kd09wZXJTdGF0dXMpID8gMSA6IDI7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRkxBU1RDSEFOR0U6CiAgICAgICAgbG9uZ19yZXR1cm4gPSAwIC8qIFhYWCBub3QgYSBVTklYIGVwb2NoYWwgdGltZSBpZlJvdy5kd0xhc3RDaGFuZ2UgKi8gOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZJTk9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3SW5PY3RldHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklOVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdJblVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5OVUNBU1RQS1RTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdJbk5VY2FzdFBrdHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd0luRGlzY2FyZHM7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRklORVJST1JTOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdJbkVycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGSU5VTktOT1dOUFJPVE9TOgogICAgICAgIGxvbmdfcmV0dXJuID0gaWZSb3cuZHdJblVua25vd25Qcm90b3M7CiAgICAgICAgcmV0dXJuICh1X2NoYXIgKikgJiBsb25nX3JldHVybjsKICAgIGNhc2UgTkVUU05NUF9JRk9VVE9DVEVUUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3T3V0T2N0ZXRzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRVQ0FTVFBLVFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd091dFVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUTlVDQVNUUEtUUzoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3T3V0TlVjYXN0UGt0czsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VURElTQ0FSRFM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd091dERpc2NhcmRzOwogICAgICAgIHJldHVybiAodV9jaGFyICopICYgbG9uZ19yZXR1cm47CiAgICBjYXNlIE5FVFNOTVBfSUZPVVRFUlJPUlM6CiAgICAgICAgbG9uZ19yZXR1cm4gPSBpZlJvdy5kd091dEVycm9yczsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGT1VUUUxFTjoKICAgICAgICBsb25nX3JldHVybiA9IGlmUm93LmR3T3V0UUxlbjsKICAgICAgICByZXR1cm4gKHVfY2hhciAqKSAmIGxvbmdfcmV0dXJuOwogICAgY2FzZSBORVRTTk1QX0lGU1BFQ0lGSUM6CiAgICAgICAgKnZhcl9sZW4gPSBudWxsT2lkTGVuOwogICAgICAgIHJldHVybiAodV9jaGFyICopIG51bGxPaWQ7CiAgICBkZWZhdWx0OgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZCIsICJ1bmtub3duIHN1Yi1pZCAlZCBpbiB2YXJfaWZFbnRyeVxuIiwKICAgICAgICAgICAgICAgICAgICB2cC0+bWFnaWMpKTsKICAgIH0KICAgIHJldHVybiBOVUxMOwp9CgoKI2lmbmRlZiBORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQKaW50CndyaXRlSWZFbnRyeShpbnQgYWN0aW9uLAogICAgICAgICAgICAgdV9jaGFyICogdmFyX3ZhbCwKICAgICAgICAgICAgIHVfY2hhciB2YXJfdmFsX3R5cGUsCiAgICAgICAgICAgICBzaXplX3QgdmFyX3ZhbF9sZW4sCiAgICAgICAgICAgICB1X2NoYXIgKiBzdGF0UCwgb2lkICogbmFtZSwgc2l6ZV90IG5hbWVfbGVuKQp7CiAgICBNSUJfSUZST1cgICAgICAgaWZFbnRyeVJvdzsKICAgIGlmICgoY2hhcikgbmFtZVs5XSAhPSBORVRTTk1QX0lGQURNSU5TVEFUVVMpIHsKICAgICAgICByZXR1cm4gU05NUF9FUlJfTk9UV1JJVEFCTEU7CiAgICB9CgogICAgc3dpdGNoIChhY3Rpb24pIHsKICAgIGNhc2UgUkVTRVJWRTE6ICAgICAgICAgICAgIC8qIENoZWNrIHZhbHVlcyBmb3IgYWNjZXB0YWJpbGl0eSAqLwogICAgICAgIGlmICh2YXJfdmFsX3R5cGUgIT0gQVNOX0lOVEVHRVIpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgIm5vdCBpbnRlZ2VyXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFNOTVBfRVJSX1dST05HVFlQRTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhcl92YWxfbGVuID4gc2l6ZW9mKGludCkpIHsKICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgImJhZCBsZW5ndGhcbiIpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfV1JPTkdMRU5HVEg7CiAgICAgICAgfQoKICAgICAgICAvKgogICAgICAgICAqIFRoZSBkd0FkbWluU3RhdHVzIG1lbWJlciBjYW4gYmUgTUlCX0lGX0FETUlOX1NUQVRVU19VUCBvciBNSUJfSUZfQURNSU5fU1RBVFVTX0RPV04gCiAgICAgICAgICovCiAgICAgICAgaWYgKCEoKChpbnQpICgqdmFyX3ZhbCkgPT0gTUlCX0lGX0FETUlOX1NUQVRVU19VUCkgfHwKICAgICAgICAgICAgICAoKGludCkgKCp2YXJfdmFsKSA9PSBNSUJfSUZfQURNSU5fU1RBVFVTX0RPV04pKSkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAibm90IHN1cHBvcnRlZCBhZG1pbiBzdGF0ZVxuIik7CiAgICAgICAgICAgIHJldHVybiBTTk1QX0VSUl9XUk9OR1ZBTFVFOwogICAgICAgIH0KICAgICAgICBicmVhazsKCiAgICBjYXNlIFJFU0VSVkUyOiAgICAgICAgICAgICAvKiBBbGxvY2F0ZSBtZW1vcnkgYW5kIHNpbWlsYXIgcmVzb3VyY2VzICovCiAgICAgICAgYnJlYWs7CgogICAgY2FzZSBBQ1RJT046CiAgICAgICAgLyoKICAgICAgICAgKiBTYXZlIHRoZSBvbGQgdmFsdWUsIGluIGNhc2Ugb2YgVU5ETyAKICAgICAgICAgKi8KCiAgICAgICAgb2xkYWRtaW5fc3RhdHVzID0gYWRtaW5fc3RhdHVzOwogICAgICAgIGFkbWluX3N0YXR1cyA9IChpbnQpICp2YXJfdmFsOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgVU5ETzogICAgICAgICAgICAgICAgIC8qIFJldmVyc2UgdGhlIFNFVCBhY3Rpb24gYW5kIGZyZWUgcmVzb3VyY2VzICovCiAgICAgICAgYWRtaW5fc3RhdHVzID0gb2xkYWRtaW5fc3RhdHVzOwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgQ09NTUlUOiAgICAgICAgICAgICAgIC8qIENvbmZpcm0gdGhlIFNFVCwgcGVyZm9ybWluZyBhbnkgaXJyZXZlcnNpYmxlIGFjdGlvbnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogYW5kIGZyZWUgcmVzb3VyY2VzICovCiAgICAgICAgaWZFbnRyeVJvdy5kd0luZGV4ID0gKGludCkgbmFtZVsxMF07CiAgICAgICAgaWZFbnRyeVJvdy5kd0FkbWluU3RhdHVzID0gYWRtaW5fc3RhdHVzOwogICAgICAgIC8qCiAgICAgICAgICogT25seSBVUCBhbmQgRE9XTiBzdGF0dXMgYXJlIHN1cHBvcnRlZC4gVGhhdHMgd2h5IGRvbmUgaW4gQ09NTUlUIAogICAgICAgICAqLwogICAgICAgIGlmIChTZXRJZkVudHJ5KCZpZkVudHJ5Um93KSAhPSBOT19FUlJPUikgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLAogICAgICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gd3JpdGVJZkVudHJ5IGNhc2UgQ09NTUlUIHdpdGggaW5kZXg6ICVsdSAmIGFkbWluU3RhdHVzICVsdVxuIiwKICAgICAgICAgICAgICAgICAgICAgaWZFbnRyeVJvdy5kd0luZGV4LCBpZkVudHJ5Um93LmR3QWRtaW5TdGF0dXMpOwogICAgICAgICAgICByZXR1cm4gU05NUF9FUlJfQ09NTUlURkFJTEVEOwogICAgICAgIH0KCiAgICBjYXNlIEZSRUU6ICAgICAgICAgICAgICAgICAvKiBGcmVlIGFueSByZXNvdXJjZXMgYWxsb2NhdGVkICovCiAgICAgICAgLyoKICAgICAgICAgKiBObyByZXNvdXJjZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCAKICAgICAgICAgKi8KICAgICAgICBicmVhazsKICAgIH0KICAgIHJldHVybiBTTk1QX0VSUl9OT0VSUk9SOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZCBvZiB3cml0ZUlmRW50cnkgKi8KI2VuZGlmIC8qICFORVRTTk1QX05PX1dSSVRFX1NVUFBPUlQgKi8gCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogV0lOMzIgY3lnd2luICovCg==