LyoKICogUlBDIGJpbmRpbmcgQVBJCiAqCiAqIENvcHlyaWdodCAyMDAxIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX1JQQ19CSU5ESU5HX0gKI2RlZmluZSBfX1dJTkVfUlBDX0JJTkRJTkdfSAoKI2luY2x1ZGUgIndpbmUvcnBjc3Nfc2hhcmVkLmgiCiNpbmNsdWRlICJzZWN1cml0eS5oIgojaW5jbHVkZSAid2luZS9saXN0LmgiCgoKdHlwZWRlZiBzdHJ1Y3QgX1JwY0F1dGhJbmZvCnsKICBMT05HIHJlZnM7CgogIHVuc2lnbmVkIGxvbmcgQXV0aG5MZXZlbDsKICB1bnNpZ25lZCBsb25nIEF1dGhuU3ZjOwogIENyZWRIYW5kbGUgY3JlZDsKICBUaW1lU3RhbXAgZXhwOwp9IFJwY0F1dGhJbmZvOwoKc3RydWN0IHByb3RzZXFfb3BzOwoKdHlwZWRlZiBzdHJ1Y3QgX1JwY0Nvbm5lY3Rpb24KewogIHN0cnVjdCBfUnBjQ29ubmVjdGlvbiogTmV4dDsKICBzdHJ1Y3QgX1JwY0JpbmRpbmcqIFVzZWQ7CiAgQk9PTCBzZXJ2ZXI7CiAgTFBTVFIgTmV0d29ya0FkZHI7CiAgTFBTVFIgRW5kcG9pbnQ7CiAgY29uc3Qgc3RydWN0IHByb3RzZXFfb3BzICpvcHM7CiAgVVNIT1JUIE1heFRyYW5zbWlzc2lvblNpemU7CiAgLyogVGhlIGFjdGl2ZSBpbnRlcmZhY2UgYm91bmQgdG8gc2VydmVyLiAqLwogIFJQQ19TWU5UQVhfSURFTlRJRklFUiBBY3RpdmVJbnRlcmZhY2U7CiAgVVNIT1JUIE5leHRDYWxsSWQ7CgogIC8qIGF1dGhlbnRpY2F0aW9uICovCiAgQ3R4dEhhbmRsZSBjdHg7CiAgVGltZVN0YW1wIGV4cDsKICBVTE9ORyBhdHRyOwogIFJwY0F1dGhJbmZvICpBdXRoSW5mbzsKCiAgLyogY2xpZW50LW9ubHkgKi8KICBzdHJ1Y3QgbGlzdCBjb25uX3Bvb2xfZW50cnk7Cn0gUnBjQ29ubmVjdGlvbjsKCnN0cnVjdCBwcm90c2VxX29wcyB7CiAgY29uc3QgY2hhciAqbmFtZTsKICB1bnNpZ25lZCBjaGFyIGVwbV9wcm90b2NvbHNbMl07IC8qIG9ubHkgZmxvb3JzIDMgYW5kIDQuIHNlZSBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85NjI5Mzk5L2FwZHhsLmh0bSAqLwogIFJwY0Nvbm5lY3Rpb24gKigqYWxsb2MpKHZvaWQpOwogIFJQQ19TVEFUVVMgKCpvcGVuX2Nvbm5lY3Rpb24pKFJwY0Nvbm5lY3Rpb24gKmNvbm4pOwogIEhBTkRMRSAoKmdldF9jb25uZWN0X3dhaXRfaGFuZGxlKShScGNDb25uZWN0aW9uICpjb25uKTsKICBSUENfU1RBVFVTICgqaGFuZG9mZikoUnBjQ29ubmVjdGlvbiAqb2xkX2Nvbm4sIFJwY0Nvbm5lY3Rpb24gKm5ld19jb25uKTsKICBpbnQgKCpyZWFkKShScGNDb25uZWN0aW9uICpjb25uLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBsZW4pOwogIGludCAoKndyaXRlKShScGNDb25uZWN0aW9uICpjb25uLCBjb25zdCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBsZW4pOwogIGludCAoKmNsb3NlKShScGNDb25uZWN0aW9uICpjb25uKTsKICBzaXplX3QgKCpnZXRfdG9wX29mX3Rvd2VyKSh1bnNpZ25lZCBjaGFyICp0b3dlcl9kYXRhLCBjb25zdCBjaGFyICpuZXR3b3JrYWRkciwgY29uc3QgY2hhciAqZW5kcG9pbnQpOwogIFJQQ19TVEFUVVMgKCpwYXJzZV90b3Bfb2ZfdG93ZXIpKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRvd2VyX2RhdGEsIHNpemVfdCB0b3dlcl9zaXplLCBjaGFyICoqbmV0d29ya2FkZHIsIGNoYXIgKiplbmRwb2ludCk7Cn07CgovKiBkb24ndCBrbm93IHdoYXQgTVMncyBzdHJ1Y3R1cmUgbG9va3MgbGlrZSAqLwp0eXBlZGVmIHN0cnVjdCBfUnBjQmluZGluZwp7CiAgTE9ORyByZWZzOwogIHN0cnVjdCBfUnBjQmluZGluZyogTmV4dDsKICBCT09MIHNlcnZlcjsKICBVVUlEIE9iamVjdFV1aWQ7CiAgTFBTVFIgUHJvdHNlcTsKICBMUFNUUiBOZXR3b3JrQWRkcjsKICBMUFNUUiBFbmRwb2ludDsKICBSUENfQkxPQ0tJTkdfRk4gQmxvY2tpbmdGbjsKICBVTE9ORyBTZXJ2ZXJUaWQ7CiAgUnBjQ29ubmVjdGlvbiogRnJvbUNvbm47CgogIC8qIGF1dGhlbnRpY2F0aW9uICovCiAgUnBjQXV0aEluZm8gKkF1dGhJbmZvOwp9IFJwY0JpbmRpbmc7CgpMUFNUUiBSUENSVDRfc3RybmR1cEEoTFBDU1RSIHNyYywgSU5UIGxlbik7CkxQV1NUUiBSUENSVDRfc3RybmR1cFcoTFBXU1RSIHNyYywgSU5UIGxlbik7CkxQU1RSIFJQQ1JUNF9zdHJkdXBXdG9BKExQV1NUUiBzcmMpOwpMUFdTVFIgUlBDUlQ0X3N0cmR1cEF0b1coTFBTVFIgc3JjKTsKdm9pZCBSUENSVDRfc3RyZnJlZShMUFNUUiBzcmMpOwoKI2RlZmluZSBSUENSVDRfc3RyZHVwQSh4KSBSUENSVDRfc3RybmR1cEEoKHgpLC0xKQojZGVmaW5lIFJQQ1JUNF9zdHJkdXBXKHgpIFJQQ1JUNF9zdHJuZHVwVygoeCksLTEpCgpVTE9ORyBScGNBdXRoSW5mb19BZGRSZWYoUnBjQXV0aEluZm8gKkF1dGhJbmZvKTsKVUxPTkcgUnBjQXV0aEluZm9fUmVsZWFzZShScGNBdXRoSW5mbyAqQXV0aEluZm8pOwoKUnBjQ29ubmVjdGlvbiAqUlBDUlQ0X0dldElkbGVDb25uZWN0aW9uKGNvbnN0IFJQQ19TWU5UQVhfSURFTlRJRklFUiAqSW50ZXJmYWNlSWQsIGNvbnN0IFJQQ19TWU5UQVhfSURFTlRJRklFUiAqVHJhbnNmZXJTeW50YXgsIExQQ1NUUiBQcm90c2VxLCBMUENTVFIgTmV0d29ya0FkZHIsIExQQ1NUUiBFbmRwb2ludCwgUnBjQXV0aEluZm8qIEF1dGhJbmZvKTsKdm9pZCBSUENSVDRfUmVsZWFzZUlkbGVDb25uZWN0aW9uKFJwY0Nvbm5lY3Rpb24gKkNvbm5lY3Rpb24pOwpSUENfU1RBVFVTIFJQQ1JUNF9DcmVhdGVDb25uZWN0aW9uKFJwY0Nvbm5lY3Rpb24qKiBDb25uZWN0aW9uLCBCT09MIHNlcnZlciwgTFBDU1RSIFByb3RzZXEsIExQQ1NUUiBOZXR3b3JrQWRkciwgTFBDU1RSIEVuZHBvaW50LCBMUENTVFIgTmV0d29ya09wdGlvbnMsIFJwY0F1dGhJbmZvKiBBdXRoSW5mbywgUnBjQmluZGluZyogQmluZGluZyk7ClJQQ19TVEFUVVMgUlBDUlQ0X0Rlc3Ryb3lDb25uZWN0aW9uKFJwY0Nvbm5lY3Rpb24qIENvbm5lY3Rpb24pOwpSUENfU1RBVFVTIFJQQ1JUNF9PcGVuQ29ubmVjdGlvbihScGNDb25uZWN0aW9uKiBDb25uZWN0aW9uKTsKUlBDX1NUQVRVUyBSUENSVDRfQ2xvc2VDb25uZWN0aW9uKFJwY0Nvbm5lY3Rpb24qIENvbm5lY3Rpb24pOwpSUENfU1RBVFVTIFJQQ1JUNF9TcGF3bkNvbm5lY3Rpb24oUnBjQ29ubmVjdGlvbioqIENvbm5lY3Rpb24sIFJwY0Nvbm5lY3Rpb24qIE9sZENvbm5lY3Rpb24pOwoKUlBDX1NUQVRVUyBSUENSVDRfQ3JlYXRlQmluZGluZ0EoUnBjQmluZGluZyoqIEJpbmRpbmcsIEJPT0wgc2VydmVyLCBMUFNUUiBQcm90c2VxKTsKUlBDX1NUQVRVUyBSUENSVDRfQ3JlYXRlQmluZGluZ1coUnBjQmluZGluZyoqIEJpbmRpbmcsIEJPT0wgc2VydmVyLCBMUFdTVFIgUHJvdHNlcSk7ClJQQ19TVEFUVVMgUlBDUlQ0X0NvbXBsZXRlQmluZGluZ0EoUnBjQmluZGluZyogQmluZGluZywgTFBTVFIgTmV0d29ya0FkZHIsICBMUFNUUiBFbmRwb2ludCwgIExQU1RSIE5ldHdvcmtPcHRpb25zKTsKUlBDX1NUQVRVUyBSUENSVDRfQ29tcGxldGVCaW5kaW5nVyhScGNCaW5kaW5nKiBCaW5kaW5nLCBMUFdTVFIgTmV0d29ya0FkZHIsIExQV1NUUiBFbmRwb2ludCwgTFBXU1RSIE5ldHdvcmtPcHRpb25zKTsKUlBDX1NUQVRVUyBSUENSVDRfUmVzb2x2ZUJpbmRpbmcoUnBjQmluZGluZyogQmluZGluZywgTFBTVFIgRW5kcG9pbnQpOwpSUENfU1RBVFVTIFJQQ1JUNF9TZXRCaW5kaW5nT2JqZWN0KFJwY0JpbmRpbmcqIEJpbmRpbmcsIFVVSUQqIE9iamVjdFV1aWQpOwpSUENfU1RBVFVTIFJQQ1JUNF9NYWtlQmluZGluZyhScGNCaW5kaW5nKiogQmluZGluZywgUnBjQ29ubmVjdGlvbiogQ29ubmVjdGlvbik7ClJQQ19TVEFUVVMgUlBDUlQ0X0V4cG9ydEJpbmRpbmcoUnBjQmluZGluZyoqIEJpbmRpbmcsIFJwY0JpbmRpbmcqIE9sZEJpbmRpbmcpOwpSUENfU1RBVFVTIFJQQ1JUNF9EZXN0cm95QmluZGluZyhScGNCaW5kaW5nKiBCaW5kaW5nKTsKUlBDX1NUQVRVUyBSUENSVDRfT3BlbkJpbmRpbmcoUnBjQmluZGluZyogQmluZGluZywgUnBjQ29ubmVjdGlvbioqIENvbm5lY3Rpb24sIFBSUENfU1lOVEFYX0lERU5USUZJRVIgVHJhbnNmZXJTeW50YXgsIFBSUENfU1lOVEFYX0lERU5USUZJRVIgSW50ZXJmYWNlSWQpOwpSUENfU1RBVFVTIFJQQ1JUNF9DbG9zZUJpbmRpbmcoUnBjQmluZGluZyogQmluZGluZywgUnBjQ29ubmVjdGlvbiogQ29ubmVjdGlvbik7CkJPT0wgUlBDUlQ0X1JQQ1NTT25EZW1hbmRDYWxsKFBSUENTU19OUF9NRVNTQUdFIG1zZywgY2hhciAqdmFyZGF0YV9wYXlsb2FkLCBQUlBDU1NfTlBfUkVQTFkgcmVwbHkpOwpIQU5ETEUgUlBDUlQ0X0dldE1hc3Rlck11dGV4KHZvaWQpOwpIQU5ETEUgUlBDUlQ0X1JwY3NzTlBDb25uZWN0KHZvaWQpOwoKc3RhdGljIGlubGluZSBjb25zdCBjaGFyICpycGNydDRfY29ubl9nZXRfbmFtZShScGNDb25uZWN0aW9uICpDb25uZWN0aW9uKQp7CiAgcmV0dXJuIENvbm5lY3Rpb24tPm9wcy0+bmFtZTsKfQoKc3RhdGljIGlubGluZSBpbnQgcnBjcnQ0X2Nvbm5fcmVhZChScGNDb25uZWN0aW9uICpDb25uZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBsZW4pCnsKICByZXR1cm4gQ29ubmVjdGlvbi0+b3BzLT5yZWFkKENvbm5lY3Rpb24sIGJ1ZmZlciwgbGVuKTsKfQoKc3RhdGljIGlubGluZSBpbnQgcnBjcnQ0X2Nvbm5fd3JpdGUoUnBjQ29ubmVjdGlvbiAqQ29ubmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqYnVmZmVyLCB1bnNpZ25lZCBpbnQgbGVuKQp7CiAgcmV0dXJuIENvbm5lY3Rpb24tPm9wcy0+d3JpdGUoQ29ubmVjdGlvbiwgYnVmZmVyLCBsZW4pOwp9CgpzdGF0aWMgaW5saW5lIGludCBycGNydDRfY29ubl9jbG9zZShScGNDb25uZWN0aW9uICpDb25uZWN0aW9uKQp7CiAgcmV0dXJuIENvbm5lY3Rpb24tPm9wcy0+Y2xvc2UoQ29ubmVjdGlvbik7Cn0KCnN0YXRpYyBpbmxpbmUgSEFORExFIHJwY3J0NF9jb25uX2dldF93YWl0X29iamVjdChScGNDb25uZWN0aW9uICpDb25uZWN0aW9uKQp7CiAgcmV0dXJuIENvbm5lY3Rpb24tPm9wcy0+Z2V0X2Nvbm5lY3Rfd2FpdF9oYW5kbGUoQ29ubmVjdGlvbik7Cn0KCnN0YXRpYyBpbmxpbmUgUlBDX1NUQVRVUyBycGNydDRfY29ubl9oYW5kb2ZmKFJwY0Nvbm5lY3Rpb24gKm9sZF9jb25uLCBScGNDb25uZWN0aW9uICpuZXdfY29ubikKewogIHJldHVybiBvbGRfY29ubi0+b3BzLT5oYW5kb2ZmKG9sZF9jb25uLCBuZXdfY29ubik7Cn0KCi8qIGZsb29ycyAzIGFuZCB1cCAqLwpSUENfU1RBVFVTIFJwY1RyYW5zcG9ydF9HZXRUb3BPZlRvd2VyKHVuc2lnbmVkIGNoYXIgKnRvd2VyX2RhdGEsIHNpemVfdCAqdG93ZXJfc2l6ZSwgY29uc3QgY2hhciAqcHJvdHNlcSwgY29uc3QgY2hhciAqbmV0d29ya2FkZHIsIGNvbnN0IGNoYXIgKmVuZHBvaW50KTsKUlBDX1NUQVRVUyBScGNUcmFuc3BvcnRfUGFyc2VUb3BPZlRvd2VyKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnRvd2VyX2RhdGEsIHNpemVfdCB0b3dlcl9zaXplLCBjaGFyICoqcHJvdHNlcSwgY2hhciAqKm5ldHdvcmthZGRyLCBjaGFyICoqZW5kcG9pbnQpOwoKI2VuZGlmCg==