Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRkRLIFBDTSB1dGlscyBtb2R1bGUgICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKICAgRGVzY3JpcHRpb246IERlZmluZXMgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBkb3dubWl4aW5nIG9yIGEgc2ltcGxlIGNoYW5uZWwKICAgICAgICAgICAgICAgIGV4cGFuc2lvbiBpbiB0aGUgUENNIHRpbWUgZG9tYWluLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2lmbmRlZiBfX2xpbnV4X18KI2luY2x1ZGUgPGxvZy9sb2cuaD4KI2VuZGlmCiNpbmNsdWRlICJwY211dGlsc19saWIuaCIKCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgojaW5jbHVkZSAiZml4cG9pbnRfbWF0aC5oIgojaW5jbHVkZSAiRkRLX2NvcmUuaCIKCgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKgogKiAgR0xPQkFMIFNFVFRJTkdTIChHRlIpOiAgKgogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KI2RlZmluZSBEU0VfTUVUQURBVEFfRU5BQkxFICAgICAgICAgIC8qITwgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBNUEVHL0VUU0kgRFZCIGFuY2lsbGFyeSBkYXRhIGZvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVyIGFzc2lzdGVkIGRvd25taXhpbmcgb2YgTVBFRy00IEFBQyBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVBFRy0xLzIgbGF5ZXIgMiBzdHJlYW1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KI2RlZmluZSBQQ0VfTUVUQURBVEFfRU5BQkxFICAgICAgICAgIC8qITwgRW5hYmxlIHRoaXMgdG8gc3VwcG9ydCBNUEVHIG1hdHJpeCBtaXhkb3duIHdpdGggYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2VmZmljaWVudCBjYXJyaWVkIGluIHRoZSBQQ0UuICAgICAgICAgICAgICAgICAgICAgICAqLwoKI2RlZmluZSBQQ01fRE1YX01BWF9JTl9DSEFOTkVMUyAgICAgICAgICAoIDggKSAgIC8qIE5laXRoZXIgdGhlIG1heGltdW0gbnVtYmVyIG9mIGlucHV0IG5vciB0aGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzIC4uLiAqLwojZGVmaW5lIFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyAgICAgICAgICggOCApICAgLyogLi4uIG11c3QgZXhjZWVkIHRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGFubmVscyB0aGF0IHRoZSBmcmFtZXdvcmsgY2FuIGhhbmRsZS4gKi8KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCiAqICAgIFNQRUNJRklDIFNFVFRJTkdTOiAgICAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwojZGVmaW5lIFBDTV9DSEFOTkVMX0VYVEVOU0lPTl9FTkFCTEUgICAgICAgICAgICAgLyohPCBBbGxvdyBtb2R1bGUgdG8gZHVwbGljYXRlIG1vbm8gc2lnbmFscyBvciBhZGQgemVybyBjaGFubmVscyB0byBhY2hpZXZlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNpcmVkIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuICovCgojZGVmaW5lIFBDTV9ETVhfREZMVF9NQVhfT1VUX0NIQU5ORUxTICAgICggNiApICAgLyohPCBUaGUgbWF4aW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBJZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAgdGhlIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgbWl4ZG93biBmb3IgYWxsIGlucHV0IHNpZ25hbHMgd2l0aCBtb3JlIGNoYW5uZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gc3BlY2lmaWVkLiAqLwojZGVmaW5lIFBDTV9ETVhfREZMVF9NSU5fT1VUX0NIQU5ORUxTICAgICggMCApICAgLyohPCBUaGUgbWluaW11bSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiBJZiB0aGUgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAgdGhlIG1vZHVsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWxsIGRvIGNoYW5uZWwgZXh0ZW5zaW9uIGF1dG9tYXRpY2FsbHkgZm9yIGFsbCBpbnB1dCBzaWduYWxzIHdpdGggbGVzcyBjaGFubmVscwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGFuIHNwZWNpZmllZC4gKi8KI2RlZmluZSBQQ01fRE1YX01BWF9ERUxBWV9GUkFNRVMgICAgICAgICAoIDEgKSAgIC8qITwgVGhlIG1heGltdW0gZGVsYXkgZnJhbWVzIHRvIGFsaWduIHRoZSBiaXRzdHJlYW1zIHBheWxvYWQgd2l0aCB0aGUgUENNIG91dHB1dC4gKi8KI2RlZmluZSBQQ01fRE1YX0RGTFRfRVhQSVJZX0ZSQU1FICAgICAgICAoIDUwICkgIC8qITwgSWYgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDAgdGhlIG1peGRvd24gY29lZmZpY2llbnRzIHdpbGwgZXhwaXJlIGJ5IGRlZmF1bHQgYWZ0ZXIgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdpdmVuIG51bWJlciBvZiBmcmFtZXMuIFRoZSB2YWx1ZSA1MCBjb3JyZXNwb25kcyB0byBhdCBsZWFzdCA1MDBtcyAoRkwgOTYwIEAgOTZrSHopICovCi8qICNkZWZpbmUgUENNRE1YX0RFQlVHICovCgovKiBEZXJpdmVkIHNldHRpbmc6CiAqICAgTm8gbmVlZCB0byBlZGl0IGJleW9uZCB0aGlzIGxpbmUuICovCiNpZiBkZWZpbmVkKERTRV9NRVRBREFUQV9FTkFCTEUpIHx8IGRlZmluZWQoUENFX01FVEFEQVRBX0VOQUJMRSkgfHwgZGVmaW5lZChBUklCX01JWERPV05fRU5BQkxFKQogI2RlZmluZSBQQ01fRE9XTk1JWF9FTkFCTEUgICAgICAgICAgICAgICAgICAgICAgLyohPCBHZW5lcmFsbHkgZW5hYmxlIGRvd24gbWl4aW5nLiAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZW5kaWYKI2lmIChQQ01fRE1YX01BWF9JTl9DSEFOTkVMUyA+IDIpIHx8IChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPiAyKQogI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMUyAgICAgICAgICAgICggOCApCiAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTICAgICAgKCA0ICkKICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICBQQ01fRE1YX01BWF9DSEFOTkVMUyAgIC8qIEFsbCBjaGFubmVscyBjYW4gYmUgaW4gb25lIGdyb3VwICovCiNlbHNlCiAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxTICAgICAgICAgICAgKCAzICkgICAvKiBOZWVkIHRvIGFkZCAxIGJlY2F1c2UgdGhlcmUgYXJlIHRocmVlIGNoYW5uZWwgcG9zaXRpb25zIGluIGZpcnN0IGNoYW5uZWwgZ3JvdXAuICovCiAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTICAgICAgKCAxICkgICAvKiBPbmx5IGZyb250IGNoYW5uZWxzIHN1cHBvcnRlZC4gKi8KICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICAoIDIgKSAgIC8qIFRoZSBtYXhpbXVtIG92ZXIgYWxsIGNoYW5uZWwgZ3JvdXBzICovCiNlbmRpZgojaWYgKFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTID4gUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTKQogI2RlZmluZSBQQ01fRE1YX01BWF9JT19DSEFOTkVMUyAgUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMKI2Vsc2UKICNkZWZpbmUgUENNX0RNWF9NQVhfSU9fQ0hBTk5FTFMgIFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUwojZW5kaWYKCi8qIERlY29kZXIgbGlicmFyeSBpbmZvICovCiNkZWZpbmUgUENNRE1YX0xJQl9WTDAgMgojZGVmaW5lIFBDTURNWF9MSUJfVkwxIDQKI2RlZmluZSBQQ01ETVhfTElCX1ZMMiAyCiNkZWZpbmUgUENNRE1YX0xJQl9USVRMRSAiUENNIERvd25taXggTGliIgojaWZkZWYgX19BTkRST0lEX18KI2RlZmluZSBQQ01ETVhfTElCX0JVSUxEX0RBVEUgIiIKI2RlZmluZSBQQ01ETVhfTElCX0JVSUxEX1RJTUUgIiIKI2Vsc2UKI2RlZmluZSBQQ01ETVhfTElCX0JVSUxEX0RBVEUgX19EQVRFX18KI2RlZmluZSBQQ01ETVhfTElCX0JVSUxEX1RJTUUgX19USU1FX18KI2VuZGlmCgoKLyogRml4ZWQgYW5kIHVuaXF1ZSBjaGFubmVsIGdyb3VwIGluZGljZXMuCiAqIFRoZSBsYXN0IGdyb3VwIGluZGV4IGhhcyB0byBiZSBzbWFsbGVyIHRoYW4gUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMuICovCiNkZWZpbmUgQ0hfR1JPVVBfRlJPTlQgKCAwICkKI2RlZmluZSBDSF9HUk9VUF9TSURFICAoIDEgKQojZGVmaW5lIENIX0dST1VQX1JFQVIgICggMiApCiNkZWZpbmUgQ0hfR1JPVVBfTEZFICAgKCAzICkKCi8qIFRoZSBvcmRlcmluZyBvZiB0aGUgZm9sbG93aW5nIGZpeGVkIGNoYW5uZWwgbGFiZWxzIGhhcyB0byBiZSBpbiBNUEVHLTQgc3R5bGUuCiAqIEZyb20gdGhlIGNlbnRlciB0byB0aGUgYmFjayB3aXRoIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWwgaW50ZXJsZWF2ZWQgKHN0YXJ0aW5nIHdpdGggbGVmdCkuCiAqIFRoZSBsYXN0IGNoYW5uZWwgbGFiZWwgaW5kZXggaGFzIHRvIGJlIHNtYWxsZXIgdGhhbiBQQ01fRE1YX01BWF9DSEFOTkVMUy4gKi8KI2RlZmluZSBDRU5URVJfRlJPTlRfQ0hBTk5FTCAgICAoIDAgKSAgICAgLyogQyAgKi8KI2RlZmluZSBMRUZUX0ZST05UX0NIQU5ORUwgICAgICAoIDEgKSAgICAgLyogTCAgKi8KI2RlZmluZSBSSUdIVF9GUk9OVF9DSEFOTkVMICAgICAoIDIgKSAgICAgLyogUiAgKi8KI2RlZmluZSBMRUZUX1JFQVJfQ0hBTk5FTCAgICAgICAoIDMgKSAgICAgLyogTHIgKGFrYSBsZWZ0IGJhY2sgY2hhbm5lbCkgb3IgY2VudGVyIGJhY2sgY2hhbm5lbCAqLwojZGVmaW5lIFJJR0hUX1JFQVJfQ0hBTk5FTCAgICAgICggNCApICAgICAvKiBSciAoYWthIHJpZ2h0IGJhY2sgY2hhbm5lbCkgKi8KI2RlZmluZSBMT1dfRlJFUVVFTkNZX0NIQU5ORUwgICAoIDUgKSAgICAgLyogTGYgKi8KI2RlZmluZSBMRUZUX01VTFRJUFJQU19DSEFOTkVMICAoIDYgKSAgICAgLyogTGVmdCBtdWx0aXB1cnBvc2UgY2hhbm5lbCAqLwojZGVmaW5lIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMICggNyApICAgICAvKiBSaWdodCBtdWx0aXB1cnBvc2UgY2hhbm5lbCAqLwoKLyogTW9yZSBjb25zdGFudHMgKi8KI2RlZmluZSBPTkVfQ0hBTk5FTCAgICAgICAgICAgICAoIDEgKQojZGVmaW5lIFRXT19DSEFOTkVMICAgICAgICAgICAgICggMiApCiNkZWZpbmUgU0lYX0NIQU5ORUwgICAgICAgICAgICAgKCA2ICkKI2RlZmluZSBFSUdIVF9DSEFOTkVMICAgICAgICAgICAoIDggKQoKI2RlZmluZSBQQ01ETVhfQV9JRFhfREVGQVVMVCAgICAoIDIgKQojZGVmaW5lIFBDTURNWF9CX0lEWF9ERUZBVUxUICAgICggMiApCiNkZWZpbmUgUENNRE1YX0xGRV9JRFhfREVGQVVMVCAgKCAxNSApCiNkZWZpbmUgUENNRE1YX0dBSU5fNV9ERUZBVUxUICAgKCAwICkKI2RlZmluZSBQQ01ETVhfR0FJTl8yX0RFRkFVTFQgICAoIDAgKQoKI2RlZmluZSBQQ01ETVhfTUFYX0hFQURST09NICAgICAoIDMgKSAgICAgLyogRGVmaW5lcyB0aGUgbWF4aW11bSBQQ00gc2NhbGluZyBoZWFkcm9vbSB0aGF0IGNhbiBiZSBkb25lIGJ5IGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdHByb2Nlc3Npbmcgc3RlcC4gVGhpcyB2YWx1ZSBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwgdG8gMC4gKi8KCiNkZWZpbmUgRkFMU0UgIDAKI2RlZmluZSBUUlVFICAgMQojZGVmaW5lIElOICAgICAwCiNkZWZpbmUgT1VUICAgIDEKCi8qIFR5cGUgZGVmaW5pdGlvbnM6ICovCiNpZm5kZWYgRE1YX0hJR0hfUFJFQ0lTSU9OX0VOQUJMRQogI2RlZmluZSBGSVhQX0RNWCAgICAgICAgICBGSVhQX1NHTAogI2RlZmluZSBGWF9ETVgyRlhfREJMKHgpICBGWF9TR0wyRlhfREJMKChGSVhQX1NHTCkoeCkpCiAjZGVmaW5lIEZYX0RCTDJGWF9ETVgoeCkgIEZYX0RCTDJGWF9TR0woeCkKICNkZWZpbmUgRkwyRlhDT05TVF9ETVgoeCkgRkwyRlhDT05TVF9TR0woeCkKICNkZWZpbmUgTUFYVkFMX0RNWCAgICAgICAgTUFYVkFMX1NHTAogI2RlZmluZSBGWF9ETVgyU0hSVCh4KSAgICAoKFNIT1JUKSh4KSkKICNkZWZpbmUgRlhfRE1YMkZMKHgpICAgICAgRlhfREJMMkZMKEZYX0RNWDJGWF9EQkwoeCkpCiNlbHNlCiAjZGVmaW5lIEZJWFBfRE1YICAgICAgICAgIEZJWFBfREJMCiAjZGVmaW5lIEZYX0RNWDJGWF9EQkwoeCkgICgoRklYUF9EQkwpKHgpKQogI2RlZmluZSBGWF9EQkwyRlhfRE1YKHgpICAoKEZJWFBfREJMKSh4KQogI2RlZmluZSBGTDJGWENPTlNUX0RNWCh4KSBGTDJGWENPTlNUX0RCTCh4KQogI2RlZmluZSBNQVhWQUxfRE1YICAgICAgICBNQVhWQUxfREJMCiAjZGVmaW5lIEZYX0RNWDJTSFJUKHgpICAgICgoU0hPUlQpKCh4KT4+RlJBQ1RfQklUUykpCiAjZGVmaW5lIEZYX0RNWDJGTCh4KSAgICAgIEZYX0RCTDJGTCh4KQojZW5kaWYKCi8qIFRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcG9zaXRpb25zIGZvciBlYWNoIGdyb3VwIGluIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KICogU2VlIHRoZSBjaGFubmVsIGxhYmVscyBhYm92ZS4gKi8Kc3RhdGljIGNvbnN0IFVDSEFSIG1heENoSW5HcnBbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdID0gewojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxTID4gMykKICAzLCAwLCAyLCAxCiNlbHNlCiAgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQCiNlbmRpZgp9OwoKLyogTGlzdCBvZiBwYWNrZWQgY2hhbm5lbCBtb2RlcyAqLwp0eXBlZGVmIGVudW0KeyAvKiBDSF9NT0RFXzxudW1Gcm9udENoPl88bnVtU2lkZUNoPl88bnVtQmFja0NoPl88bnVtTGZDaD4gKi8KICBDSF9NT0RFX1VOREVGSU5FRCA9IDB4MDAwMCwKICAvKiAxIGNoYW5uZWwgKi8KICBDSF9NT0RFXzFfMF8wXzAgICA9IDB4MDAwMSwgICAvKiBjaENmZyAxICovCiAgLyogMiBjaGFubmVscyAqLwogIENIX01PREVfMl8wXzBfMCAgID0gMHgwMDAyLCAgIC8qIGNoQ2ZnIDIgKi8KICAvKiAzIGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfMF8wICAgPSAweDAwMDMsICAgLyogY2hDZmcgMyAqLwogIENIX01PREVfMl8wXzFfMCAgID0gMHgwMTAyLAogIENIX01PREVfMl8wXzBfMSAgID0gMHgxMDAyLAogIC8qIDQgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMF8xXzAgICA9IDB4MDEwMywgICAvKiBjaENmZyA0ICovCiAgQ0hfTU9ERV8yXzBfMl8wICAgPSAweDAyMDIsCiAgQ0hfTU9ERV8yXzBfMV8xICAgPSAweDExMDIsCiAgQ0hfTU9ERV80XzBfMF8wICAgPSAweDAwMDQsCiAgLyogNSBjaGFubmVscyAqLwogIENIX01PREVfM18wXzJfMCAgID0gMHgwMjAzLCAgIC8qIGNoQ2ZnIDUgKi8KICBDSF9NT0RFXzJfMF8yXzEgICA9IDB4MTIwMiwKICBDSF9NT0RFXzNfMF8xXzEgICA9IDB4MTEwMywKICBDSF9NT0RFXzNfMl8wXzAgICA9IDB4MDAyMywKICBDSF9NT0RFXzVfMF8wXzAgICA9IDB4MDAwNSwKICAvKiA2IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfMl8xICAgPSAweDEyMDMsICAgLyogY2hDZmcgNiAqLwogIENIX01PREVfM18yXzBfMSAgID0gMHgxMDIzLAogIENIX01PREVfM18yXzFfMCAgID0gMHgwMTIzLAogIENIX01PREVfNV8wXzFfMCAgID0gMHgwMTA1LAogIENIX01PREVfNl8wXzBfMCAgID0gMHgwMDA2LAogIC8qIDcgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzJfMl8yXzEgICA9IDB4MTIyMiwKICBDSF9NT0RFXzNfMF8zXzEgICA9IDB4MTMwMywgICAvKiBjaENmZyAxMSAqLwogIENIX01PREVfM18yXzFfMSAgID0gMHgxMTIzLAogIENIX01PREVfM18yXzJfMCAgID0gMHgwMjIzLAogIENIX01PREVfM18wXzJfMiAgID0gMHgyMjAzLAogIENIX01PREVfNV8wXzJfMCAgID0gMHgwMjA1LAogIENIX01PREVfNV8wXzFfMSAgID0gMHgxMTA1LAogIENIX01PREVfN18wXzBfMCAgID0gMHgwMDA3LAogIC8qIDggY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMl8yXzEgICA9IDB4MTIyMywKICBDSF9NT0RFXzNfMF80XzEgICA9IDB4MTQwMywgICAvKiBjaENmZyAxMiAqLwogIENIX01PREVfNV8wXzJfMSAgID0gMHgxMjA1LCAgIC8qIGNoQ2ZnIDcgKyAxNCAqLwogIENIX01PREVfNV8yXzFfMCAgID0gMHgwMTI1LAogIENIX01PREVfM18yXzFfMiAgID0gMHgyMTIzLAogIENIX01PREVfMl8yXzJfMiAgID0gMHgyMjIyLAogIENIX01PREVfM18wXzNfMiAgID0gMHgyMzAzLAogIENIX01PREVfOF8wXzBfMCAgID0gMHgwMDA4Cgp9IFBDTV9ETVhfQ0hBTk5FTF9NT0RFOwoKCi8qIFRoZXNlIGFyZSB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9ucyBsaW5rZWQgdG8KICAgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgZ2l2ZSBieSB0aGUgdXNlcjogKi8Kc3RhdGljIGNvbnN0IFBDTV9ETVhfQ0hBTk5FTF9NT0RFIG91dENoTW9kZVRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTKzFdID0KewogIENIX01PREVfVU5ERUZJTkVELAogIENIX01PREVfMV8wXzBfMCwgIC8qIDEgY2hhbm5lbCAgKi8KICBDSF9NT0RFXzJfMF8wXzAsICAvKiAyIGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfMF8wICAgLyogMyBjaGFubmVscyAqLwojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxTID4gMykKICxDSF9NT0RFXzNfMF8xXzAsICAvKiA0IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfMl8wLCAgLyogNSBjaGFubmVscyAqLwogIENIX01PREVfM18wXzJfMSwgIC8qIDYgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMF8zXzEsICAvKiA3IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfNF8xICAgLyogOCBjaGFubmVscyAqLwojZW5kaWYKfTsKCnN0YXRpYyBjb25zdCBGSVhQX0RNWCBhYk1peEx2bFZhbHVlVGFiWzhdID0KewogIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksICAgLyogc2NhbGVkIGJ5IDEgKi8KICBGTDJGWENPTlNUX0RNWCgwLjg0MWYpLAogIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksCiAgRkwyRlhDT05TVF9ETVgoMC41OTZmKSwKICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLAogIEZMMkZYQ09OU1RfRE1YKDAuNDIyZiksCiAgRkwyRlhDT05TVF9ETVgoMC4zNTVmKSwKICBGTDJGWENPTlNUX0RNWCgwLjBmKQp9OwoKc3RhdGljIGNvbnN0IEZJWFBfRE1YIGxmZU1peEx2bFZhbHVlVGFiWzE2XSA9CnsgLyogICAgICAgICAgICAgdmFsdWUsICAgICAgICBzY2FsZSAqLwogIEZMMkZYQ09OU1RfRE1YKDAuNzkwNWYpLCAgLyogICAgIDIgKi8KICBGTDJGWENPTlNUX0RNWCgwLjUwMDBmKSwgIC8qICAgICAyICovCiAgRkwyRlhDT05TVF9ETVgoMC44Mzk1ZiksICAvKiAgICAgMSAqLwogIEZMMkZYQ09OU1RfRE1YKDAuNzA2NWYpLCAgLyogICAgIDEgKi8KICBGTDJGWENPTlNUX0RNWCgwLjU5NDVmKSwgIC8qICAgICAxICovCiAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwgICAvKiAgICAgMSAqLwogIEZMMkZYQ09OU1RfRE1YKDAuODQxZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC41OTZmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjMxNmYpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC4xNzhmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuMTAwZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjAzMmYpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC4wMTBmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuMDAwZikgICAgLyogICAgIDAgKi8KfTsKCgoKI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKICAvKiBNUEVHIG1hdHJpeCBtaXhkb3duOgogICAgICBTZXQgMTogIEwnID0gKDEgKyAyXi0wLjUgKyBBICleLTEgKiBbTCArIEMgKiAyXi0wLjUgKyBBICogTHNdOwogICAgICAgICAgICAgIFInID0gKDEgKyAyXi0wLjUgKyBBICleLTEgKiBbUiArIEMgKiAyXi0wLjUgKyBBICogUnNdOwoKICAgICAgU2V0IDI6ICBMJyA9ICgxICsgMl4tMC41ICsgMkEgKV4tMSAqIFtMICsgQyAqIDJeLTAuNSAtIEEgKiAoTHMgKyBScyldOwogICAgICAgICAgICAgIFInID0gKDEgKyAyXi0wLjUgKyAyQSApXi0xICogW1IgKyBDICogMl4tMC41ICsgQSAqIChMcyArIFJzKV07CgogICAgICBNID0gKDMgKyAyQSleLTEgKiBbTCArIEMgKyBSICsgQSooTHMgKyBScyldOwogICovCiAgc3RhdGljIGNvbnN0IEZJWFBfRE1YIG1wZWdNaXhEb3duSWR4MkNvZWZbNF0gPQogIHsKICAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3MTA2NzhmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuNWYpLAogICAgRkwyRlhDT05TVF9ETVgoMC4zNTM1NTMzOWYpLAogICAgRkwyRlhDT05TVF9ETVgoMC4wZikKICB9OwoKICBzdGF0aWMgY29uc3QgRklYUF9TR0wgbXBlZ01peERvd25JZHgyUHJlRmFjdFszXVs0XSA9CiAgeyB7ICAvKiBTZXQgMTogKi8KICAgIEZMMkZYQ09OU1RfRE1YKDAuNDE0MjEzNTYyMzczMDk1MGYpLAogICAgRkwyRlhDT05TVF9ETVgoMC40NTMwODE4MzkzMjE5NzI4ZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjQ4NTI4MTM3NDIzODU3MDNmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuNTg1Nzg2NDM3NjI2OTA1MGYpCiAgfSx7ICAvKiBTZXQgMjogKi8KICAgIEZMMkZYQ09OU1RfRE1YKDAuMzIwMzc3MjQxMDE3MDQwN2YpLAogICAgRkwyRlhDT05TVF9ETVgoMC4zNjkzOTgwNjI1MTgxMjkzZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjQxNDIxMzU2MjM3MzA5NTBmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuNTg1Nzg2NDM3NjI2OTA1MGYpCiAgfSx7ICAvKiBNb25vIERNWCBzZXQ6ICovCiAgICBGTDJGWENPTlNUX0RNWCgwLjIyNjU0MDkxOTY2MDk4NjRmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuMjVmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuMjY5NzUyMTQzMzg5ODE3OWYpLAogICAgRkwyRlhDT05TVF9ETVgoMC4zMzMzMzMzMzMzMzMzMzMzZikgfQogIH07CiNlbmRpZiAgLyogUENFX01FVEFEQVRBX0VOQUJMRSAqLwoKCiNkZWZpbmUgVFlQRV9OT05FICAgICAgKCAweDAgKQojZGVmaW5lIFRZUEVfRFNFX0RBVEEgICggMHgxICkKI2RlZmluZSBUWVBFX1BDRV9EQVRBICAoIDB4MiApCgp0eXBlZGVmIHN0cnVjdAp7CiAgVUlOVCAgIHR5cGVGbGFnczsKICAvKiBGcm9tIERTRSAqLwogIFVDSEFSICBjTGV2SWR4OwogIFVDSEFSICBzTGV2SWR4OwogIFVDSEFSICBkbWl4SWR4QTsKICBVQ0hBUiAgZG1peElkeEI7CiAgVUNIQVIgIGRtaXhJZHhMZmU7CiAgVUNIQVIgIGRteEdhaW5JZHgyOwogIFVDSEFSICBkbXhHYWluSWR4NTsKI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKICAvKiBGcm9tIFBDRSAqLwogIFVDSEFSICBtYXRyaXhNaXhkb3duSWR4OwojZW5kaWYKICAvKiBBdHRyaWJ1dGVzOiAqLwogIFNDSEFSICBwc2V1ZG9TdXJyb3VuZDsgICAgICAgICAgICAgICAvKiE8IElmIHNldCB0byAxIHRoZSBzaWduYWwgaXMgcHNldWRvIHN1cnJvdW5kIGNvbXBhdGlibGUuIFRoZSB2YWx1ZSAwIHRlbGxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhdCBpdCBpcyBub3QuIElmIHRoZSB2YWx1ZSBpcyAtMSB0aGUgaW5mb3JtYXRpb24gaXMgbm90IGF2YWlsYWJsZS4gICovCiAgVUlOVCAgIGV4cGlyeUNvdW50OyAgICAgICAgICAgICAgICAgIC8qITwgQ291bnRlciB0byBtb25pdG9yIHRoZSBsaWZlIHRpbWUgb2YgYSBtZXRhIGRhdGEgc2V0LiAqLwoKfSBETVhfQlNfTUVUQV9EQVRBOwoKLyogRGVmYXVsdCBtZXRhZGF0YSAqLwpzdGF0aWMgY29uc3QgRE1YX0JTX01FVEFfREFUQSAgZGZsdE1ldGFEYXRhID0gewogIDAsIDIsIDIsIDIsIDIsIDE1LCAwLCAwLAojaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQogIDAsCiNlbmRpZgogIC0xLCAwCn07CgovKiBEeW5hbWljICh1c2VyKSBwYXJhbXM6CiAgICAgU2VlIHRoZSBkZWZpbml0aW9uIG9mIFBDTURNWF9QQVJBTSBmb3IgZGV0YWlscyBvbiB0aGUgc3BlY2lmaWMgZmllbGRzLiAqLwp0eXBlZGVmIHN0cnVjdAp7CiAgVUlOVCAgIGV4cGlyeUZyYW1lOyAgICAgICAgICAgICAgICAgICAvKiE8IExpbmtlZCB0byBETVhfQlNfREFUQV9FWFBJUllfRlJBTUUgICAgICAgKi8KICBEVUFMX0NIQU5ORUxfTU9ERSBkdWFsQ2hhbm5lbE1vZGU7ICAgIC8qITwgTGlua2VkIHRvIERNWF9EVUFMX0NIQU5ORUxfTU9ERSAgICAgICAgICAqLwogIFBTRVVET19TVVJST1VORF9NT0RFIHBzZXVkb1N1cnJNb2RlOyAgLyohPCBMaW5rZWQgdG8gRE1YX1BTRVVET19TVVJST1VORF9NT0RFICAgICAgICovCiAgU0hPUlQgIG51bU91dENoYW5uZWxzTWluOyAgICAgICAgICAgICAvKiE8IExpbmtlZCB0byBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUyAgKi8KICBTSE9SVCAgbnVtT3V0Q2hhbm5lbHNNYXg7ICAgICAgICAgICAgIC8qITwgTGlua2VkIHRvIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTICAqLwogIFVDSEFSICBmcmFtZURlbGF5OyAgICAgICAgICAgICAgICAgICAgLyohPCBMaW5rZWQgdG8gRE1YX0JTX0RBVEFfREVMQVkgICAgICAgICAgICAgICovCgp9IFBDTV9ETVhfVVNFUl9QQVJBTVM7CgovKiBNb2R1bGVzIG1haW4gZGF0YSBzdHJ1Y3R1cmU6ICovCnN0cnVjdCBQQ01fRE1YX0lOU1RBTkNFCnsKICAvKiBNZXRhZGF0YSAqLwogIERNWF9CU19NRVRBX0RBVEEgICAgIGJzTWV0YURhdGFbUENNX0RNWF9NQVhfREVMQVlfRlJBTUVTKzFdOwogIFBDTV9ETVhfVVNFUl9QQVJBTVMgIHVzZXJQYXJhbXM7CgogIFVDSEFSICBhcHBseVByb2Nlc3Npbmc7ICAgICAgICAgICAgICAvKiE8IEZsYWcgdG8gZW4tL2Rpc2FibGUgbW9kdWxlcyBwcm9jZXNzaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBtYXggY2hhbm5lbCBsaW1pdGluZyBpcyBkb25lIGluZGVwZW5kZW50bHkuICovCn07CgovKiBNZW1vcnkgYWxsb2NhdGlvbiBtYWNybyAqLwpDX0FMTE9DX01FTV9TVEFUSUMoUGNtRG14SW5zdGFuY2UsIHN0cnVjdCBQQ01fRE1YX0lOU1RBTkNFLCAxKQoKCi8qKiBFdmFsdWF0ZSBhIGdpdmVuIGNoYW5uZWwgY29uZmlndXJhdGlvbiBhbmQgZXh0cmFjdCBhIHBhY2tlZCBjaGFubmVsIG1vZGUuIEluIGFkZGl0aW9uIHRoZQogKiAgZnVuY3Rpb24gZ2VuZXJhdGVzIGEgY2hhbm5lbCBvZmZzZXQgdGFibGUgZm9yIHRoZSBtYXBwaW5nIHRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4KICogIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludmVyc2UgdG8gdGhlIGdldENoYW5uZWxEZXNjcmlwdGlvbigpIHJvdXRpbmUuCiAqIEBwYXJhbSBbaW5dIFRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgb2YgdGhlIGdpdmVuIGNvbmZpZ3VyYXRpb24uCiAqIEBwYXJhbSBbaW5dIEFycmF5IGhvbGRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlcyBmb3IgZWFjaCBjaGFubmVsLgogKiBAcGFyYW0gW2luXSBBcnJheSBob2xkaW5nIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRpY2VzIGZvciBlYWNoIGNoYW5uZWwuCiAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSB0aGUgYnVmZmVyIG9mZnNldHMgZm9yIGVhY2ggY2hhbm5lbCBhcmUgc3RvcmVkIGludG8uCiAqIEBwYXJhbSBbb3V0XSBUaGUgZ2VuZXJhdGVkIHBhY2tlZCBjaGFubmVsIG1vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBnaXZlbiBpbnB1dCBjb25maWd1cmF0aW9uLgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8Kc3RhdGljClBDTURNWF9FUlJPUiBnZXRDaGFubmVsTW9kZSAoCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIG51bUNoYW5uZWxzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCiAgICAgICAgY29uc3QgQVVESU9fQ0hBTk5FTF9UWVBFIGNoYW5uZWxUeXBlW10sICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCiAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW10sICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCiAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgIG9mZnNldFRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwgICAgIC8qIG91dCAqLwogICAgICAgIFBDTV9ETVhfQ0hBTk5FTF9NT0RFICAgICpjaE1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KICAgICAgKQp7CiAgVUNIQVIgY2hJZHhbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUF07CiAgVUNIQVIgbnVtQ2hJbkdycFtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU107IC8qIFRvdGFsIG51bSBvZiBjaGFubmVscyBwZXIgZ3JvdXAgb2YgdGhlIGlucHV0IGNvbmZpZyAqLwogIFVDSEFSIG51bUNoRnJlZVtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU107ICAvKiBOdW1iZXIgb2YgZnJlZSBzbG90cyBwZXIgZ3JvdXAgaW4gdGhlIGludGVybmFsIHJlcHIuICovCiAgVUNIQVIgaGFyZFRvUGxhY2VbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOyAgICAgIC8qIExpc3Qgb2YgY2hhbm5lbHMgbm90IG1hdGNoaW5nIHRoZSBpbnRlcm5hbCByZXByLiAqLwogIFVDSEFSIGgycFNvcnRJZHhbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogIFBDTURNWF9FUlJPUiBlcnIgPSBQQ01ETVhfT0s7CiAgaW50ICAgY2gsIGdycElkeDsKICBpbnQgICBudW1DaFRvUGxhY2UgPSAwOwoKICBGREtfQVNTRVJUKGNoYW5uZWxUeXBlICE9IE5VTEwpOwogIEZES19BU1NFUlQoY2hhbm5lbEluZGljZXMgIT0gTlVMTCk7CiAgRkRLX0FTU0VSVChvZmZzZXRUYWJsZSAhPSBOVUxMKTsKICBGREtfQVNTRVJUKGNoTW9kZSAhPSBOVUxMKTsKCiAgLyogRm9yIGRldGFpbHMgc2VlIElTTy9JRUMgMTM4MTgtNzoyMDA1KEUpLCA4LjUuMyBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKi8KICBGREttZW1jbGVhcihudW1DaEluR3JwLCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUypzaXplb2YoVUNIQVIpKTsKICBGREttZW1zZXQob2Zmc2V0VGFibGUsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CiAgRkRLbWVtc2V0KGNoSWR4LCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCpzaXplb2YoVUNIQVIpKTsKICBGREttZW1zZXQoaGFyZFRvUGxhY2UsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CiAgRkRLbWVtc2V0KGgycFNvcnRJZHgsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CiAgLyogR2V0IHRoZSByZXN0cmljdGlvbnMgb2YgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uICovCiAgRkRLbWVtY3B5KG51bUNoRnJlZSwgbWF4Q2hJbkdycCwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMqc2l6ZW9mKFVDSEFSKSk7CgogICpjaE1vZGUgPSBDSF9NT0RFX1VOREVGSU5FRDsKCiAgLyogQ2F0ZWdvcml6ZSBjaGFubmVscyAqLwogIGZvciAoY2ggPSAwOyBjaCA8IG51bUNoYW5uZWxzOyBjaCArPSAxKSB7CiAgICBVQ0hBUiBjaEdycElkeCA9IGNoYW5uZWxJbmRpY2VzW2NoXTsKICAgIGludCBpID0gMCwgajsKCiAgICBzd2l0Y2ggKGNoYW5uZWxUeXBlW2NoXSkgewogICAgY2FzZSBBQ1RfRlJPTlRfVE9QOgogICAgICBjaEdycElkeCArPSBudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXTsgIC8qIEFwcGVuZCBhZnRlciBub3JtYWwgcGxhaW4gKi8KICAgIGNhc2UgQUNUX0ZST05UOgogICAgICBncnBJZHggPSBDSF9HUk9VUF9GUk9OVDsKICAgICAgYnJlYWs7CiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQogICAgY2FzZSBBQ1RfU0lERV9UT1A6CiAgICAgIGNoR3JwSWR4ICs9IG51bUNoSW5HcnBbQ0hfR1JPVVBfU0lERV07ICAgLyogQXBwZW5kIGFmdGVyIG5vcm1hbCBwbGFpbiAqLwogICAgY2FzZSBBQ1RfU0lERToKICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfU0lERTsKICAgICAgYnJlYWs7CiAgICBjYXNlIEFDVF9CQUNLX1RPUDoKICAgICAgY2hHcnBJZHggKz0gbnVtQ2hJbkdycFtDSF9HUk9VUF9SRUFSXTsgICAvKiBBcHBlbmQgYWZ0ZXIgbm9ybWFsIHBsYWluICovCiAgICBjYXNlIEFDVF9CQUNLOgogICAgICBncnBJZHggPSBDSF9HUk9VUF9SRUFSOwogICAgICBicmVhazsKICAgIGNhc2UgQUNUX0xGRToKICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfTEZFOwogICAgICBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OgogICAgICAvKiBGb3VuZCBhIGNoYW5uZWwgdGhhdCBjYW4gbm90IGJlIGNhdGVnb3JpemVkISBNb3N0IGxpa2VseSBkdWUgdG8gY29ycnVwdCBpbnB1dCBzaWduYWxsaW5nLgogICAgICAgICBUaGUgcmVzY3VlIHN0cmF0ZWd5IGlzIHRvIGFwcGVuZCBpdCB0byB0aGUgZnJvbnQgY2hhbm5lbHMgKD0+IGlnbm9yZSBpbmRleCkuCiAgICAgICAgIFRoaXMgY291bGQgY2F1c2Ugc3RyYW5nZSBiZWhhdmlvdXIgc28gcmV0dXJuIGFuIGVycm9yIHRvIHNpZ25hbCBpdC4gKi8KICAgICAgZXJyID0gUENNRE1YX0lOVkFMSURfTU9ERTsKICAgICAgZ3JwSWR4ID0gQ0hfR1JPVVBfRlJPTlQ7CiAgICAgIGNoR3JwSWR4ID0gbnVtQ2hhbm5lbHMgKyBudW1DaFRvUGxhY2U7CiAgICAgIG51bUNoVG9QbGFjZSArPSAxOwogICAgICBicmVhazsKICAgIH0KCiAgICBpZiAobnVtQ2hJbkdycFtncnBJZHhdIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQKSB7CiAgICAgIC8qIFNvcnQgY2hhbm5lbHMgYnkgaW5kZXggKi8KICAgICAgd2hpbGUgKCAoaSA8IG51bUNoSW5HcnBbZ3JwSWR4XSkgJiYgKGNoR3JwSWR4ID4gY2hhbm5lbEluZGljZXNbY2hJZHhbZ3JwSWR4XVtpXV0pICkgewogICAgICAgIGkgKz0gMTsKICAgICAgfQogICAgICBmb3IgKGogPSBudW1DaEluR3JwW2dycElkeF07IGogPiBpOyBqIC09IDEpIHsKICAgICAgICBjaElkeFtncnBJZHhdW2pdID0gY2hJZHhbZ3JwSWR4XVtqLTFdOwogICAgICB9CiAgICAgIGNoSWR4W2dycElkeF1baV0gPSBjaDsKICAgICAgbnVtQ2hJbkdycFtncnBJZHhdICs9IDE7CiAgICB9CiAgfQoKI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCiAgRkRLX0FTU0VSVCggKG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdK251bUNoSW5HcnBbQ0hfR1JPVVBfU0lERV0KICAgICAgICAgICAgICArbnVtQ2hJbkdycFtDSF9HUk9VUF9SRUFSXStudW1DaEluR3JwW0NIX0dST1VQX0xGRV0pID09IG51bUNoYW5uZWxzKTsKI2Vsc2UKICBGREtfQVNTRVJUKCBudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSA9PSBudW1DaGFubmVscyApOwojZW5kaWYKCiAgLyogQ29tcG9zZSBjaGFubmVsIG9mZnNldCB0YWJsZToKICAgKiBNYXAgYWxsIGNoYW5uZWxzIHRvIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbi4gKi8KICBudW1DaFRvUGxhY2UgPSAwOwoKICAvKiBOb24tc3ltbWV0cmljIGNoYW5uZWxzICovCiAgaWYgKG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdICYgMHgxKSB7CiAgICAvKiBPZGQgbnVtYmVyIG9mIGZyb250IGNoYW5uZWxzIC0+IHdlIGhhdmUgYSBjZW50ZXIgY2hhbm5lbC4KICAgICAgIEluIE1QRUctNCB0aGUgY2VudGVyIGhhcyB0aGUgaW5kZXggMC4gKi8KICAgIG9mZnNldFRhYmxlW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IGNoSWR4W0NIX0dST1VQX0ZST05UXVswXTsKICAgIG51bUNoRnJlZVtDSF9HUk9VUF9GUk9OVF0gLT0gMTsKICB9CgogIGZvciAoZ3JwSWR4ID0gMDsgZ3JwSWR4IDwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFM7IGdycElkeCArPSAxKSB7CiAgICBpbnQgY2hNYXBQb3MgPSAwOwogICAgY2ggPSAwOyAgLyogSW5kZXggb2YgY2hhbm5lbCB3aXRoaW4gdGhlIHNwZWNpZmljIGdyb3VwICovCgogICAgc3dpdGNoIChncnBJZHgpIHsKICAgIGNhc2UgQ0hfR1JPVVBfRlJPTlQ6CiAgICAgIGNoTWFwUG9zID0gTEVGVF9GUk9OVF9DSEFOTkVMOwogICAgICBjaCA9IG51bUNoSW5HcnBbZ3JwSWR4XSAmIDB4MTsKICAgICAgYnJlYWs7CiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQogICAgY2FzZSBDSF9HUk9VUF9TSURFOgogICAgICBicmVhazsKICAgIGNhc2UgQ0hfR1JPVVBfUkVBUjoKICAgICAgY2hNYXBQb3MgPSBMRUZUX1JFQVJfQ0hBTk5FTDsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX0dST1VQX0xGRToKICAgICAgY2hNYXBQb3MgPSBMT1dfRlJFUVVFTkNZX0NIQU5ORUw7CiAgICAgIGJyZWFrOwojZW5kaWYKICAgIGRlZmF1bHQ6CiAgICAgIEZES19BU1NFUlQoMCk7CiAgICAgIGNvbnRpbnVlOwogICAgfQoKICAgIC8qIE1hcCBhbGwgY2hhbm5lbHMgb2YgdGhlIGdyb3VwICovCiAgICBmb3IgKCA7IGNoIDwgbnVtQ2hJbkdycFtncnBJZHhdOyBjaCArPSAxKSB7CiAgICAgIGlmIChudW1DaEZyZWVbZ3JwSWR4XSA+IDApIHsKICAgICAgICBvZmZzZXRUYWJsZVtjaE1hcFBvc10gPSBjaElkeFtncnBJZHhdW2NoXTsKICAgICAgICBjaE1hcFBvcyArPSAxOwogICAgICAgIG51bUNoRnJlZVtncnBJZHhdIC09IDE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogQWRkIHRvIHRoZSBsaXN0IG9mIGhhcmRzaGlwIGNhc2VzIGNvbnNpZGVyaW5nIGEgTVBFRy1saWtlIHNvcnRpbmcgb3JkZXI6ICovCiAgICAgICAgaW50IHBvcywgc29ydElkeCA9IGdycElkeCpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgKyBjaGFubmVsSW5kaWNlc1tjaElkeFtncnBJZHhdW2NoXV07CiAgICAgICAgZm9yIChwb3MgPSBudW1DaFRvUGxhY2U7IHBvcyA+IDA7IHBvcyAtPSAxKSB7CiAgICAgICAgICBpZiAoaDJwU29ydElkeFtwb3MtMV0gPiBzb3J0SWR4KSB7CiAgICAgICAgICAgIGhhcmRUb1BsYWNlW3Bvc10gPSBoYXJkVG9QbGFjZVtwb3MtMV07CiAgICAgICAgICAgIGgycFNvcnRJZHhbcG9zXSA9IGgycFNvcnRJZHhbcG9zLTFdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyogSW5zZXJ0IGNoYW5uZWwgYXQgdGhlIGN1cnJlbnQgaW5kZXgvcG9zaXRpb24gKi8KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGhhcmRUb1BsYWNlW3Bvc10gPSBjaElkeFtncnBJZHhdW2NoXTsKICAgICAgICBoMnBTb3J0SWR4W3Bvc10gPSBzb3J0SWR4OwogICAgICAgIG51bUNoVG9QbGFjZSArPSAxOwogICAgICB9CiAgICB9CiAgfQoKICB7IC8qIEFzc2lnbiB0aGUgaGFyZHNoaXAgY2FzZXMgKi8KICAgIGludCBjaE1hcFBvcyA9IDA7CiAgICBpbnQgbWFwcGluZ0hlYXQgPSAwOwogICAgZm9yIChjaCA9IDA7IGNoIDwgbnVtQ2hUb1BsYWNlOyBjaCs9MSkgewogICAgICBpbnQgY2hBc3NpZ25lZCA9IDA7CgogICAgICAvKiBKdXN0IGFzc2lnbmluZyB0aGUgY2hhbm5lbHMgdG8gdGhlIG5leHQgYmVzdCBzbG90IGNhbiBsZWFkIHRvIHVuZGVzaXJlZCByZXN1bHRzIChlc3BlY2lhbGx5IGZvciB4L3gvMS54CiAgICAgICAgIGNvbmZpZ3VyYXRpb25zKS4gVGh1cyB1c2UgdGhlIE1QRUctbGlrZSBzb3J0aW5nIGluZGV4IHRvIGZpbmQgdGhlIGJlc3QgZml0dGluZyBzbG90IGZvciBlYWNoIGNoYW5uZWwuCiAgICAgICAgIElmIHRoaXMgaXMgbm90IHBvc3NpYmxlIHRoZSBzb3J0aW5nIGluZGV4IHdpbGwgYmUgaWdub3JlZCAobWFwcGluZ0hlYXQgPj0gMikuICovCiAgICAgIGZvciAoIDsgY2hNYXBQb3MgPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2hNYXBQb3MrPTEpIHsKICAgICAgICBpZiAob2Zmc2V0VGFibGVbY2hNYXBQb3NdID09IDI1NSkgewogICAgICAgICAgaW50IHBydlNvcnRJZHggPSAwOwogICAgICAgICAgaW50IG54dFNvcnRJZHggPSAoQ0hfR1JPVVBfTEZFKzEpKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUDsKCiAgICAgICAgICBpZiAobWFwcGluZ0hlYXQgPCAyKSB7CiAgICAgICAgICAgIGlmIChjaE1hcFBvcyA8IExFRlRfUkVBUl9DSEFOTkVMKSB7CiAgICAgICAgICAgICAgLyogR290IGZyb250IGNoYW5uZWwgc2xvdCAqLwogICAgICAgICAgICAgIHBydlNvcnRJZHggPSBDSF9HUk9VUF9GUk9OVCpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgKyBjaE1hcFBvcyAtIENFTlRFUl9GUk9OVF9DSEFOTkVMOwogICAgICAgICAgICAgIG54dFNvcnRJZHggPSBDSF9HUk9VUF9TSURFICpQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY2hNYXBQb3MgPCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwpIHsKICAgICAgICAgICAgICAvKiBHb3QgYmFjayBjaGFubmVsIHNsb3QgKi8KICAgICAgICAgICAgICBwcnZTb3J0SWR4ID0gQ0hfR1JPVVBfUkVBUipQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgKyBjaE1hcFBvcyAtIExFRlRfUkVBUl9DSEFOTkVMOwogICAgICAgICAgICAgIG54dFNvcnRJZHggPSBDSF9HUk9VUF9MRkUgKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjaE1hcFBvcyA8IExFRlRfTVVMVElQUlBTX0NIQU5ORUwpIHsKICAgICAgICAgICAgICAvKiBHb3QgbGZlIGNoYW5uZWwgc2xvdCAqLwogICAgICAgICAgICAgIHBydlNvcnRJZHggPSAgQ0hfR1JPVVBfTEZFICAgKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCArIGNoTWFwUG9zIC0gTE9XX0ZSRVFVRU5DWV9DSEFOTkVMOwogICAgICAgICAgICAgIG54dFNvcnRJZHggPSAoQ0hfR1JPVVBfTEZFKzEpKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUDsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8qIEFzc2lnbiB0aGUgY2hhbm5lbCBvbmx5IGlmIGl0cyBzb3J0IGluZGV4IGlzIHdpdGhpbiB0aGUgcmFuZ2UgKi8KICAgICAgICAgIGlmICggKGgycFNvcnRJZHhbY2hdID49IHBydlNvcnRJZHgpCiAgICAgICAgICAgICYmIChoMnBTb3J0SWR4W2NoXSA8ICBueHRTb3J0SWR4KSApIHsKICAgICAgICAgICAgb2Zmc2V0VGFibGVbY2hNYXBQb3MrK10gPSBoYXJkVG9QbGFjZVtjaF07CiAgICAgICAgICAgIGNoQXNzaWduZWQgPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNoQXNzaWduZWQgPT0gMCkgewogICAgICAgIGNoTWFwUG9zID0gMDsKICAgICAgICBjaCAtPSAxOwogICAgICAgIG1hcHBpbmdIZWF0ICs9IDE7CiAgICAgICAgY29udGludWU7CiAgICAgIH0KICAgIH0KICB9CgogIC8qIENvbXBvc2UgdGhlIGNoYW5uZWwgbW9kZSAqLwogICpjaE1vZGUgPSAoUENNX0RNWF9DSEFOTkVMX01PREUpKCAobnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gJiAweEYpCiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAobnVtQ2hJbkdycFtDSF9HUk9VUF9TSURFXSAgJiAweEYpIDw8ICA0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChudW1DaEluR3JwW0NIX0dST1VQX1JFQVJdICAmIDB4RikgPDwgIDgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG51bUNoSW5HcnBbQ0hfR1JPVVBfTEZFXSAgICYgMHhGKSA8PCAxMgojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CgogIHJldHVybiBlcnI7Cn0KCgovKiogR2VuZXJhdGUgYSBjaGFubmVsIG9mZnNldCB0YWJsZSBhbmQgY29tcGxldGUgY2hhbm5lbCBkZXNjcmlwdGlvbiBmb3IgYSBnaXZlbiAocGFja2VkKSBjaGFubmVsIG1vZGUuCiAqICBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBpbnZlcnNlIHRvIHRoZSBnZXRDaGFubmVsTW9kZSgpIHJvdXRpbmUgYnV0IGRvZXMgbm90IHN1cHBvcnQgd2VpcmQgY2hhbm5lbAogKiAgY29uZmlndXJhdGlvbnMuIEFsbCBjaGFubmVscyBoYXZlIHRvIGJlIGluIHRoZSBub3JtYWwgaGVpZ2h0IGxheWVyIGFuZCB0aGVyZSBtdXN0IG5vdCBiZSBtb3JlCiAqICBjaGFubmVscyBpbiBlYWNoIGdyb3VwIHRoYW4gZ2l2ZW4gYnkgbWF4Q2hJbkdycC4KICogQHBhcmFtIFtpbl0gVGhlIHBhY2tlZCBjaGFubmVsIG1vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gdG8gYmUgcHJvY2Vzc2VkLgogKiBAcGFyYW0gW2luXSBBcnJheSBjb250YWluaW5nIHRoZSBjaGFubmVsIG1hcHBpbmcgdG8gYmUgdXNlZCAoRnJvbSBNUEVHIFBDRSBvcmRlcmluZyB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCkuCiAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZXMgZm9yIGVhY2ggY2hhbm5lbHMgYXJlIHN0b3JlZCBpbnRvLgogKiBAcGFyYW0gW291dF0gQXJyYXkgd2hlcmUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kaWNlcyBmb3IgZWFjaCBvdXRwdXQgY2hhbm5lbCBhcmUgc3RvcmVkIGludG8uCiAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSB0aGUgYnVmZmVyIG9mZnNldHMgZm9yIGVhY2ggY2hhbm5lbCBhcmUgc3RvcmVkIGludG8uCiAqIEByZXR1cm5zIE5vbmUuCiAqKi8Kc3RhdGljCnZvaWQgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uICgKICAgICAgICBjb25zdCBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgY2hNb2RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluICovCiAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nW11bOF0sICAgICAgICAgICAgICAgICAgICAvKiBpbiAqLwogICAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSAgICAgICAgICBjaGFubmVsVHlwZVtdLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogb3V0ICovCiAgICAgICAgVUNIQVIgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW10sICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdICAgICAgIC8qIG91dCAqLwogICAgICApCnsKICBjb25zdCBVQ0hBUiAqcENoYW5uZWxNYXA7CiAgaW50ICAgZ3JwSWR4LCBjaCA9IDAsIG51bUNoYW5uZWxzID0gMDsKICBVQ0hBUiBudW1DaEluR3JwW1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXTsKCiAgRkRLX0FTU0VSVChjaGFubmVsVHlwZSAhPSBOVUxMKTsKICBGREtfQVNTRVJUKGNoYW5uZWxJbmRpY2VzICE9IE5VTEwpOwogIEZES19BU1NFUlQoY2hhbm5lbE1hcHBpbmcgIT0gTlVMTCk7CiAgRkRLX0FTU0VSVChvZmZzZXRUYWJsZSAhPSBOVUxMKTsKCiAgLyogSW5pdCBvdXRwdXQgYXJyYXlzICovCiAgRkRLbWVtY2xlYXIoY2hhbm5lbFR5cGUsICAgIFBDTV9ETVhfTUFYX0lPX0NIQU5ORUxTKnNpemVvZihBVURJT19DSEFOTkVMX1RZUEUpKTsKICBGREttZW1jbGVhcihjaGFubmVsSW5kaWNlcywgUENNX0RNWF9NQVhfSU9fQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CiAgRkRLbWVtc2V0KG9mZnNldFRhYmxlLCAyNTUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwoKICAvKiBFeHRyYWN0IHRoZSBudW1iZXIgb2YgY2hhbm5lbHMgcGVyIGdyb3VwICovCiAgbnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gPSAgY2hNb2RlICAgICAgICAmIDB4RjsKI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCiAgbnVtQ2hJbkdycFtDSF9HUk9VUF9TSURFXSAgPSAoY2hNb2RlID4+ICA0KSAmIDB4RjsKICBudW1DaEluR3JwW0NIX0dST1VQX1JFQVJdICA9IChjaE1vZGUgPj4gIDgpICYgMHhGOwogIG51bUNoSW5HcnBbQ0hfR1JPVVBfTEZFXSAgID0gKGNoTW9kZSA+PiAxMikgJiAweEY7CiNlbmRpZgoKICAvKiBTdW1tZXJpemUgdG8gZ2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgY2hhbm5lbHMgKi8KICBmb3IgKGdycElkeCA9IDA7IGdycElkeCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTOyBncnBJZHggKz0gMSkgewogICAgbnVtQ2hhbm5lbHMgKz0gbnVtQ2hJbkdycFtncnBJZHhdOwogIH0KCiAgLyogR2V0IHRoZSBhcHByb3ByaWF0ZSBjaGFubmVsIG1hcCAqLwogIHN3aXRjaCAoY2hNb2RlKSB7CiAgY2FzZSBDSF9NT0RFXzFfMF8wXzA6CiAgY2FzZSBDSF9NT0RFXzJfMF8wXzA6CiAgY2FzZSBDSF9NT0RFXzNfMF8wXzA6CiAgY2FzZSBDSF9NT0RFXzNfMF8xXzA6CiAgY2FzZSBDSF9NT0RFXzNfMF8yXzA6CiAgY2FzZSBDSF9NT0RFXzNfMF8yXzE6CiAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nW251bUNoYW5uZWxzXTsKICAgIGJyZWFrOwogIGNhc2UgQ0hfTU9ERV8zXzBfM18xOgogICAgcENoYW5uZWxNYXAgPSBjaGFubmVsTWFwcGluZ1sxMV07CiAgICBicmVhazsKICBjYXNlIENIX01PREVfM18wXzRfMToKICAgIHBDaGFubmVsTWFwID0gY2hhbm5lbE1hcHBpbmdbMTJdOwogICAgYnJlYWs7CiAgY2FzZSBDSF9NT0RFXzVfMF8yXzE6CiAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nWzddOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIC8qIGZhbGxiYWNrICovCiAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nWzBdOwogICAgYnJlYWs7CiAgfQoKICAvKiBDb21wb3NlIGNoYW5uZWwgb2Zmc2V0IHRhYmxlICovCgogIC8qIE5vbi1zeW1tZXRyaWMgY2hhbm5lbHMgKi8KICBpZiAobnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gJiAweDEpIHsKICAgIC8qIE9kZCBudW1iZXIgb2YgZnJvbnQgY2hhbm5lbHMgLT4gd2UgaGF2ZSBhIGNlbnRlciBjaGFubmVsLgogICAgICAgSW4gTVBFRy00IHRoZSBjZW50ZXIgaGFzIHRoZSBpbmRleCAwLiAqLwogICAgaW50IG1hcHBlZElkeCA9IHBDaGFubmVsTWFwW2NoXTsKICAgIG9mZnNldFRhYmxlW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IG1hcHBlZElkeDsKICAgIGNoYW5uZWxUeXBlW21hcHBlZElkeF0gICAgPSBBQ1RfRlJPTlQ7CiAgICBjaGFubmVsSW5kaWNlc1ttYXBwZWRJZHhdID0gMDsKICAgIGNoICs9IDE7CiAgfQoKICBmb3IgKGdycElkeCA9IDA7IGdycElkeCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTOyBncnBJZHggKz0gMSkgewogICAgQVVESU9fQ0hBTk5FTF9UWVBFIHR5cGUgPSBBQ1RfTk9ORTsKICAgIGludCBjaE1hcFBvcyA9IDAsIG1heENoYW5uZWxzID0gMDsKICAgIGludCBjaElkeCA9IDA7ICAvKiBJbmRleCBvZiBjaGFubmVsIHdpdGhpbiB0aGUgc3BlY2lmaWMgZ3JvdXAgKi8KCiAgICBzd2l0Y2ggKGdycElkeCkgewogICAgY2FzZSBDSF9HUk9VUF9GUk9OVDoKICAgICAgdHlwZSA9IEFDVF9GUk9OVDsKICAgICAgY2hNYXBQb3MgPSBMRUZUX0ZST05UX0NIQU5ORUw7CiAgICAgIG1heENoYW5uZWxzID0gMzsKICAgICAgY2hJZHggPSBudW1DaEluR3JwW2dycElkeF0gJiAweDE7CiAgICAgIGJyZWFrOwojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKICAgIGNhc2UgQ0hfR1JPVVBfU0lERToKICAgICAgLyogQWx3YXlzIG1hcCBzaWRlIGNoYW5uZWxzIHRvIHRoZSBtdWx0aXB1cnBvc2UgZ3JvdXAuICovCiAgICAgIHR5cGUgPSBBQ1RfU0lERTsKICAgICAgY2hNYXBQb3MgPSBMRUZUX01VTFRJUFJQU19DSEFOTkVMOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfR1JPVVBfUkVBUjoKICAgICAgdHlwZSA9IEFDVF9CQUNLOwogICAgICBjaE1hcFBvcyA9IExFRlRfUkVBUl9DSEFOTkVMOwogICAgICBtYXhDaGFubmVscyA9IDI7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9HUk9VUF9MRkU6CiAgICAgIHR5cGUgPSBBQ1RfTEZFOwogICAgICBjaE1hcFBvcyA9IExPV19GUkVRVUVOQ1lfQ0hBTk5FTDsKICAgICAgbWF4Q2hhbm5lbHMgPSAxOwogICAgICBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OgogICAgICBicmVhazsKICAgIH0KCiAgICAvKiBNYXAgYWxsIGNoYW5uZWxzIGluIHRoaXMgZ3JvdXAgKi8KICAgIGZvciAoIDsgY2hJZHggPCBudW1DaEluR3JwW2dycElkeF07IGNoSWR4ICs9IDEpIHsKICAgICAgaW50IG1hcHBlZElkeCA9IHBDaGFubmVsTWFwW2NoXTsKICAgICAgaWYgKGNoSWR4ID09IG1heENoYW5uZWxzKSB7CiAgICAgICAgLyogTm8gc3BhY2UgbGVmdCBpbiB0aGlzIGNoYW5uZWwgZ3JvdXAhCiAgICAgICAgICAgVXNlIHRoZSBtdWx0aXB1cnBvc2UgZ3JvdXAgaW5zdGVhZDogKi8KICAgICAgICBjaE1hcFBvcyA9IExFRlRfTVVMVElQUlBTX0NIQU5ORUw7CiAgICAgIH0KICAgICAgb2Zmc2V0VGFibGVbY2hNYXBQb3NdICAgICA9IG1hcHBlZElkeDsKICAgICAgY2hhbm5lbFR5cGVbbWFwcGVkSWR4XSAgICA9IHR5cGU7CiAgICAgIGNoYW5uZWxJbmRpY2VzW21hcHBlZElkeF0gPSBjaElkeDsKICAgICAgY2hNYXBQb3MgKz0gMTsKICAgICAgY2ggKz0gMTsKICAgIH0KICB9Cn0KCi8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgaW5pdGlhbGl6ZXMKICogIG9uZSByb3cgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeCAoY29ycmVzcG9uZGluZyB0byBvbmUgb3V0cHV0IGNoYW5uZWwpLgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBzY2FsZSBmYWN0b3IgbWF0cml4IGFzc29jaWF0ZWQgdG8gdGhlIGRvd25taXggZmFjdG9ycy4KICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgY2hhbm5lbCAocm93KSB0byBiZSBpbml0aWFsaXplZC4KICogQHJldHVybnMgICAgICAgTm90aGluZyB0byByZXR1cm4uCiAqKi8Kc3RhdGljCnZvaWQgZG14SW5pdENoYW5uZWwoCiAgICAgICAgRklYUF9ETVggICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIG91dENoCiAgICAgICApCnsKICB1bnNpZ25lZCBpbnQgaW5DaDsKICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7CiAgICBpZiAoaW5DaCA9PSBvdXRDaCkgewogICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA9IEZMMkZYQ09OU1RfRE1YKDAuNWYpOwogICAgICBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdICA9IDE7CiAgICB9IGVsc2UgewogICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA9IEZMMkZYQ09OU1RfRE1YKDAuMGYpOwogICAgICBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdICA9IDA7CiAgICB9CiAgfQp9CgovKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGRvZXMgYSByZXNldAogKiAgb2Ygb25lIHJvdyBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4IChjb3JyZXNwb25kaW5nIHRvIG9uZSBvdXRwdXQgY2hhbm5lbCkuCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peCBmYWN0b3JzLgogKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBjaGFubmVsIChyb3cpIHRvIGJlIGNsZWFyZWQvcmVzZXQuCiAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgogKiovCnN0YXRpYwp2b2lkIGRteENsZWFyQ2hhbm5lbCgKICAgICAgICBGSVhQX0RNWCAgICAgICAgICAgIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1peFNjYWxlc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgb3V0Q2gKICAgICAgICkKewogIEZES21lbWNsZWFyKCZtaXhGYWN0b3JzW291dENoXSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfRE1YKSk7CiAgRkRLbWVtY2xlYXIoJm1peFNjYWxlc1tvdXRDaF0sICBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoSU5UKSk7Cn0KCi8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgYXBwbGllcyBhIHNvdXJjZSBjaGFubmVsIChyb3cpCiAqICBzY2FsZWQgYnkgYSBnaXZlbiBtaXggZmFjdG9yIHRvIGEgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KSBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4LgogKiAgRXhpc3RpbmcgbWl4IGZhY3RvcnMgb2YgdGhlIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykgd2lsbCBnZXQgb3ZlcndyaXR0ZW4uCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peCBmYWN0b3JzLgogKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBzb3VyY2UgY2hhbm5lbCAocm93KS4KICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KS4KICogQHBhcmFtIFtpbl0gICAgRml4ZWQtcG9pbnQgcGFydCBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCiAqIEBwYXJhbSBbaW5dICAgIFNjYWxlIGZhY3RvciBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCiAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgogKiovCnN0YXRpYwp2b2lkIGRteFNldENoYW5uZWwoCiAgICAgICAgRklYUF9ETVggICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIGRzdENoLAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgc3JjQ2gsCiAgICAgICAgY29uc3QgRklYUF9ETVggICAgICBmYWN0b3IsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBzY2FsZQogICAgICAgKQp7CiAgaW50IGNoOwogIGZvciAoY2g9MDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKICAgIGlmIChtaXhGYWN0b3JzW3NyY0NoXVtjaF0gIT0gKEZJWFBfRE1YKTApIHsKICAgICAgbWl4RmFjdG9yc1tkc3RDaF1bY2hdID0gRlhfREJMMkZYX0RNWChmTXVsdChtaXhGYWN0b3JzW3NyY0NoXVtjaF0sIGZhY3RvcikpOwogICAgICBtaXhTY2FsZXNbZHN0Q2hdW2NoXSAgPSBtaXhTY2FsZXNbc3JjQ2hdW2NoXSArIHNjYWxlOwogICAgfQogIH0KfQoKLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBhZGRzIGEgc291cmNlIGNoYW5uZWwgKHJvdykKICogIHNjYWxlZCBieSBhIGdpdmVuIG1peCBmYWN0b3IgdG8gYSBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpIGluIGEgZ2l2ZW4gZG93bm1peCBtYXRyaXguCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peCBmYWN0b3JzLgogKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBzb3VyY2UgY2hhbm5lbCAocm93KS4KICogQHBhcmFtIFtpbl0gICAgSW5kZXggb2YgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KS4KICogQHBhcmFtIFtpbl0gICAgRml4ZWQtcG9pbnQgcGFydCBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCiAqIEBwYXJhbSBbaW5dICAgIFNjYWxlIGZhY3RvciBvZiBtaXggZmFjdG9yIHRvIGJlIGFwcGxpZWQuCiAqIEByZXR1cm5zICAgICAgIE5vdGhpbmcgdG8gcmV0dXJuLgogKiovCnN0YXRpYwp2b2lkIGRteEFkZENoYW5uZWwoCiAgICAgICAgRklYUF9ETVggICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgIGRzdENoLAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgc3JjQ2gsCiAgICAgICAgY29uc3QgRklYUF9ETVggICAgICBmYWN0b3IsCiAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBzY2FsZQogICAgICAgKQp7CiAgaW50IGNoOwogIGZvciAoY2g9MDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKICAgIEZJWFBfREJMIGFkZEZhY3QgPSBmTXVsdChtaXhGYWN0b3JzW3NyY0NoXVtjaF0sIGZhY3Rvcik7CiAgICBpZiAoYWRkRmFjdCAhPSAoRklYUF9ETVgpMCkgewogICAgICBJTlQgbmV3U2NhbGUgPSBtaXhTY2FsZXNbc3JjQ2hdW2NoXSArIHNjYWxlOwogICAgICBpZiAobWl4RmFjdG9yc1tkc3RDaF1bY2hdICE9IChGSVhQX0RNWCkwKSB7CiAgICAgICAgaWYgKG5ld1NjYWxlID4gbWl4U2NhbGVzW2RzdENoXVtjaF0pIHsKICAgICAgICAgIG1peEZhY3RvcnNbZHN0Q2hdW2NoXSA+Pj0gbmV3U2NhbGUgLSBtaXhTY2FsZXNbZHN0Q2hdW2NoXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgYWRkRmFjdCA+Pj0gbWl4U2NhbGVzW2RzdENoXVtjaF0gLSBuZXdTY2FsZTsKICAgICAgICAgIG5ld1NjYWxlICA9IG1peFNjYWxlc1tkc3RDaF1bY2hdOwogICAgICAgIH0KICAgICAgfQogICAgICBtaXhGYWN0b3JzW2RzdENoXVtjaF0gKz0gRlhfREJMMkZYX0RNWChhZGRGYWN0KTsKICAgICAgbWl4U2NhbGVzW2RzdENoXVtjaF0gICA9IG5ld1NjYWxlOwogICAgfQogIH0KfQoKCi8qKiBQcml2YXRlIGZ1bmN0aW9uIHRoYXQgY3JlYXRlcyBhIGRvd25taXggZmFjdG9yIG1hdHJpeCBkZXBlbmRpbmcgb24gdGhlIGlucHV0IGFuZCBvdXRwdXQKICogIGNvbmZpZ3VyYXRpb24sIHRoZSB1c2VyIHBhcmFtZXRlcnMgYXMgd2VsbCBhcyB0aGUgZ2l2ZW4gbWV0YWRhdGEuIFRoaXMgZnVuY3Rpb24gaXMgdGhlIG1vZHVsZXMKICogIGJyYWluIGFuZCBob2xkIGFsbCBkb3dubWl4IGFsZ29yaXRobXMuCiAqIEBwYXJhbSBbaW5dICBGbGFnIHRoYXQgaW5kaWNhdGVzIGlmIGluQ2hNb2RlIGhvbGRzIGEgcmVhbCAocGFja2VkKSBjaGFubmVsIG1vZGUgb3IgaGFzIGJlZW4KICAgICAgICAgICAgICAgIGNvbnZlcnRlZCB0byBhIE1QRUctNCBjaGFubmVsIGNvbmZpZ3VyYXRpb24gaW5kZXguCiAqIEBwYXJhbSBbaW5dICBEZXBlbmRlbnQgb24gdGhlIGluTW9kZUlzQ2ZnIGZsYWcgdGhpcyBmaWVsZCBoYW5kcyBpbiBhIChwYWNrZWQpIGNoYW5uZWwgbW9kZSBvcgogICAgICAgICAgICAgICAgdGhlIGNvcnJlc3BvbmRpbmcgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleC5vZiB0aGUgaW5wdXQgY29uZmlndXJhdGlvbi4KICogQHBhcmFtIFtpbl0gIFRoZSAocGFja2VkKSBjaGFubmVsIG1vZGUgb2YgdGhlIG91dHB1dCBjb25maWd1cmF0aW9uLgogKiBAcGFyYW0gW2luXSAgUG9pbnRlciB0byBzdHJ1Y3R1cmUgaG9sZGluZyBhbGwgY3VycmVudCB1c2VyIHBhcmFtZXRlci4KICogQHBhcmFtIFtpbl0gIFBvaW50ZXIgdG8gZmllbGQgaG9sZGluZyBhbGwgY3VycmVudCBtZXRhIGRhdGEuCiAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGZpeGVkLXBvaW50IHBhcnRzIG9mIHRoZSBkb3dubWl4IG1hdHJpeC4gTm9ybWFsaXplZCB0byBvbmUgc2NhbGUgZmFjdG9yLgogKiBAcGFyYW0gW291dF0gVGhlIGNvbW1vbiBzY2FsZSBmYWN0b3Igb2YgdGhlIGRvd25taXggbWF0cml4LgogKiBAcmV0dXJucyAgICAgQW4gZXJyb3IgY29kZS4KICoqLwpzdGF0aWMKUENNRE1YX0VSUk9SIGdldE1peEZhY3RvcnMgKAogICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgICAgICBpbk1vZGVJc0NmZywKICAgICAgICBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgICAgICAgaW5DaE1vZGUsCiAgICAgICAgY29uc3QgUENNX0RNWF9DSEFOTkVMX01PREUgIG91dENoTW9kZSwKICAgICAgICBjb25zdCBQQ01fRE1YX1VTRVJfUEFSQU1TICAqcFBhcmFtcywKICAgICAgICBjb25zdCBETVhfQlNfTUVUQV9EQVRBICAgICAqcE1ldGFEYXRhLAogICAgICAgIEZJWFBfRE1YICAgICAgICAgICAgICAgICAgICBtaXhGYWN0b3JzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAgICAgKnBPdXRTY2FsZQogICAgICApCnsKICBQQ01ETVhfRVJST1IgZXJyID0gUENNRE1YX09LOwogIElOVCAgbWl4U2NhbGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgSU5UICBtYXhTY2FsZSA9IDA7CiAgaW50ICBudW1JbkNoYW5uZWwsIG51bU91dENoYW5uZWw7CiAgdW5zaWduZWQgaW50ICBvdXRDaCwgaW5DaCwgaW5DaENmZyA9IDA7CiAgdW5zaWduZWQgaW50ICB2YWxpZFtQQ01fRE1YX01BWF9DSEFOTkVMU10gPSB7IDAgfTsKCiAgRkRLX0FTU0VSVChwTWV0YURhdGEgICE9IE5VTEwpOwogIEZES19BU1NFUlQobWl4RmFjdG9ycyAhPSBOVUxMKTsKICAvKiBDaGVjayBvbiBhIHN1cHBvcnRlZCBvdXRwdXQgY29uZmlndXJhdGlvbiAqLwogIEZES19BU1NFUlQoIChvdXRDaE1vZGUgPT0gQ0hfTU9ERV8xXzBfMF8wKQogICAgICAgICAgIHx8IChvdXRDaE1vZGUgPT0gQ0hfTU9ERV8yXzBfMF8wKQogICAgICAgICAgIHx8IChvdXRDaE1vZGUgPT0gQ0hfTU9ERV8zXzBfMl8xKSApOwoKICBpZiAoaW5Nb2RlSXNDZmcpIHsKICAgIC8qIFdvcmthcm91bmQgZm9yIHRoZSBhbWJpZ3VpdHkgb2YgdGhlIGludGVybmFsIGNoYW5uZWwgbW9kZXMuCiAgICAgICBDb252ZXJ0IGNoYW5uZWwgY29uZmlnIHRvIGNoYW5uZWwgbW9kZTogKi8KICAgIGluQ2hDZmcgID0gKHVuc2lnbmVkIGludClpbkNoTW9kZTsKICAgIHN3aXRjaCAoaW5DaENmZykgewogICAgY2FzZSAxOiBjYXNlIDI6IGNhc2UgMzoKI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMUyA+IDMpCiAgICBjYXNlIDQ6IGNhc2UgNTogY2FzZSA2OgojZW5kaWYKICAgICAgaW5DaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtpbkNoQ2ZnXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDExOgogICAgICBpbkNoTW9kZSA9IENIX01PREVfM18wXzNfMTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDEyOgogICAgICBpbkNoTW9kZSA9IENIX01PREVfM18wXzRfMTsKICAgICAgYnJlYWs7CiAgICBjYXNlIDc6IGNhc2UgMTQ6CiAgICAgIGluQ2hNb2RlID0gQ0hfTU9ERV81XzBfMl8xOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIEZES19BU1NFUlQoMCk7CiAgICB9CiAgfQoKICAvKiBFeHRyYWN0IHRoZSB0b3RhbCBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMgKi8KICBudW1JbkNoYW5uZWwgID0gIChpbkNoTW9kZSYweEYpCiAgICAgICAgICAgICAgICArICgoaW5DaE1vZGU+PiA0KSYweEYpCiAgICAgICAgICAgICAgICArICgoaW5DaE1vZGU+PiA4KSYweEYpCiAgICAgICAgICAgICAgICArICgoaW5DaE1vZGU+PjEyKSYweEYpOwogIC8qIEV4dHJhY3QgdGhlIHRvdGFsIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KICBudW1PdXRDaGFubmVsID0gIChvdXRDaE1vZGUmMHhGKQogICAgICAgICAgICAgICAgKyAoKG91dENoTW9kZT4+IDQpJjB4RikKICAgICAgICAgICAgICAgICsgKChvdXRDaE1vZGU+PiA4KSYweEYpCiAgICAgICAgICAgICAgICArICgob3V0Q2hNb2RlPj4xMikmMHhGKTsKCiAgLyogTVBFRyBhbW1lbmRtZW50IDQgYWthIEVUU0kgbWV0YWRhdGEgYW5kIGZhbGxiYWNrIG1vZGU6ICovCgoKICAvKiBDcmVhdGUgaWRlbnRpdHkgRE1YIG1hdHJpeDogKi8KICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICBkbXhJbml0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBvdXRDaCApOwogIH0KICBpZiAoKChpbkNoTW9kZT4+MTIpJjB4RikgPT0gMCkgewogICAgLyogQ2xlYXIgZW1wdHkgb3Igd3JvbmdseSBtYXBwZWQgaW5wdXQgY2hhbm5lbCAqLwogICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCApOwogIH0KCiAgLyogRklSU1QgU1RBR0U6ICovCiAgaWYgKG51bUluQ2hhbm5lbCA+IFNJWF9DSEFOTkVMKQogIHsgLyogQWx3YXlzIHVzZSBNUEVHIGVxdWF0aW9ucyBlaXRoZXIgd2l0aCBtZXRhIGRhdGEgb3Igd2l0aCBkZWZhdWx0IHZhbHVlcy4gKi8KICAgIEZJWFBfRE1YICBkTWl4RmFjdEEsIGRNaXhGYWN0QjsKICAgIElOVCAgICAgICBkTWl4U2NhbGVBLCBkTWl4U2NhbGVCOwogICAgaW50ICAgICAgIGlzVmFsaWRDZmcgPSBUUlVFOwoKICAgIC8qIEdldCBmYWN0b3JzIGZyb20gbWV0YSBkYXRhICovCiAgICBkTWl4RmFjdEEgID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPmRtaXhJZHhBXTsKICAgIGRNaXhTY2FsZUEgPSAocE1ldGFEYXRhLT5kbWl4SWR4QT09MCkgPyAxIDogMDsKICAgIGRNaXhGYWN0QiAgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+ZG1peElkeEJdOwogICAgZE1peFNjYWxlQiA9IChwTWV0YURhdGEtPmRtaXhJZHhCPT0wKSA/IDEgOiAwOwoKICAgIC8qIENoZWNrIGlmIGlucHV0IGlzIGluIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBjb25maWd1cmF0aW9ucyAqLwogICAgc3dpdGNoIChpbkNoTW9kZSkgewogICAgY2FzZSBDSF9NT0RFXzNfMF8zXzE6ICAgLyogY2hDZmcgMTEgKi8KICAgICAgLyogNi4xY2g6ICBDJyA9IEM7ICBMJyA9IEw7ICBSJyA9IFI7ICBMRkUnID0gTEZFOwogICAgICAgICAgICAgICAgIExzJyA9IExzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OwogICAgICAgICAgICAgICAgIFJzJyA9IFJzKmRtaXhfYV9pZHggKyBDcypkbWl4X2JfaWR4OyAqLwogICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwgKTsgIC8qIGNsZWFyIGVtcHR5IGlucHV0IGNoYW5uZWwgKi8KICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV8zXzJfMV8wOgogICAgY2FzZSBDSF9NT0RFXzNfMl8xXzE6ICAgLyogY2hDZmcgMTEgYnV0IHdpdGggc2lkZSBjaGFubmVscyAqLwogICAgICAvKiA2LjFjaDogIEMnID0gQzsgIEwnID0gTDsgIFInID0gUjsgIExGRScgPSBMRkU7CiAgICAgICAgICAgICAgICAgTHMnID0gTHMqZG1peF9hX2lkeCArIENzKmRtaXhfYl9pZHg7CiAgICAgICAgICAgICAgICAgUnMnID0gUnMqZG1peF9hX2lkeCArIENzKmRtaXhfYl9pZHg7ICovCiAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwgKTsgIC8qIGNsZWFyIGVtcHR5IGlucHV0IGNoYW5uZWwgKi8KICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfTVVMVElQUlBTX0NIQU5ORUwsICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOwogICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV81XzJfMV8wOgogICAgY2FzZSBDSF9NT0RFXzVfMF8xXzA6CiAgICBjYXNlIENIX01PREVfNV8wXzFfMToKICAgICAgLyogICAgICAgICBMcycgPSBDcypkbWl4X2FfaWR4OwogICAgICAgICAgICAgICAgIFJzJyA9IENzKmRtaXhfYV9pZHg7ICovCiAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwgKTsgIC8qIGNsZWFyIGVtcHR5IGlucHV0IGNoYW5uZWwgKi8KICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX1JFQVJfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOwogICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV8zXzBfNF8xOiAgIC8qIGNoQ2ZnIDEyICovCiAgICAgIC8qIDcuMWNoIFN1cnJvdW5kIEJhY2s6ICBDJyA9IEM7ICBMJyA9IEw7ICBSJyA9IFI7ICBMRkUnID0gTEZFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTHMnID0gTHMqZG1peF9hX2lkeCArIExzcipkbWl4X2JfaWR4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUnMnID0gUnMqZG1peF9hX2lkeCArIFJzcipkbWl4X2JfaWR4OyAqLwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV81XzBfMl8xOiAgIC8qIGNoQ2ZnIDcgfHwgMTQgKi8KICAgICAgaWYgKGluQ2hDZmcgPT0gMTQpIHsKICAgICAgICAvKiA3LjFjaCBGcm9udCBIZWlnaHQ6ICBDJyA9IEM7ICBMcycgPSBMczsgIFJzJyA9IFJzOyAgTEZFJyA9IExGRTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMJyA9IEwqZG1peF9hX2lkeCArIEx2KmRtaXhfYl9pZHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSBSKmRtaXhfYV9pZHggKyBSdipkbWl4X2JfaWR4OyAqLwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICB9IGVsc2UgewogICAgICAgIC8qIDcuMWNoIEZyb250OiAgTHMnID0gTHM7ICBScycgPSBSczsgIExGRScgPSBMRkU7CiAgICAgICAgICAgICAgICAgICAgICAgICBDJyA9IEMgKyAoTGMrUmMpKmRtaXhfYV9pZHg7CiAgICAgICAgICAgICAgICAgICAgICAgICBMJyA9IEwgKyBMYypkbWl4X2JfaWR4OwogICAgICAgICAgICAgICAgICAgICAgICAgUicgPSBSICsgUmMqZG1peF9iX2lkeDsKICAgICAgICAgICAgICAgICAgICAgICAgIENBVVRJT046IEwrUiBhcmUgbm90IGF0IChNUEVHKSBpbmRleCAxKzIuICovCiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgICBkTWl4RmFjdEEsIGRNaXhTY2FsZUEgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgICBMRUZUX0ZST05UX0NIQU5ORUwsICAgICAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAxICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICAgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX01VTFRJUFJQU19DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMSApOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgLyogTm90aGluZyB0byBkby4gSnVzdCB1c2UgdGhlIGlkZW50aXR5IG1hdHJpeC4gKi8KICAgICAgaXNWYWxpZENmZyA9IEZBTFNFOwogICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOwogICAgICBicmVhazsKICAgIH0KCiAgICAvKiBBZGQgYWRkaXRpb25hbCBETVggZ2FpbiAqLwogICAgaWYgKCAoaXNWYWxpZENmZyA9PSBUUlVFKQogICAgICAmJiAocE1ldGFEYXRhLT5kbXhHYWluSWR4NSAhPSAwKSkKICAgIHsgLyogQXBwbHkgRE1YIGdhaW4gNSAqLwogICAgICBGSVhQX0RNWCBkbXhHYWluOwogICAgICBJTlQgICAgICBkbXhTY2FsZTsKICAgICAgSU5UICAgICAgc2lnbiA9IChwTWV0YURhdGEtPmRteEdhaW5JZHg1ICYgMHg0MCkgPyAtMSA6IDE7CiAgICAgIElOVCAgICAgIHZhbCAgPSBwTWV0YURhdGEtPmRteEdhaW5JZHg1ICYgMHgzRjsKCiAgICAgIC8qIDEwXihkbXhfZ2Fpbl81LzgwKSAqLwogICAgICBkbXhHYWluID0gRlhfREJMMkZYX0RNWCggZkxkUG93KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjgzMDQ4MjAyMzcyMTg0MWYpLCAyLCAgLyogbG9nMigxMCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShzaWduKnZhbCooTE9ORylGTDJGWENPTlNUX0RCTCgwLjAxMjVmKSksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRteFNjYWxlICkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgIC8qIEN1cnJlbnRseSBvbmx5IHBvc2l0aXZlIHNjYWxlIGZhY3RvcnMgc3VwcG9ydGVkISAqLwogICAgICBpZiAoZG14U2NhbGUgPCAwKSB7CiAgICAgICAgZG14R2FpbiA+Pj0gLWRteFNjYWxlOwogICAgICAgIGRteFNjYWxlICA9ICAwOwogICAgICB9CgogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgICAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsICAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgUklHSFRfUkVBUl9DSEFOTkVMLCAgICBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBkbXhHYWluLCBkbXhTY2FsZSApOwogICAgfQoKICAgIC8qIE1hcmsgdGhlIG91dHB1dCBjaGFubmVscyAqLwogICAgdmFsaWRbQ0VOVEVSX0ZST05UX0NIQU5ORUxdICA9IDE7CiAgICB2YWxpZFtMRUZUX0ZST05UX0NIQU5ORUxdICAgID0gMTsKICAgIHZhbGlkW1JJR0hUX0ZST05UX0NIQU5ORUxdICAgPSAxOwogICAgdmFsaWRbTEVGVF9SRUFSX0NIQU5ORUxdICAgICA9IDE7CiAgICB2YWxpZFtSSUdIVF9SRUFSX0NIQU5ORUxdICAgID0gMTsKICAgIHZhbGlkW0xPV19GUkVRVUVOQ1lfQ0hBTk5FTF0gPSAxOwoKICAgIC8qIFVwZGF0ZSBjaGFubmVsIG1vZGUgZm9yIHRoZSBuZXh0IHN0YWdlICovCiAgICBpbkNoTW9kZSA9IENIX01PREVfM18wXzJfMTsKICB9CgogIC8qIFNFQ09ORCBTVEFHRTogKi8KICBpZiAobnVtT3V0Q2hhbm5lbCA8PSBUV09fQ0hBTk5FTCkgewogICAgLyogQ3JlYXRlIERNWCBtYXRyaXggYWNjb3JkaW5nIHRvIGlucHV0IGNvbmZpZ3VyYXRpb24gKi8KICAgIHN3aXRjaCAoaW5DaE1vZGUpIHsKICAgIGNhc2UgQ0hfTU9ERV8yXzBfMF8wOiAgIC8qIGNoQ2ZnIDIgKi8KICAgICAgLyogQXBwbHkgdGhlIGR1YWwgY2hhbm5lbCBtb2RlLiAqLwogICAgICBzd2l0Y2ggKHBQYXJhbXMtPmR1YWxDaGFubmVsTW9kZSkgewogICAgICBjYXNlIENIMV9NT0RFOiAgLyogTCcgPSAwLjcwNyAqIENoMTsKICAgICAgICAgICAgICAgICAgICAgICAgIFInID0gMC43MDcgKiBDaDE7ICovCiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX0ZST05UX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX0ZST05UX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0gyX01PREU6ICAvKiBMJyA9IDAuNzA3ICogQ2gyOwogICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjcwNyAqIENoMjsgKi8KICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBNSVhFRF9NT0RFOiAgLyogTCcgPSAwLjUqQ2gxICsgMC41KkNoMjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjUqQ2gxICsgMC41KkNoMjsgKi8KICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwICk7CiAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9GUk9OVF9DSEFOTkVMLCAgRkwyRlhDT05TVF9ETVgoMC41ZiksIDAgKTsKICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwICk7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgIGNhc2UgU1RFUkVPX01PREU6CiAgICAgICAgLyogTm90aGluZyB0byBkbyAqLwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9NT0RFXzJfMF8xXzA6CiAgICAgIC8qIEwnID0gTCArIDAuNzA3KlM7CiAgICAgICAgIFInID0gUiArIDAuNzA3KlM7ICovCiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX01PREVfM18wXzBfMDogICAvKiBjaENmZyAzICovCiAgICAgIC8qIEwnID0gTCArIDAuNzA3KkM7CiAgICAgICAgIFInID0gUiArIDAuNzA3KkM7ICovCiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV8zXzBfMV8wOiAgIC8qIGNoQ2ZnIDQgKi8KICAgICAgLyogTCcgPSBMICsgMC43MDcqQyArIDAuNzA3KlM7CiAgICAgICAgIFInID0gUiArIDAuNzA3KkMgKyAwLjcwNypTOyAqLwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9NT0RFXzNfMF8yXzA6ICAgLyogY2hDZmcgNSAqLwogICAgY2FzZSBDSF9NT0RFXzNfMF8yXzE6ICAgLyogY2hDZmcgNiAqLwogICAgICAvKiBNUEVHICsgSVRVICsgRExCCiAgICAgICAgIEJ1dCBiZWNhdXNlIHRoZSBkZWZhdWx0IGRvd25taXggZXF1YXRpb25zIGFuZCBjb2VmZmljaWVudHMgYXJlIGVxdWFsIHdlIHN0aWNrIHRvIE1QRUcuICovCiAgICAgIGlmICggIChwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfRFNFX0RBVEEpCiAgICAgICAgfHwgIShwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfUENFX0RBVEEpICkKICAgICAgewogICAgICAgIEZJWFBfRE1YICBjTWl4THZsLCBzTWl4THZsLCBsTWl4THZsOwogICAgICAgIElOVCAgICAgICBjTWl4U2NhbGUsIHNNaXhTY2FsZSwgbE1peFNjYWxlOwoKICAgICAgICAvKiBHZXQgZmFjdG9ycyBmcm9tIG1ldGEgZGF0YSAqLwogICAgICAgIGNNaXhMdmwgICA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5jTGV2SWR4XTsKICAgICAgICBjTWl4U2NhbGUgPSAocE1ldGFEYXRhLT5jTGV2SWR4PT0wKSA/IDEgOiAwOwogICAgICAgIHNNaXhMdmwgICA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5zTGV2SWR4XTsKICAgICAgICBzTWl4U2NhbGUgPSAocE1ldGFEYXRhLT5zTGV2SWR4PT0wKSA/IDEgOiAwOwogICAgICAgIGxNaXhMdmwgICA9IGxmZU1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+ZG1peElkeExmZV07CiAgICAgICAgaWYgKHBNZXRhRGF0YS0+ZG1peElkeExmZSA8PSAxKSB7CiAgICAgICAgICBsTWl4U2NhbGUgPSAyOwogICAgICAgIH0gZWxzZSBpZiAocE1ldGFEYXRhLT5kbWl4SWR4TGZlIDw9IDUpIHsKICAgICAgICAgIGxNaXhTY2FsZSA9IDE7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxNaXhTY2FsZSA9IDA7CiAgICAgICAgfQogICAgICAgIC8qIFNldHVwIHRoZSBETVggbWF0cml4ICovCiAgICAgICAgaWYgKCAocFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPT0gRk9SQ0VfUFNfRE1YKQogICAgICAgICAgfHwgKChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBBVVRPX1BTX0RNWCkgJiYgKHBNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQ9PTEpKSkKICAgICAgICB7IC8qIEwnID0gTCArIEMqY2xldiAtIChMcytScykqc2xldiArIExGRSpsZmxldjsKICAgICAgICAgICAgIFInID0gUiArIEMqY2xldiArIChMcytScykqc2xldiArIExGRSpsZmxldjsgKi8KICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBjTWl4THZsLCBjTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgIC1zTWl4THZsLCBzTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfUkVBUl9DSEFOTkVMLCAgIC1zTWl4THZsLCBzTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBjTWl4THZsLCBjTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsICAgICBzTWl4THZsLCBzTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgICBzTWl4THZsLCBzTWl4U2NhbGUgKTsKICAgICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBsTWl4THZsLCBsTWl4U2NhbGUgKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsgLyogTCcgPSBMICsgQypjbGV2ICsgTHMqc2xldiArIExGRSpsbGV2OwogICAgICAgICAgICAgUicgPSBSICsgQypjbGV2ICsgUnMqc2xldiArIExGRSpsbGV2OyAqLwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGNNaXhMdmwsIGNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgIHNNaXhMdmwsIHNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGxNaXhMdmwsIGxNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGNNaXhMdmwsIGNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgIHNNaXhMdmwsIHNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGxNaXhMdmwsIGxNaXhTY2FsZSApOwogICAgICAgIH0KCiAgICAgICAgLyogQWRkIGFkZGl0aW9uYWwgRE1YIGdhaW4gKi8KICAgICAgICBpZiAoIHBNZXRhRGF0YS0+ZG14R2FpbklkeDIgIT0gMCApCiAgICAgICAgeyAvKiBBcHBseSBETVggZ2FpbiAyICovCiAgICAgICAgICBGSVhQX0RNWCBkbXhHYWluOwogICAgICAgICAgSU5UICAgICAgZG14U2NhbGU7CiAgICAgICAgICBJTlQgICAgICBzaWduID0gKHBNZXRhRGF0YS0+ZG14R2FpbklkeDIgJiAweDQwKSA/IC0xIDogMTsKICAgICAgICAgIElOVCAgICAgIHZhbCAgPSBwTWV0YURhdGEtPmRteEdhaW5JZHgyICYgMHgzRjsKCiAgICAgICAgICAvKiAxMF4oZG14X2dhaW5fMi84MCkgKi8KICAgICAgICAgIGRteEdhaW4gPSBGWF9EQkwyRlhfRE1YKCBmTGRQb3coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTDJGWENPTlNUX0RCTCgwLjgzMDQ4MjAyMzcyMTg0MWYpLCAyLCAgLyogbG9nMigxMCkgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChGSVhQX0RCTCkoc2lnbip2YWwqKExPTkcpRkwyRlhDT05TVF9EQkwoMC4wMTI1ZikpLCAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG14U2NhbGUgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAvKiBDdXJyZW50bHkgb25seSBwb3NpdGl2ZSBzY2FsZSBmYWN0b3JzIHN1cHBvcnRlZCEgKi8KICAgICAgICAgIGlmIChkbXhTY2FsZSA8IDApIHsKICAgICAgICAgICAgZG14R2FpbiA+Pj0gLWRteFNjYWxlOwogICAgICAgICAgICBkbXhTY2FsZSAgPSAgMDsKICAgICAgICAgIH0KCiAgICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgIGRteEdhaW4sIGRteFNjYWxlICk7CiAgICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsIGRteEdhaW4sIGRteFNjYWxlICk7CiAgICAgICAgfQogICAgICB9CiNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCiAgICAgIGVsc2UgewogICAgICAgIEZJWFBfRE1YICBmbGV2LCBjbGV2LCBzbGV2TEwsIHNsZXZMUiwgc2xldlJMLCBzbGV2UlI7CiAgICAgICAgRklYUF9ETVggIG10cnhNaXhEd25Db2VmID0gbXBlZ01peERvd25JZHgyQ29lZltwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdOwoKICAgICAgICBpZiAoIChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBGT1JDRV9QU19ETVgpCiAgICAgICAgICB8fCAoKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEFVVE9fUFNfRE1YKSAmJiAocE1ldGFEYXRhLT5wc2V1ZG9TdXJyb3VuZD09MSkpKQogICAgICAgIHsgLyogMy8yIGlucHV0OiBMJyA9ICgxLjcwNysyKkEpXi0xICogW0wrMC43MDcqQy1BKkxzLUEqUnNdOwogICAgICAgICAgICAgICAgICAgICAgICBSJyA9ICgxLjcwNysyKkEpXi0xICogW1IrMC43MDcqQytBKkxzK0EqUnNdOyAqLwogICAgICAgICAgZmxldiA9IG1wZWdNaXhEb3duSWR4MlByZUZhY3RbMV1bcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKICAgICAgICAgIHNsZXZSUiA9IHNsZXZSTCA9IEZYX0RCTDJGWF9ETVgoZk11bHQoZmxldiwgbXRyeE1peER3bkNvZWYpKTsKICAgICAgICAgIHNsZXZMTCA9IHNsZXZMUiA9IC1zbGV2Ukw7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgLyogMy8yIGlucHV0OiBMJyA9ICgxLjcwNytBKV4tMSAqIFtMKzAuNzA3KkMrQSpMc107CiAgICAgICAgICAgICAgICAgICAgICAgIFInID0gKDEuNzA3K0EpXi0xICogW1IrMC43MDcqQytBKlJzXTsgKi8KICAgICAgICAgIGZsZXYgPSBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzBdW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07CiAgICAgICAgICBzbGV2UlIgPSBzbGV2TEwgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KGZsZXYsIG10cnhNaXhEd25Db2VmKSk7CiAgICAgICAgICBzbGV2TFIgPSBzbGV2UkwgPSAoRklYUF9TR0wpMDsKICAgICAgICB9CiAgICAgICAgLyogY29tbW9uIGZhY3RvciAqLwogICAgICAgIGNsZXYgID0gRlhfREJMMkZYX0RNWChmTXVsdChmbGV2LCBtcGVnTWl4RG93bklkeDJDb2VmWzBdIC8qIDAuNzA3ICovKSk7CgogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgIGZsZXYsICAgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGNsZXYsICAgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgIHNsZXZMTCwgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfUkVBUl9DSEFOTkVMLCAgIHNsZXZMUiwgMCApOwoKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX0ZST05UX0NIQU5ORUwsICBmbGV2LCAgIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBjbGV2LCAgIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfUkVBUl9DSEFOTkVMLCAgICBzbGV2UkwsIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICBzbGV2UlIsIDAgKTsKICAgICAgfQojZW5kaWYgIC8qIFBDRV9NRVRBREFUQV9FTkFCTEUgKi8KICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAvKiBUaGlzIGNvbmZpZ3VyYXRpb24gZG9lcyBub3QgZml0IHRvIGFueSBrbm93biBkb3dubWl4IGVxdWF0aW9uISAqLwogICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOwogICAgICBicmVhazsKICAgIH0KICAgIC8qIE1hcmsgdGhlIG91dHB1dCBjaGFubmVscyAqLwogICAgRkRLbWVtY2xlYXIodmFsaWQsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZih1bnNpZ25lZCBpbnQpKTsKICAgIHZhbGlkW0xFRlRfRlJPTlRfQ0hBTk5FTF0gID0gMTsKICAgIHZhbGlkW1JJR0hUX0ZST05UX0NIQU5ORUxdID0gMTsKICAgIC8qIFVwZGF0ZSBjaGFubmVsIG1vZGUgZm9yIHRoZSBuZXh0IHN0YWdlICovCiAgICBpbkNoTW9kZSA9IENIX01PREVfMl8wXzBfMDsKICB9CgogIGlmIChudW1PdXRDaGFubmVsID09IE9ORV9DSEFOTkVMKSB7CiAgICBGSVhQX0RNWCBtb25vTWl4TGV2ZWw7CiAgICBJTlQgICAgICBtb25vTWl4U2NhbGU7CgojaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQogICAgaWYgKCAgKHBNZXRhRGF0YS0+dHlwZUZsYWdzICYgVFlQRV9QQ0VfREFUQSkKICAgICAgJiYgIShwTWV0YURhdGEtPnR5cGVGbGFncyAmIFRZUEVfRFNFX0RBVEEpICkKICAgIHsgLyogQycgPSAoMysyKkEpXi0xICogW0MrTCtSK0EqTHMrQStSc107ICovCiAgICAgIG1vbm9NaXhMZXZlbCA9IG1wZWdNaXhEb3duSWR4MlByZUZhY3RbMl1bcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKICAgICAgbW9ub01peFNjYWxlID0gMDsKCiAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCApOwogICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gPSBtb25vTWl4TGV2ZWw7CiAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW0xFRlRfRlJPTlRfQ0hBTk5FTF0gICA9IG1vbm9NaXhMZXZlbDsKICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bUklHSFRfRlJPTlRfQ0hBTk5FTF0gID0gbW9ub01peExldmVsOwogICAgICBtb25vTWl4TGV2ZWwgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KG1vbm9NaXhMZXZlbCwgbXBlZ01peERvd25JZHgyQ29lZltwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdKSk7CiAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW0xFRlRfUkVBUl9DSEFOTkVMXSAgICA9IG1vbm9NaXhMZXZlbDsKICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bUklHSFRfUkVBUl9DSEFOTkVMXSAgID0gbW9ub01peExldmVsOwogICAgfQogICAgZWxzZQojZW5kaWYKICAgIHsgLyogQycgPSBMICsgUjsgW2RlZmF1bHRdICovCiAgICAgIG1vbm9NaXhMZXZlbCA9IEZMMkZYQ09OU1RfRE1YKDAuNWYpOwogICAgICBtb25vTWl4U2NhbGUgPSAxOwogICAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwgKTsgIC8qIEMgaXMgbm90IGluIHRoZSBtaXggKi8KICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgTEVGVF9GUk9OVF9DSEFOTkVMLCAgbW9ub01peExldmVsLCBtb25vTWl4U2NhbGUgKTsKICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgbW9ub01peExldmVsLCBtb25vTWl4U2NhbGUgKTsKICAgIH0KCiAgICAvKiBNYXJrIHRoZSBvdXRwdXQgY2hhbm5lbCAqLwogICAgRkRLbWVtY2xlYXIodmFsaWQsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZih1bnNpZ25lZCBpbnQpKTsKICAgIHZhbGlkW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IDE7CiAgfQoKI2RlZmluZSBNQVhfU0VBUkNIX1NUQVJUX1ZBTCAgKCAtNyApCgogIHsKICAgIExPTkcgY2hTdW1bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogICAgSU5UICBjaFN1bU1heCA9IE1BWF9TRUFSQ0hfU1RBUlRfVkFMOwoKICAgIC8qIERldGVybWluZSB0aGUgY3VycmVudCBtYXhpbXVtIHNjYWxlIGZhY3RvciAqLwogICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewogICAgICBpZiAodmFsaWRbb3V0Q2hdIT0wKSB7CiAgICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgewogICAgICAgICAgaWYgKG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPiBtYXhTY2FsZSkKICAgICAgICAgIHsgLyogU3RvcmUgdGhlIG5ldyBtYXhpbXVtICovCiAgICAgICAgICAgIG1heFNjYWxlID0gbWl4U2NhbGVzW291dENoXVtpbkNoXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKiBJbmRpdmlkdWFseSBhbmFseXNlIG91dHB1dCBjaGFuYWwgbGV2ZWxzICovCiAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICAgIGNoU3VtW291dENoXSA9IE1BWF9TRUFSQ0hfU1RBUlRfVkFMOwogICAgICBpZiAodmFsaWRbb3V0Q2hdIT0wKSB7CiAgICAgICAgaW50ICBvdnJmbHdQcm90U2NhbGUgPSAwOwoKICAgICAgICAvKiBBY2N1bXVsYXRlIGFsbCBmYWN0b3JzIGZvciBlYWNoIG91dHB1dCBjaGFubmVsICovCiAgICAgICAgY2hTdW1bb3V0Q2hdID0gMDsKICAgICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7CiAgICAgICAgICBTSE9SVCBhZGRGYWN0ID0gRlhfRE1YMlNIUlQobWl4RmFjdG9yc1tvdXRDaF1baW5DaF0pOwogICAgICAgICAgaWYgKCBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIDw9IG1heFNjYWxlICkgewogICAgICAgICAgICBhZGRGYWN0ID4+PSBtYXhTY2FsZSAtIG1peFNjYWxlc1tvdXRDaF1baW5DaF07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhZGRGYWN0IDw8PSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIC0gbWF4U2NhbGU7CiAgICAgICAgICB9CiAgICAgICAgICBjaFN1bVtvdXRDaF0gKz0gYWRkRmFjdDsKICAgICAgICB9CiAgICAgICAgaWYgKGNoU3VtW291dENoXSA+IChMT05HKU1BWFZBTF9TR0wpIHsKICAgICAgICAgIHdoaWxlIChjaFN1bVtvdXRDaF0gPiAoTE9ORylNQVhWQUxfU0dMKSB7CiAgICAgICAgICAgIG92cmZsd1Byb3RTY2FsZSArPSAxOwogICAgICAgICAgICBjaFN1bVtvdXRDaF0gPj49IDE7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChjaFN1bVtvdXRDaF0gPiAwKSB7CiAgICAgICAgICB3aGlsZSAoKGNoU3VtW291dENoXTw8MSkgPD0gKExPTkcpTUFYVkFMX1NHTCkgewogICAgICAgICAgICBvdnJmbHdQcm90U2NhbGUgLT0gMTsKICAgICAgICAgICAgY2hTdW1bb3V0Q2hdIDw8PSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiBTdG9yZSB0aGUgZGlmZmVyZW50aWFsIHNjYWxpbmcgaW4gdGhlIHNhbWUgYXJyYXkgKi8KICAgICAgICBjaFN1bVtvdXRDaF0gPSBvdnJmbHdQcm90U2NhbGU7CiAgICAgIH0KICAgIH0KCiAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICAgIGlmICggKHZhbGlkW291dENoXSAhPSAwKQogICAgICAgICYmIChjaFN1bVtvdXRDaF0gPiBjaFN1bU1heCkgKQogICAgICB7IC8qIFN0b3JlIHRoZSBuZXcgbWF4aW11bSAqLwogICAgICAgIGNoU3VtTWF4ID0gY2hTdW1bb3V0Q2hdOwogICAgICB9CiAgICB9CiAgICBtYXhTY2FsZSA9IEZES21heChtYXhTY2FsZStjaFN1bU1heCwgMCk7CgogICAgLyogTm9ybWFsaXplIGFsbCBmYWN0b3JzICovCiAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICAgIGlmICh2YWxpZFtvdXRDaF0hPTApIHsKICAgICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7CiAgICAgICAgICBpZiAobWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gIT0gKEZJWFBfRE1YKTApIHsKICAgICAgICAgICAgaWYgKCBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdIDw9IG1heFNjYWxlICkgewogICAgICAgICAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID4+PSBtYXhTY2FsZSAtIG1peFNjYWxlc1tvdXRDaF1baW5DaF07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPDw9IG1peFNjYWxlc1tvdXRDaF1baW5DaF0gLSBtYXhTY2FsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdID0gbWF4U2NhbGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfQoKCiAgLyogcmV0dXJuIHRoZSBzY2FsZSBmYWN0b3IgKi8KICAqcE91dFNjYWxlID0gbWF4U2NhbGU7CgogIHJldHVybiAoZXJyKTsKfQoKCi8qKiBPcGVuIGFuZCBpbml0aWFsaXplIGFuIGluc3RhbmNlIG9mIHRoZSBQQ00gZG93bm1peCBtb2R1bGUKICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYSBidWZmZXIgcmVjZWl2aW5nIHRoZSBoYW5kbGUgb2YgdGhlIG5ldyBpbnN0YW5jZS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfT3BlbiAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggKnBTZWxmCiAgKQp7CiAgSEFORExFX1BDTV9ET1dOTUlYIHNlbGY7CiAgCiAgaWYgKHBTZWxmID09IE5VTEwpIHsKICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICB9CgogICpwU2VsZiA9IE5VTEw7CgogIHNlbGYgPSAoSEFORExFX1BDTV9ET1dOTUlYKSBHZXRQY21EbXhJbnN0YW5jZSggMCApOwogIGlmIChzZWxmID09IE5VTEwpIHsKICAgIHJldHVybiAoUENNRE1YX09VVF9PRl9NRU1PUlkpOwogIH0KCiAgLyogUmVzZXQgdGhlIGZ1bGwgaW5zdGFuY2UgKi8KICBwY21EbXhfUmVzZXQoIHNlbGYsIFBDTURNWF9SRVNFVF9GVUxMICk7CgogICpwU2VsZiA9IHNlbGY7CgogIHJldHVybiAoUENNRE1YX09LKTsKfQoKCi8qKiBSZXNldCBhbGwgc3RhdGljIHZhbHVlcyBsaWtlIGUuZy4gbWl4ZG93biBjb2VmZmljaWVudHMuCiAqIEBwYXJhbSBbaW5dIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5dIEZsYWdzIHRlbGxpbmcgd2hpY2ggcGFydHMgb2YgdGhlIG1vZHVsZSBzaGFsbCBiZSByZXNldC4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfUmVzZXQgKAogICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAogICAgVUlOVCAgICAgICAgICAgICAgICBmbGFncwogICkKewogIGlmIChzZWxmID09IE5VTEwpIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOyB9CgogIGlmIChmbGFncyAmIFBDTURNWF9SRVNFVF9QQVJBTVMpIHsKICAgIFBDTV9ETVhfVVNFUl9QQVJBTVMgKnBQYXJhbXMgPSAmc2VsZi0+dXNlclBhcmFtczsKCiAgICBwUGFyYW1zLT5kdWFsQ2hhbm5lbE1vZGUgICA9IFNURVJFT19NT0RFOwogICAgcFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgICAgPSBORVZFUl9ET19QU19ETVg7CiAgICBwUGFyYW1zLT5udW1PdXRDaGFubmVsc01heCA9IFBDTV9ETVhfREZMVF9NQVhfT1VUX0NIQU5ORUxTOwogICAgcFBhcmFtcy0+bnVtT3V0Q2hhbm5lbHNNaW4gPSBQQ01fRE1YX0RGTFRfTUlOX09VVF9DSEFOTkVMUzsKICAgIHBQYXJhbXMtPmZyYW1lRGVsYXkgICAgICAgID0gMDsKICAgIHBQYXJhbXMtPmV4cGlyeUZyYW1lICAgICAgID0gUENNX0RNWF9ERkxUX0VYUElSWV9GUkFNRTsKCiAgICBzZWxmLT5hcHBseVByb2Nlc3NpbmcgICAgICA9IDA7CiAgfQoKICBpZiAoZmxhZ3MgJiBQQ01ETVhfUkVTRVRfQlNfREFUQSkgewogICAgaW50IHNsb3Q7CiAgICAvKiBJbml0IGFsbCBzbG90cyB3aXRoIGEgZGVmYXVsdCBzZXQgKi8KICAgIGZvciAoc2xvdCA9IDA7IHNsb3QgPD0gUENNX0RNWF9NQVhfREVMQVlfRlJBTUVTOyBzbG90ICs9IDEpIHsKICAgICAgRkRLbWVtY3B5KCZzZWxmLT5ic01ldGFEYXRhW3Nsb3RdLCAmZGZsdE1ldGFEYXRhLCBzaXplb2YoRE1YX0JTX01FVEFfREFUQSkpOwogICAgfQogIH0KCiAgcmV0dXJuIChQQ01ETVhfT0spOwp9CgoKLyoqIFNldCBvbmUgcGFyYW1ldGVyIGZvciBvbmUgaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHRvIGJlIHNldC4KICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHZhbHVlLgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9TZXRQYXJhbSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCiAgICBjb25zdCBQQ01ETVhfUEFSQU0gIHBhcmFtLAogICAgY29uc3QgSU5UICAgICAgICAgICB2YWx1ZQogICkKewogIHN3aXRjaCAocGFyYW0pCiAgewogIGNhc2UgRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FOgogICAgaWYgKHNlbGYgPT0gTlVMTCkKICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogICAgc2VsZi0+dXNlclBhcmFtcy5leHBpcnlGcmFtZSA9ICh2YWx1ZSA+IDApID8gKFVJTlQpdmFsdWUgOiAwOwogICAgYnJlYWs7CgogIGNhc2UgRE1YX0JTX0RBVEFfREVMQVk6CiAgICBpZiAoICh2YWx1ZSA+IFBDTV9ETVhfTUFYX0RFTEFZX0ZSQU1FUykKICAgICAgfHwgKHZhbHVlIDwgMCkgKSB7CiAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOwogICAgfQogICAgaWYgKHNlbGYgPT0gTlVMTCkgewogICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgICB9CiAgICBzZWxmLT51c2VyUGFyYW1zLmZyYW1lRGVsYXkgPSAoVUNIQVIpdmFsdWU7CiAgICBicmVhazsKCiAgY2FzZSBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKICAgIHN3aXRjaCAodmFsdWUpIHsgIC8qIHN1cHBvcnRlZCBvdXRwdXQgY2hhbm5lbHMgKi8KICAgIGNhc2UgLTE6IGNhc2UgMDogY2FzZSBPTkVfQ0hBTk5FTDogY2FzZSBUV09fQ0hBTk5FTDoKI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPj0gNikKICAgIGNhc2UgU0lYX0NIQU5ORUw6CiNlbmRpZgojaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+PSA4KQogICAgY2FzZSBFSUdIVF9DSEFOTkVMOgojZW5kaWYKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKICAgIH0KICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICAgIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8KICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW4gPSAodmFsdWUgPiAwKSA/IHZhbHVlIDogLTE7CiAgICBpZiAoICh2YWx1ZSA+IDApCiAgICAgICYmIChzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4ID4gMCkKICAgICAgJiYgKHZhbHVlID4gc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heCkgKQogICAgeyAvKiBNSU4gPiBNQVggd291bGQgYmUgYW4gaW52YWxpZCBzdGF0ZS4gVGh1cyBzZXQgTUFYID0gTUlOIGluIHRoaXMgY2FzZS4gKi8KICAgICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heCA9IHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW47CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKICAgIHN3aXRjaCAodmFsdWUpIHsgIC8qIHN1cHBvcnRlZCBvdXRwdXQgY2hhbm5lbHMgKi8KICAgIGNhc2UgLTE6IGNhc2UgMDogY2FzZSBPTkVfQ0hBTk5FTDogY2FzZSBUV09fQ0hBTk5FTDoKI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPj0gNikKICAgIGNhc2UgU0lYX0NIQU5ORUw6CiNlbmRpZgojaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+PSA4KQogICAgY2FzZSBFSUdIVF9DSEFOTkVMOgojZW5kaWYKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKICAgIH0KICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICAgIC8qIFN0b3JlIHRoZSBuZXcgdmFsdWUgKi8KICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXggPSAodmFsdWUgPiAwKSA/IHZhbHVlIDogLTE7CiAgICBpZiAoICh2YWx1ZSA+IDApCiAgICAgICYmICh2YWx1ZSA8IHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW4pICkKICAgIHsgLyogTUFYIDwgTUlOIHdvdWxkIGJlIGFuIGludmFsaWQgc3RhdGUuIFRodXMgc2V0IE1JTiA9IE1BWCBpbiB0aGlzIGNhc2UuICovCiAgICAgIHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNaW4gPSBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4OwogICAgfQogICAgYnJlYWs7CgogIGNhc2UgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFOgogICAgc3dpdGNoICgoRFVBTF9DSEFOTkVMX01PREUpdmFsdWUpIHsKICAgIGNhc2UgU1RFUkVPX01PREU6CiAgICBjYXNlIENIMV9NT0RFOgogICAgY2FzZSBDSDJfTU9ERToKICAgIGNhc2UgTUlYRURfTU9ERToKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKICAgIH0KICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICAgIHNlbGYtPnVzZXJQYXJhbXMuZHVhbENoYW5uZWxNb2RlID0gKERVQUxfQ0hBTk5FTF9NT0RFKXZhbHVlOwogICAgc2VsZi0+YXBwbHlQcm9jZXNzaW5nID0gMTsgIC8qIEZvcmNlIHByb2Nlc3NpbmcgKi8KICAgIGJyZWFrOwoKICBjYXNlIERNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERToKICAgIHN3aXRjaCAoKFBTRVVET19TVVJST1VORF9NT0RFKXZhbHVlKSB7CiAgICBjYXNlIE5FVkVSX0RPX1BTX0RNWDoKICAgIGNhc2UgQVVUT19QU19ETVg6CiAgICBjYXNlIEZPUkNFX1BTX0RNWDoKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICByZXR1cm4gKFBDTURNWF9VTkFCTEVfVE9fU0VUX1BBUkFNKTsKICAgIH0KICAgIGlmIChzZWxmID09IE5VTEwpCiAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICAgIHNlbGYtPnVzZXJQYXJhbXMucHNldWRvU3Vyck1vZGUgPSAoUFNFVURPX1NVUlJPVU5EX01PREUpdmFsdWU7CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgIHJldHVybiAoUENNRE1YX1VOS05PV05fUEFSQU0pOwogIH0KCiAgcmV0dXJuIChQQ01ETVhfT0spOwp9CgovKiogR2V0IG9uZSBwYXJhbWV0ZXIgdmFsdWUgb2Ygb25lIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KICogQHBhcmFtIFtpbl0gUGFyYW1ldGVyIHRvIGJlIHNldC4KICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYnVmZmVyIHJlY2VpdmluZyB0aGUgcGFyYW1ldGVyIHZhbHVlLgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9HZXRQYXJhbSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCiAgICBjb25zdCBQQ01ETVhfUEFSQU0gIHBhcmFtLAogICAgSU5UICogY29uc3QgICAgICAgICBwVmFsdWUKICApCnsKICBQQ01fRE1YX1VTRVJfUEFSQU1TICpwVXNyUGFyYW1zOwoKICBpZiAoIChzZWxmID09IE5VTEwpCiAgICB8fCAocFZhbHVlID09IE5VTEwpICkgewogICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogIH0KICBwVXNyUGFyYW1zID0gJnNlbGYtPnVzZXJQYXJhbXM7CgogIHN3aXRjaCAocGFyYW0pCiAgewogIGNhc2UgRE1YX0JTX0RBVEFfRVhQSVJZX0ZSQU1FOgogICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZXhwaXJ5RnJhbWU7CiAgICBicmVhazsKICBjYXNlIERNWF9CU19EQVRBX0RFTEFZOgogICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZnJhbWVEZWxheTsKICAgIGJyZWFrOwogIGNhc2UgTUlOX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6CiAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5udW1PdXRDaGFubmVsc01pbjsKICAgIGJyZWFrOwogIGNhc2UgTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFM6CiAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5udW1PdXRDaGFubmVsc01heDsKICAgIGJyZWFrOwogIGNhc2UgRE1YX0RVQUxfQ0hBTk5FTF9NT0RFOgogICAgKnBWYWx1ZSA9IChJTlQpcFVzclBhcmFtcy0+ZHVhbENoYW5uZWxNb2RlOwogICAgYnJlYWs7CiAgY2FzZSBETVhfUFNFVURPX1NVUlJPVU5EX01PREU6CiAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZTsKICAgIGJyZWFrOwogIGRlZmF1bHQ6CiAgICByZXR1cm4gKFBDTURNWF9VTktOT1dOX1BBUkFNKTsKICB9CgogIHJldHVybiAoUENNRE1YX09LKTsKfQoKCiNpZmRlZiBEU0VfTUVUQURBVEFfRU5BQkxFCgojZGVmaW5lIE1BWF9EU0VfQU5DX0JZVEVTICAgICAgICggMTYgKSAgICAvKiAxNSBieXRlcyAqLwojZGVmaW5lIEFOQ19EQVRBX1NZTkNfQllURSAgICAgICggMHhCQyApICAvKiBhbmNpbGxhcnkgZGF0YSBzeW5jIGJ5dGUuICovCgovKgogKiBSZWFkIERNWCBtZXRhLWRhdGEgZnJvbSBhIGRhdGEgc3RyZWFtIGVsZW1lbnQuCiAqLwpQQ01ETVhfRVJST1IgcGNtRG14X1BhcnNlICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIEhBTkRMRV9GREtfQklUU1RSRUFNICBoQnMsCiAgICBVSU5UICBhbmNEYXRhQml0cywKICAgIGludCAgICBpc01wZWcyCiAgKQp7CiAgUENNRE1YX0VSUk9SIGVycm9yU3RhdHVzID0gUENNRE1YX09LOwogIERNWF9CU19NRVRBX0RBVEEgKnBCc01ldGFEYXRhID0gJnNlbGYtPmJzTWV0YURhdGFbMF07CgogIGludCAgIHNraXA0RG14ID0gMCwgc2tpcDRFeHQgPSAwOwogIGludCAgIGRteEx2bEF2YWlsID0gMCwgZXh0RGF0YUF2YWlsID0gMDsKICBpbnQgICBmb3VuZE5ld0RhdGEgPSAwOwogIFVJTlQgIG1pbkFuY0JpdHMgPSAoKGlzTXBlZzIpID8gNSA6IDMpKjg7CgogIGlmICggKHNlbGYgPT0gTlVMTCkKICAgIHx8IChoQnMgID09IE5VTEwpICkgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7IH0KCiAgYW5jRGF0YUJpdHMgPSBGREtnZXRWYWxpZEJpdHMoaEJzKTsKCiAgLyogc2FuaXR5IGNoZWNrcyAqLwogIGlmICggKGFuY0RhdGFCaXRzIDwgbWluQW5jQml0cykKICAgIHx8IChhbmNEYXRhQml0cyA+IEZES2dldFZhbGlkQml0cyhoQnMpKSApIHsKICAgIHJldHVybiAoUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEpOwogIH0KCiAgcEJzTWV0YURhdGEgPSAmc2VsZi0+YnNNZXRhRGF0YVswXTsKCiAgaWYgKGlzTXBlZzIpIHsKICAgIC8qIHNraXAgRFZEIGFuY2lsbGFyeSBkYXRhICovCiAgICBGREtwdXNoRm9yKGhCcywgMTYpOwogIH0KCiAgLyogY2hlY2sgc3luYyB3b3JkICovCiAgaWYgKEZES3JlYWRCaXRzKGhCcyw4KSAhPSBBTkNfREFUQV9TWU5DX0JZVEUpIHsKICAgIHJldHVybiAoUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEpOwogIH0KCiAgLyogc2tpcCBNUEVHIGF1ZGlvIHR5cGUgYW5kIERvbGJ5IHN1cnJvdW5kIG1vZGUgKi8KICBGREtwdXNoRm9yKGhCcywgNCk7CgogIGlmIChpc01wZWcyKSB7CiAgICAvKiBpbnQgbnVtQW5jQnl0ZXMgPSAqLyBGREtyZWFkQml0cyhoQnMsIDQpOwogICAgLyogYWR2YW5jZWQgZHluYW1pYyByYW5nZSBjb250cm9sICovCiAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNERteCArPSAyNDsKICAgIC8qIGRpYWxvZyBub3JtYWxpemF0aW9uICovCiAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNERteCArPSA4OwogICAgLyogcmVwcm9kdWN0aW9uX2xldmVsICovCiAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNERteCArPSA4OwogIH0gZWxzZSB7CiAgICBGREtwdXNoRm9yKGhCcywgMik7ICAgLyogZHJjIHByZXNlbnRhdGlvbiBtb2RlICovCiAgICBwQnNNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQgPSBGREtyZWFkQml0KGhCcyk7CiAgICBGREtwdXNoRm9yKGhCcywgNCk7ICAgLyogcmVzZXJ2ZWQgYml0cyAqLwogIH0KCiAgLyogZG93bm1peGluZyBsZXZlbHMgTVBFR3ggc3RhdHVzICovCiAgZG14THZsQXZhaWwgID0gRkRLcmVhZEJpdChoQnMpOwoKICBpZiAoaXNNcGVnMikgewogICAgLyogc2NhbGUgZmFjdG9yIENSQyBzdGF0dXMgKi8KICAgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OwogIH0gZWxzZSB7CiAgICAvKiBhbmNpbGxhcnkgZGF0YSBleHRlbnNpb24gc3RhdHVzICovCiAgICBleHREYXRhQXZhaWwgPSBGREtyZWFkQml0KGhCcyk7CiAgfQoKICAvKiBhdWRpbyBjb2RpbmcgYW5kIGNvbXByZXNzaW9uIHN0YXR1cyAqLwogIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OwogIC8qIGNvYXJzZSBncmFpbiB0aW1lY29kZSBzdGF0dXMgKi8KICBpZiAoRkRLcmVhZEJpdChoQnMpKSBza2lwNEV4dCArPSAxNjsKICAvKiBmaW5lIGdyYWluIHRpbWVjb2RlIHN0YXR1cyAqLwogIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OwoKICAvKiBza2lwIHRoZSB1c2VsZXNzIGRhdGEgdG8gZ2V0IHRvIHRoZSBETVggbGV2ZWxzICovCiAgRkRLcHVzaEZvcihoQnMsIHNraXA0RG14KTsKCiAgLyogZG93bm1peF9sZXZlbHNfTVBFR1ggKi8KICBpZiAoZG14THZsQXZhaWwpCiAgewogICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgeyAgLyogY2VudGVyX21peF9sZXZlbF9vbiAqLwogICAgICBwQnNNZXRhRGF0YS0+Y0xldklkeCA9IEZES3JlYWRCaXRzKGhCcywgMyk7CiAgICAgIGZvdW5kTmV3RGF0YSA9IDE7CiAgICB9IGVsc2UgewogICAgICBGREtyZWFkQml0cyhoQnMsIDMpOwogICAgfQogICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgeyAgLyogc3Vycm91bmRfbWl4X2xldmVsX29uICovCiAgICAgIHBCc01ldGFEYXRhLT5zTGV2SWR4ID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKICAgICAgZm91bmROZXdEYXRhID0gMTsKICAgIH0gZWxzZSB7CiAgICAgIEZES3JlYWRCaXRzKGhCcywgMyk7CiAgICB9CiAgfQoKICAvKiBza2lwIHRoZSB1c2VsZXNzIGRhdGEgdG8gZ2V0IHRvIHRoZSBhbmNpbGxhcnkgZGF0YSBleHRlbnNpb24gKi8KICBGREtwdXNoRm9yKGhCcywgc2tpcDRFeHQpOwoKICAvKiBhbmMgZGF0YSBleHRlbnNpb24gKE1QRUctNCBvbmx5KSAqLwogIGlmIChleHREYXRhQXZhaWwpIHsKICAgIGludCBleHREbXhMdmxTdCwgZXh0RG14R2FpblN0LCBleHREbXhMZmVTdDsKCiAgICBGREtyZWFkQml0KGhCcyk7ICAgICAgICAvKiByZXNlcnZlZCBiaXQgKi8KICAgIGV4dERteEx2bFN0ICA9IEZES3JlYWRCaXQoaEJzKTsKICAgIGV4dERteEdhaW5TdCA9IEZES3JlYWRCaXQoaEJzKTsKICAgIGV4dERteExmZVN0ICA9IEZES3JlYWRCaXQoaEJzKTsKICAgIEZES3JlYWRCaXRzKGhCcywgNCk7ICAgIC8qIHJlc2VydmVkIGJpdHMgKi8KCiAgICBpZiAoZXh0RG14THZsU3QpIHsKICAgICAgcEJzTWV0YURhdGEtPmRtaXhJZHhBID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKICAgICAgcEJzTWV0YURhdGEtPmRtaXhJZHhCID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKICAgICAgRkRLcmVhZEJpdHMoaEJzLCAyKTsgIC8qIHJlc2VydmVkIGJpdHMgKi8KICAgICAgZm91bmROZXdEYXRhID0gMTsKICAgIH0KICAgIGlmIChleHREbXhHYWluU3QpIHsKICAgICAgcEJzTWV0YURhdGEtPmRteEdhaW5JZHg1ID0gRkRLcmVhZEJpdHMoaEJzLCA3KTsKICAgICAgRkRLcmVhZEJpdChoQnMpOyAgICAgIC8qIHJlc2VydmVkIGJpdCAqLwogICAgICBwQnNNZXRhRGF0YS0+ZG14R2FpbklkeDIgPSBGREtyZWFkQml0cyhoQnMsIDcpOwogICAgICBGREtyZWFkQml0KGhCcyk7ICAgICAgLyogcmVzZXJ2ZWQgYml0ICovCiAgICAgIGZvdW5kTmV3RGF0YSA9IDE7CiAgICB9CiAgICBpZiAoZXh0RG14TGZlU3QpIHsKICAgICAgcEJzTWV0YURhdGEtPmRtaXhJZHhMZmUgPSBGREtyZWFkQml0cyhoQnMsIDQpOwogICAgICBGREtyZWFkQml0cyhoQnMsIDQpOyAgLyogcmVzZXJ2ZWQgYml0cyAqLwogICAgICBmb3VuZE5ld0RhdGEgPSAxOwogICAgfQogIH0KCiAgLyogZmluYWwgc2FuaXR5IGNoZWNrIG9uIHRoZSBhbW91bnQgb2YgcmVhZCBkYXRhICovCiAgaWYgKChJTlQpRkRLZ2V0VmFsaWRCaXRzKGhCcykgPCAwKSB7CiAgICBlcnJvclN0YXR1cyA9IFBDTURNWF9DT1JSVVBUX0FOQ19EQVRBOwogIH0KCiAgaWYgKCAoZXJyb3JTdGF0dXMgID09IFBDTURNWF9PSykKICAgICYmIChmb3VuZE5ld0RhdGEgPT0gMSkgKSB7CiAgICAvKiBhbm5vdW5jZSBuZXcgZGF0YSAqLwogICAgcEJzTWV0YURhdGEtPnR5cGVGbGFncyB8PSBUWVBFX0RTRV9EQVRBOwogICAgLyogcmVzZXQgZXhwaXJ5IGNvdW50ZXIgKi8KICAgIHBCc01ldGFEYXRhLT5leHBpcnlDb3VudCA9IDA7CiAgfQoKICByZXR1cm4gKGVycm9yU3RhdHVzKTsKfQoKLyoKICogUmVhZCBETVggbWV0YS1kYXRhIGZyb20gYSBkYXRhIHN0cmVhbSBlbGVtZW50LgogKi8KUENNRE1YX0VSUk9SIHBjbURteF9SZWFkRHZiQW5jRGF0YSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCiAgICBVQ0hBUiAqcEFuY0RhdGFCdWYsCiAgICBVSU5UICAgYW5jRGF0YUJ5dGVzLAogICAgaW50ICAgIGlzTXBlZzIKICApCnsKICBGREtfQklUU1RSRUFNIGJzOwogIEhBTkRMRV9GREtfQklUU1RSRUFNIGhCcyA9ICZiczsKICBQQ01ETVhfRVJST1IgZXJyb3JTdGF0dXMgPSBQQ01ETVhfT0s7CgogIGlmIChzZWxmID09IE5VTEwpIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOyB9CgogIC8qIHNhbml0eSBjaGVja3MgKi8KICBpZiAoIChwQW5jRGF0YUJ1ZiA9PSBOVUxMKQogICAgfHwgKGFuY0RhdGFCeXRlcyA9PSAwKSApIHsKICAgIHJldHVybiAoUENNRE1YX0NPUlJVUFRfQU5DX0RBVEEpOwogIH0KCiAgRkRLaW5pdEJpdFN0cmVhbSAoaEJzLCBwQW5jRGF0YUJ1ZiwgTUFYX0RTRV9BTkNfQllURVMsIGFuY0RhdGFCeXRlcyo4LCBCU19SRUFERVIpOwoKICBlcnJvclN0YXR1cyA9IHBjbURteF9QYXJzZSAoCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYsCiAgICAgICAgICAgICAgICAgICAgICAgIGhCcywKICAgICAgICAgICAgICAgICAgICAgICAgYW5jRGF0YUJ5dGVzKjgsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzTXBlZzIgKTsKCiAgcmV0dXJuIChlcnJvclN0YXR1cyk7Cn0KI2VuZGlmICAvKiBEU0VfTUVUQURBVEFfRU5BQkxFICovCgojaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQovKiogU2V0IHRoZSBtYXRyaXggbWl4ZG93biBpbmZvcm1hdGlvbiBleHRyYWN0ZWQgZnJvbSB0aGUgUENFIG9mIGFuIEFBQyBiaXRzdHJlYW0uCiAqICBOb3RlOiBDYWxsIG9ubHkgaWYgbWF0cml4X21peGRvd25faWR4X3ByZXNlbnQgaXMgdHJ1ZS4KICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KICogQHBhcmFtIFtpbl0gVGhlIDIgYml0IG1hdHJpeCBtaXhkb3duIGluZGV4IGV4dHJhY3RlZCBmcm9tIFBDRS4KICogQHBhcmFtIFtpbl0gVGhlIHBzZXVkbyBzdXJyb3VuZCBlbmFibGUgZmxhZyBleHRyYWN0ZWQgZnJvbSBQQ0UuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X1NldE1hdHJpeE1peGRvd25Gcm9tUGNlICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIGludCAgICAgICAgICAgICAgICAgbWF0cml4TWl4ZG93blByZXNlbnQsCiAgICBpbnQgICAgICAgICAgICAgICAgIG1hdHJpeE1peGRvd25JZHgsCiAgICBpbnQgICAgICAgICAgICAgICAgIHBzZXVkb1N1cnJvdW5kRW5hYmxlCiAgKQp7CiAgRE1YX0JTX01FVEFfREFUQSAqcEJzTWV0YURhdGEgPSAmc2VsZi0+YnNNZXRhRGF0YVswXTsKCiAgaWYgKHNlbGYgPT0gTlVMTCkgewogICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogIH0KCiAgaWYgKG1hdHJpeE1peGRvd25QcmVzZW50KSB7CiAgICBwQnNNZXRhRGF0YS0+cHNldWRvU3Vycm91bmQgPSBwc2V1ZG9TdXJyb3VuZEVuYWJsZTsKICAgIHBCc01ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4ID0gbWF0cml4TWl4ZG93bklkeCAmIDB4MDM7CiAgICBwQnNNZXRhRGF0YS0+dHlwZUZsYWdzIHw9IFRZUEVfUENFX0RBVEE7CiAgICAvKiBSZXNldCBleHBpcnkgY291bnRlciAqLwogICAgcEJzTWV0YURhdGEtPmV4cGlyeUNvdW50ID0gMDsKICB9CgogIHJldHVybiAoUENNRE1YX09LKTsKfQojZW5kaWYgIC8qIFBDRV9NRVRBREFUQV9FTkFCTEUgKi8KCgovKiogQXBwbHkgZG93biBvciB1cCBtaXhpbmcuCiAqIEBwYXJhbSBbaW5dICAgIEhhbmRsZSBvZiBQQ00gZG93bm1peCBtb2R1bGUgaW5zdGFuY2UuCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gYnVmZmVyIHRoYXQgaG9sZCB0aGUgdGltZSBkb21haW4gc2lnbmFsLgogKiBAcGFyYW0gW2luXSAgICBQb2ludGVyIHdoZXJlIHRoZSBhbW91bnQgb2Ygb3V0cHV0IHNhbXBsZXMgaXMgcmV0dXJuZWQgaW50by4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB3aGVyZSB0aGUgYW1vdW50IG9mIG91dHB1dCBjaGFubmVscyBpcyByZXR1cm5lZCBpbnRvLgogKiBAcGFyYW0gW2luXSAgICBGbGFnIHdoaWNoIGluZGljYXRlcyBpZiBvdXRwdXQgdGltZSBkYXRhIGFyZSB3cml0dGVybiBpbnRlcmxlYXZlZCBvciBhcyBzdWJzZXF1ZW50IGJsb2Nrcy4KICogQHBhcmFtIFtpbm91dF0gQXJyYXkgd2hlcmUgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGZvciBlYWNoIG91dHB1dCBhdWRpbyBjaGFubmVsIGlzIHN0b3JlZCBpbnRvLgogKiBAcGFyYW0gW2lub3V0XSBBcnJheSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgaW5kZXggZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwgaXMgc3RvcmVkIGludG8uCiAqIEBwYXJhbSBbaW5dICAgIEFycmF5IGNvbnRhaW5pbmcgdGhlIG91dCBjaGFubmVsIG1hcHBpbmcgdG8gYmUgdXNlZCAoRnJvbSBNUEVHIFBDRSBvcmRlcmluZyB0byB3aGF0ZXZlciBpcyByZXF1aXJlZCkuCiAqIEBwYXJhbSBbb3V0XSAgIFBvaW50ZXIgb24gYSBmaWVsZCByZWNlaXZpbmcgdGhlIHNjYWxlIGZhY3RvciB0aGF0IGhhcyB0byBiZSBhcHBsaWVkIG9uIGFsbCBzYW1wbGVzIGFmdGVyd2FyZHMuCiAqICAgICAgICAgICAgICAgIElmIHRoZSBoYW5kZWQgcG9pbnRlciBpcyBOVUxMIHNjYWxpbmcgaXMgZG9uZSBpbnRlcm5hbGx5LgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9BcHBseUZyYW1lICgKICAgICAgICBIQU5ETEVfUENNX0RPV05NSVggICAgICBzZWxmLAogICAgICAgIElOVF9QQ00gICAgICAgICAgICAgICAgKnBQY21CdWYsCiAgICAgICAgVUlOVCAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgKm5DaGFubmVscywKICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBmSW50ZXJsZWF2ZWQsCiAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFICAgICAgY2hhbm5lbFR5cGVbXSwKICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tdLAogICAgICAgIGNvbnN0IFVDSEFSICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nW11bOF0sCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAqcERteE91dFNjYWxlCiAgKQp7CiAgUENNX0RNWF9VU0VSX1BBUkFNUyAgKnBQYXJhbSA9IE5VTEw7CiAgUENNRE1YX0VSUk9SICBlcnJvclN0YXR1cyA9IFBDTURNWF9PSzsKICBEVUFMX0NIQU5ORUxfTU9ERSAgZHVhbENoYW5uZWxNb2RlOwogIFBDTV9ETVhfQ0hBTk5FTF9NT0RFICBpbkNoTW9kZTsKICBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgb3V0Q2hNb2RlOwogIElOVCAgIGRldk51bGw7ICAvKiBKdXN0IGEgZHVtbXkgdG8gYXZvaWQgYSBsb3Qgb2YgYnJhbmNoZXMgaW4gdGhlIGNvZGUgKi8KICBpbnQgICBudW1PdXRDaGFubmVscywgbnVtSW5DaGFubmVsczsKICBpbnQgICBpblN0cmlkZSwgb3V0U3RyaWRlLCBvZmZzZXQ7CiAgaW50ICAgZG14TWF4U2NhbGUsIGRteFNjYWxlOwogIGludCAgIGNoLCBzbG90OwogIFVDSEFSIGluT2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwoKICBETVhfQlNfTUVUQV9EQVRBICBic01ldGFEYXRhOwoKICBpZiAoIChzZWxmICAgICAgICAgICA9PSBOVUxMKQogICAgfHwgKG5DaGFubmVscyAgICAgID09IE5VTEwpCiAgICB8fCAoY2hhbm5lbFR5cGUgICAgPT0gTlVMTCkKICAgIHx8IChjaGFubmVsSW5kaWNlcyA9PSBOVUxMKQogICAgfHwgKGNoYW5uZWxNYXBwaW5nID09IE5VTEwpICkgewogICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogIH0KCiAgLyogSW5pdCB0aGUgb3V0cHV0IHNjYWxpbmcgKi8KICBkbXhTY2FsZSA9IDA7CiAgaWYgKHBEbXhPdXRTY2FsZSAhPSBOVUxMKSB7CiAgICAvKiBBdm9pZCBmaW5hbCBzY2FsaW5nIGludGVybmFsbHkgYW5kIGhhbmQgaXQgdG8gdGhlIG91dHNpZGUgd29ybGQuICovCiAgICAqcERteE91dFNjYWxlID0gMDsKICAgIGRteE1heFNjYWxlID0gUENNRE1YX01BWF9IRUFEUk9PTTsKICB9IGVsc2UgewogICAgLyogQXBwbHkgdGhlIHNjYWxpbmcgaW50ZXJuYWxseS4gKi8KICAgIHBEbXhPdXRTY2FsZSA9ICZkZXZOdWxsOyAgLyogcmVkaXJlY3QgdG8gdGVtcG9yYWwgc3RhY2sgbWVtb3J5ICovCiAgICBkbXhNYXhTY2FsZSA9IDA7CiAgfQoKICBwUGFyYW0gPSAmc2VsZi0+dXNlclBhcmFtczsKICBudW1JbkNoYW5uZWxzID0gKm5DaGFubmVsczsKCiAgLyogUGVyZm9ybSBzb21lIGlucHV0IHNhbml0eSBjaGVja3MgKi8KICBpZiAocFBjbUJ1ZiA9PSBOVUxMKSAgICAgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0FSR1VNRU5UKTsgfQogIGlmIChmcmFtZVNpemUgPT0gMCkgICAgICB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfQVJHVU1FTlQpOyB9CiAgaWYgKCAobnVtSW5DaGFubmVscyA9PSAwKQogICAgfHwgKG51bUluQ2hhbm5lbHMgPiBQQ01fRE1YX01BWF9JTl9DSEFOTkVMUykgKQogICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfQVJHVU1FTlQpOyB9CgogIC8qIENoZWNrIG9uIG1pc2NvbmZpZ3VyYXRpb24gKi8KICBGREtfQVNTRVJUKCAocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA8PSAwKSBcCiAgICAgICAgICAgfHwgKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPj0gcFBhcmFtLT5udW1PdXRDaGFubmVsc01pbikpOwoKICAvKiBEZXRlcm1pbmUgaWYgdGhlIG1vZHVsZSBoYXMgdG8gZG8gcHJvY2Vzc2luZyAqLwogIGlmICggICAoc2VsZi0+YXBwbHlQcm9jZXNzaW5nID09IDApCiAgICAmJiAgKChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4IDw9IDApCiAgICAgIHx8IChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4ID49IG51bUluQ2hhbm5lbHMpKQogICAgJiYgICAocFBhcmFtLT5udW1PdXRDaGFubmVsc01pbiA8PSBudW1JbkNoYW5uZWxzKSApIHsKICAgIC8qIE5vdGhpbmcgdG8gZG8gKi8KICAgIHJldHVybiAoZXJyb3JTdGF0dXMpOwogIH0KCiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCiAgaWYgKCAocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA+IDApCiAgICAmJiAobnVtSW5DaGFubmVscyA+IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXgpICkgewogICAgbnVtT3V0Q2hhbm5lbHMgPSBwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4OwogIH0KICBlbHNlIGlmIChudW1JbkNoYW5uZWxzIDwgcFBhcmFtLT5udW1PdXRDaGFubmVsc01pbikgewogICAgbnVtT3V0Q2hhbm5lbHMgPSBwUGFyYW0tPm51bU91dENoYW5uZWxzTWluOwogIH0KICBlbHNlIHsKICAgIG51bU91dENoYW5uZWxzID0gbnVtSW5DaGFubmVsczsKICB9CgogIGR1YWxDaGFubmVsTW9kZSA9IHBQYXJhbS0+ZHVhbENoYW5uZWxNb2RlOwoKICAvKiBBbmFseXNlIGlucHV0IGNoYW5uZWwgY29uZmlndXJhdGlvbiBhbmQgZ2V0IGNoYW5uZWwgb2Zmc2V0CiAgICogdGFibGUgdGhhdCBjYW4gYmUgYWNjZXNzZWQgd2l0aCB0aGUgZml4ZWQgY2hhbm5lbCBsYWJlbHMuICovCiAgZXJyb3JTdGF0dXMgPSBnZXRDaGFubmVsTW9kZSgKICAgICAgICAgICAgICAgICAgIG51bUluQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICBjaGFubmVsVHlwZSwKICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzLAogICAgICAgICAgICAgICAgICAgaW5PZmZzZXRUYWJsZSwKICAgICAgICAgICAgICAgICAgJmluQ2hNb2RlCiAgICAgICAgICAgICAgICAgKTsKICBpZiAoIFBDTURNWF9JU19GQVRBTF9FUlJPUihlcnJvclN0YXR1cykKICAgIHx8IChpbkNoTW9kZSA9PSBDSF9NT0RFX1VOREVGSU5FRCkgKSB7CiAgICAvKiBXZSBkb24ndCBuZWVkIHRvIHJlc3RvcmUgYmVjYXVzZSB0aGUgY2hhbm5lbAogICAgICAgY29uZmlndXJhdGlvbiBoYXMgbm90IGJlZW4gY2hhbmdlZC4gSnVzdCBleGl0LiAqLwogICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9DSF9DT05GSUcpOwogIH0KCiAgLyogU2V0IGlucHV0IHN0cmlkZSBhbmQgb2Zmc2V0ICovCiAgaWYgKGZJbnRlcmxlYXZlZCkgewogICAgaW5TdHJpZGUgID0gbnVtSW5DaGFubmVsczsKICAgIG9mZnNldCA9IDE7ICAgICAgICAgICAgICAgIC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLwogIH0gZWxzZSB7CiAgICBpblN0cmlkZSAgPSAxOwogICAgb2Zmc2V0ID0gZnJhbWVTaXplOyAgICAgICAgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCiAgfQoKICAvKiBSZXNldCBkb3dubWl4IG1ldGEgZGF0YSBpZiBuZWNlc3NhcnkgKi8KICBpZiAoIChwUGFyYW0tPmV4cGlyeUZyYW1lID4gMCkKICAgICYmICgrK3NlbGYtPmJzTWV0YURhdGFbMF0uZXhwaXJ5Q291bnQgPiBwUGFyYW0tPmV4cGlyeUZyYW1lKSApCiAgeyAvKiBUaGUgbWV0YWRhdGEgcmVhZCBmcm9tIGJpdHN0cmVhbSBpcyB0b28gb2xkLiAqLwogICAgUENNRE1YX0VSUk9SIGVyciA9IHBjbURteF9SZXNldChzZWxmLCBQQ01ETVhfUkVTRVRfQlNfREFUQSk7CiAgICBGREtfQVNTRVJUKGVyciA9PSBQQ01ETVhfT0spOwogIH0KICBGREttZW1jcHkoJmJzTWV0YURhdGEsICZzZWxmLT5ic01ldGFEYXRhW3BQYXJhbS0+ZnJhbWVEZWxheV0sIHNpemVvZihETVhfQlNfTUVUQV9EQVRBKSk7CiAgLyogTWFpbnRhaW4gZGVsYXkgbGluZSAqLwogIGZvciAoc2xvdCA9IHBQYXJhbS0+ZnJhbWVEZWxheTsgc2xvdCA+IDA7IHNsb3QgLT0gMSkgewogICAgRkRLbWVtY3B5KCZzZWxmLT5ic01ldGFEYXRhW3Nsb3RdLCAmc2VsZi0+YnNNZXRhRGF0YVtzbG90LTFdLCBzaXplb2YoRE1YX0JTX01FVEFfREFUQSkpOwogIH0KCiAgLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiNpZmRlZiBQQ01fRE9XTk1JWF9FTkFCTEUKICBpZiAoIG51bUluQ2hhbm5lbHMgPiBudW1PdXRDaGFubmVscyApCiAgeyAvKiBBcHBseSBkb3dubWl4ICovCiAgICBJTlRfUENNICAqcEluUGNtW1BDTV9ETVhfTUFYX0lOX0NIQU5ORUxTXSA9IHsgTlVMTCB9OwogICAgSU5UX1BDTSAgKnBPdXRQY21bUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTXSA9IHsgTlVMTCB9OwogICAgRklYUF9ETVggIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgIFVDSEFSICAgICBvdXRPZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICBVSU5UICAgICAgc2FtcGxlOwogICAgaW50ICAgICAgIGNoQ2ZnID0gMDsKICAgIGludCAgICAgICBieXBTY2FsZSA9IDA7CgojaWYgKFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTID49IDcpCiAgICBpZiAobnVtSW5DaGFubmVscyA+IFNJWF9DSEFOTkVMKSB7CiAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSBtdWx0aVB1cnBvc2VDaFR5cGVbMl07CgogICAgICAvKiBHZXQgdGhlIHR5cGUgb2YgdGhlIG11bHRpcHVycG9zZSBjaGFubmVscyAqLwogICAgICBtdWx0aVB1cnBvc2VDaFR5cGVbMF0gPSBjaGFubmVsVHlwZVtpbk9mZnNldFRhYmxlW0xFRlRfTVVMVElQUlBTX0NIQU5ORUxdXTsKICAgICAgbXVsdGlQdXJwb3NlQ2hUeXBlWzFdID0gY2hhbm5lbFR5cGVbaW5PZmZzZXRUYWJsZVtSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTF1dOwoKICAgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGNvbmZpZ3VyYXRpb24gaXMgb25lIGRlZmluZWQgaW4gdGhlIHN0YW5kYXJkLiAqLwogICAgICBzd2l0Y2ggKGluQ2hNb2RlKSB7CiAgICAgIGNhc2UgQ0hfTU9ERV81XzBfMl8xOiAgLyogY2hDZmcgNyB8fCAxNCAqLwogICAgICAgIC8qIEZ1cnRoZXIgYW5hbHlzZSB0aGUgaW5wdXQgY29uZmlnIHRvIGRpc3Rpbmd1aXNoIHRoZSB0d28gQ0hfTU9ERV81XzBfMl8xIGNvbmZpZ3MuICovCiAgICAgICAgaWYgKCAobXVsdGlQdXJwb3NlQ2hUeXBlWzBdID09IEFDVF9GUk9OVF9UT1ApCiAgICAgICAgICAmJiAobXVsdGlQdXJwb3NlQ2hUeXBlWzFdID09IEFDVF9GUk9OVF9UT1ApICkgewogICAgICAgICAgY2hDZmcgPSAxNDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2hDZmcgPSA3OwogICAgICAgIH0KICAgICAgICBicmVhazsKICAgICAgY2FzZSBDSF9NT0RFXzNfMF8zXzE6ICAvKiBjaENmZyAxMSAqLwogICAgICAgIGNoQ2ZnID0gMTE7CiAgICAgICAgYnJlYWs7CiAgICAgIGNhc2UgQ0hfTU9ERV8zXzBfNF8xOiAgLyogY2hDZmcgMTIgKi8KICAgICAgICBjaENmZyA9IDEyOwogICAgICAgIGJyZWFrOwogICAgICBkZWZhdWx0OgogICAgICAgIGNoQ2ZnID0gMDsgIC8qIE5vdCBhIGtub3duIGNvbmZpZyAqLwogICAgICAgIGJyZWFrOwogICAgICB9CiAgICB9CiNlbmRpZgoKICAgIC8qIFNldCB0aGlzIHN0YWdlcyBvdXRwdXQgc3RyaWRlIGFuZCBjaGFubmVsIG1vZGU6ICovCiAgICBvdXRTdHJpZGUgPSAoZkludGVybGVhdmVkKSA/IG51bU91dENoYW5uZWxzIDogMTsKICAgIG91dENoTW9kZSA9IG91dENoTW9kZVRhYmxlW251bU91dENoYW5uZWxzXTsKCiAgICAvKiBHZXQgY2hhbm5lbCBkZXNjcmlwdGlvbiBhbmQgY2hhbm5lbCBtYXBwaW5nIGZvciB0aGUgZGVzaXJlZCBvdXRwdXQgY29uZmlndXJhdGlvbi4gKi8KICAgIGdldENoYW5uZWxEZXNjcmlwdGlvbigKICAgICAgICAgICAgb3V0Q2hNb2RlLAogICAgICAgICAgICBjaGFubmVsTWFwcGluZywKICAgICAgICAgICAgY2hhbm5lbFR5cGUsCiAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzLAogICAgICAgICAgICBvdXRPZmZzZXRUYWJsZQogICAgICAgICAgICk7CiAgICAvKiBOb3cgdGhlcmUgaXMgbm8gd2F5IGJhY2sgYmVjYXVzZSB3ZSBtb2RpZmllZCB0aGUgY2hhbm5lbCBjb25maWd1cmF0aW9uISAqLwoKICAgIC8qIENyZWF0ZSB0aGUgRE1YIG1hdHJpeCAqLwogICAgZXJyb3JTdGF0dXMgPSBnZXRNaXhGYWN0b3JzICgKICAgICAgICAgICAgICAgICAgICAgICAoY2hDZmc+MCkgPyAxIDogMCwKICAgICAgICAgICAgICAgICAgICAgICAoY2hDZmc+MCkgPyAoUENNX0RNWF9DSEFOTkVMX01PREUpY2hDZmcgOiBpbkNoTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICBvdXRDaE1vZGUsCiAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtLAogICAgICAgICAgICAgICAgICAgICAgJmJzTWV0YURhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgbWl4RmFjdG9ycywKICAgICAgICAgICAgICAgICAgICAgICZkbXhTY2FsZQogICAgICAgICAgICAgICAgICAgICApOwogICAgLyogTm8gZmF0YWwgZXJyb3JzIGNhbiBvY2N1ciBoZXJlLiBUaGUgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gYWx3YXlzIHJldHVybiBhIHZhbGlkIG1hdHJpeC4KICAgICAgIFRoZSBlcnJvciBjb2RlIGlzIHVzZWQgdG8gc2lnbmFsIGNvbmZpZ3VyYXRpb25zIGFuZCBtYXRyaWNlcyB0aGF0IGFyZSBub3QgY29uZm9ybSB0byBhbnkgc3RhbmRhcmQuICovCgogICAgLyogRGV0ZXJtaW5lIHRoZSBmaW5hbCBzY2FsaW5nICovCiAgICBieXBTY2FsZSA9IEZES21pbihkbXhNYXhTY2FsZSwgZG14U2NhbGUpOwogICAgKnBEbXhPdXRTY2FsZSArPSBieXBTY2FsZTsKICAgIGRteFNjYWxlIC09IGJ5cFNjYWxlOwoKICAgIHsgLyogU2V0IGNoYW5uZWwgcG9pbnRlciBmb3IgaW5wdXQuIFJlbW92ZSBlbXB0eSBjb2xzLiAqLwogICAgICBpbnQgaW5DaCwgb3V0Q2gsIG1hcFtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICAgIGNoID0gMDsKICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgaW5DaCs9MSkgewogICAgICAgIGlmIChpbk9mZnNldFRhYmxlW2luQ2hdICE9IDI1NSkgewogICAgICAgICAgcEluUGNtW2NoXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbaW5DaF0qb2Zmc2V0XTsKICAgICAgICAgIG1hcFtjaCsrXSAgPSBpbkNoOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2ggIT0gbnVtSW5DaGFubmVscykgewojaWZuZGVmIF9fbGludXhfXwogICAgICAgICAgQUxPR0UoImIvMjM4NzY0NDQiKTsKI2VuZGlmCiAgICAgICAgICByZXR1cm4gUENNRE1YX0lOVkFMSURfQVJHVU1FTlQ7CiAgICAgIH0KCiAgICAgIC8qIFJlbW92ZSB1bnVzZWQgY29scyBmcm9tIGZhY3RvciBtYXRyaXggKi8KICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoKz0xKSB7CiAgICAgICAgaWYgKGluQ2ggIT0gbWFwW2luQ2hdKSB7CiAgICAgICAgICBpbnQgb3V0Q2g7CiAgICAgICAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICAgICAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID0gbWl4RmFjdG9yc1tvdXRDaF1bbWFwW2luQ2hdXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIFNldCBjaGFubmVsIHBvaW50ZXIgZm9yIG91dHB1dC4gUmVtb3ZlIGVtcHR5IGNvbHMuICovCiAgICAgIGNoID0gMDsKICAgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewogICAgICAgIGlmIChvdXRPZmZzZXRUYWJsZVtvdXRDaF0gIT0gMjU1KSB7CiAgICAgICAgICBwT3V0UGNtW2NoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW291dENoXSpvZmZzZXRdOwogICAgICAgICAgbWFwW2NoKytdICA9IG91dENoOwogICAgICAgIH0KICAgICAgfQogICAgICBGREtfQVNTRVJUKGNoID09IG51bU91dENoYW5uZWxzKTsKCiAgICAgIC8qIFJlbW92ZSB1bnVzZWQgcm93cyBmcm9tIGZhY3RvciBtYXRyaXggKi8KICAgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IG51bU91dENoYW5uZWxzOyBvdXRDaCs9MSkgewogICAgICAgIGlmIChvdXRDaCAhPSBtYXBbb3V0Q2hdKSB7CiAgICAgICAgICBGREttZW1jcHkoJm1peEZhY3RvcnNbb3V0Q2hdLCAmbWl4RmFjdG9yc1ttYXBbb3V0Q2hdXSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKEZJWFBfRE1YKSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyogU2FtcGxlIHByb2Nlc3NpbmcgbG9vcCAqLwogICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKQogICAgewogICAgICBGSVhQX1BDTSB0SW5bUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFNdOwogICAgICBGSVhQX0RCTCB0T3V0W1BDTV9ETVhfTUFYX09VVF9DSEFOTkVMU10gPSB7IChGSVhQX0RCTCkwIH07CiAgICAgIGludCBpbkNoLCBvdXRDaDsKCiAgICAgIC8qIFByZWxvYWQgYWxsIGlucHV0IHNhbXBsZXMgKi8KICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoKz0xKSB7CiAgICAgICAgdEluW2luQ2hdID0gKEZJWFBfUENNKSpwSW5QY21baW5DaF07CiAgICAgICAgcEluUGNtW2luQ2hdICs9IGluU3RyaWRlOwogICAgICB9CiAgICAgIC8qIEFwcGx5IGRvd25taXggY29lZmZpY2llbnRzIHRvIGlucHV0IHNhbXBsZXMgYW5kIGFjY3VtdWxhdGUgZm9yIG91dHB1dCAqLwogICAgICBmb3IgKG91dENoPTA7IG91dENoIDwgbnVtT3V0Q2hhbm5lbHM7IG91dENoKz0xKSB7CiAgICAgICAgZm9yIChpbkNoPTA7IGluQ2ggPCBudW1JbkNoYW5uZWxzOyBpbkNoKz0xKSB7CiAgICAgICAgICB0T3V0W291dENoXSArPSBmTXVsdCh0SW5baW5DaF0sIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdKTsKICAgICAgICB9CiAgICAgICAgLyogV3JpdGUgc2FtcGxlICovCiNpZiAoU0FNUExFX0JJVFMgPT0gREZSQUNUX0JJVFMpCiAgICAgICAgKnBPdXRQY21bb3V0Q2hdID0gKElOVF9QQ00pU0FUVVJBVEVfTEVGVF9TSElGVCh0T3V0W291dENoXSwgZG14U2NhbGUsIFNBTVBMRV9CSVRTKTsKI2Vsc2UKICAgICAgICAqcE91dFBjbVtvdXRDaF0gPSAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVCh0T3V0W291dENoXSwgREZSQUNUX0JJVFMtU0FNUExFX0JJVFMtZG14U2NhbGUsIFNBTVBMRV9CSVRTKTsKI2VuZGlmCiAgICAgICAgcE91dFBjbVtvdXRDaF0gKz0gb3V0U3RyaWRlOwogICAgICB9CiAgICB9CgogICAgLyogVXBkYXRlIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCiAgICAqbkNoYW5uZWxzID0gbnVtT3V0Q2hhbm5lbHM7CgogIH0gLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogIGVsc2UKI2VuZGlmIC8qIFBDTV9ET1dOTUlYX0VOQUJMRSAqLwojaWZkZWYgUENNX0NIQU5ORUxfRVhURU5TSU9OX0VOQUJMRQogIGlmICggbnVtSW5DaGFubmVscyA8IG51bU91dENoYW5uZWxzICkKICB7IC8qIEFwcGx5IHJ1ZGltZW50YXJ5IHVwbWl4ICovCiAgICAvKiBTZXQgdXAgY2hhbm5lbCBwb2ludGVyICovCiAgICBVSU5UICAgICBzYW1wbGU7CiAgICBVQ0hBUiAgICBvdXRPZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU107CgogICAgLyogRklSU1QgU1RBR0UKICAgICAgICAgQ3JlYXRlIGEgc3RlcmVvL2R1YWwgY2hhbm5lbCBzaWduYWwgKi8KICAgIGlmIChudW1JbkNoYW5uZWxzID09IE9ORV9DSEFOTkVMKQogICAgewogICAgICBJTlRfUENNICAqcEluUGNtW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgICAgSU5UX1BDTSAgKnBPdXRMRiwgKnBPdXRSRjsKCiAgICAgIC8qIFNldCB0aGlzIHN0YWdlcyBvdXRwdXQgc3RyaWRlIGFuZCBjaGFubmVsIG1vZGU6ICovCiAgICAgIG91dFN0cmlkZSA9IChmSW50ZXJsZWF2ZWQpID8gVFdPX0NIQU5ORUwgOiAxOwogICAgICBvdXRDaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtUV09fQ0hBTk5FTF07CgogICAgICAvKiBHZXQgY2hhbm5lbCBkZXNjcmlwdGlvbiBhbmQgY2hhbm5lbCBtYXBwaW5nIGZvciB0aGlzCiAgICAgICAqIHN0YWdlcyBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzIChhbHdheXMgU1RFUkVPKS4gKi8KICAgICAgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uKAogICAgICAgICAgICAgIG91dENoTW9kZSwKICAgICAgICAgICAgICBjaGFubmVsTWFwcGluZywKICAgICAgICAgICAgICBjaGFubmVsVHlwZSwKICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlcywKICAgICAgICAgICAgICBvdXRPZmZzZXRUYWJsZQogICAgICAgICAgICAgKTsKICAgICAgLyogTm93IHRoZXJlIGlzIG5vIHdheSBiYWNrIGJlY2F1c2Ugd2UgbW9kaWZpZWQgdGhlIGNoYW5uZWwgY29uZmlndXJhdGlvbiEgKi8KCiAgICAgIC8qIFNldCBpbnB1dCBjaGFubmVsIHBvaW50ZXIuIFRoZSBmaXJzdCBjaGFubmVsIGlzIGFsd2F5cyBhdCBpbmRleCAwLiAqLwogICAgICBwSW5QY21bQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gJnBQY21CdWZbKGZyYW1lU2l6ZS0xKSppblN0cmlkZV07ICAvKiBDb25zaWRlcmluZyBpbnB1dCBtYXBwaW5nIGNvdWxkIGxlYWQgdG8gYSBpbnZhbGlkIHBvaW50ZXIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVyZSBpZiB0aGUgY2hhbm5lbCBpcyBub3QgZGVjbGFyZWQgdG8gYmUgYSBmcm9udCBjaGFubmVsLiAqLwoKICAgICAgLyogU2V0IG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKGZvciB0aGlzIHN0YWdlKS4gKi8KICAgICAgcE91dExGID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbTEVGVF9GUk9OVF9DSEFOTkVMXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwogICAgICBwT3V0UkYgPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtSSUdIVF9GUk9OVF9DSEFOTkVMXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwoKICAgICAgLyogMS8wIGlucHV0OiAqLwogICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKICAgICAgICAvKiBMJyA9IEM7ICBSJyA9IEM7ICovCiAgICAgICAgKnBPdXRMRiA9ICpwT3V0UkYgPSAqcEluUGNtW0NFTlRFUl9GUk9OVF9DSEFOTkVMXTsKCiAgICAgICAgcEluUGNtW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSAtPSBpblN0cmlkZTsKICAgICAgICBwT3V0TEYgLT0gb3V0U3RyaWRlOyBwT3V0UkYgLT0gb3V0U3RyaWRlOwogICAgICB9CgogICAgICAvKiBQcmVwYXJlIGZvciBuZXh0IHN0YWdlOiAqLwogICAgICBpblN0cmlkZSA9IG91dFN0cmlkZTsKICAgICAgaW5DaE1vZGUgPSBvdXRDaE1vZGU7CiAgICAgIEZES21lbWNweShpbk9mZnNldFRhYmxlLCBvdXRPZmZzZXRUYWJsZSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CiAgICB9CgojaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+IDIpCiAgICAvKiBTRUNPTkQgU1RBR0UKICAgICAgICAgRXh0ZW5kIHdpdGggemVybyBjaGFubmVscyB0byBhY2hpZXZlZCB0aGUgZGVzaXJlZCBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzLiAqLwogICAgaWYgKG51bU91dENoYW5uZWxzID4gVFdPX0NIQU5ORUwpCiAgICB7CiAgICAgIElOVF9QQ00gKnBJbltQQ01fRE1YX01BWF9DSEFOTkVMU10gID0geyBOVUxMIH07CiAgICAgIElOVF9QQ00gKnBPdXRbUENNX0RNWF9NQVhfQ0hBTk5FTFNdID0geyBOVUxMIH07CiAgICAgIEFVRElPX0NIQU5ORUxfVFlQRSAgaW5DaFR5cGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgICAgVUNIQVIgICAgaW5DaEluZGljZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogICAgICBVQ0hBUiAgICBudW1DaFBlckdycFsyXVtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU107CiAgICAgIGludCAgICAgIG5Db250ZW50Q2ggPSAwOyAgLyogTnVtYmVyIG9mIGNoYW5uZWxzIHdpdGggY29udGVudCAqLwogICAgICBpbnQgICAgICBuRW1wdHlDaCA9IDA7ICAgIC8qIE51bWJlciBvZiBjaGFubmVscyB3aXRoIGNvbnRlbnQgKi8KICAgICAgaW50ICAgICAgY2gsIGNoR3JwLCBpc0NvbXBhdGlibGUgPSAxOwoKICAgICAgLyogRG8gbm90IGNoYW5nZSB0aGUgc2lnbmFsbGluZyB3aGljaCBpcyB0aGUgY2hhbm5lbCB0eXBlcyBhbmQgaW5kaWNlcy4KICAgICAgICAgSnVzdCByZW9yZGVyIGFuZCBhZGQgY2hhbm5lbHMuIFNvIGZpcnN0IHNhdmUgdGhlIGlucHV0IHNpZ25hbGxpbmcuICovCiAgICAgIEZES21lbWNweShpbkNoVHlwZXMsIGNoYW5uZWxUeXBlLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoQVVESU9fQ0hBTk5FTF9UWVBFKSk7CiAgICAgIEZES21lbWNweShpbkNoSW5kaWNlcywgY2hhbm5lbEluZGljZXMsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwoKICAgICAgLyogU2V0IHRoaXMgc3RhZ2VzIG91dHB1dCBzdHJpZGUgYW5kIGNoYW5uZWwgbW9kZTogKi8KICAgICAgb3V0U3RyaWRlID0gKGZJbnRlcmxlYXZlZCkgPyBudW1PdXRDaGFubmVscyA6IDE7CiAgICAgIG91dENoTW9kZSA9IG91dENoTW9kZVRhYmxlW251bU91dENoYW5uZWxzXTsKCiAgICAgIC8qIENoZWNrIGlmIGlucHV0IGNoYW5uZWwgY29uZmlnIGNhbiBiZSBlYXNpbHkgbWFwcGVkIHRvIHRoZSBkZXNpcmVkIG91dHB1dCBjb25maWcuICovCiAgICAgIGZvciAoY2hHcnAgPSAwOyBjaEdycCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTOyBjaEdycCArPSAxKSB7CiAgICAgICAgbnVtQ2hQZXJHcnBbSU5dW2NoR3JwXSA9IChpbkNoTW9kZSA+PiAoY2hHcnAqNCkpICYgMHhGOwogICAgICAgIG51bUNoUGVyR3JwW09VVF1bY2hHcnBdID0gKG91dENoTW9kZSA+PiAoY2hHcnAqNCkpICYgMHhGOwoKICAgICAgICBpZiAobnVtQ2hQZXJHcnBbSU5dW2NoR3JwXSA+IG51bUNoUGVyR3JwW09VVF1bY2hHcnBdKSB7CiAgICAgICAgICBpc0NvbXBhdGlibGUgPSAwOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoIGlzQ29tcGF0aWJsZSApIHsKICAgICAgICAvKiBHZXQgbmV3IGNoYW5uZWwgZGVzY3JpcHRpb24gYW5kIGNoYW5uZWwKICAgICAgICAgKiBtYXBwaW5nIGZvciB0aGUgZGVzaXJlZCBvdXRwdXQgY2hhbm5lbCBtb2RlLiAqLwogICAgICAgIGdldENoYW5uZWxEZXNjcmlwdGlvbigKICAgICAgICAgICAgICAgIG91dENoTW9kZSwKICAgICAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLAogICAgICAgICAgICAgICAgY2hhbm5lbFR5cGUsCiAgICAgICAgICAgICAgICBjaGFubmVsSW5kaWNlcywKICAgICAgICAgICAgICAgIG91dE9mZnNldFRhYmxlCiAgICAgICAgICAgICAgICk7CiAgICAgICAgLyogSWYgdGhlIGlucHV0IGNvbmZpZyBoYXMgYSBiYWNrIGNlbnRlciBjaGFubmVsIGJ1dCB0aGUgb3V0cHV0CiAgICAgICAgICAgY29uZmlnIGhhcyBub3QsIGNvcHkgaXQgdG8gbGVmdCBhbmQgcmlnaHQgKGlmIGF2YWlsYWJsZSkuICovCiAgICAgICAgaWYgKCAgKG51bUNoUGVyR3JwW0lOXVtDSF9HUk9VUF9SRUFSXSUyKQogICAgICAgICAgJiYgIShudW1DaFBlckdycFtPVVRdW0NIX0dST1VQX1JFQVJdJTIpICkgewogICAgICAgICAgaWYgKG51bUNoUGVyR3JwW0lOXVtDSF9HUk9VUF9SRUFSXSA9PSAxKSB7CiAgICAgICAgICAgIGluT2Zmc2V0VGFibGVbUklHSFRfUkVBUl9DSEFOTkVMXSA9IGluT2Zmc2V0VGFibGVbTEVGVF9SRUFSX0NIQU5ORUxdOwogICAgICAgICAgfSBlbHNlIGlmIChudW1DaFBlckdycFtJTl1bQ0hfR1JPVVBfUkVBUl0gPT0gMykgewogICAgICAgICAgICBpbk9mZnNldFRhYmxlW1JJR0hUX01VTFRJUFJQU19DSEFOTkVMXSA9IGluT2Zmc2V0VGFibGVbTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8qIEp1c3QgY29weSBhbmQgZXh0ZW5kIHRoZSBvcmlnaW5hbCBjb25maWcgKi8KICAgICAgICBGREttZW1jcHkob3V0T2Zmc2V0VGFibGUsIGluT2Zmc2V0VGFibGUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwogICAgICB9CgogICAgICAvKiBTZXQgSS9PIGNoYW5uZWwgcG9pbnRlci4KICAgICAgICAgTm90ZTogVGhlIGZvbGxvd2luZyBhc3NpZ25tZW50IGFsZ29yaXRobSBjbGVhcnMgdGhlIGNoYW5uZWwgb2Zmc2V0IHRhYmxlcy4KICAgICAgICAgICAgICAgVGh1cyB0aGV5IGNhbiBub3QgYmUgdXNlZCBhZnRlcndhcmRzLiAqLwogICAgICBmb3IgKGNoID0gMDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKICAgICAgICBpZiAoIChvdXRPZmZzZXRUYWJsZVtjaF0gPCAyNTUpCiAgICAgICAgICAmJiAoaW5PZmZzZXRUYWJsZVtjaF0gPCAyNTUpICkKICAgICAgICB7IC8qIFNldCBJL08gcG9pbnRlcjogKi8KICAgICAgICAgIHBJbltuQ29udGVudENoXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbY2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKmluU3RyaWRlXTsKICAgICAgICAgIHBPdXRbbkNvbnRlbnRDaF0gPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtjaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKICAgICAgICAgIC8qIFVwZGF0ZSBzaWduYWxsaW5nICovCiAgICAgICAgICBjaGFubmVsVHlwZVtvdXRPZmZzZXRUYWJsZVtjaF1dID0gaW5DaFR5cGVzW2luT2Zmc2V0VGFibGVbY2hdXTsKICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW291dE9mZnNldFRhYmxlW2NoXV0gPSBpbkNoSW5kaWNlc1tpbk9mZnNldFRhYmxlW2NoXV07CiAgICAgICAgICBpbk9mZnNldFRhYmxlW2NoXSA9IDI1NTsKICAgICAgICAgIG91dE9mZnNldFRhYmxlW2NoXSA9IDI1NTsKICAgICAgICAgIG5Db250ZW50Q2ggKz0gMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCBpc0NvbXBhdGlibGUgKSB7CiAgICAgICAgLyogQXNzaWduIHRoZSByZW1haW5pbmcgaW5wdXQgY2hhbm5lbHMuCiAgICAgICAgICAgVGhpcyBpcyBqdXN0IGEgc2FmZXR5IGFwcGxpYW5jZS4gV2Ugc2hvdWxkIG5ldmVyIG5lZWQgaXQuICovCiAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoKz0xKSB7CiAgICAgICAgICBpZiAoaW5PZmZzZXRUYWJsZVtjaF0gPCAyNTUpIHsKICAgICAgICAgICAgaW50ICBvdXRDaDsKICAgICAgICAgICAgZm9yIChvdXRDaCA9IDAgOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCArPSAxKSB7CiAgICAgICAgICAgICAgaWYgKG91dE9mZnNldFRhYmxlW291dENoXSA8IDI1NSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIFNldCBJL08gcG9pbnRlcjogKi8KICAgICAgICAgICAgcEluW25Db250ZW50Q2hdID0gJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtjaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqaW5TdHJpZGVdOwogICAgICAgICAgICBwT3V0W25Db250ZW50Q2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07CiAgICAgICAgICAgIC8qIFVwZGF0ZSBzaWduYWxsaW5nICovCiAgICAgICAgICAgIGNoYW5uZWxUeXBlW291dE9mZnNldFRhYmxlW291dENoXV0gPSBpbkNoVHlwZXNbaW5PZmZzZXRUYWJsZVtjaF1dOwogICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tvdXRPZmZzZXRUYWJsZVtvdXRDaF1dID0gaW5DaEluZGljZXNbaW5PZmZzZXRUYWJsZVtjaF1dOwogICAgICAgICAgICBpbk9mZnNldFRhYmxlW2NoXSA9IDI1NTsKICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGVbb3V0Q2hdID0gMjU1OwogICAgICAgICAgICBuQ29udGVudENoICs9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qIFNldCB0aGUgcmVtYWluaW5nIG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKi8KICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgY2grPTEpIHsKICAgICAgICAgIGlmIChvdXRPZmZzZXRUYWJsZVtjaF0gPCAyNTUpIHsKICAgICAgICAgICAgcE91dFtuQ29udGVudENoK25FbXB0eUNoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW2NoXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwogICAgICAgICAgICAvKiBFeHBhbmQgb3V0cHV0IHNpZ25hbGxpbmcgKi8KICAgICAgICAgICAgY2hhbm5lbFR5cGVbb3V0T2Zmc2V0VGFibGVbY2hdXSA9IEFDVF9OT05FOwogICAgICAgICAgICBjaGFubmVsSW5kaWNlc1tvdXRPZmZzZXRUYWJsZVtjaF1dID0gbkVtcHR5Q2g7CiAgICAgICAgICAgIG91dE9mZnNldFRhYmxlW2NoXSA9IDI1NTsKICAgICAgICAgICAgbkVtcHR5Q2ggKz0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLyogU2V0IHRoZSByZW1haW5pbmcgb3V0cHV0IGNoYW5uZWwgcG9pbnRlciAqLwogICAgICAgIGZvciAoY2ggPSBuQ29udGVudENoOyBjaCA8IG51bU91dENoYW5uZWxzOyBjaCs9MSkgewogICAgICAgICAgcE91dFtjaF0gPSAmcFBjbUJ1ZltjaCpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwogICAgICAgICAgLyogRXhwYW5kIG91dHB1dCBzaWduYWxsaW5nICovCiAgICAgICAgICBjaGFubmVsVHlwZVtjaF0gPSBBQ1RfTk9ORTsKICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW2NoXSA9IG5FbXB0eUNoOwogICAgICAgICAgbkVtcHR5Q2ggKz0gMTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIEZpcnN0IGNvcHkgdGhlIGNoYW5uZWxzIHRoYXQgaGF2ZSBzaWduYWwgKi8KICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSs9MSkgewogICAgICAgIElOVF9QQ00gdEluW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgICAgICAvKiBSZWFkIGFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ29udGVudENoOyBjaCs9MSkgewogICAgICAgICAgdEluW2NoXSA9ICpwSW5bY2hdOwogICAgICAgICAgcEluW2NoXSAtPSBpblN0cmlkZTsKICAgICAgICB9CiAgICAgICAgLyogV3JpdGUgYWxsIGNoYW5uZWwgc2FtcGxlcyAqLwogICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IG5Db250ZW50Q2g7IGNoKz0xKSB7CiAgICAgICAgICAqcE91dFtjaF0gPSB0SW5bY2hdOwogICAgICAgICAgcE91dFtjaF0gLT0gb3V0U3RyaWRlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyogQ2xlYXIgYWxsIHRoZSBvdGhlciBjaGFubmVscyAqLwogICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKICAgICAgICBmb3IgKGNoID0gbkNvbnRlbnRDaDsgY2ggPCBudW1PdXRDaGFubmVsczsgY2grPTEpIHsKICAgICAgICAgICpwT3V0W2NoXSA9IChJTlRfUENNKTA7CiAgICAgICAgICBwT3V0W2NoXSAtPSBvdXRTdHJpZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CiNlbmRpZiAgLyogaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+IDIpICovCgogICAgLyogdXBkYXRlIHRoZSBudW1iZXIgb2Ygb3V0cHV0IGNoYW5uZWxzICovCiAgICAqbkNoYW5uZWxzID0gbnVtT3V0Q2hhbm5lbHM7CiAgfSAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtICovCiAgZWxzZQojZW5kaWYgLyogUENNX0NIQU5ORUxfRVhURU5TSU9OX0VOQUJMRSAqLwogIGlmICggbnVtSW5DaGFubmVscyA9PSBudW1PdXRDaGFubmVscyApCiAgewogICAgLyogRG9uJ3QgbmVlZCB0byBjaGFuZ2UgdGhlIGNoYW5uZWwgZGVzY3JpcHRpb24gaGVyZSAqLwoKICAgIHN3aXRjaCAobnVtSW5DaGFubmVscykKICAgIHsKICAgIGNhc2UgMjoKICAgICAgeyAvKiBTZXQgdXAgY2hhbm5lbCBwb2ludGVyICovCiAgICAgICAgSU5UX1BDTSAgKnBJblBjbVtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICAgICAgSU5UX1BDTSAgKnBPdXRMLCAqcE91dFI7CiAgICAgICAgRklYUF9ETVggIGZsZXY7CgogICAgICAgIFVJTlQgc2FtcGxlOwogICAgICAgIGludCBpblN0cmlkZSwgb3V0U3RyaWRlLCBvZmZzZXQ7CgogICAgICAgIGlmIChmSW50ZXJsZWF2ZWQpIHsKICAgICAgICAgIGluU3RyaWRlICA9IG51bUluQ2hhbm5lbHM7CiAgICAgICAgICBvdXRTdHJpZGUgPSAyOyAgLyogZml4ZWQgISEhIChiZWxvdyBzdGVyZW8gaXMgZG9ud21peGVkIHRvIG1vbm8gaWYgcmVxdWlyZWQgKi8KICAgICAgICAgIG9mZnNldCA9IDE7IC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpblN0cmlkZSAgPSAxOwogICAgICAgICAgb3V0U3RyaWRlID0gMTsKICAgICAgICAgIG9mZnNldCA9IGZyYW1lU2l6ZTsgIC8qIENoYW5uZWwgc3BlY2lmaWMgb2Zmc2V0IGZhY3RvciAqLwogICAgICAgIH0KCiAgICAgICAgLyogU2V0IGlucHV0IGNoYW5uZWwgcG9pbnRlciAqLwogICAgICAgIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdICA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbTEVGVF9GUk9OVF9DSEFOTkVMXSpvZmZzZXRdOwogICAgICAgIHBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbUklHSFRfRlJPTlRfQ0hBTk5FTF0qb2Zmc2V0XTsKCiAgICAgICAgLyogU2V0IG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKHNhbWUgYXMgaW5wdXQpICovCiAgICAgICAgcE91dEwgID0gIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdOwogICAgICAgIHBPdXRSICA9ICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF07CgogICAgICAgIC8qIFNldCBkb3dubWl4IGxldmVsczogKi8KICAgICAgICBmbGV2ID0gRkwyRlhDT05TVF9ETVgoMC43MDcxMDY3OGYpOwogICAgICAgIC8qIDIvMCBpbnB1dDogKi8KICAgICAgICBzd2l0Y2ggKGR1YWxDaGFubmVsTW9kZSkKICAgICAgICB7CiAgICAgICAgY2FzZSBDSDFfTU9ERTogIC8qIEwnID0gMC43MDcgKiBDaDE7ICBSJyA9IDAuNzA3ICogQ2gxICovCiAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKICAgICAgICAgICAgKnBPdXRMID0gKnBPdXRSID0KICAgICAgICAgICAgICAoSU5UX1BDTSlTQVRVUkFURV9SSUdIVF9TSElGVChmTXVsdCgoRklYUF9QQ00pKnBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdLCBmbGV2KSwgREZSQUNUX0JJVFMtU0FNUExFX0JJVFMsIFNBTVBMRV9CSVRTKTsKCiAgICAgICAgICAgIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOwogICAgICAgICAgICBwT3V0TCArPSBvdXRTdHJpZGU7IHBPdXRSICs9IG91dFN0cmlkZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgQ0gyX01PREU6ICAvKiBMJyA9IDAuNzA3ICogQ2gyOyAgUicgPSAwLjcwNyAqIENoMiAqLwogICAgICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CiAgICAgICAgICAgICpwT3V0TCA9ICpwT3V0UiA9CiAgICAgICAgICAgICAgKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoZk11bHQoKEZJWFBfUENNKSpwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0sIGZsZXYpLCBERlJBQ1RfQklUUy1TQU1QTEVfQklUUywgU0FNUExFX0JJVFMpOwoKICAgICAgICAgICAgcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOwogICAgICAgICAgICBwT3V0TCArPSBvdXRTdHJpZGU7IHBPdXRSICs9IG91dFN0cmlkZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgTUlYRURfTU9ERTogIC8qIEwnID0gMC41KkNoMSArIDAuNSpDaDI7ICBSJyA9IDAuNSpDaDEgKyAwLjUqQ2gyICovCiAgICAgICAgICBmb3IgKHNhbXBsZSA9IDA7IHNhbXBsZSA8IGZyYW1lU2l6ZTsgc2FtcGxlKyspIHsKICAgICAgICAgICAgKnBPdXRMID0gKnBPdXRSID0gKCpwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSA+PiAxKSArICgqcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdID4+IDEpOwoKICAgICAgICAgICAgcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7ICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gKz0gaW5TdHJpZGU7CiAgICAgICAgICAgIHBPdXRMICs9IG91dFN0cmlkZTsgcE91dFIgKz0gb3V0U3RyaWRlOwogICAgICAgICAgfQogICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICBjYXNlIFNURVJFT19NT0RFOgogICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGJyZWFrOwoKICAgIGRlZmF1bHQ6CiAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICAgICAgYnJlYWs7CiAgICB9CiAgfQoKICByZXR1cm4gKGVycm9yU3RhdHVzKTsKfQoKCi8qKiBDbG9zZSBhbiBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIGEgYnVmZmVyIGNvbnRhaW5pbmcgdGhlIGhhbmRsZSBvZiB0aGUgaW5zdGFuY2UuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X0Nsb3NlICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAqcFNlbGYKICApCnsKICBpZiAocFNlbGYgPT0gTlVMTCkgewogICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogIH0KCiAgRnJlZVBjbURteEluc3RhbmNlKCBwU2VsZiApOwogICpwU2VsZiA9IE5VTEw7CgogIHJldHVybiAoUENNRE1YX09LKTsKfQoKCi8qKiBHZXQgbGlicmFyeSBpbmZvIGZvciB0aGlzIG1vZHVsZS4KICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gYW4gYWxsb2NhdGVkIExJQl9JTkZPIHN0cnVjdHVyZS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKi8KUENNRE1YX0VSUk9SIHBjbURteF9HZXRMaWJJbmZvKCBMSUJfSU5GTyAqaW5mbyApCnsKICBpbnQgaTsKCiAgaWYgKGluZm8gPT0gTlVMTCkgewogICAgcmV0dXJuIFBDTURNWF9JTlZBTElEX0FSR1VNRU5UOwogIH0KCiAgLyogU2VhcmNoIGZvciBuZXh0IGZyZWUgdGFiICovCiAgZm9yIChpID0gMDsgaSA8IEZES19NT0RVTEVfTEFTVDsgaSsrKSB7CiAgICBpZiAoaW5mb1tpXS5tb2R1bGVfaWQgPT0gRkRLX05PTkUpIGJyZWFrOwogIH0KICBpZiAoaSA9PSBGREtfTU9EVUxFX0xBU1QpIHsKICAgIHJldHVybiBQQ01ETVhfVU5LTk9XTjsKICB9CgogIC8qIEFkZCB0aGUgbGlicmFyeSBpbmZvICovCiAgaW5mb1tpXS5tb2R1bGVfaWQgID0gRkRLX1BDTURNWDsKICBpbmZvW2ldLnZlcnNpb24gICAgPSBMSUJfVkVSU0lPTihQQ01ETVhfTElCX1ZMMCwgUENNRE1YX0xJQl9WTDEsIFBDTURNWF9MSUJfVkwyKTsKICBMSUJfVkVSU0lPTl9TVFJJTkcoaW5mbytpKTsKICBpbmZvW2ldLmJ1aWxkX2RhdGUgPSBQQ01ETVhfTElCX0JVSUxEX0RBVEU7CiAgaW5mb1tpXS5idWlsZF90aW1lID0gUENNRE1YX0xJQl9CVUlMRF9USU1FOwogIGluZm9baV0udGl0bGUgICAgICA9IFBDTURNWF9MSUJfVElUTEU7CgogIC8qIFNldCBmbGFncyAqLwogIGluZm9baV0uZmxhZ3MgPSAwCiNpZmRlZiBQQ01fRE9XTk1JWF9FTkFCTEUKICAgICAgfCBDQVBGX0RNWF9CTElORCAgIC8qIEF0IGxlYXN0IGJsaW5kIGRvd25taXhpbmcgaXMgcG9zc2libGUgKi8KICNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCiAgICAgIHwgQ0FQRl9ETVhfUENFICAgICAvKiBHdWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBNUEVHLTIvNCBQcm9ncmFtIENvbmZpZyBFbGVtZW50cyAoUENFKS4gKi8KICAjaWZkZWYgQVJJQl9NSVhET1dOX0VOQUJMRQogICAgICB8IENBUEZfRE1YX0FSSUIgICAgLyogUENFIGd1aWRlZCBkb3dubWl4IHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IGVxdWF0aW9ucyBhbmQgbGV2ZWxzLiAqLwogICNlbmRpZgogI2VuZGlmIC8qIFBDRV9NRVRBREFUQV9FTkFCTEUgKi8KICNpZmRlZiBEU0VfTUVUQURBVEFfRU5BQkxFCiAgICAgIHwgQ0FQRl9ETVhfRFZCICAgICAvKiBHdWlkZWQgZG93bm1peCB3aXRoIGRhdGEgZnJvbSBEVkIgYW5jaWxsYXJ5IGRhdGEgZmllbGRzLiAqLwogI2VuZGlmCiNlbmRpZiAvKiBQQ01fRE9XTk1JWF9FTkFCTEUgKi8KI2lmZGVmIFBDTV9DSEFOTkVMX0VYVEVOU0lPTl9FTkFCTEUKICAgICAgfCBDQVBGX0RNWF9DSF9FWFAgIC8qIFNpbXBsZSB1cG1peGluZyBieSBkdWJsaWNhdGluZyBjaGFubmVscyBvciBhZGRpbmcgemVybyBjaGFubmVscy4gKi8KI2VuZGlmCiAgICAgIDsKCiAgLyogQWRkIGxpYiBpbmZvIGZvciBGREsgdG9vbHMgKGlmIG5vdCB5ZXQgZG9uZSkuICovCiAgRkRLX3Rvb2xzR2V0TGliSW5mbyhpbmZvKTsKCiAgcmV0dXJuIFBDTURNWF9PSzsKfQoKCgo=