LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KLyogVmlkZW8gc3VwcG9ydCBmb3IgRXBzb24gU0VEMTM4MDYgY2hpcHNldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2luY2x1ZGUgPGNvbW1vbi5oPgoKI2lmZGVmIENPTkZJR19WSURFT19TRUQxMzgwNgoKI2luY2x1ZGUgPHZpZGVvX2ZiLmg+CiNpbmNsdWRlIDxzZWQxMzgwNi5oPgoKI2RlZmluZSByZWFkQnl0ZShwdHJSZWcpICAgICAgICAgICAgICAgIFwKICAgICoodm9sYXRpbGUgdW5zaWduZWQgY2hhciAqKShzZWQxMzgwNi5pc2FCYXNlICsgcHRyUmVnKQoKI2RlZmluZSB3cml0ZUJ5dGUocHRyUmVnLHZhbHVlKSBcCiAgICAqKHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKikoc2VkMTM4MDYuaXNhQmFzZSArIHB0clJlZykgPSB2YWx1ZQoKI2lmZGVmIENPTkZJR19UT1RBTDUyMDAKI2RlZmluZSB3cml0ZVdvcmQocHRyUmVnLHZhbHVlKSBcCiAgICAoKih2b2xhdGlsZSB1bnNpZ25lZCBzaG9ydCAqKShzZWQxMzgwNi5pc2FCYXNlICsgcHRyUmVnKSA9IHZhbHVlKQojZWxzZQojZGVmaW5lIHdyaXRlV29yZChwdHJSZWcsdmFsdWUpIFwKICAgICgqKHZvbGF0aWxlIHVuc2lnbmVkIHNob3J0ICopKHNlZDEzODA2LmlzYUJhc2UgKyBwdHJSZWcpID0gKCh2YWx1ZSA+PiA4ICkgJiAweGZmKSB8ICgodmFsdWUgPDwgOCkgJiAweGZmMDApKQojZW5kaWYKCkdyYXBoaWNEZXZpY2Ugc2VkMTM4MDY7CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIEVwc29uU2V0UmVncyAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwpzdGF0aWMgdm9pZCBFcHNvblNldFJlZ3MgKHZvaWQpCnsKICAgIC8qIHRoZSBjb250ZW50IG9mIHRoZSBjaGlwc2V0IHJlZ2lzdGVyIGRlcGVuZHMgb24gdGhlIGJvYXJkIChjbG9ja3MsIC4uLikqLwogICAgY29uc3QgUzFEX1JFR1MgKnByZWcgPSBib2FyZF9nZXRfcmVncyAoKTsKICAgIHdoaWxlIChwcmVnIC0+IEluZGV4KSB7Cgl3cml0ZUJ5dGUgKHByZWcgLT4gSW5kZXgsIHByZWcgLT4gVmFsdWUpOwoJcHJlZyArKzsKICAgIH0KfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiB2aWRlb19od19pbml0IC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnZvaWQgKnZpZGVvX2h3X2luaXQgKHZvaWQpCnsKICAgIHVuc2lnbmVkIGludCAqdm0sIGk7CgogICAgbWVtc2V0ICgmc2VkMTM4MDYsIDAsIHNpemVvZiAoR3JhcGhpY0RldmljZSkpOwoKICAgIC8qIEluaXRpYWxpemF0aW9uIG9mIHRoZSBhY2Nlc3MgdG8gdGhlIGdyYXBoaWMgY2hpcHNldAogICAgICAgUmV0cmVpdmUgYmFzZSBhZGRyZXNzIG9mIHRoZSBjaGlwc2V0CiAgICAgICAoc2VlIGJvYXJkL1JQWENsYXNzaWMvZWNjeC5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmICgoc2VkMTM4MDYuaXNhQmFzZSA9IGJvYXJkX3ZpZGVvX2luaXQgKCkpID09IDApIHsKCXJldHVybiAoTlVMTCk7CiAgICB9CgogICAgc2VkMTM4MDYuZnJhbWVBZHJzID0gc2VkMTM4MDYuaXNhQmFzZSArIEZSQU1FX0JVRkZFUl9PRkZTRVQ7CiAgICBzZWQxMzgwNi53aW5TaXplWCA9IGJvYXJkX2dldF93aWR0aCAoKTsKICAgIHNlZDEzODA2LndpblNpemVZID0gYm9hcmRfZ2V0X2hlaWdodCAoKTsKCiNpZiBkZWZpbmVkKENPTkZJR19WSURFT19TRUQxMzgwNl84QlBQKQogICAgc2VkMTM4MDYuZ2RmSW5kZXggPSBHREZfXzhCSVRfSU5ERVg7CiAgICBzZWQxMzgwNi5nZGZCeXRlc1BQID0gMTsKCiNlbGlmIGRlZmluZWQoQ09ORklHX1ZJREVPX1NFRDEzODA2XzE2QlBQKQogICAgc2VkMTM4MDYuZ2RmSW5kZXggPSBHREZfMTZCSVRfNTY1UkdCOwogICAgc2VkMTM4MDYuZ2RmQnl0ZXNQUCA9IDI7CgojZWxzZQojZXJyb3IgVW5zdXBwb3J0ZWQgU0VEMTM4MDYgQlBQCiNlbmRpZgoKICAgIHNlZDEzODA2Lm1lbVNpemUgPSBzZWQxMzgwNi53aW5TaXplWCAqIHNlZDEzODA2LndpblNpemVZICogc2VkMTM4MDYuZ2RmQnl0ZXNQUDsKCiAgICAvKiBMb2FkIFNFRCByZWdpc3RlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIEVwc29uU2V0UmVncyAoKTsKCiAgICAvKiAoc2VlIGJvYXJkL1JQWENsYXNzaWMvUlBYQ2xhc3NpYy5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGJvYXJkX3ZhbGlkYXRlX3NjcmVlbiAoc2VkMTM4MDYuaXNhQmFzZSk7CgogICAgLyogQ2xlYXIgdmlkZW8gbWVtb3J5ICovCiAgICBpID0gc2VkMTM4MDYubWVtU2l6ZS80OwogICAgdm0gPSAodW5zaWduZWQgaW50ICopc2VkMTM4MDYuZnJhbWVBZHJzOwogICAgd2hpbGUoaS0tKQoJKnZtKysgPSAwOwoKCiAgICByZXR1cm4gKCZzZWQxMzgwNik7Cn0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBFcHNvbl93YWl0X2lkbGUgLS0gV2FpdCBmb3IgaGFyZHdhcmUgdG8gYmVjb21lIGlkbGUKICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kc3RhdGljIHZvaWQgRXBzb25fd2FpdF9pZGxlICh2b2lkKQp7CiAgICB3aGlsZSAocmVhZEJ5dGUgKEJMVF9DVFJMMCkgJiAweDgwKTsKCiAgICAvKiBSZWFkIGEgd29yZCBpbiB0aGUgQml0QkxUIG1lbW9yeSBhcmVhIHRvIHNodXRkb3duIHRoZSBCaXRCTFQgZW5naW5lICAgKi8KICAgICoodm9sYXRpbGUgdW5zaWduZWQgc2hvcnQgKikoc2VkMTM4MDYuaXNhQmFzZSArIEJMVF9SRUcpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHZpZGVvX2h3X2JpdGJsdCAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwp2b2lkIHZpZGVvX2h3X2JpdGJsdCAoCiAgICB1bnNpZ25lZCBpbnQgYnBwLCAgICAgICAgICAgICAvKiBieXRlcyBwZXIgcGl4ZWwgKi8KICAgIHVuc2lnbmVkIGludCBzcmNfeCwgICAgICAgICAgIC8qIHNvdXJjZSBwb3MgeCAqLwogICAgdW5zaWduZWQgaW50IHNyY195LCAgICAgICAgICAgLyogc291cmNlIHBvcyB5ICovCiAgICB1bnNpZ25lZCBpbnQgZHN0X3gsICAgICAgICAgICAvKiBkZXN0IHBvcyB4ICovCiAgICB1bnNpZ25lZCBpbnQgZHN0X3ksICAgICAgICAgICAvKiBkZXN0IHBvcyB5ICovCiAgICB1bnNpZ25lZCBpbnQgZGltX3gsICAgICAgICAgICAvKiBmcmFtZSB3aWR0aCAqLwogICAgdW5zaWduZWQgaW50IGRpbV95ICAgICAgICAgICAgLyogZnJhbWUgaGVpZ2h0ICovCiAgICApCnsKICAgIHJlZ2lzdGVyIEdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopJnNlZDEzODA2OwogICAgdW5zaWduZWQgbG9uZwlzcmNBZGRyLCBkc3RBZGRyOwogICAgdW5zaWduZWQgaW50IHN0cmlkZSA9IGJwcCAqIHBHRCAtPiB3aW5TaXplWDsKCiAgICBzcmNBZGRyID0gKHNyY195ICogc3RyaWRlKSArIChzcmNfeCAqIGJwcCk7CiAgICBkc3RBZGRyID0gKGRzdF95ICogc3RyaWRlKSArIChkc3RfeCAqIGJwcCk7CgogICAgRXBzb25fd2FpdF9pZGxlICgpOwoKICAgIHdyaXRlQnl0ZShCTFRfUk9QLDB4MEMpOwkvKiBzb3VyY2UgKi8KICAgIHdyaXRlQnl0ZShCTFRfT1AsMHgwMik7LyogbW92ZSBibGl0IGluIHBvc2l0aXZlIGRpcmVjdGlvbiB3aXRoIFJPUCAqLwogICAgd3JpdGVXb3JkKEJMVF9NRU1fT0ZGMCwgc3RyaWRlIC8gMik7CiAgICBpZiAocEdEIC0+IGdkZkluZGV4ID09IEdERl9fOEJJVF9JTkRFWCkgewoJd3JpdGVCeXRlKEJMVF9DVFJMMSwweDAwKTsKICAgIH0KICAgIGVsc2UgewoJd3JpdGVCeXRlKEJMVF9DVFJMMSwweDAxKTsKICAgIH0KCiAgICB3cml0ZVdvcmQoQkxUX1dJRFRIMCwoZGltX3ggLSAxKSk7CiAgICB3cml0ZVdvcmQoQkxUX0hFSUdIVDAsKGRpbV95IC0gMSkpOwoKICAgIC8qIHNldCB1cCBibGl0IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgd3JpdGVCeXRlKEJMVF9TUkNfQUREUjAsc3JjQWRkcik7CiAgICB3cml0ZUJ5dGUoQkxUX1NSQ19BRERSMSxzcmNBZGRyPj44KTsKICAgIHdyaXRlQnl0ZShCTFRfU1JDX0FERFIyLHNyY0FkZHI+PjE2KTsKCiAgICB3cml0ZUJ5dGUoQkxUX0RTVF9BRERSMCxkc3RBZGRyKTsKICAgIHdyaXRlQnl0ZShCTFRfRFNUX0FERFIxLGRzdEFkZHI+PjgpOwogICAgd3JpdGVCeXRlKEJMVF9EU1RfQUREUjIsZHN0QWRkcj4+MTYpOwoKICAgIC8qIEVuZ2FnZSB0aGUgYmx0IGVuZ2luZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgLyogcmVjdGFuZ3VsYXIgcmVnaW9uIGZvciBzcmMgYW5kIGRzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB3cml0ZUJ5dGUoQkxUX0NUUkwwLDB4ODApOwoKICAgIC8qIHdhaXQgdW50aWxsIGN1cnJlbnQgYmxpdHMgZmluaXNoZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgRXBzb25fd2FpdF9pZGxlICgpOwp9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogdmlkZW9faHdfcmVjdGZpbGwgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kdm9pZCB2aWRlb19od19yZWN0ZmlsbCAoCiAgICB1bnNpZ25lZCBpbnQgYnBwLCAgICAgICAgICAgICAvKiBieXRlcyBwZXIgcGl4ZWwgKi8KICAgIHVuc2lnbmVkIGludCBkc3RfeCwgICAgICAgICAgIC8qIGRlc3QgcG9zIHggKi8KICAgIHVuc2lnbmVkIGludCBkc3RfeSwgICAgICAgICAgIC8qIGRlc3QgcG9zIHkgKi8KICAgIHVuc2lnbmVkIGludCBkaW1feCwgICAgICAgICAgIC8qIGZyYW1lIHdpZHRoICovCiAgICB1bnNpZ25lZCBpbnQgZGltX3ksICAgICAgICAgICAvKiBmcmFtZSBoZWlnaHQgKi8KICAgIHVuc2lnbmVkIGludCBjb2xvciAgICAgICAgICAgIC8qIGZpbGwgY29sb3IgKi8KICAgICApCnsKICAgIHJlZ2lzdGVyIEdyYXBoaWNEZXZpY2UgKnBHRCA9IChHcmFwaGljRGV2aWNlICopJnNlZDEzODA2OwogICAgdW5zaWduZWQgbG9uZwlkc3RBZGRyOwogICAgdW5zaWduZWQgaW50IHN0cmlkZSA9IGJwcCAqIHBHRCAtPiB3aW5TaXplWDsKCiAgICBkc3RBZGRyID0gKGRzdF95ICogc3RyaWRlKSArIChkc3RfeCAqIGJwcCk7CgogICAgRXBzb25fd2FpdF9pZGxlICgpOwoKICAgIC8qIHNldCB1cCBibGl0IHJlZ2lzdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgd3JpdGVCeXRlKEJMVF9EU1RfQUREUjAsZHN0QWRkcik7CiAgICB3cml0ZUJ5dGUoQkxUX0RTVF9BRERSMSxkc3RBZGRyPj44KTsKICAgIHdyaXRlQnl0ZShCTFRfRFNUX0FERFIyLGRzdEFkZHI+PjE2KTsKCiAgICB3cml0ZVdvcmQoQkxUX1dJRFRIMCwoZGltX3ggLSAxKSk7CiAgICB3cml0ZVdvcmQoQkxUX0hFSUdIVDAsKGRpbV95IC0gMSkpOwogICAgd3JpdGVXb3JkKEJMVF9GR0NPTE9SMCxjb2xvcik7CgogICAgd3JpdGVCeXRlKEJMVF9PUCwweDBDKTsgIC8qIHNvbGlkIGZpbGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB3cml0ZVdvcmQoQkxUX01FTV9PRkYwLHN0cmlkZSAvIDIpOwoKICAgIGlmIChwR0QgLT4gZ2RmSW5kZXggPT0gR0RGX184QklUX0lOREVYKSB7Cgl3cml0ZUJ5dGUoQkxUX0NUUkwxLDB4MDApOwogICAgfQogICAgZWxzZSB7Cgl3cml0ZUJ5dGUoQkxUX0NUUkwxLDB4MDEpOwogICAgfQoKICAgIC8qIEVuZ2FnZSB0aGUgYmx0IGVuZ2luZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgLyogcmVjdGFuZ3VsYXIgcmVnaW9uIGZvciBzcmMgYW5kIGRzdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICB3cml0ZUJ5dGUoQkxUX0NUUkwwLDB4ODApOwoKICAgIC8qIHdhaXQgdW50aWxsIGN1cnJlbnQgYmxpdHMgZmluaXNoZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgRXBzb25fd2FpdF9pZGxlICgpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHZpZGVvX3NldF9sdXQgLS0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKi8Kdm9pZCB2aWRlb19zZXRfbHV0ICgKICAgIHVuc2lnbmVkIGludCBpbmRleCwgICAgICAgICAgIC8qIGNvbG9yIG51bWJlciAqLwogICAgdW5zaWduZWQgY2hhciByLCAgICAgICAgICAgICAgLyogcmVkICovCiAgICB1bnNpZ25lZCBjaGFyIGcsICAgICAgICAgICAgICAvKiBncmVlbiAqLwogICAgdW5zaWduZWQgY2hhciBiICAgICAgICAgICAgICAgLyogYmx1ZSAqLwogICAgKQp7CiAgICB3cml0ZUJ5dGUoUkVHX0xVVF9BRERSLCBpbmRleCApOwogICAgd3JpdGVCeXRlKFJFR19MVVRfREFUQSwgcik7CiAgICB3cml0ZUJ5dGUoUkVHX0xVVF9EQVRBLCBnKTsKICAgIHdyaXRlQnl0ZShSRUdfTFVUX0RBVEEsIGIpOwp9CiNpZmRlZiBDT05GSUdfVklERU9fSFdfQ1VSU09SCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogdmlkZW9fc2V0X2h3X2N1cnNvciAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwp2b2lkIHZpZGVvX3NldF9od19jdXJzb3IgKGludCB4LCBpbnQgeSkKewogICAgd3JpdGVCeXRlIChMQ0RfQ1VSU09SX1hMLCAoeCAmIDB4ZmYpKTsKICAgIHdyaXRlQnl0ZSAoTENEX0NVUlNPUl9YTSwgKHggPj4gOCkpOwogICAgd3JpdGVCeXRlIChMQ0RfQ1VSU09SX1lMLCAoeSAmIDB4ZmYpKTsKICAgIHdyaXRlQnl0ZSAoTENEX0NVUlNPUl9ZTSwgKHkgPj4gOCkpOwp9CgovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIHZpZGVvX2luaXRfaHdfY3Vyc29yIC0tCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICovCnZvaWQgdmlkZW9faW5pdF9od19jdXJzb3IgKGludCBmb250X3dpZHRoLCBpbnQgZm9udF9oZWlnaHQpCnsKICAgIHZvbGF0aWxlIHVuc2lnbmVkIGNoYXIgKnB0cjsKICAgIHVuc2lnbmVkIGNoYXIgcGF0dGVybjsKICAgIGludCBpOwoKCiAgICAvKiBJbml0IGN1cnNvciBjb250ZW50CiAgICAgICBDdXJzb3Igc2l6ZSBpcyA2NHg2NCBwaXhlbHMKICAgICAgIFN0YXJ0IG9mIHRoZSBjdXJzb3IgbWVtb3J5IGRlcGVuZHMgb24gcGFuZWwgdHlwZSAoZHVhbCBwYW5lbCAuLi4pICAgICAqLwogICAgaWYgKChpID0gcmVhZEJ5dGUgKExDRF9DVVJTT1JfU1RBUlQpKSA9PSAwKSB7CglwdHIgPSAodW5zaWduZWQgY2hhciAqKShzZWQxMzgwNi5mcmFtZUFkcnMgKyBERUZBVUxUX1ZJREVPX01FTU9SWV9TSVpFIC0gSFdDVVJTT1JTSVpFKTsKICAgIH0KICAgIGVsc2UgewoJcHRyID0gKHVuc2lnbmVkIGNoYXIgKikoc2VkMTM4MDYuZnJhbWVBZHJzICsgREVGQVVMVF9WSURFT19NRU1PUllfU0laRSAtIChpICogODE5MikpOwogICAgfQoKICAgIC8qIEZpbGwgdGhlIGZpcnN0IGxpbmUgYW5kIHRoZSBmaXJzdCBlbXB0eSBsaW5lIGFmdGVyIGN1cnNvciAgICAgICAgICAgICAqLwogICAgZm9yIChpID0gMCwgcGF0dGVybiA9IDA7IGkgPCA2NDsgaSsrKSB7CglpZiAoaSA8IGZvbnRfd2lkdGgpIHsKCSAgICAvKiBJbnZlcnQgYmFja2dyb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgkgICAgcGF0dGVybiB8PSAweDM7CgoJfQoJZWxzZSB7CgkgICAgLyogQmFja2dyb3VuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJICAgIHBhdHRlcm4gfD0gMHgyOwoJfQoJaWYgKChpICYgMykgPT0gMykgewoJICAgICpwdHIgPSBwYXR0ZXJuOwoJICAgICoocHRyICsgZm9udF9oZWlnaHQgKiAxNikgPSAweGFhOwoJICAgIHB0ciArKzsKCSAgICBwYXR0ZXJuID0gMDsKCX0KCXBhdHRlcm4gPDw9IDI7CiAgICB9CgogICAgLyogRHVwbGljYXRlIHRoaXMgbGluZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBmb3IgKGkgPSAxOyBpIDwgZm9udF9oZWlnaHQ7IGkrKykgewoJbWVtY3B5ICgodm9pZCAqKXB0ciwgKHZvaWQgKikocHRyIC0gMTYpLCAxNik7CglwdHIgKz0gMTY7CiAgICB9CgogICAgZm9yICg7IGkgPCA2NDsgaSsrKSB7CgltZW1jcHkgKCh2b2lkICopKHB0ciArIDE2KSwgKHZvaWQgKilwdHIsIDE2KTsKCXB0ciArPSAxNjsKICAgIH0KCiAgICAvKiBTZWxlY3QgY3Vyc29yIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIHdyaXRlQnl0ZSAoTENEX0NVUlNPUl9DTlRMLCAxKTsKfQojZW5kaWYKI2VuZGlmCg==