Ly8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qICAgICAgICAgQVRNRUwgTWljcm9jb250cm9sbGVyIFNvZnR3YXJlIFN1cHBvcnQgIC0gIFJPVVNTRVQgIC0KLy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIERJU0NMQUlNRVI6ICBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIEFUTUVMICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SCi8vKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GCi8vKiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT04tSU5GUklOR0VNRU5UIEFSRQovLyogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgQVRNRUwgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKLy8qIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLy8qIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLAovLyogT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgovLyogTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUIChJTkNMVURJTkcKLy8qIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwKLy8qIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi8vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBGaWxlIE5hbWUgICAgICAgICAgIDogbGliX0FUOTFTQU03WDEyOC5oCi8vKiBPYmplY3QgICAgICAgICAgICAgIDogQVQ5MVNBTTdYMTI4IGlubGluZWQgZnVuY3Rpb25zCi8vKiBHZW5lcmF0ZWQgICAgICAgICAgIDogQVQ5MSBTVyBBcHBsaWNhdGlvbiBHcm91cCAgMDUvMjAvMjAwNSAoMTY6MjI6MjMpCi8vKgovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGJndS5oLzEuMS9GcmkgSmFuIDMxIDEyOjE4OjQwIDIwMDMvLwovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfcG1jX1NBTTdYLmgvMS4xL1R1ZSBGZWIgIDEgMDg6MzI6MTAgMjAwNS8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9WUkVHXzYwODVCLmgvMS4xL1R1ZSBGZWIgIDEgMTY6MjA6NDcgMjAwNS8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9yc3RjXzYwOThBLmgvMS4xL1dlZCBPY3QgIDYgMTA6Mzk6MjAgMjAwNC8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9zc2MuaC8xLjQvRnJpIEphbiAzMSAxMjoxOToyMCAyMDAzLy8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3dkdGNfNjA4MEEuaC8xLjEvV2VkIE9jdCAgNiAxMDozODozMCAyMDA0Ly8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3VzYXJ0LmgvMS41L1RodSBOb3YgMjEgMTY6MDE6NTQgMjAwMi8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9zcGkyLmgvMS4xL01vbiBBdWcgMjUgMTQ6MjM6NTIgMjAwMy8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9waXRjXzYwNzlBLmgvMS4yL1R1ZSBOb3YgIDkgMTQ6NDM6NTYgMjAwNC8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9haWNfNjA3NWIuaC8xLjEvRnJpIE1heSAyMCAxNDowMToxOSAyMDA1Ly8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX2Flc182MTQ5YS5oLzEuMS9Nb24gSmFuIDE3IDA3OjQzOjA5IDIwMDUvLwovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfdHdpLmgvMS4zL01vbiBKdWwgMTkgMTQ6Mjc6NTggMjAwNC8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9hZGMuaC8xLjYvRnJpIE9jdCAxNyAwOToxMjozOCAyMDAzLy8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3J0dGNfNjA4MUEuaC8xLjEvV2VkIE9jdCAgNiAxMDozOTozOCAyMDA0Ly8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX3VkcC5oLzEuNC9XZWQgRmViIDE2IDA4OjM5OjM0IDIwMDUvLwovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfZGVzM182MTUwYS5oLzEuMS9Nb24gSmFuIDE3IDA5OjE5OjE5IDIwMDUvLwovLyogQ1ZTIFJlZmVyZW5jZSAgICAgICA6IC9saWJfdGNfMTc1M2IuaC8xLjEvRnJpIEphbiAzMSAxMjoyMDowMiAyMDAzLy8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX01DX1NBTTdYLmgvMS4xL1RodSBNYXIgMjUgMTU6MTk6MTQgMjAwNC8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9waW8uaC8xLjMvRnJpIEphbiAzMSAxMjoxODo1NiAyMDAzLy8KLy8qIENWUyBSZWZlcmVuY2UgICAgICAgOiAvbGliX2Nhbl9BVDkxLmgvMS40L0ZyaSBPY3QgMTcgMDk6MTI6NTAgMjAwMy8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9QV01fU0FNLmgvMS4zL1RodSBKYW4gMjIgMTA6MTA6NTAgMjAwNC8vCi8vKiBDVlMgUmVmZXJlbmNlICAgICAgIDogL2xpYl9wZGMuaC8xLjIvVHVlIEp1bCAgMiAxMzoyOTo0MCAyMDAyLy8KLy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiNpZm5kZWYgbGliX0FUOTFTQU03WDEyOF9ICiNkZWZpbmUgbGliX0FUOTFTQU03WDEyOF9ICgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBBSUMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KI2RlZmluZSBBVDkxQ19BSUNfQlJBTkNIX09QQ09ERSAoKHZvaWQgKCopICgpKSAweEU1MUZGRjIwKSAvLyBsZHIsIHBjLCBbcGMsICMtJkYyMF0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfQ29uZmlndXJlSXQKLy8qIFxicmllZiBJbnRlcnJ1cHQgSGFuZGxlciBJbml0aWFsaXphdGlvbgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BSUNfQ29uZmlndXJlSXQgKAoJQVQ5MVBTX0FJQyBwQWljLCAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzCgl1bnNpZ25lZCBpbnQgaXJxX2lkLCAgICAgLy8gXGFyZyBpbnRlcnJ1cHQgbnVtYmVyIHRvIGluaXRpYWxpemUKCXVuc2lnbmVkIGludCBwcmlvcml0eSwgICAvLyBcYXJnIHByaW9yaXR5IHRvIGdpdmUgdG8gdGhlIGludGVycnVwdAoJdW5zaWduZWQgaW50IHNyY190eXBlLCAgIC8vIFxhcmcgYWN0aXZhdGlvbiBhbmQgc2Vuc2Ugb2YgYWN0aXZhdGlvbgoJdm9pZCAoKm5ld0hhbmRsZXIpICh2b2lkKSApIC8vIFxhcmcgYWRkcmVzcyBvZiB0aGUgaW50ZXJydXB0IGhhbmRsZXIKewoJdW5zaWduZWQgaW50IG9sZEhhbmRsZXI7CiAgICB1bnNpZ25lZCBpbnQgbWFzayA7CgogICAgb2xkSGFuZGxlciA9IHBBaWMtPkFJQ19TVlJbaXJxX2lkXTsKCiAgICBtYXNrID0gMHgxIDw8IGlycV9pZCA7CiAgICAvLyogRGlzYWJsZSB0aGUgaW50ZXJydXB0IG9uIHRoZSBpbnRlcnJ1cHQgY29udHJvbGxlcgogICAgcEFpYy0+QUlDX0lEQ1IgPSBtYXNrIDsKICAgIC8vKiBTYXZlIHRoZSBpbnRlcnJ1cHQgaGFuZGxlciByb3V0aW5lIHBvaW50ZXIgYW5kIHRoZSBpbnRlcnJ1cHQgcHJpb3JpdHkKICAgIHBBaWMtPkFJQ19TVlJbaXJxX2lkXSA9ICh1bnNpZ25lZCBpbnQpIG5ld0hhbmRsZXIgOwogICAgLy8qIFN0b3JlIHRoZSBTb3VyY2UgTW9kZSBSZWdpc3RlcgogICAgcEFpYy0+QUlDX1NNUltpcnFfaWRdID0gc3JjX3R5cGUgfCBwcmlvcml0eSAgOwogICAgLy8qIENsZWFyIHRoZSBpbnRlcnJ1cHQgb24gdGhlIGludGVycnVwdCBjb250cm9sbGVyCiAgICBwQWljLT5BSUNfSUNDUiA9IG1hc2sgOwoKCXJldHVybiBvbGRIYW5kbGVyOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUlDX0VuYWJsZUl0Ci8vKiBcYnJpZWYgRW5hYmxlIGNvcnJlc3BvbmRpbmcgSVQgbnVtYmVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfRW5hYmxlSXQgKAoJQVQ5MVBTX0FJQyBwQWljLCAgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycwoJdW5zaWduZWQgaW50IGlycV9pZCApIC8vIFxhcmcgaW50ZXJydXB0IG51bWJlciB0byBpbml0aWFsaXplCnsKICAgIC8vKiBFbmFibGUgdGhlIGludGVycnVwdCBvbiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKICAgIHBBaWMtPkFJQ19JRUNSID0gMHgxIDw8IGlycV9pZCA7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfRGlzYWJsZUl0Ci8vKiBcYnJpZWYgRGlzYWJsZSBjb3JyZXNwb25kaW5nIElUIG51bWJlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0Rpc2FibGVJdCAoCglBVDkxUFNfQUlDIHBBaWMsICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzCgl1bnNpZ25lZCBpbnQgaXJxX2lkICkgLy8gXGFyZyBpbnRlcnJ1cHQgbnVtYmVyIHRvIGluaXRpYWxpemUKewogICAgdW5zaWduZWQgaW50IG1hc2sgPSAweDEgPDwgaXJxX2lkOwogICAgLy8qIERpc2FibGUgdGhlIGludGVycnVwdCBvbiB0aGUgaW50ZXJydXB0IGNvbnRyb2xsZXIKICAgIHBBaWMtPkFJQ19JRENSID0gbWFzayA7CiAgICAvLyogQ2xlYXIgdGhlIGludGVycnVwdCBvbiB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKCBpZiBvbmUgaXMgcGVuZGluZyApCiAgICBwQWljLT5BSUNfSUNDUiA9IG1hc2sgOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUlDX0NsZWFySXQKLy8qIFxicmllZiBDbGVhciBjb3JyZXNwb25kaW5nIElUIG51bWJlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0NsZWFySXQgKAoJQVQ5MVBTX0FJQyBwQWljLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzCgl1bnNpZ25lZCBpbnQgaXJxX2lkKSAvLyBcYXJnIGludGVycnVwdCBudW1iZXIgdG8gaW5pdGlhbGl6ZQp7CiAgICAvLyogQ2xlYXIgdGhlIGludGVycnVwdCBvbiB0aGUgSW50ZXJydXB0IENvbnRyb2xsZXIgKCBpZiBvbmUgaXMgcGVuZGluZyApCiAgICBwQWljLT5BSUNfSUNDUiA9ICgweDEgPDwgaXJxX2lkKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FJQ19BY2tub3dsZWRnZUl0Ci8vKiBcYnJpZWYgQWNrbm93bGVkZ2UgY29ycmVzcG9uZGluZyBJVCBudW1iZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FJQ19BY2tub3dsZWRnZUl0ICgKCUFUOTFQU19BSUMgcEFpYykgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycwp7CiAgICBwQWljLT5BSUNfRU9JQ1IgPSBwQWljLT5BSUNfRU9JQ1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yCi8vKiBcYnJpZWYgQ29uZmlndXJlIHZlY3RvciBoYW5kbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50ICBBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yICgKCXVuc2lnbmVkIGludCAqcFZlY3RvciwgLy8gXGFyZyBwb2ludGVyIHRvIHRoZSBBSUMgcmVnaXN0ZXJzCgl2b2lkICgqSGFuZGxlcikgKCkgKSAgIC8vIFxhcmcgSW50ZXJydXB0IEhhbmRsZXIKewoJdW5zaWduZWQgaW50IG9sZFZlY3RvciA9ICpwVmVjdG9yOwoKCWlmICgodW5zaWduZWQgaW50KSBIYW5kbGVyID09ICh1bnNpZ25lZCBpbnQpIEFUOTFDX0FJQ19CUkFOQ0hfT1BDT0RFKQoJCSpwVmVjdG9yID0gKHVuc2lnbmVkIGludCkgQVQ5MUNfQUlDX0JSQU5DSF9PUENPREU7CgllbHNlCgkJKnBWZWN0b3IgPSAoKCgoKHVuc2lnbmVkIGludCkgSGFuZGxlcikgLSAoKHVuc2lnbmVkIGludCkgcFZlY3RvcikgLSAweDgpID4+IDIpICYgMHgwMEZGRkZGRikgfCAweEVBMDAwMDAwOwoKCXJldHVybiBvbGRWZWN0b3I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfVHJpZwovLyogXGJyaWVmIFRyaWcgYW4gSVQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkICBBVDkxRl9BSUNfVHJpZyAoCglBVDkxUFNfQUlDIHBBaWMsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMKCXVuc2lnbmVkIGludCBpcnFfaWQpIC8vIFxhcmcgaW50ZXJydXB0IG51bWJlcgp7CglwQWljLT5BSUNfSVNDUiA9ICgweDEgPDwgaXJxX2lkKSA7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfSXNBY3RpdmUKLy8qIFxicmllZiBUZXN0IGlmIGFuIElUIGlzIGFjdGl2ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCAgQVQ5MUZfQUlDX0lzQWN0aXZlICgKCUFUOTFQU19BSUMgcEFpYywgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycwoJdW5zaWduZWQgaW50IGlycV9pZCkgLy8gXGFyZyBJbnRlcnJ1cHQgTnVtYmVyCnsKCXJldHVybiAocEFpYy0+QUlDX0lTUiAmICgweDEgPDwgaXJxX2lkKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfSXNQZW5kaW5nCi8vKiBcYnJpZWYgVGVzdCBpZiBhbiBJVCBpcyBwZW5kaW5nCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50ICBBVDkxRl9BSUNfSXNQZW5kaW5nICgKCUFUOTFQU19BSUMgcEFpYywgICAgIC8vIFxhcmcgcG9pbnRlciB0byB0aGUgQUlDIHJlZ2lzdGVycwoJdW5zaWduZWQgaW50IGlycV9pZCkgLy8gXGFyZyBJbnRlcnJ1cHQgTnVtYmVyCnsKCXJldHVybiAocEFpYy0+QUlDX0lQUiAmICgweDEgPDwgaXJxX2lkKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfT3BlbgovLyogXGJyaWVmIFNldCBleGNlcHRpb24gdmVjdG9ycyBhbmQgQUlDIHJlZ2lzdGVycyB0byBkZWZhdWx0IHZhbHVlcwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX09wZW4oCglBVDkxUFNfQUlDIHBBaWMsICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gdGhlIEFJQyByZWdpc3RlcnMKCXZvaWQgKCpJcnFIYW5kbGVyKSAoKSwgIC8vIFxhcmcgRGVmYXVsdCBJUlEgdmVjdG9yIGV4Y2VwdGlvbgoJdm9pZCAoKkZpcUhhbmRsZXIpICgpLCAgLy8gXGFyZyBEZWZhdWx0IEZJUSB2ZWN0b3IgZXhjZXB0aW9uCgl2b2lkICgqRGVmYXVsdEhhbmRsZXIpICAoKSwgLy8gXGFyZyBEZWZhdWx0IEhhbmRsZXIgc2V0IGluIElTUgoJdm9pZCAoKlNwdXJpb3VzSGFuZGxlcikgKCksIC8vIFxhcmcgRGVmYXVsdCBTcHVyaW91cyBIYW5kbGVyCgl1bnNpZ25lZCBpbnQgcHJvdGVjdE1vZGUpICAgLy8gXGFyZyBEZWJ1ZyBDb250cm9sIFJlZ2lzdGVyCnsKCWludCBpOwoKCS8vIERpc2FibGUgYWxsIGludGVycnVwdHMgYW5kIHNldCBJVlIgdG8gdGhlIGRlZmF1bHQgaGFuZGxlcgoJZm9yIChpID0gMDsgaSA8IDMyOyArK2kpIHsKCQlBVDkxRl9BSUNfRGlzYWJsZUl0KHBBaWMsIGkpOwoJCUFUOTFGX0FJQ19Db25maWd1cmVJdChwQWljLCBpLCBBVDkxQ19BSUNfUFJJT1JfTE9XRVNULCBBVDkxQ19BSUNfU1JDVFlQRV9ISUdIX0xFVkVMLCBEZWZhdWx0SGFuZGxlcik7Cgl9CgoJLy8gU2V0IHRoZSBJUlEgZXhjZXB0aW9uIHZlY3RvcgoJQVQ5MUZfQUlDX1NldEV4Y2VwdGlvblZlY3RvcigodW5zaWduZWQgaW50ICopIDB4MTgsIElycUhhbmRsZXIpOwoJLy8gU2V0IHRoZSBGYXN0IEludGVycnVwdCBleGNlcHRpb24gdmVjdG9yCglBVDkxRl9BSUNfU2V0RXhjZXB0aW9uVmVjdG9yKCh1bnNpZ25lZCBpbnQgKikgMHgxQywgRmlxSGFuZGxlcik7CgoJcEFpYy0+QUlDX1NQVSA9ICh1bnNpZ25lZCBpbnQpIFNwdXJpb3VzSGFuZGxlcjsKCXBBaWMtPkFJQ19EQ1IgPSBwcm90ZWN0TW9kZTsKfQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQREMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BEQ19TZXROZXh0UngKLy8qIFxicmllZiBTZXQgdGhlIG5leHQgcmVjZWl2ZSB0cmFuc2ZlciBkZXNjcmlwdG9yCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfU2V0TmV4dFJ4ICgKCUFUOTFQU19QREMgcFBEQywgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCgljaGFyICphZGRyZXNzLCAgICAgICAvLyBcYXJnIGFkZHJlc3MgdG8gdGhlIG5leHQgYmxvYyB0byBiZSByZWNlaXZlZAoJdW5zaWduZWQgaW50IGJ5dGVzKSAgLy8gXGFyZyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVjZWl2ZWQKewoJcFBEQy0+UERDX1JOUFIgPSAodW5zaWduZWQgaW50KSBhZGRyZXNzOwoJcFBEQy0+UERDX1JOQ1IgPSBieXRlczsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BEQ19TZXROZXh0VHgKLy8qIFxicmllZiBTZXQgdGhlIG5leHQgdHJhbnNtaXQgdHJhbnNmZXIgZGVzY3JpcHRvcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX1NldE5leHRUeCAoCglBVDkxUFNfUERDIHBQREMsICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCgljaGFyICphZGRyZXNzLCAgICAgICAgIC8vIFxhcmcgYWRkcmVzcyB0byB0aGUgbmV4dCBibG9jIHRvIGJlIHRyYW5zbWl0dGVkCgl1bnNpZ25lZCBpbnQgYnl0ZXMpICAgIC8vIFxhcmcgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHRyYW5zbWl0dGVkCnsKCXBQREMtPlBEQ19UTlBSID0gKHVuc2lnbmVkIGludCkgYWRkcmVzczsKCXBQREMtPlBEQ19UTkNSID0gYnl0ZXM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfU2V0UngKLy8qIFxicmllZiBTZXQgdGhlIHJlY2VpdmUgdHJhbnNmZXIgZGVzY3JpcHRvcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX1NldFJ4ICgKCUFUOTFQU19QREMgcFBEQywgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIKCWNoYXIgKmFkZHJlc3MsICAgICAgICAgLy8gXGFyZyBhZGRyZXNzIHRvIHRoZSBuZXh0IGJsb2MgdG8gYmUgcmVjZWl2ZWQKCXVuc2lnbmVkIGludCBieXRlcykgICAgLy8gXGFyZyBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVjZWl2ZWQKewoJcFBEQy0+UERDX1JQUiA9ICh1bnNpZ25lZCBpbnQpIGFkZHJlc3M7CglwUERDLT5QRENfUkNSID0gYnl0ZXM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfU2V0VHgKLy8qIFxicmllZiBTZXQgdGhlIHRyYW5zbWl0IHRyYW5zZmVyIGRlc2NyaXB0b3IKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19TZXRUeCAoCglBVDkxUFNfUERDIHBQREMsICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCgljaGFyICphZGRyZXNzLCAgICAgICAgIC8vIFxhcmcgYWRkcmVzcyB0byB0aGUgbmV4dCBibG9jIHRvIGJlIHRyYW5zbWl0dGVkCgl1bnNpZ25lZCBpbnQgYnl0ZXMpICAgIC8vIFxhcmcgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHRyYW5zbWl0dGVkCnsKCXBQREMtPlBEQ19UUFIgPSAodW5zaWduZWQgaW50KSBhZGRyZXNzOwoJcFBEQy0+UERDX1RDUiA9IGJ5dGVzOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUERDX0VuYWJsZVR4Ci8vKiBcYnJpZWYgRW5hYmxlIHRyYW5zbWl0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfRW5hYmxlVHggKAoJQVQ5MVBTX1BEQyBwUERDICkgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIKewoJcFBEQy0+UERDX1BUQ1IgPSBBVDkxQ19QRENfVFhURU47Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfRW5hYmxlUngKLy8qIFxicmllZiBFbmFibGUgcmVjZWl2ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX0VuYWJsZVJ4ICgKCUFUOTFQU19QREMgcFBEQyApICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCnsKCXBQREMtPlBEQ19QVENSID0gQVQ5MUNfUERDX1JYVEVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUERDX0Rpc2FibGVUeAovLyogXGJyaWVmIERpc2FibGUgdHJhbnNtaXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19EaXNhYmxlVHggKAoJQVQ5MVBTX1BEQyBwUERDICkgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIKewoJcFBEQy0+UERDX1BUQ1IgPSBBVDkxQ19QRENfVFhURElTOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUERDX0Rpc2FibGVSeAovLyogXGJyaWVmIERpc2FibGUgcmVjZWl2ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUERDX0Rpc2FibGVSeCAoCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcgp7CglwUERDLT5QRENfUFRDUiA9IEFUOTFDX1BEQ19SWFRESVM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfSXNUeEVtcHR5Ci8vKiBcYnJpZWYgVGVzdCBpZiB0aGUgY3VycmVudCB0cmFuc2ZlciBkZXNjcmlwdG9yIGhhcyBiZWVuIHNlbnQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUERDX0lzVHhFbXB0eSAoIC8vIFxyZXR1cm4gcmV0dXJuIDEgaWYgdHJhbnNmZXIgaXMgY29tcGxldGUKCUFUOTFQU19QREMgcFBEQyApICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCnsKCXJldHVybiAhKHBQREMtPlBEQ19UQ1IpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUERDX0lzTmV4dFR4RW1wdHkKLy8qIFxicmllZiBUZXN0IGlmIHRoZSBuZXh0IHRyYW5zZmVyIGRlc2NyaXB0b3IgaGFzIGJlZW4gbW92ZWQgdG8gdGhlIGN1cnJlbnQgdGQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUERDX0lzTmV4dFR4RW1wdHkgKCAvLyBccmV0dXJuIHJldHVybiAxIGlmIHRyYW5zZmVyIGlzIGNvbXBsZXRlCglBVDkxUFNfUERDIHBQREMgKSAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQREMgY29udHJvbGxlcgp7CglyZXR1cm4gIShwUERDLT5QRENfVE5DUik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfSXNSeEVtcHR5Ci8vKiBcYnJpZWYgVGVzdCBpZiB0aGUgY3VycmVudCB0cmFuc2ZlciBkZXNjcmlwdG9yIGhhcyBiZWVuIGZpbGxlZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9QRENfSXNSeEVtcHR5ICggLy8gXHJldHVybiByZXR1cm4gMSBpZiB0cmFuc2ZlciBpcyBjb21wbGV0ZQoJQVQ5MVBTX1BEQyBwUERDICkgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUERDIGNvbnRyb2xsZXIKewoJcmV0dXJuICEocFBEQy0+UERDX1JDUik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfSXNOZXh0UnhFbXB0eQovLyogXGJyaWVmIFRlc3QgaWYgdGhlIG5leHQgdHJhbnNmZXIgZGVzY3JpcHRvciBoYXMgYmVlbiBtb3ZlZCB0byB0aGUgY3VycmVudCB0ZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9QRENfSXNOZXh0UnhFbXB0eSAoIC8vIFxyZXR1cm4gcmV0dXJuIDEgaWYgdHJhbnNmZXIgaXMgY29tcGxldGUKCUFUOTFQU19QREMgcFBEQyApICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCnsKCXJldHVybiAhKHBQREMtPlBEQ19STkNSKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BEQ19PcGVuCi8vKiBcYnJpZWYgT3BlbiBQREM6IGRpc2FibGUgVFggYW5kIFJYIHJlc2V0IHRyYW5zZmVyIGRlc2NyaXB0b3JzLCByZS1lbmFibGUgUlggYW5kIFRYCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QRENfT3BlbiAoCglBVDkxUFNfUERDIHBQREMpICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCnsKICAgIC8vKiBEaXNhYmxlIHRoZSBSWCBhbmQgVFggUERDIHRyYW5zZmVyIHJlcXVlc3RzCglBVDkxRl9QRENfRGlzYWJsZVJ4KHBQREMpOwoJQVQ5MUZfUERDX0Rpc2FibGVUeChwUERDKTsKCgkvLyogUmVzZXQgYWxsIENvdW50ZXIgcmVnaXN0ZXIgTmV4dCBidWZmZXIgZmlyc3QKCUFUOTFGX1BEQ19TZXROZXh0VHgocFBEQywgKGNoYXIgKikgMCwgMCk7CglBVDkxRl9QRENfU2V0TmV4dFJ4KHBQREMsIChjaGFyICopIDAsIDApOwoJQVQ5MUZfUERDX1NldFR4KHBQREMsIChjaGFyICopIDAsIDApOwoJQVQ5MUZfUERDX1NldFJ4KHBQREMsIChjaGFyICopIDAsIDApOwoKICAgIC8vKiBFbmFibGUgdGhlIFJYIGFuZCBUWCBQREMgdHJhbnNmZXIgcmVxdWVzdHMKCUFUOTFGX1BEQ19FbmFibGVSeChwUERDKTsKCUFUOTFGX1BEQ19FbmFibGVUeChwUERDKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BEQ19DbG9zZQovLyogXGJyaWVmIENsb3NlIFBEQzogZGlzYWJsZSBUWCBhbmQgUlggcmVzZXQgdHJhbnNmZXIgZGVzY3JpcHRvcnMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BEQ19DbG9zZSAoCglBVDkxUFNfUERDIHBQREMpICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBEQyBjb250cm9sbGVyCnsKICAgIC8vKiBEaXNhYmxlIHRoZSBSWCBhbmQgVFggUERDIHRyYW5zZmVyIHJlcXVlc3RzCglBVDkxRl9QRENfRGlzYWJsZVJ4KHBQREMpOwoJQVQ5MUZfUERDX0Rpc2FibGVUeChwUERDKTsKCgkvLyogUmVzZXQgYWxsIENvdW50ZXIgcmVnaXN0ZXIgTmV4dCBidWZmZXIgZmlyc3QKCUFUOTFGX1BEQ19TZXROZXh0VHgocFBEQywgKGNoYXIgKikgMCwgMCk7CglBVDkxRl9QRENfU2V0TmV4dFJ4KHBQREMsIChjaGFyICopIDAsIDApOwoJQVQ5MUZfUERDX1NldFR4KHBQREMsIChjaGFyICopIDAsIDApOwoJQVQ5MUZfUERDX1NldFJ4KHBQREMsIChjaGFyICopIDAsIDApOwoKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BEQ19TZW5kRnJhbWUKLy8qIFxicmllZiBDbG9zZSBQREM6IGRpc2FibGUgVFggYW5kIFJYIHJlc2V0IHRyYW5zZmVyIGRlc2NyaXB0b3JzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BEQ19TZW5kRnJhbWUoCglBVDkxUFNfUERDIHBQREMsCgljaGFyICpwQnVmZmVyLAoJdW5zaWduZWQgaW50IHN6QnVmZmVyLAoJY2hhciAqcE5leHRCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkKewoJaWYgKEFUOTFGX1BEQ19Jc1R4RW1wdHkocFBEQykpIHsKCQkvLyogQnVmZmVyIGFuZCBuZXh0IGJ1ZmZlciBjYW4gYmUgaW5pdGlhbGl6ZWQKCQlBVDkxRl9QRENfU2V0VHgocFBEQywgcEJ1ZmZlciwgc3pCdWZmZXIpOwoJCUFUOTFGX1BEQ19TZXROZXh0VHgocFBEQywgcE5leHRCdWZmZXIsIHN6TmV4dEJ1ZmZlcik7CgkJcmV0dXJuIDI7Cgl9CgllbHNlIGlmIChBVDkxRl9QRENfSXNOZXh0VHhFbXB0eShwUERDKSkgewoJCS8vKiBPbmx5IG9uZSBidWZmZXIgY2FuIGJlIGluaXRpYWxpemVkCgkJQVQ5MUZfUERDX1NldE5leHRUeChwUERDLCBwQnVmZmVyLCBzekJ1ZmZlcik7CgkJcmV0dXJuIDE7Cgl9CgllbHNlIHsKCQkvLyogQWxsIGJ1ZmZlciBhcmUgaW4gdXNlLi4uCgkJcmV0dXJuIDA7Cgl9Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lCi8vKiBcYnJpZWYgQ2xvc2UgUERDOiBkaXNhYmxlIFRYIGFuZCBSWCByZXNldCB0cmFuc2ZlciBkZXNjcmlwdG9ycwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lICgKCUFUOTFQU19QREMgcFBEQywKCWNoYXIgKnBCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pCdWZmZXIsCgljaGFyICpwTmV4dEJ1ZmZlciwKCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQp7CglpZiAoQVQ5MUZfUERDX0lzUnhFbXB0eShwUERDKSkgewoJCS8vKiBCdWZmZXIgYW5kIG5leHQgYnVmZmVyIGNhbiBiZSBpbml0aWFsaXplZAoJCUFUOTFGX1BEQ19TZXRSeChwUERDLCBwQnVmZmVyLCBzekJ1ZmZlcik7CgkJQVQ5MUZfUERDX1NldE5leHRSeChwUERDLCBwTmV4dEJ1ZmZlciwgc3pOZXh0QnVmZmVyKTsKCQlyZXR1cm4gMjsKCX0KCWVsc2UgaWYgKEFUOTFGX1BEQ19Jc05leHRSeEVtcHR5KHBQREMpKSB7CgkJLy8qIE9ubHkgb25lIGJ1ZmZlciBjYW4gYmUgaW5pdGlhbGl6ZWQKCQlBVDkxRl9QRENfU2V0TmV4dFJ4KHBQREMsIHBCdWZmZXIsIHN6QnVmZmVyKTsKCQlyZXR1cm4gMTsKCX0KCWVsc2UgewoJCS8vKiBBbGwgYnVmZmVyIGFyZSBpbiB1c2UuLi4KCQlyZXR1cm4gMDsKCX0KfQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBEQkdVCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9EQkdVX0ludGVycnVwdEVuYWJsZQovLyogXGJyaWVmIEVuYWJsZSBEQkdVIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9JbnRlcnJ1cHRFbmFibGUoCiAgICAgICAgQVQ5MVBTX0RCR1UgcERiZ3UsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIERCR1UgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBkYmd1IGludGVycnVwdCB0byBiZSBlbmFibGVkCnsKICAgICAgICBwRGJndS0+REJHVV9JRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfREJHVV9JbnRlcnJ1cHREaXNhYmxlCi8vKiBcYnJpZWYgRGlzYWJsZSBEQkdVIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfREJHVV9JbnRlcnJ1cHREaXNhYmxlKAogICAgICAgIEFUOTFQU19EQkdVIHBEYmd1LCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBEQkdVIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZGJndSBpbnRlcnJ1cHQgdG8gYmUgZGlzYWJsZWQKewogICAgICAgIHBEYmd1LT5EQkdVX0lEUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9EQkdVX0dldEludGVycnVwdE1hc2tTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gREJHVSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfREJHVV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIERCR1UgSW50ZXJydXB0IE1hc2sgU3RhdHVzCiAgICAgICAgQVQ5MVBTX0RCR1UgcERiZ3UpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBEQkdVIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwRGJndS0+REJHVV9JTVI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9EQkdVX0lzSW50ZXJydXB0TWFza2VkCi8vKiBcYnJpZWYgVGVzdCBpZiBEQkdVIEludGVycnVwdCBpcyBNYXNrZWQgCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgaW50IEFUOTFGX0RCR1VfSXNJbnRlcnJ1cHRNYXNrZWQoCiAgICAgICAgQVQ5MVBTX0RCR1UgcERiZ3UsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIERCR1UgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9EQkdVX0dldEludGVycnVwdE1hc2tTdGF0dXMocERiZ3UpICYgZmxhZyk7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFBJTwogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0NmZ1BlcmlwaAovLyogXGJyaWVmIEVuYWJsZSBwaW5zIHRvIGJlIGRyaXZlZCBieSBwZXJpcGhlcmFsCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgoJdW5zaWduZWQgaW50IHBlcmlwaEFFbmFibGUsICAvLyBcYXJnIFBFUklQSCBBIHRvIGVuYWJsZQoJdW5zaWduZWQgaW50IHBlcmlwaEJFbmFibGUpICAvLyBcYXJnIFBFUklQSCBCIHRvIGVuYWJsZQoKewoJcFBpby0+UElPX0FTUiA9IHBlcmlwaEFFbmFibGU7CglwUGlvLT5QSU9fQlNSID0gcGVyaXBoQkVuYWJsZTsKCXBQaW8tPlBJT19QRFIgPSAocGVyaXBoQUVuYWJsZSB8IHBlcmlwaEJFbmFibGUpOyAvLyBTZXQgaW4gUGVyaXBoIG1vZGUKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19DZmdPdXRwdXQKLy8qIFxicmllZiBFbmFibGUgUElPIGluIG91dHB1dCBtb2RlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2ZnT3V0cHV0KAoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgoJdW5zaWduZWQgaW50IHBpb0VuYWJsZSkgICAgICAvLyBcYXJnIFBJTyB0byBiZSBlbmFibGVkCnsKCXBQaW8tPlBJT19QRVIgPSBwaW9FbmFibGU7IC8vIFNldCBpbiBQSU8gbW9kZQoJcFBpby0+UElPX09FUiA9IHBpb0VuYWJsZTsgLy8gQ29uZmlndXJlIGluIE91dHB1dAp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0NmZ0lucHV0Ci8vKiBcYnJpZWYgRW5hYmxlIFBJTyBpbiBpbnB1dCBtb2RlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2ZnSW5wdXQoCglBVDkxUFNfUElPIHBQaW8sICAgICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgaW5wdXRFbmFibGUpICAgICAgLy8gXGFyZyBQSU8gdG8gYmUgZW5hYmxlZAp7CgkvLyBEaXNhYmxlIG91dHB1dAoJcFBpby0+UElPX09EUiAgPSBpbnB1dEVuYWJsZTsKCXBQaW8tPlBJT19QRVIgID0gaW5wdXRFbmFibGU7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2ZnT3BlbmRyYWluCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBpbiBvcGVuIGRyYWluCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2ZnT3BlbmRyYWluKAoJQVQ5MVBTX1BJTyBwUGlvLCAgICAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgoJdW5zaWduZWQgaW50IG11bHRpRHJ2RW5hYmxlKSAvLyBcYXJnIHBpbyB0byBiZSBjb25maWd1cmVkIGluIG9wZW4gZHJhaW4KewoJLy8gQ29uZmlndXJlIHRoZSBtdWx0aS1kcml2ZSBvcHRpb24KCXBQaW8tPlBJT19NRERSID0gfm11bHRpRHJ2RW5hYmxlOwoJcFBpby0+UElPX01ERVIgPSBtdWx0aURydkVuYWJsZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19DZmdQdWxsdXAKLy8qIFxicmllZiBFbmFibGUgcHVsbHVwIG9uIFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0NmZ1B1bGx1cCgKCUFUOTFQU19QSU8gcFBpbywgICAgICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBwdWxsdXBFbmFibGUpICAgLy8gXGFyZyBlbmFibGUgcHVsbHVwIG9uIFBJTwp7CgkJLy8gQ29ubmVjdCBvciBub3QgUHVsbHVwCglwUGlvLT5QSU9fUFBVRFIgPSB+cHVsbHVwRW5hYmxlOwoJcFBpby0+UElPX1BQVUVSID0gcHVsbHVwRW5hYmxlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0NmZ0RpcmVjdERyaXZlCi8vKiBcYnJpZWYgRW5hYmxlIGRpcmVjdCBkcml2ZSBvbiBQSU8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdEaXJlY3REcml2ZSgKCUFUOTFQU19QSU8gcFBpbywgICAgICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBkaXJlY3REcml2ZSkgICAgLy8gXGFyZyBQSU8gdG8gYmUgY29uZmlndXJlZCB3aXRoIGRpcmVjdCBkcml2ZQoKewoJLy8gQ29uZmlndXJlIHRoZSBEaXJlY3QgRHJpdmUKCXBQaW8tPlBJT19PV0RSICA9IH5kaXJlY3REcml2ZTsKCXBQaW8tPlBJT19PV0VSICA9IGRpcmVjdERyaXZlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0NmZ0lucHV0RmlsdGVyCi8vKiBcYnJpZWYgRW5hYmxlIGlucHV0IGZpbHRlciBvbiBpbnB1dCBQSU8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19DZmdJbnB1dEZpbHRlcigKCUFUOTFQU19QSU8gcFBpbywgICAgICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBpbnB1dEZpbHRlcikgICAgLy8gXGFyZyBQSU8gdG8gYmUgY29uZmlndXJlZCB3aXRoIGlucHV0IGZpbHRlcgoKewoJLy8gQ29uZmlndXJlIHRoZSBEaXJlY3QgRHJpdmUKCXBQaW8tPlBJT19JRkRSICA9IH5pbnB1dEZpbHRlcjsKCXBQaW8tPlBJT19JRkVSICA9IGlucHV0RmlsdGVyOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldElucHV0Ci8vKiBcYnJpZWYgUmV0dXJuIFBJTyBpbnB1dCB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0SW5wdXQoIC8vIFxyZXR1cm4gUElPIGlucHV0CglBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgp7CglyZXR1cm4gcFBpby0+UElPX1BEU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSXNJbnB1dFNldAovLyogXGJyaWVmIFRlc3QgaWYgUElPIGlzIGlucHV0IGZsYWcgaXMgYWN0aXZlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0lucHV0U2V0KAoJQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKCXJldHVybiAoQVQ5MUZfUElPX0dldElucHV0KHBQaW8pICYgZmxhZyk7Cn0KCgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX1NldE91dHB1dAovLyogXGJyaWVmIFNldCB0byAxIG91dHB1dCBQSU8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19TZXRPdXRwdXQoCglBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgb3V0cHV0IHRvIGJlIHNldAp7CglwUGlvLT5QSU9fU09EUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQ2xlYXJPdXRwdXQKLy8qIFxicmllZiBTZXQgdG8gMCBvdXRwdXQgUElPCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fQ2xlYXJPdXRwdXQoCglBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgb3V0cHV0IHRvIGJlIGNsZWFyZWQKewoJcFBpby0+UElPX0NPRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0ZvcmNlT3V0cHV0Ci8vKiBcYnJpZWYgRm9yY2Ugb3V0cHV0IHdoZW4gRGlyZWN0IGRyaXZlIG9wdGlvbiBpcyBlbmFibGVkCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fRm9yY2VPdXRwdXQoCglBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgb3V0cHV0IHRvIGJlIGZvcmNlZAp7CglwUGlvLT5QSU9fT0RTUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fRW5hYmxlCi8vKiBcYnJpZWYgRW5hYmxlIFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0VuYWJsZSgKICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyB0byBiZSBlbmFibGVkIAp7CiAgICAgICAgcFBpby0+UElPX1BFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fRGlzYWJsZQovLyogXGJyaWVmIERpc2FibGUgUElPCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fRGlzYWJsZSgKICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyB0byBiZSBkaXNhYmxlZCAKewogICAgICAgIHBQaW8tPlBJT19QRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldFN0YXR1cwovLyogXGJyaWVmIFJldHVybiBQSU8gU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRTdGF0dXMoIC8vIFxyZXR1cm4gUElPIFN0YXR1cwogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFBpby0+UElPX1BTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc1NldAovLyogXGJyaWVmIFRlc3QgaWYgUElPIGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNTZXQoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0U3RhdHVzKHBQaW8pICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fT3V0cHV0RW5hYmxlCi8vKiBcYnJpZWYgT3V0cHV0IEVuYWJsZSBQSU8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19PdXRwdXRFbmFibGUoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gb3V0cHV0IHRvIGJlIGVuYWJsZWQKewogICAgICAgIHBQaW8tPlBJT19PRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX091dHB1dERpc2FibGUKLy8qIFxicmllZiBPdXRwdXQgRW5hYmxlIFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX091dHB1dERpc2FibGUoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gb3V0cHV0IHRvIGJlIGRpc2FibGVkCnsKICAgICAgICBwUGlvLT5QSU9fT0RSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXRTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gUElPIE91dHB1dCBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldE91dHB1dFN0YXR1cyggLy8gXHJldHVybiBQSU8gT3V0cHV0IFN0YXR1cwogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFBpby0+UElPX09TUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc091cHV0U2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gT3V0cHV0IGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNPdXRwdXRTZXQoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0T3V0cHV0U3RhdHVzKHBQaW8pICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSW5wdXRGaWx0ZXJFbmFibGUKLy8qIFxicmllZiBJbnB1dCBGaWx0ZXIgRW5hYmxlIFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0lucHV0RmlsdGVyRW5hYmxlKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIGlucHV0IGZpbHRlciB0byBiZSBlbmFibGVkCnsKICAgICAgICBwUGlvLT5QSU9fSUZFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSW5wdXRGaWx0ZXJEaXNhYmxlCi8vKiBcYnJpZWYgSW5wdXQgRmlsdGVyIERpc2FibGUgUElPCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fSW5wdXRGaWx0ZXJEaXNhYmxlKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIGlucHV0IGZpbHRlciB0byBiZSBkaXNhYmxlZAp7CiAgICAgICAgcFBpby0+UElPX0lGRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldElucHV0RmlsdGVyU3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBJbnB1dCBGaWx0ZXIgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRJbnB1dEZpbHRlclN0YXR1cyggLy8gXHJldHVybiBQSU8gSW5wdXQgRmlsdGVyIFN0YXR1cwogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFBpby0+UElPX0lGU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fSXNJbnB1dEZpbHRlclNldAovLyogXGJyaWVmIFRlc3QgaWYgUElPIElucHV0IGZpbHRlciBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzSW5wdXRGaWx0ZXJTZXQoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0SW5wdXRGaWx0ZXJTdGF0dXMocFBpbykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXREYXRhU3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFBJTyBPdXRwdXQgRGF0YSBTdGF0dXMgCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRPdXRwdXREYXRhU3RhdHVzKCAvLyBccmV0dXJuIFBJTyBPdXRwdXQgRGF0YSBTdGF0dXMgCglBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgp7CiAgICAgICAgcmV0dXJuIHBQaW8tPlBJT19PRFNSOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0ludGVycnVwdEVuYWJsZQovLyogXGJyaWVmIEVuYWJsZSBQSU8gSW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fSW50ZXJydXB0RW5hYmxlKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIGludGVycnVwdCB0byBiZSBlbmFibGVkCnsKICAgICAgICBwUGlvLT5QSU9fSUVSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19JbnRlcnJ1cHREaXNhYmxlCi8vKiBcYnJpZWYgRGlzYWJsZSBQSU8gSW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fSW50ZXJydXB0RGlzYWJsZSgKICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBpbnRlcnJ1cHQgdG8gYmUgZGlzYWJsZWQKewogICAgICAgIHBQaW8tPlBJT19JRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldEludGVycnVwdE1hc2tTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gUElPIEludGVycnVwdCBNYXNrIFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBQSU8gSW50ZXJydXB0IE1hc2sgU3RhdHVzCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwUGlvLT5QSU9fSU1SOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0dldEludGVycnVwdFN0YXR1cwovLyogXGJyaWVmIFJldHVybiBQSU8gSW50ZXJydXB0IFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0SW50ZXJydXB0U3RhdHVzKCAvLyBccmV0dXJuIFBJTyBJbnRlcnJ1cHQgU3RhdHVzCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwUGlvLT5QSU9fSVNSOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0lzSW50ZXJydXB0TWFza2VkCi8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gSW50ZXJydXB0IGlzIE1hc2tlZCAKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzSW50ZXJydXB0TWFza2VkKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldEludGVycnVwdE1hc2tTdGF0dXMocFBpbykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0ludGVycnVwdFNldAovLyogXGJyaWVmIFRlc3QgaWYgUElPIEludGVycnVwdCBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzSW50ZXJydXB0U2V0KAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldEludGVycnVwdFN0YXR1cyhwUGlvKSAmIGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX011bHRpRHJpdmVyRW5hYmxlCi8vKiBcYnJpZWYgTXVsdGkgRHJpdmVyIEVuYWJsZSBQSU8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19NdWx0aURyaXZlckVuYWJsZSgKICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyB0byBiZSBlbmFibGVkCnsKICAgICAgICBwUGlvLT5QSU9fTURFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fTXVsdGlEcml2ZXJEaXNhYmxlCi8vKiBcYnJpZWYgTXVsdGkgRHJpdmVyIERpc2FibGUgUElPCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9fTXVsdGlEcml2ZXJEaXNhYmxlKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIHRvIGJlIGRpc2FibGVkCnsKICAgICAgICBwUGlvLT5QSU9fTUREUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fR2V0TXVsdGlEcml2ZXJTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gUElPIE11bHRpIERyaXZlciBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldE11bHRpRHJpdmVyU3RhdHVzKCAvLyBccmV0dXJuIFBJTyBNdWx0aSBEcml2ZXIgU3RhdHVzCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwUGlvLT5QSU9fTURTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc011bHRpRHJpdmVyU2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gTXVsdGlEcml2ZXIgaXMgU2V0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc011bHRpRHJpdmVyU2V0KAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldE11bHRpRHJpdmVyU3RhdHVzKHBQaW8pICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSU9fQV9SZWdpc3RlclNlbGVjdGlvbgovLyogXGJyaWVmIFBJTyBBIFJlZ2lzdGVyIFNlbGVjdGlvbiAKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19BX1JlZ2lzdGVyU2VsZWN0aW9uKAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgcGlvIEEgcmVnaXN0ZXIgc2VsZWN0aW9uCnsKICAgICAgICBwUGlvLT5QSU9fQVNSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19CX1JlZ2lzdGVyU2VsZWN0aW9uCi8vKiBcYnJpZWYgUElPIEIgUmVnaXN0ZXIgU2VsZWN0aW9uIAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX0JfUmVnaXN0ZXJTZWxlY3Rpb24oCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBwaW8gQiByZWdpc3RlciBzZWxlY3Rpb24gCnsKICAgICAgICBwUGlvLT5QSU9fQlNSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRfQUJfUmVnaXN0ZXJTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gUElPIEludGVycnVwdCBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElPX0dldF9BQl9SZWdpc3RlclN0YXR1cyggLy8gXHJldHVybiBQSU8gQUIgUmVnaXN0ZXIgU3RhdHVzCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwUGlvLT5QSU9fQUJTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19Jc0FCX1JlZ2lzdGVyU2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gQUIgUmVnaXN0ZXIgaXMgU2V0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc0FCX1JlZ2lzdGVyU2V0KAogICAgICAgIEFUOTFQU19QSU8gcFBpbywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUElPIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAoQVQ5MUZfUElPX0dldF9BQl9SZWdpc3RlclN0YXR1cyhwUGlvKSAmIGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX091dHB1dFdyaXRlRW5hYmxlCi8vKiBcYnJpZWYgT3V0cHV0IFdyaXRlIEVuYWJsZSBQSU8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJT19PdXRwdXRXcml0ZUVuYWJsZSgKICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBvdXRwdXQgd3JpdGUgdG8gYmUgZW5hYmxlZAp7CiAgICAgICAgcFBpby0+UElPX09XRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX091dHB1dFdyaXRlRGlzYWJsZQovLyogXGJyaWVmIE91dHB1dCBXcml0ZSBEaXNhYmxlIFBJTwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPX091dHB1dFdyaXRlRGlzYWJsZSgKICAgICAgICBBVDkxUFNfUElPIHBQaW8sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIHBpbyBvdXRwdXQgd3JpdGUgdG8gYmUgZGlzYWJsZWQKewogICAgICAgIHBQaW8tPlBJT19PV0RSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRPdXRwdXRXcml0ZVN0YXR1cwovLyogXGJyaWVmIFJldHVybiBQSU8gT3V0cHV0IFdyaXRlIFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSU9fR2V0T3V0cHV0V3JpdGVTdGF0dXMoIC8vIFxyZXR1cm4gUElPIE91dHB1dCBXcml0ZSBTdGF0dXMKICAgICAgICBBVDkxUFNfUElPIHBQaW8pIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgp7CiAgICAgICAgcmV0dXJuIHBQaW8tPlBJT19PV1NSOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0lzT3V0cHV0V3JpdGVTZXQKLy8qIFxicmllZiBUZXN0IGlmIFBJTyBPdXRwdXRXcml0ZSBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfUElPX0lzT3V0cHV0V3JpdGVTZXQoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0T3V0cHV0V3JpdGVTdGF0dXMocFBpbykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT19HZXRDZmdQdWxsdXAKLy8qIFxicmllZiBSZXR1cm4gUElPIENvbmZpZ3VyYXRpb24gUHVsbHVwCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BJT19HZXRDZmdQdWxsdXAoIC8vIFxyZXR1cm4gUElPIENvbmZpZ3VyYXRpb24gUHVsbHVwIAogICAgICAgIEFUOTFQU19QSU8gcFBpbykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBJTyBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFBpby0+UElPX1BQVVNSOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0lzT3V0cHV0RGF0YVN0YXR1c1NldAovLyogXGJyaWVmIFRlc3QgaWYgUElPIE91dHB1dCBEYXRhIFN0YXR1cyBpcyBTZXQgCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgaW50IEFUOTFGX1BJT19Jc091dHB1dERhdGFTdGF0dXNTZXQoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9QSU9fR2V0T3V0cHV0RGF0YVN0YXR1cyhwUGlvKSAmIGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPX0lzQ2ZnUHVsbHVwU3RhdHVzU2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBQSU8gQ29uZmlndXJhdGlvbiBQdWxsdXAgU3RhdHVzIGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9QSU9fSXNDZmdQdWxsdXBTdGF0dXNTZXQoCiAgICAgICAgQVQ5MVBTX1BJTyBwUGlvLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQSU8gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuICh+QVQ5MUZfUElPX0dldENmZ1B1bGx1cChwUGlvKSAmIGZsYWcpOwp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQTUMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19DZmdTeXNDbGtFbmFibGVSZWcKLy8qIFxicmllZiBDb25maWd1cmUgdGhlIFN5c3RlbSBDbG9jayBFbmFibGUgUmVnaXN0ZXIgb2YgdGhlIFBNQyBjb250cm9sbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnU3lzQ2xrRW5hYmxlUmVnICgKCUFUOTFQU19QTUMgcFBNQywgLy8gXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgbW9kZSkKewoJLy8qIFdyaXRlIHRvIHRoZSBTQ0VSIHJlZ2lzdGVyCglwUE1DLT5QTUNfU0NFUiA9IG1vZGU7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfQ2ZnU3lzQ2xrRGlzYWJsZVJlZwovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgU3lzdGVtIENsb2NrIERpc2FibGUgUmVnaXN0ZXIgb2YgdGhlIFBNQyBjb250cm9sbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnU3lzQ2xrRGlzYWJsZVJlZyAoCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IG1vZGUpCnsKCS8vKiBXcml0ZSB0byB0aGUgU0NEUiByZWdpc3RlcgoJcFBNQy0+UE1DX1NDRFIgPSBtb2RlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldFN5c0Nsa1N0YXR1c1JlZwovLyogXGJyaWVmIFJldHVybiB0aGUgU3lzdGVtIENsb2NrIFN0YXR1cyBSZWdpc3RlciBvZiB0aGUgUE1DIGNvbnRyb2xsZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0dldFN5c0Nsa1N0YXR1c1JlZyAoCglBVDkxUFNfUE1DIHBQTUMgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwUE1DLT5QTUNfU0NTUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jawovLyogXGJyaWVmIEVuYWJsZSBwZXJpcGhlcmFsIGNsb2NrCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2sgKAoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBcYXJnIHBvaW50ZXIgdG8gUE1DIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBwZXJpcGhJZHMpICAvLyBcYXJnIElEcyBvZiBwZXJpcGhlcmFscyB0byBlbmFibGUKewoJcFBNQy0+UE1DX1BDRVIgPSBwZXJpcGhJZHM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfRGlzYWJsZVBlcmlwaENsb2NrCi8vKiBcYnJpZWYgRGlzYWJsZSBwZXJpcGhlcmFsIGNsb2NrCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRGlzYWJsZVBlcmlwaENsb2NrICgKCUFUOTFQU19QTUMgcFBNQywgLy8gXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgcGVyaXBoSWRzKSAgLy8gXGFyZyBJRHMgb2YgcGVyaXBoZXJhbHMgdG8gZW5hYmxlCnsKCXBQTUMtPlBNQ19QQ0RSID0gcGVyaXBoSWRzOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldFBlcmlwaENsb2NrCi8vKiBcYnJpZWYgR2V0IHBlcmlwaGVyYWwgY2xvY2sgc3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRQZXJpcGhDbG9jayAoCglBVDkxUFNfUE1DIHBQTUMpIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcgp7CglyZXR1cm4gcFBNQy0+UE1DX1BDU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DS0dSX0NmZ01haW5Pc2NpbGxhdG9yUmVnCi8vKiBcYnJpZWYgQ2ZnIHRoZSBtYWluIG9zY2lsbGF0b3IKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0NLR1JfQ2ZnTWFpbk9zY2lsbGF0b3JSZWcgKAoJQVQ5MVBTX0NLR1IgcENLR1IsIC8vIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBtb2RlKQp7CglwQ0tHUi0+Q0tHUl9NT1IgPSBtb2RlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0tHUl9HZXRNYWluT3NjaWxsYXRvclJlZwovLyogXGJyaWVmIENmZyB0aGUgbWFpbiBvc2NpbGxhdG9yCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NLR1JfR2V0TWFpbk9zY2lsbGF0b3JSZWcgKAoJQVQ5MVBTX0NLR1IgcENLR1IpIC8vIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIKewoJcmV0dXJuIHBDS0dSLT5DS0dSX01PUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NLR1JfRW5hYmxlTWFpbk9zY2lsbGF0b3IKLy8qIFxicmllZiBFbmFibGUgdGhlIG1haW4gb3NjaWxsYXRvcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0tHUl9FbmFibGVNYWluT3NjaWxsYXRvcigKCUFUOTFQU19DS0dSIHBDS0dSKSAvLyBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyCnsKCXBDS0dSLT5DS0dSX01PUiB8PSBBVDkxQ19DS0dSX01PU0NFTjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NLR1JfRGlzYWJsZU1haW5Pc2NpbGxhdG9yCi8vKiBcYnJpZWYgRGlzYWJsZSB0aGUgbWFpbiBvc2NpbGxhdG9yCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DS0dSX0Rpc2FibGVNYWluT3NjaWxsYXRvciAoCglBVDkxUFNfQ0tHUiBwQ0tHUikgLy8gXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlcgp7CglwQ0tHUi0+Q0tHUl9NT1IgJj0gfkFUOTFDX0NLR1JfTU9TQ0VOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0tHUl9DZmdNYWluT3NjU3RhcnRVcFRpbWUKLy8qIFxicmllZiBDZmcgTU9SIFJlZ2lzdGVyIGFjY29yZGluZyB0byB0aGUgbWFpbiBvc2Mgc3RhcnR1cCB0aW1lCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DS0dSX0NmZ01haW5Pc2NTdGFydFVwVGltZSAoCglBVDkxUFNfQ0tHUiBwQ0tHUiwgLy8gXGFyZyBwb2ludGVyIHRvIENLR1IgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IHN0YXJ0dXBfdGltZSwgIC8vIFxhcmcgbWFpbiBvc2Mgc3RhcnR1cCB0aW1lIGluIG1pY3Jvc2Vjb25kICh1cykKCXVuc2lnbmVkIGludCBzbG93Q2xvY2spICAvLyBcYXJnIHNsb3dDbG9jayBpbiBIegp7CglwQ0tHUi0+Q0tHUl9NT1IgJj0gfkFUOTFDX0NLR1JfT1NDT1VOVDsKCXBDS0dSLT5DS0dSX01PUiB8PSAoKHNsb3dDbG9jayAqIHN0YXJ0dXBfdGltZSkvKDgqMTAwMDAwMCkpIDw8IDg7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DS0dSX0dldE1haW5DbG9ja0ZyZXFSZWcKLy8qIFxicmllZiBDZmcgdGhlIG1haW4gb3NjaWxsYXRvcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DS0dSX0dldE1haW5DbG9ja0ZyZXFSZWcgKAoJQVQ5MVBTX0NLR1IgcENLR1IpIC8vIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIKewoJcmV0dXJuIHBDS0dSLT5DS0dSX01DRlI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DS0dSX0dldE1haW5DbG9jawovLyogXGJyaWVmIFJldHVybiBNYWluIGNsb2NrIGluIEh6Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NLR1JfR2V0TWFpbkNsb2NrICgKCUFUOTFQU19DS0dSIHBDS0dSLCAvLyBcYXJnIHBvaW50ZXIgdG8gQ0tHUiBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgc2xvd0Nsb2NrKSAgLy8gXGFyZyBzbG93Q2xvY2sgaW4gSHoKewoJcmV0dXJuICgocENLR1ItPkNLR1JfTUNGUiAgJiBBVDkxQ19DS0dSX01BSU5GKSAqIHNsb3dDbG9jaykgPj4gNDsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19DZmdNQ0tSZWcKLy8qIFxicmllZiBDZmcgTWFzdGVyIENsb2NrIFJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfQ2ZnTUNLUmVnICgKCUFUOTFQU19QTUMgcFBNQywgLy8gXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgbW9kZSkKewoJcFBNQy0+UE1DX01DS1IgPSBtb2RlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldE1DS1JlZwovLyogXGJyaWVmIFJldHVybiBNYXN0ZXIgQ2xvY2sgUmVnaXN0ZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUE1DX0dldE1DS1JlZygKCUFUOTFQU19QTUMgcFBNQykgLy8gXGFyZyBwb2ludGVyIHRvIFBNQyBjb250cm9sbGVyCnsKCXJldHVybiBwUE1DLT5QTUNfTUNLUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0dldE1hc3RlckNsb2NrCi8vKiBcYnJpZWYgUmV0dXJuIG1hc3RlciBjbG9jayBpbiBIeiB3aGljaCBjb3JyZXBvbmRzIHRvIHByb2Nlc3NvciBjbG9jayBmb3IgQVJNNwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRNYXN0ZXJDbG9jayAoCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcgoJQVQ5MVBTX0NLR1IgcENLR1IsIC8vIFxhcmcgcG9pbnRlciB0byBDS0dSIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBzbG93Q2xvY2spICAvLyBcYXJnIHNsb3dDbG9jayBpbiBIegp7Cgl1bnNpZ25lZCBpbnQgcmVnID0gcFBNQy0+UE1DX01DS1I7Cgl1bnNpZ25lZCBpbnQgcHJlc2NhbGVyID0gKDEgPDwgKChyZWcgJiBBVDkxQ19QTUNfUFJFUykgPj4gMikpOwoJdW5zaWduZWQgaW50IHBsbERpdmlkZXIsIHBsbE11bHRpcGxpZXI7CgoJc3dpdGNoIChyZWcgJiBBVDkxQ19QTUNfQ1NTKSB7CgkJY2FzZSBBVDkxQ19QTUNfQ1NTX1NMT1dfQ0xLOiAvLyBTbG93IGNsb2NrIHNlbGVjdGVkCgkJCXJldHVybiBzbG93Q2xvY2sgLyBwcmVzY2FsZXI7CgkJY2FzZSBBVDkxQ19QTUNfQ1NTX01BSU5fQ0xLOiAvLyBNYWluIGNsb2NrIGlzIHNlbGVjdGVkCgkJCXJldHVybiBBVDkxRl9DS0dSX0dldE1haW5DbG9jayhwQ0tHUiwgc2xvd0Nsb2NrKSAvIHByZXNjYWxlcjsKCQljYXNlIEFUOTFDX1BNQ19DU1NfUExMX0NMSzogLy8gUExMQiBjbG9jayBpcyBzZWxlY3RlZAoJCQlyZWcgPSBwQ0tHUi0+Q0tHUl9QTExSOwoJCQlwbGxEaXZpZGVyICAgID0gKHJlZyAgJiBBVDkxQ19DS0dSX0RJVik7CgkJCXBsbE11bHRpcGxpZXIgPSAoKHJlZyAgJiBBVDkxQ19DS0dSX01VTCkgPj4gMTYpICsgMTsKCQkJcmV0dXJuIEFUOTFGX0NLR1JfR2V0TWFpbkNsb2NrKHBDS0dSLCBzbG93Q2xvY2spIC8gcGxsRGl2aWRlciAqIHBsbE11bHRpcGxpZXIgLyBwcmVzY2FsZXI7Cgl9CglyZXR1cm4gMDsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19FbmFibGVQQ0sKLy8qIFxicmllZiBFbmFibGUgcGVyaXBoZXJhbCBjbG9jawovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0VuYWJsZVBDSyAoCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IHBjaywgIC8vIFxhcmcgUGVyaXBoZXJhbCBjbG9jayBpZGVudGlmaWVyIDAgLi4gNwoJdW5zaWduZWQgaW50IG1vZGUpCnsKCXBQTUMtPlBNQ19QQ0tSW3Bja10gPSBtb2RlOwoJcFBNQy0+UE1DX1NDRVIgPSAoMSA8PCBwY2spIDw8IDg7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfRGlzYWJsZVBDSwovLyogXGJyaWVmIEVuYWJsZSBwZXJpcGhlcmFsIGNsb2NrCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRGlzYWJsZVBDSyAoCglBVDkxUFNfUE1DIHBQTUMsIC8vIFxhcmcgcG9pbnRlciB0byBQTUMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IHBjaykgIC8vIFxhcmcgUGVyaXBoZXJhbCBjbG9jayBpZGVudGlmaWVyIDAgLi4gNwp7CglwUE1DLT5QTUNfU0NEUiA9ICgxIDw8IHBjaykgPDwgODsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19FbmFibGVJdAovLyogXGJyaWVmIEVuYWJsZSBQTUMgaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QTUNfRW5hYmxlSXQgKAoJQVQ5MVBTX1BNQyBwUE1DLCAgICAgLy8gcG9pbnRlciB0byBhIFBNQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBJVCB0byBiZSBlbmFibGVkCnsKCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyCglwUE1DLT5QTUNfSUVSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19EaXNhYmxlSXQKLy8qIFxicmllZiBEaXNhYmxlIFBNQyBpbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19EaXNhYmxlSXQgKAoJQVQ5MVBTX1BNQyBwUE1DLCAvLyBwb2ludGVyIHRvIGEgUE1DIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAvLyBJVCB0byBiZSBkaXNhYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlcgoJcFBNQy0+UE1DX0lEUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfR2V0U3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFBNQyBJbnRlcnJ1cHQgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRTdGF0dXMoIC8vIFxyZXR1cm4gUE1DIEludGVycnVwdCBTdGF0dXMKCUFUOTFQU19QTUMgcFBNQykgLy8gcG9pbnRlciB0byBhIFBNQyBjb250cm9sbGVyCnsKCXJldHVybiBwUE1DLT5QTUNfU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cwovLyogXGJyaWVmIFJldHVybiBQTUMgSW50ZXJydXB0IE1hc2sgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFBNQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKCUFUOTFQU19QTUMgcFBNQykgLy8gcG9pbnRlciB0byBhIFBNQyBjb250cm9sbGVyCnsKCXJldHVybiBwUE1DLT5QTUNfSU1SOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUE1DX0lzSW50ZXJydXB0TWFza2VkCi8vKiBcYnJpZWYgVGVzdCBpZiBQTUMgSW50ZXJydXB0IGlzIE1hc2tlZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QTUNfSXNJbnRlcnJ1cHRNYXNrZWQoCiAgICAgICAgQVQ5MVBTX1BNQyBwUE1DLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQTUMgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CglyZXR1cm4gKEFUOTFGX1BNQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBQTUMpICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfSXNTdGF0dXNTZXQKLy8qIFxicmllZiBUZXN0IGlmIFBNQyBTdGF0dXMgaXMgU2V0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BNQ19Jc1N0YXR1c1NldCgKICAgICAgICBBVDkxUFNfUE1DIHBQTUMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBNQyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKCXJldHVybiAoQVQ5MUZfUE1DX0dldFN0YXR1cyhwUE1DKSAmIGZsYWcpOwp9LyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUlNUQwogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUlNUU29mdFJlc2V0Ci8vKiBcYnJpZWYgU3RhcnQgU29mdHdhcmUgUmVzZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1JTVFNvZnRSZXNldCgKICAgICAgICBBVDkxUFNfUlNUQyBwUlNUQywKICAgICAgICB1bnNpZ25lZCBpbnQgcmVzZXQpCnsKCXBSU1RDLT5SU1RDX1JDUiA9ICgweEE1MDAwMDAwIHwgcmVzZXQpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUlNUU2V0TW9kZQovLyogXGJyaWVmIFNldCBSZXNldCBNb2RlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9SU1RTZXRNb2RlKAogICAgICAgIEFUOTFQU19SU1RDIHBSU1RDLAogICAgICAgIHVuc2lnbmVkIGludCBtb2RlKQp7CglwUlNUQy0+UlNUQ19STVIgPSAoMHhBNTAwMDAwMCB8IG1vZGUpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUlNUR2V0TW9kZQovLyogXGJyaWVmIEdldCBSZXNldCBNb2RlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1JTVEdldE1vZGUoCiAgICAgICAgQVQ5MVBTX1JTVEMgcFJTVEMpCnsKCXJldHVybiAocFJTVEMtPlJTVENfUk1SKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1JTVEdldFN0YXR1cwovLyogXGJyaWVmIEdldCBSZXNldCBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlNUR2V0U3RhdHVzKAogICAgICAgIEFUOTFQU19SU1RDIHBSU1RDKQp7CglyZXR1cm4gKHBSU1RDLT5SU1RDX1JTUik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9SU1RJc1NvZnRSc3RBY3RpdmUKLy8qIFxicmllZiBSZXR1cm4gIT0wIGlmIHNvZnR3YXJlIHJlc2V0IGlzIHN0aWxsIG5vdCBjb21wbGV0ZWQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlNUSXNTb2Z0UnN0QWN0aXZlKAogICAgICAgIEFUOTFQU19SU1RDIHBSU1RDKQp7CglyZXR1cm4gKChwUlNUQy0+UlNUQ19SU1IpICYgQVQ5MUNfUlNUQ19TUkNNUCk7Cn0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgUlRUQwogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgICBBVDkxRl9TZXRSVFRfVGltZUJhc2UoKQovLyogXGJyaWVmICBTZXQgdGhlIFJUVCBwcmVzY2FsZXIgYWNjb3JkaW5nIHRvIHRoZSBUaW1lQmFzZSBpbiBtcwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlRUU2V0VGltZUJhc2UoCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMsIAogICAgICAgIHVuc2lnbmVkIGludCBtcykKewoJaWYgKG1zID4gMjAwMCkKCQlyZXR1cm4gMTsgICAvLyBBVDkxQ19USU1FX09VVF9PRl9SQU5HRQoJcFJUVEMtPlJUVENfUlRNUiAmPSB+MHhGRkZGOwkKCXBSVFRDLT5SVFRDX1JUTVIgfD0gKCgobXMgPDwgMTUpIC8xMDAwKSAmIDB4RkZGRik7CQoJcmV0dXJuIDA7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgIEFUOTFGX1JUVFNldFByZXNjYWxlcigpCi8vKiBcYnJpZWYgIFNldCB0aGUgbmV3IHByZXNjYWxlciB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlRUU2V0UHJlc2NhbGVyKAogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDLCAKICAgICAgICB1bnNpZ25lZCBpbnQgcnRwcmVzKQp7CglwUlRUQy0+UlRUQ19SVE1SICY9IH4weEZGRkY7CQoJcFJUVEMtPlJUVENfUlRNUiB8PSAocnRwcmVzICYgMHhGRkZGKTsJCglyZXR1cm4gKHBSVFRDLT5SVFRDX1JUTVIpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgICBBVDkxRl9SVFRSZXN0YXJ0KCkKLy8qIFxicmllZiAgUmVzdGFydCB0aGUgUlRUIHByZXNjYWxlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVFJlc3RhcnQoCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpCnsKCXBSVFRDLT5SVFRDX1JUTVIgfD0gQVQ5MUNfUlRUQ19SVFRSU1Q7CQp9CgoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUX1NldEFsYXJtSU5UKCkKLy8qIFxicmllZiAgRW5hYmxlIFJUVCBBbGFybSBJbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRTZXRBbGFybUlOVCgKICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQykKewoJcFJUVEMtPlJUVENfUlRNUiB8PSBBVDkxQ19SVFRDX0FMTUlFTjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUX0NsZWFyQWxhcm1JTlQoKQovLyogXGJyaWVmICBEaXNhYmxlIFJUVCBBbGFybSBJbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9SVFRDbGVhckFsYXJtSU5UKAogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDKQp7CglwUlRUQy0+UlRUQ19SVE1SICY9IH5BVDkxQ19SVFRDX0FMTUlFTjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUX1NldFJ0dEluY0lOVCgpCi8vKiBcYnJpZWYgIEVuYWJsZSBSVFQgSU5DIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVFNldFJ0dEluY0lOVCgKICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQykKewoJcFJUVEMtPlJUVENfUlRNUiB8PSBBVDkxQ19SVFRDX1JUVElOQ0lFTjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUX0NsZWFyUnR0SW5jSU5UKCkKLy8qIFxicmllZiAgRGlzYWJsZSBSVFQgSU5DIEludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVENsZWFyUnR0SW5jSU5UKAogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDKQp7CglwUlRUQy0+UlRUQ19SVE1SICY9IH5BVDkxQ19SVFRDX1JUVElOQ0lFTjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUX1NldEFsYXJtVmFsdWUoKQovLyogXGJyaWVmICBTZXQgUlRUIEFsYXJtIFZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUlRUU2V0QWxhcm1WYWx1ZSgKICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQywgdW5zaWduZWQgaW50IGFsYXJtKQp7CglwUlRUQy0+UlRUQ19SVEFSID0gYWxhcm07Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgIEFUOTFGX1JUVF9HZXRBbGFybVZhbHVlKCkKLy8qIFxicmllZiAgR2V0IFJUVCBBbGFybSBWYWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlRUR2V0QWxhcm1WYWx1ZSgKICAgICAgICBBVDkxUFNfUlRUQyBwUlRUQykKewoJcmV0dXJuKHBSVFRDLT5SVFRDX1JUQVIpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgICBBVDkxRl9SVFRHZXRTdGF0dXMoKQovLyogXGJyaWVmICBSZWFkIHRoZSBSVFQgc3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9SVFRHZXRTdGF0dXMoCiAgICAgICAgQVQ5MVBTX1JUVEMgcFJUVEMpCnsKCXJldHVybihwUlRUQy0+UlRUQ19SVFNSKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICAgQVQ5MUZfUlRUX1JlYWRWYWx1ZSgpCi8vKiBcYnJpZWYgIFJlYWQgdGhlIFJUVCB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUlRUUmVhZFZhbHVlKAogICAgICAgIEFUOTFQU19SVFRDIHBSVFRDKQp7CiAgICAgICAgcmVnaXN0ZXIgdm9sYXRpbGUgdW5zaWduZWQgaW50IHZhbDEsdmFsMjsKCWRvCgl7CgkJdmFsMSA9IHBSVFRDLT5SVFRDX1JUVlI7CgkJdmFsMiA9IHBSVFRDLT5SVFRDX1JUVlI7Cgl9CQoJd2hpbGUodmFsMSAhPSB2YWwyKTsKCXJldHVybih2YWwxKTsKfQovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQSVRDCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSVRJbml0Ci8vKiBcYnJpZWYgU3lzdGVtIHRpbWVyIGluaXQgOiBwZXJpb2QgaW4gtXNlY29uZCwgc3lzdGVtIGNsb2NrIGZyZXEgaW4gTUh6Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSVRJbml0KAogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDLAogICAgICAgIHVuc2lnbmVkIGludCBwZXJpb2QsCiAgICAgICAgdW5zaWduZWQgaW50IHBpdF9mcmVxdWVuY3kpCnsKCXBQSVRDLT5QSVRDX1BJTVIgPSBwZXJpb2Q/IChwZXJpb2QgKiBwaXRfZnJlcXVlbmN5ICsgOCkgPj4gNCA6IDA7IC8vICs4IHRvIGF2b2lkICUxMCBhbmQgLzEwCglwUElUQy0+UElUQ19QSU1SIHw9IEFUOTFDX1BJVENfUElURU47CSAKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJVFNldFBJVgovLyogXGJyaWVmIFNldCB0aGUgUElUIFBlcmlvZGljIEludGVydmFsIFZhbHVlIAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElUU2V0UElWKAogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDLAogICAgICAgIHVuc2lnbmVkIGludCBwaXYpCnsKCXBQSVRDLT5QSVRDX1BJTVIgPSBwaXYgfCAocFBJVEMtPlBJVENfUElNUiAmIChBVDkxQ19QSVRDX1BJVEVOIHwgQVQ5MUNfUElUQ19QSVRJRU4pKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJVEVuYWJsZUludAovLyogXGJyaWVmIEVuYWJsZSBQSVQgcGVyaW9kaWMgaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSVRFbmFibGVJbnQoCiAgICAgICAgQVQ5MVBTX1BJVEMgcFBJVEMpCnsKCXBQSVRDLT5QSVRDX1BJTVIgfD0gQVQ5MUNfUElUQ19QSVRJRU47CSAKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJVERpc2FibGVJbnQKLy8qIFxicmllZiBEaXNhYmxlIFBJVCBwZXJpb2RpYyBpbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BJVERpc2FibGVJbnQoCiAgICAgICAgQVQ5MVBTX1BJVEMgcFBJVEMpCnsKCXBQSVRDLT5QSVRDX1BJTVIgJj0gfkFUOTFDX1BJVENfUElUSUVOOwkgCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSVRHZXRNb2RlCi8vKiBcYnJpZWYgUmVhZCBQSVQgbW9kZSByZWdpc3RlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSVRHZXRNb2RlKAogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDKQp7CglyZXR1cm4ocFBJVEMtPlBJVENfUElNUik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSVRHZXRTdGF0dXMKLy8qIFxicmllZiBSZWFkIFBJVCBzdGF0dXMgcmVnaXN0ZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUElUR2V0U3RhdHVzKAogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDKQp7CglyZXR1cm4ocFBJVEMtPlBJVENfUElTUik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSVRHZXRQSUlSCi8vKiBcYnJpZWYgUmVhZCBQSVQgQ1BJViBhbmQgUElDTlQgd2l0aG91dCByZXNzZXR0aW5nIHRoZSBjb3VudGVycwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSVRHZXRQSUlSKAogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDKQp7CglyZXR1cm4ocFBJVEMtPlBJVENfUElJUik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QSVRHZXRQSVZSCi8vKiBcYnJpZWYgUmVhZCBTeXN0ZW0gdGltZXIgQ1BJViBhbmQgUElDTlQgd2l0aG91dCByZXNzZXR0aW5nIHRoZSBjb3VudGVycwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9QSVRHZXRQSVZSKAogICAgICAgIEFUOTFQU19QSVRDIHBQSVRDKQp7CglyZXR1cm4ocFBJVEMtPlBJVENfUElWUik7Cn0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgV0RUQwogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfV0RUU2V0TW9kZQovLyogXGJyaWVmIFNldCBXYXRjaGRvZyBNb2RlIFJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9XRFRTZXRNb2RlKAogICAgICAgIEFUOTFQU19XRFRDIHBXRFRDLAogICAgICAgIHVuc2lnbmVkIGludCBNb2RlKQp7CglwV0RUQy0+V0RUQ19XRE1SID0gTW9kZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1dEVFJlc3RhcnQKLy8qIFxicmllZiBSZXN0YXJ0IFdhdGNoZG9nCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9XRFRSZXN0YXJ0KAogICAgICAgIEFUOTFQU19XRFRDIHBXRFRDKQp7CglwV0RUQy0+V0RUQ19XRENSID0gMHhBNTAwMDAwMTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1dEVFNHZXR0YXR1cwovLyogXGJyaWVmIEdldCBXYXRjaGRvZyBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfV0RUU0dldHRhdHVzKAogICAgICAgIEFUOTFQU19XRFRDIHBXRFRDKQp7CglyZXR1cm4ocFdEVEMtPldEVENfV0RTUiAmIDB4Myk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9XRFRHZXRQZXJpb2QKLy8qIFxicmllZiBUcmFuc2xhdGUgbXMgaW50byBXYXRjaGRvZyBDb21wYXRpYmxlIHZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1dEVEdldFBlcmlvZCh1bnNpZ25lZCBpbnQgbXMpCnsKCWlmICgobXMgPCA0KSB8fCAobXMgPiAxNjAwMCkpCgkJcmV0dXJuIDA7CglyZXR1cm4oKG1zIDw8IDgpIC8gMTAwMCk7Cn0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgVlJFRwogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVlJFR19FbmFibGVfTG93UG93ZXJNb2RlCi8vKiBcYnJpZWYgRW5hYmxlIFZSRUcgTG93IFBvd2VyIE1vZGUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1ZSRUdfRW5hYmxlX0xvd1Bvd2VyTW9kZSgKICAgICAgICBBVDkxUFNfVlJFRyBwVlJFRykKewoJcFZSRUctPlZSRUdfTVIgfD0gQVQ5MUNfVlJFR19QU1REQlk7CSAKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1ZSRUdfRGlzYWJsZV9Mb3dQb3dlck1vZGUKLy8qIFxicmllZiBEaXNhYmxlIFZSRUcgTG93IFBvd2VyIE1vZGUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1ZSRUdfRGlzYWJsZV9Mb3dQb3dlck1vZGUoCiAgICAgICAgQVQ5MVBTX1ZSRUcgcFZSRUcpCnsKCXBWUkVHLT5WUkVHX01SICY9IH5BVDkxQ19WUkVHX1BTVERCWTsJIAp9LyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgTUMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KCiNkZWZpbmUgQVQ5MUNfTUNfQ09SUkVDVF9LRVkgICgodW5zaWduZWQgaW50KSAweDVBIDw8IDI0KSAvLyAoTUMpIENvcnJlY3QgUHJvdGVjdCBLZXkKCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9NQ19SZW1hcAovLyogXGJyaWVmIE1ha2UgUmVtYXAKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX01DX1JlbWFwICh2b2lkKSAgICAgLy8gIAp7CiAgICBBVDkxUFNfTUMgcE1DID0gKEFUOTFQU19NQykgQVQ5MUNfQkFTRV9NQzsKICAgIAogICAgcE1DLT5NQ19SQ1IgPSBBVDkxQ19NQ19SQ0I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9NQ19FRkNfQ2ZnTW9kZVJlZwovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgRUZDIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIE1DIGNvbnRyb2xsZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX01DX0VGQ19DZmdNb2RlUmVnICgKCUFUOTFQU19NQyBwTUMsIC8vIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgbW9kZSkgICAgICAgIC8vIG1vZGUgcmVnaXN0ZXIgCnsKCS8vIFdyaXRlIHRvIHRoZSBGTVIgcmVnaXN0ZXIKCXBNQy0+TUNfRk1SID0gbW9kZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX01DX0VGQ19HZXRNb2RlUmVnCi8vKiBcYnJpZWYgUmV0dXJuIE1DIEVGQyBNb2RlIFJlZ3NpdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX01DX0VGQ19HZXRNb2RlUmVnKAoJQVQ5MVBTX01DIHBNQykgLy8gcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXIKewoJcmV0dXJuIHBNQy0+TUNfRk1SOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfTUNfRUZDX0NvbXB1dGVGTUNOCi8vKiBcYnJpZWYgUmV0dXJuIE1DIEVGQyBNb2RlIFJlZ3NpdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX01DX0VGQ19Db21wdXRlRk1DTigKCWludCBtYXN0ZXJfY2xvY2spIC8vIG1hc3RlciBjbG9jayBpbiBIegp7CglyZXR1cm4gKG1hc3Rlcl9jbG9jay8xMDAwMDAwICsyKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX01DX0VGQ19QZXJmb3JtQ21kCi8vKiBcYnJpZWYgUGVyZm9ybSBFRkMgQ29tbWFuZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfTUNfRUZDX1BlcmZvcm1DbWQgKAoJQVQ5MVBTX01DIHBNQywgLy8gcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXIKICAgIHVuc2lnbmVkIGludCB0cmFuc2Zlcl9jbWQpCnsKCXBNQy0+TUNfRkNSID0gdHJhbnNmZXJfY21kOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX01DX0VGQ19HZXRTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gTUMgRUZDIFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9NQ19FRkNfR2V0U3RhdHVzKAoJQVQ5MVBTX01DIHBNQykgLy8gcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXIKewoJcmV0dXJuIHBNQy0+TUNfRlNSOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfTUNfRUZDX0lzSW50ZXJydXB0TWFza2VkCi8vKiBcYnJpZWYgVGVzdCBpZiBFRkMgTUMgSW50ZXJydXB0IGlzIE1hc2tlZCAKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfTUNfRUZDX0lzSW50ZXJydXB0TWFza2VkKAogICAgICAgIEFUOTFQU19NQyBwTUMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIE1DIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewoJcmV0dXJuIChBVDkxRl9NQ19FRkNfR2V0TW9kZVJlZyhwTUMpICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9NQ19FRkNfSXNJbnRlcnJ1cHRTZXQKLy8qIFxicmllZiBUZXN0IGlmIEVGQyBNQyBJbnRlcnJ1cHQgaXMgU2V0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX01DX0VGQ19Jc0ludGVycnVwdFNldCgKICAgICAgICBBVDkxUFNfTUMgcE1DLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBNQyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKCXJldHVybiAoQVQ5MUZfTUNfRUZDX0dldFN0YXR1cyhwTUMpICYgZmxhZyk7Cn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIFNQSQogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJX09wZW4KLy8qIFxicmllZiBPcGVuIGEgU1BJIFBvcnQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1BJX09wZW4gKAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBudWxsKSAgLy8gXGFyZwp7CiAgICAgICAgLyogTk9UIERFRklORUQgQVQgVEhJUyBNT01FTlQgKi8KICAgICAgICByZXR1cm4gKCAwICk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUElfQ2ZnQ3MKLy8qIFxicmllZiBDb25maWd1cmUgU1BJIGNoaXAgc2VsZWN0IHJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2ZnQ3MgKAoJQVQ5MVBTX1NQSSBwU1BJLCAgICAgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyCglpbnQgY3MsICAgICAvLyBTUEkgY3MgbnVtYmVyICgwIHRvIDMpCiAJaW50IHZhbCkgICAvLyAgY2hpcCBzZWxlY3QgcmVnaXN0ZXIKewoJLy8qIFdyaXRlIHRvIHRoZSBDU1IgcmVnaXN0ZXIKCSoocFNQSS0+U1BJX0NTUiArIGNzKSA9IHZhbDsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9FbmFibGVJdAovLyogXGJyaWVmIEVuYWJsZSBTUEkgaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfRW5hYmxlSXQgKAoJQVQ5MVBTX1NQSSBwU1BJLCAgICAgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBJVCB0byBiZSBlbmFibGVkCnsKCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyCglwU1BJLT5TUElfSUVSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9EaXNhYmxlSXQKLy8qIFxicmllZiBEaXNhYmxlIFNQSSBpbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9EaXNhYmxlSXQgKAoJQVQ5MVBTX1NQSSBwU1BJLCAvLyBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAvLyBJVCB0byBiZSBkaXNhYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlcgoJcFNQSS0+U1BJX0lEUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUElfUmVzZXQKLy8qIFxicmllZiBSZXNldCB0aGUgU1BJIGNvbnRyb2xsZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSV9SZXNldCAoCglBVDkxUFNfU1BJIHBTUEkgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyCgkpCnsKCS8vKiBXcml0ZSB0byB0aGUgQ1IgcmVnaXN0ZXIKCXBTUEktPlNQSV9DUiA9IEFUOTFDX1NQSV9TV1JTVDsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9FbmFibGUKLy8qIFxicmllZiBFbmFibGUgdGhlIFNQSSBjb250cm9sbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfRW5hYmxlICgKCUFUOTFQU19TUEkgcFNQSSAvLyBwb2ludGVyIHRvIGEgU1BJIGNvbnRyb2xsZXIKCSkKewoJLy8qIFdyaXRlIHRvIHRoZSBDUiByZWdpc3RlcgoJcFNQSS0+U1BJX0NSID0gQVQ5MUNfU1BJX1NQSUVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0Rpc2FibGUKLy8qIFxicmllZiBEaXNhYmxlIHRoZSBTUEkgY29udHJvbGxlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX0Rpc2FibGUgKAoJQVQ5MVBTX1NQSSBwU1BJIC8vIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcgoJKQp7CgkvLyogV3JpdGUgdG8gdGhlIENSIHJlZ2lzdGVyCglwU1BJLT5TUElfQ1IgPSBBVDkxQ19TUElfU1BJRElTOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0NmZ01vZGUKLy8qIFxicmllZiBFbmFibGUgdGhlIFNQSSBjb250cm9sbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2ZnTW9kZSAoCglBVDkxUFNfU1BJIHBTUEksIC8vIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcgoJaW50IG1vZGUpICAgICAgICAvLyBtb2RlIHJlZ2lzdGVyIAp7CgkvLyogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyCglwU1BJLT5TUElfTVIgPSBtb2RlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJX0NmZ1BDUwovLyogXGJyaWVmIFN3aXRjaCB0byB0aGUgY29ycmVjdCBQQ1Mgb2YgU1BJIE1vZGUgUmVnaXN0ZXIgOiBGaXhlZCBQZXJpcGhlcmFsIFNlbGVjdGVkCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUElfQ2ZnUENTICgKCUFUOTFQU19TUEkgcFNQSSwgLy8gcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyCgljaGFyIFBDU19EZXZpY2UpIC8vIFBDUyBvZiB0aGUgRGV2aWNlCnsJCiAJLy8qIFdyaXRlIHRvIHRoZSBNUiByZWdpc3RlcgoJcFNQSS0+U1BJX01SICY9IDB4RkZGMEZGRkY7CglwU1BJLT5TUElfTVIgfD0gKCAoUENTX0RldmljZTw8MTYpICYgQVQ5MUNfU1BJX1BDUyApOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJX1JlY2VpdmVGcmFtZQovLyogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemFlZCB3aXRoIE5leHQgQnVmZmVyLCAwIGlmIFBEQyBpcyBidXN5Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NQSV9SZWNlaXZlRnJhbWUgKAoJQVQ5MVBTX1NQSSBwU1BJLAoJY2hhciAqcEJ1ZmZlciwKCXVuc2lnbmVkIGludCBzekJ1ZmZlciwKCWNoYXIgKnBOZXh0QnVmZmVyLAoJdW5zaWduZWQgaW50IHN6TmV4dEJ1ZmZlciApCnsKCXJldHVybiBBVDkxRl9QRENfUmVjZWl2ZUZyYW1lKAoJCShBVDkxUFNfUERDKSAmKHBTUEktPlNQSV9SUFIpLAoJCXBCdWZmZXIsCgkJc3pCdWZmZXIsCgkJcE5leHRCdWZmZXIsCgkJc3pOZXh0QnVmZmVyKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSV9TZW5kRnJhbWUKLy8qIFxicmllZiBSZXR1cm4gMiBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBCdWZmZXIgYW5kIE5leHQgQnVmZmVyLCAxIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXphZWQgd2l0aCBOZXh0IEJ1ZmZlciwgMCBpZiBQREMgaXMgYlNQSXkKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1BJX1NlbmRGcmFtZSgKCUFUOTFQU19TUEkgcFNQSSwKCWNoYXIgKnBCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pCdWZmZXIsCgljaGFyICpwTmV4dEJ1ZmZlciwKCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQp7CglyZXR1cm4gQVQ5MUZfUERDX1NlbmRGcmFtZSgKCQkoQVQ5MVBTX1BEQykgJihwU1BJLT5TUElfUlBSKSwKCQlwQnVmZmVyLAoJCXN6QnVmZmVyLAoJCXBOZXh0QnVmZmVyLAoJCXN6TmV4dEJ1ZmZlcik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUElfQ2xvc2UKLy8qIFxicmllZiBDbG9zZSBTUEk6IGRpc2FibGUgSVQgZGlzYWJsZSB0cmFuc2ZlcnQsIGNsb3NlIFBEQwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX0Nsb3NlICgKCUFUOTFQU19TUEkgcFNQSSkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFNQSSBjb250cm9sbGVyCnsKICAgIC8vKiBSZXNldCBhbGwgdGhlIENoaXAgU2VsZWN0IHJlZ2lzdGVyCiAgICBwU1BJLT5TUElfQ1NSWzBdID0gMCA7CiAgICBwU1BJLT5TUElfQ1NSWzFdID0gMCA7CiAgICBwU1BJLT5TUElfQ1NSWzJdID0gMCA7CiAgICBwU1BJLT5TUElfQ1NSWzNdID0gMCA7CgogICAgLy8qIFJlc2V0IHRoZSBTUEkgbW9kZQogICAgcFNQSS0+U1BJX01SID0gMCAgOwoKICAgIC8vKiBEaXNhYmxlIGFsbCBpbnRlcnJ1cHRzCiAgICBwU1BJLT5TUElfSURSID0gMHhGRkZGRkZGRiA7CgogICAgLy8qIEFib3J0IHRoZSBQZXJpcGhlcmFsIERhdGEgVHJhbnNmZXJzCiAgICBBVDkxRl9QRENfQ2xvc2UoKEFUOTFQU19QREMpICYocFNQSS0+U1BJX1JQUikpOwoKICAgIC8vKiBEaXNhYmxlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciBhbmQgc3RvcCBhbnkgYWN0aXZpdHkgaW1tZWRpYXRlbHkKICAgIHBTUEktPlNQSV9DUiA9IEFUOTFDX1NQSV9TUElESVM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUElfUHV0Q2hhcgovLyogXGJyaWVmIFNlbmQgYSBjaGFyYWN0ZXIsZG9lcyBub3QgY2hlY2sgaWYgcmVhZHkgdG8gc2VuZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1BJX1B1dENoYXIgKAoJQVQ5MVBTX1NQSSBwU1BJLAoJdW5zaWduZWQgaW50IGNoYXJhY3RlciwKICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjc19udW1iZXIgKQp7CiAgICB1bnNpZ25lZCBpbnQgdmFsdWVfZm9yX2NzOwogICAgdmFsdWVfZm9yX2NzID0gKH4oMSA8PCBjc19udW1iZXIpKSAmIDB4RjsgIC8vUGxhY2UgYSB6ZXJvIGFtb25nIGEgNCBPTkVzIG51bWJlcgogICAgcFNQSS0+U1BJX1REUiA9IChjaGFyYWN0ZXIgJiAweEZGRkYpIHwgKHZhbHVlX2Zvcl9jcyA8PCAxNik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUElfR2V0Q2hhcgovLyogXGJyaWVmIFJlY2VpdmUgYSBjaGFyYWN0ZXIsZG9lcyBub3QgY2hlY2sgaWYgYSBjaGFyYWN0ZXIgaXMgYXZhaWxhYmxlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgaW50IEFUOTFGX1NQSV9HZXRDaGFyICgKCWNvbnN0IEFUOTFQU19TUEkgcFNQSSkKewogICAgcmV0dXJuKChwU1BJLT5TUElfUkRSKSAmIDB4RkZGRik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUElfR2V0SW50ZXJydXB0TWFza1N0YXR1cwovLyogXGJyaWVmIFJldHVybiBTUEkgSW50ZXJydXB0IE1hc2sgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NQSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFNQSSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKICAgICAgICBBVDkxUFNfU1BJIHBTcGkpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcgp7CiAgICAgICAgcmV0dXJuIHBTcGktPlNQSV9JTVI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUElfSXNJbnRlcnJ1cHRNYXNrZWQKLy8qIFxicmllZiBUZXN0IGlmIFNQSSBJbnRlcnJ1cHQgaXMgTWFza2VkIAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9TUElfSXNJbnRlcnJ1cHRNYXNrZWQoCiAgICAgICAgQVQ5MVBTX1NQSSBwU3BpLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBTUEkgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9TUElfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwU3BpKSAmIGZsYWcpOwp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBVU0FSVAogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfQmF1ZHJhdGUKLy8qIFxicmllZiBDYWxjdWxhdGUgdGhlIGJhdWRyYXRlCi8vKiBTdGFuZGFyZCBBc3luY2hyb25vdXMgTW9kZSA6IDggYml0cyAsIDEgc3RvcCAsIG5vIHBhcml0eQojZGVmaW5lIEFUOTFDX1VTX0FTWU5DX01PREUgKCBBVDkxQ19VU19VU01PREVfTk9STUFMICsgXAogICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19OQlNUT1BfMV9CSVQgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX1BBUl9OT05FICsgXAogICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DSFJMXzhfQklUUyArIFwKICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfQ0xLU19DTE9DSyApCgovLyogU3RhbmRhcmQgRXh0ZXJuYWwgQXN5bmNocm9ub3VzIE1vZGUgOiA4IGJpdHMgLCAxIHN0b3AgLCBubyBwYXJpdHkKI2RlZmluZSBBVDkxQ19VU19BU1lOQ19TQ0tfTU9ERSAoIEFUOTFDX1VTX1VTTU9ERV9OT1JNQUwgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19OQlNUT1BfMV9CSVQgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19QQVJfTk9ORSArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NIUkxfOF9CSVRTICsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfQ0xLU19FWFQgKQoKLy8qIFN0YW5kYXJkIFN5bmNocm9ub3VzIE1vZGUgOiA4IGJpdHMgLCAxIHN0b3AgLCBubyBwYXJpdHkKI2RlZmluZSBBVDkxQ19VU19TWU5DX01PREUgKCBBVDkxQ19VU19TWU5DICsgXAogICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX1VTTU9ERV9OT1JNQUwgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgXAogICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX1BBUl9OT05FICsgXAogICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NIUkxfOF9CSVRTICsgXAogICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NMS1NfQ0xPQ0sgKQoKLy8qIFNDSyB1c2VkIExhYmVsCiNkZWZpbmUgQVQ5MUNfVVNfU0NLX1VTRUQgKEFUOTFDX1VTX0NLTE8gfCBBVDkxQ19VU19DTEtTX0VYVCkKCi8vKiBTdGFuZGFyZCBJU08gVD0wIE1vZGUgOiA4IGJpdHMgLCAxIHN0b3AgLCBwYXJpdHkKI2RlZmluZSBBVDkxQ19VU19JU09fUkVBREVSX01PREUgKCBBVDkxQ19VU19VU01PREVfSVNPNzgxNl8wICsgXAoJCQkJCSAgIAkJIEFUOTFDX1VTX0NMS1NfQ0xPQ0sgK1wKICAgICAgICAgICAgICAgICAgICAgICAJCSBBVDkxQ19VU19OQlNUT1BfMV9CSVQgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgCQkgQVQ5MUNfVVNfUEFSX0VWRU4gKyBcCiAgICAgICAgICAgICAgICAgICAgICAgCQkgQVQ5MUNfVVNfQ0hSTF84X0JJVFMgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgCQkgQVQ5MUNfVVNfQ0tMTyArXAogICAgICAgICAgICAgICAgICAgICAgIAkJIEFUOTFDX1VTX09WRVIpCgovLyogU3RhbmRhcmQgSVJEQSBtb2RlCiNkZWZpbmUgQVQ5MUNfVVNfQVNZTkNfSVJEQV9NT0RFICggIEFUOTFDX1VTX1VTTU9ERV9JUkRBICsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfTkJTVE9QXzFfQklUICsgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQVQ5MUNfVVNfUEFSX05PTkUgKyBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19VU19DSFJMXzhfQklUUyArIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUOTFDX1VTX0NMS1NfQ0xPQ0sgKQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX0JhdWRyYXRlCi8vKiBcYnJpZWYgQ2FsdWN1bGF0ZSBiYXVkX3ZhbHVlIGFjY29yZGluZyB0byB0aGUgbWFpbiBjbG9jayBhbmQgdGhlIGJhdWQgcmF0ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VU19CYXVkcmF0ZSAoCgljb25zdCB1bnNpZ25lZCBpbnQgbWFpbl9jbG9jaywgLy8gXGFyZyBwZXJpcGhlcmFsIGNsb2NrCgljb25zdCB1bnNpZ25lZCBpbnQgYmF1ZF9yYXRlKSAgLy8gXGFyZyBVQVJUIGJhdWRyYXRlCnsKCXVuc2lnbmVkIGludCBiYXVkX3ZhbHVlID0gKChtYWluX2Nsb2NrKjEwKS8oYmF1ZF9yYXRlICogMTYpKTsKCWlmICgoYmF1ZF92YWx1ZSAlIDEwKSA+PSA1KQoJCWJhdWRfdmFsdWUgPSAoYmF1ZF92YWx1ZSAvIDEwKSArIDE7CgllbHNlCgkJYmF1ZF92YWx1ZSAvPSAxMDsKCXJldHVybiBiYXVkX3ZhbHVlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfU2V0QmF1ZHJhdGUKLy8qIFxicmllZiBTZXQgdGhlIGJhdWRyYXRlIGFjY29yZGluZyB0byB0aGUgQ1BVIGNsb2NrCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19TZXRCYXVkcmF0ZSAoCglBVDkxUFNfVVNBUlQgcFVTQVJULCAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgbWFpbkNsb2NrLCAvLyBcYXJnIHBlcmlwaGVyYWwgY2xvY2sKCXVuc2lnbmVkIGludCBzcGVlZCkgICAgIC8vIFxhcmcgVUFSVCBiYXVkcmF0ZQp7CgkvLyogRGVmaW5lIHRoZSBiYXVkIHJhdGUgZGl2aXNvciByZWdpc3RlcgoJcFVTQVJULT5VU19CUkdSID0gQVQ5MUZfVVNfQmF1ZHJhdGUobWFpbkNsb2NrLCBzcGVlZCk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VU19TZXRUaW1lZ3VhcmQKLy8qIFxicmllZiBTZXQgVVNBUlQgdGltZWd1YXJkCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19TZXRUaW1lZ3VhcmQgKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCwgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IHRpbWVndWFyZCkgLy8gXGFyZyB0aW1lZ3VhcmQgdmFsdWUKewoJLy8qIFdyaXRlIHRoZSBUaW1lZ3VhcmQgUmVnaXN0ZXIKCXBVU0FSVC0+VVNfVFRHUiA9IHRpbWVndWFyZCA7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VU19FbmFibGVJdAovLyogXGJyaWVmIEVuYWJsZSBVU0FSVCBJVAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRW5hYmxlSXQgKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCwgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBlbmFibGVkCnsKCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyCglwVVNBUlQtPlVTX0lFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VU19EaXNhYmxlSXQKLy8qIFxicmllZiBEaXNhYmxlIFVTQVJUIElUCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19EaXNhYmxlSXQgKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCwgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBkaXNhYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlcgoJcFVTQVJULT5VU19JRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfQ29uZmlndXJlCi8vKiBcYnJpZWYgQ29uZmlndXJlIFVTQVJUCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19Db25maWd1cmUgKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBtYWluQ2xvY2ssICAvLyBcYXJnIHBlcmlwaGVyYWwgY2xvY2sKCXVuc2lnbmVkIGludCBtb2RlICwgICAgICAvLyBcYXJnIG1vZGUgUmVnaXN0ZXIgdG8gYmUgcHJvZ3JhbW1lZAoJdW5zaWduZWQgaW50IGJhdWRSYXRlICwgIC8vIFxhcmcgYmF1ZHJhdGUgdG8gYmUgcHJvZ3JhbW1lZAoJdW5zaWduZWQgaW50IHRpbWVndWFyZCApIC8vIFxhcmcgdGltZWd1YXJkIHRvIGJlIHByb2dyYW1tZWQKewogICAgLy8qIERpc2FibGUgaW50ZXJydXB0cwogICAgcFVTQVJULT5VU19JRFIgPSAodW5zaWduZWQgaW50KSAtMTsKCiAgICAvLyogUmVzZXQgcmVjZWl2ZXIgYW5kIHRyYW5zbWl0dGVyCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlNUUlggfCBBVDkxQ19VU19SU1RUWCB8IEFUOTFDX1VTX1JYRElTIHwgQVQ5MUNfVVNfVFhESVMgOwoKCS8vKiBEZWZpbmUgdGhlIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVyCglBVDkxRl9VU19TZXRCYXVkcmF0ZShwVVNBUlQsIG1haW5DbG9jaywgYmF1ZFJhdGUpOwoKCS8vKiBXcml0ZSB0aGUgVGltZWd1YXJkIFJlZ2lzdGVyCglBVDkxRl9VU19TZXRUaW1lZ3VhcmQocFVTQVJULCB0aW1lZ3VhcmQpOwoKICAgIC8vKiBDbGVhciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBDb3VudGVycwogICAgQVQ5MUZfUERDX09wZW4oKEFUOTFQU19QREMpICYocFVTQVJULT5VU19SUFIpKTsKCiAgICAvLyogRGVmaW5lIHRoZSBVU0FSVCBtb2RlCiAgICBwVVNBUlQtPlVTX01SID0gbW9kZSAgOwoKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX0VuYWJsZVJ4Ci8vKiBcYnJpZWYgRW5hYmxlIHJlY2VpdmluZyBjaGFyYWN0ZXJzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19FbmFibGVSeCAoCglBVDkxUFNfVVNBUlQgcFVTQVJUKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcgp7CiAgICAvLyogRW5hYmxlIHJlY2VpdmVyCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlhFTjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX0VuYWJsZVR4Ci8vKiBcYnJpZWYgRW5hYmxlIHNlbmRpbmcgY2hhcmFjdGVycwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfRW5hYmxlVHggKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKewogICAgLy8qIEVuYWJsZSAgdHJhbnNtaXR0ZXIKICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19UWEVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfUmVzZXRSeAovLyogXGJyaWVmIFJlc2V0IFJlY2VpdmVyIGFuZCByZS1lbmFibGUgaXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX1Jlc2V0UnggKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKewoJLy8qIFJlc2V0IHJlY2VpdmVyCglwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlNUUlg7CiAgICAvLyogUmUtRW5hYmxlIHJlY2VpdmVyCiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfUlhFTjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX1Jlc2V0VHgKLy8qIFxicmllZiBSZXNldCBUcmFuc21pdHRlciBhbmQgcmUtZW5hYmxlIGl0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19SZXNldFR4ICgKCUFUOTFQU19VU0FSVCBwVVNBUlQpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyCnsKCS8vKiBSZXNldCB0cmFuc21pdHRlcgoJcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1JTVFRYOwogICAgLy8qIEVuYWJsZSB0cmFuc21pdHRlcgogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1RYRU47Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VU19EaXNhYmxlUngKLy8qIFxicmllZiBEaXNhYmxlIFJlY2VpdmVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19EaXNhYmxlUnggKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCkgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVTQVJUIGNvbnRyb2xsZXIKewogICAgLy8qIERpc2FibGUgcmVjZWl2ZXIKICAgIHBVU0FSVC0+VVNfQ1IgPSBBVDkxQ19VU19SWERJUzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX0Rpc2FibGVUeAovLyogXGJyaWVmIERpc2FibGUgVHJhbnNtaXR0ZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VTX0Rpc2FibGVUeCAoCglBVDkxUFNfVVNBUlQgcFVTQVJUKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcgp7CiAgICAvLyogRGlzYWJsZSB0cmFuc21pdHRlcgogICAgcFVTQVJULT5VU19DUiA9IEFUOTFDX1VTX1RYRElTOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfQ2xvc2UKLy8qIFxicmllZiBDbG9zZSBVU0FSVDogZGlzYWJsZSBJVCBkaXNhYmxlIHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlciwgY2xvc2UgUERDCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VU19DbG9zZSAoCglBVDkxUFNfVVNBUlQgcFVTQVJUKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcgp7CiAgICAvLyogUmVzZXQgdGhlIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVyCiAgICBwVVNBUlQtPlVTX0JSR1IgPSAwIDsKCiAgICAvLyogUmVzZXQgdGhlIFVTQVJUIG1vZGUKICAgIHBVU0FSVC0+VVNfTVIgPSAwICA7CgogICAgLy8qIFJlc2V0IHRoZSBUaW1lZ3VhcmQgUmVnaXN0ZXIKICAgIHBVU0FSVC0+VVNfVFRHUiA9IDA7CgogICAgLy8qIERpc2FibGUgYWxsIGludGVycnVwdHMKICAgIHBVU0FSVC0+VVNfSURSID0gMHhGRkZGRkZGRiA7CgogICAgLy8qIEFib3J0IHRoZSBQZXJpcGhlcmFsIERhdGEgVHJhbnNmZXJzCiAgICBBVDkxRl9QRENfQ2xvc2UoKEFUOTFQU19QREMpICYocFVTQVJULT5VU19SUFIpKTsKCiAgICAvLyogRGlzYWJsZSByZWNlaXZlciBhbmQgdHJhbnNtaXR0ZXIgYW5kIHN0b3AgYW55IGFjdGl2aXR5IGltbWVkaWF0ZWx5CiAgICBwVVNBUlQtPlVTX0NSID0gQVQ5MUNfVVNfVFhESVMgfCBBVDkxQ19VU19SWERJUyB8IEFUOTFDX1VTX1JTVFRYIHwgQVQ5MUNfVVNfUlNUUlggOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfVHhSZWFkeQovLyogXGJyaWVmIFJldHVybiAxIGlmIGEgY2hhcmFjdGVyIGNhbiBiZSB3cml0dGVuIGluIFVTX1RIUgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VU19UeFJlYWR5ICgKCUFUOTFQU19VU0FSVCBwVVNBUlQgKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcgp7CiAgICByZXR1cm4gKHBVU0FSVC0+VVNfQ1NSICYgQVQ5MUNfVVNfVFhSRFkpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfUnhSZWFkeQovLyogXGJyaWVmIFJldHVybiAxIGlmIGEgY2hhcmFjdGVyIGNhbiBiZSByZWFkIGluIFVTX1JIUgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VU19SeFJlYWR5ICgKCUFUOTFQU19VU0FSVCBwVVNBUlQgKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVVNBUlQgY29udHJvbGxlcgp7CiAgICByZXR1cm4gKHBVU0FSVC0+VVNfQ1NSICYgQVQ5MUNfVVNfUlhSRFkpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfRXJyb3IKLy8qIFxicmllZiBSZXR1cm4gdGhlIGVycm9yIGZsYWcKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfRXJyb3IgKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCApICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVU0FSVCBjb250cm9sbGVyCnsKICAgIHJldHVybiAocFVTQVJULT5VU19DU1IgJgogICAgCShBVDkxQ19VU19PVlJFIHwgIC8vIE92ZXJydW4gZXJyb3IKICAgIAkgQVQ5MUNfVVNfRlJBTUUgfCAvLyBGcmFtaW5nIGVycm9yCiAgICAJIEFUOTFDX1VTX1BBUkUpKTsgIC8vIFBhcml0eSBlcnJvcgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfUHV0Q2hhcgovLyogXGJyaWVmIFNlbmQgYSBjaGFyYWN0ZXIsZG9lcyBub3QgY2hlY2sgaWYgcmVhZHkgdG8gc2VuZAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfUHV0Q2hhciAoCglBVDkxUFNfVVNBUlQgcFVTQVJULAoJaW50IGNoYXJhY3RlciApCnsKICAgIHBVU0FSVC0+VVNfVEhSID0gKGNoYXJhY3RlciAmIDB4MUZGKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX0dldENoYXIKLy8qIFxicmllZiBSZWNlaXZlIGEgY2hhcmFjdGVyLGRvZXMgbm90IGNoZWNrIGlmIGEgY2hhcmFjdGVyIGlzIGF2YWlsYWJsZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9VU19HZXRDaGFyICgKCWNvbnN0IEFUOTFQU19VU0FSVCBwVVNBUlQpCnsKICAgIHJldHVybigocFVTQVJULT5VU19SSFIpICYgMHgxRkYpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfU2VuZEZyYW1lCi8vKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6YWVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfU2VuZEZyYW1lKAoJQVQ5MVBTX1VTQVJUIHBVU0FSVCwKCWNoYXIgKnBCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pCdWZmZXIsCgljaGFyICpwTmV4dEJ1ZmZlciwKCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQp7CglyZXR1cm4gQVQ5MUZfUERDX1NlbmRGcmFtZSgKCQkoQVQ5MVBTX1BEQykgJihwVVNBUlQtPlVTX1JQUiksCgkJcEJ1ZmZlciwKCQlzekJ1ZmZlciwKCQlwTmV4dEJ1ZmZlciwKCQlzek5leHRCdWZmZXIpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVNfUmVjZWl2ZUZyYW1lCi8vKiBcYnJpZWYgUmV0dXJuIDIgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggQnVmZmVyIGFuZCBOZXh0IEJ1ZmZlciwgMSBpZiBQREMgaGFzIGJlZW4gaW5pdGlhbGl6YWVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVVNfUmVjZWl2ZUZyYW1lICgKCUFUOTFQU19VU0FSVCBwVVNBUlQsCgljaGFyICpwQnVmZmVyLAoJdW5zaWduZWQgaW50IHN6QnVmZmVyLAoJY2hhciAqcE5leHRCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkKewoJcmV0dXJuIEFUOTFGX1BEQ19SZWNlaXZlRnJhbWUoCgkJKEFUOTFQU19QREMpICYocFVTQVJULT5VU19SUFIpLAoJCXBCdWZmZXIsCgkJc3pCdWZmZXIsCgkJcE5leHRCdWZmZXIsCgkJc3pOZXh0QnVmZmVyKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTX1NldElyZGFGaWx0ZXIKLy8qIFxicmllZiBTZXQgdGhlIHZhbHVlIG9mIElyRGEgZmlsdGVyIHRyZWdpc3RlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVNfU2V0SXJkYUZpbHRlciAoCglBVDkxUFNfVVNBUlQgcFVTQVJULAoJdW5zaWduZWQgY2hhciB2YWx1ZQopCnsKCXBVU0FSVC0+VVNfSUYgPSB2YWx1ZTsKfQoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgU1NDCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKiBEZWZpbmUgdGhlIHN0YW5kYXJkIEkyUyBtb2RlIGNvbmZpZ3VyYXRpb24KCi8vKiBDb25maWd1cmF0aW9uIHRvIHNldCBpbiB0aGUgU1NDIFRyYW5zbWl0IENsb2NrIE1vZGUgUmVnaXN0ZXIKLy8qIFBhcmFtZXRlcnMgOiAgbmJfYml0X2J5X3Nsb3QgOiA4LCAxNiBvciAzMiBiaXRzCi8vKiAJCQkgIG5iX3Nsb3RfYnlfZnJhbWUgOiBudW1iZXIgb2YgY2hhbm5lbHMKI2RlZmluZSBBVDkxQ19JMlNfQVNZX01BU1RFUl9UWF9TRVRUSU5HKG5iX2JpdF9ieV9zbG90LCBuYl9zbG90X2J5X2ZyYW1lKSggK1wKCQkJCQkJCQkJICAgQVQ5MUNfU1NDX0NLU19ESVYgICArXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICBBVDkxQ19TU0NfQ0tPX0NPTlRJTk9VUyAgICAgICtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgIEFUOTFDX1NTQ19DS0dfTk9ORSAgICArXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVDkxQ19TU0NfU1RBUlRfRkFMTF9SRiArXAogICAgICAgICAgICAgICAgICAgICAgICAgICAJCQkgICBBVDkxQ19TU0NfU1RUT1VUICArXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkgICAoKDE8PDE2KSAmIEFUOTFDX1NTQ19TVFRETFkpICtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSAgICgoKChuYl9iaXRfYnlfc2xvdCpuYl9zbG90X2J5X2ZyYW1lKS8yKS0xKSA8PDI0KSkKCgovLyogQ29uZmlndXJhdGlvbiB0byBzZXQgaW4gdGhlIFNTQyBUcmFuc21pdCBGcmFtZSBNb2RlIFJlZ2lzdGVyCi8vKiBQYXJhbWV0ZXJzIDogbmJfYml0X2J5X3Nsb3QgOiA4LCAxNiBvciAzMiBiaXRzCi8vKiAJCQkgbmJfc2xvdF9ieV9mcmFtZSA6IG51bWJlciBvZiBjaGFubmVscwojZGVmaW5lIEFUOTFDX0kyU19BU1lfVFhfRlJBTUVfU0VUVElORyhuYl9iaXRfYnlfc2xvdCwgbmJfc2xvdF9ieV9mcmFtZSkoICtcCgkJCQkJCQkJCShuYl9iaXRfYnlfc2xvdC0xKSAgK1wKICAgICAgICAgICAgICAgICAgICAgICAgICAgIAkJQVQ5MUNfU1NDX01TQkYgICArXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgCQkoKChuYl9zbG90X2J5X2ZyYW1lLTEpPDw4KSAmIEFUOTFDX1NTQ19EQVROQikgICtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCSgoKG5iX2JpdF9ieV9zbG90LTEpPDwxNikgJiBBVDkxQ19TU0NfRlNMRU4pICtcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAJCUFUOTFDX1NTQ19GU09TX05FR0FUSVZFKQoKCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TU0NfU2V0QmF1ZHJhdGUKLy8qIFxicmllZiBTZXQgdGhlIGJhdWRyYXRlIGFjY29yZGluZyB0byB0aGUgQ1BVIGNsb2NrCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfU2V0QmF1ZHJhdGUgKAogICAgICAgIEFUOTFQU19TU0MgcFNTQywgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IG1haW5DbG9jaywgLy8gXGFyZyBwZXJpcGhlcmFsIGNsb2NrCiAgICAgICAgdW5zaWduZWQgaW50IHNwZWVkKSAgICAgLy8gXGFyZyBTU0MgYmF1ZHJhdGUKewogICAgICAgIHVuc2lnbmVkIGludCBiYXVkX3ZhbHVlOwogICAgICAgIC8vKiBEZWZpbmUgdGhlIGJhdWQgcmF0ZSBkaXZpc29yIHJlZ2lzdGVyCiAgICAgICAgaWYgKHNwZWVkID09IDApCiAgICAgICAgICAgYmF1ZF92YWx1ZSA9IDA7CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICBiYXVkX3ZhbHVlID0gKHVuc2lnbmVkIGludCkgKG1haW5DbG9jayAqIDEwKS8oMipzcGVlZCk7CiAgICAgICAgICAgaWYgKChiYXVkX3ZhbHVlICUgMTApID49IDUpCiAgICAgICAgICAgICAgICAgIGJhdWRfdmFsdWUgPSAoYmF1ZF92YWx1ZSAvIDEwKSArIDE7CiAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICBiYXVkX3ZhbHVlIC89IDEwOwogICAgICAgIH0KCiAgICAgICAgcFNTQy0+U1NDX0NNUiA9IGJhdWRfdmFsdWU7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TU0NfQ29uZmlndXJlCi8vKiBcYnJpZWYgQ29uZmlndXJlIFNTQwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0NvbmZpZ3VyZSAoCiAgICAgICAgICAgICBBVDkxUFNfU1NDIHBTU0MsICAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyCiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgc3lzdF9jbG9jaywgIC8vIFxhcmcgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeQogICAgICAgICAgICAgdW5zaWduZWQgaW50IGJhdWRfcmF0ZSwgICAvLyBcYXJnIEV4cGVjdGVkIEJhdWQgUmF0ZSBGcmVxdWVuY3kKICAgICAgICAgICAgIHVuc2lnbmVkIGludCBjbG9ja19yeCwgICAgLy8gXGFyZyBSZWNlaXZlciBDbG9jayBQYXJhbWV0ZXJzCiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZV9yeCwgICAgIC8vIFxhcmcgbW9kZSBSZWdpc3RlciB0byBiZSBwcm9ncmFtbWVkCiAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgY2xvY2tfdHgsICAgIC8vIFxhcmcgVHJhbnNtaXR0ZXIgQ2xvY2sgUGFyYW1ldGVycwogICAgICAgICAgICAgdW5zaWduZWQgaW50IG1vZGVfdHgpICAgICAvLyBcYXJnIG1vZGUgUmVnaXN0ZXIgdG8gYmUgcHJvZ3JhbW1lZAp7CiAgICAvLyogRGlzYWJsZSBpbnRlcnJ1cHRzCglwU1NDLT5TU0NfSURSID0gKHVuc2lnbmVkIGludCkgLTE7CgogICAgLy8qIFJlc2V0IHJlY2VpdmVyIGFuZCB0cmFuc21pdHRlcgoJcFNTQy0+U1NDX0NSID0gQVQ5MUNfU1NDX1NXUlNUIHwgQVQ5MUNfU1NDX1JYRElTIHwgQVQ5MUNfU1NDX1RYRElTIDsKCiAgICAvLyogRGVmaW5lIHRoZSBDbG9jayBNb2RlIFJlZ2lzdGVyCglBVDkxRl9TU0NfU2V0QmF1ZHJhdGUocFNTQywgc3lzdF9jbG9jaywgYmF1ZF9yYXRlKTsKCiAgICAgLy8qIFdyaXRlIHRoZSBSZWNlaXZlIENsb2NrIE1vZGUgUmVnaXN0ZXIKCXBTU0MtPlNTQ19SQ01SID0gIGNsb2NrX3J4OwoKICAgICAvLyogV3JpdGUgdGhlIFRyYW5zbWl0IENsb2NrIE1vZGUgUmVnaXN0ZXIKCXBTU0MtPlNTQ19UQ01SID0gIGNsb2NrX3R4OwoKICAgICAvLyogV3JpdGUgdGhlIFJlY2VpdmUgRnJhbWUgTW9kZSBSZWdpc3RlcgoJcFNTQy0+U1NDX1JGTVIgPSAgbW9kZV9yeDsKCiAgICAgLy8qIFdyaXRlIHRoZSBUcmFuc21pdCBGcmFtZSBNb2RlIFJlZ2lzdGVyCglwU1NDLT5TU0NfVEZNUiA9ICBtb2RlX3R4OwoKICAgIC8vKiBDbGVhciBUcmFuc21pdCBhbmQgUmVjZWl2ZSBDb3VudGVycwoJQVQ5MUZfUERDX09wZW4oKEFUOTFQU19QREMpICYocFNTQy0+U1NDX1JQUikpOwoKCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TU0NfRW5hYmxlUngKLy8qIFxicmllZiBFbmFibGUgcmVjZWl2aW5nIGRhdGFzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfRW5hYmxlUnggKAoJQVQ5MVBTX1NTQyBwU1NDKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXIKewogICAgLy8qIEVuYWJsZSByZWNlaXZlcgogICAgcFNTQy0+U1NDX0NSID0gQVQ5MUNfU1NDX1JYRU47Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TU0NfRGlzYWJsZVJ4Ci8vKiBcYnJpZWYgRGlzYWJsZSByZWNlaXZpbmcgZGF0YXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19EaXNhYmxlUnggKAoJQVQ5MVBTX1NTQyBwU1NDKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXIKewogICAgLy8qIERpc2FibGUgcmVjZWl2ZXIKICAgIHBTU0MtPlNTQ19DUiA9IEFUOTFDX1NTQ19SWERJUzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NTQ19FbmFibGVUeAovLyogXGJyaWVmIEVuYWJsZSBzZW5kaW5nIGRhdGFzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfRW5hYmxlVHggKAoJQVQ5MVBTX1NTQyBwU1NDKSAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXIKewogICAgLy8qIEVuYWJsZSAgdHJhbnNtaXR0ZXIKICAgIHBTU0MtPlNTQ19DUiA9IEFUOTFDX1NTQ19UWEVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0Rpc2FibGVUeAovLyogXGJyaWVmIERpc2FibGUgc2VuZGluZyBkYXRhcwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0Rpc2FibGVUeCAoCglBVDkxUFNfU1NDIHBTU0MpICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcgp7CiAgICAvLyogRGlzYWJsZSAgdHJhbnNtaXR0ZXIKICAgIHBTU0MtPlNTQ19DUiA9IEFUOTFDX1NTQ19UWERJUzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NTQ19FbmFibGVJdAovLyogXGJyaWVmIEVuYWJsZSBTU0MgSVQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NTQ19FbmFibGVJdCAoCglBVDkxUFNfU1NDIHBTU0MsIC8vIFxhcmcgcG9pbnRlciB0byBhIFNTQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGVuYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIKCXBTU0MtPlNTQ19JRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0Rpc2FibGVJdAovLyogXGJyaWVmIERpc2FibGUgU1NDIElUCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfRGlzYWJsZUl0ICgKCUFUOTFQU19TU0MgcFNTQywgLy8gXGFyZyBwb2ludGVyIHRvIGEgU1NDIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIFxhcmcgSVQgdG8gYmUgZGlzYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIKCXBTU0MtPlNTQ19JRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1NDX1JlY2VpdmVGcmFtZQovLyogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1NDX1JlY2VpdmVGcmFtZSAoCglBVDkxUFNfU1NDIHBTU0MsCgljaGFyICpwQnVmZmVyLAoJdW5zaWduZWQgaW50IHN6QnVmZmVyLAoJY2hhciAqcE5leHRCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pOZXh0QnVmZmVyICkKewoJcmV0dXJuIEFUOTFGX1BEQ19SZWNlaXZlRnJhbWUoCgkJKEFUOTFQU19QREMpICYocFNTQy0+U1NDX1JQUiksCgkJcEJ1ZmZlciwKCQlzekJ1ZmZlciwKCQlwTmV4dEJ1ZmZlciwKCQlzek5leHRCdWZmZXIpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1NDX1NlbmRGcmFtZQovLyogXGJyaWVmIFJldHVybiAyIGlmIFBEQyBoYXMgYmVlbiBpbml0aWFsaXplZCB3aXRoIEJ1ZmZlciBhbmQgTmV4dCBCdWZmZXIsIDEgaWYgUERDIGhhcyBiZWVuIGluaXRpYWxpemVkIHdpdGggTmV4dCBCdWZmZXIsIDAgaWYgUERDIGlzIGJ1c3kKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfU1NDX1NlbmRGcmFtZSgKCUFUOTFQU19TU0MgcFNTQywKCWNoYXIgKnBCdWZmZXIsCgl1bnNpZ25lZCBpbnQgc3pCdWZmZXIsCgljaGFyICpwTmV4dEJ1ZmZlciwKCXVuc2lnbmVkIGludCBzek5leHRCdWZmZXIgKQp7CglyZXR1cm4gQVQ5MUZfUERDX1NlbmRGcmFtZSgKCQkoQVQ5MVBTX1BEQykgJihwU1NDLT5TU0NfUlBSKSwKCQlwQnVmZmVyLAoJCXN6QnVmZmVyLAoJCXBOZXh0QnVmZmVyLAoJCXN6TmV4dEJ1ZmZlcik7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TU0NfR2V0SW50ZXJydXB0TWFza1N0YXR1cwovLyogXGJyaWVmIFJldHVybiBTU0MgSW50ZXJydXB0IE1hc2sgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1NTQ19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFNTQyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKICAgICAgICBBVDkxUFNfU1NDIHBTc2MpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcgp7CiAgICAgICAgcmV0dXJuIHBTc2MtPlNTQ19JTVI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TU0NfSXNJbnRlcnJ1cHRNYXNrZWQKLy8qIFxicmllZiBUZXN0IGlmIFNTQyBJbnRlcnJ1cHQgaXMgTWFza2VkIAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9TU0NfSXNJbnRlcnJ1cHRNYXNrZWQoCiAgICAgICAgQVQ5MVBTX1NTQyBwU3NjLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBTU0MgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9TU0NfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwU3NjKSAmIGZsYWcpOwp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBUV0kKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RXSV9FbmFibGVJdAovLyogXGJyaWVmIEVuYWJsZSBUV0kgSVQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RXSV9FbmFibGVJdCAoCglBVDkxUFNfVFdJIHBUV0ksIC8vIFxhcmcgcG9pbnRlciB0byBhIFRXSSBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIElUIHRvIGJlIGVuYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIKCXBUV0ktPlRXSV9JRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0Rpc2FibGVJdAovLyogXGJyaWVmIERpc2FibGUgVFdJIElUCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UV0lfRGlzYWJsZUl0ICgKCUFUOTFQU19UV0kgcFRXSSwgLy8gXGFyZyBwb2ludGVyIHRvIGEgVFdJIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIFxhcmcgSVQgdG8gYmUgZGlzYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIKCXBUV0ktPlRXSV9JRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0NvbmZpZ3VyZQovLyogXGJyaWVmIENvbmZpZ3VyZSBUV0kgaW4gbWFzdGVyIG1vZGUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RXSV9Db25maWd1cmUgKCBBVDkxUFNfVFdJIHBUV0kgKSAgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlcgp7CiAgICAvLyogRGlzYWJsZSBpbnRlcnJ1cHRzCglwVFdJLT5UV0lfSURSID0gKHVuc2lnbmVkIGludCkgLTE7CgogICAgLy8qIFJlc2V0IHBlcmlwaGVyYWwKCXBUV0ktPlRXSV9DUiA9IEFUOTFDX1RXSV9TV1JTVDsKCgkvLyogU2V0IE1hc3RlciBtb2RlCglwVFdJLT5UV0lfQ1IgPSBBVDkxQ19UV0lfTVNFTjsKCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UV0lfR2V0SW50ZXJydXB0TWFza1N0YXR1cwovLyogXGJyaWVmIFJldHVybiBUV0kgSW50ZXJydXB0IE1hc2sgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1RXSV9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFRXSSBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKICAgICAgICBBVDkxUFNfVFdJIHBUd2kpIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlcgp7CiAgICAgICAgcmV0dXJuIHBUd2ktPlRXSV9JTVI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UV0lfSXNJbnRlcnJ1cHRNYXNrZWQKLy8qIFxicmllZiBUZXN0IGlmIFRXSSBJbnRlcnJ1cHQgaXMgTWFza2VkIAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9UV0lfSXNJbnRlcnJ1cHRNYXNrZWQoCiAgICAgICAgQVQ5MVBTX1RXSSBwVHdpLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUV0kgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CiAgICAgICAgcmV0dXJuIChBVDkxRl9UV0lfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwVHdpKSAmIGZsYWcpOwp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBQV01DCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01fR2V0U3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFBXTSBJbnRlcnJ1cHQgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BXTUNfR2V0U3RhdHVzKCAvLyBccmV0dXJuIFBXTSBJbnRlcnJ1cHQgU3RhdHVzCglBVDkxUFNfUFdNQyBwUFdNKSAvLyBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIKewoJcmV0dXJuIHBQV00tPlBXTUNfU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01fSW50ZXJydXB0RW5hYmxlCi8vKiBcYnJpZWYgRW5hYmxlIFBXTSBJbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfSW50ZXJydXB0RW5hYmxlKAogICAgICAgIEFUOTFQU19QV01DIHBQd20sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIFBXTSBpbnRlcnJ1cHQgdG8gYmUgZW5hYmxlZAp7CiAgICAgICAgcFB3bS0+UFdNQ19JRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUFdNX0ludGVycnVwdERpc2FibGUKLy8qIFxicmllZiBEaXNhYmxlIFBXTSBJbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfSW50ZXJydXB0RGlzYWJsZSgKICAgICAgICBBVDkxUFNfUFdNQyBwUHdtLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBQV00gaW50ZXJydXB0IHRvIGJlIGRpc2FibGVkCnsKICAgICAgICBwUHdtLT5QV01DX0lEUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01fR2V0SW50ZXJydXB0TWFza1N0YXR1cwovLyogXGJyaWVmIFJldHVybiBQV00gSW50ZXJydXB0IE1hc2sgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BXTUNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBQV00gSW50ZXJydXB0IE1hc2sgU3RhdHVzCiAgICAgICAgQVQ5MVBTX1BXTUMgcFB3bSkgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyCnsKICAgICAgICByZXR1cm4gcFB3bS0+UFdNQ19JTVI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01fSXNJbnRlcnJ1cHRNYXNrZWQKLy8qIFxicmllZiBUZXN0IGlmIFBXTSBJbnRlcnJ1cHQgaXMgTWFza2VkCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1BXTUNfSXNJbnRlcnJ1cHRNYXNrZWQoCiAgICAgICAgQVQ5MVBTX1BXTUMgcFBXTSwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgUFdNIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewoJcmV0dXJuIChBVDkxRl9QV01DX0dldEludGVycnVwdE1hc2tTdGF0dXMocFBXTSkgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BXTV9Jc1N0YXR1c1NldAovLyogXGJyaWVmIFRlc3QgaWYgUFdNIEludGVycnVwdCBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfUFdNQ19Jc1N0YXR1c1NldCgKICAgICAgICBBVDkxUFNfUFdNQyBwUFdNLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CglyZXR1cm4gKEFUOTFGX1BXTUNfR2V0U3RhdHVzKHBQV00pICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01fQ2ZnQ2hhbm5lbAovLyogXGJyaWVmIFRlc3QgaWYgUFdNIEludGVycnVwdCBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ2ZnQ2hhbm5lbCgKICAgICAgICBBVDkxUFNfUFdNQyBwUFdNLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBjaGFubmVsSWQsIC8vIFxhcmcgUFdNIGNoYW5uZWwgSUQKICAgICAgICB1bnNpZ25lZCBpbnQgbW9kZSwgLy8gXGFyZyAgUFdNIG1vZGUKICAgICAgICB1bnNpZ25lZCBpbnQgcGVyaW9kLCAvLyBcYXJnIFBXTSBwZXJpb2QKICAgICAgICB1bnNpZ25lZCBpbnQgZHV0eSkgLy8gXGFyZyBQV00gZHV0eSBjeWNsZQp7CglwUFdNLT5QV01DX0NIW2NoYW5uZWxJZF0uUFdNQ19DTVIgPSBtb2RlOwoJcFBXTS0+UFdNQ19DSFtjaGFubmVsSWRdLlBXTUNfQ0RUWVIgPSBkdXR5OwoJcFBXTS0+UFdNQ19DSFtjaGFubmVsSWRdLlBXTUNfQ1BSRFIgPSBwZXJpb2Q7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01fU3RhcnRDaGFubmVsCi8vKiBcYnJpZWYgRW5hYmxlIGNoYW5uZWwKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfU3RhcnRDaGFubmVsKAogICAgICAgIEFUOTFQU19QV01DIHBQV00sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIENoYW5uZWxzIElEcyB0byBiZSBlbmFibGVkCnsKCXBQV00tPlBXTUNfRU5BID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BXTV9TdG9wQ2hhbm5lbAovLyogXGJyaWVmIERpc2FibGUgY2hhbm5lbAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19TdG9wQ2hhbm5lbCgKICAgICAgICBBVDkxUFNfUFdNQyBwUFdNLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBQV00gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBDaGFubmVscyBJRHMgdG8gYmUgZW5hYmxlZAp7CglwUFdNLT5QV01DX0RJUyA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01fVXBkYXRlQ2hhbm5lbAovLyogXGJyaWVmIFVwZGF0ZSBQZXJpb2Qgb3IgRHV0eSBDeWNsZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUFdNQ19VcGRhdGVDaGFubmVsKAogICAgICAgIEFUOTFQU19QV01DIHBQV00sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIFBXTSBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGNoYW5uZWxJZCwgLy8gXGFyZyBQV00gY2hhbm5lbCBJRAogICAgICAgIHVuc2lnbmVkIGludCB1cGRhdGUpIC8vIFxhcmcgIENoYW5uZWxzIElEcyB0byBiZSBlbmFibGVkCnsKCXBQV00tPlBXTUNfQ0hbY2hhbm5lbElkXS5QV01DX0NVUERSID0gdXBkYXRlOwp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBVRFAKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VEUF9FbmFibGVJdAovLyogXGJyaWVmIEVuYWJsZSBVRFAgSVQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FbmFibGVJdCAoCglBVDkxUFNfVURQIHBVRFAsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBlbmFibGVkCnsKCS8vKiBXcml0ZSB0byB0aGUgSUVSIHJlZ2lzdGVyCglwVURQLT5VRFBfSUVSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VEUF9EaXNhYmxlSXQKLy8qIFxicmllZiBEaXNhYmxlIFVEUCBJVAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0Rpc2FibGVJdCAoCglBVDkxUFNfVURQIHBVRFAsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gXGFyZyBJVCB0byBiZSBkaXNhYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlcgoJcFVEUC0+VURQX0lEUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfU2V0QWRkcmVzcwovLyogXGJyaWVmIFNldCBVRFAgZnVuY3Rpb25hbCBhZGRyZXNzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfU2V0QWRkcmVzcyAoCglBVDkxUFNfVURQIHBVRFAsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBhZGRyZXNzKSAgIC8vIFxhcmcgbmV3IFVEUCBhZGRyZXNzCnsKCXBVRFAtPlVEUF9GQUREUiA9IChBVDkxQ19VRFBfRkVOIHwgYWRkcmVzcyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRW5hYmxlRXAKLy8qIFxicmllZiBFbmFibGUgRW5kcG9pbnQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FbmFibGVFcCAoCglBVDkxUFNfVURQIHBVRFAsICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBlbmRwb2ludCkgICAvLyBcYXJnIGVuZHBvaW50IG51bWJlcgp7CglwVURQLT5VRFBfQ1NSW2VuZHBvaW50XSB8PSBBVDkxQ19VRFBfRVBFRFM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRGlzYWJsZUVwCi8vKiBcYnJpZWYgRW5hYmxlIEVuZHBvaW50Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRGlzYWJsZUVwICgKCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50KSAgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyCnsKCXBVRFAtPlVEUF9DU1JbZW5kcG9pbnRdICY9IH5BVDkxQ19VRFBfRVBFRFM7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfU2V0U3RhdGUKLy8qIFxicmllZiBTZXQgVURQIERldmljZSBzdGF0ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX1NldFN0YXRlICgKCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgICAvLyBcYXJnIG5ldyBVRFAgYWRkcmVzcwp7CglwVURQLT5VRFBfR0xCU1RBVEUgICY9IH4oQVQ5MUNfVURQX0ZBRERFTiB8IEFUOTFDX1VEUF9DT05GRyk7CglwVURQLT5VRFBfR0xCU1RBVEUgIHw9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfR2V0U3RhdGUKLy8qIFxicmllZiByZXR1cm4gVURQIERldmljZSBzdGF0ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VRFBfR2V0U3RhdGUgKCAvLyBccmV0dXJuIHRoZSBVRFAgZGV2aWNlIHN0YXRlCglBVDkxUFNfVURQIHBVRFApICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcgp7CglyZXR1cm4gKHBVRFAtPlVEUF9HTEJTVEFURSAgJiAoQVQ5MUNfVURQX0ZBRERFTiB8IEFUOTFDX1VEUF9DT05GRykpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX1Jlc2V0RXAKLy8qIFxicmllZiBSZXNldCBVRFAgZW5kcG9pbnQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9SZXNldEVwICggLy8gXHJldHVybiB0aGUgVURQIGRldmljZSBzdGF0ZQoJQVQ5MVBTX1VEUCBwVURQLCAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIFxhcmcgRW5kcG9pbnRzIHRvIGJlIHJlc2V0CnsKCXBVRFAtPlVEUF9SU1RFUCA9IGZsYWc7CglwVURQLT5VRFBfUlNURVAgPSAwOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX0VwU3RhbGwKLy8qIFxicmllZiBFbmRwb2ludCB3aWxsIFNUQUxMIHJlcXVlc3RzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRXBTdGFsbCgKCUFUOTFQU19VRFAgcFVEUCwgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50KSAgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyCnsKCXBVRFAtPlVEUF9DU1JbZW5kcG9pbnRdIHw9IEFUOTFDX1VEUF9GT1JDRVNUQUxMOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX0VwV3JpdGUKLy8qIFxicmllZiBXcml0ZSB2YWx1ZSBpbiB0aGUgRFBSCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRXBXcml0ZSgKCUFUOTFQU19VRFAgcFVEUCwgICAgICAgICAvLyBcYXJnIHBvaW50ZXIgdG8gYSBVRFAgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBlbmRwb2ludCwgIC8vIFxhcmcgZW5kcG9pbnQgbnVtYmVyCgl1bnNpZ25lZCBjaGFyIHZhbHVlKSAgICAgLy8gXGFyZyB2YWx1ZSB0byBiZSB3cml0dGVuIGluIHRoZSBEUFIKewoJcFVEUC0+VURQX0ZEUltlbmRwb2ludF0gPSB2YWx1ZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VEUF9FcFJlYWQKLy8qIFxicmllZiBSZXR1cm4gdmFsdWUgZnJvbSB0aGUgRFBSCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1VEUF9FcFJlYWQoCglBVDkxUFNfVURQIHBVRFAsICAgICAgICAgLy8gXGFyZyBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgZW5kcG9pbnQpICAvLyBcYXJnIGVuZHBvaW50IG51bWJlcgp7CglyZXR1cm4gcFVEUC0+VURQX0ZEUltlbmRwb2ludF07Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VRFBfRXBFbmRPZldyCi8vKiBcYnJpZWYgTm90aWZ5IHRoZSBVRFAgdGhhdCB2YWx1ZXMgaW4gRFBSIGFyZSByZWFkeSB0byBiZSBzZW50Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VRFBfRXBFbmRPZldyKAoJQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50KSAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXIKewoJcFVEUC0+VURQX0NTUltlbmRwb2ludF0gfD0gQVQ5MUNfVURQX1RYUEtUUkRZOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX0VwQ2xlYXIKLy8qIFxicmllZiBDbGVhciBmbGFnIGluIHRoZSBlbmRwb2ludCBDU1IgcmVnaXN0ZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VEUF9FcENsZWFyKAoJQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50LCAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXIKCXVuc2lnbmVkIGludCBmbGFnKSAgICAgICAvLyBcYXJnIGZsYWcgdG8gYmUgY2xlYXJlZAp7CglwVURQLT5VRFBfQ1NSW2VuZHBvaW50XSAmPSB+KGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX0VwU2V0Ci8vKiBcYnJpZWYgU2V0IGZsYWcgaW4gdGhlIGVuZHBvaW50IENTUiByZWdpc3RlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0VwU2V0KAoJQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50LCAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXIKCXVuc2lnbmVkIGludCBmbGFnKSAgICAgICAvLyBcYXJnIGZsYWcgdG8gYmUgY2xlYXJlZAp7CglwVURQLT5VRFBfQ1NSW2VuZHBvaW50XSB8PSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX0VwU3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBlbmRwb2ludCBDU1IgcmVnaXN0ZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVURQX0VwU3RhdHVzKAoJQVQ5MVBTX1VEUCBwVURQLCAgICAgICAgIC8vIFxhcmcgcG9pbnRlciB0byBhIFVEUCBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGVuZHBvaW50KSAgLy8gXGFyZyBlbmRwb2ludCBudW1iZXIKewoJcmV0dXJuIHBVRFAtPlVEUF9DU1JbZW5kcG9pbnRdOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX0dldEludGVycnVwdE1hc2tTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gVURQIEludGVycnVwdCBNYXNrIFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9VRFBfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBVRFAgSW50ZXJydXB0IE1hc2sgU3RhdHVzCiAgICAgICAgQVQ5MVBTX1VEUCBwVWRwKSAvLyBcYXJnICBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwVWRwLT5VRFBfSU1SOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX0lzSW50ZXJydXB0TWFza2VkCi8vKiBcYnJpZWYgVGVzdCBpZiBVRFAgSW50ZXJydXB0IGlzIE1hc2tlZCAKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSBpbnQgQVQ5MUZfVURQX0lzSW50ZXJydXB0TWFza2VkKAogICAgICAgIEFUOTFQU19VRFAgcFVkcCwgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgVURQIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewogICAgICAgIHJldHVybiAoQVQ5MUZfVURQX0dldEludGVycnVwdE1hc2tTdGF0dXMocFVkcCkgJiBmbGFnKTsKfQoKLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgVEMKICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RDX0ludGVycnVwdEVuYWJsZQovLyogXGJyaWVmIEVuYWJsZSBUQyBJbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RDX0ludGVycnVwdEVuYWJsZSgKICAgICAgICBBVDkxUFNfVEMgcFRjLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUQyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIFRDIGludGVycnVwdCB0byBiZSBlbmFibGVkCnsKICAgICAgICBwVGMtPlRDX0lFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UQ19JbnRlcnJ1cHREaXNhYmxlCi8vKiBcYnJpZWYgRGlzYWJsZSBUQyBJbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RDX0ludGVycnVwdERpc2FibGUoCiAgICAgICAgQVQ5MVBTX1RDIHBUYywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgVEMgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBUQyBpbnRlcnJ1cHQgdG8gYmUgZGlzYWJsZWQKewogICAgICAgIHBUYy0+VENfSURSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RDX0dldEludGVycnVwdE1hc2tTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gVEMgSW50ZXJydXB0IE1hc2sgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1RDX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gVEMgSW50ZXJydXB0IE1hc2sgU3RhdHVzCiAgICAgICAgQVQ5MVBTX1RDIHBUYykgLy8gXGFyZyAgcG9pbnRlciB0byBhIFRDIGNvbnRyb2xsZXIKewogICAgICAgIHJldHVybiBwVGMtPlRDX0lNUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RDX0lzSW50ZXJydXB0TWFza2VkCi8vKiBcYnJpZWYgVGVzdCBpZiBUQyBJbnRlcnJ1cHQgaXMgTWFza2VkIAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIGludCBBVDkxRl9UQ19Jc0ludGVycnVwdE1hc2tlZCgKICAgICAgICBBVDkxUFNfVEMgcFRjLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUQyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKICAgICAgICByZXR1cm4gKEFUOTFGX1RDX0dldEludGVycnVwdE1hc2tTdGF0dXMocFRjKSAmIGZsYWcpOwp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBDQU4KICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KI2RlZmluZQlTVEFOREFSRF9GT1JNQVQgMAojZGVmaW5lCUVYVEVOREVEX0ZPUk1BVCAxCgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfSW5pdE1haWxib3hSZWdpc3RlcnMoKQovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgY29ycmVzcG9uZGluZyBtYWlsYm94Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9Jbml0TWFpbGJveFJlZ2lzdGVycyhBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94LAoJCQkJCQkJCWludCAgCQkJbW9kZV9yZWcsCgkJCQkJCQkJaW50IAkJCWFjY2VwdGFuY2VfbWFza19yZWcsCgkJCQkJCQkJaW50ICAJCQlpZF9yZWcsCgkJCQkJCQkJaW50ICAJCQlkYXRhX2xvd19yZWcsCgkJCQkJCQkJaW50ICAJCQlkYXRhX2hpZ2hfcmVnLAoJCQkJCQkJCWludCAgCQkJY29udHJvbF9yZWcpCnsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTUNSIAk9IDB4MDsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTU1SIAk9IG1vZGVfcmVnOwoJQ0FOX01haWxib3gtPkNBTl9NQl9NQU0gCT0gYWNjZXB0YW5jZV9tYXNrX3JlZzsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTUlEIAk9IGlkX3JlZzsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTURMIAk9IGRhdGFfbG93X3JlZzsgCQkKCUNBTl9NYWlsYm94LT5DQU5fTUJfTURIIAk9IGRhdGFfaGlnaF9yZWc7CglDQU5fTWFpbGJveC0+Q0FOX01CX01DUiAJPSBjb250cm9sX3JlZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0VuYWJsZUNBTigpCi8vKiBcYnJpZWYgCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9FbmFibGVDQU4oCglBVDkxUFNfQ0FOIHBDQU4pICAgICAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIKewoJcENBTi0+Q0FOX01SIHw9IEFUOTFDX0NBTl9DQU5FTjsKCgkvLyBXYWl0IGZvciBXQUtFVVAgZmxhZyByYWlzaW5nIDw9PiAxMS1yZWNlc3NpdmUtYml0IHdlcmUgc2Nhbm5lZCBieSB0aGUgdHJhbnNjZWl2ZXIKCXdoaWxlKCAocENBTi0+Q0FOX1NSICYgQVQ5MUNfQ0FOX1dBS0VVUCkgIT0gQVQ5MUNfQ0FOX1dBS0VVUCApOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfRGlzYWJsZUNBTigpCi8vKiBcYnJpZWYgCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9EaXNhYmxlQ0FOKAoJQVQ5MVBTX0NBTiBwQ0FOKSAgICAgLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCnsKCXBDQU4tPkNBTl9NUiAmPSB+QVQ5MUNfQ0FOX0NBTkVOOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0VuYWJsZUl0Ci8vKiBcYnJpZWYgRW5hYmxlIENBTiBpbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9FbmFibGVJdCAoCglBVDkxUFNfQ0FOIHBDQU4sICAgICAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIElUIHRvIGJlIGVuYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIKCXBDQU4tPkNBTl9JRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0Rpc2FibGVJdAovLyogXGJyaWVmIERpc2FibGUgQ0FOIGludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0Rpc2FibGVJdCAoCglBVDkxUFNfQ0FOIHBDQU4sIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpIC8vIElUIHRvIGJlIGRpc2FibGVkCnsKCS8vKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyCglwQ0FOLT5DQU5fSURSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gQ0FOIEludGVycnVwdCBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldFN0YXR1cyggLy8gXHJldHVybiBDQU4gSW50ZXJydXB0IFN0YXR1cwoJQVQ5MVBTX0NBTiBwQ0FOKSAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIKewoJcmV0dXJuIHBDQU4tPkNBTl9TUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIENBTiBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldEludGVycnVwdE1hc2tTdGF0dXMoIC8vIFxyZXR1cm4gQ0FOIEludGVycnVwdCBNYXNrIFN0YXR1cwoJQVQ5MVBTX0NBTiBwQ0FOKSAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIKewoJcmV0dXJuIHBDQU4tPkNBTl9JTVI7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fSXNJbnRlcnJ1cHRNYXNrZWQKLy8qIFxicmllZiBUZXN0IGlmIENBTiBJbnRlcnJ1cHQgaXMgTWFza2VkIAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fSXNJbnRlcnJ1cHRNYXNrZWQoCiAgICAgICAgQVQ5MVBTX0NBTiBwQ0FOLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CglyZXR1cm4gKEFUOTFGX0NBTl9HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKHBDQU4pICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fSXNTdGF0dXNTZXQKLy8qIFxicmllZiBUZXN0IGlmIENBTiBJbnRlcnJ1cHQgaXMgU2V0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9Jc1N0YXR1c1NldCgKICAgICAgICBBVDkxUFNfQ0FOIHBDQU4sICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKCXJldHVybiAoQVQ5MUZfQ0FOX0dldFN0YXR1cyhwQ0FOKSAmIGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01vZGVSZWcKLy8qIFxicmllZiBDb25maWd1cmUgdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIENBTiBjb250cm9sbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTW9kZVJlZyAoCglBVDkxUFNfQ0FOIHBDQU4sIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgoJdW5zaWduZWQgaW50IG1vZGUpICAgICAgICAvLyBtb2RlIHJlZ2lzdGVyIAp7CgkvLyogV3JpdGUgdG8gdGhlIE1SIHJlZ2lzdGVyCglwQ0FOLT5DQU5fTVIgPSBtb2RlOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1vZGVSZWcKLy8qIFxicmllZiBSZXR1cm4gdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIENBTiBjb250cm9sbGVyIHZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNb2RlUmVnICgKCUFUOTFQU19DQU4gcENBTiAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIKCSkKewoJcmV0dXJuIHBDQU4tPkNBTl9NUjsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fQ2ZnQmF1ZHJhdGVSZWcKLy8qIFxicmllZiBDb25maWd1cmUgdGhlIEJhdWRyYXRlIG9mIHRoZSBDQU4gY29udHJvbGxlciBmb3IgdGhlIG5ldHdvcmsKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdCYXVkcmF0ZVJlZyAoCglBVDkxUFNfQ0FOIHBDQU4sIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGJhdWRyYXRlX2NmZykKewoJLy8qIFdyaXRlIHRvIHRoZSBCUiByZWdpc3RlcgoJcENBTi0+Q0FOX0JSID0gYmF1ZHJhdGVfY2ZnOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRCYXVkcmF0ZQovLyogXGJyaWVmIFJldHVybiB0aGUgQmF1ZHJhdGUgb2YgdGhlIENBTiBjb250cm9sbGVyIGZvciB0aGUgbmV0d29yayB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0QmF1ZHJhdGUgKAoJQVQ5MVBTX0NBTiBwQ0FOIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcENBTi0+Q0FOX0JSOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRJbnRlcm5hbENvdW50ZXIKLy8qIFxicmllZiBSZXR1cm4gQ0FOIFRpbWVyIFJlZ3NpdGVyIFZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRJbnRlcm5hbENvdW50ZXIgKAoJQVQ5MVBTX0NBTiBwQ0FOIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcENBTi0+Q0FOX1RJTTsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0VGltZXN0YW1wCi8vKiBcYnJpZWYgUmV0dXJuIENBTiBUaW1lc3RhbXAgUmVnaXN0ZXIgVmFsdWUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldFRpbWVzdGFtcCAoCglBVDkxUFNfQ0FOIHBDQU4gLy8gcG9pbnRlciB0byBhIENBTiBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQ0FOLT5DQU5fVElNRVNUUDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0RXJyb3JDb3VudGVyCi8vKiBcYnJpZWYgUmV0dXJuIENBTiBFcnJvciBDb3VudGVyIFJlZ2lzdGVyIFZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRFcnJvckNvdW50ZXIgKAoJQVQ5MVBTX0NBTiBwQ0FOIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcENBTi0+Q0FOX0VDUjsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fSW5pdFRyYW5zZmVyUmVxdWVzdAovLyogXGJyaWVmIFJlcXVlc3QgZm9yIGEgdHJhbnNmZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgbWFpbGJveGVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fSW5pdFRyYW5zZmVyUmVxdWVzdCAoCglBVDkxUFNfQ0FOIHBDQU4sIC8vIHBvaW50ZXIgdG8gYSBDQU4gY29udHJvbGxlcgogICAgdW5zaWduZWQgaW50IHRyYW5zZmVyX2NtZCkKewoJcENBTi0+Q0FOX1RDUiA9IHRyYW5zZmVyX2NtZDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fSW5pdEFib3J0UmVxdWVzdAovLyogXGJyaWVmIEFib3J0IHRoZSBjb3JyZXNwb25kaW5nIG1haWxib3hlcwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0luaXRBYm9ydFJlcXVlc3QgKAoJQVQ5MVBTX0NBTiBwQ0FOLCAvLyBwb2ludGVyIHRvIGEgQ0FOIGNvbnRyb2xsZXIKICAgIHVuc2lnbmVkIGludCBhYm9ydF9jbWQpCnsKCXBDQU4tPkNBTl9BQ1IgPSBhYm9ydF9jbWQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VNb2RlUmVnCi8vKiBcYnJpZWYgUHJvZ3JhbSB0aGUgTWVzc2FnZSBNb2RlIFJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZU1vZGVSZWcgKAoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCwgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94CiAgICB1bnNpZ25lZCBpbnQgbW9kZSkKewoJQ0FOX01haWxib3gtPkNBTl9NQl9NTVIgPSBtb2RlOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlTW9kZVJlZwovLyogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBNb2RlIFJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlTW9kZVJlZyAoCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94KSAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gKewoJcmV0dXJuIENBTl9NYWlsYm94LT5DQU5fTUJfTU1SOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9DZmdNZXNzYWdlSURSZWcKLy8qIFxicmllZiBQcm9ncmFtIHRoZSBNZXNzYWdlIElEIFJlZ2lzdGVyCi8vKiBcYnJpZWYgVmVyc2lvbiA9PSAwIGZvciBTdGFuZGFyZCBtZXNzc2FnZSwgVmVyc2lvbiA9PSAxIGZvciBFeHRlbmRlZCAgCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZUlEUmVnICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAogICAgdW5zaWduZWQgaW50IGlkLAogICAgdW5zaWduZWQgY2hhciB2ZXJzaW9uKQp7CglpZih2ZXJzaW9uPT0wKQkvLyBJRHZBIFN0YW5kYXJkIEZvcm1hdAoJCUNBTl9NYWlsYm94LT5DQU5fTUJfTUlEID0gaWQ8PDE4OwoJZWxzZQkvLyBJRHZCIEV4dGVuZGVkIEZvcm1hdAoJCUNBTl9NYWlsYm94LT5DQU5fTUJfTUlEID0gaWQgfCAoMTw8MjkpOwkvLyBzZXQgTUlERSBiaXQKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlSURSZWcKLy8qIFxicmllZiBSZXR1cm4gdGhlIE1lc3NhZ2UgSUQgUmVnaXN0ZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VJRFJlZyAoCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94KSAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gKewoJcmV0dXJuIENBTl9NYWlsYm94LT5DQU5fTUJfTUlEOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VBY2NlcHRhbmNlTWFza1JlZwovLyogXGJyaWVmIFByb2dyYW0gdGhlIE1lc3NhZ2UgQWNjZXB0YW5jZSBNYXNrIFJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZUFjY2VwdGFuY2VNYXNrUmVnICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAogICAgdW5zaWduZWQgaW50IG1hc2spCnsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTUFNID0gbWFzazsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRNZXNzYWdlQWNjZXB0YW5jZU1hc2tSZWcKLy8qIFxicmllZiBSZXR1cm4gdGhlIE1lc3NhZ2UgQWNjZXB0YW5jZSBNYXNrIFJlZ2lzdGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlQWNjZXB0YW5jZU1hc2tSZWcgKAoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCkgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94CnsKCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01BTTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0NBTl9HZXRGYW1pbHlJRAovLyogXGJyaWVmIFJldHVybiB0aGUgTWVzc2FnZSBJRCBSZWdpc3RlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0RmFtaWx5SUQgKAoJQVQ5MVBTX0NBTl9NQglDQU5fTWFpbGJveCkgLy8gcG9pbnRlciB0byBhIENBTiBNYWlsYm94CnsKCXJldHVybiBDQU5fTWFpbGJveC0+Q0FOX01CX01GSUQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VDdHJsCi8vKiBcYnJpZWYgUmVxdWVzdCBhbmQgY29uZmlnIGZvciBhIHRyYW5zZmVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIG1haWxib3gKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdNZXNzYWdlQ3RybFJlZyAoCglBVDkxUFNfQ0FOX01CCUNBTl9NYWlsYm94LCAvLyBwb2ludGVyIHRvIGEgQ0FOIE1haWxib3gKICAgIHVuc2lnbmVkIGludCBtZXNzYWdlX2N0cmxfY21kKQp7CglDQU5fTWFpbGJveC0+Q0FOX01CX01DUiA9IG1lc3NhZ2VfY3RybF9jbWQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gQ0FOIE1haWxib3ggU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0NBTl9HZXRNZXNzYWdlU3RhdHVzICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAp7CglyZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NU1I7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhTG93Ci8vKiBcYnJpZWYgUHJvZ3JhbSBkYXRhIGxvdyB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhTG93ICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAogICAgdW5zaWduZWQgaW50IGRhdGEpCnsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTURMID0gZGF0YTsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZURhdGFMb3cKLy8qIFxicmllZiBSZXR1cm4gZGF0YSBsb3cgdmFsdWUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX0dldE1lc3NhZ2VEYXRhTG93ICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAp7CglyZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NREw7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ01lc3NhZ2VEYXRhSGlnaAovLyogXGJyaWVmIFByb2dyYW0gZGF0YSBoaWdoIHZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnTWVzc2FnZURhdGFIaWdoICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gsIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAogICAgdW5zaWduZWQgaW50IGRhdGEpCnsKCUNBTl9NYWlsYm94LT5DQU5fTUJfTURIID0gZGF0YTsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fR2V0TWVzc2FnZURhdGFIaWdoCi8vKiBcYnJpZWYgUmV0dXJuIGRhdGEgaGlnaCB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9DQU5fR2V0TWVzc2FnZURhdGFIaWdoICgKCUFUOTFQU19DQU5fTUIJQ0FOX01haWxib3gpIC8vIHBvaW50ZXIgdG8gYSBDQU4gTWFpbGJveAp7CglyZXR1cm4gQ0FOX01haWxib3gtPkNBTl9NQl9NREg7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX09wZW4KLy8qIFxicmllZiBPcGVuIGEgQ0FOIFBvcnQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQ0FOX09wZW4gKAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBudWxsKSAgLy8gXGFyZwp7CiAgICAgICAgLyogTk9UIERFRklORUQgQVQgVEhJUyBNT01FTlQgKi8KICAgICAgICByZXR1cm4gKCAwICk7Cn0KLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICAgICAgICAgICAgIFNPRlRXQVJFIEFQSSBGT1IgQURDCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfRW5hYmxlSXQKLy8qIFxicmllZiBFbmFibGUgQURDIGludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0VuYWJsZUl0ICgKCUFUOTFQU19BREMgcEFEQywgICAgIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gSVQgdG8gYmUgZW5hYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlcgoJcEFEQy0+QURDX0lFUiA9IGZsYWc7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfRGlzYWJsZUl0Ci8vKiBcYnJpZWYgRGlzYWJsZSBBREMgaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfRGlzYWJsZUl0ICgKCUFUOTFQU19BREMgcEFEQywgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgZmxhZykgLy8gSVQgdG8gYmUgZGlzYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRFIgcmVnaXN0ZXIKCXBBREMtPkFEQ19JRFIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldFN0YXR1cwovLyogXGJyaWVmIFJldHVybiBBREMgSW50ZXJydXB0IFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0U3RhdHVzKCAvLyBccmV0dXJuIEFEQyBJbnRlcnJ1cHQgU3RhdHVzCglBVDkxUFNfQURDIHBBREMpIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgp7CglyZXR1cm4gcEFEQy0+QURDX1NSOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldEludGVycnVwdE1hc2tTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gQURDIEludGVycnVwdCBNYXNrIFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0SW50ZXJydXB0TWFza1N0YXR1cyggLy8gXHJldHVybiBBREMgSW50ZXJydXB0IE1hc2sgU3RhdHVzCglBVDkxUFNfQURDIHBBREMpIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgp7CglyZXR1cm4gcEFEQy0+QURDX0lNUjsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19Jc0ludGVycnVwdE1hc2tlZAovLyogXGJyaWVmIFRlc3QgaWYgQURDIEludGVycnVwdCBpcyBNYXNrZWQgCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19Jc0ludGVycnVwdE1hc2tlZCgKICAgICAgICBBVDkxUFNfQURDIHBBREMsICAgLy8gXGFyZyAgcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKCXJldHVybiAoQVQ5MUZfQURDX0dldEludGVycnVwdE1hc2tTdGF0dXMocEFEQykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19Jc1N0YXR1c1NldAovLyogXGJyaWVmIFRlc3QgaWYgQURDIFN0YXR1cyBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0lzU3RhdHVzU2V0KAogICAgICAgIEFUOTFQU19BREMgcEFEQywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewoJcmV0dXJuIChBVDkxRl9BRENfR2V0U3RhdHVzKHBBREMpICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfQ2ZnTW9kZVJlZwovLyogXGJyaWVmIENvbmZpZ3VyZSB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQURDIGNvbnRyb2xsZXIKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19DZmdNb2RlUmVnICgKCUFUOTFQU19BREMgcEFEQywgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgbW9kZSkgICAgICAgIC8vIG1vZGUgcmVnaXN0ZXIgCnsKCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXIKCXBBREMtPkFEQ19NUiA9IG1vZGU7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0TW9kZVJlZwovLyogXGJyaWVmIFJldHVybiB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgQURDIGNvbnRyb2xsZXIgdmFsdWUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldE1vZGVSZWcgKAoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcEFEQy0+QURDX01SOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19DZmdUaW1pbmdzCi8vKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBkaWZmZXJlbnQgbmVjZXNzYXJ5IHRpbWluZ3Mgb2YgdGhlIEFEQyBjb250cm9sbGVyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfQ2ZnVGltaW5ncyAoCglBVDkxUFNfQURDIHBBREMsIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IG1ja19jbG9jaywgLy8gaW4gTUh6IAoJdW5zaWduZWQgaW50IGFkY19jbG9jaywgLy8gaW4gTUh6IAoJdW5zaWduZWQgaW50IHN0YXJ0dXBfdGltZSwgLy8gaW4gdXMgCgl1bnNpZ25lZCBpbnQgc2FtcGxlX2FuZF9ob2xkX3RpbWUpCS8vIGluIG5zICAKewoJdW5zaWduZWQgaW50IHByZXNjYWwsc3RhcnR1cCxzaHRpbTsKCQoJcHJlc2NhbCA9IG1ja19jbG9jay8oMiphZGNfY2xvY2spIC0gMTsKCXN0YXJ0dXAgPSBhZGNfY2xvY2sqc3RhcnR1cF90aW1lLzggLSAxOwoJc2h0aW0gPSBhZGNfY2xvY2sqc2FtcGxlX2FuZF9ob2xkX3RpbWUvMTAwMCAtIDE7CgkKCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXIKCXBBREMtPkFEQ19NUiA9ICggKHByZXNjYWw8PDgpICYgQVQ5MUNfQURDX1BSRVNDQUwpIHwgKCAoc3RhcnR1cDw8MTYpICYgQVQ5MUNfQURDX1NUQVJUVVApIHwgKCAoc2h0aW08PDI0KSAmIEFUOTFDX0FEQ19TSFRJTSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfRW5hYmxlQ2hhbm5lbAovLyogXGJyaWVmIFJldHVybiBBREMgVGltZXIgUmVnaXN0ZXIgVmFsdWUKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FEQ19FbmFibGVDaGFubmVsICgKCUFUOTFQU19BREMgcEFEQywgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgY2hhbm5lbCkgICAgICAgIC8vIG1vZGUgcmVnaXN0ZXIgCnsKCS8vKiBXcml0ZSB0byB0aGUgQ0hFUiByZWdpc3RlcgoJcEFEQy0+QURDX0NIRVIgPSBjaGFubmVsOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0Rpc2FibGVDaGFubmVsCi8vKiBcYnJpZWYgUmV0dXJuIEFEQyBUaW1lciBSZWdpc3RlciBWYWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0Rpc2FibGVDaGFubmVsICgKCUFUOTFQU19BREMgcEFEQywgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgY2hhbm5lbCkgICAgICAgIC8vIG1vZGUgcmVnaXN0ZXIgCnsKCS8vKiBXcml0ZSB0byB0aGUgQ0hEUiByZWdpc3RlcgoJcEFEQy0+QURDX0NIRFIgPSBjaGFubmVsOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENoYW5uZWxTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gQURDIFRpbWVyIFJlZ2lzdGVyIFZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDaGFubmVsU3RhdHVzICgKCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCSkKewoJcmV0dXJuIHBBREMtPkFEQ19DSFNSOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19TdGFydENvbnZlcnNpb24KLy8qIFxicmllZiBTb2Z0d2FyZSByZXF1ZXN0IGZvciBhIGFuYWxvZyB0byBkaWdpdGFsIGNvbnZlcnNpb24gCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfU3RhcnRDb252ZXJzaW9uICgKCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCSkKewoJcEFEQy0+QURDX0NSID0gQVQ5MUNfQURDX1NUQVJUOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19Tb2Z0UmVzZXQKLy8qIFxicmllZiBTb2Z0d2FyZSByZXNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX1NvZnRSZXNldCAoCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgkpCnsKCXBBREMtPkFEQ19DUiA9IEFUOTFDX0FEQ19TV1JTVDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0TGFzdENvbnZlcnRlZERhdGEKLy8qIFxicmllZiBSZXR1cm4gdGhlIExhc3QgQ29udmVydGVkIERhdGEKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldExhc3RDb252ZXJ0ZWREYXRhICgKCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCSkKewoJcmV0dXJuIHBBREMtPkFEQ19MQ0RSOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gwCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDAgQ29udmVydGVkIERhdGEKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDAgKAoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcEFEQy0+QURDX0NEUjA7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDEKLy8qIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgMSBDb252ZXJ0ZWQgRGF0YQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMSAoCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQURDLT5BRENfQ0RSMTsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNIMgovLyogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCAyIENvbnZlcnRlZCBEYXRhCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gyICgKCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCSkKewoJcmV0dXJuIHBBREMtPkFEQ19DRFIyOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0gzCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDMgQ29udmVydGVkIERhdGEKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDMgKAoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcEFEQy0+QURDX0NEUjM7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDQKLy8qIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgNCBDb252ZXJ0ZWQgRGF0YQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINCAoCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQURDLT5BRENfQ0RSNDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINQovLyogXGJyaWVmIFJldHVybiB0aGUgQ2hhbm5lbCA1IENvbnZlcnRlZCBEYXRhCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g1ICgKCUFUOTFQU19BREMgcEFEQyAvLyBwb2ludGVyIHRvIGEgQURDIGNvbnRyb2xsZXIKCSkKewoJcmV0dXJuIHBBREMtPkFEQ19DRFI1OwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19HZXRDb252ZXJ0ZWREYXRhQ0g2Ci8vKiBcYnJpZWYgUmV0dXJuIHRoZSBDaGFubmVsIDYgQ29udmVydGVkIERhdGEKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDYgKAoJQVQ5MVBTX0FEQyBwQURDIC8vIHBvaW50ZXIgdG8gYSBBREMgY29udHJvbGxlcgoJKQp7CglyZXR1cm4gcEFEQy0+QURDX0NEUjY7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0dldENvbnZlcnRlZERhdGFDSDcKLy8qIFxicmllZiBSZXR1cm4gdGhlIENoYW5uZWwgNyBDb252ZXJ0ZWQgRGF0YQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRENfR2V0Q29udmVydGVkRGF0YUNINyAoCglBVDkxUFNfQURDIHBBREMgLy8gcG9pbnRlciB0byBhIEFEQyBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQURDLT5BRENfQ0RSNzsJCn0KCi8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgICAgICAgICAgICBTT0ZUV0FSRSBBUEkgRk9SIEFFUwogICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0VuYWJsZUl0Ci8vKiBcYnJpZWYgRW5hYmxlIEFFUyBpbnRlcnJ1cHQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19FbmFibGVJdCAoCglBVDkxUFNfQUVTIHBBRVMsICAgICAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAgIC8vIElUIHRvIGJlIGVuYWJsZWQKewoJLy8qIFdyaXRlIHRvIHRoZSBJRVIgcmVnaXN0ZXIKCXBBRVMtPkFFU19JRVIgPSBmbGFnOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0Rpc2FibGVJdAovLyogXGJyaWVmIERpc2FibGUgQUVTIGludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0Rpc2FibGVJdCAoCglBVDkxUFNfQUVTIHBBRVMsIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpIC8vIElUIHRvIGJlIGRpc2FibGVkCnsKCS8vKiBXcml0ZSB0byB0aGUgSURSIHJlZ2lzdGVyCglwQUVTLT5BRVNfSURSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19HZXRTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gQUVTIEludGVycnVwdCBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0dldFN0YXR1cyggLy8gXHJldHVybiBBRVMgSW50ZXJydXB0IFN0YXR1cwoJQVQ5MVBTX0FFUyBwQUVTKSAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIKewoJcmV0dXJuIHBBRVMtPkFFU19JU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cwovLyogXGJyaWVmIFJldHVybiBBRVMgSW50ZXJydXB0IE1hc2sgU3RhdHVzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX0FFU19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIEFFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKCUFUOTFQU19BRVMgcEFFUykgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCnsKCXJldHVybiBwQUVTLT5BRVNfSU1SOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0lzSW50ZXJydXB0TWFza2VkCi8vKiBcYnJpZWYgVGVzdCBpZiBBRVMgSW50ZXJydXB0IGlzIE1hc2tlZCAKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfQUVTX0lzSW50ZXJydXB0TWFza2VkKAogICAgICAgIEFUOTFQU19BRVMgcEFFUywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewoJcmV0dXJuIChBVDkxRl9BRVNfR2V0SW50ZXJydXB0TWFza1N0YXR1cyhwQUVTKSAmIGZsYWcpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0lzU3RhdHVzU2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBBRVMgU3RhdHVzIGlzIFNldAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfSXNTdGF0dXNTZXQoCiAgICAgICAgQVQ5MVBTX0FFUyBwQUVTLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcgogICAgICAgIHVuc2lnbmVkIGludCBmbGFnKSAvLyBcYXJnICBmbGFnIHRvIGJlIHRlc3RlZAp7CglyZXR1cm4gKEFUOTFGX0FFU19HZXRTdGF0dXMocEFFUykgJiBmbGFnKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19DZmdNb2RlUmVnCi8vKiBcYnJpZWYgQ29uZmlndXJlIHRoZSBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBBRVMgY29udHJvbGxlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX0NmZ01vZGVSZWcgKAoJQVQ5MVBTX0FFUyBwQUVTLCAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBtb2RlKSAgICAgICAgLy8gbW9kZSByZWdpc3RlciAKewoJLy8qIFdyaXRlIHRvIHRoZSBNUiByZWdpc3RlcgoJcEFFUy0+QUVTX01SID0gbW9kZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19HZXRNb2RlUmVnCi8vKiBcYnJpZWYgUmV0dXJuIHRoZSBNb2RlIFJlZ2lzdGVyIG9mIHRoZSBBRVMgY29udHJvbGxlciB2YWx1ZQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfR2V0TW9kZVJlZyAoCglBVDkxUFNfQUVTIHBBRVMgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwQUVTLT5BRVNfTVI7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUVTX1N0YXJ0UHJvY2Vzc2luZwovLyogXGJyaWVmIFN0YXJ0IEVuY3J5cHRpb24gb3IgRGVjcnlwdGlvbgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUVTX1N0YXJ0UHJvY2Vzc2luZyAoCglBVDkxUFNfQUVTIHBBRVMgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCgkpCnsKCXBBRVMtPkFFU19DUiA9IEFUOTFDX0FFU19TVEFSVDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BRVNfU29mdFJlc2V0Ci8vKiBcYnJpZWYgUmVzZXQgQUVTCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfU29mdFJlc2V0ICgKCUFUOTFQU19BRVMgcEFFUyAvLyBwb2ludGVyIHRvIGEgQUVTIGNvbnRyb2xsZXIKCSkKewoJcEFFUy0+QUVTX0NSID0gQVQ5MUNfQUVTX1NXUlNUOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19Mb2FkTmV3U2VlZAovLyogXGJyaWVmIExvYWQgTmV3IFNlZWQgaW4gdGhlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfTG9hZE5ld1NlZWQgKAoJQVQ5MVBTX0FFUyBwQUVTIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcgoJKQp7CglwQUVTLT5BRVNfQ1IgPSBBVDkxQ19BRVNfTE9BRFNFRUQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUVTX1NldENyeXB0b0tleQovLyogXGJyaWVmIFNldCBDcnlwdG9ncmFwaGljIEtleSB4Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfU2V0Q3J5cHRvS2V5ICgKCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGluZGV4LAoJdW5zaWduZWQgaW50IGtleXdvcmQKCSkKewoJcEFFUy0+QUVTX0tFWVd4UltpbmRleF0gPSBrZXl3b3JkOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19JbnB1dERhdGEKLy8qIFxicmllZiBTZXQgSW5wdXQgRGF0YSB4Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRVNfSW5wdXREYXRhICgKCUFUOTFQU19BRVMgcEFFUywgLy8gcG9pbnRlciB0byBhIEFFUyBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGluZGV4LAoJdW5zaWduZWQgaW50IGluZGF0YQoJKQp7CglwQUVTLT5BRVNfSURBVEF4UltpbmRleF0gPSBpbmRhdGE7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQUVTX0dldE91dHB1dERhdGEKLy8qIFxicmllZiBHZXQgT3V0cHV0IERhdGEgeAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9BRVNfR2V0T3V0cHV0RGF0YSAoCglBVDkxUFNfQUVTIHBBRVMsIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBpbmRleAoJKQp7CglyZXR1cm4gcEFFUy0+QUVTX09EQVRBeFJbaW5kZXhdOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19TZXRJbml0aWFsaXphdGlvblZlY3RvcgovLyogXGJyaWVmIFNldCBJbml0aWFsaXphdGlvbiBWZWN0b3IgKG9yIENvdW50ZXIpIHgKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19TZXRJbml0aWFsaXphdGlvblZlY3RvciAoCglBVDkxUFNfQUVTIHBBRVMsIC8vIHBvaW50ZXIgdG8gYSBBRVMgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBpbmRleCwKCXVuc2lnbmVkIGludCBpbml0dmVjdG9yCgkpCnsKCXBBRVMtPkFFU19JVnhSW2luZGV4XSA9IGluaXR2ZWN0b3I7CQp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgU09GVFdBUkUgQVBJIEZPUiBUREVTCiAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0VuYWJsZUl0Ci8vKiBcYnJpZWYgRW5hYmxlIFRERVMgaW50ZXJydXB0Ci8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX0VuYWJsZUl0ICgKCUFUOTFQU19UREVTIHBUREVTLCAgICAgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgoJdW5zaWduZWQgaW50IGZsYWcpICAgLy8gSVQgdG8gYmUgZW5hYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElFUiByZWdpc3RlcgoJcFRERVMtPlRERVNfSUVSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RERVNfRGlzYWJsZUl0Ci8vKiBcYnJpZWYgRGlzYWJsZSBUREVTIGludGVycnVwdAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19EaXNhYmxlSXQgKAoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGludCBmbGFnKSAvLyBJVCB0byBiZSBkaXNhYmxlZAp7CgkvLyogV3JpdGUgdG8gdGhlIElEUiByZWdpc3RlcgoJcFRERVMtPlRERVNfSURSID0gZmxhZzsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RERVNfR2V0U3RhdHVzCi8vKiBcYnJpZWYgUmV0dXJuIFRERVMgSW50ZXJydXB0IFN0YXR1cwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0dldFN0YXR1cyggLy8gXHJldHVybiBUREVTIEludGVycnVwdCBTdGF0dXMKCUFUOTFQU19UREVTIHBUREVTKSAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyCnsKCXJldHVybiBwVERFUy0+VERFU19JU1I7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0dldEludGVycnVwdE1hc2tTdGF0dXMKLy8qIFxicmllZiBSZXR1cm4gVERFUyBJbnRlcnJ1cHQgTWFzayBTdGF0dXMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19HZXRJbnRlcnJ1cHRNYXNrU3RhdHVzKCAvLyBccmV0dXJuIFRERVMgSW50ZXJydXB0IE1hc2sgU3RhdHVzCglBVDkxUFNfVERFUyBwVERFUykgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgp7CglyZXR1cm4gcFRERVMtPlRERVNfSU1SOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVERFU19Jc0ludGVycnVwdE1hc2tlZAovLyogXGJyaWVmIFRlc3QgaWYgVERFUyBJbnRlcnJ1cHQgaXMgTWFza2VkIAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0lzSW50ZXJydXB0TWFza2VkKAogICAgICAgIEFUOTFQU19UREVTIHBUREVTLCAgIC8vIFxhcmcgIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIKICAgICAgICB1bnNpZ25lZCBpbnQgZmxhZykgLy8gXGFyZyAgZmxhZyB0byBiZSB0ZXN0ZWQKewoJcmV0dXJuIChBVDkxRl9UREVTX0dldEludGVycnVwdE1hc2tTdGF0dXMocFRERVMpICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0lzU3RhdHVzU2V0Ci8vKiBcYnJpZWYgVGVzdCBpZiBUREVTIFN0YXR1cyBpcyBTZXQKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB1bnNpZ25lZCBpbnQgQVQ5MUZfVERFU19Jc1N0YXR1c1NldCgKICAgICAgICBBVDkxUFNfVERFUyBwVERFUywgICAvLyBcYXJnICBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyCiAgICAgICAgdW5zaWduZWQgaW50IGZsYWcpIC8vIFxhcmcgIGZsYWcgdG8gYmUgdGVzdGVkCnsKCXJldHVybiAoQVQ5MUZfVERFU19HZXRTdGF0dXMocFRERVMpICYgZmxhZyk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0NmZ01vZGVSZWcKLy8qIFxicmllZiBDb25maWd1cmUgdGhlIE1vZGUgUmVnaXN0ZXIgb2YgdGhlIFRERVMgY29udHJvbGxlcgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19DZmdNb2RlUmVnICgKCUFUOTFQU19UREVTIHBUREVTLCAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyCgl1bnNpZ25lZCBpbnQgbW9kZSkgICAgICAgIC8vIG1vZGUgcmVnaXN0ZXIgCnsKCS8vKiBXcml0ZSB0byB0aGUgTVIgcmVnaXN0ZXIKCXBUREVTLT5UREVTX01SID0gbW9kZTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RERVNfR2V0TW9kZVJlZwovLyogXGJyaWVmIFJldHVybiB0aGUgTW9kZSBSZWdpc3RlciBvZiB0aGUgVERFUyBjb250cm9sbGVyIHZhbHVlCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdW5zaWduZWQgaW50IEFUOTFGX1RERVNfR2V0TW9kZVJlZyAoCglBVDkxUFNfVERFUyBwVERFUyAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyCgkpCnsKCXJldHVybiBwVERFUy0+VERFU19NUjsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX1N0YXJ0UHJvY2Vzc2luZwovLyogXGJyaWVmIFN0YXJ0IEVuY3J5cHRpb24gb3IgRGVjcnlwdGlvbgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19TdGFydFByb2Nlc3NpbmcgKAoJQVQ5MVBTX1RERVMgcFRERVMgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgoJKQp7CglwVERFUy0+VERFU19DUiA9IEFUOTFDX1RERVNfU1RBUlQ7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVERFU19Tb2Z0UmVzZXQKLy8qIFxicmllZiBSZXNldCBUREVTCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UREVTX1NvZnRSZXNldCAoCglBVDkxUFNfVERFUyBwVERFUyAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyCgkpCnsKCXBUREVTLT5UREVTX0NSID0gQVQ5MUNfVERFU19TV1JTVDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX1NldENyeXB0b0tleTEKLy8qIFxicmllZiBTZXQgQ3J5cHRvZ3JhcGhpYyBLZXkgMSBXb3JkIHgKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MSAoCglBVDkxUFNfVERFUyBwVERFUywgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBpbmRleCwKCXVuc2lnbmVkIGludCBrZXl3b3JkCgkpCnsKCXBUREVTLT5UREVTX0tFWTFXeFJbaW5kZXhdID0ga2V5d29yZDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX1NldENyeXB0b0tleTIKLy8qIFxicmllZiBTZXQgQ3J5cHRvZ3JhcGhpYyBLZXkgMiBXb3JkIHgKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MiAoCglBVDkxUFNfVERFUyBwVERFUywgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBpbmRleCwKCXVuc2lnbmVkIGludCBrZXl3b3JkCgkpCnsKCXBUREVTLT5UREVTX0tFWTJXeFJbaW5kZXhdID0ga2V5d29yZDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX1NldENyeXB0b0tleTMKLy8qIFxicmllZiBTZXQgQ3J5cHRvZ3JhcGhpYyBLZXkgMyBXb3JkIHgKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfU2V0Q3J5cHRvS2V5MyAoCglBVDkxUFNfVERFUyBwVERFUywgLy8gcG9pbnRlciB0byBhIFRERVMgY29udHJvbGxlcgoJdW5zaWduZWQgY2hhciBpbmRleCwKCXVuc2lnbmVkIGludCBrZXl3b3JkCgkpCnsKCXBUREVTLT5UREVTX0tFWTNXeFJbaW5kZXhdID0ga2V5d29yZDsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0lucHV0RGF0YQovLyogXGJyaWVmIFNldCBJbnB1dCBEYXRhIHgKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfSW5wdXREYXRhICgKCUFUOTFQU19UREVTIHBUREVTLCAvLyBwb2ludGVyIHRvIGEgVERFUyBjb250cm9sbGVyCgl1bnNpZ25lZCBjaGFyIGluZGV4LAoJdW5zaWduZWQgaW50IGluZGF0YQoJKQp7CglwVERFUy0+VERFU19JREFUQXhSW2luZGV4XSA9IGluZGF0YTsJCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UREVTX0dldE91dHB1dERhdGEKLy8qIFxicmllZiBHZXQgT3V0cHV0IERhdGEgeAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHVuc2lnbmVkIGludCBBVDkxRl9UREVTX0dldE91dHB1dERhdGEgKAoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgaW5kZXgKCSkKewoJcmV0dXJuIHBUREVTLT5UREVTX09EQVRBeFJbaW5kZXhdOwkKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RERVNfU2V0SW5pdGlhbGl6YXRpb25WZWN0b3IKLy8qIFxicmllZiBTZXQgSW5pdGlhbGl6YXRpb24gVmVjdG9yIHgKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RERVNfU2V0SW5pdGlhbGl6YXRpb25WZWN0b3IgKAoJQVQ5MVBTX1RERVMgcFRERVMsIC8vIHBvaW50ZXIgdG8gYSBUREVTIGNvbnRyb2xsZXIKCXVuc2lnbmVkIGNoYXIgaW5kZXgsCgl1bnNpZ25lZCBpbnQgaW5pdHZlY3RvcgoJKQp7CglwVERFUy0+VERFU19JVnhSW2luZGV4XSA9IGluaXR2ZWN0b3I7CQp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfREJHVV9DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBEQkdVCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9EQkdVX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TWVMpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0RCR1VfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBEQkdVIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0RCR1VfQ2ZnUElPICh2b2lkKQp7CgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjdfRFJYRCAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyOF9EVFhEICAgICksIC8vIFBlcmlwaGVyYWwgQQoJCTApOyAvLyBQZXJpcGhlcmFsIEIKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BNQ19DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBQTUMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BNQ19DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1lTKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QTUNfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBQTUMgc2lnbmFscwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUE1DX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjMwX1BDSzIgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjlfUENLMSAgICApLCAvLyBQZXJpcGhlcmFsIEEKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyMF9QQ0swICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjBfUENLMCAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyMl9QQ0syICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjIxX1BDSzEgICAgKSk7IC8vIFBlcmlwaGVyYWwgQgoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCTAsIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTMwX1BDSzIgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTNfUENLMSAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyN19QQ0szICAgICkpOyAvLyBQZXJpcGhlcmFsIEIKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1ZSRUdfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVlJFRwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVlJFR19DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1lTKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9SU1RDX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFJTVEMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1JTVENfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NZUykpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1NDX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFNTQwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfU1NDX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TU0MpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NTQ19DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFNTQyBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TU0NfQ2ZnUElPICh2b2lkKQp7CgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjVfUksgICAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyMl9USyAgICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTIxX1RGICAgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjRfUkQgICAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyNl9SRiAgICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTIzX1REICAgICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJMCk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfV0RUQ19DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBXRFRDCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9XRFRDX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TWVMpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTMV9DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBVUzEKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1VTMV9DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfVVMxKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9VUzFfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBVUzEgc2lnbmFscwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVMxX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCTAsIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI2X1JJMSAgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjRfRFNSMSAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyM19EQ0QxICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI1X0RUUjEgICAgKSk7IC8vIFBlcmlwaGVyYWwgQgoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTdfU0NLMSAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE4X1JUUzEgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBNl9UWEQxICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTVfUlhEMSAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE5X0NUUzEgICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJMCk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVVMwX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFVTMAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVVMwX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9VUzApKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1VTMF9DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFVTMCBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9VUzBfQ2ZnUElPICh2b2lkKQp7CgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJCUFUOTFDX0JBU0VfUElPQSwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMF9SWEQwICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTRfQ1RTMCAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEzX1JUUzAgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMl9TQ0swICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTFfVFhEMCAgICApLCAvLyBQZXJpcGhlcmFsIEEKCQkwKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUEkxX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFNQSTEKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSTFfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NQSTEpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1NQSTFfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBTUEkxIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1NQSTFfQ2ZnUElPICh2b2lkKQp7CgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJMCwgLy8gUGVyaXBoZXJhbCBBCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTZfTlBDUzEzICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxMF9OUENTMTEgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjExX05QQ1MxMiAgKSk7IC8vIFBlcmlwaGVyYWwgQgoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCTAsIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTRfTlBDUzEzICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyOV9OUENTMTMgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTIxX05QQ1MxMCAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjJfU1BDSzEgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyNV9OUENTMTEgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTJfTlBDUzExICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyNF9NSVNPMSAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTNfTlBDUzEyICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyNl9OUENTMTIgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTIzX01PU0kxICAgKSk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfU1BJMF9DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBTUEkwCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUEkwX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TUEkwKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9TUEkwX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgU1BJMCBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9TUEkwX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCTAsIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjEzX05QQ1MwMSAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTdfTlBDUzAzICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxNF9OUENTMDIgICkpOyAvLyBQZXJpcGhlcmFsIEIKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExNl9NSVNPMCAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTEzX05QQ1MwMSAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTVfTlBDUzAzICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExN19NT1NJMCAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE4X1NQQ0swICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMTRfTlBDUzAyICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExMl9OUENTMDAgICksIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTdfTlBDUzAxICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEE5X05QQ1MwMyAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBOF9OUENTMDIgICkpOyAvLyBQZXJpcGhlcmFsIEIKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJVENfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUElUQwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElUQ19DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfU1lTKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgQUlDCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BSUNfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX0ZJUSkgfAoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX0lSUTApIHwKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9JUlExKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9BSUNfQ2ZnUElPCi8vKiBcYnJpZWYgQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBkcml2ZSBBSUMgc2lnbmFscwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQUlDX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTMwX0lSUTAgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BBMjlfRklRICAgICApLCAvLyBQZXJpcGhlcmFsIEEKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExNF9JUlExICAgICkpOyAvLyBQZXJpcGhlcmFsIEIKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FFU19DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBBRVMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0FFU19DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfQUVTKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UV0lfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVFdJCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UV0lfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1RXSSkpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVFdJX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgVFdJIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RXSV9DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEExMV9UV0NLICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTEwX1RXRCAgICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJMCk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQURDX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIEFEQwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfQURDX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9BREMpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX0FEQ19DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIEFEQyBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9BRENfQ2ZnUElPICh2b2lkKQp7CgkvLyBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIHBlcmlwaCBtb2RlCglBVDkxRl9QSU9fQ2ZnUGVyaXBoKAoJCUFUOTFDX0JBU0VfUElPQiwgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJMCwgLy8gUGVyaXBoZXJhbCBBCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMThfQURUUkcgICApKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01DX0NIM19DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFBXTUNfQ0gzIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ0gzX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjIyX1BXTTMgICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMzBfUFdNMyAgICApKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01DX0NIMl9DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFBXTUNfQ0gyIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ0gyX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjIxX1BXTTIgICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjlfUFdNMiAgICApKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01DX0NIMV9DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFBXTUNfQ0gxIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ0gxX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjIwX1BXTTEgICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjhfUFdNMSAgICApKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9QV01DX0NIMF9DZmdQSU8KLy8qIFxicmllZiBDb25maWd1cmUgUElPIGNvbnRyb2xsZXJzIHRvIGRyaXZlIFBXTUNfQ0gwIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1BXTUNfQ0gwX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE5X1BXTTAgICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMjdfUFdNMCAgICApKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9SVFRDX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFJUVEMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1JUVENfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1NZUykpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVURQX0NmZ1BNQwovLyogXGJyaWVmIEVuYWJsZSBQZXJpcGhlcmFsIGNsb2NrIGluIFBNQyBmb3IgIFVEUAovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVURQX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9VRFApKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1RERVNfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVERFUwovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfVERFU19DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfVERFUykpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfRU1BQ19DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBFTUFDCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9FTUFDX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9FTUFDKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9FTUFDX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgRU1BQyBzaWduYWxzCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9FTUFDX0NmZ1BJTyAodm9pZCkKewoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0IsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjJfRVRYMCAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxMl9FVFhFUiAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjE2X0VDT0wgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTFfRVRYMyAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEI2X0VSWDEgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTVfRVJYRFYgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxM19FUlgyICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjNfRVRYMSAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEI4X0VNREMgICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCNV9FUlgwICAgICkgfAoJCS8vKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMThfRUYxMDAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxNF9FUlgzICAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjRfRUNSU19FQ1JTRFYpIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIxX0VUWEVOICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTBfRVRYMiAgICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIwX0VUWENLX0VSRUZDSykgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjlfRU1ESU8gICApIHwKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEI3X0VSWEVSICAgKSB8CgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTdfRVJYQ0sgICApLCAvLyBQZXJpcGhlcmFsIEEKCQkwKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UQzBfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVEMwCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzBfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1RDMCkpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVEMwX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgVEMwIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RDMF9DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyM19USU9BMCAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI0X1RJT0IwICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTJfVENMSzAgICApKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UQzFfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVEMxCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzFfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1RDMSkpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVEMxX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgVEMxIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RDMV9DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyNV9USU9BMSAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI2X1RJT0IxICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJKCh1bnNpZ25lZCBpbnQpIEFUOTFDX1BCMTlfVENMSzEgICApKTsgLy8gUGVyaXBoZXJhbCBCCn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9UQzJfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgVEMyCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9UQzJfQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX1RDMikpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfVEMyX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgVEMyIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX1RDMl9DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9CLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEIyOF9USU9CMiAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQjI3X1RJT0EyICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJMCk7IC8vIFBlcmlwaGVyYWwgQgoJLy8gQ29uZmlndXJlIFBJTyBjb250cm9sbGVycyB0byBwZXJpcGggbW9kZQoJQVQ5MUZfUElPX0NmZ1BlcmlwaCgKCQlBVDkxQ19CQVNFX1BJT0EsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCTAsIC8vIFBlcmlwaGVyYWwgQQoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE1X1RDTEsyICAgKSk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfTUNfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgTUMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX01DX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9TWVMpKTsKfQoKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyogXGZuICAgIEFUOTFGX1BJT0FfQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgUElPQQovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCl9faW5saW5lIHZvaWQgQVQ5MUZfUElPQV9DZmdQTUMgKHZvaWQpCnsKCUFUOTFGX1BNQ19FbmFibGVQZXJpcGhDbG9jaygKCQlBVDkxQ19CQVNFX1BNQywgLy8gUElPIGNvbnRyb2xsZXIgYmFzZSBhZGRyZXNzCgkJKCh1bnNpZ25lZCBpbnQpIDEgPDwgQVQ5MUNfSURfUElPQSkpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUElPQl9DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBQSU9CCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QSU9CX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9QSU9CKSk7Cn0KCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8qIFxmbiAgICBBVDkxRl9DQU5fQ2ZnUE1DCi8vKiBcYnJpZWYgRW5hYmxlIFBlcmlwaGVyYWwgY2xvY2sgaW4gUE1DIGZvciAgQ0FOCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9DQU5fQ2ZnUE1DICh2b2lkKQp7CglBVDkxRl9QTUNfRW5hYmxlUGVyaXBoQ2xvY2soCgkJQVQ5MUNfQkFTRV9QTUMsIC8vIFBJTyBjb250cm9sbGVyIGJhc2UgYWRkcmVzcwoJCSgodW5zaWduZWQgaW50KSAxIDw8IEFUOTFDX0lEX0NBTikpOwp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfQ0FOX0NmZ1BJTwovLyogXGJyaWVmIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gZHJpdmUgQ0FOIHNpZ25hbHMKLy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpfX2lubGluZSB2b2lkIEFUOTFGX0NBTl9DZmdQSU8gKHZvaWQpCnsKCS8vIENvbmZpZ3VyZSBQSU8gY29udHJvbGxlcnMgdG8gcGVyaXBoIG1vZGUKCUFUOTFGX1BJT19DZmdQZXJpcGgoCgkJQVQ5MUNfQkFTRV9QSU9BLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgQVQ5MUNfUEEyMF9DQU5UWCAgICkgfAoJCSgodW5zaWduZWQgaW50KSBBVDkxQ19QQTE5X0NBTlJYICAgKSwgLy8gUGVyaXBoZXJhbCBBCgkJMCk7IC8vIFBlcmlwaGVyYWwgQgp9CgovLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vKiBcZm4gICAgQVQ5MUZfUFdNQ19DZmdQTUMKLy8qIFxicmllZiBFbmFibGUgUGVyaXBoZXJhbCBjbG9jayBpbiBQTUMgZm9yICBQV01DCi8vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KX19pbmxpbmUgdm9pZCBBVDkxRl9QV01DX0NmZ1BNQyAodm9pZCkKewoJQVQ5MUZfUE1DX0VuYWJsZVBlcmlwaENsb2NrKAoJCUFUOTFDX0JBU0VfUE1DLCAvLyBQSU8gY29udHJvbGxlciBiYXNlIGFkZHJlc3MKCQkoKHVuc2lnbmVkIGludCkgMSA8PCBBVDkxQ19JRF9QV01DKSk7Cn0KCiNlbmRpZiAvLyBsaWJfQVQ5MVNBTTdYMTI4X0gK