LyoKICogUlBDIGJpbmRpbmcgQVBJCiAqCiAqIENvcHlyaWdodCAyMDAxIE92ZSBL5XZlbiwgVHJhbnNHYW1pbmcgVGVjaG5vbG9naWVzCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICogdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgbGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogKiBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGlzIGxpYnJhcnk7IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTEgRnJhbmtsaW4gU3QsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEsIFVTQQogKi8KCiNpZm5kZWYgX19XSU5FX1JQQ19CSU5ESU5HX0gKI2RlZmluZSBfX1dJTkVfUlBDX0JJTkRJTkdfSAoKI2luY2x1ZGUgIndpbmUvcnBjc3Nfc2hhcmVkLmgiCiNpbmNsdWRlICJzZWN1cml0eS5oIgojaW5jbHVkZSAid2luZS9saXN0LmgiCgoKdHlwZWRlZiBzdHJ1Y3QgX1JwY0F1dGhJbmZvCnsKICBMT05HIHJlZnM7CgogIFVMT05HIEF1dGhuTGV2ZWw7CiAgVUxPTkcgQXV0aG5TdmM7CiAgQ3JlZEhhbmRsZSBjcmVkOwogIFRpbWVTdGFtcCBleHA7CiAgVUxPTkcgY2JNYXhUb2tlbjsKICAvKiB0aGUgYXV0aCBpZGVudGl0eSBwb2ludGVyIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHBhc3NlZCB1cyAoZnJlZWQgYnkgYXBwbGljYXRpb24pICovCiAgUlBDX0FVVEhfSURFTlRJVFlfSEFORExFICppZGVudGl0eTsKICAvKiBvdXIgY29weSBvZiBOVCBhdXRoIGlkZW50aXR5IHN0cnVjdHVyZSwgaWYgdGhlIGF1dGhlbnRpY2F0aW9uIHNlcnZpY2UKICAgKiB0YWtlcyBhbiBOVCBhdXRoIGlkZW50aXR5ICovCiAgU0VDX1dJTk5UX0FVVEhfSURFTlRJVFlfVyAqbnRfaWRlbnRpdHk7Cn0gUnBjQXV0aEluZm87Cgp0eXBlZGVmIHN0cnVjdCBfUnBjUXVhbGl0eU9mU2VydmljZQp7CiAgICBMT05HIHJlZnM7CgogICAgUlBDX1NFQ1VSSVRZX1FPU19WMl9XICpxb3M7Cn0gUnBjUXVhbGl0eU9mU2VydmljZTsKCnR5cGVkZWYgc3RydWN0IF9ScGNBc3NvYwp7CiAgICBzdHJ1Y3QgbGlzdCBlbnRyeTsgLyogZW50cnkgaW4gdGhlIGdsb2JhbCBsaXN0IG9mIGFzc29jaWF0aW9ucyAqLwogICAgTE9ORyByZWZzOwoKICAgIExQU1RSIFByb3RzZXE7CiAgICBMUFNUUiBOZXR3b3JrQWRkcjsKICAgIExQU1RSIEVuZHBvaW50OwogICAgTFBXU1RSIE5ldHdvcmtPcHRpb25zOwoKICAgIC8qIGlkIG9mIHRoaXMgYXNzb2NpYXRpb24gZ3JvdXAgKi8KICAgIFVMT05HIGFzc29jX2dyb3VwX2lkOwoKICAgIENSSVRJQ0FMX1NFQ1RJT04gY3M7CiAgICBzdHJ1Y3QgbGlzdCBjb25uZWN0aW9uX3Bvb2w7Cn0gUnBjQXNzb2M7CgpzdHJ1Y3QgY29ubmVjdGlvbl9vcHM7Cgp0eXBlZGVmIHN0cnVjdCBfUnBjQ29ubmVjdGlvbgp7CiAgc3RydWN0IF9ScGNDb25uZWN0aW9uKiBOZXh0OwogIEJPT0wgc2VydmVyOwogIExQU1RSIE5ldHdvcmtBZGRyOwogIExQU1RSIEVuZHBvaW50OwogIExQV1NUUiBOZXR3b3JrT3B0aW9uczsKICBjb25zdCBzdHJ1Y3QgY29ubmVjdGlvbl9vcHMgKm9wczsKICBVU0hPUlQgTWF4VHJhbnNtaXNzaW9uU2l6ZTsKICAvKiBUaGUgYWN0aXZlIGludGVyZmFjZSBib3VuZCB0byBzZXJ2ZXIuICovCiAgUlBDX1NZTlRBWF9JREVOVElGSUVSIEFjdGl2ZUludGVyZmFjZTsKICBVU0hPUlQgTmV4dENhbGxJZDsKCiAgLyogYXV0aGVudGljYXRpb24gKi8KICBDdHh0SGFuZGxlIGN0eDsKICBUaW1lU3RhbXAgZXhwOwogIFVMT05HIGF0dHI7CiAgUnBjQXV0aEluZm8gKkF1dGhJbmZvOwogIFVMT05HIGVuY3J5cHRpb25fYXV0aF9sZW47CiAgVUxPTkcgc2lnbmF0dXJlX2F1dGhfbGVuOwogIFJwY1F1YWxpdHlPZlNlcnZpY2UgKlFPUzsKCiAgLyogY2xpZW50LW9ubHkgKi8KICBzdHJ1Y3QgbGlzdCBjb25uX3Bvb2xfZW50cnk7CiAgVUxPTkcgYXNzb2NfZ3JvdXBfaWQ7IC8qIGFzc29jaWF0aW9uIGdyb3VwIHJldHVybmVkIGR1cmluZyBiaW5kaW5nICovCn0gUnBjQ29ubmVjdGlvbjsKCnN0cnVjdCBjb25uZWN0aW9uX29wcyB7CiAgY29uc3QgY2hhciAqbmFtZTsKICB1bnNpZ25lZCBjaGFyIGVwbV9wcm90b2NvbHNbMl07IC8qIG9ubHkgZmxvb3JzIDMgYW5kIDQuIHNlZSBodHRwOi8vd3d3Lm9wZW5ncm91cC5vcmcvb25saW5lcHVicy85NjI5Mzk5L2FwZHhsLmh0bSAqLwogIFJwY0Nvbm5lY3Rpb24gKigqYWxsb2MpKHZvaWQpOwogIFJQQ19TVEFUVVMgKCpvcGVuX2Nvbm5lY3Rpb25fY2xpZW50KShScGNDb25uZWN0aW9uICpjb25uKTsKICBSUENfU1RBVFVTICgqaGFuZG9mZikoUnBjQ29ubmVjdGlvbiAqb2xkX2Nvbm4sIFJwY0Nvbm5lY3Rpb24gKm5ld19jb25uKTsKICBpbnQgKCpyZWFkKShScGNDb25uZWN0aW9uICpjb25uLCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBsZW4pOwogIGludCAoKndyaXRlKShScGNDb25uZWN0aW9uICpjb25uLCBjb25zdCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBsZW4pOwogIGludCAoKmNsb3NlKShScGNDb25uZWN0aW9uICpjb25uKTsKICB2b2lkICgqY2FuY2VsX2NhbGwpKFJwY0Nvbm5lY3Rpb24gKmNvbm4pOwogIHNpemVfdCAoKmdldF90b3Bfb2ZfdG93ZXIpKHVuc2lnbmVkIGNoYXIgKnRvd2VyX2RhdGEsIGNvbnN0IGNoYXIgKm5ldHdvcmthZGRyLCBjb25zdCBjaGFyICplbmRwb2ludCk7CiAgUlBDX1NUQVRVUyAoKnBhcnNlX3RvcF9vZl90b3dlcikoY29uc3QgdW5zaWduZWQgY2hhciAqdG93ZXJfZGF0YSwgc2l6ZV90IHRvd2VyX3NpemUsIGNoYXIgKipuZXR3b3JrYWRkciwgY2hhciAqKmVuZHBvaW50KTsKfTsKCi8qIGRvbid0IGtub3cgd2hhdCBNUydzIHN0cnVjdHVyZSBsb29rcyBsaWtlICovCnR5cGVkZWYgc3RydWN0IF9ScGNCaW5kaW5nCnsKICBMT05HIHJlZnM7CiAgc3RydWN0IF9ScGNCaW5kaW5nKiBOZXh0OwogIEJPT0wgc2VydmVyOwogIFVVSUQgT2JqZWN0VXVpZDsKICBMUFNUUiBQcm90c2VxOwogIExQU1RSIE5ldHdvcmtBZGRyOwogIExQU1RSIEVuZHBvaW50OwogIExQV1NUUiBOZXR3b3JrT3B0aW9uczsKICBSUENfQkxPQ0tJTkdfRk4gQmxvY2tpbmdGbjsKICBVTE9ORyBTZXJ2ZXJUaWQ7CiAgUnBjQ29ubmVjdGlvbiogRnJvbUNvbm47CiAgUnBjQXNzb2MgKkFzc29jOwoKICAvKiBhdXRoZW50aWNhdGlvbiAqLwogIFJwY0F1dGhJbmZvICpBdXRoSW5mbzsKICBScGNRdWFsaXR5T2ZTZXJ2aWNlICpRT1M7Cn0gUnBjQmluZGluZzsKCkxQU1RSIFJQQ1JUNF9zdHJuZHVwQShMUENTVFIgc3JjLCBJTlQgbGVuKTsKTFBXU1RSIFJQQ1JUNF9zdHJuZHVwVyhMUENXU1RSIHNyYywgSU5UIGxlbik7CkxQU1RSIFJQQ1JUNF9zdHJkdXBXdG9BKExQQ1dTVFIgc3JjKTsKTFBXU1RSIFJQQ1JUNF9zdHJkdXBBdG9XKExQQ1NUUiBzcmMpOwp2b2lkIFJQQ1JUNF9zdHJmcmVlKExQU1RSIHNyYyk7CgojZGVmaW5lIFJQQ1JUNF9zdHJkdXBBKHgpIFJQQ1JUNF9zdHJuZHVwQSgoeCksLTEpCiNkZWZpbmUgUlBDUlQ0X3N0cmR1cFcoeCkgUlBDUlQ0X3N0cm5kdXBXKCh4KSwtMSkKClVMT05HIFJwY0F1dGhJbmZvX0FkZFJlZihScGNBdXRoSW5mbyAqQXV0aEluZm8pOwpVTE9ORyBScGNBdXRoSW5mb19SZWxlYXNlKFJwY0F1dGhJbmZvICpBdXRoSW5mbyk7CkJPT0wgUnBjQXV0aEluZm9fSXNFcXVhbChjb25zdCBScGNBdXRoSW5mbyAqQXV0aEluZm8xLCBjb25zdCBScGNBdXRoSW5mbyAqQXV0aEluZm8yKTsKVUxPTkcgUnBjUXVhbGl0eU9mU2VydmljZV9BZGRSZWYoUnBjUXVhbGl0eU9mU2VydmljZSAqcW9zKTsKVUxPTkcgUnBjUXVhbGl0eU9mU2VydmljZV9SZWxlYXNlKFJwY1F1YWxpdHlPZlNlcnZpY2UgKnFvcyk7CkJPT0wgUnBjUXVhbGl0eU9mU2VydmljZV9Jc0VxdWFsKGNvbnN0IFJwY1F1YWxpdHlPZlNlcnZpY2UgKnFvczEsIGNvbnN0IFJwY1F1YWxpdHlPZlNlcnZpY2UgKnFvczIpOwoKUlBDX1NUQVRVUyBSUENSVDRfR2V0QXNzb2NpYXRpb24oTFBDU1RSIFByb3RzZXEsIExQQ1NUUiBOZXR3b3JrQWRkciwgTFBDU1RSIEVuZHBvaW50LCBMUENXU1RSIE5ldHdvcmtPcHRpb25zLCBScGNBc3NvYyAqKmFzc29jKTsKUlBDX1NUQVRVUyBScGNBc3NvY19HZXRDbGllbnRDb25uZWN0aW9uKFJwY0Fzc29jICphc3NvYywgY29uc3QgUlBDX1NZTlRBWF9JREVOVElGSUVSICpJbnRlcmZhY2VJZCwgY29uc3QgUlBDX1NZTlRBWF9JREVOVElGSUVSICpUcmFuc2ZlclN5bnRheCwgUnBjQXV0aEluZm8gKkF1dGhJbmZvLCBScGNRdWFsaXR5T2ZTZXJ2aWNlICpRT1MsIFJwY0Nvbm5lY3Rpb24gKipDb25uZWN0aW9uKTsKdm9pZCBScGNBc3NvY19SZWxlYXNlSWRsZUNvbm5lY3Rpb24oUnBjQXNzb2MgKmFzc29jLCBScGNDb25uZWN0aW9uICpDb25uZWN0aW9uKTsKVUxPTkcgUnBjQXNzb2NfUmVsZWFzZShScGNBc3NvYyAqYXNzb2MpOwoKUlBDX1NUQVRVUyBSUENSVDRfQ3JlYXRlQ29ubmVjdGlvbihScGNDb25uZWN0aW9uKiogQ29ubmVjdGlvbiwgQk9PTCBzZXJ2ZXIsIExQQ1NUUiBQcm90c2VxLCBMUENTVFIgTmV0d29ya0FkZHIsIExQQ1NUUiBFbmRwb2ludCwgTFBDV1NUUiBOZXR3b3JrT3B0aW9ucywgUnBjQXV0aEluZm8qIEF1dGhJbmZvLCBScGNRdWFsaXR5T2ZTZXJ2aWNlICpRT1MpOwpSUENfU1RBVFVTIFJQQ1JUNF9EZXN0cm95Q29ubmVjdGlvbihScGNDb25uZWN0aW9uKiBDb25uZWN0aW9uKTsKUlBDX1NUQVRVUyBSUENSVDRfT3BlbkNsaWVudENvbm5lY3Rpb24oUnBjQ29ubmVjdGlvbiogQ29ubmVjdGlvbik7ClJQQ19TVEFUVVMgUlBDUlQ0X0Nsb3NlQ29ubmVjdGlvbihScGNDb25uZWN0aW9uKiBDb25uZWN0aW9uKTsKUlBDX1NUQVRVUyBSUENSVDRfU3Bhd25Db25uZWN0aW9uKFJwY0Nvbm5lY3Rpb24qKiBDb25uZWN0aW9uLCBScGNDb25uZWN0aW9uKiBPbGRDb25uZWN0aW9uKTsKClJQQ19TVEFUVVMgUlBDUlQ0X1Jlc29sdmVCaW5kaW5nKFJwY0JpbmRpbmcqIEJpbmRpbmcsIExQQ1NUUiBFbmRwb2ludCk7ClJQQ19TVEFUVVMgUlBDUlQ0X1NldEJpbmRpbmdPYmplY3QoUnBjQmluZGluZyogQmluZGluZywgY29uc3QgVVVJRCogT2JqZWN0VXVpZCk7ClJQQ19TVEFUVVMgUlBDUlQ0X01ha2VCaW5kaW5nKFJwY0JpbmRpbmcqKiBCaW5kaW5nLCBScGNDb25uZWN0aW9uKiBDb25uZWN0aW9uKTsKUlBDX1NUQVRVUyBSUENSVDRfRXhwb3J0QmluZGluZyhScGNCaW5kaW5nKiogQmluZGluZywgUnBjQmluZGluZyogT2xkQmluZGluZyk7ClJQQ19TVEFUVVMgUlBDUlQ0X0Rlc3Ryb3lCaW5kaW5nKFJwY0JpbmRpbmcqIEJpbmRpbmcpOwpSUENfU1RBVFVTIFJQQ1JUNF9PcGVuQmluZGluZyhScGNCaW5kaW5nKiBCaW5kaW5nLCBScGNDb25uZWN0aW9uKiogQ29ubmVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUlBDX1NZTlRBWF9JREVOVElGSUVSICpUcmFuc2ZlclN5bnRheCwgY29uc3QgUlBDX1NZTlRBWF9JREVOVElGSUVSICpJbnRlcmZhY2VJZCk7ClJQQ19TVEFUVVMgUlBDUlQ0X0Nsb3NlQmluZGluZyhScGNCaW5kaW5nKiBCaW5kaW5nLCBScGNDb25uZWN0aW9uKiBDb25uZWN0aW9uKTsKQk9PTCBSUENSVDRfUlBDU1NPbkRlbWFuZENhbGwoUFJQQ1NTX05QX01FU1NBR0UgbXNnLCBjaGFyICp2YXJkYXRhX3BheWxvYWQsIFBSUENTU19OUF9SRVBMWSByZXBseSk7CkhBTkRMRSBSUENSVDRfR2V0TWFzdGVyTXV0ZXgodm9pZCk7CkhBTkRMRSBSUENSVDRfUnBjc3NOUENvbm5lY3Qodm9pZCk7CgpzdGF0aWMgaW5saW5lIGNvbnN0IGNoYXIgKnJwY3J0NF9jb25uX2dldF9uYW1lKGNvbnN0IFJwY0Nvbm5lY3Rpb24gKkNvbm5lY3Rpb24pCnsKICByZXR1cm4gQ29ubmVjdGlvbi0+b3BzLT5uYW1lOwp9CgpzdGF0aWMgaW5saW5lIGludCBycGNydDRfY29ubl9yZWFkKFJwY0Nvbm5lY3Rpb24gKkNvbm5lY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwgdW5zaWduZWQgaW50IGxlbikKewogIHJldHVybiBDb25uZWN0aW9uLT5vcHMtPnJlYWQoQ29ubmVjdGlvbiwgYnVmZmVyLCBsZW4pOwp9CgpzdGF0aWMgaW5saW5lIGludCBycGNydDRfY29ubl93cml0ZShScGNDb25uZWN0aW9uICpDb25uZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpidWZmZXIsIHVuc2lnbmVkIGludCBsZW4pCnsKICByZXR1cm4gQ29ubmVjdGlvbi0+b3BzLT53cml0ZShDb25uZWN0aW9uLCBidWZmZXIsIGxlbik7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IHJwY3J0NF9jb25uX2Nsb3NlKFJwY0Nvbm5lY3Rpb24gKkNvbm5lY3Rpb24pCnsKICByZXR1cm4gQ29ubmVjdGlvbi0+b3BzLT5jbG9zZShDb25uZWN0aW9uKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIHJwY3J0NF9jb25uX2NhbmNlbF9jYWxsKFJwY0Nvbm5lY3Rpb24gKkNvbm5lY3Rpb24pCnsKICBDb25uZWN0aW9uLT5vcHMtPmNhbmNlbF9jYWxsKENvbm5lY3Rpb24pOwp9CgpzdGF0aWMgaW5saW5lIFJQQ19TVEFUVVMgcnBjcnQ0X2Nvbm5faGFuZG9mZihScGNDb25uZWN0aW9uICpvbGRfY29ubiwgUnBjQ29ubmVjdGlvbiAqbmV3X2Nvbm4pCnsKICByZXR1cm4gb2xkX2Nvbm4tPm9wcy0+aGFuZG9mZihvbGRfY29ubiwgbmV3X2Nvbm4pOwp9CgovKiBmbG9vcnMgMyBhbmQgdXAgKi8KUlBDX1NUQVRVUyBScGNUcmFuc3BvcnRfR2V0VG9wT2ZUb3dlcih1bnNpZ25lZCBjaGFyICp0b3dlcl9kYXRhLCBzaXplX3QgKnRvd2VyX3NpemUsIGNvbnN0IGNoYXIgKnByb3RzZXEsIGNvbnN0IGNoYXIgKm5ldHdvcmthZGRyLCBjb25zdCBjaGFyICplbmRwb2ludCk7ClJQQ19TVEFUVVMgUnBjVHJhbnNwb3J0X1BhcnNlVG9wT2ZUb3dlcihjb25zdCB1bnNpZ25lZCBjaGFyICp0b3dlcl9kYXRhLCBzaXplX3QgdG93ZXJfc2l6ZSwgY2hhciAqKnByb3RzZXEsIGNoYXIgKipuZXR3b3JrYWRkciwgY2hhciAqKmVuZHBvaW50KTsKCnZvaWQgUlBDUlQ0X1NldFRocmVhZEN1cnJlbnRDb25uZWN0aW9uKFJwY0Nvbm5lY3Rpb24gKkNvbm5lY3Rpb24pOwoKI2VuZGlmCg==