Ly8gTW9yZ2VuR3JhdWVuIE1VRGxpYgovLwovLyBsaXZpbmcvbGlmZS5oIC0tIGxpdmluZyBsaWZlIGhlYWRlcgovLwovLyAkSWQ6IGxpZmUuaCA5MDQ4IDIwMTUtMDEtMTEgMTg6MjE6MzJaIFplc3N0cmEgJAoKI2lmbmRlZiBfX0xJVklOR19MSUZFX0hfXwojZGVmaW5lIF9fTElWSU5HX0xJRkVfSF9fCgovLyBwcm9wZXJ0aWVzCgojZGVmaW5lIFBfQUdFICAgICAgICAgICAgICAgICAgICAgImFnZSIKI2RlZmluZSBQX0FMSUdOICAgICAgICAgICAgICAgICAgICJhbGlnbiIKCiNkZWZpbmUgUF9ERUFEUyAgICAgICAgICAgICAgICAgICAiZGVhZHMiCiNkZWZpbmUgUF9HSE9TVCAgICAgICAgICAgICAgICAgICAiZ2hvc3QiCiNkZWZpbmUgUF9GUk9HICAgICAgICAgICAgICAgICAgICAiZnJvZyIKCiNkZWZpbmUgUF9GT09EICAgICAgICAgICAgICAgICAgICAiZm9vZCIKI2RlZmluZSBQX01BWF9GT09EICAgICAgICAgICAgICAgICJtYXhfZm9vZCIKI2RlZmluZSBQX0RSSU5LICAgICAgICAgICAgICAgICAgICJkcmluayIKI2RlZmluZSBQX01BWF9EUklOSyAgICAgICAgICAgICAgICJtYXhfZHJpbmsiCiNkZWZpbmUgUF9BTENPSE9MICAgICAgICAgICAgICAgICAiYWxjb2hvbCIKI2RlZmluZSBQX01BWF9BTENPSE9MICAgICAgICAgICAgICJtYXhfYWxjb2hvbCIKCiNkZWZpbmUgUF9IUCAgICAgICAgICAgICAgICAgICAgICAiaHAiCiNkZWZpbmUgUF9NQVhfSFAgICAgICAgICAgICAgICAgICAibWF4X2hwIgojZGVmaW5lIFBfU1AgICAgICAgICAgICAgICAgICAgICAgInNwIgojZGVmaW5lIFBfTUFYX1NQICAgICAgICAgICAgICAgICAgIm1heF9zcCIKI2RlZmluZSBQX1hQICAgICAgICAgICAgICAgICAgICAgICJ4cCIKI2RlZmluZSBQX05PX1hQICAgICAgICAgICAgICAgICAgICJub194cCIKI2RlZmluZSBQX0xBU1RfWFAgICAgICAgICAgICAgICAgICJsYXN0X3hwIgoKI2RlZmluZSBQX0ZPT0RfREVMQVkgICAgICAgICAgICAgICJmb29kX2RlbGF5IgojZGVmaW5lIFBfRFJJTktfREVMQVkgICAgICAgICAgICAgImRyaW5rX2RlbGF5IgojZGVmaW5lIFBfQUxDT0hPTF9ERUxBWSAgICAgICAgICAgImFsY29ob2xfZGVsYXkiCiNkZWZpbmUgUF9IUF9ERUxBWSAgICAgICAgICAgICAgICAiaHBfZGVsYXkiCiNkZWZpbmUgUF9TUF9ERUxBWSAgICAgICAgICAgICAgICAic3BfZGVsYXkiCiNkZWZpbmUgUF9QT0lTT05fREVMQVkgICAgICAgICAgICAicG9pc29uX2RlbGF5IgoKI2RlZmluZSBQX1BPSVNPTiAgICAgICAgICAgICAgICAgICJwb2lzb24iCiNkZWZpbmUgUF9NQVhfUE9JU09OICAgICAgICAgICAgICAibWF4X3BvaXNvbiIKCiNkZWZpbmUgUF9OT19SRUdFTkVSQVRJT04gICAgICAgICAibm9fcmVnZW5lcmF0aW9uIgoKI2RlZmluZSBQX0VORU1ZX0RBTUFHRSAgICAgICAgICAgICJlbmVteV9kYW1hZ2UiCiNkZWZpbmUgUF9USU1JTkdfTUFQICAgICAgICAgICAgICAidGltaW5nX21hcCIKI2RlZmluZSBQX0xBU1RfREVBVEhfVElNRSAgICAgICAgICJsYXN0X2RlYXRoX3RpbWUiCiNkZWZpbmUgUF9MQVNUX0RFQVRIX1BST1BTICAgICAgICAibGFzdF9kZWF0aF9wcm9wcyIKI2RlZmluZSBQX0NPUlBTRV9ERUNBWV9USU1FICAgICAgICJjb3Jwc2VfZGVjYXkiCgovLyAtLS0tLSBEZWZpbml0aW9uZW4gZnVlciBCZWVpbmZsdXNzdW5nIGRlciBHZXN1bmRoZWl0IGR1cmNoIGNvbnN1bWUgLS0tLS0KCi8vIEhfRUZGRUNUUyAtIFp1IGFlbmRlcm5kZSBQcm9wZXJ0aWVzIGZ1ZXIgZGVuIEVmZmVrdAojZGVmaW5lIEhfRUZGRUNUUyAiZWZmZWN0cyIKLy8gSF9DT05ESVRJT05TIC0gWnUgcHJ1ZWZlbmRlIFByb3BlcnRpZXMgZvxyIGRlbiBFZmZla3QgKFNhZXR0aWd1bmcsIC4uLikKI2RlZmluZSBIX0NPTkRJVElPTlMgImNvbmRpdGlvbnMiCi8vIEhfRElTVFJJQlVUSU9OIC0gV2llIGRpZSBBZW5kZXJ1bmcgYW4gSFAvU1AgYXVzdGVpbGVuLCBzb2ZvcnQsIHplaXRsaWNoCi8vIHZlcnNldHp0LCAuLi4KI2RlZmluZSBIX0RJU1RSSUJVVElPTiAiZGlzdHJpYnV0aW9uIgovLyBIX0lOR1JFRElFTlRTIC0gQmVzdGFuZHRlaWxlLCBkaWUgZGllIEFlbmRlcnVuZyB2ZXJ1cnNhY2hlbgojZGVmaW5lIEhfSU5HUkVESUVOVFMgImluZ3JlZGllbnRzIgoKLy8gVmVydGVpbHVuZ2VuLAovLyAwICAgIFNvZm9ydHdpcmt1bmcKLy8gMS01MCBnbGVpY2h2ZXJ0ZWlsdGUgUHVmZmVydW5nIG1pdCBhbmdlZ2ViZW5lciBSYXRlIGZ1ZXIgU1AvSFAKLy8gPj0gNTEgc3BlemllbGxlIFZlcnRlaWx1bmdlbiAoVE9ETykKI2RlZmluZSBIRF9JTlNUQU5UICAgICAgMAojZGVmaW5lIEhEX1NUQU5EQVJEICAgICA1CgojZGVmaW5lIEhfQUxMT1dFRF9DT05ESVRJT05TICh7UF9GT09ELCBQX0RSSU5LLCBQX0FMQ09IT0x9KQojZGVmaW5lIEhfQUxMT1dFRF9FRkZFQ1RTICAgICh7UF9TUCwgUF9IUCwgUF9QT0lTT059KQoKI2RlZmluZSBIQ19NQVhfRk9PRF9SRUFDSEVEICAgICAgICAxCiNkZWZpbmUgSENfTUFYX0RSSU5LX1JFQUNIRUQgICAgICAgMgojZGVmaW5lIEhDX01BWF9BTENPSE9MX1JFQUNIRUQgICAgIDQKI2RlZmluZSBIQ19IT09LX0NBTkNFTExBVElPTiAgICAgICA4CgovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojZW5kaWYgLy8gX19MSVZJTkdfTElGRV9IX18KCiNpZmRlZiBORUVEX1BST1RPVFlQRVMKCiNpZm5kZWYgX19MSVZJTkdfTElGRV9IX1BST1RPX18KI2RlZmluZSBfX0xJVklOR19MSUZFX0hfUFJPVE9fXyAgICAgICAgIAoKLy8gcHJvdG90eXBlcwoKLy8gLS0tLS0gemVudHJhbGUgRnVua3Rpb24sIHVtIGRpZSBHZXN1bmRoZWl0IGRlcyBMZWJld2VzZW5zIHp1IGJlZWluZmx1c3NlbiAtLS0tLQpwdWJsaWMgdmFyYXJncyBpbnQgY29uc3VtZShtYXBwaW5nIGNpbmZvLCBpbnQgdGVzdG9ubHkpOwovLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpwdWJsaWMgaW50IGRvX2RhbWFnZShpbnQgZGFtLCBvYmplY3QgZW5lbXkpOwpwdWJsaWMgaW50IHJlZHVjZV9oaXRfcG9pbnRzKGludCBkYW0pOwpwdWJsaWMgaW50IHJlc3RvcmVfaGl0X3BvaW50cyhpbnQgaGVhbCk7CgpwdWJsaWMgaW50IHJlZHVjZV9oaXRfcG9pbnQoaW50IGRhbSk7ICAvL051ciBhbHMgVWViZXJnYW5zbG9lc3VuZyAoUmlrdXMpCgpwdWJsaWMgdm9pZCByZXN0b3JlX3NwZWxsX3BvaW50cyhpbnQgaCk7CnB1YmxpYyB2b2lkIHJlZHVjZV9zcGVsbF9wb2ludHMoaW50IGgpOwoKcHVibGljIHZvaWQgaGVhbF9zZWxmKGludCBoKTsKCnB1YmxpYyB2YXJhcmdzIHZvaWQgZGllKCBpbnQgcG9pc29uZGVhdGgsIGludCBleHRlcm4gKTsKCnB1YmxpYyB2YXJhcmdzIHZvaWQgdHJhbnNmZXJfYWxsX3RvKCBzdHJpbmd8b2JqZWN0IGRlc3QsIGludCBjaGVjayApOwoKcHVibGljIHZhcmFyZ3MgaW50IGRyaW5rX2FsY29ob2woaW50IHN0cmVuZ3RoLCBpbnQgdGVzdG9ubHksIHN0cmluZyBteXRleHQpOwpwdWJsaWMgdmFyYXJncyBpbnQgZHJpbmtfc29mdChpbnQgc3RyZW5ndGgsIGludCB0ZXN0b25seSwgc3RyaW5nIG15dGV4dCk7CnB1YmxpYyB2YXJhcmdzIGludCBlYXRfZm9vZChpbnQgc3RyZW5ndGgsIGludCB0ZXN0b25seSwgc3RyaW5nIG15dGV4dCk7CgpwdWJsaWMgaW50IGJ1ZmZlcl9ocChpbnQgdmFsLGludCByYXRlKTsKcHVibGljIGludCBidWZmZXJfc3AoaW50IHZhbCxpbnQgcmF0ZSk7CgpwdWJsaWMgdm9pZCBzaG93X2FnZSgpOwoKcHVibGljIGludCBBZGRFeHAoaW50IGUpOwoKLy8gaW50ZXJuYWwKcHJvdGVjdGVkIHZvaWQgUmVzZXRFbmVteURhbWFnZSgpOwoKI2VuZGlmIC8vIF9fTElWSU5HX0xJRkVfSF9QUk9UT19fCgojZW5kaWYgLy8gTkVFRF9QUk9UT1lQRVMK