TmFtZSBTdHJpbmcKCiAgICBjbF9pbnRlbF9hZHZhbmNlZF9tb3Rpb25fZXN0aW1hdGlvbgoKQ29udHJpYnV0b3JzCgogICAgQmlqdSBHZW9yZ2UKICAgIEphbWVzIEhvbGxhbmQKICAgIFJhZ2h1S3Jpc2huYW4gRW1iYXIKICAgIEFkYW0gSGVycgogICAgVG9tYXN6IE9sZWpuaWN6YWsKICAgIFNjb3R0IFBpbGxvdwogICAgQmVuIEFzaGJhdWdoCgpDb250YWN0CiAgIAogICAgQmlqdSBHZW9yZ2UgKGJpanUuZ2VvcmdlICdhdCcgaW50ZWwuY29tKQoKSVAgU3RhdHVzCgogICAgVEJECgpWZXJzaW9uCgogICAgVmVyc2lvbiAyLCBGZWJydWFyeSAxNSwgMjAxNgoKTnVtYmVyCgogICAgT3BlbkNMIEV4dGVuc2lvbiBUQkQKClN0YXR1cwoKICAgIEZpbmFsIERyYWZ0CgpFeHRlbnNpb24gVHlwZQoKICAgIE9wZW5DTCBwbGF0Zm9ybSBleHRlbnNpb24KCkRlcGVuZGVuY2llcwoKICAgIE9wZW5DTCAxLjIKICAgIGNsX2ludGVsX2FjY2VsZXJhdG9yIHZlcnNpb24gMQogICAgY2xfaW50ZWxfbW90aW9uX2VzdGltYXRpb24gdmVyc2lvbiAxCgpPdmVydmlldwoKICAgIFRoaXMgZG9jdW1lbnQgcHJlc2VudHMgdGhlIGFkdmFuY2VkIG1vdGlvbiBlc3RpbWF0aW9uIGV4dGVuc2lvbiBmb3IgT3BlbkNMLiBUaGlzIAogICAgZXh0ZW5zaW9uIGJ1aWxkcyB1cG9uIHRoZSBjbF9pbnRlbF9tb3Rpb25fZXN0aW1hdGlvbiBleHRlbnNpb24gYnkgcHJvdmlkaW5nIGJsb2NrLQogICAgYmFzZWQgZXN0aW1hdGlvbiBhbmQgZ3JlYXRlciBjb250cm9sIG92ZXIgdGhlIGVzdGltYXRpb24gYWxnb3JpdGhtLiAKCiAgICBUaGlzIGV4dGVuc2lvbiByZXVzZXMgdGhlIHNldCBvZiBob3N0LWNhbGxhYmxlIGZ1bmN0aW9ucyBhbmQgIm1vdGlvbiBlc3RpbWF0aW9uIAogICAgYWNjZWxlcmF0b3Igb2JqZWN0cyIgZGVmaW5lZCBpbiB0aGUgY2xfaW50ZWxfbW90aW9uX2VzdGltYXRpb24gZXh0ZW5zaW9uIHZlcnNpb24gMS4KICAgIFRoaXMgZXh0ZW5zaW9uIGRlcGVuZHMgb24gdGhlIE9wZW5DTCAxLjIgYnVpbHQtaW4ga2VybmVsIGluZnJhc3RydWN0dXJlIGFuZCBvbiB0aGUgCiAgICBjbF9pbnRlbF9hY2NlbGVyYXRvciBleHRlbnNpb24gdmVyc2lvbiAxLCB3aGljaCBwcm92aWRlcyBhbiBhYnN0cmFjdGlvbiBmb3IgZG9tYWluLQogICAgc3BlY2lmaWMgYWNjZWxlcmF0aW9uIGluIHRoZSBPcGVuQ0wgcnVudGltZS4gCiAKTmV3IFByb2NlZHVyZXMgYW5kIEZ1bmN0aW9ucwoKICAgIE5vbmUKCk5ldyBUb2tlbnMKCiAgICBBY2NlcHRlZCBhcyBhcmd1bWVudHMgdG8gY2xHZXREZXZpY2VJbmZvCgogICAgQ0xfREVWSUNFX01FX1ZFUlNJT05fSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDA3RQoKICAgIEFjY2VwdGVkIGFzIGZsYWdzIHBhc3NlZCB0byB0aGUga2VybmVsOgogICAgICAgCiAgICBDTF9NRV9DSFJPTUFfSU5UUkFfUFJFRElDVF9FTkFCTEVEX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgMHgxCiAgICBDTF9NRV9MVU1BX0lOVFJBX1BSRURJQ1RfRU5BQkxFRF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCgogICAgQ0xfTUVfU0tJUF9CTE9DS19UWVBFXzE2eDE2X0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAogICAgQ0xfTUVfU0tJUF9CTE9DS19UWVBFXzh4OF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4NAoKICAgIENMX01FX0NPU1RfUEVOQUxUWV9OT05FX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAKICAgIENMX01FX0NPU1RfUEVOQUxUWV9MT1dfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEKICAgIENMX01FX0NPU1RfUEVOQUxUWV9OT1JNQUxfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDIKICAgIENMX01FX0NPU1RfUEVOQUxUWV9ISUdIX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDMKCiAgICBDTF9NRV9DT1NUX1BSRUNJU0lPTl9RUEVMX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgwCiAgICBDTF9NRV9DT1NUX1BSRUNJU0lPTl9IRUxfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCiAgICBDTF9NRV9DT1NUX1BSRUNJU0lPTl9QRUxfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCiAgICBDTF9NRV9DT1NUX1BSRUNJU0lPTl9EUEVMX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzCgogICAgVmFsaWQgaW50cmEtc2VhcmNoIHByZWRpY3RvciBtb2RlIGNvbnN0YW50czoKICAgIAogICAgQ0xfTUVfTFVNQV9QUkVESUNUT1JfTU9ERV9WRVJUSUNBTF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgIDB4MAogICAgQ0xfTUVfTFVNQV9QUkVESUNUT1JfTU9ERV9IT1JJWk9OVEFMX0lOVEVMICAgICAgICAgICAgICAgICAgICAgIDB4MQogICAgQ0xfTUVfTFVNQV9QUkVESUNUT1JfTU9ERV9EQ19JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgogICAgQ0xfTUVfTFVNQV9QUkVESUNUT1JfTU9ERV9ESUFHT05BTF9ET1dOX0xFRlRfSU5URUwgICAgICAgICAgICAgIDB4MwoKICAgIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfRElBR09OQUxfRE9XTl9SSUdIVF9JTlRFTCAgICAgICAgICAgICAweDQKICAgIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfUExBTkVfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDQKICAgIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfVkVSVElDQUxfUklHSFRfSU5URUwgICAgICAgICAgICAgICAgICAweDUKICAgIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfSE9SSVpPTlRBTF9ET1dOX0lOVEVMICAgICAgICAgICAgICAgICAweDYgICAgCiAgICBDTF9NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX1ZFUlRJQ0FMX0xFRlRfSU5URUwgICAgICAgICAgICAgICAgICAgMHg3CiAgICBDTF9NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX0hPUklaT05UQUxfVVBfSU5URUwgICAgICAgICAgICAgICAgICAgMHg4CgogICAgQ0xfTUVfQ0hST01BX1BSRURJQ1RPUl9NT0RFX0RDX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAogICAgQ0xfTUVfQ0hST01BX1BSRURJQ1RPUl9NT0RFX0hPUklaT05UQUxfSU5URUwgICAgICAgICAgICAgICAgICAgIDB4MQogICAgQ0xfTUVfQ0hST01BX1BSRURJQ1RPUl9NT0RFX1ZFUlRJQ0FMX0lOVEVMICAgICAgICAgICAgICAgICAgICAgIDB4MgogICAgQ0xfTUVfQ0hST01BX1BSRURJQ1RPUl9NT0RFX1BMQU5FX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgIDB4MwoKICAgIFZhbGlkIGNvbnN0YW50IHZhbHVlcyByZXR1cm5lZCBieSBjbEdldERldmljZUluZm86CgogICAgQ0xfTUVfVkVSU0lPTl9BRFZBTkNFRF9WRVJfMV9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQogICAgQ0xfTUVfVkVSU0lPTl9BRFZBTkNFRF9WRVJfMl9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgoKICAgIFZhbGlkIG1hY3JvYmxvY2sgdHlwZSBjb25zdGFudHM6CgogICAgQ0xfTUVfTUJfVFlQRV8xNngxNl9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MAogICAgQ0xfTUVfTUJfVFlQRV84eDhfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MQogICAgQ0xfTUVfTUJfVFlQRV80eDRfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MgoKVmFsaWQgc2tpcCBtb2RlIGNvbnN0YW50czoKCiAgICBDTF9NRV9GT1JXQVJEX0lOUFVUX01PREVfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxCiAgICBDTF9NRV9CQUNLV0FSRF9JTlBVVF9NT0RFX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyCiAgICBDTF9NRV9CSURJUkVDVElPTl9JTlBVVF9NT0RFX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgzCgpWYWxpZCBiaWRpcmVjdGlvbmFsIHdlaWdodCBjb25zdGFudHM6CgogICAgQ0xfTUVfQklESVJfV0VJR0hUX1FVQVJURVJfSU5URUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAKICAgIENMX01FX0JJRElSX1dFSUdIVF9USElSRF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDE1CiAgICBDTF9NRV9CSURJUl9XRUlHSFRfSEFMRl9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgyMAogICAgQ0xfTUVfQklESVJfV0VJR0hUX1RXT19USElSRF9JTlRFTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MkIKICAgIENMX01FX0JJRElSX1dFSUdIVF9USFJFRV9RVUFSVEVSX0lOVEVMICAgICAgICAgICAgICAgICAgICAgICAgICAweDMwCgpOZXcgVHlwZXMKCiAgICBOb25lCgpBZGRpdGlvbnMgdG8gQ2hhcHRlciA0IG9mIHRoZSBPcGVuQ0wgU3BlY2lmaWNhdGlvbjoKCiAgICBNb2RpZnkgdGhlIGRlc2NyaXB0aW9uIG9mIGZ1bmN0aW9uIGNsR2V0RGV2aWNlSW5mbwoKICAgIFRhYmxlIDQuMyBtdXN0IGJlIGV4dGVuZGVkIHRvIGluY2x1ZGUgdGhlIGZvbGxvd2luZyBlbnVtZXJhdGlvbiBjb25zdGFudHM6CgogICAgY2xfZGV2aWNlX2luZm8gICAgICAgICAgICAgUmV0dXJuIFR5cGUgICAgICBEZXNjcmlwdGlvbgogICAgLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgLS0tLS0tLS0tLS0gICAgICAtLS0tLS0tLS0tLS0tLS0KICAgIENMX0RFVklDRV9NRV9WRVJTSU9OX0lOVEVMICBjbF91aW50ICAgICAgICAgVGhlIG1vdGlvbiBlc3RpbWF0aW9uIEFQSSB2ZXJzaW9uIG51bWJlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQgYnkgdGhlIGRldmljZSBhbmQgZHJpdmVyLgoKICAgIFRoaXMgZXh0ZW5zaW9uIHJlcXVpcmVzIGEgbWluaW11bSBtb3Rpb24gZXN0aW1hdGlvbiBkZXZpY2UgdmVyc2lvbiBudW1iZXIgb2YKICAgIENMX01FX1ZFUlNJT05fQURWQU5DRURfVkVSXzFfSU5URUwuCgogICAgVGhlIGNsX2ludGVsX21vdGlvbl9lc3RpbWF0aW9uIGV4dGVuc2lvbiBkZWZpbmVzIGEgbW90aW9uIGVzdGltYXRpb24gYWNjZWxlcmF0b3IKICAgIG9iamVjdC4gVGhpcyBvYmplY3QgaXMgdXNlZCB3aXRob3V0IG1vZGlmaWNhdGlvbiBpbiB0aGlzIGV4dGVuc2lvbi4KCiAgICBUaGUgdG9rZW5zIGRlZmluZWQgaW4gdGhlICJOZXcgVG9rZW5zIiBzZWN0aW9uIG9mIHRoZSBjbF9pbnRlbF9tb3Rpb25fZXN0aW1hdGlvbgogICAgZXh0ZW5zaW9uIGFyZSB1c2VkIGJ5IHRoaXMgZXh0ZW5zaW9uLiAKCiAgICBUaGlzIGV4dGVuc2lvbiBpbmNsdWRlcyB0d28gbmV3IGJ1aWx0LWluIGtlcm5lbHMgZm9yIGJsb2NrLWJhc2VkIG1vdGlvbiBlc3RpbWF0aW9uLiAKICAgIFRoZSBzZWNvbmQgYnVpbHQtaW4ga2VybmVsIGlzIHN1cHBvcnRlZCBvbmx5IGZvciBkZXZpY2VzIHRoYXQgcmVwb3J0IGEgbW90aW9uIGVzdGltYXRpb24KICAgIGRldmljZSB2ZXJzaW9uIG51bWJlciBvZiBDTF9NRV9WRVJTSU9OX0FEVkFOQ0VEX1ZFUl8yX0lOVEVMLiBBIHByb2dyYW0gb2JqZWN0IGZvciBvbmUgb3IKICAgIGJvdGgga2VybmVscyBpcyBvYnRhaW5lZCB2aWEgY2xDcmVhdGVQcm9ncmFtV2l0aEJ1aWx0SW5LZXJuZWxzLCBwYXNzaW5nIHRoZSBrZXJuZWwgbmFtZQogICAgYXMgYSBzdHJpbmcgdG8gdGhlIGtlcm5lbF9uYW1lcyBhcmd1bWVudC4gQSBrZXJuZWwgb2JqZWN0IGlzIG9idGFpbmVkIGZyb20gdGhpcyBwcm9ncmFtCiAgICBieSBjYWxsaW5nIHRoZSBjbENyZWF0ZUtlcm5lbCBmdW5jdGlvbiBwYXNzaW5nIHRoZSBrZXJuZWwgbmFtZSBhcyBhIHN0cmluZyB0byB0aGUgCiAgICBrZXJuZWxfbmFtZXMgYXJndW1lbnQuIAoKICAgIEVhY2gga2VybmVsIG9wZXJhdGVzIG9uIDE2eDE2IHBpeGVsIGJsb2NrcyAobWFjcm9ibG9ja3MpIG9uIHRoZSBzb3VyY2UgYW5kIAogICAgcmVmZXJlbmNlIGltYWdlcy4gVGhlIG51bWJlciBvZiBtYWNyb2Jsb2NrcyAoTUJzKSBpbiBhIGdpdmVuIGltYWdlIGlzIGRldGVybWluZWQgYnkKICAgIG51bWJlciBvZiAxNngxNiByZWdpb25zIHRoYXQgZXZlbmx5IGRpdmlkZSB0aGUgZ2xvYmFsX3dvcmtfc2l6ZVswXSAod2lkdGgpIGFuZAogICAgZ2xvYmFsX3dvcmtfc2l6ZVsxXSAoaGVpZ2h0KSBhcmd1bWVudHMgcGFzc2VkIHRvIHRoZSBjbEVucXVlTkRSYW5nZUtlcm5lbCBmdW5jdGlvbi4gSWYKICAgIHRoZSBpbWFnZSBkaW1lbnNpb25zIGFyZSBub3QgZXZlbmx5IGRpdmlzaWJsZSBieSAxNiwgYSBwYXJ0aWFsIE1CIGlzIGRlZmluZWQgZm9yIHRoZSAKICAgIHJlbWFpbmluZyBwaXhlbHMuIFRoZSBrZXJuZWwgcmVmZXJlbmNlcyBtYWNyb2Jsb2NrcyBzZXF1ZW50aWFsbHkgdXNpbmcgY29udGlndW91cyAKICAgIHJvdy1tYWpvciBvcmRlcmluZy4gRm9yIGV4YW1wbGUsIGEgMTI4eDEyOCBzb3VyY2UgaW1hZ2Ugd291bGQgaGF2ZSB0aGUgZm9sbG93aW5nIAogICAgbWFjcm9ibG9jayBvcmRlcmluZzoKICAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHwgMHwgMXwgMnwgM3wgNHwgNXwgNnwgN3wKICAgICstLSstLSstLSstLSstLSstLSstLSstLSsKICAgIHwgOHwgOXwxMHwxMXwxMnwxM3wxNHwxNXwKICAgICstLSstLSstLSstLSstLSstLSstLSstLSsKICAgIHwxNnwxN3wxOHwxOXwyMHwyMXwyMnwyM3wKICAgICstLSstLSstLSstLSstLSstLSstLSstLSsKICAgIHwyNHwyNXwyNnwyN3wyOHwyOXwzMHwzMXwKICAgICstLSstLSstLSstLSstLSstLSstLSstLSsKICAgIHwzMnwzM3wzNHwzNXwzNnwzN3wzOHwzOXwKICAgICstLSstLSstLSstLSstLSstLSstLSstLSsKICAgIHw0MHw0MXw0Mnw0M3w0NHw0NXw0Nnw0N3wKICAgICstLSstLSstLSstLSstLSstLSstLSstLSsKICAgIHw0OHw0OXw1MHw1MXw1Mnw1M3w1NHw1NXwKICAgICstLSstLSstLSstLSstLSstLSstLSstLSsKICAgIHw1Nnw1N3w1OHw1OXw2MHw2MXw2Mnw2M3wKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBUaGUgZGF0YS1sYXlvdXQgb2YgdGhlIGtlcm5lbCdzIGlucHV0IGFuZCBvdXRwdXQgYXJyYXlzIGFyZSBiYXNlZCBvbiB0aGlzIG9yZGVyaW5nIGFuZCAKICAgIHJlcXVpcmUgYSBzcGVjaWZpYyBkYXRhIGxheW91dCBwZXIgbWFjcm9ibG9jayBhcyBkZXNjcmliZWQgYmVsb3cuIAoKICAgIEludGVyLXByZWRpY3Rpb24gaXMgdGhlIHByb2Nlc3Mgb2YgZGV0ZXJtaW5pbmcgdGhlIGJlc3QgaW50ZXItZnJhbWUgbW90aW9uIHZlY3RvcnMgCiAgICB0aGF0IGRlc2NyaWJlIHRoZSB0cmFuc2Zvcm0gZnJvbSBhIDJEIHJlZmVyZW5jZSBpbWFnZSB0byBhbm90aGVyIDJEIHNvdXJjZSBpbWFnZS4gVGhpcwogICAgaXMgZG9uZSBieSBzZWFyY2hpbmcgZm9yIHRlbXBvcmFsIHBhdHRlcm5zLCB1c3VhbGx5IGluIGFkamFjZW50IGZyYW1lcyBpbiBhIHZpZGVvCiAgICBzZXF1ZW5jZS4gVGhlIGVzdGltYXRpb24gYWxnb3JpdGhtIG9wZXJhdGVzIG9uIDE2eDE2IG1hY3JvYmxvY2tzLCB3aXRoIGVpdGhlciA0eDQsIAogICAgOHg4IG9yIDE2eDE2IHN1Yi1ibG9jayBzaXplcy4gRWFjaCBvZiB0aGVzZSBzdWItYmxvY2sgc2l6ZXMgaGFzIGEgY29ycmVzcG9uZGluZyAKICAgIG51bWJlciBvZiBtb3Rpb24gdmVjdG9ycyB3aXRoaW4gYSBnaXZlbiBtYWNyb2Jsb2NrOiAKCiAgICBTdWItYmxvY2sgU2l6ZSAgICAgTVZzIHBlciBNQgogICAgLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tCiAgICA0eDQgICAgICAgICAgICAgICAgMTYKICAgIDh4OCAgICAgICAgICAgICAgICAgNAogICAgMTZ4MTYgICAgICAgICAgICAgICAxCiAKICAgIFRoZSBhbGdvcml0aG0gc2VhcmNoZXMgZm9yIHRoZSBiZXN0IG1hdGNoIG9mIGVhY2ggcGl4ZWwgYmxvY2sgaW4gdGhlIHNvdXJjZSBpbWFnZSBieQogICAgc2VhcmNoaW5nIGFuIGltYWdlIHJlZ2lvbiBpbiB0aGUgcmVmZXJlbmNlIGltYWdlLCBjZW50ZXJlZCBvbiB0aGUgY29vcmRpbmF0ZXMgb2YgdGhhdAogICAgcGl4ZWwgYmxvY2sgaW4gdGhlIHNvdXJjZSBpbWFnZS4gVGhpcyBjZW50ZXIgY29vcmRpbmF0ZSBjYW4gYmUgb2Zmc2V0IGJ5IGEgc2V0IG9mIAogICAgcHJlZGljdGlvbiBtb3Rpb24gdmVjdG9ycyAoTVZzKS4gVGhlIHByZWRpY3Rvcl9tb3Rpb25fdmVjdG9yX2J1ZmZlciBhcmd1bWVudCBpcyB1c2VkIAogICAgdG8gZGVmaW5lIHVwIHRvIGVpZ2h0IHByZWRpY3Rpb24gTVZzIHBlciBtYWNyb2Jsb2NrLiBUaGUgY291bnRfbW90aW9uX3ZlY3Rvcl9idWZmZXIgCiAgICBhcmd1bWVudCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgbnVtYmVyIG9mIGFjdHVhbCBwcmVkaWN0aW9uIG1vdGlvbiB2ZWN0b3JzIHVzZWQgCiAgICB3aXRoaW4gZWFjaCBtYWNyb2Jsb2NrLiAKCiAgICBBIGNvc3QgZnVuY3Rpb24gc2NoZW1lIGNhbiBiZSBzcGVjaWZpZWQgZm9yIG1vdGlvbiBzZWFyY2guIERpc3RvcnRpb24gZm9yIGEgTVYgaXMgCiAgICBjb21wdXRlZCBhcyBhIHN1bSBvZiB0aGUgU0FEIGFuZCB0aGUgTVYgY29zdCBwZW5hbHR5LiBDb3N0IHBlbmFsdHkgaXMgY29tcHV0ZWQgYmFzZWQgCiAgICBvbiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0aGUgY29tcHV0ZWQgTVYgYW5kIGEgc3BlY2lmaWMgY29zdC1jZW50ZXIuIFRoaXMgY29zdC1jZW50ZXIKICAgIGlzIHNwZWNpZmllZCBhcyB0aGUgZmlyc3QgcHJlZGljdG9yIG1vdGlvbiB2ZWN0b3IgY29uZmlndXJlZCBmb3IgYSBnaXZlbiBNQi4gVGhlIAogICAgc2VhcmNoX2Nvc3RfcGVuYWx0eSBhcmd1bWVudCBzcGVjaWZpZXMgdGhlIGNvc3QgcGVuYWx0eSBmdW5jdGlvbiBhbmQgY2FuIGJlIGNvbmZpZ3VyZWQKICAgIGZvciBsb3csIG5vcm1hbCBvciBoaWdoIHBlbmFsdHkuIFRoZSBzZWFyY2hfY29zdF9wcmVjaXNpb24gYXJndW1lbnQgaXMgdXNlZCB0byAKICAgIGNvbmZpZ3VyZSB0aGUgcmFuZ2Ugb2YgdGhlIGNvc3QgZnVuY3Rpb24gYnkgc3BlY2lmeWluZyB0aGUgcHJlY2lzaW9uIG9mIGNvbnRyb2wgCiAgICBwb2ludHMgYXQgd2hpY2ggdGhlIGNvc3QgcGVuYWx0aWVzIGFyZSBhcHBsaWVkIHRvIHF1YXJ0ZXIsIGhhbGYsIGZ1bGwsIG9yIGRvdWJsZSBwaXhlbAogICAgcHJlY2lzaW9uLiBUaGUgY29zdCBwZW5hbHRpZXMgYXQgaW4tYmV0d2VlbiBjb250cm9sIHBvaW50cyBhcmUgbGluZWFybHkgaW50ZXJwb2xhdGVkLgogICAgR2VuZXJhbGx5LCBhIGxvdyBwZW5hbHR5IGNhbiBiZSB1c2VkIHdoZW4gdXNpbmcgbG93IHF1YW50aXphdGlvbiBwYXJhbWV0ZXIgdmFsdWVzCiAgICBkdXJpbmcgZW5jb2RpbmcgYW5kIGEgaGlnaCBwZW5hbHR5IGNhbiBiZSB1c2VkIHdoZW4gdXNpbmcgaGlnaCBxdWFudGl6YXRpb24gcGFyYW1ldGVyCiAgICB2YWx1ZXMgZHVyaW5nIGVuY29kaW5nLgoKICAgIFNlYXJjaCByZXN1bHRzIGFyZSBwb3B1bGF0ZWQgaW4gdGhlIHNlYXJjaF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBhcnJheS4gVGhpcyBhcnJheQogICAgY29udGFpbnMgYSBzZXQgb2YgYmVzdC1zZWFyY2ggbW90aW9uIHZlY3RvcnMgcGVyIE1COyB0aGUgbnVtYmVyIG9mIE1WcyBwZXIgTUIgaXMgCiAgICBkZXRlcm1pbmVkIGJ5IHRoZSBzdWItYmxvY2sgc2l6ZS4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBvYnRhaW4gdGhlIFNBRC1hZGp1c3RlZAogICAgcmVzaWR1YWwgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJlc3Qgc2VhcmNoIE1WcyB2aWEgdGhlIGFycmF5IHNwZWNpZmllZCB2aWEgdGhlCiAgICBzZWFyY2hfcmVzaWR1YWxzIGFyZ3VtZW50LiAgCgogICAgVGhlIGtlcm5lbCBjYW4gcGVyZm9ybSBza2lwLWNoZWNrcyB0byBwcm9kdWNlIGRpc3RvcnRpb24gdmFsdWVzIGJhc2VkIG9uIHRoZSBza2lwLQogICAgY2hlY2sgTVZzIHNwZWNpZmllZCBmb3IgZWFjaCBtYWNyb2Jsb2NrLiBTa2lwLWNoZWNrcyBtYXkgYmUgY29uZmlndXJlZCB3aXRoIGVpdGhlciA4eDgKICAgIG9yIDE2eDE2IHN1Yi1ibG9jayBzaXplcywgdmlhIHRoZSBza2lwX2Jsb2NrX3R5cGUgYXJndW1lbnQuIFRoZSAKICAgIHNraXBfbW90aW9uX3ZlY3Rvcl9idWZmZXIgaXMgdXNlZCB0byBjb25maWd1cmUgbXVsdGlwbGUgc2V0cyBvZiBza2lwLWNoZWNrIE1WcyBwZXIKICAgIE1CLiBUaGUgbnVtYmVyIG9mIHZlY3RvcnMgaW4gZWFjaCBzZXQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc3ViLWJsb2NrIHNpemU6CgogICAgU3ViLWJsb2NrIFNpemUgICAgIE1WcyBwZXIgTUIKICAgIC0tLS0tLS0tLS0tLS0tICAgICAtLS0tLS0tLS0tLS0tLQogICAgOHg4ICAgICAgICAgICAgICAgIDQKICAgIDE2eDE2ICAgICAgICAgICAgICAxCgogICAgUmVzdWx0cyBhcmUgb2J0YWluZWQgdmlhIHRoZSBza2lwX3Jlc2lkdWFscyBhcmd1bWVudCBhcyBTQUQtYWRqdXN0ZWQgZGlzdG9ydGlvbiB2YWx1ZXMKICAgIGNvcnJlc3BvbmRpbmcgdG8gZWFjaCBza2lwLWNoZWNrIE1WIGRlZmluZWQgZm9yIGVhY2ggbWFjcm9ibG9jay4gCgogICAgSW50cmEtcHJlZGljdGlvbiBkZXNjcmliZXMgdGhlIHRyYW5zZm9ybSBmcm9tIHByZXZpb3VzIGFkamFjZW50IG1hY3JvYmxvY2tzIHRvIAogICAgc3Vic2VxdWVudCBtYWNyb2Jsb2NrcyB3aXRoaW4gdGhlIHNhbWUgMkQgc291cmNlIGZyYW1lIGJ5IHNlYXJjaGluZyBmb3Igc3BhdGlhbAogICAgcGF0dGVybnMgYW5kIHByb2R1Y2VzIHRoZSBwcmVkaWN0b3IgbW9kZXMgZnJvbSBwcmV2aW91cyBhZGphY2VudCBtYWNyb2Jsb2NrcyB3aXRoaW4KICAgIHRoZSBzYW1lIGZyYW1lLiBUaGUga2VybmVsIG1heSBiZSBjb25maWd1cmVkIHRvIHJlcG9ydCB0aGUgaW50cmEtcHJlZGljdGlvbiBtb2RlcyB2aWEKICAgIHRoZSAgaW50cmFfc2VhcmNoX3ByZWRpY3Rpb25fbW9kZXNfYnVmZmVyIGFyZ3VtZW50LiBUaGlzIGFycmF5IGNvbnRhaW5zLCBmb3IgZWFjaAogICAgbWFjcm9ibG9jaywgYSByZWNvcmQgY29udGFpbmluZyB0aGUgcHJlZGljdG9yIG1vZGUgY29uc3RhbnRzIGZvciAxIDE2eDE2LCA0IDh4OCBhbmQgMTYKICAgIDR4NCBsdW1hIGJsb2Nrcy4gVGhlcmUgaXMgYWxzbyBhIHByZWRpY3RvciBtb2RlIGVudHJ5IHJlc2VydmVkIGZvciBhbiA4eDggY2hyb21hIAogICAgYmxvY2suIFJlc2lkdWFsIHZhbHVlcyBkZXJpdmVkIGR1cmluZyBpbnRyYS1wcmVkaWN0aW9uIHByb2Nlc3MgYXJlIGFjY2Vzc2libGUgdmlhIHRoZQogICAgaW50cmFfc2VhcmNoX3Jlc2lkdWFscyBhcmd1bWVudC4gIAogCiAgICBUaGUgZmlyc3Qga2VybmVsCgogICAgYmxvY2tfYWR2YW5jZWRfbW90aW9uX2VzdGltYXRlX2NoZWNrX2ludGVsKAogICAgICAgICBhY2NlbGVyYXRvcl9pbnRlbF90ICAgYWNjZWxlcmF0b3IsCiAgICAgICAgIF9fcmVhZF9vbmx5IGltYWdlMmRfdCBzcmNfaW1hZ2UsCiAgICAgICAgIF9fcmVhZF9vbmx5IGltYWdlMmRfdCByZWZfaW1hZ2UsCiAgICAgICAgIHVpbnQgICAgICAgICAgICAgICAgICBmbGFncywKICAgICAgICAgdWludCAgICAgICAgICAgICAgICAgIHNraXBfYmxvY2tfdHlwZSwKICAgICAgICAgdWludCAgICAgICAgICAgICAgICAgIHNlYXJjaF9jb3N0X3BlbmFsdHksCiAgICAgICAgIHVjaGFyICAgICAgICAgICAgICAgICBzZWFyY2hfY29zdF9wcmVjaXNpb24sCiAgICAgX19nbG9iYWwgc2hvcnQyICAgICAgICAgICAqY291bnRfbW90aW9uX3ZlY3Rvcl9idWZmZXIsCiAgICAgX19nbG9iYWwgc2hvcnQyICAgICAgICAgICAqcHJlZGljdG9yX21vdGlvbl92ZWN0b3JfYnVmZmVyLAogICAgIF9fZ2xvYmFsIHNob3J0MiAgICAgICAgICAgKnNraXBfbW90aW9uX3ZlY3Rvcl9idWZmZXIsCiAgICAgX19nbG9iYWwgc2hvcnQyICAgICAgICAgICAqc2VhcmNoX21vdGlvbl92ZWN0b3JfYnVmZmVyLAogICAgIF9fZ2xvYmFsIGNoYXIgICAgICAgICAgICAgKmludHJhX3NlYXJjaF9wcmVkaWN0b3JfbW9kZXMsCiAgICAgX19nbG9iYWwgdXNob3J0ICAgICAgICAgICAqc2VhcmNoX3Jlc2lkdWFscywKICAgICBfX2dsb2JhbCB1c2hvcnQgICAgICAgICAgICpza2lwX3Jlc2lkdWFscywKICAgICBfX2dsb2JhbCB1c2hvcnQgICAgICAgICAgKmludHJhX3Jlc2lkdWFscyApOwoKICAgIGRlZmluZXMgYSBrZXJuZWwgdGhhdCBwcm92aWRlcyB2YXJpb3VzIGJsb2NrLWJhc2VkIG1vdGlvbiBlc3RpbWF0aW9uIGNvbXB1dGF0aW9ucy4KICAgIFRoZXJlIGFyZSB0aHJlZSBiYXNpYyB1c2UgY2FzZXMgZm9yIHRoaXMga2VybmVsOgoKICAgIDEuKSBQZXJmb3JtIGludGVyLXByZWRpY3Rpb24gbW90aW9uIGVzdGltYXRpb24gb24gdGhlIHNvdXJjZSBhbmQgcmVmZXJlbmNlIGltYWdlcyB0bwogICAgb2J0YWluIHRoZSBiZXN0IHNlYXJjaCBtb3Rpb24gdmVjdG9ycyBhbmQgdGhlaXIgYXNzb2NpYXRlZCBkaXN0b3J0aW9uIHZhbHVlcy4gCgogICAgMi4pIFBlcmZvcm0gc2tpcC1jaGVja3Mgb24gdGhlIHNvdXJjZSBhbmQgcmVmZXJlbmNlIGltYWdlcyBieSBwcm92aWRpbmcgYSBzZXQgb2YKICAgIG1vdGlvbiB2ZWN0b3JzLCB0aGVuIG9idGFpbiB0aGUgY29ycmVzcG9uZGluZyBkaXN0b3J0aW9uIHZhbHVlcy4gCiAKICAgIDMuKSBQZXJmb3JtIGludHJhLXByZWRpY3Rpb24gY29tcHV0YXRpb25zIHRvIG9idGFpbiB0aGUgYmVzdC1zZWFyY2ggcHJlZGljdGlvbiBtb2RlcyAKICAgIGJldHdlZW4gYWRqYWNlbnQgbWFjcm9ibG9ja3MgYW5kIGFzc29jaWF0ZWQgcmVzaWR1YWwgdmFsdWVzLiAKCiAgICBUaGlzIGtlcm5lbCBjYW4gYmUgc2V0IHVwIHRvIGRvIHNvbWUgb3IgYWxsIG9mIHRoZXNlIG9wZXJhdGlvbnMgaW4gYSBzaW5nbGUgZW5xdWV1ZS4gICAgIAoKICAgIGJsb2NrX2FkdmFuY2VkX21vdGlvbl9lc3RpbWF0ZV9jaGVja19pbnRlbCBhcmd1bWVudHM6CgogICAgYWNjZWxlcmF0b3IgaXMgYSB2YWxpZCBhY2NlbGVyYXRvciBvYmplY3QgY3JlYXRlZCBieSBjbENyZWF0ZUFjY2VsZXJhdG9ySU5URUwsIHdoZXJlCiAgICB0aGUgdHlwZSBvZiB0aGUgYWNjZWxlcmF0b3IgbXVzdCBiZSBDTF9BQ0NFTEVSQVRPUl9UWVBFX01PVElPTl9FU1RJTUFUSU9OX0lOVEVMLiAKICAgIFJlZmVyIHRvIHRoZSBjbF9pbnRlbF9tb3Rpb25fZXN0aW1hdGlvbiBleHRlbnNpb24gZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgCiAgICBjb25maWd1cmluZyBhY2NlbGVyYXRvciBvYmplY3Qgd2l0aCB0aGUgY2xfbW90aW9uX2VzdGltYXRpb25fZGVzY19pbnRlbCBzdHJ1Y3R1cmUuCgogICAgc3JjX2ltYWdlIGlzIHRoZSBpbnB1dCBzb3VyY2UgaW1hZ2UsIHR5cGljYWxseSByZXByZXNlbnRpbmcgOC1iaXQgbHVtaW5hbmNlCiAgICBpbmZvcm1hdGlvbi4gQ3VycmVudGx5LCB0aGUgaW1hZ2VfY2hhbm5lbF9vcmRlciBhbmQgdGhlIGltYWdlX2RhdGFfdHlwZSBvZiBzcmNfaW1hZ2UKICAgIGFyZSByZXN0cmljdGVkIGFzIGZvbGxvd3M6CgogICAgQ2hhbm5lbCBPcmRlciAgICAgIFNyYyBDaGFubmVsIERhdGEgVHlwZQogICAgLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ0xfUiAgICAgICAgICAgICAgIENMX1VOT1JNX0lOVDgKCiAgICBBZGRpdGlvbmFsIGZvcm1hdHMgd2lsbCBiZSBzdXBwb3J0IGJ5IGZ1dHVyZSBleHRlbnNpb25zLiBUaGUgaG9zdCBwcm9ncmFtIGlzIAogICAgcmVzcG9uc2libGUgZm9yIHBvcHVsYXRpbmcgdGhlIHRpbGVkIGltYWdlIHVzaW5nIHRoZSBjbEVucXVldWVXcml0ZUltYWdlIG9yIG90aGVyCiAgICBhcHByb3ByaWF0ZSBBUEkgZnVuY3Rpb24uCgogICAgcmVmX2ltYWdlIGlzIHRoZSBpbnB1dCByZWZlcmVuY2UgaW1hZ2UsIHJlcHJlc2VudGluZyA4LWJpdCBsdW1pbmFuY2UgaW5mb3JtYXRpb24uIAogICAgaW1hZ2VfY2hhbm5lbF9vcmRlciBhbmQgdGhlIGltYWdlX2RhdGFfdHlwZSBtdXN0IG1hdGNoIHNyY19pbWFnZSwgYXMgZm9sbG93czoKICAgIAogICAgQ2hhbm5lbCBPcmRlciAgICAgIFNyYyBDaGFubmVsIERhdGEgVHlwZQogICAgLS0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ0xfUiAgICAgICAgICAgICAgIENMX1VOT1JNX0lOVDgKCiAgICBBZGRpdGlvbmFsIGZvcm1hdHMgd2lsbCBiZSBzdXBwb3J0IGJ5IGZ1dHVyZSBleHRlbnNpb25zLiBUaGUgaG9zdCBwcm9ncmFtIGlzCiAgICByZXNwb25zaWJsZSBmb3IgcG9wdWxhdGluZyB0aGUgdGlsZWQgaW1hZ2UgdXNpbmcgdGhlIGNsRW5xdWV1ZVdyaXRlSW1hZ2Ugb3Igb3RoZXIKICAgIGFwcHJvcHJpYXRlIEFQSSBmdW5jdGlvbiBmdW5jdGlvbi4KCiAgICBmbGFncyBkZWZpbmVzIGFueSBvcHRpb25hbCBtb2RlcyBvciBiZWhhdmlvcnMgdXNlZCBpbiBjb21wdXRpbmcgbW90aW9uIGVzdGltYXRpb24sCiAgICBza2lwIGNoZWNrIGFuZC9vciBpbnRyYS1wcmVkaWN0aW9uIGFsZ29yaXRobXMuIEN1cnJlbnRseSBzdXBwb3J0ZWQgYXJlOiAKCiAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0KICAgIENMX01FX0xVTUFfSU5UUkFfUFJFRElDVF9FTkFCTEVEX0lOVEVMICAgIEVuYWJsZWQgTHVtYS1iYXNlZCBpbnRyYS1wcmVkaWN0aW9uLgoKICAgIFRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCB0b2tlbiBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSBzdXBwb3J0OiAgCgogICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tCiAgICBDTF9NRV9DSFJPTUFfSU5UUkFfUFJFRElDVF9FTkFCTEVEX0lOVEVMICBFbmFibGVkIGNocm9tYS0gYmFzZWQgaW50cmEtcHJlZGljdGlvbi4KCiAgICBza2lwX2Jsb2NrX3R5cGUgZmxhZyBzcGVjaWZpZXMgdGhlIHN1Yi1ibG9jayBzaXplIHVzZWQgaW4gZXZhbHVhdGluZyBza2lwIGNoZWNrcy4gVGhlIAogICAgc3BlY2lmaWVkIHN1Yi1ibG9jayBzaXplIHdpbGwgZGV0ZXJtaW5lIHRoZSBkYXRhIGxheW91dCBvZiB0aGUgCiAgICBza2lwX21vdGlvbl92ZWN0b3JfYnVmZmVyIGFycmF5OiAKCiAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICBTdWItYmxvY2sgc2l6ZSAgIE1WcyBwZXIgTUIgZW50cnkKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgIC0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLQogICAgQ0xfTUVfTUJfVFlQRV8xNngxNl9JTlRFTCAgMTZ4MTYgICAgICAgICAgICAxCiAgICBDTF9NRV9NQl9UWVBFXzh4OF9JTlRFTCAgICA4eDggICAgICAgICAgICAgIDQgCgogICAgc2VhcmNoX2Nvc3RfcGVuYWx0eSBkZWZpbmVzIHRoZSBjb3N0IGZ1bmN0aW9uIHNjaGVtZSB1c2VkIGluIGNvbXB1dGluZyBjb3N0IHBlbmFsdGllcy4KCiAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0KICAgIENMX01FX0NPU1RfUEVOQUxUWV9OT05FX0lOVEVMICAgICAgICAgICAgIHBlbmFsdHkgaXMgemVybwogICAgQ0xfTUVfQ09TVF9QRU5BTFRZX0xPV19JTlRFTCAgICAgICAgICAgICAgcGVuYWx0eSBmb3IgbG93IG1vdGlvbgogICAgQ0xfTUVfQ09TVF9QRU5BTFRZX05PUk1BTF9JTlRFTCAgICAgICAgICAgcGVuYWx0eSBmb3Igbm9ybWFsIG1vdGlvbgogICAgQ0xfTUVfQ09TVF9QRU5BTFRZX0hJR0hfSU5URUwgICAgICAgICAgICAgcGVuYWx0eSBmb3IgaGlnaCBtb3Rpb24KICAgIAogICAgc2VhcmNoX2Nvc3RfcHJlY2lzaW9uIGRlZmluZXMgdGhlIHBpeGVsIHByZWNpc2lvbiBvZiB0aGUgY29zdCBwZW5hbHR5IGNhbGN1bGF0aW9ucy4gSWYKICAgIHRoZSBzZWFyY2hfY29zdF9wZW5hbHR5IGZsYWcgaXMgc2V0IHRvIENMX01FX0NPU1RfUEVOQUxUWV9OT05FX0lOVEVMLCB0aGlzIGFyZ3VtZW50CiAgICBpcyBpZ25vcmVkLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgoKICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLQogICAgQ0xfTUVfQ09TVF9QUkVDSVNJT05fUVBFTF9JTlRFTCAgICAgICAgICAgcXVhcnRlciBwaXhlbAogICAgQ0xfTUVfQ09TVF9QUkVDSVNJT05fSFBFTF9JTlRFTCAgICAgICAgICAgaGFsZiBwaXhlbAogICAgQ0xfTUVfQ09TVF9QUkVDSVNJT05fUEVMX0lOVEVMICAgICAgICAgICAgZnVsbCBwaXhlbAogICAgQ0xfTUVfQ09TVF9QUkVDSVNJT05fRFBFTF9JTlRFTCAgICAgICAgICAgZG91YmxlIHBpeGVsCgogICAgY291bnRfbW90aW9uX3ZlY3Rvcl9idWZmZXIgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHByZWRpY3RvciBtb3Rpb24gdmVjdG9ycyBhbmQgc2tpcC0KICAgIGNoZWNrIG1vdGlvbiB2ZWN0b3JzIGRlZmluZWQgZm9yIGVhY2ggbWFjcm9ibG9jay4gVGhlIGJ1ZmZlciBjb250YWlucyBhbiBhcnJheSBvZgogICAgc2hvcnQgaW50ZWdlciBwYWlycywgb25lIHBhaXIgcGVyIE1CLiBUaGUgaW5kaWNlcyBvZiB0aGUgYXJyYXkgY29ycmVzcG9uZCB0byB0aGUKICAgIGNvbnRpZ3VvdXMgcm93LW1ham9yIGJsb2NrIGxheW91dCBvZiB0aGUgaW5wdXQgZnJhbWUuIFRoZSBmaXJzdCB2YWx1ZSBpbiBlYWNoIHBhaXIKICAgIGRlZmluZXMgdGhlIG51bWJlciBvZiBwcmVkaWN0b3IgbW90aW9uIHZlY3RvcnMgZm9yIGEgZ2l2ZW4gTUI7IHRoaXMgdmFsdWUgZGVmaW5lcyB0aGUKICAgIHJhbmdlIG9mIHZhbGlkIGVudHJpZXMgZm9yIHRoZSBNQiBjb250YWluZWQgd2l0aGluIHRoZSBwcmVkaWN0b3JfbW90aW9uX3ZlY3Rvcl9idWZmZXIKICAgIGFycmF5LiBUaGUgc2Vjb25kIHZhbHVlIGluIGVhY2ggcGFpciBkZWZpbmVzIHRoZSBudW1iZXIgb2Ygc2tpcC1jaGVjayBtb3Rpb24gdmVjdG9ycwogICAgZm9yIHRoZSBNQjsgdGhpcyB2YWx1ZSBkZWZpbmVzIHRoZSByYW5nZSBvZiB2YWxpZCBlbnRyaWVzIGluIHRoZSAKICAgIHNraXBfbW90aW9uX3ZlY3Rvcl9idWZmZXIgYXJyYXkuIEFsbCBzaXplIHZhbHVlcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgOCBpbmNsdXNpdmU7IAogICAgc2l6ZSB2YWx1ZXMgZ3JlYXRlciB0aGFuIDggcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvci4gCgogICAgcHJlZGljdG9yX21vdGlvbl92ZWN0b3JfYnVmZmVyIGRlZmluZXMgYW4gaW5wdXQgYXJyYXkgb2Ygc2lnbmVkIHNob3J0IGludGVnZXIgCiAgICBwcmVkaWN0b3IgTVZzIHdpdGggcXVhcnRlci1waXhlbCByZXNvbHV0aW9uLiBUaGUgYXJyYXkgaXMgcGFydGl0aW9uZWQgaW50byBjbHVzdGVycyBvZgogICAgOCBtb3Rpb24gdmVjdG9ycyBwZXIgTUIgaW4gY29udGlndW91cyByb3ctbWFqb3Igb3JkZXJpbmcuIFRoZSBidWZmZXIgbGF5b3V0IGFzc3VtZXMKICAgIHRoZSBtYXhpbXVtIHNpemUgb2YgOCBwcmVkaWN0b3IgTVZzIHBlciBNQiBldmVuIGlmIHRoZSBjb3VudF9tb3Rpb25fdmVjdG9yX2J1ZmZlcgogICAgYXJyYXkgc3BlY2lmaWVzIGEgc21hbGxlciBwcmVkaWN0b3IgY291bnQuIElmIHRoZSB2YWx1ZSBvZiB0aGUgc2VhcmNoX2Nvc3RfcGVuYWx0eQogICAgYXJndW1lbnQgZG9lcyBub3QgZXF1YWwgQ0xfTUVfQ09TVF9QRU5BTFRZX05PTkVfSU5URUwsIHRoZSBmaXJzdCBwcmVkaWN0b3IgTVYgZm9yCiAgICBlYWNoIE1CIGlzIHVzZWQgYXMgdGhlIGNvc3QgY2VudGVyIGZvciBjb3N0IHBlbmFsdHkgY2FsY3VsYXRpb25zLiBJZiB0aGUgYXJyYXkgcGFzc2VkCiAgICB0byBjb3VudF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBhcmd1bWVudCBzcGVjaWZpZXMgYSBwcmVkaWN0b3Igc2l6ZSBvZiB6ZXJvIGZvciBhbGwKICAgIG1hY3JvYmxvY2tzIHRoaXMgYXJndW1lbnQgY2FuIGJlIE5VTEwuCgogICAgc2tpcF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBkZWZpbmVzIGFuIGlucHV0IGFycmF5IG9mIHNpZ25lZCBzaG9ydCBpbnRlZ2VyIHNraXAtY2hlY2sKICAgIE1Wcy4gVGhlIGFycmF5IGlzIHBhcnRpdGlvbmVkIGludG8gY2x1c3RlcnMgb2YgOCBzZXRzIG9mIG1vdGlvbiB2ZWN0b3JzIHBlciBNQiwgaW4KICAgIGNvbnRpZ3VvdXMgcm93LW1ham9yIG9yZGVyaW5nLiBUaGUgdmFsdWUgb2Ygc2tpcF9ibG9ja190eXBlIGRldGVybWluZXMgdGhlIG51bWJlciBvZgogICAgTVZzIGZvciBlYWNoIG9mIHRoZSA4IGVudHJpZXM6IAoKICAgIFZhbHVlIG9mIHNraXBfYmxvY2tfdHlwZSAgICBOdW1iZXIgTVZzIGluIGVhY2ggZW50cnkgICAgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDTF9NRV9NQl9UWVBFXzE2eDE2X0lOVEVMICAgMSBNVnMgcGVyIGVudHJ5CiAgICBDTF9NRV9NQl9UWVBFXzh4OF9JTlRFTCAgICAgNCBNVnMgcGVyIGVudHJ5CgogICAgVGhlIGJ1ZmZlciBsYXlvdXQgYXNzdW1lcyB0aGUgbWF4aW11bSBzaXplIG9mIDggTVYgZW50cmllcyBwZXIgTUIsIGV2ZW4gaWYgdGhlIAogICAgY291bnRfbW90aW9uX3ZlY3Rvcl9idWZmZXIgYXJyYXkgc3BlY2lmaWVzIGEgc21hbGxlciBza2lwLWNoZWNrIGNvdW50LiBJZiB0aGUgYXJyYXkKICAgIHBhc3NlZCB0byBjb3VudF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBzcGVjaWZpZXMgYSBza2lwLWNoZWNrIHNpemUgb2YgemVybyBmb3IgYWxsIG1hY3JvCiAgICBibG9ja3MsIG5vIHNraXAgY2hlY2sgY29tcHV0YXRpb24gaXMgcGVyZm9ybWVkIGFuZCB0aGlzIGFyZ3VtZW50IGNhbiBiZSBOVUxMLiAKCiAgICBzZWFyY2hfbW90aW9uX3ZlY3Rvcl9idWZmZXIgZGVmaW5lcyBhbiBvdXRwdXQgYXJyYXkgb2Ygc2lnbmVkIHNob3J0IGludGVnZXJzIHBhaXJzIAogICAgZGVmaW5pbmcgdGhlIGJlc3Qgc2VhcmNoIG1vdGlvbiB2ZWN0b3JzIHBlciBtYWNybyBibG9jay4gVGhlIGFycmF5IGNvbnRhaW5zIDEsIDQgb3IgMTYgCiAgICBtb3Rpb24gdmVjdG9ycyBwZXIgTUIgaW4gY29udGlndW91cyByb3ctbWFqb3Igb3JkZXJpbmcuIFRoZSBudW1iZXIgb2YgdmVjdG9ycyBwZXIgTUIKICAgIGlzIGRldGVybWluZWQgYnkgdGhlIHZhbHVlIG9mIG1iX2Jsb2NrX3R5cGUgc3BlY2lmaWVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgdGhlCiAgICBhY2NlbGVyYXRvciBvYmplY3Q6IAoKICAgIFZhbHVlIG9mIG1iX2Jsb2NrX3R5cGUgICAgICAgTnVtYmVyIG9mIE1WcyAgICAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgLS0tLS0tLS0tLS0tLS0KICAgIENMX01FX01CX1RZUEVfMTZ4MTZfSU5URUwgICAgIDEgTVZzIHBlciBNQgogICAgQ0xfTUVfTUJfVFlQRV84eDhfSU5URUwgICAgICAgNCBNVnMgcGVyIE1CCiAgICBDTF9NRV9NQl9UWVBFXzR4NF9JTlRFTCAgICAgIDE2IE1WcyBwZXIgTUIKCiAgICBpbnRyYV9zZWFyY2hfcHJlZGljdGlvbl9tb2Rlc19idWZmZXIgc3BlY2lmaWVzIGFuIG91dHB1dCBidWZmZXIgY29udGFpbmluZyBhIHNlcXVlbmNlCiAgICBvZiBzaWduZWQgY2hhcnMgZGVzY3JpYmluZyB0aGUgcHJlZGljdG9yIG1vZGVzIHVzZWQgZHVyaW5nIG1vdGlvbiBlc3RpbWF0aW9uLiBUaGUKICAgIGFycmF5IGlzIGRpdmlkZWQgaW50byBhIHNlcXVlbmNlIG9mIDIyIGJ5dGVzIHBlciBNQiBpbiBjb250aWd1b3VzIHJvdy1tYWpvciBvcmRlcmluZy4KICAgIEVhY2ggZW50cnkgaW4gdGhlIGFycmF5IGhhcyB0aGUgZm9sbG93aW5nIGZvcm06CgogICAgc3RydWN0IHNlYXJjaF9wcmVkaWN0b3JfbW9kZXMKICAgIHsKICAgICAgICBjaGFyIGx1bWFfMTZ4MTZfYmxvY2s7CiAgICAgICAgY2hhciBsdW1hXzh4OF9ibG9ja1s0XTsKICAgICAgICBjaGFyIGx1bWFfNHg0X2Jsb2NrWzE2XTsKICAgICAgICBjaGFyIGNocm9tYV84eDhfYmxvY2s7IAogICAgfTsKCiAgICBUaGUgbHVtYV8xNngxNl9ibG9jaywgbHVtYV84eDhfYmxvY2sgYW5kIGx1bWFfNHg0X2Jsb2NrIGZpZWxkcyBjb250YWluIHZhbGlkIHZhbHVlcwogICAgb25seSB3aGVuIHRoZSBDTF9NRV9MVU1BX0lOVFJBX1BSRURJQ1RfRU5BQkxFRF9JTlRFTCBmbGFnIGlzIHNldC4KCiAgICBFYWNoIHZhbHVlIGluIHRoZSBsdW1hXzh4OF9ibG9jayBhbmQgbHVtYV80eDRfYmxvY2sgYXJyYXlzIGNvbnRhaW5zIG9uZSBvZiB0aGUKICAgIGZvbGxvd2luZyBjb25zdGFudHM6CgogICAgQ0xfTUVfTFVNQV9QUkVESUNUT1JfTU9ERV9WRVJUSUNBTF9JTlRFTCAgICAgICAgICAgIAogICAgQ0xfTUVfTFVNQV9QUkVESUNUT1JfTU9ERV9IT1JJWk9OVEFMX0lOVEVMICAgICAgICAKICAgIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfRENfSU5URUwKICAgIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfRElBR09OQUxfRE9XTl9MRUZUX0lOVEVMCiAgICBDTF9NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX0RJQUdPTkFMX0RPV05fUklHSFRfSU5URUwKICAgIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfVkVSVElDQUxfUklHSFRfSU5URUwKICAgIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfSE9SSVpPTlRBTF9ET1dOX0lOVEVMCiAgICBDTF9NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX1ZFUlRJQ0FMX0xFRlRfSU5URUwKICAgIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfSE9SSVpPTlRBTF9VUF9JTlRFTAoKICAgIFRoZSB2YWx1ZSBvZiBsdW1hXzE2eDE2X2Jsb2NrIGNvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50czoKCiAgICBDTF9NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX1ZFUlRJQ0FMX0lOVEVMICAgICAgICAgICAgIAogICAgQ0xfTUVfTFVNQV9QUkVESUNUT1JfTU9ERV9IT1JJWk9OVEFMX0lOVEVMICAgICAgICAgICAgCiAgICBDTF9NRV9MVU1BX1BSRURJQ1RPUl9NT0RFX0RDX0lOVEVMICAgICAgICAKICAgIENMX01FX0xVTUFfUFJFRElDVE9SX01PREVfUExBTkVfSU5URUwgICAgCgogICAgVGhlIGNocm9tYV84eDhfYmxvY2sgZmllbGQgb25seSBjb250YWluIHZhbGlkIHZhbHVlcyBpZiB0aGUgCiAgICBDTF9NRV9DSFJPTUFfSU5UUkFfUFJFRElDVF9FTkFCTEVEX0lOVEVMIGZsYWcgaXMgc2V0LiBJZiBlbmFibGVkLCB0aGUgY2hyb21hXzh4OF9ibG9jayAKICAgIGNvbnRhaW5zIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50czoKCiAgICBDTF9NRV9DSFJPTUFfUFJFRElDVE9SX01PREVfVkVSVElDQUxfSU5URUwgICAgICAgICAgICAgCiAgICBDTF9NRV9DSFJPTUFfUFJFRElDVE9SX01PREVfSE9SSVpPTlRBTF9JTlRFTCAgICAgICAgICAgIAogICAgQ0xfTUVfQ0hST01BX1BSRURJQ1RPUl9NT0RFX0RDX0lOVEVMICAgICAgICAKICAgIENMX01FX0NIUk9NQV9QUkVESUNUT1JfTU9ERV9QTEFORV9JTlRFTCAgICAKCiAgICBUaGlzIGFyZ3VtZW50IGNhbiBiZSBOVUxMLgoKICAgIHNlYXJjaF9yZXNpZHVhbHMgZGVmaW5lcyBhbiBvdXRwdXQgYnVmZmVyIGNvbnRhaW5pbmcgdmVjdG9ycyBvZiB1bnNpZ25lZCBzaG9ydCBTQUQtCiAgICBhZGp1c3RlZCB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgYmVzdCBzZWFyY2ggbW90aW9uIHZlY3RvcnMgcG9wdWxhdGVkIGluIHRoZSAKICAgIHNlYXJjaF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBhcnJheS4gVGhlIGFycmF5IGlzIGRpdmlkZWQgaW50byBvbmUgdmVjdG9yIHBlciBNQiBpbiAKICAgIGNvbnRpZ3VvdXMgcm93LW1ham9yIGJsb2NrIG9yZGVyaW5nLiBFYWNoIHZlY3RvciBjb250YWlucyAxLCA0LCBvciAxNiBjb21wb25lbnRzCiAgICBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIG1iX2Jsb2NrX3R5cGUgc3BlY2lmaWVkIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgdGhlIAogICAgYWNjZWxlcmF0b3Igb2JqZWN0OiAKCiAgICBWYWx1ZSBvZiBtYl9ibG9ja190eXBlICAgICBWZWN0b3IgU2l6ZSAgICAKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0KICAgIENMX01FX01CX1RZUEVfMTZ4MTZfSU5URUwgICAgMQogICAgQ0xfTUVfTUJfVFlQRV84eDhfSU5URUwgICAgICA0CiAgICBDTF9NRV9NQl9UWVBFXzR4NF9JTlRFTCAgICAgMTYKCiAgICBUaGlzIGFyZ3VtZW50IGNhbiBiZSBOVUxMLgoKICAgIHNraXBfcmVzaWR1YWxzIGRlZmluZXMgYW4gb3V0cHV0IGJ1ZmZlciBjb250YWluaW5nIHZlY3RvcnMgb2YgdW5zaWduZWQgc2hvcnQgU0FELQogICAgYWRqdXN0ZWQgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNraXAtY2hlY2sgTVZzIGRlZmluZWQgYnkgCiAgICBza2lwX21vdGlvbl92ZWN0b3JfYnVmZmVyLiBUaGUgYXJyYXkgaXMgcGFydGl0aW9uZWQgaW50byBjbHVzdGVycyBvZiA4IHNldHMgb2YgCiAgICByZXNpZHVhbCB2YWx1ZXMgcGVyIE1CLCBpbiBjb250aWd1b3VzIHJvdy1tYWpvciBvcmRlcmluZy4gVGhlIHZhbHVlIG9mIHNraXBfYmxvY2tfdHlwZQogICAgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHZhbHVlcyBpbiBlYWNoIG9mIHRoZSA4IGVudHJpZXM6IAoKICAgIFZhbHVlIG9mIHNraXBfYmxvY2tfdHlwZSAgICBOdW1iZXIgTVZzIGluIGVhY2ggZW50cnkgICAgCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDTF9NRV9NQl9UWVBFXzE2eDE2X0lOVEVMICAgMSByZXNpZHVhbCBwZXIgZW50cnkKICAgIENMX01FX01CX1RZUEVfOHg4X0lOVEVMICAgICA0IHJlc2lkdWFscyBwZXIgZW50cnkKCiAgICBUaGUgYnVmZmVyIGxheW91dCBhc3N1bWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgOCByZXNpZHVhbCB2YWx1ZXMgcGVyIE1CLCBob3dldmVyIHRoZQogICAgbnVtYmVyIG9mIHZhbGlkIHJlc2lkdWFsIGVudHJpZXMgY29ycmVzcG9uZHMgdG8gdGhlIHNraXAtY2hlY2sgTVYgY291bnQgc3BlY2lmaWVkIGluIAogICAgY291bnRfbW90aW9uX3ZlY3Rvcl9idWZmZXIgZm9yIGVhY2ggTUIuIFRoaXMgYXJndW1lbnQgY2FuIGJlIE5VTEwuCgogICAgaW50cmFfc2VhcmNoX3Jlc2lkdWFscyBkZWZpbmVzIGFuIG91dHB1dCBidWZmZXIgb2YgdW5zaWduZWQgc2hvcnQgU0FELWFkanVzdGVkIHZlY3RvcnMKICAgIHRoYXQgY29ycmVzcG9uZCB0byB0aGUgcmVzaWR1YWwgdmFsdWVzIHVzZWQgZHVyaW5nIGludHJhLXByZWRpY3Rpb24uIFRoZSBidWZmZXIKICAgIGNvbnRhaW5zIDQgdmFsdWVzIHBlciBNQiBpbiBjb250aWd1b3VzIHJvdy1tYWpvciBvcmRlcmluZyB1c2luZyB0aGUgZm9sbG93aW5nIGxheW91dDoKCiAgICBzdHJ1Y3QgaW50cmFfc2VhcmNoX3Jlc2lkdWFscwogICAgewogICAgICAgIHNob3J0IGx1bWFfMTZ4MTZfYmxvY2tfcmVzaWR1YWw7CiAgICAgICAgc2hvcnQgbHVtYV84eDhfYmxvY2tfcmVzaWR1YWw7CiAgICAgICAgc2hvcnQgbHVtYV80eDRfYmxvY2tfcmVzaWR1YWw7CiAgICAgICAgc2hvcnQgY2hyb21hXzh4OF9ibG9ja19yZXNpZHVhbDsgCiAgICB9OwoKICAgIFRoZSBjaHJvbWFfOHg4X2Jsb2NrX3Jlc2lkdWFscyB2YWx1ZSBpcyBvbmx5IHZhbGlkIGlmIHRoZSAKICAgIENMX01FX0NIUk9NQV9JTlRSQV9QUkVESUNUX0VOQUJMRUQgZmxhZyBpcyBzZXQuIFRoaXMgYXJndW1lbnQgY2FuIGJlIE5VTEwuCgogICAgVGhlIHNlY29uZCBidWlsdC1pbiBrZXJuZWwgZXh0ZW5kcyB1cG9uIHRoZSBmdW5jdGlvbmFsaXR5IHByb3ZpZGVkIGJ5IHRoZSBmaXJzdCAKICAgIGtlcm5lbCBieSBhZGRpdGlvbmFsbHkgc3VwcG9ydGluZyBiaWRpcmVjdGlvbmFsIHNraXAgY2hlY2tzIGFuZCBtaW5vciBhZGRpdGlvbmFsIAogICAgY29udHJvbCBvdmVyIHRoZSBlc3RpbWF0aW9uIGFsZ29yaXRobS4gVGhlIGFkZGl0aW9uYWwgY29udHJvbCBpbmNsdWRlcyB0aGUgCiAgICBhYmlsaXR5IHRvIHBlcmZvcm0gc2tpcCBjaGVja3Mgb24gYSBkaWZmZXJlbnQgc2V0IG9mIHNvdXJjZSBhbmQgcmVmZXJlbmNlIGZyYW1lcwogICAgYXMgdXNlZCBmb3IgbW90aW9uIHNlYXJjaCwgYW5kIHRoZSBvcHRpb24gdG8gc3BlY2lmeSBhIHBhaXIgb2Ygc2NhbGFyIGNvdW50cyBmb3IKICAgIGlucHV0IHNlYXJjaCBwcmVkaWN0b3JzIGFuZCBza2lwIG1vdGlvbiB2ZWN0b3JzIGdsb2JhbGx5IGZvciBhbGwgbWFjcm8tYmxvY2tzIGluCiAgICB0aGUgZnJhbWUgaW5zdGVhZCBvZiBoYXZpbmcgdG8gc3BlY2lmeSBzdWNoIGNvdW50cyBvbiBhIHBlciBtYWNyb2Jsb2NrIGJhc2lzLiBUaGlzCiAgICBrZXJuZWwgaXMgb25seSBzdXBwb3J0ZWQgZm9yIGRldmljZXMgdGhhdCByZXBvcnQgYSBtb3Rpb24gZXN0aW1hdGlvbiBkZXZpY2UgdmVyc2lvbgogICAgbnVtYmVyIG9mIENMX01FX1ZFUlNJT05fQURWQU5DRURfVkVSXzJfSU5URUwuCgogICAgVGhlIHNlY29uZCBrZXJuZWwKCiAgICBibG9ja19hZHZhbmNlZF9tb3Rpb25fZXN0aW1hdGVfYmlkaXJlY3Rpb25hbF9jaGVja19pbnRlbCgKICAgICAgICBhY2NlbGVyYXRvcl9pbnRlbF90ICAgIGFjY2VsZXJhdG9yLAogICAgICAgIF9fcmVhZF9vbmx5IGltYWdlMmRfdCAgc3JjX3NlYXJjaF9pbWFnZSwKICAgICAgICBfX3JlYWRfb25seSBpbWFnZTJkX3QgIHJlZl9zZWFyY2hfaW1hZ2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIF9fcmVhZF9vbmx5IGltYWdlMmRfdCAgc3JjX2NoZWNrX2ltYWdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIF9fcmVhZF9vbmx5IGltYWdlMmRfdCAgcmVmMF9jaGVja19pbWFnZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIF9fcmVhZF9vbmx5IGltYWdlMmRfdCAgcmVmMV9jaGVja19pbWFnZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIHVpbnQgICAgICAgICAgICAgICAgICAgZmxhZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICB1aW50ICAgICAgICAgICAgICAgICAgIHNlYXJjaF9jb3N0X3BlbmFsdHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICB1aW50ICAgICAgICAgICAgICAgICAgIHNlYXJjaF9jb3N0X3ByZWNpc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICBzaG9ydDIgICAgICAgICAgICAgICAgIGNvdW50X2dsb2JhbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICB1Y2hhciAgICAgICAgICAgICAgICAgIGJpZGlyX3dlaWdodCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgX19nbG9iYWwgc2hvcnQyICogICAgICAgICAgY291bnRfbW90aW9uX3ZlY3Rvcl9idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgIF9fZ2xvYmFsIHNob3J0MiAqICAgICAgICAgIHByZWRpY3Rpb25fbW90aW9uX3ZlY3Rvcl9idWZmZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBfX2dsb2JhbCBjaGFyICAgICAgICAgICAgICpza2lwX2lucHV0X21vZGVfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICBfX2dsb2JhbCBzaG9ydDIgKiAgICAgICAgICBza2lwX21vdGlvbl92ZWN0b3JfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgX19nbG9iYWwgc2hvcnQyICAgICAgICAgICAqc2VhcmNoX21vdGlvbl92ZWN0b3JfYnVmZmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgX19nbG9iYWwgY2hhciAgICAgICAgICAgICAqaW50cmFfc2VhcmNoX3ByZWRpY3Rvcl9tb2RlcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgX19nbG9iYWwgdXNob3J0ICAgICAgICAgICAqc2VhcmNoX3Jlc2lkdWFscywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgX19nbG9iYWwgdXNob3J0ICogICAgICAgICAgc2tpcF9yZXNpZHVhbHMsICAgICAgICAgICAgICAgICAgICAgICAKICAgIF9fZ2xvYmFsIHVzaG9ydCAqICAgICAgICAgIGludHJhX3Jlc2lkdWFscyApOwogICAgCiAgICBkZWZpbmVzIGEga2VybmVsIHRoYXQgcHJvdmlkZXMgdmFyaW91cyBibG9jay1iYXNlZCBtb3Rpb24gZXN0aW1hdGlvbiBjb21wdXRhdGlvbnMuCiAgICBUaGVyZSBhcmUgdGhyZWUgYmFzaWMgdXNlIGNhc2VzIGZvciB0aGlzIGtlcm5lbDoKICAgIAogICAgMS4pIFBlcmZvcm0gdW5pZGlyZWN0aW9uYWwgaW50ZXItcHJlZGljdGlvbiBtb3Rpb24gZXN0aW1hdGlvbiBvbiB0aGUgc291cmNlIGFuZAogICAgcmVmZXJlbmNlIGltYWdlcyB0byBvYnRhaW4gdGhlIGJlc3Qgc2VhcmNoIG1vdGlvbiB2ZWN0b3JzIGFuZCB0aGVpciBhc3NvY2lhdGVkIAogICAgZGlzdG9ydGlvbiB2YWx1ZXMuIAogICAgCiAgICAyLikgUGVyZm9ybSB1bmlkaXJlY3Rpb25hbCBvciBiaWRpcmVjdGlvbmFsIHNraXAtY2hlY2tzIG9uIHRoZSBzb3VyY2UgYW5kIAogICAgcmVmZXJlbmNlIGltYWdlcyBieSBwcm92aWRpbmcgYSBzZXQgb2YgbW90aW9uIHZlY3RvcnMsIHRoZW4gb2J0YWluIHRoZSAKICAgIGNvcnJlc3BvbmRpbmcgZGlzdG9ydGlvbiB2YWx1ZXMuCiAKICAgIDMuKSBQZXJmb3JtIGludHJhLXByZWRpY3Rpb24gY29tcHV0YXRpb25zIHRvIG9idGFpbiB0aGUgYmVzdC1zZWFyY2ggcHJlZGljdGlvbgogICAgbW9kZXMgYmV0d2VlbiBhZGphY2VudCBtYWNyb2Jsb2NrcyBhbmQgYXNzb2NpYXRlZCByZXNpZHVhbCB2YWx1ZXMuIAoKICAgIFRoaXMga2VybmVsIGNhbiBiZSBzZXQgdXAgdG8gZG8gc29tZSBvciBhbGwgb2YgdGhlc2Ugb3BlcmF0aW9ucyBpbiBhIHNpbmdsZSAKICAgIGVucXVldWUuICAgICAgICAgCiAgICAKICAgIFRoZSBrZXJuZWwgY2FuIHBlcmZvcm0gdW5pZGlyZWN0aW9uYWwgb3IgYmlkaXJlY3Rpb25hbCBza2lwLWNoZWNrcyB0byBwcm9kdWNlCiAgICBkaXN0b3J0aW9uIHZhbHVlcyBiYXNlZCBvbiB0aGUgaW5wdXQgc2tpcC1jaGVjayBtb3Rpb24gdmVjdG9ycyBzcGVjaWZpZWQgZm9yIAogICAgZWFjaCBzdWItYmxvY2sgaW4gdGhlIG1hY3JvYmxvY2suIFNraXAtY2hlY2tzIGZvciBlYWNoIG1vdGlvbiB2ZWN0b3IgZm9yIGEgCiAgICBzdWItYmxvY2sgbWF5IGJlIGluZGVwZW5kZW50bHkgY29uZmlndXJlZCBmb3IgZWl0aGVyICAgICB1bmlkaXJlY3Rpb25hbCBvciAKICAgIGJpZGlyZWN0aW9uYWwgc2tpcC1jaGVja3MgYnkgbWVhbnMgb2YgdGhlIHNraXBfaW5wdXRfbW9kZV9idWZmZXIgYXJndW1lbnQuIAogICAgQSBzdWItYmxvY2sgY29uZmlndXJlZCBmb3IgYmlkaXJlY3Rpb25hbCBza2lwLWNoZWNrIHdpbGwgaGF2ZSB0d28gY29tcG9uZW50CiAgICBpbnB1dCBtb3Rpb24gdmVjdG9yczsgb25lIHNwZWNpZnlpbmcgYSByZWN0YW5ndWxhciByZWdpb24gaW4gdGhlIGZvcndhcmQgCiAgICByZWZlcmVuY2UgZnJhbWUgYW5kIHRoZSBvdGhlciBpbiB0aGUgYmFja3dhcmQgICAgIHJlZmVyZW5jZSBmcmFtZS4gQSAKICAgIGJpZGlyX3dlaWdodCBhcmd1bWVudCBpcyBhZGRpdGlvbmFsbHkgc3BlY2lmaWVkIGZvciBzdWItYmxvY2tzIGNvbmZpZ3VyZWQgCiAgICBmb3IgYmlkaXJlY3Rpb25hbCBza2lwIGNoZWNrcy4gVGhlIGVmZmVjdGl2ZSByZWZlcmVuY2UgICAgIHJlZ2lvbiBpcyBhIAogICAgd2VpZ2h0ZWQgYmxlbmQgb2YgdGhlIGZvcndhcmQgYW5kIGJhY2t3YXJkIHJlZmVyZW5jZSByZWdpb24gYXMgc3BlY2lmaWVkIGJ5CiAgICB0aGUgYmlkaXJlY3Rpb25hbCBza2lwIG1vdGlvbiB2ZWN0b3IgYW5kIGJpZGlyX3dlaWdodCBhcmd1bWVudHMuIElmIGEgbW90aW9uCiAgICB2ZWN0b3IgaXMgY29uZmlndXJlZCBmb3IgYmlkaXJlY3Rpb25hbCBza2lwIGNoZWNrLCB0aGVuIHRoZSByZWYwX2NoZWNrX2ltYWdlCiAgICBhcmd1bWVudCBpcyB0YWtlbiBhcyB0aGUgZm9yd2FyZCByZWZlcmVuY2UgaW1hZ2UgICAgIGFuZCByZWYxX2NoZWNrX2ltYWdlIGlzCiAgICB0YWtlbiBhcyB0aGUgYmFja3dhcmQgcmVmZXJlbmNlIGltYWdlLCBlbHNlIG9ubHkgcmVmMF9jaGVja19pbWFnZSBpcyB0YWtlbiAKICAgIGFzIHRoZSBzaW5nbGUgcmVmZXJlbmNlIGltYWdlLiBTa2lwLWNoZWNrcyBtYXkgYmUgICAgIGNvbmZpZ3VyZWQgd2l0aCBlaXRoZXIgCiAgICA4eDggb3IgMTZ4MTYgc3ViLWJsb2NrIHNpemVzLCB2aWEgdGhlIGZsYWdzIGFyZ3VtZW50LiBUaGUgCiAgICBza2lwX21vdGlvbl92ZWN0b3JfYnVmZmVyIGlzIHVzZWQgdG8gY29uZmlndXJlIHVwIHRvIGZvdXIgc2V0cyBvZiBiaWRpcmVjdGlvbmFsIAogICAgc2tpcC1jaGVjayBNVnMgcGFpcnMgcGVyIE1CLiBUaGUgbnVtYmVyIG9mIHZlY3RvcnMgaW4gZWFjaCBzZXQgaXMgZGV0ZXJtaW5lZCAKICAgIGJ5IHRoZSBzdWItYmxvY2sgc2l6ZToKICAgIAogICAgU3ViLWJsb2NrIFNpemUgICAgQmlkaXJlY3Rpb25hbCBNViBwYWlycyBwZXIgTUIKICAgIC0tLS0tLS0tLS0tLS0tICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgIDh4OCAgICAgICAgICAgICAgICAgICAgNAogICAgICAgIDE2eDE2ICAgICAgICAgICAgICAgICAgIDEKCiAgICBSZXN1bHRzIGFyZSBvYnRhaW5lZCB2aWEgdGhlIHNraXBfcmVzaWR1YWxzIGFyZ3VtZW50IGFzIFNBRC1hZGp1c3RlZCBkaXN0b3J0aW9uCiAgICB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byBlYWNoIHNraXAtY2hlY2sgTVYgZGVmaW5lZCBmb3IgZWFjaCBtYWNyb2Jsb2NrLiAKICAgIAogICAgYmxvY2tfYWR2YW5jZWRfbW90aW9uX2VzdGltYXRlX2JpZGlyZWN0aW9uYWxfY2hlY2tfaW50ZWwgYXJndW1lbnRzOiAgICAKICAgIAogICAgYWNjZWxlcmF0b3IgaXMgYSB2YWxpZCBhY2NlbGVyYXRvciBvYmplY3QgY3JlYXRlZCBieSBjbENyZWF0ZUFjY2VsZXJhdG9ySU5URUwsCiAgICB3aGVyZSB0aGUgdHlwZSBvZiB0aGUgYWNjZWxlcmF0b3IgbXVzdCBiZSAKICAgIENMX0FDQ0VMRVJBVE9SX1RZUEVfTU9USU9OX0VTVElNQVRJT05fSU5URUwuCiAgICBSZWZlciB0byB0aGUgY2xfaW50ZWxfbW90aW9uX2VzdGltYXRpb24gZXh0ZW5zaW9uIGZvciBhIGRldGFpbGVkIGRlc2NyaXB0aW9uIAogICAgb2YgY29uZmlndXJpbmcgYWNjZWxlcmF0b3Igb2JqZWN0IHdpdGggdGhlIGNsX21vdGlvbl9lc3RpbWF0aW9uX2Rlc2NfaW50ZWwgCiAgICBzdHJ1Y3R1cmUuCiAgICAKICAgIHNyY19zZWFyY2hfaW1hZ2UgaXMgdGhlIGlucHV0IHNvdXJjZSBpbWFnZSBmb3IgbW90aW9uIHNlYXJjaCBvcGVyYXRpb25zLCAKICAgIHR5cGljYWxseSByZXByZXNlbnRpbmcgOC1iaXQgbHVtaW5hbmNlIGluZm9ybWF0aW9uLiBDdXJyZW50bHksIHRoZSAKICAgIGltYWdlX2NoYW5uZWxfb3JkZXIgYW5kIHRoZSBpbWFnZV9kYXRhX3R5cGUgb2Ygc3JjX3NlYXJjaF9pbWFnZSBhcmUgCiAgICByZXN0cmljdGVkIGFzIGZvbGxvd3M6CiAgICAgICAgCiAgICBDaGFubmVsIE9yZGVyICAgICBTcmMgQ2hhbm5lbCBEYXRhIFR5cGUKICAgIC0tLS0tLS0tLS0tLS0gICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgQ0xfUiAgICAgICAgICAgICAgQ0xfVU5PUk1fSU5UOAogICAgCiAgICBBZGRpdGlvbmFsIGZvcm1hdHMgd2lsbCBiZSBzdXBwb3J0IGJ5IGZ1dHVyZSBleHRlbnNpb25zLiBUaGUgaG9zdCBwcm9ncmFtIAogICAgaXMgcmVzcG9uc2libGUgZm9yIHBvcHVsYXRpbmcgdGhlIHRpbGVkIGltYWdlIHVzaW5nIHRoZSBjbEVucXVldWVXcml0ZUltYWdlIAogICAgZnVuY3Rpb24gb3Igb3RoZXIgYXBwcm9wcmlhdGUgQVBJIGZ1bmN0aW9uLgogICAgCiAgICByZWZfc2VhcmNoX2ltYWdlIGlzIHRoZSBpbnB1dCByZWZlcmVuY2UgaW1hZ2UgZm9yIG1vdGlvbiBzZWFyY2ggb3BlcmF0aW9ucywgCiAgICByZXByZXNlbnRpbmcgOC1iaXQgbHVtaW5hbmNlIGluZm9ybWF0aW9uLiBUaGUgaW1hZ2VfY2hhbm5lbF9vcmRlciBhbmQgdGhlIAogICAgaW1hZ2VfZGF0YV90eXBlIG11c3QgbWF0Y2ggc3JjX3NlYXJjaF9pbWFnZS4gVGhlIGhvc3QgcHJvZ3JhbSBpcyByZXNwb25zaWJsZSAKICAgIGZvciBwb3B1bGF0aW5nIHRoZSB0aWxlZCBpbWFnZSB1c2luZyB0aGUgY2xFbnF1ZXVlV3JpdGVJbWFnZSBmdW5jdGlvbiBvciBvdGhlcgogICAgYXBwcm9wcmlhdGUgQVBJIGZ1bmN0aW9uLgogICAgCiAgICBzcmNfY2hlY2tfaW1hZ2UgaXMgdGhlIGlucHV0IHNvdXJjZSBpbWFnZSBmb3Igc2tpcCBjaGVja3Mgb3BlcmF0aW9ucywgCiAgICB0eXBpY2FsbHkgcmVwcmVzZW50aW5nIDgtYml0IGx1bWluYW5jZSBpbmZvcm1hdGlvbi4gSXQgaGFzIHRoZSBzYW1lIAogICAgcmVzdHJpY3Rpb25zIGFzIHNyY19zZWFyY2hfaW1hZ2UuIFRoZSBob3N0IHByb2dyYW0gaXMgcmVzcG9uc2libGUgZm9yIAogICAgcG9wdWxhdGluZyB0aGUgdGlsZWQgaW1hZ2UgdXNpbmcgdGhlIGNsRW5xdWV1ZVdyaXRlSW1hZ2UgZnVuY3Rpb24gb3Igb3RoZXIKICAgIGFwcHJvcHJpYXRlIEFQSSBmdW5jdGlvbi4KICAgIAogICAgcmVmMF9jaGVja19pbWFnZSBpcyB0aGUgaW5wdXQgZm9yd2FyZCByZWZlcmVuY2UgaW1hZ2UgZm9yIHVuaWRpcmVjdGlvbmFsIAogICAgYW5kIGJpZGlyZWN0aW9uYWwgc2tpcCBjaGVjayBvcGVyYXRpb25zLCByZXByZXNlbnRpbmcgOC1iaXQgbHVtaW5hbmNlCiAgICBpbmZvcm1hdGlvbi4gVGhlIGltYWdlX2NoYW5uZWxfb3JkZXIgYW5kIHRoZSBpbWFnZV9kYXRhX3R5cGUgbXVzdCBtYXRjaCAKICAgIHNyY19jaGVja19pbWFnZS4gVGhlIGhvc3QgcHJvZ3JhbSBpcyByZXNwb25zaWJsZSBmb3IgcG9wdWxhdGluZyB0aGUgdGlsZWQKICAgIGltYWdlIHVzaW5nIHRoZSBjbEVucXVldWVXcml0ZUltYWdlIGZ1bmN0aW9uIG9yIG90aGVyCiAgICBhcHByb3ByaWF0ZSBBUEkgZnVuY3Rpb24uCiAgICAKICAgIHJlZjFfY2hlY2tfaW1hZ2UgaXMgdGhlIGlucHV0IGJhY2t3YXJkIHJlZmVyZW5jZSBpbWFnZSBmb3IgYmlkaXJlY3Rpb25hbAogICAgc2tpcCBjaGVjayBvcGVyYXRpb25zLCByZXByZXNlbnRpbmcgOC1iaXQgbHVtaW5hbmNlIGluZm9ybWF0aW9uLiBUaGUgCiAgICBpbWFnZV9jaGFubmVsX29yZGVyIGFuZCB0aGUgaW1hZ2VfZGF0YV90eXBlIG11c3QgbWF0Y2ggc3JjX2NoZWNrX2ltYWdlLiAKICAgIElmIGJpZGlyZWN0aW9uYWwgc2tpcCBjaGVja3MgYXJlIG5vdCB1c2VkIHRoZW4sIHRoaXMgbXVzdCBiZSBzZXQgdG8KICAgIHRoZSBzYW1lIGltYWdlIGFzIHJlZjBfY2hlY2tfaW1hZ2UuIFRoZSBob3N0IHByb2dyYW0gaXMgcmVzcG9uc2libGUgZm9yCiAgICBwb3B1bGF0aW5nIHRoZSB0aWxlZCBpbWFnZSB1c2luZyB0aGUgY2xFbnF1ZXVlV3JpdGVJbWFnZSBmdW5jdGlvbiBvciBvdGhlcgogICAgYXBwcm9wcmlhdGUgQVBJIGZ1bmN0aW9uLgogICAgCiAgICBmbGFncyBkZWZpbmVzIGFueSBvcHRpb25hbCBtb2RlcyBvciBiZWhhdmlvcnMgdXNlZCBpbiBjb21wdXRpbmcgbW90aW9uIAogICAgZXN0aW1hdGlvbiwgc2tpcCBjaGVjayBhbmQvb3IgaW50cmEtcHJlZGljdGlvbiBhbGdvcml0aG1zLiAKICAgIEN1cnJlbnRseSAgICAgc3VwcG9ydGVkIGFyZTogCiAgICAKICAgIFR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb24KICAgIC0tLS0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tCiAgICBDTF9NRV9TS0lQX0JMT0NLX1RZUEVfMTZ4MTZfSU5URUwgICAgICBTcGVjaWZpZXMgYSAxNngxNgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2tpcCBjaGVjayBzdWItYmxvY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUuCiAgICAgIAogICAgQ0xfTUVfU0tJUF9CTE9DS19UWVBFXzh4OF9JTlRFTCAgICAgICAgU3BlY2lmaWVzIGEgOHg4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBza2lwIGNoZWNrIHN1Yi1ibG9jawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZS4gIAogICAgCiAgICBDTF9NRV9MVU1BX0lOVFJBX1BSRURJQ1RfRU5BQkxFRF9JTlRFTCBFbmFibGVzIEx1bWEtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlZCBpbnRyYS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWRpY3Rpb24KICAgIAogICAgVGhlIGZvbGxvd2luZyBhZGRpdGlvbmFsIHRva2VuIGlzIHJlc2VydmVkIGZvciBmdXR1cmUgc3VwcG9ydDogIAogICAgCiAgICBUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCiAgICAtLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLQogICAgQ0xfTUVfQ0hST01BX0lOVFJBX1BSRURJQ1RfRU5BQkxFRF9JTlRFTCAgRW5hYmxlcyBjaHJvbWEtYmFzZWQgaW50cmEtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkaWN0aW9uLgogICAgCiAgICBUaGUgQ0xfTUVfU0tJUF9CTE9DS19UWVBFXzE2eDE2X0lOVEVMIGZsYWcgY2Fubm90IGJlIHNldCBhbG9uZyB3aXRoIAogICAgQ0xfTUVfU0tJUF9CTE9DS19UWVBFXzh4OF9JTlRFTCBhcyBza2lwIGNoZWNrcyBjYW4gZWl0aGVyIGJlIGNvbmZpZ3VyZWQKICAgIGZvciBhIDE2eDE2IHN1Yi1ibG9jayBzaXplIG9yIGFuIDh4OCBzdWItYmxvY2sgc2l6ZS4gVGhlIGJlaGF2aW9yIGlzCiAgICB1bmRlZmluZWQgaWYgYm90aCBmbGFncyBhcmUgc2V0LgogICAgCiAgICBzZWFyY2hfY29zdF9wZW5hbHR5IGRlZmluZXMgdGhlIGNvc3QgZnVuY3Rpb24gc2NoZW1lIHVzZWQgaW4gY29tcHV0aW5nIAogICAgY29zdCBwZW5hbHRpZXMuIAogICAgUmVmZXIgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIGFyZ3VtZW50IHNlYXJjaF9jb3N0X3BlbmFsdHkgaW4gdGhlIGZpcnN0IAogICAgYnVpbHQtaW4ga2VybmVsIGJsb2NrX2FkdmFuY2VkX21vdGlvbl9lc3RpbWF0ZV9jaGVja19pbnRlbCBmb3IgZGV0YWlscy4KICAgIAogICAgc2VhcmNoX2Nvc3RfcHJlY2lzaW9uIGRlZmluZXMgdGhlIHBpeGVsIHByZWNpc2lvbiBvZiB0aGUgY29zdCBwZW5hbHR5IAogICAgY2FsY3VsYXRpb25zLiAKICAgIFJlZmVyIHRvIHRoZSBkZXNjcmlwdGlvbiBvZiBhcmd1bWVudCBzZWFyY2hfY29zdF9wcmVjaXNpb24gaW4gdGhlIGZpcnN0IAogICAgYnVpbHQtaW4ga2VybmVsIGJsb2NrX2FkdmFuY2VkX21vdGlvbl9lc3RpbWF0ZV9jaGVja19pbnRlbCBmb3IgZGV0YWlscy4KICAgIAogICAgY291bnRfZ2xvYmFsIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHNjYWxhciBjb3VudHMgb2YgcHJlZGljdG9yIAogICAgbW90aW9uIHZlY3RvcnMgYW5kIHNraXAtY2hlY2sgbW90aW9uIHZlY3RvcnMgZ2xvYmFsbHkgZm9yIGFsbCAKICAgIG1hY3JvYmxvY2tzLiBUaGlzIGNhbiBiZSB1c2VkIGluIGxpZXUgb2Ygc2V0dGluZyB0aGUgCiAgICBjb3VudF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBpZiB0aGUgbnVtYmVyIG9mIHByZWRpY3RvciBtb3Rpb24gdmVjdG9ycwogICAgYW5kIHNraXAtY2hlY2sgbW90aW9uIHZlY3RvcnMgYXJlIHVuaWZvcm0gZm9yIGFsbCBtYWNyby1ibG9ja3MuIAogICAgSXQgaXMgc3BlY2lmaWVkIGFzIGEgcGFpciBvZiBzaG9ydCBpbnRlZ2Vycy4gVGhlIGZpcnN0IHZhbHVlIGluIHRoZSAKICAgIHBhaXIgaXMgdGhlIGNvdW50IG9mIHByZWRpY3RvciBNVnMgYW5kIHRoZSBzZWNvbmQgdmFsdWUgaXMgdGhlIGNvdW50CiAgICBvZiBza2lwIGNoZWNrIE1Wcy4gSWYgZWl0aGVyIHZhbHVlIGlzIC0xLCB0aGVuIHRoZSBjb3JyZXNwb25kaW5nIGNvdW50CiAgICBpcyB0YWtlbiBmcm9tIHRoZSBwZXIgbWFjcm9ibG9jayBlbnRyeSBmb3IgZWFjaCBtYWNyb2Jsb2NrIGFzIAogICAgc3BlY2lmaWVkIGluIGNvdW50X21vdGlvbl92ZWN0b3JfYnVmZmVyLgogICAgCiAgICBjb3VudF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBkZWZpbmVzIHRoZSBudW1iZXIgb2YgcHJlZGljdG9yIG1vdGlvbiAKICAgIHZlY3RvcnMgYW5kIHNraXAtY2hlY2sgbW90aW9uIHZlY3RvcnMgZGVmaW5lZCBmb3IgZWFjaCBtYWNyb2Jsb2NrLiAKICAgIFRoZSBidWZmZXIgY29udGFpbnMgYW4gYXJyYXkgb2Ygc2hvcnQgaW50ZWdlciBwYWlycywgb25lIHBhaXIgcGVyIAogICAgTUIuIFRoZSBpbmRpY2VzIG9mIHRoZSBhcnJheSBjb3JyZXNwb25kIHRvIHRoZSBjb250aWd1b3VzIHJvdy1tYWpvcgogICAgYmxvY2sgbGF5b3V0IG9mIHRoZSBpbnB1dCBmcmFtZS4gVGhlIGZpcnN0IHZhbHVlIGluIGVhY2ggcGFpciAKICAgIGRlZmluZXMgdGhlIG51bWJlciBvZiBwcmVkaWN0b3IgbW90aW9uIHZlY3RvcnMgZm9yIGEgZ2l2ZW4gTUI7IHRoaXMKICAgIHZhbHVlIGRlZmluZXMgdGhlIHJhbmdlIG9mIHZhbGlkIGVudHJpZXMgZm9yIHRoZSBNQiBjb250YWluZWQgd2l0aGluCiAgICB0aGUgcHJlZGljdG9yX21vdGlvbl92ZWN0b3JfYnVmZmVyIGFycmF5LiBUaGlzIHZhbHVlIGlzIHVzZWQgb25seSBpZgogICAgdGhlIHByZWRpY3RvciBjb3VudCBpbiBjb3VudF9nbG9iYWwgaXMgLTEuIFRoZSBzZWNvbmQgdmFsdWUgaW4gZWFjaCAKICAgIHBhaXIgZGVmaW5lcyB0aGUgbnVtYmVyIG9mIHNraXAtY2hlY2sgbW90aW9uIHZlY3RvcnMgZm9yIHRoZSBNQjsgCiAgICB0aGlzIHZhbHVlIGRlZmluZXMgdGhlIHJhbmdlIG9mIHZhbGlkIGVudHJpZXMgaW4gdGhlIAogICAgc2tpcF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBhcnJheS4gVGhpcyB2YWx1ZSBpcyB1c2VkIG9ubHkgaWYgdGhlIAogICAgc2tpcC1jaGVjayBNViBjb3VudCBpbiBjb3VudF9nbG9iYWwgaXMgLTEuIEFsbCBzaXplIHZhbHVlcyBtdXN0IGJlCiAgICBiZXR3ZWVuIDAgYW5kIDQgaW5jbHVzaXZlOyBzaXplIHZhbHVlcyBncmVhdGVyIHRoYW4gNCByZXN1bHQgaW4gCiAgICB1bmRlZmluZWQgYmVoYXZpb3IuIElmIGJvdGggdGhlIHBhaXIgdmFsdWVzIGluIGNvdW50X2dsb2JhbCBpcyAtMSwKICAgIHRoZW4gdGhpcyBhcmd1bWVudCBjYW4gYmUgTlVMTC4KICAgIAogICAgYmlkaXJfd2VpZ2h0IGRlZmluZWQgdGhlIGltcGxpY2l0IGJpZGlyZWN0aW9uYWwgd2VpZ2h0IHRvIGJlIHVzZWQKICAgIHdoZW4gcGVyZm9ybWluZyBiaWRpcmVjdGlvbmFsIHNraXAgY2hlY2tzLiBUaGlzIGlzIHVzZWQgdG8gb2J0YWluIAogICAgdGhlIHdlaWdodGVkIHJlZmVyZW5jZSBwaXhlbHMgZnJvbSB0aGUgZm9yd2FyZCBhbmQgYmFja3dhcmQgYmxvY2tzLiAKICAgIAogICAgVGhlcmUgYXJlIDUgcG9zc2libGUgd2VpZ2h0czogCiAgICAKICAgIFdlaWdodCAgICAgICAgRGVzY3JpcHRpb24KICAgIC0tLS0tLSAgICAgICAgLS0tLS0tLS0tLS0KICAgIENMX01FX0JJRElSX1dFSUdIVF9RVUFSVEVSX0lOVEVMICAgICAgICAgIHF1YXJ0ZXIgZGlzdGFuY2UgZnJvbSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmQgYW5kIHRocmVlLQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhcnRlcnMgZnJvbSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t3YXJkCgogICAgQ0xfTUVfQklESVJfV0VJR0hUX1RISVJEX0lOVEVMICAgICAgICAgICAgb25lLXRoaXJkIGRpc3RhbmNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGZvcndhcmQgYW5kIHR3by0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXJkcyBmcm9tIGJhY2t3YXJkCiAgICAKICAgIENMX01FX0JJRElSX1dFSUdIVF9IQUxGX0lOVEVMICAgICAgICAgICAgIGhhbGYgZGlzdGFuY2UgZnJvbSAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmQgYW5kIGJhY2t3YXJkCiAgICAKICAgIENMX01FX0JJRElSX1dFSUdIVF9UV09fVEhJUkRfSU5URUwgICAgICAgIHR3by10aGlyZCBkaXN0YW5jZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBmb3J3YXJkIGFuZCBvbmUtCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWFydGVycyBmcm9tCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrd2FyZAogICAgCiAgICBDTF9NRV9CSURJUl9XRUlHSFRfVEhSRUVfUVVBUlRFUl9JTlRFTCAgICBxdWFydGVyIGRpc3RhbmNlIGZyb20gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkIGFuZCB0aHJlZS0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHF1YXJ0ZXJzIGZyb20gCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYWNrd2FyZAogICAgCiAgICBwcmVkaWN0b3JfbW90aW9uX3ZlY3Rvcl9idWZmZXIgZGVmaW5lcyBhbiBpbnB1dCBhcnJheSBvZiBzaWduZWQgCiAgICBzaG9ydCBpbnRlZ2VyIHByZWRpY3RvciBNVnMgd2l0aCBxdWFydGVyLXBpeGVsIHJlc29sdXRpb24uIFRoZSBhcnJheQogICAgaXMgIHBhcnRpdGlvbmVkIGludG8gY2x1c3RlcnMgb2YgNCBtb3Rpb24gdmVjdG9ycyBwZXIgTUIgaW4gCiAgICBjb250aWd1b3VzIHJvdy1tYWpvciBvcmRlcmluZy4gVGhlIGJ1ZmZlciBsYXlvdXQgYXNzdW1lcyB0aGUgbWF4aW11bQogICAgc2l6ZSBvZiA0IHByZWRpY3RvciBNVnMgcGVyIE1CIGV2ZW4gaWYgdGhlIGNvdW50X21vdGlvbl92ZWN0b3JfYnVmZmVyIAogICAgYXJyYXkgc3BlY2lmaWVzIGEgc21hbGxlciBwcmVkaWN0b3IgY291bnQuIElmIHRoZSB2YWx1ZSBvZiB0aGUgCiAgICBzZWFyY2hfY29zdF9wZW5hbHR5IGFyZ3VtZW50IGRvZXMgbm90IGVxdWFsIAogICAgQ0xfTUVfQ09TVF9QRU5BTFRZX05PTkVfSU5URUwsIHRoZSBmaXJzdCBwcmVkaWN0b3IgTVYgZm9yIGVhY2ggTUIgaXMKICAgIHVzZWQgYXMgdGhlIGNvc3QgY2VudGVyIGZvciBjb3N0IHBlbmFsdHkgY2FsY3VsYXRpb25zLiBJZiB0aGUgYXJyYXkKICAgIHBhc3NlZCB0byBjb3VudF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBhcmd1bWVudCBzcGVjaWZpZXMgYSBwcmVkaWN0b3IgCiAgICBzaXplIG9mIHplcm8gZm9yIGFsbCBtYWNyb2Jsb2NrcyB0aGlzIGFyZ3VtZW50IGNhbiBiZSBOVUxMLgogICAgCiAgICBza2lwX2lucHV0X21vZGVfYnVmZmVyIGRlZmluZXMgYW4gaW5wdXQgYXJyYXkgb2YgdW5zaWduZWQgY2hhciAKICAgIGludGVnZXJzIGRlZmluaW5nIHRoZSBza2lwIG1vZGVzIGZvciBlYWNoIG1hY3JvYmxvY2suIFRoZSBpbmRpY2VzIG9mCiAgICB0aGUgICAgIGFycmF5ICAgICBjb3JyZXNwb25kIHRvIHRoZSBjb250aWd1b3VzIHJvdy1tYWpvciBibG9jayBsYXlvdXQKICAgIG9mIHRoZSBpbnB1dCBmcmFtZS4gVGhlcmUgaXMgb25lIHVuc2lnbmVkIGNoYXIgaW50ZWdlciBwZXIgbWFjcm9ibG9jay4KICAgIFRoZSBmb2xsb3dpbmcgICAgIDItYml0IHNraXAgbW9kZSBlbnVtZXJhdGlvbiB2YWx1ZXMgYXJlIGRlZmluZWQgZm9yCiAgICBlYWNoIG1hY3JvYmxvY2sgc3ViLWJsb2NrOgogICAgCiAgICBTa2lwIE1vZGUgRW51bWVyYXRpb24gICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tCiAgICBDTF9NRV9GT1JXQVJEX0lOUFVUX01PREVfSU5URUwgICAgICAgIFVuaWRpcmVjdGlvbmFsIHNraXAgTVYgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZm9yd2FyZCBmcmFtZQoKICAgIENMX01FX0JBQ0tXQVJEX0lOUFVUX01PREVfSU5URUwgICAgICAgVW5pZGlyZWN0aW9uYWwgc2tpcCBNViAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSBiYWNrd2FyZCBmcmFtZQoKICAgIENMX01FX0JJUkVDVElPTkFMX0lOUFVUX01PREVfSU5URUwgICAgQmlkaXJlY3Rpb25hbCBza2lwIE1WCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gZm9yd2FyZCBhbmQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2t3YXJkIGZyYW1lcwogICAgCiAgICBUaGUgZm9ybWF0IG9mIGVhY2ggbWFjcm9ibG9jayB1bnNpZ25lZCBjaGFyIGVudHJ5IGRlcGVuZHMgb24gdGhlCiAgICBza2lwIGJsb2NrIHR5cGUgc3BlY2lmaWVkIGluIHRoZSBmbGFncyBwYXJhbWV0ZXIuCiAgICAKICAgIFNraXAgQmxvY2sgVHlwZSAgICBGb3JtYXQKICAgIC0tLS0tLS0tLS0tLS0tLSAgICAtLS0tLS0KICAgIENMX01FX1NLSVBfQkxPQ0tfVFlQRV8xNngxNl9JTlRFTCAgICAgMSAyLWJpdCBza2lwIG1vZGUgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1lcmF0aW9uIHZhbHVlIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmUgc3ViLWJsb2NrCiAgICBDTF9NRV9TS0lQX0JMT0NLX1RZUEVfOHg4X0lOVEVMICAgICAgIDQgMi1iaXQgc2tpcCBtb2RlcyAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYXRpb24gdmFsdWVzIChvbmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGVhY2ggc3ViLWJsb2NrIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQgTVYpIHBhY2tlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRvIHN1Y2Nlc3NpdmUgdHdvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJpdHMgb2YgY2hhcgogICAgCiAgICBza2lwX21vdGlvbl92ZWN0b3JfYnVmZmVyIGRlZmluZXMgYW4gaW5wdXQgYXJyYXkgb2YgcGFpcnMgb2Ygc2lnbmVkCiAgICBzaG9ydCBpbnRlZ2VyIHNraXAtY2hlY2sgTVZzIJYgb25lIGNvbXBvbmVudCBNViBmb3IgdGhlIGZvcndhcmQgCiAgICByZWZlcmVuY2UgaW1hZ2UgYW5kIHRoZSBvdGhlciBjb21wb25lbnQgTVYgZm9yIHRoZSBiYWNrd2FyZCByZWZlcmVuY2UKICAgIGltYWdlLiBUaGUgYnVmZmVyIGxheW91dCBhc3N1bWVzIHRoZSBNVnMgZm9yIGJvdGggdGhlIGZvcndhcmQgYW5kIAogICAgYmFja3dhcmQgcmVmZXJlbmNlIGltYWdlcyBhcmUgc3BlY2lmaWVkLiBJZiB1bmlkaXJlY3Rpb25hbCBmb3J3YXJkIAogICAgb3IgYmFja3dhcmQgY2hlY2sgaXMgc3BlY2lmaWVkIGZvciBhIHNraXAtY2hlY2sgc3ViLWJsb2NrLCB0aGVuIHRoZQogICAgY29ycmVzcG9uZGluZyBiYWNrd2FyZCBvciBmb3J3YXJkIGNvbXBvbmVudCBvZiB0aGUgTVYgcGFpciB3aWxsIAogICAgYmUgaWdub3JlZC4gVGhlIGFycmF5IGlzIHBhcnRpdGlvbmVkIGludG8gY2x1c3RlcnMgb2YgNCBzZXRzIG9mIAogICAgYmlkaXJlY3Rpb25hbCBwYWlycyBtb3Rpb24gdmVjdG9ycyBwZXIgTUIsIGluIGNvbnRpZ3VvdXMgcm93LW1ham9yIAogICAgb3JkZXJpbmcuIFRoZSB2YWx1ZSBvZiBza2lwX2Jsb2NrX3R5cGUgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHBhaXJzCiAgICBvZiBNVnMgZm9yIGVhY2ggb2YgdGhlIDQgZW50cmllczogCiAgICAKICAgIFZhbHVlIG9mIHNraXBfYmxvY2tfdHlwZSAgICAgICAgIE51bWJlciBNViBwYWlycyBpbiBlYWNoIGVudHJ5IAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDTF9NRV9NQl9UWVBFXzE2eDE2X0lOVEVMICAgICAgICAxIE1WIGZvcndhcmQvYmFja3dhcmQgcGFpcgogICAgcGVyIGVudHJ5CiAgICBDTF9NRV9NQl9UWVBFXzh4OF9JTlRFTCAgICAgICAgICA0IE1WIGZvcndhcmQvYmFja3dhcmQgcGFpcnMgCiAgICBwZXIgTUIKICAgIAogICAgVGhlIGJ1ZmZlciBsYXlvdXQgYXNzdW1lcyB0aGUgbWF4aW11bSBzaXplIG9mIDQgTVYgcGFpciBlbnRyaWVzIHBlciBNQiwgCiAgICBldmVuIGlmIHRoZSBjb3VudF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBhcnJheSBzcGVjaWZpZXMgYSBzbWFsbGVyIHNraXAtCiAgICBjaGVjayBjb3VudC4gSWYgdGhlIGFycmF5IHBhc3NlZCB0byBjb3VudF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBzcGVjaWZpZXMKICAgIGEgc2tpcC1jaGVjayBzaXplIG9mIHplcm8gZm9yIGFsbCBtYWNybyBibG9ja3MsIG5vIHNraXAgY2hlY2sgCiAgICBjb21wdXRhdGlvbiBpcyBwZXJmb3JtZWQgYW5kIHRoaXMgYXJndW1lbnQgY2FuIGJlIE5VTEwuIAogICAgICAgIAogICAgc2VhcmNoX21vdGlvbl92ZWN0b3JfYnVmZmVyIGRlZmluZXMgYW4gb3V0cHV0IGFycmF5IG9mIHNpZ25lZCBzaG9ydCAKICAgIGludGVnZXJzIHBhaXJzIGRlZmluaW5nIHRoZSBiZXN0IHNlYXJjaCBtb3Rpb24gdmVjdG9ycyBwZXIgbWFjcm8gYmxvY2suICAgIAogICAgUmVmZXIgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIGFyZ3VtZW50IHNlYXJjaF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBpbiAKICAgIHRoZSBmaXJzdCBidWlsdC1pbiBrZXJuZWwgYmxvY2tfYWR2YW5jZWRfbW90aW9uX2VzdGltYXRlX2NoZWNrX2ludGVsCiAgICBmb3IgZGV0YWlscy4KIAogICAgCiAgICBpbnRyYV9zZWFyY2hfcHJlZGljdGlvbl9tb2Rlc19idWZmZXIgc3BlY2lmaWVzIGFuIG91dHB1dCBidWZmZXIgCiAgICBjb250YWluaW5nIGEgc2VxdWVuY2Ugb2Ygc2lnbmVkIGNoYXJzIGRlc2NyaWJpbmcgdGhlIHByZWRpY3RvciBtb2RlcyAKICAgIHVzZWQgZHVyaW5nIG1vdGlvbiBlc3RpbWF0aW9uLgogICAgUmVmZXIgdG8gdGhlIGRlc2NyaXB0aW9uIG9mIGFyZ3VtZW50IGludHJhX3NlYXJjaF9wcmVkaWN0aW9uX21vZGVzIGluIAogICAgdGhlIGZpcnN0IGJ1aWx0LWluIGtlcm5lbCBibG9ja19hZHZhbmNlZF9tb3Rpb25fZXN0aW1hdGVfY2hlY2tfaW50ZWwKICAgIGZvciBkZXRhaWxzLgoKICAgIAogICAgc2VhcmNoX3Jlc2lkdWFscyBkZWZpbmVzIGFuIG91dHB1dCBidWZmZXIgY29udGFpbmluZyB2ZWN0b3JzIG9mIAogICAgdW5zaWduZWQgc2hvcnQgU0FELWFkanVzdGVkIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBiZXN0IAogICAgc2VhcmNoIG1vdGlvbiB2ZWN0b3JzIHBvcHVsYXRlZCBpbiB0aGUgc2VhcmNoX21vdGlvbl92ZWN0b3JfYnVmZmVyIAogICAgYXJyYXkuCiAgICBSZWZlciB0byB0aGUgZGVzY3JpcHRpb24gb2YgYXJndW1lbnQgc2VhcmNoX3Jlc2lkdWFscyBpbiB0aGUgZmlyc3QgCiAgICBidWlsdC1pbiBrZXJuZWwgYmxvY2tfYWR2YW5jZWRfbW90aW9uX2VzdGltYXRlX2NoZWNrX2ludGVsIGZvciAKICAgIGRldGFpbHMuCiAgICAKICAgIHNraXBfcmVzaWR1YWxzIGRlZmluZXMgYW4gb3V0cHV0IGJ1ZmZlciBjb250YWluaW5nIHZlY3RvcnMgb2YgCiAgICB1bnNpZ25lZCBzaG9ydCBTQUQtYWRqdXN0ZWQgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNraXAtY2hlY2sKICAgIE1WcyBkZWZpbmVkIGJ5IHNraXBfbW90aW9uX3ZlY3Rvcl9idWZmZXIuIFRoZSBhcnJheSBpcyBwYXJ0aXRpb25lZAogICAgaW50byBjbHVzdGVycyBvZiA0IHNldHMgb2YgcmVzaWR1YWwgdmFsdWVzIHBlciBNQiwgaW4gY29udGlndW91cwogICAgcm93LW1ham9yIG9yZGVyaW5nLiBUaGUgdmFsdWUgb2Ygc2tpcF9ibG9ja190eXBlIGRldGVybWluZXMKICAgIHRoZSBudW1iZXIgb2YgdmFsdWVzIGluIGVhY2ggb2YgdGhlIDQgZW50cmllczogCiAgICAKICAgIFZhbHVlIG9mIHNraXBfYmxvY2tfdHlwZSAgICAgTnVtYmVyIE1WcyBpbiBlYWNoIGVudHJ5IAogICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBDTF9NRV9NQl9UWVBFXzE2eDE2X0lOVEVMICAgICAgIDEgcmVzaWR1YWwgcGVyIGVudHJ5CiAgICBDTF9NRV9NQl9UWVBFXzh4OF9JTlRFTCAgICAgICAgIDQgcmVzaWR1YWxzIHBlciBlbnRyeQogICAgCiAgICBUaGUgYnVmZmVyIGxheW91dCBhc3N1bWVzIHRoZSBtYXhpbXVtIHNpemUgb2YgNCByZXNpZHVhbCB2YWx1ZXMgCiAgICBwZXIgTUIsIGhvd2V2ZXIgdGhlIG51bWJlciBvZiB2YWxpZCByZXNpZHVhbCBlbnRyaWVzIGNvcnJlc3BvbmRzCiAgICB0byB0aGUgc2tpcC1jaGVjayBNViBjb3VudCBzcGVjaWZpZWQgaW4gY291bnRfbW90aW9uX3ZlY3Rvcl9idWZmZXIgCiAgICBmb3IgZWFjaCBNQi4gVGhpcyBhcmd1bWVudCBjYW4gYmUgTlVMTC4KICAgIAogICAgaW50cmFfc2VhcmNoX3Jlc2lkdWFscyBkZWZpbmVzIGFuIG91dHB1dCBidWZmZXIgb2YgdW5zaWduZWQgc2hvcnQgCiAgICBTQUQtYWRqdXN0ZWQgdmVjdG9ycyB0aGF0IGNvcnJlc3BvbmQgdG8gdGhlIHJlc2lkdWFsIHZhbHVlcyB1c2VkIAogICAgZHVyaW5nIGludHJhLXByZWRpY3Rpb24uCiAgICBSZWZlciB0byB0aGUgZGVzY3JpcHRpb24gb2YgYXJndW1lbnQgaW50cmFfc2VhcmNoX3Jlc2lkdWFscyBpbiB0aGUKICAgIGZpcnN0IGJ1aWx0LWluIGtlcm5lbCBibG9ja19hZHZhbmNlZF9tb3Rpb25fZXN0aW1hdGVfY2hlY2tfaW50ZWwKICAgIGZvciBkZXRhaWxzLgoKICAgIAogICAgVGhpcyBrZXJuZWwgaXMgcXVldWVkIGZvciBleGVjdXRpb24gdXNpbmcgY2xFbnF1ZXVlTkRSYW5nZUtlcm5lbCgpLiBTZXZlcmFsIGFyZ3VtZW50cyAKICAgIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIGFyZSBzcGVjaWZpYyBmb3IgdGhpcyBrZXJuZWw6CgogICAgRm9yIGJvdGggYnVpbHQtaW4ga2VybmVsczoKCiAgICB3b3JrX2RpbSBtdXN0IGJlIDIuCgogICAgZ2xvYmFsX3dvcmtfc2l6ZSByZXByZXNlbnRzIHRoZSBoZWlnaHQgYW5kIHdpZHRoIG9mIHRoZSBhcmVhIG9mIGludGVyZXN0IHRvIGJlCiAgICBwcm9jZXNzZWQuIAoKICAgIGdsb2JhbF93b3JrX29mZnNldCBzcGVjaWZpZXMgdGhlIHRvcC1sZWZ0IHBvaW50IG9mIHRoZSBhcmVhIG9mIGludGVyZXN0LiAKCiAgICBsb2NhbF93b3JrX3NpemUgbXVzdCBOVUxMLgoKICAgIFRoZSBjb3VudCBhbmQgbGF5b3V0IG9mIG1hY3JvYmxvY2tzIHByb2Nlc3NlZCBpbiB0aGUgZnJhbWUgaXMgYmFzZWQgb24gdGhlIGFyZ3VtZW50cyAKICAgIHBhc3NlZCB0byB0aGUgZ2xvYmFsX3dvcmtfc2l6ZSBhbmQgZ2xvYmFsX3dvcmtfb2Zmc2V0IGFyZ3VtZW50IGFuZCBub3Qgb24gdGhlIAogICAgZGltZW5zaW9ucyBvZiB0aGUgaW5wdXQgYW5kIHJlZmVyZW5jZSBpbWFnZXMuIFRoZSBjbGllbnQgbXVzdCBlbnN1cmUgdGhhdCB0aGUgZGF0YSAKICAgIGxheW91dCBvZiBhbGwgYXJyYXlzIHBhc3NlZCBhcyBhcmd1bWVudHMgZGVmaW5lIHRoZSBjb3JyZWN0IG51bWJlciBvZiBtYWNyb2Jsb2Nrcy4gCiAgICBUaGUgaGVpZ2h0IGFuZCB3aWR0aCBkaW1lbnNpb25zIG9mIHRoZSBhcmVhIG9mIGludGVyZXN0IHNwZWNpZmllZCBieSBnbG9iYWxfd29ya19zaXplCiAgICBhbmQgZ2xvYmFsX3dvcmtfb2Zmc2V0IG11c3QgYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSAKICAgIHNvdXJjZSBpbWFnZS4gCgogICAgVGhlIGNsRW5xdWV1ZU5EUmFuZ2VLZXJuZWwgZnVuY3Rpb24gcmV0dXJucyB0aGUgdXN1YWwgZXJyb3IgY29kZXMsIGF1Z21lbnRlZCB3aXRoIHRoZQogICAgZm9sbG93aW5nIHNwZWNpZmljIGVycm9yIGNvZGVzIGZvciB0aGlzIGtlcm5lbDoKICAgIAogICAgLSBDTF9JTlZBTElEX1dPUktfRElNRU5TSU9OIGlmIHdvcmtfZGltIGlzIG5vdCAyLiBUaGlzIGJ1aWx0LWluIGtlcm5lbCByZXF1aXJlcyBhIDJEIAogICAgICBORC1yYW5nZS4KCiAgICAtIENMX0lOVkFMSURfV09SS19HUk9VUF9TSVpFIGlmIGxvY2FsX3dvcmtfc2l6ZSBpcyBub3QgTlVMTC4gCiAgICAKICAgIC0gQ0xfSU5WQUxJRF9XT1JLX0dST1VQX1NJWkUgaWYgdGhlIHJlc3BlY3RpdmUgdmFsdWVzIG9mIGdsb2JhbF93b3JrX3NpemVbMF0gYW5kIAogICAgICBnbG9iYWxfd29ya19zaXplWzFdIGV4Y2VlZCB0aGUgd2lkdGggYW5kL29yIGhlaWdodCBvZiBpbnB1dCBpbWFnZXMuCgogICAgLSBDTF9JTlZBTElEX0lNQUdFX0ZPUk1BVF9ERVNDUklQVE9SIGlmIGFuIGltYWdlIG9iamVjdCBwYXNzZWQgYXMgYW4gYXJndW1lbnQgZG9lcyBub3QKICAgICAgaGF2ZSBhIHN1cHBvcnRlZCBmb3JtYXQsIGFzIGxpc3RlZCBhYm92ZS4gICAgCgogICAgLSBDTF9JTlZBTElEX0lNQUdFX0ZPUk1BVCBpZiB0aGUgaW1hZ2Ugb2JqZWN0cyBwYXNzZWQgdG8gc3JjX2ltYWdlIGFuZCByZWZfaW1hZ2UKICAgICAgYXJndW1lbnRzIGRvIG5vdCBjb250YWluIG1hdGNoaW5nIGZvcm1hdHMgYW5kIHNpemVzLiAKCiAgICAtIENMX0lOVkFMSURfR0xPQkFMX09GRlNFVCBpZiB0aGUgcmVzcGVjdGl2ZSB2YWx1ZXMgb2YgZ2xvYmFsX3dvcmtfb2Zmc2V0WzBdIGFuZCAKICAgICAgZ2xvYmFsX3dvcmtfb2Zmc2V0WzFdIGV4Y2VlZCB0aGUgd2lkdGggYW5kL29yIGhlaWdodCBvZiBpbnB1dCBpbWFnZXMuCgogICAgLSBDTF9JTlZBTElEX0tFUk5FTF9BUkdTIGlmIHByZWRpY3Rvcl9tb3Rpb25fdmVjdG9yX2J1ZmZlciBpcyBOVUxMIGFuZCBvbmUgb3IgbW9yZSAKICAgICAgcHJlZGljdG9yIE1WIHNpemVzIHBhc3NlZCB0byBjb3VudF9tb3Rpb25fdmVjdG9yX2J1ZmZlciBhcmUgZ3JlYXRlciB0aGFuIDAuICAgCgogICAgLSBDTF9JTlZBTElEX0tFUk5FTF9BUkdTIGlmIHNraXBfbW90aW9uX3ZlY3Rvcl9idWZmZXIgaXMgTlVMTCBhbmQgb25lIG9yIG1vcmUgYnV0CiAgICAgIHNraXAtY2hlY2sgTVYgc2l6ZXMgcGFzc2VkIHRvIGNvdW50X21vdGlvbl92ZWN0b3JfYnVmZmVyIGFyZSBncmVhdGVyIHRoYW4gMC4KCiAgICAtIENMX0lOVkFMSURfQlVGRkVSX1NJWkUgaWYgYW55IG9mIHRoZSBjbF9tZW0gb2JqZWN0cyBwYXNzZWQgYXMgYXJndW1lbnRzIGhhcyBhIHNpemUKICAgICAgbGVzcyB0aGFuIHRoZSBleHBlY3RlZCBzaXplLiAKCkludGVyYWN0aW9ucyB3aXRoIE90aGVyIEV4dGVuc2lvbnMKCiAgICBUaGUgYWR2YW5jZWQgbW90aW9uIGVzdGltYXRpb24gZXh0ZW5zaW9uIGlzIGJhc2VkIG9uIHRoZSBjbF9pbnRlbF9hY2NlbGVyYXRvciBhbmQgCiAgICBjbF9pbnRlbF9tb3Rpb25fZXN0aW1hdGlvbiAgZXh0ZW5zaW9ucywgYW5kIGlzIGRlZmluZWQgaW4gdGVybXMgb2YgYWRkaXRpb25zIHRvIHRoZQogICAgYmFzZSBhY2NlbGVyYXRvciBhbmQgbW90aW9uIGV4dGVuc2lvbiBkb2N1bWVudHMuCgo=