LyogQm9vc3QgaW50ZXJ2YWwvZGV0YWlsL3g4NmdjY19yb3VuZGluZ19jb250cm9sLmhwcCBmaWxlCiAqCiAqIFRoaXMgaGVhZGVyIHByb3ZpZGVzIGEgcm91bmRpbmcgY29udHJvbCBwb2xpY3kKICogdGhhdCBhdm9pZHMgZmx1c2hpbmcgcmVzdWx0cyB0byBtZW1vcnkuIEluCiAqIG9yZGVyIGZvciB0aGlzIG9wdGltaXphdGlvbiB0byBiZSByZWxpYWJsZSwgaXQKICogc2hvdWxkIGJlIHVzZWQgb25seSB3aGVuIG5vIHVuZGVyZmxvdyBvcgogKiBvdmVyZmxvdyB3b3VsZCBoYXBwZW4gd2l0aG91dCBpdC4gSW5kZWVkLCBvbmx5CiAqIHZhbHVlcyBpbiByYW5nZSBhcmUgY29ycmVjdGx5IHJvdW5kZWQuCiAqCiAqIENvcHlyaWdodCAyMDAyIEhlcnbpIEJy9m5uaW1hbm4sIEd1aWxsYXVtZSBNZWxxdWlvbmQsIFN5bHZhaW4gUGlvbgogKgogKiBEaXN0cmlidXRlZCB1bmRlciB0aGUgQm9vc3QgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjAuCiAqIChTZWUgYWNjb21wYW55aW5nIGZpbGUgTElDRU5TRV8xXzAudHh0IG9yCiAqIGNvcHkgYXQgaHR0cDovL3d3dy5ib29zdC5vcmcvTElDRU5TRV8xXzAudHh0KQogKi8KCiNpZm5kZWYgQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9FWFRfWDg2X0ZBU1RfUk9VTkRJTkdfQ09OVFJPTF9IUFAKI2RlZmluZSBCT09TVF9OVU1FUklDX0lOVEVSVkFMX0VYVF9YODZfRkFTVF9ST1VORElOR19DT05UUk9MX0hQUAoKbmFtZXNwYWNlIGJvb3N0IHsKbmFtZXNwYWNlIG51bWVyaWMgewpuYW1lc3BhY2UgaW50ZXJ2YWxfbGliIHsKCm5hbWVzcGFjZSBkZXRhaWwgewoKLy8gZXhjZXB0aW9ucyBtYXNrZWQsIGV4cGVjdGVkIHByZWNpc2lvbiAodGhlIG1hc2sgaXMgMHgwMzAwKQpzdGF0aWMgY29uc3QgZnB1X3JvdW5kaW5nX21vZGVzIHJuZF9tb2RlX2YgPSB7IDB4MTA3ZiwgMHgxNDdmLCAweDE4N2YsIDB4MWM3ZiB9OwpzdGF0aWMgY29uc3QgZnB1X3JvdW5kaW5nX21vZGVzIHJuZF9tb2RlX2QgPSB7IDB4MTI3ZiwgMHgxNjdmLCAweDFhN2YsIDB4MWU3ZiB9OwpzdGF0aWMgY29uc3QgZnB1X3JvdW5kaW5nX21vZGVzIHJuZF9tb2RlX2wgPSB7IDB4MTM3ZiwgMHgxNzdmLCAweDFiN2YsIDB4MWY3ZiB9OwoKfSAvLyBuYW1lc3BhY2UgZGV0YWlsCgp0ZW1wbGF0ZTxjbGFzcyBUPgpzdHJ1Y3QgeDg2X2Zhc3Rfcm91bmRpbmdfY29udHJvbDsKCnRlbXBsYXRlPD4Kc3RydWN0IHg4Nl9mYXN0X3JvdW5kaW5nX2NvbnRyb2w8ZmxvYXQ+OiBkZXRhaWw6Ong4Nl9yb3VuZGluZwp7CiAgc3RhdGljIHZvaWQgdG9fbmVhcmVzdCgpICB7IHNldF9yb3VuZGluZ19tb2RlKGRldGFpbDo6cm5kX21vZGVfZi50b19uZWFyZXN0KTsgIH0KICBzdGF0aWMgdm9pZCBkb3dud2FyZCgpICAgIHsgc2V0X3JvdW5kaW5nX21vZGUoZGV0YWlsOjpybmRfbW9kZV9mLmRvd253YXJkKTsgICAgfQogIHN0YXRpYyB2b2lkIHVwd2FyZCgpICAgICAgeyBzZXRfcm91bmRpbmdfbW9kZShkZXRhaWw6OnJuZF9tb2RlX2YudXB3YXJkKTsgICAgICB9CiAgc3RhdGljIHZvaWQgdG93YXJkX3plcm8oKSB7IHNldF9yb3VuZGluZ19tb2RlKGRldGFpbDo6cm5kX21vZGVfZi50b3dhcmRfemVybyk7IH0KICBzdGF0aWMgY29uc3QgZmxvYXQmIGZvcmNlX3JvdW5kaW5nKGNvbnN0IGZsb2F0JiByKSB7IHJldHVybiByOyB9Cn07Cgp0ZW1wbGF0ZTw+CnN0cnVjdCB4ODZfZmFzdF9yb3VuZGluZ19jb250cm9sPGRvdWJsZT46IGRldGFpbDo6eDg2X3JvdW5kaW5nCnsKICBzdGF0aWMgdm9pZCB0b19uZWFyZXN0KCkgIHsgc2V0X3JvdW5kaW5nX21vZGUoZGV0YWlsOjpybmRfbW9kZV9kLnRvX25lYXJlc3QpOyAgfQogIHN0YXRpYyB2b2lkIGRvd253YXJkKCkgICAgeyBzZXRfcm91bmRpbmdfbW9kZShkZXRhaWw6OnJuZF9tb2RlX2QuZG93bndhcmQpOyAgICB9CiAgc3RhdGljIHZvaWQgdXB3YXJkKCkgICAgICB7IHNldF9yb3VuZGluZ19tb2RlKGRldGFpbDo6cm5kX21vZGVfZC51cHdhcmQpOyAgICAgIH0KICBzdGF0aWMgdm9pZCB0b3dhcmRfemVybygpIHsgc2V0X3JvdW5kaW5nX21vZGUoZGV0YWlsOjpybmRfbW9kZV9kLnRvd2FyZF96ZXJvKTsgfQogIHN0YXRpYyBjb25zdCBkb3VibGUmIGZvcmNlX3JvdW5kaW5nKGNvbnN0IGRvdWJsZSYgcikgeyByZXR1cm4gcjsgfQp9OwoKdGVtcGxhdGU8PgpzdHJ1Y3QgeDg2X2Zhc3Rfcm91bmRpbmdfY29udHJvbDxsb25nIGRvdWJsZT46IGRldGFpbDo6eDg2X3JvdW5kaW5nCnsKICBzdGF0aWMgdm9pZCB0b19uZWFyZXN0KCkgIHsgc2V0X3JvdW5kaW5nX21vZGUoZGV0YWlsOjpybmRfbW9kZV9sLnRvX25lYXJlc3QpOyAgfQogIHN0YXRpYyB2b2lkIGRvd253YXJkKCkgICAgeyBzZXRfcm91bmRpbmdfbW9kZShkZXRhaWw6OnJuZF9tb2RlX2wuZG93bndhcmQpOyAgICB9CiAgc3RhdGljIHZvaWQgdXB3YXJkKCkgICAgICB7IHNldF9yb3VuZGluZ19tb2RlKGRldGFpbDo6cm5kX21vZGVfbC51cHdhcmQpOyAgICAgIH0KICBzdGF0aWMgdm9pZCB0b3dhcmRfemVybygpIHsgc2V0X3JvdW5kaW5nX21vZGUoZGV0YWlsOjpybmRfbW9kZV9sLnRvd2FyZF96ZXJvKTsgfQogIHN0YXRpYyBjb25zdCBsb25nIGRvdWJsZSYgZm9yY2Vfcm91bmRpbmcoY29uc3QgbG9uZyBkb3VibGUmIHIpIHsgcmV0dXJuIHI7IH0KfTsKCn0gLy8gbmFtZXNwYWNlIGludGVydmFsX2xpYgp9IC8vIG5hbWVzcGFjZSBudW1lcmljCn0gLy8gbmFtZXNwYWNlIGJvb3N0CgojZW5kaWYgLy8gQk9PU1RfTlVNRVJJQ19JTlRFUlZBTF9FWFRfWDg2X0ZBU1RfUk9VTkRJTkdfQ09OVFJPTF9IUFAK