Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDE1IEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKTogICBNYW51ZWwgSmFuZGVyCgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiogXGZpbGUgICBGREtfYXVkaW8uaAogKiAgXGJyaWVmICBHbG9iYWwgYXVkaW8gc3RydWN0IGFuZCBjb25zdGFudCBkZWZpbml0aW9ucy4KICovCgojaWZuZGVmIEZES19BVURJT19ICiNkZWZpbmUgRkRLX0FVRElPX0gKCiNpbmNsdWRlICJtYWNoaW5lX3R5cGUuaCIKI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCgojaWZkZWYgX19jcGx1c3BsdXMKZXh0ZXJuICJDIgp7CiNlbmRpZgoKLyoqCiAqIEZpbGUgZm9ybWF0IGlkZW50aWZpZXJzLgogKi8KdHlwZWRlZiBlbnVtCnsKICBGRl9VTktOT1dOICAgICAgICAgICA9IC0xLCAvKio8IFVua25vd24gZm9ybWF0LiAgICAgICAgKi8KICBGRl9SQVcgICAgICAgICAgICAgICA9IDAsICAvKio8IE5vIGNvbnRhaW5lciwgYml0IHN0cmVhbSBkYXRhIGNvbnZleWVkICJhcyBpcyIuICovCgogIEZGX01QNF8zR1BQICAgICAgICAgID0gMywgIC8qKjwgM0dQUCBmaWxlIGZvcm1hdC4gICAgICAqLwogIEZGX01QNF9NUDRGICAgICAgICAgID0gNCwgIC8qKjwgTVBFRy00IEZpbGUgZm9ybWF0LiAgICAgKi8KCiAgRkZfUkFXUEFDS0VUUyAgICAgICAgPSA1LCAgLyoqPCBQcm9wcmlldGFyeSByYXcgcGFja2V0IGZpbGUuICovCgogIEZGX0RSTUNUICAgICAgICAgICAgID0gMTIgIC8qKjwgRGlnaXRhbCBSYWRpbyBNb25kaWFsIChEUk0zMC9EUk0rKSBDVCBwcm9wcmlldGFyeSBmaWxlIGZvcm1hdC4gKi8KCn0gRklMRV9GT1JNQVQ7CgovKioKICogVHJhbnNwb3J0IHR5cGUgaWRlbnRpZmllcnMuCiAqLwp0eXBlZGVmIGVudW0KewogIFRUX1VOS05PV04gICAgICAgICAgID0gLTEsIC8qKjwgVW5rbm93biBmb3JtYXQuICAgICAgICAgICAgKi8KICBUVF9NUDRfUkFXICAgICAgICAgICA9IDAsICAvKio8ICJhcyBpcyIgYWNjZXNzIHVuaXRzIChwYWNrZXQgYmFzZWQgc2luY2UgdGhlcmUgaXMgb2J2aW91c2x5IG5vIHN5bmMgbGF5ZXIpICovCiAgVFRfTVA0X0FESUYgICAgICAgICAgPSAxLCAgLyoqPCBBRElGIGJpdHN0cmVhbSBmb3JtYXQuICAgICAqLwogIFRUX01QNF9BRFRTICAgICAgICAgID0gMiwgIC8qKjwgQURUUyBiaXRzdHJlYW0gZm9ybWF0LiAgICAgKi8KCiAgVFRfTVA0X0xBVE1fTUNQMSAgICAgPSA2LCAgLyoqPCBBdWRpbyBNdXggRWxlbWVudHMgd2l0aCBtdXhDb25maWdQcmVzZW50ID0gMSAqLwogIFRUX01QNF9MQVRNX01DUDAgICAgID0gNywgIC8qKjwgQXVkaW8gTXV4IEVsZW1lbnRzIHdpdGggbXV4Q29uZmlnUHJlc2VudCA9IDAsIG91dCBvZiBiYW5kIFN0cmVhbU11eENvbmZpZyAqLwoKICBUVF9NUDRfTE9BUyAgICAgICAgICA9IDEwLCAvKio8IEF1ZGlvIFN5bmMgU3RyZWFtLiAgICAgICAgICovCgogIFRUX0RSTSAgICAgICAgICAgICAgID0gMTIgIC8qKjwgRGlnaXRhbCBSYWRpbyBNb25kaWFsIChEUk0zMC9EUk0rKSBiaXRzdHJlYW0gZm9ybWF0LiAqLwoKfSBUUkFOU1BPUlRfVFlQRTsKCiNkZWZpbmUgVFRfSVNfUEFDS0VUKHgpIFwKICAgICAgICggKCh4KSA9PSBUVF9NUDRfUkFXKSBcCiAgICAgIHx8ICgoeCkgPT0gVFRfRFJNKSBcCiAgICAgIHx8ICgoeCkgPT0gVFRfTVA0X0xBVE1fTUNQMCkgXAogICAgICB8fCAoKHgpID09IFRUX01QNF9MQVRNX01DUDEpICkKCi8qKgogKiBBdWRpbyBPYmplY3QgVHlwZSBkZWZpbml0aW9ucy4KICovCnR5cGVkZWYgZW51bQp7CiAgQU9UX05PTkUgICAgICAgICAgICAgPSAtMSwKICBBT1RfTlVMTF9PQkpFQ1QgICAgICA9IDAsCiAgQU9UX0FBQ19NQUlOICAgICAgICAgPSAxLCAvKio8IE1haW4gcHJvZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgQU9UX0FBQ19MQyAgICAgICAgICAgPSAyLCAvKio8IExvdyBDb21wbGV4aXR5IG9iamVjdCAgICAgICAgICAgICAgICAgICAgICovCiAgQU9UX0FBQ19TU1IgICAgICAgICAgPSAzLAogIEFPVF9BQUNfTFRQICAgICAgICAgID0gNCwKICBBT1RfU0JSICAgICAgICAgICAgICA9IDUsCiAgQU9UX0FBQ19TQ0FMICAgICAgICAgPSA2LAogIEFPVF9UV0lOX1ZRICAgICAgICAgID0gNywKICBBT1RfQ0VMUCAgICAgICAgICAgICA9IDgsCiAgQU9UX0hWWEMgICAgICAgICAgICAgPSA5LAogIEFPVF9SU1ZEXzEwICAgICAgICAgID0gMTAsIC8qKjwgKHJlc2VydmVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBBT1RfUlNWRF8xMSAgICAgICAgICA9IDExLCAvKio8IChyZXNlcnZlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgQU9UX1RUU0kgICAgICAgICAgICAgPSAxMiwgLyoqPCBUVFNJIE9iamVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIEFPVF9NQUlOX1NZTlRIICAgICAgID0gMTMsIC8qKjwgTWFpbiBTeW50aGV0aWMgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgKi8KICBBT1RfV0FWX1RBQl9TWU5USCAgICA9IDE0LCAvKio8IFdhdmV0YWJsZSBTeW50aGVzaXMgb2JqZWN0ICAgICAgICAgICAgICAgICovCiAgQU9UX0dFTl9NSURJICAgICAgICAgPSAxNSwgLyoqPCBHZW5lcmFsIE1JREkgb2JqZWN0ICAgICAgICAgICAgICAgICAgICAgICAqLwogIEFPVF9BTEdfU1lOVEhfQVVEX0ZYID0gMTYsIC8qKjwgQWxnb3JpdGhtaWMgU3ludGhlc2lzIGFuZCBBdWRpbyBGWCBvYmplY3QgKi8KICBBT1RfRVJfQUFDX0xDICAgICAgICA9IDE3LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExvdyBDb21wbGV4aXR5ICAgICovCiAgQU9UX1JTVkRfMTggICAgICAgICAgPSAxOCwgLyoqPCAocmVzZXJ2ZWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIEFPVF9FUl9BQUNfTFRQICAgICAgID0gMTksIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBBQUMgTFRQIG9iamVjdCAgICAgICAgKi8KICBBT1RfRVJfQUFDX1NDQUwgICAgICA9IDIwLCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIFNjYWxhYmxlIG9iamVjdCAgICovCiAgQU9UX0VSX1RXSU5fVlEgICAgICAgPSAyMSwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFR3aW5WUSBvYmplY3QgICAgICAgICAqLwogIEFPVF9FUl9CU0FDICAgICAgICAgID0gMjIsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBCU0FDIG9iamVjdCAgICAgICAgICAgKi8KICBBT1RfRVJfQUFDX0xEICAgICAgICA9IDIzLCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgQUFDIExvd0RlbGF5IG9iamVjdCAgICovCiAgQU9UX0VSX0NFTFAgICAgICAgICAgPSAyNCwgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIENFTFAgb2JqZWN0ICAgICAgICAgICAqLwogIEFPVF9FUl9IVlhDICAgICAgICAgID0gMjUsIC8qKjwgRXJyb3IgUmVzaWxpZW50KEVSKSBIVlhDIG9iamVjdCAgICAgICAgICAgKi8KICBBT1RfRVJfSElMTiAgICAgICAgICA9IDI2LCAvKio8IEVycm9yIFJlc2lsaWVudChFUikgSElMTiBvYmplY3QgICAgICAgICAgICovCiAgQU9UX0VSX1BBUkEgICAgICAgICAgPSAyNywgLyoqPCBFcnJvciBSZXNpbGllbnQoRVIpIFBhcmFtZXRyaWMgb2JqZWN0ICAgICAqLwogIEFPVF9SU1ZEXzI4ICAgICAgICAgID0gMjgsIC8qKjwgbWlnaHQgYmVjb21lIFNTQyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBBT1RfUFMgICAgICAgICAgICAgICA9IDI5LCAvKio8IFBTLCBQYXJhbWV0cmljIFN0ZXJlbyAoaW5jbHVkZXMgU0JSKSAgICAgICovCiAgQU9UX01QRUdTICAgICAgICAgICAgPSAzMCwgLyoqPCBNUEVHIFN1cnJvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICBBT1RfRVNDQVBFICAgICAgICAgICA9IDMxLCAvKio8IFNpZ25hbCBBT1QgdXNlcyBtb3JlIHRoYW4gNSBiaXRzICAgICAgICAgICovCgogIEFPVF9NUDNPTk1QNF9MMSAgICAgID0gMzIsIC8qKjwgTVBFRy1MYXllcjEgaW4gbXA0ICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBBT1RfTVAzT05NUDRfTDIgICAgICA9IDMzLCAvKio8IE1QRUctTGF5ZXIyIGluIG1wNCAgICAgICAgICAgICAgICAgICAgICAgICovCiAgQU9UX01QM09OTVA0X0wzICAgICAgPSAzNCwgLyoqPCBNUEVHLUxheWVyMyBpbiBtcDQgICAgICAgICAgICAgICAgICAgICAgICAqLwogIEFPVF9SU1ZEXzM1ICAgICAgICAgID0gMzUsIC8qKjwgbWlnaHQgYmVjb21lIERTVCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBBT1RfUlNWRF8zNiAgICAgICAgICA9IDM2LCAvKio8IG1pZ2h0IGJlY29tZSBBTFMgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgQU9UX0FBQ19TTFMgICAgICAgICAgPSAzNywgLyoqPCBBQUMgKyBTTFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIEFPVF9TTFMgICAgICAgICAgICAgID0gMzgsIC8qKjwgU0xTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBBT1RfRVJfQUFDX0VMRCAgICAgICA9IDM5LCAvKio8IEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkgICAgICAgICAgICAgICAgICAgICovCgogIEFPVF9VU0FDICAgICAgICAgICAgID0gNDIsIC8qKjwgVVNBQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBBT1RfU0FPQyAgICAgICAgICAgICA9IDQzLCAvKio8IFNBT0MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgQU9UX0xEX01QRUdTICAgICAgICAgPSA0NCwgLyoqPCBMb3cgRGVsYXkgTVBFRyBTdXJyb3VuZCAgICAgICAgICAgICAgICAgICAqLwoKICAvKiBQc2V1ZG8gQU9UcyAqLwogIEFPVF9EUk1fQUFDICAgICAgICAgID0gMTQzLCAvKio8IFZpcnR1YWwgQU9UIGZvciBEUk0gKEVSLUFBQy1TQ0FMIHdpdGhvdXQgU0JSKSAgICAgICAgICAqLwogIEFPVF9EUk1fU0JSICAgICAgICAgID0gMTQ0LCAvKio8IFZpcnR1YWwgQU9UIGZvciBEUk0gKEVSLUFBQy1TQ0FMIHdpdGggU0JSKSAgICAgICAgICAgICAqLwogIEFPVF9EUk1fTVBFR19QUyAgICAgID0gMTQ1ICAvKio8IFZpcnR1YWwgQU9UIGZvciBEUk0gKEVSLUFBQy1TQ0FMIHdpdGggU0JSIGFuZCBNUEVHLVBTKSAqLwoKfSBBVURJT19PQkpFQ1RfVFlQRTsKCiNkZWZpbmUgQ0FOX0RPX1BTKGFvdCkgXAogICgoYW90KSA9PSBBT1RfQUFDX0xDIFwKfHwgKGFvdCkgPT0gQU9UX1NCUiBcCnx8IChhb3QpID09IEFPVF9QUyBcCnx8IChhb3QpID09IEFPVF9FUl9CU0FDIFwKfHwgKGFvdCkgPT0gQU9UX0RSTV9BQUMpCgojZGVmaW5lIElTX1VTQUMoYW90KSBcCiAgKChhb3QpID09IEFPVF9VU0FDKQoKI2RlZmluZSBJU19MT1dERUxBWShhb3QpIFwKICAoKGFvdCkgPT0gQU9UX0VSX0FBQ19MRCBcCnx8IChhb3QpID09IEFPVF9FUl9BQUNfRUxEKQoKLyoqIENoYW5uZWwgTW9kZSAoIDEtNyBlcXVhbHMgTVBFRyBjaGFubmVsIGNvbmZpZ3VyYXRpb25zLCBvdGhlcnMgYXJlIGFyYml0cmFyeSkuICovCnR5cGVkZWYgZW51bSB7CiAgTU9ERV9JTlZBTElEICAgICAgICAgICAgICAgICAgPSAtMSwKICBNT0RFX1VOS05PV04gICAgICAgICAgICAgICAgICA9ICAwLAogIE1PREVfMSAgICAgICAgICAgICAgICAgICAgICAgID0gIDEsICAgICAgIC8qKjwgQyAqLwogIE1PREVfMiAgICAgICAgICAgICAgICAgICAgICAgID0gIDIsICAgICAgIC8qKjwgTCtSICovCiAgTU9ERV8xXzIgICAgICAgICAgICAgICAgICAgICAgPSAgMywgICAgICAgLyoqPCBDLCBMK1IgKi8KICBNT0RFXzFfMl8xICAgICAgICAgICAgICAgICAgICA9ICA0LCAgICAgICAvKio8IEMsIEwrUiwgUmVhciAqLwogIE1PREVfMV8yXzIgICAgICAgICAgICAgICAgICAgID0gIDUsICAgICAgIC8qKjwgQywgTCtSLCBMUytSUyAqLwogIE1PREVfMV8yXzJfMSAgICAgICAgICAgICAgICAgID0gIDYsICAgICAgIC8qKjwgQywgTCtSLCBMUytSUywgTEZFICovCiAgTU9ERV8xXzJfMl8yXzEgICAgICAgICAgICAgICAgPSAgNywgICAgICAgLyoqPCBDLCBMQytSQywgTCtSLCBMUytSUywgTEZFICovCgoKICBNT0RFXzFfMSAgICAgICAgICAgICAgICAgICAgICA9IDE2LCAgICAgICAvKio8IDIgU0NFcyAoZHVhbCBtb25vKSAqLwogIE1PREVfMV8xXzFfMSAgICAgICAgICAgICAgICAgID0gMTcsICAgICAgIC8qKjwgNCBTQ0VzICovCiAgTU9ERV8xXzFfMV8xXzFfMSAgICAgICAgICAgICAgPSAxOCwgICAgICAgLyoqPCA2IFNDRXMgKi8KICBNT0RFXzFfMV8xXzFfMV8xXzFfMSAgICAgICAgICA9IDE5LCAgICAgICAvKio8IDggU0NFcyAqLwogIE1PREVfMV8xXzFfMV8xXzFfMV8xXzFfMV8xXzEgID0gMjAsICAgICAgIC8qKjwgMTIgU0NFcyAqLwoKICBNT0RFXzJfMiAgICAgICAgICAgICAgICAgICAgICA9IDIxLCAgICAgICAvKio8IDIgQ1BFcyAqLwogIE1PREVfMl8yXzIgICAgICAgICAgICAgICAgICAgID0gMjIsICAgICAgIC8qKjwgMyBDUEVzICovCiAgTU9ERV8yXzJfMl8yICAgICAgICAgICAgICAgICAgPSAyMywgICAgICAgLyoqPCA0IENQRXMgKi8KICBNT0RFXzJfMl8yXzJfMl8yICAgICAgICAgICAgICA9IDI0LCAgICAgICAvKio8IDYgQ1BFcyAqLwoKICBNT0RFXzJfMSAgICAgICAgICAgICAgICAgICAgICA9IDMwLCAgICAgICAvKio8IENQRSxTQ0UgKEFSSUIgc3RhbmRhcmQgQjMyKSAqLwoKICBNT0RFXzdfMV9SRUFSX1NVUlJPVU5EICAgICAgICA9IDMzLCAgICAgICAvKio8IEMsIEwrUiwgTFMrUlMsIExyZWFyK1JyZWFyLCBMRkUgKi8KICBNT0RFXzdfMV9GUk9OVF9DRU5URVIgICAgICAgICA9IDM0ICAgICAgICAvKio8IEMsIExDK1JDLCBMK1IsIExTK1JTLCBMRkUgKi8KCn0gQ0hBTk5FTF9NT0RFOwoKLyoqCiAqIFNwZWFrZXIgZGVzY3JpcHRpb24gdGFncy4KICogRG8gbm90IGNoYW5nZSB0aGUgZW51bWVyYXRpb24gdmFsdWVzIHVubGVzcyBpdCBrZWVwcyB0aGUgZm9sbG93aW5nIHNlZ21lbnRhdGlvbjoKICogLSBCaXQgMC0zOiBIb3Jpem9udGFsIHBvc3Rpb24gKDA6IG5vbmUsIDE6IGZyb250LCAyOiBzaWRlLCAzOiBiYWNrLCA0OiBsZmUpCiAqIC0gQml0IDQtNzogVmVydGljYWwgcG9zaXRpb24gKDA6IG5vcm1hbCwgMTogdG9wLCAyOiBib3R0b20pCiAqLwp0eXBlZGVmIGVudW0gewogIEFDVF9OT05FICAgICAgICAgPSAweDAwLAogIEFDVF9GUk9OVCAgICAgICAgPSAweDAxLCAgLyohPCBGcm9udCBzcGVha2VyIHBvc2l0aW9uIChhdCBub3JtYWwgaGVpZ2h0KSAqLwogIEFDVF9TSURFICAgICAgICAgPSAweDAyLCAgLyohPCBTaWRlIHNwZWFrZXIgcG9zaXRpb24gKGF0IG5vcm1hbCBoZWlnaHQpICovCiAgQUNUX0JBQ0sgICAgICAgICA9IDB4MDMsICAvKiE8IEJhY2sgc3BlYWtlciBwb3NpdGlvbiAoYXQgbm9ybWFsIGhlaWdodCkgKi8KICBBQ1RfTEZFICAgICAgICAgID0gMHgwNCwgIC8qITwgTG93IGZyZXF1ZW5jeSBlZmZlY3Qgc3BlYWtlciBwb3N0aW9uIChmcm9udCkgKi8KCiAgQUNUX1RPUCAgICAgICAgICA9IDB4MTAsICAvKiE8IFRvcCBzcGVha2VyIGFyZWEgKGZvciBjb21iaW5hdGlvbiB3aXRoIHNwZWFrZXIgcG9zaXRpb25zKSAqLwogIEFDVF9GUk9OVF9UT1AgICAgPSAweDExLCAgLyohPCBUb3AgZnJvbnQgc3BlYWtlciA9IChBQ1RfRlJPTlR8QUNUX1RPUCkgKi8KICBBQ1RfU0lERV9UT1AgICAgID0gMHgxMiwgIC8qITwgVG9wIHNpZGUgc3BlYWtlciAgPSAoQUNUX1NJREUgfEFDVF9UT1ApICovCiAgQUNUX0JBQ0tfVE9QICAgICA9IDB4MTMsICAvKiE8IFRvcCBiYWNrIHNwZWFrZXIgID0gKEFDVF9CQUNLIHxBQ1RfVE9QKSAqLwoKICBBQ1RfQk9UVE9NICAgICAgID0gMHgyMCwgIC8qITwgQm90dG9tIHNwZWFrZXIgYXJlYSAoZm9yIGNvbWJpbmF0aW9uIHdpdGggc3BlYWtlciBwb3NpdGlvbnMpICovCiAgQUNUX0ZST05UX0JPVFRPTSA9IDB4MjEsICAvKiE8IEJvdHRvbSBmcm9udCBzcGVha2VyID0gKEFDVF9GUk9OVHxBQ1RfQk9UVE9NKSAqLwogIEFDVF9TSURFX0JPVFRPTSAgPSAweDIyLCAgLyohPCBCb3R0b20gc2lkZSBzcGVha2VyICA9IChBQ1RfU0lERSB8QUNUX0JPVFRPTSkgKi8KICBBQ1RfQkFDS19CT1RUT00gID0gMHgyMyAgIC8qITwgQm90dG9tIGJhY2sgc3BlYWtlciAgPSAoQUNUX0JBQ0sgfEFDVF9CT1RUT00pICovCgp9IEFVRElPX0NIQU5ORUxfVFlQRTsKCnR5cGVkZWYgZW51bQp7CiAgU0lHX1VOS05PV04gICAgICAgICAgICAgICAgID0gLTEsCiAgU0lHX0lNUExJQ0lUICAgICAgICAgICAgICAgID0gIDAsCiAgU0lHX0VYUExJQ0lUX0JXX0NPTVBBVElCTEUgID0gIDEsCiAgU0lHX0VYUExJQ0lUX0hJRVJBUkNISUNBTCAgID0gIDIKCn0gU0JSX1BTX1NJR05BTElORzsKCi8qKgogKiBBdWRpbyBDb2RlYyBmbGFncy4KICovCiNkZWZpbmUgQUNfRVJfVkNCMTEgICAgIDB4MDAwMDAxICAvKiE8IGFhY1NlY3Rpb25EYXRhUmVzaWxpZW5jZUZsYWcgICAgIGZsYWcgKGZyb20gQVNDKTogMSBtZWFucyB1c2UgdmlydHVhbCBjb2RlYm9va3MgICovCiNkZWZpbmUgQUNfRVJfUlZMQyAgICAgIDB4MDAwMDAyICAvKiE8IGFhY1NwZWN0cmFsRGF0YVJlc2lsaWVuY2VGbGFnICAgICBmbGFnIChmcm9tIEFTQyk6IDEgbWVhbnMgdXNlIGh1ZmZtYW4gY29kZXdvcmQgcmVvcmRlcmluZyAqLwojZGVmaW5lIEFDX0VSX0hDUiAgICAgICAweDAwMDAwNCAgLyohPCBhYWNTZWN0aW9uRGF0YVJlc2lsaWVuY2VGbGFnICAgICBmbGFnIChmcm9tIEFTQyk6IDEgbWVhbnMgdXNlIHZpcnR1YWwgY29kZWJvb2tzICAqLwojZGVmaW5lIEFDX1NDQUxBQkxFICAgICAweDAwMDAwOCAgLyohPCBBQUMgU2NhbGFibGUqLwojZGVmaW5lIEFDX0VMRCAgICAgICAgICAweDAwMDAxMCAgLyohPCBBQUMtRUxEICovCiNkZWZpbmUgQUNfTEQgICAgICAgICAgIDB4MDAwMDIwICAvKiE8IEFBQy1MRCAqLwojZGVmaW5lIEFDX0VSICAgICAgICAgICAweDAwMDA0MCAgLyohPCBFUiBzeW50YXggKi8KI2RlZmluZSBBQ19CU0FDICAgICAgICAgMHgwMDAwODAgIC8qITwgQlNBQyAqLwojZGVmaW5lIEFDX1VTQUMgICAgICAgICAweDAwMDEwMCAgLyohPCBVU0FDICovCiNkZWZpbmUgQUNfVVNBQ19UVyAgICAgIDB4MDAwMjAwICAvKiE8IFVTQUMgdGltZSB3YXJwZWQgZmlsdGVyIGJhbmsgaXMgYWN0aXZlICovCiNkZWZpbmUgQUNfVVNBQ19OT0lTRSAgIDB4MDAwNDAwICAvKiE8IFVTQUMgbm9pc2UgZmlsbGluZyBpcyBhY3RpdmUgKi8KI2RlZmluZSBBQ19VU0FDX0hCRSAgICAgMHgwMDA4MDAgIC8qITwgVVNBQyBoYXJtb25pYyBiYW5kd2lkdGggZXh0ZW5zaW9uIGlzIGFjdGl2ZSAqLwojZGVmaW5lIEFDX1JTVkQ1MCAgICAgICAweDAwMTAwMCAgLyohPCBSc3ZkNTAgKi8KI2RlZmluZSBBQ19TQlJfUFJFU0VOVCAgMHgwMDIwMDAgIC8qITwgU0JSIHByZXNlbnQgZmxhZyAoZnJvbSBBU0MpICAgICAgICAgICAgICovCiNkZWZpbmUgQUNfU0JSQ1JDICAgICAgIDB4MDA0MDAwICAvKiE8IFNCUiBDUkMgcHJlc2VudCBmbGFnLiBPbmx5IHJlbGV2YW50IGZvciBBQUMtRUxEIGZvciBub3cuICovCiNkZWZpbmUgQUNfUFNfUFJFU0VOVCAgIDB4MDA4MDAwICAvKiE8IFBTIHByZXNlbnQgZmxhZyAoZnJvbSBBU0Mgb3IgaW1wbGljaXQpICAqLwojZGVmaW5lIEFDX01QU19QUkVTRU5UICAweDAxMDAwMCAgLyohPCBNUFMgcHJlc2VudCBmbGFnIChmcm9tIEFTQyBvciBpbXBsaWNpdCkgKi8KI2RlZmluZSBBQ19EUk0gICAgICAgICAgMHgwMjAwMDAgIC8qITwgRFJNIGJpdCBzdHJlYW0gc3ludGF4ICovCiNkZWZpbmUgQUNfSU5ERVAgICAgICAgIDB4MDQwMDAwICAvKiE8IEluZGVwZW5kZW5jeSBmbGFnICovCiNkZWZpbmUgQUNfTVBTX1JFUyAgICAgIDB4MDgwMDAwICAvKiE8IE1QUyByZXNpZHVhbCBpbmRpdmlkdWFsIGNoYW5uZWwgZGF0YS4gKi8KI2RlZmluZSBBQ19EQUIgICAgICAgICAgMHg4MDAwMDAgIC8qITwgREFCIGJpdCBzdHJlYW0gc3ludGF4ICovCiNkZWZpbmUgQUNfTERfTVBTICAgICAweDAxMDAwMDAwICAvKiE8IExvdyBEZWxheSBNUFMuICovCgoKLyogQ09ERVJfQ09ORklHOjpmbGFncyAqLwojZGVmaW5lIENDX01QRUdfSUQgICAgICAgICAweDAwMTAwMDAwCiNkZWZpbmUgQ0NfSVNfQkFTRUxBWUVSICAgIDB4MDAyMDAwMDAKI2RlZmluZSBDQ19QUk9URUNUSU9OICAgICAgMHgwMDQwMDAwMAojZGVmaW5lIENDX1NCUiAgICAgICAgICAgICAweDAwODAwMDAwCiNkZWZpbmUgQ0NfU0JSQ1JDICAgICAgICAgIDB4MDAwMTAwMDAKI2RlZmluZSBDQ19SVkxDICAgICAgICAgICAgMHgwMTAwMDAwMAojZGVmaW5lIENDX1ZDQjExICAgICAgICAgICAweDAyMDAwMDAwCiNkZWZpbmUgQ0NfSENSICAgICAgICAgICAgIDB4MDQwMDAwMDAKI2RlZmluZSBDQ19QU0VVRE9fU1VSUk9VTkQgMHgwODAwMDAwMAojZGVmaW5lIENDX1VTQUNfTk9JU0UgICAgICAweDEwMDAwMDAwCiNkZWZpbmUgQ0NfVVNBQ19UVyAgICAgICAgIDB4MjAwMDAwMDAKI2RlZmluZSBDQ19VU0FDX0hCRSAgICAgICAgMHg0MDAwMDAwMAoKLyoqIEdlbmVyaWMgYXVkaW8gY29kZXIgY29uZmlndXJhdGlvbiBzdHJ1Y3R1cmUuICovCnR5cGVkZWYgc3RydWN0IHsKICBBVURJT19PQkpFQ1RfVFlQRSBhb3Q7ICAgICAgICAgLyoqPCBBdWRpbyBPYmplY3QgVHlwZSAoQU9UKS4gICAgICAgICAgICovCiAgQVVESU9fT0JKRUNUX1RZUEUgZXh0QU9UOyAgICAgIC8qKjwgRXh0ZW5zaW9uIEF1ZGlvIE9iamVjdCBUeXBlIChTQlIpLiAqLwogIENIQU5ORUxfTU9ERSBjaGFubmVsTW9kZTsgICAgICAvKio8IENoYW5uZWwgbW9kZS4gICAgICAgICAgICAgICAgICAgICAgKi8KICBJTlQgICAgICAgIHNhbXBsaW5nUmF0ZTsgICAgICAgLyoqPCBTYW1wbGluZyByYXRlLiAgICAgICAgICAgICAgICAgICAgICovCiAgSU5UICAgICAgICBleHRTYW1wbGluZ1JhdGU7ICAgIC8qKjwgRXh0ZW5kZWQgc2FtcGxlcmF0ZSAoU0JSKS4gICAgICAgICAqLwogIElOVCAgICAgICAgYml0UmF0ZTsgICAgICAgICAgICAvKio8IEF2ZXJhZ2UgYml0cmF0ZS4gICAgICAgICAgICAgICAgICAgKi8KICBpbnQgICAgICAgIHNhbXBsZXNQZXJGcmFtZTsgICAgLyoqPCBOdW1iZXIgb2YgUENNIHNhbXBsZXMgcGVyIGNvZGVjIGZyYW1lIGFuZCBhdWRpbyBjaGFubmVsLiAqLwogIGludCAgICAgICAgbm9DaGFubmVsczsgICAgICAgICAvKio8IE51bWJlciBvZiBhdWRpbyBjaGFubmVscy4gICAgICAgICAgKi8KICBpbnQgICAgICAgIGJpdHNGcmFtZTsKICBpbnQgICAgICAgIG5TdWJGcmFtZXM7ICAgICAgICAgLyoqPCBBbW91bnQgb2YgZW5jb2RlciBzdWJmcmFtZXMuIDEgbWVhbnMgbm8gc3ViZnJhbWluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBpbnQgICAgICAgIEJTQUNudW1PZlN1YkZyYW1lOyAgLyoqPCBUaGUgbnVtYmVyIG9mIHRoZSBzdWItZnJhbWVzIHdoaWNoIGFyZSBncm91cGVkIGFuZCB0cmFuc21pdHRlZCBpbiBhIHN1cGVyLWZyYW1lIChCU0FDKS4gKi8KICBpbnQgICAgICAgIEJTQUNsYXllckxlbmd0aDsgICAgLyoqPCBUaGUgYXZlcmFnZSBsZW5ndGggb2YgdGhlIGxhcmdlLXN0ZXAgbGF5ZXJzIGluIGJ5dGVzIChCU0FDKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICBVSU5UICAgICAgIGZsYWdzOyAgICAgICAgICAgICAgLyoqPCBmbGFncyAqLwogIFVDSEFSICAgICAgbWF0cml4TWl4ZG93bkE7ICAgICAvKio8IE1hdHJpeCBtaXhkb3duIGluZGV4IHRvIHB1dCBpbnRvIFBDRS4gRGVmYXVsdCB2YWx1ZSAwIG1lYW5zIG5vIG1peGRvd24gY29lZmZpY2llbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWQgdmFsdWVzIGFyZSAxLTQgd2hpY2ggY29ycmVzcG9uZCB0byBtYXRyaXhfbWl4ZG93bl9pZHggMC0zLiAqLwogIFVDSEFSICAgICAgaGVhZGVyUGVyaW9kOyAgICAgICAvKio8IEZyYW1lIHBlcmlvZCBmb3Igc2VuZGluZyBpbiBiYW5kIGNvbmZpZ3VyYXRpb24gYnVmZmVycyBpbiB0aGUgdHJhbnNwb3J0IGxheWVyLiAqLwoKICBVQ0hBUiAgICAgIHN0ZXJlb0NvbmZpZ0luZGV4OyAvKio8IFVTQUMgTVBTIHN0ZXJlbyBtb2RlICovCiAgVUNIQVIgICAgICBzYnJNb2RlOyAgICAgICAgICAgLyoqPCBVU0FDIFNCUiBtb2RlICovCiAgU0JSX1BTX1NJR05BTElORyBzYnJTaWduYWxpbmc7LyoqPCAwOiBpbXBsaWNpdCBzaWduYWxpbmcsIDE6IGJhY2t3YXJkcyBjb21wYXRpYmxlIGV4cGxpY2l0IHNpZ25hbGluZywgMjogaGllcmFyY2ljYWwgZXhwbGljaXQgc2lnbmFsaW5nICovCgogIFVDSEFSICAgICAgc2JyUHJlc2VudDsKICBVQ0hBUiAgICAgIHBzUHJlc2VudDsKfSBDT0RFUl9DT05GSUc7CgovKiogTVA0IEVsZW1lbnQgSURzLiAqLwp0eXBlZGVmIGVudW0KewogIElEX05PTkUgPSAtMSwgICAvKio8IEludmFsaWQgRWxlbWVudCBoZWxwZXIgSUQuICAgICAgICAgICAgICovCiAgSURfU0NFID0gMCwgICAgIC8qKjwgU2luZ2xlIENoYW5uZWwgRWxlbWVudC4gICAgICAgICAgICAgICAgKi8KICBJRF9DUEUgPSAxLCAgICAgLyoqPCBDaGFubmVsIFBhaXIgRWxlbWVudC4gICAgICAgICAgICAgICAgICAqLwogIElEX0NDRSA9IDIsICAgICAvKio8IENvdXBsaW5nIENoYW5uZWwgRWxlbWVudC4gICAgICAgICAgICAgICovCiAgSURfTEZFID0gMywgICAgIC8qKjwgTEZFIENoYW5uZWwgRWxlbWVudC4gICAgICAgICAgICAgICAgICAgKi8KICBJRF9EU0UgPSA0LCAgICAgLyoqPCBDdXJyZW50bHkgb25lIERhdGEgU3RyZWFtIEVsZW1lbnQgZm9yIGFuY2lsbGFyeSBkYXRhIGlzIHN1cHBvcnRlZC4gKi8KICBJRF9QQ0UgPSA1LCAgICAgLyoqPCBQcm9ncmFtIENvbmZpZyBFbGVtZW50LiAgICAgICAgICAgICAgICAqLwogIElEX0ZJTCA9IDYsICAgICAvKio8IEZpbGwgRWxlbWVudC4gICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgSURfRU5EID0gNywgICAgIC8qKjwgQXJuaWUgKEVuZCBFbGVtZW50ID0gVGVybWluYXRvcikuICAgICAgKi8KICBJRF9FWFQgPSA4LCAgICAgLyoqPCBFeHRlbnNpb24gUGF5bG9hZCAoRVIgb25seSkuICAgICAgICAgICAqLwogIElEX1NDQUwgPSA5LCAgICAvKio8IEFBQyBzY2FsYWJsZSBlbGVtZW50IChFUiBvbmx5KS4gICAgICAgICovCiAgSURfTEFTVAp9IE1QNF9FTEVNRU5UX0lEOwoKI2RlZmluZSBJU19DSEFOTkVMX0VMRU1FTlQoZWxlbWVudElkKSBcCiAgKChlbGVtZW50SWQpID09IElEX1NDRSBcCnx8IChlbGVtZW50SWQpID09IElEX0NQRSBcCnx8IChlbGVtZW50SWQpID09IElEX0xGRSkKCiNkZWZpbmUgRVhUX0lEX0JJVFMgNCAgLyoqPCBTaXplIGluIGJpdHMgb2YgZXh0ZW5zaW9uIHBheWxvYWQgdHlwZSB0YWdzLiAqLwoKLyoqIEV4dGVuc2lvbiBwYXlsb2FkIHR5cGVzLiAqLwp0eXBlZGVmIGVudW0gewogIEVYVF9GSUwgICAgICAgICAgID0gMHgwMCwKICBFWFRfRklMTF9EQVRBICAgICA9IDB4MDEsCiAgRVhUX0RBVEFfRUxFTUVOVCAgPSAweDAyLAogIEVYVF9EQVRBX0xFTkdUSCAgID0gMHgwMywKICBFWFRfTERTQUNfREFUQSAgICA9IDB4MDksCiAgRVhUX1NBT0NfREFUQSAgICAgPSAweDBhLAogIEVYVF9EWU5BTUlDX1JBTkdFID0gMHgwYiwKICBFWFRfU0FDX0RBVEEgICAgICA9IDB4MGMsCiAgRVhUX1NCUl9EQVRBICAgICAgPSAweDBkLAogIEVYVF9TQlJfREFUQV9DUkMgID0gMHgwZQp9IEVYVF9QQVlMT0FEX1RZUEU7CgoKLyoqCiAqIFByb3ByaWV0YXJ5IHJhdyBwYWNrZXQgZmlsZSBjb25maWd1cmF0aW9uIGRhdGEgdHlwZSBpZGVudGlmaWVyLgogKi8KdHlwZWRlZiBlbnVtCnsKICBUQ19OT1RISU5HID0gMCwgICAgIC8qIE5vIGNvbmZpZ3VyYXRpb24gYXZhaWxhYmxlIC0+IGluLWJhbmQgY29uZmlndXJhdGlvbi4gICAqLwogIFRDX1JBV19BU0MsICAgICAgICAgLyogQ29uZmlndXJhdGlvbiBkYXRhIGZpZWxkIGlzIGEgcmF3IEF1ZGlvU3BlY2lmaWNDb25maWcuICovCiAgVENfUkFXX1NNQywgICAgICAgICAvKiBDb25maWd1cmF0aW9uIGRhdGEgZmllbGQgaXMgYSByYXcgU3RyZWFtTXV4Q29uZmlnLiAgICAgKi8KICBUQ19SQVdfU0RDICAgICAgICAgIC8qIENvbmZpZ3VyYXRpb24gZGF0YSBmaWVsZCBpcyBhIHJhdyBEcm0gU0RDLiAgICAgICAgICAgICAqLwoKfSBUUF9DT05GSUdfVFlQRTsKCi8qCiAqICMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKICogTGlicmFyeSBpZGVudGlmaWNhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcKICogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogKi8KLyogXGNvbmQgKi8KI2RlZmluZSBNT0RVTEVfSURfTUFTSyAgKDB4MDAwMDAwZmYpCiNkZWZpbmUgTU9EVUxFX0lEX1NISUZUICgyNCkKCnR5cGVkZWYgZW51bSB7CiAgRkRLX05PTkUgICA9IDAsCiAgRkRLX1RPT0xTICA9IDEsCiAgRkRLX1NZU0xJQiA9IDIsCiAgRkRLX0FBQ0RFQyA9IDMsCiAgRkRLX0FBQ0VOQyA9IDQsCiAgRkRLX1NCUkRFQyA9IDUsCiAgRkRLX1NCUkVOQyA9IDYsCiAgRkRLX1RQREVDICA9IDcsCiAgRkRLX1RQRU5DICA9IDgsCiAgRkRLX01QU0RFQyA9IDksCiAgRkRLX01QRUdGSUxFUkVBRCAgPSAxMCwKICBGREtfTVBFR0ZJTEVXUklURSA9IDExLAogIEZES19NUDJERUMgPSAxMiwKICBGREtfREFCREVDID0gMTMsCiAgRkRLX0RBQlBBUlNFID0gMTQsCiAgRkRLX0RSTURFQyA9IDE1LAogIEZES19EUk1QQVJTRSA9IDE2LAogIEZES19BQUNMREVOQyA9IDE3LAogIEZES19NUDJFTkMgPSAxOCwKICBGREtfTVAzRU5DID0gMTksCiAgRkRLX01QM0RFQyA9IDIwLAogIEZES19NUDNIRUFEUEhPTkUgPSAyMSwKICBGREtfTVAzU0RFQyA9IDIyLAogIEZES19NUDNTRU5DID0gMjMsCiAgRkRLX0VBRUMgICAgPSAyNCwKICBGREtfREFCRU5DICA9IDI1LAogIEZES19ETUJERUMgID0gMjYsCiAgRkRLX0ZEUkVWRVJCID0gMjcsCiAgRkRLX0RSTUVOQyAgPSAyOCwKICBGREtfTUVUQURBVEFUUkFOU0NPREVSID0gMjksCiAgRkRLX0FDM0RFQyA9IDMwLAogIEZES19QQ01ETVggPSAzMSwKCiAgRkRLX01PRFVMRV9MQVNUCgp9IEZES19NT0RVTEVfSUQ7CgovKiBBQUMgY2FwYWJpbGl0eSBmbGFncyAqLwojZGVmaW5lIENBUEZfQUFDX0xDICAgICAgICAgICAweDAwMDAwMDAxICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIExvdyBDb21wbGV4aXR5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBDQVBGX0VSX0FBQ19MRCAgICAgICAgMHgwMDAwMDAwMiAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBMb3cgRGVsYXkgd2l0aCBFcnJvciBSZXNpbGllbmNlIHRvb2xzLiAgICAgICovCiNkZWZpbmUgQ0FQRl9FUl9BQUNfU0NBTCAgICAgIDB4MDAwMDAwMDQgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgU2NhbGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIENBUEZfRVJfQUFDX0xDICAgICAgICAweDAwMDAwMDA4ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIExvdyBDb21wbGV4aXR5IHdpdGggRXJyb3IgUmVzaWxpZW5jZSB0b29scy4gKi8KI2RlZmluZSBDQVBGX0FBQ180ODAgICAgICAgICAgMHgwMDAwMDAxMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyB3aXRoIDQ4MCBmcmFtZWxlbmd0aC4gICovCiNkZWZpbmUgQ0FQRl9BQUNfNTEyICAgICAgICAgIDB4MDAwMDAwMjAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgd2l0aCA1MTIgZnJhbWVsZW5ndGguICAqLwojZGVmaW5lIENBUEZfQUFDXzk2MCAgICAgICAgICAweDAwMDAwMDQwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIHdpdGggOTYwIGZyYW1lbGVuZ3RoLiAgKi8KI2RlZmluZSBDQVBGX0FBQ18xMDI0ICAgICAgICAgMHgwMDAwMDA4MCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyB3aXRoIDEwMjQgZnJhbWVsZW5ndGguICovCiNkZWZpbmUgQ0FQRl9BQUNfSENSICAgICAgICAgIDB4MDAwMDAxMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgd2l0aCBIdWZmbWFuIENvZGV3b3JkIFJlb3JkZXJpbmcuICAgICovCiNkZWZpbmUgQ0FQRl9BQUNfVkNCMTEgICAgICAgIDB4MDAwMDAyMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgVmlydHVhbCBDb2RlYm9vayAxMS4gICAgKi8KI2RlZmluZSBDQVBGX0FBQ19SVkxDICAgICAgICAgMHgwMDAwMDQwMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBSZXZlcnNpYmxlIFZhcmlhYmxlIExlbmd0aCBDb2RpbmcuICAgKi8KI2RlZmluZSBDQVBGX0FBQ19NUEVHNCAgICAgICAgMHgwMDAwMDgwMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIE1QRUcgZmlsZSBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBDQVBGX0FBQ19EUkMgICAgICAgICAgMHgwMDAwMTAwMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFBQyBEeW5hbWljIFJhbmdlIENvbnRyb2wuICovCiNkZWZpbmUgQ0FQRl9BQUNfQ09OQ0VBTE1FTlQgIDB4MDAwMDIwMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgY29uY2VhbG1lbnQuICAgICAgICAgICAqLwojZGVmaW5lIENBUEZfQUFDX0RSTV9CU0ZPUk1BVCAweDAwMDA0MDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIERSTSBiaXN0cmVhbSBmb3JtYXQuICAgICAgICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgQ0FQRl9FUl9BQUNfRUxEICAgICAgIDB4MDAwMDgwMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgRW5oYW5jZWQgTG93IERlbGF5IHdpdGggRXJyb3IgUmVzaWxpZW5jZSB0b29scy4gICovCiNkZWZpbmUgQ0FQRl9FUl9BQUNfQlNBQyAgICAgIDB4MDAwMTAwMDAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBQUMgQlNBQy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIENBUEZfQUFDX1NVUEVSRlJBTUlORyAweDAwMDIwMDAwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgQUFDIFN1cGVyZnJhbWluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKLyogVHJhbnNwb3J0IGNhcGFiaWxpdHkgZmxhZ3MgKi8KI2RlZmluZSBDQVBGX0FEVFMgICAgICAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEFEVFMgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCiNkZWZpbmUgQ0FQRl9BRElGICAgICAgICAgICAgIDB4MDAwMDAwMDIgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBBRElGIHRyYW5zcG9ydCBmb3JtYXQuICAgICAgICAqLwojZGVmaW5lIENBUEZfTEFUTSAgICAgICAgICAgICAweDAwMDAwMDA0ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgTEFUTSB0cmFuc3BvcnQgZm9ybWF0LiAgICAgICAgKi8KI2RlZmluZSBDQVBGX0xPQVMgICAgICAgICAgICAgMHgwMDAwMDAwOCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIExPQVMgdHJhbnNwb3J0IGZvcm1hdC4gICAgICAgICovCiNkZWZpbmUgQ0FQRl9SQVdQQUNLRVRTICAgICAgIDB4MDAwMDAwMTAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBSQVcgUEFDS0VUUyB0cmFuc3BvcnQgZm9ybWF0LiAqLwojZGVmaW5lIENBUEZfRFJNICAgICAgICAgICAgICAweDAwMDAwMDIwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgRFJNL0RSTSsgdHJhbnNwb3J0IGZvcm1hdC4gICAgKi8KI2RlZmluZSBDQVBGX1JTVkQ1MCAgICAgICAgICAgMHgwMDAwMDA0MCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFJTVkQ1MCB0cmFuc3BvcnQgZm9ybWF0ICAgICAgICovCgovKiBTQlIgY2FwYWJpbGl0eSBmbGFncyAqLwojZGVmaW5lIENBUEZfU0JSX0xQICAgICAgICAgICAweDAwMDAwMDAxICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgU0JSIExvdyBQb3dlciBtb2RlLiAgICAgICAgICAgKi8KI2RlZmluZSBDQVBGX1NCUl9IUSAgICAgICAgICAgMHgwMDAwMDAwMiAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFNCUiBIaWdoIFF1YWxpdHkgbW9kZS4gICAgICAgICovCiNkZWZpbmUgQ0FQRl9TQlJfRFJNX0JTICAgICAgIDB4MDAwMDAwMDQgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIENBUEZfU0JSX0NPTkNFQUxNRU5UICAweDAwMDAwMDA4ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgU0JSIGNvbmNlYWxtZW50LiAgICAgICAgICAgICAgKi8KI2RlZmluZSBDQVBGX1NCUl9EUkMgICAgICAgICAgMHgwMDAwMDAxMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFNCUiBEeW5hbWljIFJhbmdlIENvbnRyb2wuICAgICovCiNkZWZpbmUgQ0FQRl9TQlJfUFNfTVBFRyAgICAgIDB4MDAwMDAwMjAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBNUEVHIFBhcmFtZXRyaWMgU3RlcmVvLiAgICAgICAqLwojZGVmaW5lIENBUEZfU0JSX1BTX0RSTSAgICAgICAweDAwMDAwMDQwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgRFJNIFBhcmFtZXRyaWMgU3RlcmVvLiAgICAgICAgKi8KCi8qIE1QMiBlbmNvZGVyIGNhcGFiaWxpdHkgZmxhZ3MgKi8KI2RlZmluZSBDQVBGX01QMkVOQ19TUyAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIFNlYW1sZXNzIFN3aXRjaGluZy4gICAgICAgICAgICovCiNkZWZpbmUgQ0FQRl9NUDJFTkNfREFCICAgICAgIDB4MDAwMDAwMDIgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBMYXllcjIgREFCLiAgICAgICAgICAgICAgICAgICAqLwoKLyogREFCIGNhcGFiaWxpdHkgZmxhZ3MgKi8KI2RlZmluZSBDQVBGX0RBQl9NUDIgICAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIExheWVyMiBEQUIuICAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgQ0FQRl9EQUJfQUFDICAgICAgICAgIDB4MDAwMDAwMDIgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBEQUIrIChIRS1BQUMgdjIpLiAgICAgICAgICAgICAqLwojZGVmaW5lIENBUEZfREFCX1BBRCAgICAgICAgICAweDAwMDAwMDA0ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgUEFEIGV4dHJhY3Rpb24uICAgICAgICAgICAgICAgKi8KI2RlZmluZSBDQVBGX0RBQl9EUkMgICAgICAgICAgMHgwMDAwMDAwOCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIER5bmFtaWMgUmFuZ2UgQ29udHJvbC4gICAgICAgICovCiNkZWZpbmUgQ0FQRl9EQUJfU1VSUk9VTkQgICAgIDB4MDAwMDAwMTAgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBEQUIgU3Vycm91bmQgKE1QUykuICAgICAgICAgICAqLwoKLyogRE1CIGNhcGFiaWxpdHkgZmxhZ3MgKi8KI2RlZmluZSBDQVBGX0RNQl9CU0FDICAgICAgICAgMHgwMDAwMDAwMSAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIEVSIEFBQyBCU0FDLiAgICAgICAgICAgICAgICAgICovCiNkZWZpbmUgQ0FQRl9ETUJfRFJDICAgICAgICAgIDB4MDAwMDAwMDggIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBEeW5hbWljIFJhbmdlIENvbnRyb2wuICAgICAgICAqLwojZGVmaW5lIENBUEZfRE1CX1NVUlJPVU5EICAgICAweDAwMDAwMDEwICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgRE1CIFN1cnJvdW5kIChNUFMpLiAgICAgICAgICAgKi8KCi8qIFBDTSB1cC9kb3dubW1peCBjYXBhYmlsaXR5IGZsYWdzICovCiNkZWZpbmUgQ0FQRl9ETVhfQkxJTkQgICAgICAgIDB4MDAwMDAwMDEgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBibGluZCBkb3dubWl4aW5nLiAgICAgICAgICAgICAqLwojZGVmaW5lIENBUEZfRE1YX1BDRSAgICAgICAgICAweDAwMDAwMDAyICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgZ3VpZGVkIGRvd25taXggd2l0aCBkYXRhIGZyb20gTVBFRy0yLzQgUHJvZ3JhbSBDb25maWcgRWxlbWVudHMgKFBDRSkuICovCiNkZWZpbmUgQ0FQRl9ETVhfQVJJQiAgICAgICAgIDB4MDAwMDAwMDQgIC8qKjwgU3VwcG9ydCBmbGFnIGZvciBQQ0UgZ3VpZGVkIGRvd25taXggd2l0aCBzbGlnaHRseSBkaWZmZXJlbnQgZXF1YXRpb25zIGFuZCBsZXZlbHMgdG8gZnVsZmlsbCBBUklCIHN0YW5kYXJkLiAqLwojZGVmaW5lIENBUEZfRE1YX0RWQiAgICAgICAgICAweDAwMDAwMDA4ICAvKio8IFN1cHBvcnQgZmxhZyBmb3IgZ3VpZGVkIGRvd25taXggd2l0aCBkYXRhIGZyb20gRFZCIGFuY2lsbGFyeSBkYXRhIGZpZWxkcy4gKi8KI2RlZmluZSBDQVBGX0RNWF9DSF9FWFAgICAgICAgMHgwMDAwMDAxMCAgLyoqPCBTdXBwb3J0IGZsYWcgZm9yIHNpbXBsZSB1cG1peGluZyBieSBkdWJsaWNhdGluZyBjaGFubmVscyBvciBhZGRpbmcgemVybyBjaGFubmVscy4gKi8KLyogXGVuZGNvbmQgKi8KCgovKgogKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAqIExpYnJhcnkgdmVyc2lvbmluZwogKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAqLwoKLyoqCiAqIENvbnZlcnQgZWFjaCBtZW1iZXIgb2YgdmVyc2lvbiBudW1iZXJzIHRvIG9uZSBzaW5nbGUgbnVtZXJpYyB2ZXJzaW9uIHJlcHJlc2VudGF0aW9uLgogKiBccGFyYW0gbGV2MCAgMXN0IGxldmVsIG9mIHZlcnNpb24gbnVtYmVyLgogKiBccGFyYW0gbGV2MSAgMm5kIGxldmVsIG9mIHZlcnNpb24gbnVtYmVyLgogKiBccGFyYW0gbGV2MiAgM3JkIGxldmVsIG9mIHZlcnNpb24gbnVtYmVyLgogICovCiNkZWZpbmUgTElCX1ZFUlNJT04obGV2MCwgbGV2MSwgbGV2MikgKChsZXYwPDwyNCAmIDB4ZmYwMDAwMDApIHwgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGV2MTw8MTYgJiAweDAwZmYwMDAwKSB8IFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxldjI8PDggICYgMHgwMDAwZmYwMCkpCgovKioKICogIEJ1aWxkIHRleHQgc3RyaW5nIG9mIHZlcnNpb24uCiAqLwojZGVmaW5lIExJQl9WRVJTSU9OX1NUUklORyhpbmZvKSBGREtzcHJpbnRmKChpbmZvKS0+dmVyc2lvblN0ciwgIiVkLiVkLiVkIiwgKCgoaW5mbyktPnZlcnNpb24gPj4gMjQpICYgMHhmZiksICgoKGluZm8pLT52ZXJzaW9uID4+IDE2KSAmIDB4ZmYpLCAoKChpbmZvKS0+dmVyc2lvbiA+PiA4ICkgJiAweGZmKSkKCi8qKgogKiAgTGlicmFyeSBpbmZvcm1hdGlvbi4KICovCnR5cGVkZWYgc3RydWN0IExJQl9JTkZPCnsKICBjb25zdCBjaGFyKiB0aXRsZTsKICBjb25zdCBjaGFyKiBidWlsZF9kYXRlOwogIGNvbnN0IGNoYXIqIGJ1aWxkX3RpbWU7CiAgRkRLX01PRFVMRV9JRCBtb2R1bGVfaWQ7CiAgSU5UIHZlcnNpb247CiAgVUlOVCAgZmxhZ3M7CiAgY2hhciB2ZXJzaW9uU3RyWzMyXTsKfSBMSUJfSU5GTzsKCi8qKiBJbml0aWFsaXplIGxpYnJhcnkgaW5mby4gKi8Kc3RhdGljIGlubGluZSB2b2lkIEZES2luaXRMaWJJbmZvKCBMSUJfSU5GTyogaW5mbyApCnsKICBpbnQgaTsKCiAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CiAgICBpbmZvW2ldLm1vZHVsZV9pZCA9IEZES19OT05FOwogIH0KfQoKLyoqIEFxdWlyZSBzdXBwb3J0ZWQgZmVhdHVyZXMgb2YgbGlicmFyeS4gKi8Kc3RhdGljIGlubGluZSBVSU5UIEZES2xpYkluZm9fZ2V0Q2FwYWJpbGl0aWVzKCBjb25zdCBMSUJfSU5GTyogaW5mbywgRkRLX01PRFVMRV9JRCBtb2R1bGVfaWQgKQp7CiAgaW50IGk7CgogIGZvciAoaT0wOyBpPEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CiAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gbW9kdWxlX2lkKSB7CiAgICAgIHJldHVybiBpbmZvW2ldLmZsYWdzOwogICAgfQogIH0KICByZXR1cm4gMDsKfQoKLyoqIFNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYi4gKi8Kc3RhdGljIGlubGluZSBJTlQgRkRLbGliSW5mb19sb29rdXAoIGNvbnN0IExJQl9JTkZPKiBpbmZvLCBGREtfTU9EVUxFX0lEIG1vZHVsZV9pZCApCnsKICBpbnQgaSA9IC0xOwoKICBmb3IgKGkgPSAwOyBpIDwgRkRLX01PRFVMRV9MQVNUOyBpKyspIHsKICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBtb2R1bGVfaWQpCiAgICAgIHJldHVybiAtMTsKICAgIGlmIChpbmZvW2ldLm1vZHVsZV9pZCA9PSBGREtfTk9ORSkKICAgICAgYnJlYWs7CiAgfQogIGlmIChpID09IEZES19NT0RVTEVfTEFTVCkKICAgIHJldHVybiAtMTsKCiAgcmV0dXJuIGk7Cn0KCgovKgogKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAqIEJ1ZmZlciBkZXNjcmlwdGlvbgogKiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAqLwoKLyoqCiAqICBJL08gYnVmZmVyIGRlc2NyaXB0b3IuCiAqLwp0eXBlZGVmIHN0cnVjdCBGREtfYnVmRGVzY3IKewogIHZvaWQgICoqcHBCYXNlOyAgICAgLyohPCBQb2ludGVyIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgYnVmZmVyIGJhc2UgYWRkcmVzc2VzLgogICAgICAgICAgICAgICAgICAgICAgICAgICBTZXQgdG8gTlVMTCBmb3IgYnVmZmVyIHJlcXVpcmVtZW50IGluZm8uICovCiAgVUlOVCAgICpwQnVmU2l6ZTsgICAvKiE8IFBvaW50ZXIgdG8gYW4gYXJyYXkgY29udGFpbmluZyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHBsYWNlZCBpbiB0aGUgc3BlY2lmaWMgYnVmZmVyLiAqLwogIFVJTlQgICAqcEVsZVNpemU7ICAgLyohPCBQb2ludGVyIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIGVsZW1lbnQgc2l6ZSBmb3IgZWFjaCBidWZmZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgaW4gYnl0ZXMuIFRoYXQgaXMgbW9zdGx5IHRoZSBudW1iZXIgcmV0dXJuZWQgYnkgdGhlIHNpemVvZigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZXJhdG9yIGZvciB0aGUgZGF0YSB0eXBlIHVzZWQgZm9yIHRoZSBzcGVjaWZpYyBidWZmZXIuICovCiAgVUlOVCAgICpwQnVmVHlwZTsgICAvKiE8IFBvaW50ZXIgdG8gYW4gYXJyYXkgb2YgYml0IGZpZWxkcyBjb250YWluaW5nIGEgZGVzY3JpcHRpb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGVhY2ggYnVmZmVyLiBTZWUgWFhYIGJlbG93IGZvciBtb3JlIGRldGFpbHMuICAqLwogIFVJTlQgICAgbnVtQnVmczsgICAgLyohPCBUb3RhbCBudW1iZXIgb2YgYnVmZmVycy4gKi8KCn0gRkRLX2J1ZkRlc2NyOwoKLyoqCiAqIEJ1ZmZlciB0eXBlIGRlc2NyaXB0aW9uIGZpZWxkLgogKi8KI2RlZmluZSBGREtfQlVGX1RZUEVfTUFTS19JTyAgICAgKCAweDAzIDw8IDMwICkKI2RlZmluZSBGREtfQlVGX1RZUEVfTUFTS19ERVNDUiAgKCAweDNGIDw8IDE2ICkKI2RlZmluZSBGREtfQlVGX1RZUEVfTUFTS19JRCAgICAgKCAweEZGICkKCiNkZWZpbmUgRkRLX0JVRl9UWVBFX0lOUFVUICAgICAgICggMHgxIDw8IDMwICkKI2RlZmluZSBGREtfQlVGX1RZUEVfT1VUUFVUICAgICAgKCAweDIgPDwgMzAgKQoKI2RlZmluZSBGREtfQlVGX1RZUEVfUENNX0RBVEEgICAgKCAweDEgPDwgMTYgKQojZGVmaW5lIEZES19CVUZfVFlQRV9BTkNfREFUQSAgICAoIDB4MiA8PCAxNiApCiNkZWZpbmUgRkRLX0JVRl9UWVBFX0JTX0RBVEEgICAgICggMHg0IDw8IDE2ICkKCiNpZmRlZiBfX2NwbHVzcGx1cwp9CiNlbmRpZgoKI2VuZGlmIC8qIEZES19BVURJT19IICovCg==