LyoKICogJFhGcmVlODY6ICQKICoKICogQ29weXJpZ2h0IKkgMjAwMCBUdW9tYXMgSi4gTHVra2EKICoKICogUGVybWlzc2lvbiB0byB1c2UsIGNvcHksIG1vZGlmeSwgZGlzdHJpYnV0ZSwgYW5kIHNlbGwgdGhpcyBzb2Z0d2FyZSBhbmQgaXRzCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGlzIGhlcmVieSBncmFudGVkIHdpdGhvdXQgZmVlLCBwcm92aWRlZCB0aGF0CiAqIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzIGFuZCB0aGF0IGJvdGggdGhhdAogKiBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBzdXBwb3J0aW5nCiAqIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIFR1b21hcyBMdWtrYSBub3QgYmUgdXNlZCBpbgogKiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlIHNvZnR3YXJlIHdpdGhvdXQKICogc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIFR1b21hcyBMdWtrYSBtYWtlcyBubwogKiByZXByZXNlbnRhdGlvbnMgYWJvdXQgdGhlIHN1aXRhYmlsaXR5IG9mIHRoaXMgc29mdHdhcmUgZm9yIGFueSBwdXJwb3NlLiAgSXQKICogaXMgcHJvdmlkZWQgImFzIGlzIiB3aXRob3V0IGV4cHJlc3Mgb3IgaW1wbGllZCB3YXJyYW50eS4KICoKICogVFVPTUFTIExVS0tBIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLAogKiBJTkNMVURJTkcgQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PCiAqIEVWRU5UIFNIQUxMIFRVT01BUyBMVUtLQSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUgogKiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwKICogREFUQSBPUiBQUk9GSVRTLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUgogKiBUT1JUSU9VUyBBQ1RJT04sIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SCiAqIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuCiAqLwoKI2luY2x1ZGUgPG1hdGguaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgImZjaW50LmgiCgpGY01hdHJpeCAqCkZjTWF0cml4Q29weSAoY29uc3QgRmNNYXRyaXggKm1hdCkgCnsKICAgIEZjTWF0cml4ICpyOwogICAgaWYoIW1hdCkgCglyZXR1cm4gMDsKICAgIHIgPSAoRmNNYXRyaXggKikgbWFsbG9jIChzaXplb2YgKCpyKSApOwogICAgaWYgKCFyKQoJcmV0dXJuIDA7CiAgICBGY01lbUFsbG9jIChGQ19NRU1fTUFUUklYLCBzaXplb2YgKEZjTWF0cml4KSk7CiAgICAqciA9ICptYXQ7CiAgICByZXR1cm4gcjsKfQoKdm9pZApGY01hdHJpeEZyZWUgKEZjTWF0cml4ICptYXQpCnsKICAgIEZjTWVtRnJlZSAoRkNfTUVNX01BVFJJWCwgc2l6ZW9mIChGY01hdHJpeCkpOwogICAgZnJlZSAobWF0KTsKfQoKRmNCb29sCkZjTWF0cml4RXF1YWwgKGNvbnN0IEZjTWF0cml4ICptYXQxLCBjb25zdCBGY01hdHJpeCAqbWF0MikKewogICAgaWYobWF0MSA9PSBtYXQyKSByZXR1cm4gRmNUcnVlOwogICAgaWYobWF0MSA9PSAwIHx8IG1hdDIgPT0gMCkgcmV0dXJuIEZjRmFsc2U7CiAgICByZXR1cm4gbWF0MS0+eHggPT0gbWF0Mi0+eHggJiYgCgkgICBtYXQxLT54eSA9PSBtYXQyLT54eSAmJgoJICAgbWF0MS0+eXggPT0gbWF0Mi0+eXggJiYKCSAgIG1hdDEtPnl5ID09IG1hdDItPnl5Owp9Cgp2b2lkCkZjTWF0cml4TXVsdGlwbHkgKEZjTWF0cml4ICpyZXN1bHQsIGNvbnN0IEZjTWF0cml4ICphLCBjb25zdCBGY01hdHJpeCAqYikKewogICAgRmNNYXRyaXgJcjsKCiAgICByLnh4ID0gYS0+eHggKiBiLT54eCArIGEtPnh5ICogYi0+eXg7CiAgICByLnh5ID0gYS0+eHggKiBiLT54eSArIGEtPnh5ICogYi0+eXk7CiAgICByLnl4ID0gYS0+eXggKiBiLT54eCArIGEtPnl5ICogYi0+eXg7CiAgICByLnl5ID0gYS0+eXggKiBiLT54eSArIGEtPnl5ICogYi0+eXk7CiAgICAqcmVzdWx0ID0gcjsKfQoKdm9pZApGY01hdHJpeFJvdGF0ZSAoRmNNYXRyaXggKm0sIGRvdWJsZSBjLCBkb3VibGUgcykKewogICAgRmNNYXRyaXgJcjsKCiAgICAvKgogICAgICogWCBDb29yZGluYXRlIHN5c3RlbSBpcyB1cHNpZGUgZG93biwgc3dhcCB0byBtYWtlCiAgICAgKiByb3RhdGlvbnMgY291bnRlcmNsb2Nrd2lzZQogICAgICovCiAgICByLnh4ID0gYzsKICAgIHIueHkgPSAtczsKICAgIHIueXggPSBzOwogICAgci55eSA9IGM7CiAgICBGY01hdHJpeE11bHRpcGx5IChtLCAmciwgbSk7Cn0KCnZvaWQKRmNNYXRyaXhTY2FsZSAoRmNNYXRyaXggKm0sIGRvdWJsZSBzeCwgZG91YmxlIHN5KQp7CiAgICBGY01hdHJpeAlyOwoKICAgIHIueHggPSBzeDsKICAgIHIueHkgPSAwOwogICAgci55eCA9IDA7CiAgICByLnl5ID0gc3k7CiAgICBGY01hdHJpeE11bHRpcGx5IChtLCAmciwgbSk7Cn0KCnZvaWQKRmNNYXRyaXhTaGVhciAoRmNNYXRyaXggKm0sIGRvdWJsZSBzaCwgZG91YmxlIHN2KQp7CiAgICBGY01hdHJpeAlyOwoKICAgIHIueHggPSAxOwogICAgci54eSA9IHNoOwogICAgci55eCA9IHN2OwogICAgci55eSA9IDE7CiAgICBGY01hdHJpeE11bHRpcGx5IChtLCAmciwgbSk7Cn0K