Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAgRkRLIFBDTSB1dGlscyBtb2R1bGUgICoqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBBdXRob3Iocyk6ICAgQ2hyaXN0aWFuIEdyaWViZWwKICAgRGVzY3JpcHRpb246IERlZmluZXMgZnVuY3Rpb25zIHRoYXQgcGVyZm9ybSBkb3dubWl4aW5nIG9yIGEgc2ltcGxlIGNoYW5uZWwKICAgICAgICAgICAgICAgIGV4cGFuc2lvbiBpbiB0aGUgUENNIHRpbWUgZG9tYWluLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2luY2x1ZGUgPGxvZy9sb2cuaD4KI2luY2x1ZGUgInBjbXV0aWxzX2xpYi5oIgoKI2luY2x1ZGUgImdlbmVyaWNTdGRzLmgiCiNpbmNsdWRlICJmaXhwb2ludF9tYXRoLmgiCiNpbmNsdWRlICJGREtfY29yZS5oIgoKCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqCiAqICBHTE9CQUwgU0VUVElOR1MgKEdGUik6ICAqCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwojZGVmaW5lIERTRV9NRVRBREFUQV9FTkFCTEUgICAgICAgICAgLyohPCBFbmFibGUgdGhpcyB0byBzdXBwb3J0IE1QRUcvRVRTSSBEVkIgYW5jaWxsYXJ5IGRhdGEgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZXIgYXNzaXN0ZWQgZG93bm1peGluZyBvZiBNUEVHLTQgQUFDIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNUEVHLTEvMiBsYXllciAyIHN0cmVhbXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwojZGVmaW5lIFBDRV9NRVRBREFUQV9FTkFCTEUgICAgICAgICAgLyohPCBFbmFibGUgdGhpcyB0byBzdXBwb3J0IE1QRUcgbWF0cml4IG1peGRvd24gd2l0aCBhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZmaWNpZW50IGNhcnJpZWQgaW4gdGhlIFBDRS4gICAgICAgICAgICAgICAgICAgICAgICovCgojZGVmaW5lIFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTICAgICAgICAgICggOCApICAgLyogTmVpdGhlciB0aGUgbWF4aW11bSBudW1iZXIgb2YgaW5wdXQgbm9yIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgLi4uICovCiNkZWZpbmUgUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTICAgICAgICAgKCA4ICkgICAvKiAuLi4gbXVzdCBleGNlZWQgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHRoYXQgdGhlIGZyYW1ld29yayBjYW4gaGFuZGxlLiAqLwoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICoKICogICAgU1BFQ0lGSUMgU0VUVElOR1M6ICAgICoKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiNkZWZpbmUgUENNX0NIQU5ORUxfRVhURU5TSU9OX0VOQUJMRSAgICAgICAgICAgICAvKiE8IEFsbG93IG1vZHVsZSB0byBkdXBsaWNhdGUgbW9ubyBzaWduYWxzIG9yIGFkZCB6ZXJvIGNoYW5uZWxzIHRvIGFjaGlldmUgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2lyZWQgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gKi8KCiNkZWZpbmUgUENNX0RNWF9ERkxUX01BWF9PVVRfQ0hBTk5FTFMgICAgKCA2ICkgICAvKiE8IFRoZSBtYXhpbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIElmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCB0aGUgbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYXV0b21hdGljYWxseSBjcmVhdGUgYSBtaXhkb3duIGZvciBhbGwgaW5wdXQgc2lnbmFscyB3aXRoIG1vcmUgY2hhbm5lbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhhbiBzcGVjaWZpZWQuICovCiNkZWZpbmUgUENNX0RNWF9ERkxUX01JTl9PVVRfQ0hBTk5FTFMgICAgKCAwICkgICAvKiE8IFRoZSBtaW5pbXVtIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMuIElmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCB0aGUgbW9kdWxlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgZG8gY2hhbm5lbCBleHRlbnNpb24gYXV0b21hdGljYWxseSBmb3IgYWxsIGlucHV0IHNpZ25hbHMgd2l0aCBsZXNzIGNoYW5uZWxzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoYW4gc3BlY2lmaWVkLiAqLwojZGVmaW5lIFBDTV9ETVhfTUFYX0RFTEFZX0ZSQU1FUyAgICAgICAgICggMSApICAgLyohPCBUaGUgbWF4aW11bSBkZWxheSBmcmFtZXMgdG8gYWxpZ24gdGhlIGJpdHN0cmVhbXMgcGF5bG9hZCB3aXRoIHRoZSBQQ00gb3V0cHV0LiAqLwojZGVmaW5lIFBDTV9ETVhfREZMVF9FWFBJUllfRlJBTUUgICAgICAgICggNTAgKSAgLyohPCBJZiB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gMCB0aGUgbWl4ZG93biBjb2VmZmljaWVudHMgd2lsbCBleHBpcmUgYnkgZGVmYXVsdCBhZnRlciB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gbnVtYmVyIG9mIGZyYW1lcy4gVGhlIHZhbHVlIDUwIGNvcnJlc3BvbmRzIHRvIGF0IGxlYXN0IDUwMG1zIChGTCA5NjAgQCA5NmtIeikgKi8KLyogI2RlZmluZSBQQ01ETVhfREVCVUcgKi8KCi8qIERlcml2ZWQgc2V0dGluZzoKICogICBObyBuZWVkIHRvIGVkaXQgYmV5b25kIHRoaXMgbGluZS4gKi8KI2lmIGRlZmluZWQoRFNFX01FVEFEQVRBX0VOQUJMRSkgfHwgZGVmaW5lZChQQ0VfTUVUQURBVEFfRU5BQkxFKSB8fCBkZWZpbmVkKEFSSUJfTUlYRE9XTl9FTkFCTEUpCiAjZGVmaW5lIFBDTV9ET1dOTUlYX0VOQUJMRSAgICAgICAgICAgICAgICAgICAgICAvKiE8IEdlbmVyYWxseSBlbmFibGUgZG93biBtaXhpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICovCiNlbmRpZgojaWYgKFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTID4gMikgfHwgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+IDIpCiAjZGVmaW5lIFBDTV9ETVhfTUFYX0NIQU5ORUxTICAgICAgICAgICAgKCA4ICkKICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgICAgICAoIDQgKQogI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgIFBDTV9ETVhfTUFYX0NIQU5ORUxTICAgLyogQWxsIGNoYW5uZWxzIGNhbiBiZSBpbiBvbmUgZ3JvdXAgKi8KI2Vsc2UKICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTFMgICAgICAgICAgICAoIDMgKSAgIC8qIE5lZWQgdG8gYWRkIDEgYmVjYXVzZSB0aGVyZSBhcmUgdGhyZWUgY2hhbm5lbCBwb3NpdGlvbnMgaW4gZmlyc3QgY2hhbm5lbCBncm91cC4gKi8KICNkZWZpbmUgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgICAgICAoIDEgKSAgIC8qIE9ubHkgZnJvbnQgY2hhbm5lbHMgc3VwcG9ydGVkLiAqLwogI2RlZmluZSBQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAgICggMiApICAgLyogVGhlIG1heGltdW0gb3ZlciBhbGwgY2hhbm5lbCBncm91cHMgKi8KI2VuZGlmCiNpZiAoUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMgPiBQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMpCiAjZGVmaW5lIFBDTV9ETVhfTUFYX0lPX0NIQU5ORUxTICBQQ01fRE1YX01BWF9JTl9DSEFOTkVMUwojZWxzZQogI2RlZmluZSBQQ01fRE1YX01BWF9JT19DSEFOTkVMUyAgUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTCiNlbmRpZgoKLyogRGVjb2RlciBsaWJyYXJ5IGluZm8gKi8KI2RlZmluZSBQQ01ETVhfTElCX1ZMMCAyCiNkZWZpbmUgUENNRE1YX0xJQl9WTDEgNAojZGVmaW5lIFBDTURNWF9MSUJfVkwyIDIKI2RlZmluZSBQQ01ETVhfTElCX1RJVExFICJQQ00gRG93bm1peCBMaWIiCiNpZmRlZiBfX0FORFJPSURfXwojZGVmaW5lIFBDTURNWF9MSUJfQlVJTERfREFURSAiIgojZGVmaW5lIFBDTURNWF9MSUJfQlVJTERfVElNRSAiIgojZWxzZQojZGVmaW5lIFBDTURNWF9MSUJfQlVJTERfREFURSBfX0RBVEVfXwojZGVmaW5lIFBDTURNWF9MSUJfQlVJTERfVElNRSBfX1RJTUVfXwojZW5kaWYKCgovKiBGaXhlZCBhbmQgdW5pcXVlIGNoYW5uZWwgZ3JvdXAgaW5kaWNlcy4KICogVGhlIGxhc3QgZ3JvdXAgaW5kZXggaGFzIHRvIGJlIHNtYWxsZXIgdGhhbiBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUy4gKi8KI2RlZmluZSBDSF9HUk9VUF9GUk9OVCAoIDAgKQojZGVmaW5lIENIX0dST1VQX1NJREUgICggMSApCiNkZWZpbmUgQ0hfR1JPVVBfUkVBUiAgKCAyICkKI2RlZmluZSBDSF9HUk9VUF9MRkUgICAoIDMgKQoKLyogVGhlIG9yZGVyaW5nIG9mIHRoZSBmb2xsb3dpbmcgZml4ZWQgY2hhbm5lbCBsYWJlbHMgaGFzIHRvIGJlIGluIE1QRUctNCBzdHlsZS4KICogRnJvbSB0aGUgY2VudGVyIHRvIHRoZSBiYWNrIHdpdGggbGVmdCBhbmQgcmlnaHQgY2hhbm5lbCBpbnRlcmxlYXZlZCAoc3RhcnRpbmcgd2l0aCBsZWZ0KS4KICogVGhlIGxhc3QgY2hhbm5lbCBsYWJlbCBpbmRleCBoYXMgdG8gYmUgc21hbGxlciB0aGFuIFBDTV9ETVhfTUFYX0NIQU5ORUxTLiAqLwojZGVmaW5lIENFTlRFUl9GUk9OVF9DSEFOTkVMICAgICggMCApICAgICAvKiBDICAqLwojZGVmaW5lIExFRlRfRlJPTlRfQ0hBTk5FTCAgICAgICggMSApICAgICAvKiBMICAqLwojZGVmaW5lIFJJR0hUX0ZST05UX0NIQU5ORUwgICAgICggMiApICAgICAvKiBSICAqLwojZGVmaW5lIExFRlRfUkVBUl9DSEFOTkVMICAgICAgICggMyApICAgICAvKiBMciAoYWthIGxlZnQgYmFjayBjaGFubmVsKSBvciBjZW50ZXIgYmFjayBjaGFubmVsICovCiNkZWZpbmUgUklHSFRfUkVBUl9DSEFOTkVMICAgICAgKCA0ICkgICAgIC8qIFJyIChha2EgcmlnaHQgYmFjayBjaGFubmVsKSAqLwojZGVmaW5lIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCAgICggNSApICAgICAvKiBMZiAqLwojZGVmaW5lIExFRlRfTVVMVElQUlBTX0NIQU5ORUwgICggNiApICAgICAvKiBMZWZ0IG11bHRpcHVycG9zZSBjaGFubmVsICovCiNkZWZpbmUgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwgKCA3ICkgICAgIC8qIFJpZ2h0IG11bHRpcHVycG9zZSBjaGFubmVsICovCgovKiBNb3JlIGNvbnN0YW50cyAqLwojZGVmaW5lIE9ORV9DSEFOTkVMICAgICAgICAgICAgICggMSApCiNkZWZpbmUgVFdPX0NIQU5ORUwgICAgICAgICAgICAgKCAyICkKI2RlZmluZSBTSVhfQ0hBTk5FTCAgICAgICAgICAgICAoIDYgKQojZGVmaW5lIEVJR0hUX0NIQU5ORUwgICAgICAgICAgICggOCApCgojZGVmaW5lIFBDTURNWF9BX0lEWF9ERUZBVUxUICAgICggMiApCiNkZWZpbmUgUENNRE1YX0JfSURYX0RFRkFVTFQgICAgKCAyICkKI2RlZmluZSBQQ01ETVhfTEZFX0lEWF9ERUZBVUxUICAoIDE1ICkKI2RlZmluZSBQQ01ETVhfR0FJTl81X0RFRkFVTFQgICAoIDAgKQojZGVmaW5lIFBDTURNWF9HQUlOXzJfREVGQVVMVCAgICggMCApCgojZGVmaW5lIFBDTURNWF9NQVhfSEVBRFJPT00gICAgICggMyApICAgICAvKiBEZWZpbmVzIHRoZSBtYXhpbXVtIFBDTSBzY2FsaW5nIGhlYWRyb29tIHRoYXQgY2FuIGJlIGRvbmUgYnkgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3N0cHJvY2Vzc2luZyBzdGVwLiBUaGlzIHZhbHVlIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbCB0byAwLiAqLwoKI2RlZmluZSBGQUxTRSAgMAojZGVmaW5lIFRSVUUgICAxCiNkZWZpbmUgSU4gICAgIDAKI2RlZmluZSBPVVQgICAgMQoKLyogVHlwZSBkZWZpbml0aW9uczogKi8KI2lmbmRlZiBETVhfSElHSF9QUkVDSVNJT05fRU5BQkxFCiAjZGVmaW5lIEZJWFBfRE1YICAgICAgICAgIEZJWFBfU0dMCiAjZGVmaW5lIEZYX0RNWDJGWF9EQkwoeCkgIEZYX1NHTDJGWF9EQkwoKEZJWFBfU0dMKSh4KSkKICNkZWZpbmUgRlhfREJMMkZYX0RNWCh4KSAgRlhfREJMMkZYX1NHTCh4KQogI2RlZmluZSBGTDJGWENPTlNUX0RNWCh4KSBGTDJGWENPTlNUX1NHTCh4KQogI2RlZmluZSBNQVhWQUxfRE1YICAgICAgICBNQVhWQUxfU0dMCiAjZGVmaW5lIEZYX0RNWDJTSFJUKHgpICAgICgoU0hPUlQpKHgpKQogI2RlZmluZSBGWF9ETVgyRkwoeCkgICAgICBGWF9EQkwyRkwoRlhfRE1YMkZYX0RCTCh4KSkKI2Vsc2UKICNkZWZpbmUgRklYUF9ETVggICAgICAgICAgRklYUF9EQkwKICNkZWZpbmUgRlhfRE1YMkZYX0RCTCh4KSAgKChGSVhQX0RCTCkoeCkpCiAjZGVmaW5lIEZYX0RCTDJGWF9ETVgoeCkgICgoRklYUF9EQkwpKHgpCiAjZGVmaW5lIEZMMkZYQ09OU1RfRE1YKHgpIEZMMkZYQ09OU1RfREJMKHgpCiAjZGVmaW5lIE1BWFZBTF9ETVggICAgICAgIE1BWFZBTF9EQkwKICNkZWZpbmUgRlhfRE1YMlNIUlQoeCkgICAgKChTSE9SVCkoKHgpPj5GUkFDVF9CSVRTKSkKICNkZWZpbmUgRlhfRE1YMkZMKHgpICAgICAgRlhfREJMMkZMKHgpCiNlbmRpZgoKLyogVGhlIG51bWJlciBvZiBjaGFubmVscyBwb3NpdGlvbnMgZm9yIGVhY2ggZ3JvdXAgaW4gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgogKiBTZWUgdGhlIGNoYW5uZWwgbGFiZWxzIGFib3ZlLiAqLwpzdGF0aWMgY29uc3QgVUNIQVIgbWF4Q2hJbkdycFtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU10gPSB7CiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTFMgPiAzKQogIDMsIDAsIDIsIDEKI2Vsc2UKICBQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVAKI2VuZGlmCn07CgovKiBMaXN0IG9mIHBhY2tlZCBjaGFubmVsIG1vZGVzICovCnR5cGVkZWYgZW51bQp7IC8qIENIX01PREVfPG51bUZyb250Q2g+XzxudW1TaWRlQ2g+XzxudW1CYWNrQ2g+XzxudW1MZkNoPiAqLwogIENIX01PREVfVU5ERUZJTkVEID0gMHgwMDAwLAogIC8qIDEgY2hhbm5lbCAqLwogIENIX01PREVfMV8wXzBfMCAgID0gMHgwMDAxLCAgIC8qIGNoQ2ZnIDEgKi8KICAvKiAyIGNoYW5uZWxzICovCiAgQ0hfTU9ERV8yXzBfMF8wICAgPSAweDAwMDIsICAgLyogY2hDZmcgMiAqLwogIC8qIDMgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMF8wXzAgICA9IDB4MDAwMywgICAvKiBjaENmZyAzICovCiAgQ0hfTU9ERV8yXzBfMV8wICAgPSAweDAxMDIsCiAgQ0hfTU9ERV8yXzBfMF8xICAgPSAweDEwMDIsCiAgLyogNCBjaGFubmVscyAqLwogIENIX01PREVfM18wXzFfMCAgID0gMHgwMTAzLCAgIC8qIGNoQ2ZnIDQgKi8KICBDSF9NT0RFXzJfMF8yXzAgICA9IDB4MDIwMiwKICBDSF9NT0RFXzJfMF8xXzEgICA9IDB4MTEwMiwKICBDSF9NT0RFXzRfMF8wXzAgICA9IDB4MDAwNCwKICAvKiA1IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfMl8wICAgPSAweDAyMDMsICAgLyogY2hDZmcgNSAqLwogIENIX01PREVfMl8wXzJfMSAgID0gMHgxMjAyLAogIENIX01PREVfM18wXzFfMSAgID0gMHgxMTAzLAogIENIX01PREVfM18yXzBfMCAgID0gMHgwMDIzLAogIENIX01PREVfNV8wXzBfMCAgID0gMHgwMDA1LAogIC8qIDYgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMF8yXzEgICA9IDB4MTIwMywgICAvKiBjaENmZyA2ICovCiAgQ0hfTU9ERV8zXzJfMF8xICAgPSAweDEwMjMsCiAgQ0hfTU9ERV8zXzJfMV8wICAgPSAweDAxMjMsCiAgQ0hfTU9ERV81XzBfMV8wICAgPSAweDAxMDUsCiAgQ0hfTU9ERV82XzBfMF8wICAgPSAweDAwMDYsCiAgLyogNyBjaGFubmVscyAqLwogIENIX01PREVfMl8yXzJfMSAgID0gMHgxMjIyLAogIENIX01PREVfM18wXzNfMSAgID0gMHgxMzAzLCAgIC8qIGNoQ2ZnIDExICovCiAgQ0hfTU9ERV8zXzJfMV8xICAgPSAweDExMjMsCiAgQ0hfTU9ERV8zXzJfMl8wICAgPSAweDAyMjMsCiAgQ0hfTU9ERV8zXzBfMl8yICAgPSAweDIyMDMsCiAgQ0hfTU9ERV81XzBfMl8wICAgPSAweDAyMDUsCiAgQ0hfTU9ERV81XzBfMV8xICAgPSAweDExMDUsCiAgQ0hfTU9ERV83XzBfMF8wICAgPSAweDAwMDcsCiAgLyogOCBjaGFubmVscyAqLwogIENIX01PREVfM18yXzJfMSAgID0gMHgxMjIzLAogIENIX01PREVfM18wXzRfMSAgID0gMHgxNDAzLCAgIC8qIGNoQ2ZnIDEyICovCiAgQ0hfTU9ERV81XzBfMl8xICAgPSAweDEyMDUsICAgLyogY2hDZmcgNyArIDE0ICovCiAgQ0hfTU9ERV81XzJfMV8wICAgPSAweDAxMjUsCiAgQ0hfTU9ERV8zXzJfMV8yICAgPSAweDIxMjMsCiAgQ0hfTU9ERV8yXzJfMl8yICAgPSAweDIyMjIsCiAgQ0hfTU9ERV8zXzBfM18yICAgPSAweDIzMDMsCiAgQ0hfTU9ERV84XzBfMF8wICAgPSAweDAwMDgKCn0gUENNX0RNWF9DSEFOTkVMX01PREU7CgoKLyogVGhlc2UgYXJlIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb25zIGxpbmtlZCB0bwogICB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyBnaXZlIGJ5IHRoZSB1c2VyOiAqLwpzdGF0aWMgY29uc3QgUENNX0RNWF9DSEFOTkVMX01PREUgb3V0Q2hNb2RlVGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFMrMV0gPQp7CiAgQ0hfTU9ERV9VTkRFRklORUQsCiAgQ0hfTU9ERV8xXzBfMF8wLCAgLyogMSBjaGFubmVsICAqLwogIENIX01PREVfMl8wXzBfMCwgIC8qIDIgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMF8wXzAgICAvKiAzIGNoYW5uZWxzICovCiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTFMgPiAzKQogLENIX01PREVfM18wXzFfMCwgIC8qIDQgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMF8yXzAsICAvKiA1IGNoYW5uZWxzICovCiAgQ0hfTU9ERV8zXzBfMl8xLCAgLyogNiBjaGFubmVscyAqLwogIENIX01PREVfM18wXzNfMSwgIC8qIDcgY2hhbm5lbHMgKi8KICBDSF9NT0RFXzNfMF80XzEgICAvKiA4IGNoYW5uZWxzICovCiNlbmRpZgp9OwoKc3RhdGljIGNvbnN0IEZJWFBfRE1YIGFiTWl4THZsVmFsdWVUYWJbOF0gPQp7CiAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwgICAvKiBzY2FsZWQgYnkgMSAqLwogIEZMMkZYQ09OU1RfRE1YKDAuODQxZiksCiAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwKICBGTDJGWENPTlNUX0RNWCgwLjU5NmYpLAogIEZMMkZYQ09OU1RfRE1YKDAuNTAwZiksCiAgRkwyRlhDT05TVF9ETVgoMC40MjJmKSwKICBGTDJGWENPTlNUX0RNWCgwLjM1NWYpLAogIEZMMkZYQ09OU1RfRE1YKDAuMGYpCn07CgpzdGF0aWMgY29uc3QgRklYUF9ETVggbGZlTWl4THZsVmFsdWVUYWJbMTZdID0KeyAvKiAgICAgICAgICAgICB2YWx1ZSwgICAgICAgIHNjYWxlICovCiAgRkwyRlhDT05TVF9ETVgoMC43OTA1ZiksICAvKiAgICAgMiAqLwogIEZMMkZYQ09OU1RfRE1YKDAuNTAwMGYpLCAgLyogICAgIDIgKi8KICBGTDJGWENPTlNUX0RNWCgwLjgzOTVmKSwgIC8qICAgICAxICovCiAgRkwyRlhDT05TVF9ETVgoMC43MDY1ZiksICAvKiAgICAgMSAqLwogIEZMMkZYQ09OU1RfRE1YKDAuNTk0NWYpLCAgLyogICAgIDEgKi8KICBGTDJGWENPTlNUX0RNWCgwLjUwMGYpLCAgIC8qICAgICAxICovCiAgRkwyRlhDT05TVF9ETVgoMC44NDFmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjU5NmYpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC41MDBmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuMzE2ZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjE3OGYpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC4xMDBmKSwgICAvKiAgICAgMCAqLwogIEZMMkZYQ09OU1RfRE1YKDAuMDMyZiksICAgLyogICAgIDAgKi8KICBGTDJGWENPTlNUX0RNWCgwLjAxMGYpLCAgIC8qICAgICAwICovCiAgRkwyRlhDT05TVF9ETVgoMC4wMDBmKSAgICAvKiAgICAgMCAqLwp9OwoKCgojaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQogIC8qIE1QRUcgbWF0cml4IG1peGRvd246CiAgICAgIFNldCAxOiAgTCcgPSAoMSArIDJeLTAuNSArIEEgKV4tMSAqIFtMICsgQyAqIDJeLTAuNSArIEEgKiBMc107CiAgICAgICAgICAgICAgUicgPSAoMSArIDJeLTAuNSArIEEgKV4tMSAqIFtSICsgQyAqIDJeLTAuNSArIEEgKiBSc107CgogICAgICBTZXQgMjogIEwnID0gKDEgKyAyXi0wLjUgKyAyQSApXi0xICogW0wgKyBDICogMl4tMC41IC0gQSAqIChMcyArIFJzKV07CiAgICAgICAgICAgICAgUicgPSAoMSArIDJeLTAuNSArIDJBICleLTEgKiBbUiArIEMgKiAyXi0wLjUgKyBBICogKExzICsgUnMpXTsKCiAgICAgIE0gPSAoMyArIDJBKV4tMSAqIFtMICsgQyArIFIgKyBBKihMcyArIFJzKV07CiAgKi8KICBzdGF0aWMgY29uc3QgRklYUF9ETVggbXBlZ01peERvd25JZHgyQ29lZls0XSA9CiAgewogICAgRkwyRlhDT05TVF9ETVgoMC43MDcxMDY3OGYpLAogICAgRkwyRlhDT05TVF9ETVgoMC41ZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjM1MzU1MzM5ZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjBmKQogIH07CgogIHN0YXRpYyBjb25zdCBGSVhQX1NHTCBtcGVnTWl4RG93bklkeDJQcmVGYWN0WzNdWzRdID0KICB7IHsgIC8qIFNldCAxOiAqLwogICAgRkwyRlhDT05TVF9ETVgoMC40MTQyMTM1NjIzNzMwOTUwZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjQ1MzA4MTgzOTMyMTk3MjhmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuNDg1MjgxMzc0MjM4NTcwM2YpLAogICAgRkwyRlhDT05TVF9ETVgoMC41ODU3ODY0Mzc2MjY5MDUwZikKICB9LHsgIC8qIFNldCAyOiAqLwogICAgRkwyRlhDT05TVF9ETVgoMC4zMjAzNzcyNDEwMTcwNDA3ZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjM2OTM5ODA2MjUxODEyOTNmKSwKICAgIEZMMkZYQ09OU1RfRE1YKDAuNDE0MjEzNTYyMzczMDk1MGYpLAogICAgRkwyRlhDT05TVF9ETVgoMC41ODU3ODY0Mzc2MjY5MDUwZikKICB9LHsgIC8qIE1vbm8gRE1YIHNldDogKi8KICAgIEZMMkZYQ09OU1RfRE1YKDAuMjI2NTQwOTE5NjYwOTg2NGYpLAogICAgRkwyRlhDT05TVF9ETVgoMC4yNWYpLAogICAgRkwyRlhDT05TVF9ETVgoMC4yNjk3NTIxNDMzODk4MTc5ZiksCiAgICBGTDJGWENPTlNUX0RNWCgwLjMzMzMzMzMzMzMzMzMzMzNmKSB9CiAgfTsKI2VuZGlmICAvKiBQQ0VfTUVUQURBVEFfRU5BQkxFICovCgoKI2RlZmluZSBUWVBFX05PTkUgICAgICAoIDB4MCApCiNkZWZpbmUgVFlQRV9EU0VfREFUQSAgKCAweDEgKQojZGVmaW5lIFRZUEVfUENFX0RBVEEgICggMHgyICkKCnR5cGVkZWYgc3RydWN0CnsKICBVSU5UICAgdHlwZUZsYWdzOwogIC8qIEZyb20gRFNFICovCiAgVUNIQVIgIGNMZXZJZHg7CiAgVUNIQVIgIHNMZXZJZHg7CiAgVUNIQVIgIGRtaXhJZHhBOwogIFVDSEFSICBkbWl4SWR4QjsKICBVQ0hBUiAgZG1peElkeExmZTsKICBVQ0hBUiAgZG14R2FpbklkeDI7CiAgVUNIQVIgIGRteEdhaW5JZHg1OwojaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQogIC8qIEZyb20gUENFICovCiAgVUNIQVIgIG1hdHJpeE1peGRvd25JZHg7CiNlbmRpZgogIC8qIEF0dHJpYnV0ZXM6ICovCiAgU0NIQVIgIHBzZXVkb1N1cnJvdW5kOyAgICAgICAgICAgICAgIC8qITwgSWYgc2V0IHRvIDEgdGhlIHNpZ25hbCBpcyBwc2V1ZG8gc3Vycm91bmQgY29tcGF0aWJsZS4gVGhlIHZhbHVlIDAgdGVsbHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGl0IGlzIG5vdC4gSWYgdGhlIHZhbHVlIGlzIC0xIHRoZSBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLiAgKi8KICBVSU5UICAgZXhwaXJ5Q291bnQ7ICAgICAgICAgICAgICAgICAgLyohPCBDb3VudGVyIHRvIG1vbml0b3IgdGhlIGxpZmUgdGltZSBvZiBhIG1ldGEgZGF0YSBzZXQuICovCgp9IERNWF9CU19NRVRBX0RBVEE7CgovKiBEZWZhdWx0IG1ldGFkYXRhICovCnN0YXRpYyBjb25zdCBETVhfQlNfTUVUQV9EQVRBICBkZmx0TWV0YURhdGEgPSB7CiAgMCwgMiwgMiwgMiwgMiwgMTUsIDAsIDAsCiNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCiAgMCwKI2VuZGlmCiAgLTEsIDAKfTsKCi8qIER5bmFtaWMgKHVzZXIpIHBhcmFtczoKICAgICBTZWUgdGhlIGRlZmluaXRpb24gb2YgUENNRE1YX1BBUkFNIGZvciBkZXRhaWxzIG9uIHRoZSBzcGVjaWZpYyBmaWVsZHMuICovCnR5cGVkZWYgc3RydWN0CnsKICBVSU5UICAgZXhwaXJ5RnJhbWU7ICAgICAgICAgICAgICAgICAgIC8qITwgTGlua2VkIHRvIERNWF9CU19EQVRBX0VYUElSWV9GUkFNRSAgICAgICAqLwogIERVQUxfQ0hBTk5FTF9NT0RFIGR1YWxDaGFubmVsTW9kZTsgICAgLyohPCBMaW5rZWQgdG8gRE1YX0RVQUxfQ0hBTk5FTF9NT0RFICAgICAgICAgICovCiAgUFNFVURPX1NVUlJPVU5EX01PREUgcHNldWRvU3Vyck1vZGU7ICAvKiE8IExpbmtlZCB0byBETVhfUFNFVURPX1NVUlJPVU5EX01PREUgICAgICAgKi8KICBTSE9SVCAgbnVtT3V0Q2hhbm5lbHNNaW47ICAgICAgICAgICAgIC8qITwgTGlua2VkIHRvIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTICAqLwogIFNIT1JUICBudW1PdXRDaGFubmVsc01heDsgICAgICAgICAgICAgLyohPCBMaW5rZWQgdG8gTUFYX05VTUJFUl9PRl9PVVRQVVRfQ0hBTk5FTFMgICovCiAgVUNIQVIgIGZyYW1lRGVsYXk7ICAgICAgICAgICAgICAgICAgICAvKiE8IExpbmtlZCB0byBETVhfQlNfREFUQV9ERUxBWSAgICAgICAgICAgICAgKi8KCn0gUENNX0RNWF9VU0VSX1BBUkFNUzsKCi8qIE1vZHVsZXMgbWFpbiBkYXRhIHN0cnVjdHVyZTogKi8Kc3RydWN0IFBDTV9ETVhfSU5TVEFOQ0UKewogIC8qIE1ldGFkYXRhICovCiAgRE1YX0JTX01FVEFfREFUQSAgICAgYnNNZXRhRGF0YVtQQ01fRE1YX01BWF9ERUxBWV9GUkFNRVMrMV07CiAgUENNX0RNWF9VU0VSX1BBUkFNUyAgdXNlclBhcmFtczsKCiAgVUNIQVIgIGFwcGx5UHJvY2Vzc2luZzsgICAgICAgICAgICAgIC8qITwgRmxhZyB0byBlbi0vZGlzYWJsZSBtb2R1bGVzIHByb2Nlc3NpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIG1heCBjaGFubmVsIGxpbWl0aW5nIGlzIGRvbmUgaW5kZXBlbmRlbnRseS4gKi8KfTsKCi8qIE1lbW9yeSBhbGxvY2F0aW9uIG1hY3JvICovCkNfQUxMT0NfTUVNX1NUQVRJQyhQY21EbXhJbnN0YW5jZSwgc3RydWN0IFBDTV9ETVhfSU5TVEFOQ0UsIDEpCgoKLyoqIEV2YWx1YXRlIGEgZ2l2ZW4gY2hhbm5lbCBjb25maWd1cmF0aW9uIGFuZCBleHRyYWN0IGEgcGFja2VkIGNoYW5uZWwgbW9kZS4gSW4gYWRkaXRpb24gdGhlCiAqICBmdW5jdGlvbiBnZW5lcmF0ZXMgYSBjaGFubmVsIG9mZnNldCB0YWJsZSBmb3IgdGhlIG1hcHBpbmcgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgogKiAgVGhpcyBmdW5jdGlvbiBpcyB0aGUgaW52ZXJzZSB0byB0aGUgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uKCkgcm91dGluZS4KICogQHBhcmFtIFtpbl0gVGhlIHRvdGFsIG51bWJlciBvZiBjaGFubmVscyBvZiB0aGUgZ2l2ZW4gY29uZmlndXJhdGlvbi4KICogQHBhcmFtIFtpbl0gQXJyYXkgaG9sZGluZyB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGVzIGZvciBlYWNoIGNoYW5uZWwuCiAqIEBwYXJhbSBbaW5dIEFycmF5IGhvbGRpbmcgdGhlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlIGluZGljZXMgZm9yIGVhY2ggY2hhbm5lbC4KICogQHBhcmFtIFtvdXRdIEFycmF5IHdoZXJlIHRoZSBidWZmZXIgb2Zmc2V0cyBmb3IgZWFjaCBjaGFubmVsIGFyZSBzdG9yZWQgaW50by4KICogQHBhcmFtIFtvdXRdIFRoZSBnZW5lcmF0ZWQgcGFja2VkIGNoYW5uZWwgbW9kZSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIGlucHV0IGNvbmZpZ3VyYXRpb24uCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpzdGF0aWMKUENNRE1YX0VSUk9SIGdldENoYW5uZWxNb2RlICgKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KICAgICAgICBjb25zdCBBVURJT19DSEFOTkVMX1RZUEUgY2hhbm5lbFR5cGVbXSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbXSwgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdLCAgICAgLyogb3V0ICovCiAgICAgICAgUENNX0RNWF9DSEFOTkVMX01PREUgICAgKmNoTW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLwogICAgICApCnsKICBVQ0hBUiBjaElkeFtQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQXTsKICBVQ0hBUiBudW1DaEluR3JwW1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXTsgLyogVG90YWwgbnVtIG9mIGNoYW5uZWxzIHBlciBncm91cCBvZiB0aGUgaW5wdXQgY29uZmlnICovCiAgVUNIQVIgbnVtQ2hGcmVlW1BDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTXTsgIC8qIE51bWJlciBvZiBmcmVlIHNsb3RzIHBlciBncm91cCBpbiB0aGUgaW50ZXJuYWwgcmVwci4gKi8KICBVQ0hBUiBoYXJkVG9QbGFjZVtQQ01fRE1YX01BWF9DSEFOTkVMU107ICAgICAgLyogTGlzdCBvZiBjaGFubmVscyBub3QgbWF0Y2hpbmcgdGhlIGludGVybmFsIHJlcHIuICovCiAgVUNIQVIgaDJwU29ydElkeFtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgUENNRE1YX0VSUk9SIGVyciA9IFBDTURNWF9PSzsKICBpbnQgICBjaCwgZ3JwSWR4OwogIGludCAgIG51bUNoVG9QbGFjZSA9IDA7CgogIEZES19BU1NFUlQoY2hhbm5lbFR5cGUgIT0gTlVMTCk7CiAgRkRLX0FTU0VSVChjaGFubmVsSW5kaWNlcyAhPSBOVUxMKTsKICBGREtfQVNTRVJUKG9mZnNldFRhYmxlICE9IE5VTEwpOwogIEZES19BU1NFUlQoY2hNb2RlICE9IE5VTEwpOwoKICAvKiBGb3IgZGV0YWlscyBzZWUgSVNPL0lFQyAxMzgxOC03OjIwMDUoRSksIDguNS4zIENoYW5uZWwgY29uZmlndXJhdGlvbiAqLwogIEZES21lbWNsZWFyKG51bUNoSW5HcnAsIFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTKnNpemVvZihVQ0hBUikpOwogIEZES21lbXNldChvZmZzZXRUYWJsZSwgMjU1LCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKICBGREttZW1zZXQoY2hJZHgsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQKnNpemVvZihVQ0hBUikpOwogIEZES21lbXNldChoYXJkVG9QbGFjZSwgMjU1LCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKICBGREttZW1zZXQoaDJwU29ydElkeCwgMjU1LCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKICAvKiBHZXQgdGhlIHJlc3RyaWN0aW9ucyBvZiB0aGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gKi8KICBGREttZW1jcHkobnVtQ2hGcmVlLCBtYXhDaEluR3JwLCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUypzaXplb2YoVUNIQVIpKTsKCiAgKmNoTW9kZSA9IENIX01PREVfVU5ERUZJTkVEOwoKICAvKiBDYXRlZ29yaXplIGNoYW5uZWxzICovCiAgZm9yIChjaCA9IDA7IGNoIDwgbnVtQ2hhbm5lbHM7IGNoICs9IDEpIHsKICAgIFVDSEFSIGNoR3JwSWR4ID0gY2hhbm5lbEluZGljZXNbY2hdOwogICAgaW50IGkgPSAwLCBqOwoKICAgIHN3aXRjaCAoY2hhbm5lbFR5cGVbY2hdKSB7CiAgICBjYXNlIEFDVF9GUk9OVF9UT1A6CiAgICAgIGNoR3JwSWR4ICs9IG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdOyAgLyogQXBwZW5kIGFmdGVyIG5vcm1hbCBwbGFpbiAqLwogICAgY2FzZSBBQ1RfRlJPTlQ6CiAgICAgIGdycElkeCA9IENIX0dST1VQX0ZST05UOwogICAgICBicmVhazsKI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCiAgICBjYXNlIEFDVF9TSURFX1RPUDoKICAgICAgY2hHcnBJZHggKz0gbnVtQ2hJbkdycFtDSF9HUk9VUF9TSURFXTsgICAvKiBBcHBlbmQgYWZ0ZXIgbm9ybWFsIHBsYWluICovCiAgICBjYXNlIEFDVF9TSURFOgogICAgICBncnBJZHggPSBDSF9HUk9VUF9TSURFOwogICAgICBicmVhazsKICAgIGNhc2UgQUNUX0JBQ0tfVE9QOgogICAgICBjaEdycElkeCArPSBudW1DaEluR3JwW0NIX0dST1VQX1JFQVJdOyAgIC8qIEFwcGVuZCBhZnRlciBub3JtYWwgcGxhaW4gKi8KICAgIGNhc2UgQUNUX0JBQ0s6CiAgICAgIGdycElkeCA9IENIX0dST1VQX1JFQVI7CiAgICAgIGJyZWFrOwogICAgY2FzZSBBQ1RfTEZFOgogICAgICBncnBJZHggPSBDSF9HUk9VUF9MRkU7CiAgICAgIGJyZWFrOwojZW5kaWYKICAgIGRlZmF1bHQ6CiAgICAgIC8qIEZvdW5kIGEgY2hhbm5lbCB0aGF0IGNhbiBub3QgYmUgY2F0ZWdvcml6ZWQhIE1vc3QgbGlrZWx5IGR1ZSB0byBjb3JydXB0IGlucHV0IHNpZ25hbGxpbmcuCiAgICAgICAgIFRoZSByZXNjdWUgc3RyYXRlZ3kgaXMgdG8gYXBwZW5kIGl0IHRvIHRoZSBmcm9udCBjaGFubmVscyAoPT4gaWdub3JlIGluZGV4KS4KICAgICAgICAgVGhpcyBjb3VsZCBjYXVzZSBzdHJhbmdlIGJlaGF2aW91ciBzbyByZXR1cm4gYW4gZXJyb3IgdG8gc2lnbmFsIGl0LiAqLwogICAgICBlcnIgPSBQQ01ETVhfSU5WQUxJRF9NT0RFOwogICAgICBncnBJZHggPSBDSF9HUk9VUF9GUk9OVDsKICAgICAgY2hHcnBJZHggPSBudW1DaGFubmVscyArIG51bUNoVG9QbGFjZTsKICAgICAgbnVtQ2hUb1BsYWNlICs9IDE7CiAgICAgIGJyZWFrOwogICAgfQoKICAgIGlmIChudW1DaEluR3JwW2dycElkeF0gPCBQQ01fRE1YX01BWF9DSEFOTkVMU19QRVJfR1JPVVApIHsKICAgICAgLyogU29ydCBjaGFubmVscyBieSBpbmRleCAqLwogICAgICB3aGlsZSAoIChpIDwgbnVtQ2hJbkdycFtncnBJZHhdKSAmJiAoY2hHcnBJZHggPiBjaGFubmVsSW5kaWNlc1tjaElkeFtncnBJZHhdW2ldXSkgKSB7CiAgICAgICAgaSArPSAxOwogICAgICB9CiAgICAgIGZvciAoaiA9IG51bUNoSW5HcnBbZ3JwSWR4XTsgaiA+IGk7IGogLT0gMSkgewogICAgICAgIGNoSWR4W2dycElkeF1bal0gPSBjaElkeFtncnBJZHhdW2otMV07CiAgICAgIH0KICAgICAgY2hJZHhbZ3JwSWR4XVtpXSA9IGNoOwogICAgICBudW1DaEluR3JwW2dycElkeF0gKz0gMTsKICAgIH0KICB9CgojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKICBGREtfQVNTRVJUKCAobnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0rbnVtQ2hJbkdycFtDSF9HUk9VUF9TSURFXQogICAgICAgICAgICAgICtudW1DaEluR3JwW0NIX0dST1VQX1JFQVJdK251bUNoSW5HcnBbQ0hfR1JPVVBfTEZFXSkgPT0gbnVtQ2hhbm5lbHMpOwojZWxzZQogIEZES19BU1NFUlQoIG51bUNoSW5HcnBbQ0hfR1JPVVBfRlJPTlRdID09IG51bUNoYW5uZWxzICk7CiNlbmRpZgoKICAvKiBDb21wb3NlIGNoYW5uZWwgb2Zmc2V0IHRhYmxlOgogICAqIE1hcCBhbGwgY2hhbm5lbHMgdG8gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLiAqLwogIG51bUNoVG9QbGFjZSA9IDA7CgogIC8qIE5vbi1zeW1tZXRyaWMgY2hhbm5lbHMgKi8KICBpZiAobnVtQ2hJbkdycFtDSF9HUk9VUF9GUk9OVF0gJiAweDEpIHsKICAgIC8qIE9kZCBudW1iZXIgb2YgZnJvbnQgY2hhbm5lbHMgLT4gd2UgaGF2ZSBhIGNlbnRlciBjaGFubmVsLgogICAgICAgSW4gTVBFRy00IHRoZSBjZW50ZXIgaGFzIHRoZSBpbmRleCAwLiAqLwogICAgb2Zmc2V0VGFibGVbQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gY2hJZHhbQ0hfR1JPVVBfRlJPTlRdWzBdOwogICAgbnVtQ2hGcmVlW0NIX0dST1VQX0ZST05UXSAtPSAxOwogIH0KCiAgZm9yIChncnBJZHggPSAwOyBncnBJZHggPCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUzsgZ3JwSWR4ICs9IDEpIHsKICAgIGludCBjaE1hcFBvcyA9IDA7CiAgICBjaCA9IDA7ICAvKiBJbmRleCBvZiBjaGFubmVsIHdpdGhpbiB0aGUgc3BlY2lmaWMgZ3JvdXAgKi8KCiAgICBzd2l0Y2ggKGdycElkeCkgewogICAgY2FzZSBDSF9HUk9VUF9GUk9OVDoKICAgICAgY2hNYXBQb3MgPSBMRUZUX0ZST05UX0NIQU5ORUw7CiAgICAgIGNoID0gbnVtQ2hJbkdycFtncnBJZHhdICYgMHgxOwogICAgICBicmVhazsKI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCiAgICBjYXNlIENIX0dST1VQX1NJREU6CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9HUk9VUF9SRUFSOgogICAgICBjaE1hcFBvcyA9IExFRlRfUkVBUl9DSEFOTkVMOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfR1JPVVBfTEZFOgogICAgICBjaE1hcFBvcyA9IExPV19GUkVRVUVOQ1lfQ0hBTk5FTDsKICAgICAgYnJlYWs7CiNlbmRpZgogICAgZGVmYXVsdDoKICAgICAgRkRLX0FTU0VSVCgwKTsKICAgICAgY29udGludWU7CiAgICB9CgogICAgLyogTWFwIGFsbCBjaGFubmVscyBvZiB0aGUgZ3JvdXAgKi8KICAgIGZvciAoIDsgY2ggPCBudW1DaEluR3JwW2dycElkeF07IGNoICs9IDEpIHsKICAgICAgaWYgKG51bUNoRnJlZVtncnBJZHhdID4gMCkgewogICAgICAgIG9mZnNldFRhYmxlW2NoTWFwUG9zXSA9IGNoSWR4W2dycElkeF1bY2hdOwogICAgICAgIGNoTWFwUG9zICs9IDE7CiAgICAgICAgbnVtQ2hGcmVlW2dycElkeF0gLT0gMTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvKiBBZGQgdG8gdGhlIGxpc3Qgb2YgaGFyZHNoaXAgY2FzZXMgY29uc2lkZXJpbmcgYSBNUEVHLWxpa2Ugc29ydGluZyBvcmRlcjogKi8KICAgICAgICBpbnQgcG9zLCBzb3J0SWR4ID0gZ3JwSWR4KlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCArIGNoYW5uZWxJbmRpY2VzW2NoSWR4W2dycElkeF1bY2hdXTsKICAgICAgICBmb3IgKHBvcyA9IG51bUNoVG9QbGFjZTsgcG9zID4gMDsgcG9zIC09IDEpIHsKICAgICAgICAgIGlmIChoMnBTb3J0SWR4W3Bvcy0xXSA+IHNvcnRJZHgpIHsKICAgICAgICAgICAgaGFyZFRvUGxhY2VbcG9zXSA9IGhhcmRUb1BsYWNlW3Bvcy0xXTsKICAgICAgICAgICAgaDJwU29ydElkeFtwb3NdID0gaDJwU29ydElkeFtwb3MtMV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKiBJbnNlcnQgY2hhbm5lbCBhdCB0aGUgY3VycmVudCBpbmRleC9wb3NpdGlvbiAqLwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaGFyZFRvUGxhY2VbcG9zXSA9IGNoSWR4W2dycElkeF1bY2hdOwogICAgICAgIGgycFNvcnRJZHhbcG9zXSA9IHNvcnRJZHg7CiAgICAgICAgbnVtQ2hUb1BsYWNlICs9IDE7CiAgICAgIH0KICAgIH0KICB9CgogIHsgLyogQXNzaWduIHRoZSBoYXJkc2hpcCBjYXNlcyAqLwogICAgaW50IGNoTWFwUG9zID0gMDsKICAgIGludCBtYXBwaW5nSGVhdCA9IDA7CiAgICBmb3IgKGNoID0gMDsgY2ggPCBudW1DaFRvUGxhY2U7IGNoKz0xKSB7CiAgICAgIGludCBjaEFzc2lnbmVkID0gMDsKCiAgICAgIC8qIEp1c3QgYXNzaWduaW5nIHRoZSBjaGFubmVscyB0byB0aGUgbmV4dCBiZXN0IHNsb3QgY2FuIGxlYWQgdG8gdW5kZXNpcmVkIHJlc3VsdHMgKGVzcGVjaWFsbHkgZm9yIHgveC8xLngKICAgICAgICAgY29uZmlndXJhdGlvbnMpLiBUaHVzIHVzZSB0aGUgTVBFRy1saWtlIHNvcnRpbmcgaW5kZXggdG8gZmluZCB0aGUgYmVzdCBmaXR0aW5nIHNsb3QgZm9yIGVhY2ggY2hhbm5lbC4KICAgICAgICAgSWYgdGhpcyBpcyBub3QgcG9zc2libGUgdGhlIHNvcnRpbmcgaW5kZXggd2lsbCBiZSBpZ25vcmVkIChtYXBwaW5nSGVhdCA+PSAyKS4gKi8KICAgICAgZm9yICggOyBjaE1hcFBvcyA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaE1hcFBvcys9MSkgewogICAgICAgIGlmIChvZmZzZXRUYWJsZVtjaE1hcFBvc10gPT0gMjU1KSB7CiAgICAgICAgICBpbnQgcHJ2U29ydElkeCA9IDA7CiAgICAgICAgICBpbnQgbnh0U29ydElkeCA9IChDSF9HUk9VUF9MRkUrMSkqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQOwoKICAgICAgICAgIGlmIChtYXBwaW5nSGVhdCA8IDIpIHsKICAgICAgICAgICAgaWYgKGNoTWFwUG9zIDwgTEVGVF9SRUFSX0NIQU5ORUwpIHsKICAgICAgICAgICAgICAvKiBHb3QgZnJvbnQgY2hhbm5lbCBzbG90ICovCiAgICAgICAgICAgICAgcHJ2U29ydElkeCA9IENIX0dST1VQX0ZST05UKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCArIGNoTWFwUG9zIC0gQ0VOVEVSX0ZST05UX0NIQU5ORUw7CiAgICAgICAgICAgICAgbnh0U29ydElkeCA9IENIX0dST1VQX1NJREUgKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjaE1hcFBvcyA8IExPV19GUkVRVUVOQ1lfQ0hBTk5FTCkgewogICAgICAgICAgICAgIC8qIEdvdCBiYWNrIGNoYW5uZWwgc2xvdCAqLwogICAgICAgICAgICAgIHBydlNvcnRJZHggPSBDSF9HUk9VUF9SRUFSKlBDTV9ETVhfTUFYX0NIQU5ORUxTX1BFUl9HUk9VUCArIGNoTWFwUG9zIC0gTEVGVF9SRUFSX0NIQU5ORUw7CiAgICAgICAgICAgICAgbnh0U29ydElkeCA9IENIX0dST1VQX0xGRSAqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNoTWFwUG9zIDwgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCkgewogICAgICAgICAgICAgIC8qIEdvdCBsZmUgY2hhbm5lbCBzbG90ICovCiAgICAgICAgICAgICAgcHJ2U29ydElkeCA9ICBDSF9HUk9VUF9MRkUgICAqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQICsgY2hNYXBQb3MgLSBMT1dfRlJFUVVFTkNZX0NIQU5ORUw7CiAgICAgICAgICAgICAgbnh0U29ydElkeCA9IChDSF9HUk9VUF9MRkUrMSkqUENNX0RNWF9NQVhfQ0hBTk5FTFNfUEVSX0dST1VQOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLyogQXNzaWduIHRoZSBjaGFubmVsIG9ubHkgaWYgaXRzIHNvcnQgaW5kZXggaXMgd2l0aGluIHRoZSByYW5nZSAqLwogICAgICAgICAgaWYgKCAoaDJwU29ydElkeFtjaF0gPj0gcHJ2U29ydElkeCkKICAgICAgICAgICAgJiYgKGgycFNvcnRJZHhbY2hdIDwgIG54dFNvcnRJZHgpICkgewogICAgICAgICAgICBvZmZzZXRUYWJsZVtjaE1hcFBvcysrXSA9IGhhcmRUb1BsYWNlW2NoXTsKICAgICAgICAgICAgY2hBc3NpZ25lZCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2hBc3NpZ25lZCA9PSAwKSB7CiAgICAgICAgY2hNYXBQb3MgPSAwOwogICAgICAgIGNoIC09IDE7CiAgICAgICAgbWFwcGluZ0hlYXQgKz0gMTsKICAgICAgICBjb250aW51ZTsKICAgICAgfQogICAgfQogIH0KCiAgLyogQ29tcG9zZSB0aGUgY2hhbm5lbCBtb2RlICovCiAgKmNoTW9kZSA9IChQQ01fRE1YX0NIQU5ORUxfTU9ERSkoIChudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSAmIDB4RikKI2lmIChQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUyA+IDEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IChudW1DaEluR3JwW0NIX0dST1VQX1NJREVdICAmIDB4RikgPDwgIDQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgKG51bUNoSW5HcnBbQ0hfR1JPVVBfUkVBUl0gICYgMHhGKSA8PCAgOAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAobnVtQ2hJbkdycFtDSF9HUk9VUF9MRkVdICAgJiAweEYpIDw8IDEyCiNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgcmV0dXJuIGVycjsKfQoKCi8qKiBHZW5lcmF0ZSBhIGNoYW5uZWwgb2Zmc2V0IHRhYmxlIGFuZCBjb21wbGV0ZSBjaGFubmVsIGRlc2NyaXB0aW9uIGZvciBhIGdpdmVuIChwYWNrZWQpIGNoYW5uZWwgbW9kZS4KICogIFRoaXMgZnVuY3Rpb24gaXMgdGhlIGludmVyc2UgdG8gdGhlIGdldENoYW5uZWxNb2RlKCkgcm91dGluZSBidXQgZG9lcyBub3Qgc3VwcG9ydCB3ZWlyZCBjaGFubmVsCiAqICBjb25maWd1cmF0aW9ucy4gQWxsIGNoYW5uZWxzIGhhdmUgdG8gYmUgaW4gdGhlIG5vcm1hbCBoZWlnaHQgbGF5ZXIgYW5kIHRoZXJlIG11c3Qgbm90IGJlIG1vcmUKICogIGNoYW5uZWxzIGluIGVhY2ggZ3JvdXAgdGhhbiBnaXZlbiBieSBtYXhDaEluR3JwLgogKiBAcGFyYW0gW2luXSBUaGUgcGFja2VkIGNoYW5uZWwgbW9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiB0byBiZSBwcm9jZXNzZWQuCiAqIEBwYXJhbSBbaW5dIEFycmF5IGNvbnRhaW5pbmcgdGhlIGNoYW5uZWwgbWFwcGluZyB0byBiZSB1c2VkIChGcm9tIE1QRUcgUENFIG9yZGVyaW5nIHRvIHdoYXRldmVyIGlzIHJlcXVpcmVkKS4KICogQHBhcmFtIFtvdXRdIEFycmF5IHdoZXJlIGNvcnJlc3BvbmRpbmcgY2hhbm5lbCB0eXBlcyBmb3IgZWFjaCBjaGFubmVscyBhcmUgc3RvcmVkIGludG8uCiAqIEBwYXJhbSBbb3V0XSBBcnJheSB3aGVyZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRpY2VzIGZvciBlYWNoIG91dHB1dCBjaGFubmVsIGFyZSBzdG9yZWQgaW50by4KICogQHBhcmFtIFtvdXRdIEFycmF5IHdoZXJlIHRoZSBidWZmZXIgb2Zmc2V0cyBmb3IgZWFjaCBjaGFubmVsIGFyZSBzdG9yZWQgaW50by4KICogQHJldHVybnMgTm9uZS4KICoqLwpzdGF0aWMKdm9pZCBnZXRDaGFubmVsRGVzY3JpcHRpb24gKAogICAgICAgIGNvbnN0IFBDTV9ETVhfQ0hBTk5FTF9NT0RFICBjaE1vZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW4gKi8KICAgICAgICBjb25zdCBVQ0hBUiAgICAgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmdbXVs4XSwgICAgICAgICAgICAgICAgICAgIC8qIGluICovCiAgICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFICAgICAgICAgIGNoYW5uZWxUeXBlW10sICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBvdXQgKi8KICAgICAgICBVQ0hBUiAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbXSwgICAgICAgICAgICAgICAgICAgICAgIC8qIG91dCAqLwogICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU10gICAgICAgLyogb3V0ICovCiAgICAgICkKewogIGNvbnN0IFVDSEFSICpwQ2hhbm5lbE1hcDsKICBpbnQgICBncnBJZHgsIGNoID0gMCwgbnVtQ2hhbm5lbHMgPSAwOwogIFVDSEFSIG51bUNoSW5HcnBbUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdOwoKICBGREtfQVNTRVJUKGNoYW5uZWxUeXBlICE9IE5VTEwpOwogIEZES19BU1NFUlQoY2hhbm5lbEluZGljZXMgIT0gTlVMTCk7CiAgRkRLX0FTU0VSVChjaGFubmVsTWFwcGluZyAhPSBOVUxMKTsKICBGREtfQVNTRVJUKG9mZnNldFRhYmxlICE9IE5VTEwpOwoKICAvKiBJbml0IG91dHB1dCBhcnJheXMgKi8KICBGREttZW1jbGVhcihjaGFubmVsVHlwZSwgICAgUENNX0RNWF9NQVhfSU9fQ0hBTk5FTFMqc2l6ZW9mKEFVRElPX0NIQU5ORUxfVFlQRSkpOwogIEZES21lbWNsZWFyKGNoYW5uZWxJbmRpY2VzLCBQQ01fRE1YX01BWF9JT19DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKICBGREttZW1zZXQob2Zmc2V0VGFibGUsIDI1NSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKFVDSEFSKSk7CgogIC8qIEV4dHJhY3QgdGhlIG51bWJlciBvZiBjaGFubmVscyBwZXIgZ3JvdXAgKi8KICBudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSA9ICBjaE1vZGUgICAgICAgICYgMHhGOwojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxfR1JPVVBTID4gMSkKICBudW1DaEluR3JwW0NIX0dST1VQX1NJREVdICA9IChjaE1vZGUgPj4gIDQpICYgMHhGOwogIG51bUNoSW5HcnBbQ0hfR1JPVVBfUkVBUl0gID0gKGNoTW9kZSA+PiAgOCkgJiAweEY7CiAgbnVtQ2hJbkdycFtDSF9HUk9VUF9MRkVdICAgPSAoY2hNb2RlID4+IDEyKSAmIDB4RjsKI2VuZGlmCgogIC8qIFN1bW1lcml6ZSB0byBnZXQgdGhlIHRvdGFsIG51bWJlciBvZiBjaGFubmVscyAqLwogIGZvciAoZ3JwSWR4ID0gMDsgZ3JwSWR4IDwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFM7IGdycElkeCArPSAxKSB7CiAgICBudW1DaGFubmVscyArPSBudW1DaEluR3JwW2dycElkeF07CiAgfQoKICAvKiBHZXQgdGhlIGFwcHJvcHJpYXRlIGNoYW5uZWwgbWFwICovCiAgc3dpdGNoIChjaE1vZGUpIHsKICBjYXNlIENIX01PREVfMV8wXzBfMDoKICBjYXNlIENIX01PREVfMl8wXzBfMDoKICBjYXNlIENIX01PREVfM18wXzBfMDoKICBjYXNlIENIX01PREVfM18wXzFfMDoKICBjYXNlIENIX01PREVfM18wXzJfMDoKICBjYXNlIENIX01PREVfM18wXzJfMToKICAgIHBDaGFubmVsTWFwID0gY2hhbm5lbE1hcHBpbmdbbnVtQ2hhbm5lbHNdOwogICAgYnJlYWs7CiAgY2FzZSBDSF9NT0RFXzNfMF8zXzE6CiAgICBwQ2hhbm5lbE1hcCA9IGNoYW5uZWxNYXBwaW5nWzExXTsKICAgIGJyZWFrOwogIGNhc2UgQ0hfTU9ERV8zXzBfNF8xOgogICAgcENoYW5uZWxNYXAgPSBjaGFubmVsTWFwcGluZ1sxMl07CiAgICBicmVhazsKICBjYXNlIENIX01PREVfNV8wXzJfMToKICAgIHBDaGFubmVsTWFwID0gY2hhbm5lbE1hcHBpbmdbN107CiAgICBicmVhazsKICBkZWZhdWx0OgogICAgLyogZmFsbGJhY2sgKi8KICAgIHBDaGFubmVsTWFwID0gY2hhbm5lbE1hcHBpbmdbMF07CiAgICBicmVhazsKICB9CgogIC8qIENvbXBvc2UgY2hhbm5lbCBvZmZzZXQgdGFibGUgKi8KCiAgLyogTm9uLXN5bW1ldHJpYyBjaGFubmVscyAqLwogIGlmIChudW1DaEluR3JwW0NIX0dST1VQX0ZST05UXSAmIDB4MSkgewogICAgLyogT2RkIG51bWJlciBvZiBmcm9udCBjaGFubmVscyAtPiB3ZSBoYXZlIGEgY2VudGVyIGNoYW5uZWwuCiAgICAgICBJbiBNUEVHLTQgdGhlIGNlbnRlciBoYXMgdGhlIGluZGV4IDAuICovCiAgICBpbnQgbWFwcGVkSWR4ID0gcENoYW5uZWxNYXBbY2hdOwogICAgb2Zmc2V0VGFibGVbQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gbWFwcGVkSWR4OwogICAgY2hhbm5lbFR5cGVbbWFwcGVkSWR4XSAgICA9IEFDVF9GUk9OVDsKICAgIGNoYW5uZWxJbmRpY2VzW21hcHBlZElkeF0gPSAwOwogICAgY2ggKz0gMTsKICB9CgogIGZvciAoZ3JwSWR4ID0gMDsgZ3JwSWR4IDwgUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFM7IGdycElkeCArPSAxKSB7CiAgICBBVURJT19DSEFOTkVMX1RZUEUgdHlwZSA9IEFDVF9OT05FOwogICAgaW50IGNoTWFwUG9zID0gMCwgbWF4Q2hhbm5lbHMgPSAwOwogICAgaW50IGNoSWR4ID0gMDsgIC8qIEluZGV4IG9mIGNoYW5uZWwgd2l0aGluIHRoZSBzcGVjaWZpYyBncm91cCAqLwoKICAgIHN3aXRjaCAoZ3JwSWR4KSB7CiAgICBjYXNlIENIX0dST1VQX0ZST05UOgogICAgICB0eXBlID0gQUNUX0ZST05UOwogICAgICBjaE1hcFBvcyA9IExFRlRfRlJPTlRfQ0hBTk5FTDsKICAgICAgbWF4Q2hhbm5lbHMgPSAzOwogICAgICBjaElkeCA9IG51bUNoSW5HcnBbZ3JwSWR4XSAmIDB4MTsKICAgICAgYnJlYWs7CiNpZiAoUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFMgPiAxKQogICAgY2FzZSBDSF9HUk9VUF9TSURFOgogICAgICAvKiBBbHdheXMgbWFwIHNpZGUgY2hhbm5lbHMgdG8gdGhlIG11bHRpcHVycG9zZSBncm91cC4gKi8KICAgICAgdHlwZSA9IEFDVF9TSURFOwogICAgICBjaE1hcFBvcyA9IExFRlRfTVVMVElQUlBTX0NIQU5ORUw7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9HUk9VUF9SRUFSOgogICAgICB0eXBlID0gQUNUX0JBQ0s7CiAgICAgIGNoTWFwUG9zID0gTEVGVF9SRUFSX0NIQU5ORUw7CiAgICAgIG1heENoYW5uZWxzID0gMjsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX0dST1VQX0xGRToKICAgICAgdHlwZSA9IEFDVF9MRkU7CiAgICAgIGNoTWFwUG9zID0gTE9XX0ZSRVFVRU5DWV9DSEFOTkVMOwogICAgICBtYXhDaGFubmVscyA9IDE7CiAgICAgIGJyZWFrOwojZW5kaWYKICAgIGRlZmF1bHQ6CiAgICAgIGJyZWFrOwogICAgfQoKICAgIC8qIE1hcCBhbGwgY2hhbm5lbHMgaW4gdGhpcyBncm91cCAqLwogICAgZm9yICggOyBjaElkeCA8IG51bUNoSW5HcnBbZ3JwSWR4XTsgY2hJZHggKz0gMSkgewogICAgICBpbnQgbWFwcGVkSWR4ID0gcENoYW5uZWxNYXBbY2hdOwogICAgICBpZiAoY2hJZHggPT0gbWF4Q2hhbm5lbHMpIHsKICAgICAgICAvKiBObyBzcGFjZSBsZWZ0IGluIHRoaXMgY2hhbm5lbCBncm91cCEKICAgICAgICAgICBVc2UgdGhlIG11bHRpcHVycG9zZSBncm91cCBpbnN0ZWFkOiAqLwogICAgICAgIGNoTWFwUG9zID0gTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTDsKICAgICAgfQogICAgICBvZmZzZXRUYWJsZVtjaE1hcFBvc10gICAgID0gbWFwcGVkSWR4OwogICAgICBjaGFubmVsVHlwZVttYXBwZWRJZHhdICAgID0gdHlwZTsKICAgICAgY2hhbm5lbEluZGljZXNbbWFwcGVkSWR4XSA9IGNoSWR4OwogICAgICBjaE1hcFBvcyArPSAxOwogICAgICBjaCArPSAxOwogICAgfQogIH0KfQoKLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBpbml0aWFsaXplcwogKiAgb25lIHJvdyBpbiBhIGdpdmVuIGRvd25taXggbWF0cml4IChjb3JyZXNwb25kaW5nIHRvIG9uZSBvdXRwdXQgY2hhbm5lbCkuCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHRvIHNjYWxlIGZhY3RvciBtYXRyaXggYXNzb2NpYXRlZCB0byB0aGUgZG93bm1peCBmYWN0b3JzLgogKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBjaGFubmVsIChyb3cpIHRvIGJlIGluaXRpYWxpemVkLgogKiBAcmV0dXJucyAgICAgICBOb3RoaW5nIHRvIHJldHVybi4KICoqLwpzdGF0aWMKdm9pZCBkbXhJbml0Q2hhbm5lbCgKICAgICAgICBGSVhQX0RNWCAgICAgICAgICAgIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1peFNjYWxlc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgb3V0Q2gKICAgICAgICkKewogIHVuc2lnbmVkIGludCBpbkNoOwogIGZvciAoaW5DaD0wOyBpbkNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGluQ2grPTEpIHsKICAgIGlmIChpbkNoID09IG91dENoKSB7CiAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID0gRkwyRlhDT05TVF9ETVgoMC41Zik7CiAgICAgIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gID0gMTsKICAgIH0gZWxzZSB7CiAgICAgIG1peEZhY3RvcnNbb3V0Q2hdW2luQ2hdID0gRkwyRlhDT05TVF9ETVgoMC4wZik7CiAgICAgIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gID0gMDsKICAgIH0KICB9Cn0KCi8qKiBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgZG93bm1peCBtYXRyaXggbWFuaXB1bGF0aW9uIHRoYXQgZG9lcyBhIHJlc2V0CiAqICBvZiBvbmUgcm93IGluIGEgZ2l2ZW4gZG93bm1peCBtYXRyaXggKGNvcnJlc3BvbmRpbmcgdG8gb25lIG91dHB1dCBjaGFubmVsKS4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gc2NhbGUgZmFjdG9yIG1hdHJpeCBhc3NvY2lhdGVkIHRvIHRoZSBkb3dubWl4IGZhY3RvcnMuCiAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIGNoYW5uZWwgKHJvdykgdG8gYmUgY2xlYXJlZC9yZXNldC4KICogQHJldHVybnMgICAgICAgTm90aGluZyB0byByZXR1cm4uCiAqKi8Kc3RhdGljCnZvaWQgZG14Q2xlYXJDaGFubmVsKAogICAgICAgIEZJWFBfRE1YICAgICAgICAgICAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAogICAgICAgIElOVCAgICAgICAgICAgICAgICAgbWl4U2NhbGVzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXVtQQ01fRE1YX01BWF9DSEFOTkVMU10sCiAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBvdXRDaAogICAgICAgKQp7CiAgRkRLbWVtY2xlYXIoJm1peEZhY3RvcnNbb3V0Q2hdLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoRklYUF9ETVgpKTsKICBGREttZW1jbGVhcigmbWl4U2NhbGVzW291dENoXSwgIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihJTlQpKTsKfQoKLyoqIFByaXZhdGUgaGVscGVyIGZ1bmN0aW9uIGZvciBkb3dubWl4IG1hdHJpeCBtYW5pcHVsYXRpb24gdGhhdCBhcHBsaWVzIGEgc291cmNlIGNoYW5uZWwgKHJvdykKICogIHNjYWxlZCBieSBhIGdpdmVuIG1peCBmYWN0b3IgdG8gYSBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpIGluIGEgZ2l2ZW4gZG93bm1peCBtYXRyaXguCiAqICBFeGlzdGluZyBtaXggZmFjdG9ycyBvZiB0aGUgZGVzdGluYXRpb24gY2hhbm5lbCAocm93KSB3aWxsIGdldCBvdmVyd3JpdHRlbi4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gc2NhbGUgZmFjdG9yIG1hdHJpeCBhc3NvY2lhdGVkIHRvIHRoZSBkb3dubWl4IGZhY3RvcnMuCiAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIHNvdXJjZSBjaGFubmVsIChyb3cpLgogKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpLgogKiBAcGFyYW0gW2luXSAgICBGaXhlZC1wb2ludCBwYXJ0IG9mIG1peCBmYWN0b3IgdG8gYmUgYXBwbGllZC4KICogQHBhcmFtIFtpbl0gICAgU2NhbGUgZmFjdG9yIG9mIG1peCBmYWN0b3IgdG8gYmUgYXBwbGllZC4KICogQHJldHVybnMgICAgICAgTm90aGluZyB0byByZXR1cm4uCiAqKi8Kc3RhdGljCnZvaWQgZG14U2V0Q2hhbm5lbCgKICAgICAgICBGSVhQX0RNWCAgICAgICAgICAgIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1peFNjYWxlc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgZHN0Q2gsCiAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBzcmNDaCwKICAgICAgICBjb25zdCBGSVhQX0RNWCAgICAgIGZhY3RvciwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIHNjYWxlCiAgICAgICApCnsKICBpbnQgY2g7CiAgZm9yIChjaD0wOyBjaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaCs9MSkgewogICAgaWYgKG1peEZhY3RvcnNbc3JjQ2hdW2NoXSAhPSAoRklYUF9ETVgpMCkgewogICAgICBtaXhGYWN0b3JzW2RzdENoXVtjaF0gPSBGWF9EQkwyRlhfRE1YKGZNdWx0KG1peEZhY3RvcnNbc3JjQ2hdW2NoXSwgZmFjdG9yKSk7CiAgICAgIG1peFNjYWxlc1tkc3RDaF1bY2hdICA9IG1peFNjYWxlc1tzcmNDaF1bY2hdICsgc2NhbGU7CiAgICB9CiAgfQp9CgovKiogUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIGRvd25taXggbWF0cml4IG1hbmlwdWxhdGlvbiB0aGF0IGFkZHMgYSBzb3VyY2UgY2hhbm5lbCAocm93KQogKiAgc2NhbGVkIGJ5IGEgZ2l2ZW4gbWl4IGZhY3RvciB0byBhIGRlc3RpbmF0aW9uIGNoYW5uZWwgKHJvdykgaW4gYSBnaXZlbiBkb3dubWl4IG1hdHJpeC4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBmaXhlZC1wb2ludCBwYXJ0cyBvZiB0aGUgZG93bm1peCBtYXRyaXguCiAqIEBwYXJhbSBbaW5vdXRdIFBvaW50ZXIgdG8gc2NhbGUgZmFjdG9yIG1hdHJpeCBhc3NvY2lhdGVkIHRvIHRoZSBkb3dubWl4IGZhY3RvcnMuCiAqIEBwYXJhbSBbaW5dICAgIEluZGV4IG9mIHNvdXJjZSBjaGFubmVsIChyb3cpLgogKiBAcGFyYW0gW2luXSAgICBJbmRleCBvZiBkZXN0aW5hdGlvbiBjaGFubmVsIChyb3cpLgogKiBAcGFyYW0gW2luXSAgICBGaXhlZC1wb2ludCBwYXJ0IG9mIG1peCBmYWN0b3IgdG8gYmUgYXBwbGllZC4KICogQHBhcmFtIFtpbl0gICAgU2NhbGUgZmFjdG9yIG9mIG1peCBmYWN0b3IgdG8gYmUgYXBwbGllZC4KICogQHJldHVybnMgICAgICAgTm90aGluZyB0byByZXR1cm4uCiAqKi8Kc3RhdGljCnZvaWQgZG14QWRkQ2hhbm5lbCgKICAgICAgICBGSVhQX0RNWCAgICAgICAgICAgIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgIG1peFNjYWxlc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdLAogICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCAgZHN0Q2gsCiAgICAgICAgY29uc3QgdW5zaWduZWQgaW50ICBzcmNDaCwKICAgICAgICBjb25zdCBGSVhQX0RNWCAgICAgIGZhY3RvciwKICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIHNjYWxlCiAgICAgICApCnsKICBpbnQgY2g7CiAgZm9yIChjaD0wOyBjaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaCs9MSkgewogICAgRklYUF9EQkwgYWRkRmFjdCA9IGZNdWx0KG1peEZhY3RvcnNbc3JjQ2hdW2NoXSwgZmFjdG9yKTsKICAgIGlmIChhZGRGYWN0ICE9IChGSVhQX0RNWCkwKSB7CiAgICAgIElOVCBuZXdTY2FsZSA9IG1peFNjYWxlc1tzcmNDaF1bY2hdICsgc2NhbGU7CiAgICAgIGlmIChtaXhGYWN0b3JzW2RzdENoXVtjaF0gIT0gKEZJWFBfRE1YKTApIHsKICAgICAgICBpZiAobmV3U2NhbGUgPiBtaXhTY2FsZXNbZHN0Q2hdW2NoXSkgewogICAgICAgICAgbWl4RmFjdG9yc1tkc3RDaF1bY2hdID4+PSBuZXdTY2FsZSAtIG1peFNjYWxlc1tkc3RDaF1bY2hdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBhZGRGYWN0ID4+PSBtaXhTY2FsZXNbZHN0Q2hdW2NoXSAtIG5ld1NjYWxlOwogICAgICAgICAgbmV3U2NhbGUgID0gbWl4U2NhbGVzW2RzdENoXVtjaF07CiAgICAgICAgfQogICAgICB9CiAgICAgIG1peEZhY3RvcnNbZHN0Q2hdW2NoXSArPSBGWF9EQkwyRlhfRE1YKGFkZEZhY3QpOwogICAgICBtaXhTY2FsZXNbZHN0Q2hdW2NoXSAgID0gbmV3U2NhbGU7CiAgICB9CiAgfQp9CgoKLyoqIFByaXZhdGUgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGEgZG93bm1peCBmYWN0b3IgbWF0cml4IGRlcGVuZGluZyBvbiB0aGUgaW5wdXQgYW5kIG91dHB1dAogKiAgY29uZmlndXJhdGlvbiwgdGhlIHVzZXIgcGFyYW1ldGVycyBhcyB3ZWxsIGFzIHRoZSBnaXZlbiBtZXRhZGF0YS4gVGhpcyBmdW5jdGlvbiBpcyB0aGUgbW9kdWxlcwogKiAgYnJhaW4gYW5kIGhvbGQgYWxsIGRvd25taXggYWxnb3JpdGhtcy4KICogQHBhcmFtIFtpbl0gIEZsYWcgdGhhdCBpbmRpY2F0ZXMgaWYgaW5DaE1vZGUgaG9sZHMgYSByZWFsIChwYWNrZWQpIGNoYW5uZWwgbW9kZSBvciBoYXMgYmVlbgogICAgICAgICAgICAgICAgY29udmVydGVkIHRvIGEgTVBFRy00IGNoYW5uZWwgY29uZmlndXJhdGlvbiBpbmRleC4KICogQHBhcmFtIFtpbl0gIERlcGVuZGVudCBvbiB0aGUgaW5Nb2RlSXNDZmcgZmxhZyB0aGlzIGZpZWxkIGhhbmRzIGluIGEgKHBhY2tlZCkgY2hhbm5lbCBtb2RlIG9yCiAgICAgICAgICAgICAgICB0aGUgY29ycmVzcG9uZGluZyBNUEVHLTQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGluZGV4Lm9mIHRoZSBpbnB1dCBjb25maWd1cmF0aW9uLgogKiBAcGFyYW0gW2luXSAgVGhlIChwYWNrZWQpIGNoYW5uZWwgbW9kZSBvZiB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24uCiAqIEBwYXJhbSBbaW5dICBQb2ludGVyIHRvIHN0cnVjdHVyZSBob2xkaW5nIGFsbCBjdXJyZW50IHVzZXIgcGFyYW1ldGVyLgogKiBAcGFyYW0gW2luXSAgUG9pbnRlciB0byBmaWVsZCBob2xkaW5nIGFsbCBjdXJyZW50IG1ldGEgZGF0YS4KICogQHBhcmFtIFtvdXRdIFBvaW50ZXIgdG8gZml4ZWQtcG9pbnQgcGFydHMgb2YgdGhlIGRvd25taXggbWF0cml4LiBOb3JtYWxpemVkIHRvIG9uZSBzY2FsZSBmYWN0b3IuCiAqIEBwYXJhbSBbb3V0XSBUaGUgY29tbW9uIHNjYWxlIGZhY3RvciBvZiB0aGUgZG93bm1peCBtYXRyaXguCiAqIEByZXR1cm5zICAgICBBbiBlcnJvciBjb2RlLgogKiovCnN0YXRpYwpQQ01ETVhfRVJST1IgZ2V0TWl4RmFjdG9ycyAoCiAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgICAgIGluTW9kZUlzQ2ZnLAogICAgICAgIFBDTV9ETVhfQ0hBTk5FTF9NT0RFICAgICAgICBpbkNoTW9kZSwKICAgICAgICBjb25zdCBQQ01fRE1YX0NIQU5ORUxfTU9ERSAgb3V0Q2hNb2RlLAogICAgICAgIGNvbnN0IFBDTV9ETVhfVVNFUl9QQVJBTVMgICpwUGFyYW1zLAogICAgICAgIGNvbnN0IERNWF9CU19NRVRBX0RBVEEgICAgICpwTWV0YURhdGEsCiAgICAgICAgRklYUF9ETVggICAgICAgICAgICAgICAgICAgIG1peEZhY3RvcnNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICAgICAqcE91dFNjYWxlCiAgICAgICkKewogIFBDTURNWF9FUlJPUiBlcnIgPSBQQ01ETVhfT0s7CiAgSU5UICBtaXhTY2FsZXNbUENNX0RNWF9NQVhfQ0hBTk5FTFNdW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICBJTlQgIG1heFNjYWxlID0gMDsKICBpbnQgIG51bUluQ2hhbm5lbCwgbnVtT3V0Q2hhbm5lbDsKICB1bnNpZ25lZCBpbnQgIG91dENoLCBpbkNoLCBpbkNoQ2ZnID0gMDsKICB1bnNpZ25lZCBpbnQgIHZhbGlkW1BDTV9ETVhfTUFYX0NIQU5ORUxTXSA9IHsgMCB9OwoKICBGREtfQVNTRVJUKHBNZXRhRGF0YSAgIT0gTlVMTCk7CiAgRkRLX0FTU0VSVChtaXhGYWN0b3JzICE9IE5VTEwpOwogIC8qIENoZWNrIG9uIGEgc3VwcG9ydGVkIG91dHB1dCBjb25maWd1cmF0aW9uICovCiAgRkRLX0FTU0VSVCggKG91dENoTW9kZSA9PSBDSF9NT0RFXzFfMF8wXzApCiAgICAgICAgICAgfHwgKG91dENoTW9kZSA9PSBDSF9NT0RFXzJfMF8wXzApCiAgICAgICAgICAgfHwgKG91dENoTW9kZSA9PSBDSF9NT0RFXzNfMF8yXzEpICk7CgogIGlmIChpbk1vZGVJc0NmZykgewogICAgLyogV29ya2Fyb3VuZCBmb3IgdGhlIGFtYmlndWl0eSBvZiB0aGUgaW50ZXJuYWwgY2hhbm5lbCBtb2Rlcy4KICAgICAgIENvbnZlcnQgY2hhbm5lbCBjb25maWcgdG8gY2hhbm5lbCBtb2RlOiAqLwogICAgaW5DaENmZyAgPSAodW5zaWduZWQgaW50KWluQ2hNb2RlOwogICAgc3dpdGNoIChpbkNoQ2ZnKSB7CiAgICBjYXNlIDE6IGNhc2UgMjogY2FzZSAzOgojaWYgKFBDTV9ETVhfTUFYX0NIQU5ORUxTID4gMykKICAgIGNhc2UgNDogY2FzZSA1OiBjYXNlIDY6CiNlbmRpZgogICAgICBpbkNoTW9kZSA9IG91dENoTW9kZVRhYmxlW2luQ2hDZmddOwogICAgICBicmVhazsKICAgIGNhc2UgMTE6CiAgICAgIGluQ2hNb2RlID0gQ0hfTU9ERV8zXzBfM18xOwogICAgICBicmVhazsKICAgIGNhc2UgMTI6CiAgICAgIGluQ2hNb2RlID0gQ0hfTU9ERV8zXzBfNF8xOwogICAgICBicmVhazsKICAgIGNhc2UgNzogY2FzZSAxNDoKICAgICAgaW5DaE1vZGUgPSBDSF9NT0RFXzVfMF8yXzE7CiAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgRkRLX0FTU0VSVCgwKTsKICAgIH0KICB9CgogIC8qIEV4dHJhY3QgdGhlIHRvdGFsIG51bWJlciBvZiBpbnB1dCBjaGFubmVscyAqLwogIG51bUluQ2hhbm5lbCAgPSAgKGluQ2hNb2RlJjB4RikKICAgICAgICAgICAgICAgICsgKChpbkNoTW9kZT4+IDQpJjB4RikKICAgICAgICAgICAgICAgICsgKChpbkNoTW9kZT4+IDgpJjB4RikKICAgICAgICAgICAgICAgICsgKChpbkNoTW9kZT4+MTIpJjB4Rik7CiAgLyogRXh0cmFjdCB0aGUgdG90YWwgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLwogIG51bU91dENoYW5uZWwgPSAgKG91dENoTW9kZSYweEYpCiAgICAgICAgICAgICAgICArICgob3V0Q2hNb2RlPj4gNCkmMHhGKQogICAgICAgICAgICAgICAgKyAoKG91dENoTW9kZT4+IDgpJjB4RikKICAgICAgICAgICAgICAgICsgKChvdXRDaE1vZGU+PjEyKSYweEYpOwoKICAvKiBNUEVHIGFtbWVuZG1lbnQgNCBha2EgRVRTSSBtZXRhZGF0YSBhbmQgZmFsbGJhY2sgbW9kZTogKi8KCgogIC8qIENyZWF0ZSBpZGVudGl0eSBETVggbWF0cml4OiAqLwogIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKICAgIGRteEluaXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIG91dENoICk7CiAgfQogIGlmICgoKGluQ2hNb2RlPj4xMikmMHhGKSA9PSAwKSB7CiAgICAvKiBDbGVhciBlbXB0eSBvciB3cm9uZ2x5IG1hcHBlZCBpbnB1dCBjaGFubmVsICovCiAgICBkbXhDbGVhckNoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMICk7CiAgfQoKICAvKiBGSVJTVCBTVEFHRTogKi8KICBpZiAobnVtSW5DaGFubmVsID4gU0lYX0NIQU5ORUwpCiAgeyAvKiBBbHdheXMgdXNlIE1QRUcgZXF1YXRpb25zIGVpdGhlciB3aXRoIG1ldGEgZGF0YSBvciB3aXRoIGRlZmF1bHQgdmFsdWVzLiAqLwogICAgRklYUF9ETVggIGRNaXhGYWN0QSwgZE1peEZhY3RCOwogICAgSU5UICAgICAgIGRNaXhTY2FsZUEsIGRNaXhTY2FsZUI7CiAgICBpbnQgICAgICAgaXNWYWxpZENmZyA9IFRSVUU7CgogICAgLyogR2V0IGZhY3RvcnMgZnJvbSBtZXRhIGRhdGEgKi8KICAgIGRNaXhGYWN0QSAgPSBhYk1peEx2bFZhbHVlVGFiW3BNZXRhRGF0YS0+ZG1peElkeEFdOwogICAgZE1peFNjYWxlQSA9IChwTWV0YURhdGEtPmRtaXhJZHhBPT0wKSA/IDEgOiAwOwogICAgZE1peEZhY3RCICA9IGFiTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5kbWl4SWR4Ql07CiAgICBkTWl4U2NhbGVCID0gKHBNZXRhRGF0YS0+ZG1peElkeEI9PTApID8gMSA6IDA7CgogICAgLyogQ2hlY2sgaWYgaW5wdXQgaXMgaW4gdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGNvbmZpZ3VyYXRpb25zICovCiAgICBzd2l0Y2ggKGluQ2hNb2RlKSB7CiAgICBjYXNlIENIX01PREVfM18wXzNfMTogICAvKiBjaENmZyAxMSAqLwogICAgICAvKiA2LjFjaDogIEMnID0gQzsgIEwnID0gTDsgIFInID0gUjsgIExGRScgPSBMRkU7CiAgICAgICAgICAgICAgICAgTHMnID0gTHMqZG1peF9hX2lkeCArIENzKmRtaXhfYl9pZHg7CiAgICAgICAgICAgICAgICAgUnMnID0gUnMqZG1peF9hX2lkeCArIENzKmRtaXhfYl9pZHg7ICovCiAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCApOyAgLyogY2xlYXIgZW1wdHkgaW5wdXQgY2hhbm5lbCAqLwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9SRUFSX0NIQU5ORUwsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9NT0RFXzNfMl8xXzA6CiAgICBjYXNlIENIX01PREVfM18yXzFfMTogICAvKiBjaENmZyAxMSBidXQgd2l0aCBzaWRlIGNoYW5uZWxzICovCiAgICAgIC8qIDYuMWNoOiAgQycgPSBDOyAgTCcgPSBMOyAgUicgPSBSOyAgTEZFJyA9IExGRTsKICAgICAgICAgICAgICAgICBMcycgPSBMcypkbWl4X2FfaWR4ICsgQ3MqZG1peF9iX2lkeDsKICAgICAgICAgICAgICAgICBScycgPSBScypkbWl4X2FfaWR4ICsgQ3MqZG1peF9iX2lkeDsgKi8KICAgICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCApOyAgLyogY2xlYXIgZW1wdHkgaW5wdXQgY2hhbm5lbCAqLwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsICAgICAgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsICAgICAgIGRNaXhGYWN0QiwgZE1peFNjYWxlQiApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTCwgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICBpc1ZhbGlkQ2ZnID0gRkFMU0U7CiAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9NT0RFXzVfMl8xXzA6CiAgICBjYXNlIENIX01PREVfNV8wXzFfMDoKICAgIGNhc2UgQ0hfTU9ERV81XzBfMV8xOgogICAgICAvKiAgICAgICAgIExzJyA9IENzKmRtaXhfYV9pZHg7CiAgICAgICAgICAgICAgICAgUnMnID0gQ3MqZG1peF9hX2lkeDsgKi8KICAgICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCApOyAgLyogY2xlYXIgZW1wdHkgaW5wdXQgY2hhbm5lbCAqLwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfUkVBUl9DSEFOTkVMLCAgTEVGVF9SRUFSX0NIQU5ORUwsIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICBpc1ZhbGlkQ2ZnID0gRkFMU0U7CiAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9NT0RFXzNfMF80XzE6ICAgLyogY2hDZmcgMTIgKi8KICAgICAgLyogNy4xY2ggU3Vycm91bmQgQmFjazogIEMnID0gQzsgIEwnID0gTDsgIFInID0gUjsgIExGRScgPSBMRkU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMcycgPSBMcypkbWl4X2FfaWR4ICsgTHNyKmRtaXhfYl9pZHg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBScycgPSBScypkbWl4X2FfaWR4ICsgUnNyKmRtaXhfYl9pZHg7ICovCiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9NT0RFXzVfMF8yXzE6ICAgLyogY2hDZmcgNyB8fCAxNCAqLwogICAgICBpZiAoaW5DaENmZyA9PSAxNCkgewogICAgICAgIC8qIDcuMWNoIEZyb250IEhlaWdodDogIEMnID0gQzsgIExzJyA9IExzOyAgUnMnID0gUnM7ICBMRkUnID0gTEZFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEwnID0gTCpkbWl4X2FfaWR4ICsgTHYqZG1peF9iX2lkeDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IFIqZG1peF9hX2lkeCArIFJ2KmRtaXhfYl9pZHg7ICovCiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX0ZST05UX0NIQU5ORUwsICAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTCwgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgLyogNy4xY2ggRnJvbnQ6ICBMcycgPSBMczsgIFJzJyA9IFJzOyAgTEZFJyA9IExGRTsKICAgICAgICAgICAgICAgICAgICAgICAgIEMnID0gQyArIChMYytSYykqZG1peF9hX2lkeDsKICAgICAgICAgICAgICAgICAgICAgICAgIEwnID0gTCArIExjKmRtaXhfYl9pZHg7CiAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IFIgKyBSYypkbWl4X2JfaWR4OwogICAgICAgICAgICAgICAgICAgICAgICAgQ0FVVElPTjogTCtSIGFyZSBub3QgYXQgKE1QRUcpIGluZGV4IDErMi4gKi8KICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBMRUZUX0ZST05UX0NIQU5ORUwsICAgICAgZE1peEZhY3RBLCBkTWl4U2NhbGVBICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICAgIGRNaXhGYWN0QSwgZE1peFNjYWxlQSApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgIExFRlRfRlJPTlRfQ0hBTk5FTCwgICAgICBkTWl4RmFjdEIsIGRNaXhTY2FsZUIgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgICBMRUZUX01VTFRJUFJQU19DSEFOTkVMLCAgRkwyRlhDT05TVF9ETVgoMC41ZiksIDEgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgICAgZE1peEZhY3RCLCBkTWl4U2NhbGVCICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfTVVMVElQUlBTX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAxICk7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAvKiBOb3RoaW5nIHRvIGRvLiBKdXN0IHVzZSB0aGUgaWRlbnRpdHkgbWF0cml4LiAqLwogICAgICBpc1ZhbGlkQ2ZnID0gRkFMU0U7CiAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7CiAgICAgIGJyZWFrOwogICAgfQoKICAgIC8qIEFkZCBhZGRpdGlvbmFsIERNWCBnYWluICovCiAgICBpZiAoIChpc1ZhbGlkQ2ZnID09IFRSVUUpCiAgICAgICYmIChwTWV0YURhdGEtPmRteEdhaW5JZHg1ICE9IDApKQogICAgeyAvKiBBcHBseSBETVggZ2FpbiA1ICovCiAgICAgIEZJWFBfRE1YIGRteEdhaW47CiAgICAgIElOVCAgICAgIGRteFNjYWxlOwogICAgICBJTlQgICAgICBzaWduID0gKHBNZXRhRGF0YS0+ZG14R2FpbklkeDUgJiAweDQwKSA/IC0xIDogMTsKICAgICAgSU5UICAgICAgdmFsICA9IHBNZXRhRGF0YS0+ZG14R2FpbklkeDUgJiAweDNGOwoKICAgICAgLyogMTBeKGRteF9nYWluXzUvODApICovCiAgICAgIGRteEdhaW4gPSBGWF9EQkwyRlhfRE1YKCBmTGRQb3coCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuODMwNDgyMDIzNzIxODQxZiksIDIsICAvKiBsb2cyKDEwKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRklYUF9EQkwpKHNpZ24qdmFsKihMT05HKUZMMkZYQ09OU1RfREJMKDAuMDEyNWYpKSwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZG14U2NhbGUgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgLyogQ3VycmVudGx5IG9ubHkgcG9zaXRpdmUgc2NhbGUgZmFjdG9ycyBzdXBwb3J0ZWQhICovCiAgICAgIGlmIChkbXhTY2FsZSA8IDApIHsKICAgICAgICBkbXhHYWluID4+PSAtZG14U2NhbGU7CiAgICAgICAgZG14U2NhbGUgID0gIDA7CiAgICAgIH0KCiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgQ0VOVEVSX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGRteEdhaW4sIGRteFNjYWxlICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgICBMRUZUX0ZST05UX0NIQU5ORUwsICAgIGRteEdhaW4sIGRteFNjYWxlICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgICBSSUdIVF9GUk9OVF9DSEFOTkVMLCAgIGRteEdhaW4sIGRteFNjYWxlICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9SRUFSX0NIQU5ORUwsICAgICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgIGRteEdhaW4sIGRteFNjYWxlICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfUkVBUl9DSEFOTkVMLCAgICBSSUdIVF9SRUFSX0NIQU5ORUwsICAgIGRteEdhaW4sIGRteFNjYWxlICk7CiAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTE9XX0ZSRVFVRU5DWV9DSEFOTkVMLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGRteEdhaW4sIGRteFNjYWxlICk7CiAgICB9CgogICAgLyogTWFyayB0aGUgb3V0cHV0IGNoYW5uZWxzICovCiAgICB2YWxpZFtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gID0gMTsKICAgIHZhbGlkW0xFRlRfRlJPTlRfQ0hBTk5FTF0gICAgPSAxOwogICAgdmFsaWRbUklHSFRfRlJPTlRfQ0hBTk5FTF0gICA9IDE7CiAgICB2YWxpZFtMRUZUX1JFQVJfQ0hBTk5FTF0gICAgID0gMTsKICAgIHZhbGlkW1JJR0hUX1JFQVJfQ0hBTk5FTF0gICAgPSAxOwogICAgdmFsaWRbTE9XX0ZSRVFVRU5DWV9DSEFOTkVMXSA9IDE7CgogICAgLyogVXBkYXRlIGNoYW5uZWwgbW9kZSBmb3IgdGhlIG5leHQgc3RhZ2UgKi8KICAgIGluQ2hNb2RlID0gQ0hfTU9ERV8zXzBfMl8xOwogIH0KCiAgLyogU0VDT05EIFNUQUdFOiAqLwogIGlmIChudW1PdXRDaGFubmVsIDw9IFRXT19DSEFOTkVMKSB7CiAgICAvKiBDcmVhdGUgRE1YIG1hdHJpeCBhY2NvcmRpbmcgdG8gaW5wdXQgY29uZmlndXJhdGlvbiAqLwogICAgc3dpdGNoIChpbkNoTW9kZSkgewogICAgY2FzZSBDSF9NT0RFXzJfMF8wXzA6ICAgLyogY2hDZmcgMiAqLwogICAgICAvKiBBcHBseSB0aGUgZHVhbCBjaGFubmVsIG1vZGUuICovCiAgICAgIHN3aXRjaCAocFBhcmFtcy0+ZHVhbENoYW5uZWxNb2RlKSB7CiAgICAgIGNhc2UgQ0gxX01PREU6ICAvKiBMJyA9IDAuNzA3ICogQ2gxOwogICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAwLjcwNyAqIENoMTsgKi8KICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfRlJPTlRfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDSDJfTU9ERTogIC8qIEwnID0gMC43MDcgKiBDaDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IDAuNzA3ICogQ2gyOyAqLwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgUklHSFRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICAgIGJyZWFrOwogICAgICBjYXNlIE1JWEVEX01PREU6ICAvKiBMJyA9IDAuNSpDaDEgKyAwLjUqQ2gyOwogICAgICAgICAgICAgICAgICAgICAgICAgICBSJyA9IDAuNSpDaDEgKyAwLjUqQ2gyOyAqLwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgRkwyRlhDT05TVF9ETVgoMC41ZiksIDAgKTsKICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIFJJR0hUX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNWYpLCAwICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX0ZST05UX0NIQU5ORUwsICBGTDJGWENPTlNUX0RNWCgwLjVmKSwgMCApOwogICAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC41ZiksIDAgKTsKICAgICAgICBicmVhazsKICAgICAgZGVmYXVsdDoKICAgICAgY2FzZSBTVEVSRU9fTU9ERToKICAgICAgICAvKiBOb3RoaW5nIHRvIGRvICovCiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgICAgYnJlYWs7CiAgICBjYXNlIENIX01PREVfMl8wXzFfMDoKICAgICAgLyogTCcgPSBMICsgMC43MDcqUzsKICAgICAgICAgUicgPSBSICsgMC43MDcqUzsgKi8KICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsICAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICBicmVhazsKICAgIGNhc2UgQ0hfTU9ERV8zXzBfMF8wOiAgIC8qIGNoQ2ZnIDMgKi8KICAgICAgLyogTCcgPSBMICsgMC43MDcqQzsKICAgICAgICAgUicgPSBSICsgMC43MDcqQzsgKi8KICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgIGJyZWFrOwogICAgY2FzZSBDSF9NT0RFXzNfMF8xXzA6ICAgLyogY2hDZmcgNCAqLwogICAgICAvKiBMJyA9IEwgKyAwLjcwNypDICsgMC43MDcqUzsKICAgICAgICAgUicgPSBSICsgMC43MDcqQyArIDAuNzA3KlM7ICovCiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgRkwyRlhDT05TVF9ETVgoMC43MDdmKSwgMCApOwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBGTDJGWENPTlNUX0RNWCgwLjcwN2YpLCAwICk7CiAgICAgIGRteEFkZENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsICAgIEZMMkZYQ09OU1RfRE1YKDAuNzA3ZiksIDAgKTsKICAgICAgYnJlYWs7CiAgICBjYXNlIENIX01PREVfM18wXzJfMDogICAvKiBjaENmZyA1ICovCiAgICBjYXNlIENIX01PREVfM18wXzJfMTogICAvKiBjaENmZyA2ICovCiAgICAgIC8qIE1QRUcgKyBJVFUgKyBETEIKICAgICAgICAgQnV0IGJlY2F1c2UgdGhlIGRlZmF1bHQgZG93bm1peCBlcXVhdGlvbnMgYW5kIGNvZWZmaWNpZW50cyBhcmUgZXF1YWwgd2Ugc3RpY2sgdG8gTVBFRy4gKi8KICAgICAgaWYgKCAgKHBNZXRhRGF0YS0+dHlwZUZsYWdzICYgVFlQRV9EU0VfREFUQSkKICAgICAgICB8fCAhKHBNZXRhRGF0YS0+dHlwZUZsYWdzICYgVFlQRV9QQ0VfREFUQSkgKQogICAgICB7CiAgICAgICAgRklYUF9ETVggIGNNaXhMdmwsIHNNaXhMdmwsIGxNaXhMdmw7CiAgICAgICAgSU5UICAgICAgIGNNaXhTY2FsZSwgc01peFNjYWxlLCBsTWl4U2NhbGU7CgogICAgICAgIC8qIEdldCBmYWN0b3JzIGZyb20gbWV0YSBkYXRhICovCiAgICAgICAgY01peEx2bCAgID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPmNMZXZJZHhdOwogICAgICAgIGNNaXhTY2FsZSA9IChwTWV0YURhdGEtPmNMZXZJZHg9PTApID8gMSA6IDA7CiAgICAgICAgc01peEx2bCAgID0gYWJNaXhMdmxWYWx1ZVRhYltwTWV0YURhdGEtPnNMZXZJZHhdOwogICAgICAgIHNNaXhTY2FsZSA9IChwTWV0YURhdGEtPnNMZXZJZHg9PTApID8gMSA6IDA7CiAgICAgICAgbE1peEx2bCAgID0gbGZlTWl4THZsVmFsdWVUYWJbcE1ldGFEYXRhLT5kbWl4SWR4TGZlXTsKICAgICAgICBpZiAocE1ldGFEYXRhLT5kbWl4SWR4TGZlIDw9IDEpIHsKICAgICAgICAgIGxNaXhTY2FsZSA9IDI7CiAgICAgICAgfSBlbHNlIGlmIChwTWV0YURhdGEtPmRtaXhJZHhMZmUgPD0gNSkgewogICAgICAgICAgbE1peFNjYWxlID0gMTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbE1peFNjYWxlID0gMDsKICAgICAgICB9CiAgICAgICAgLyogU2V0dXAgdGhlIERNWCBtYXRyaXggKi8KICAgICAgICBpZiAoIChwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSA9PSBGT1JDRV9QU19ETVgpCiAgICAgICAgICB8fCAoKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEFVVE9fUFNfRE1YKSAmJiAocE1ldGFEYXRhLT5wc2V1ZG9TdXJyb3VuZD09MSkpKQogICAgICAgIHsgLyogTCcgPSBMICsgQypjbGV2IC0gKExzK1JzKSpzbGV2ICsgTEZFKmxmbGV2OwogICAgICAgICAgICAgUicgPSBSICsgQypjbGV2ICsgKExzK1JzKSpzbGV2ICsgTEZFKmxmbGV2OyAqLwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGNNaXhMdmwsIGNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgLXNNaXhMdmwsIHNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9SRUFSX0NIQU5ORUwsICAgLXNNaXhMdmwsIHNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGxNaXhMdmwsIGxNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgIGNNaXhMdmwsIGNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgIHNNaXhMdmwsIHNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBSSUdIVF9SRUFSX0NIQU5ORUwsICAgIHNNaXhMdmwsIHNNaXhTY2FsZSApOwogICAgICAgICAgZG14QWRkQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBMT1dfRlJFUVVFTkNZX0NIQU5ORUwsIGxNaXhMdmwsIGxNaXhTY2FsZSApOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgeyAvKiBMJyA9IEwgKyBDKmNsZXYgKyBMcypzbGV2ICsgTEZFKmxsZXY7CiAgICAgICAgICAgICBSJyA9IFIgKyBDKmNsZXYgKyBScypzbGV2ICsgTEZFKmxsZXY7ICovCiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgY01peEx2bCwgY01peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExFRlRfUkVBUl9DSEFOTkVMLCAgICAgc01peEx2bCwgc01peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIExFRlRfRlJPTlRfQ0hBTk5FTCwgIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCAgY01peEx2bCwgY01peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIFJJR0hUX1JFQVJfQ0hBTk5FTCwgICAgc01peEx2bCwgc01peFNjYWxlICk7CiAgICAgICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIFJJR0hUX0ZST05UX0NIQU5ORUwsIExPV19GUkVRVUVOQ1lfQ0hBTk5FTCwgbE1peEx2bCwgbE1peFNjYWxlICk7CiAgICAgICAgfQoKICAgICAgICAvKiBBZGQgYWRkaXRpb25hbCBETVggZ2FpbiAqLwogICAgICAgIGlmICggcE1ldGFEYXRhLT5kbXhHYWluSWR4MiAhPSAwICkKICAgICAgICB7IC8qIEFwcGx5IERNWCBnYWluIDIgKi8KICAgICAgICAgIEZJWFBfRE1YIGRteEdhaW47CiAgICAgICAgICBJTlQgICAgICBkbXhTY2FsZTsKICAgICAgICAgIElOVCAgICAgIHNpZ24gPSAocE1ldGFEYXRhLT5kbXhHYWluSWR4MiAmIDB4NDApID8gLTEgOiAxOwogICAgICAgICAgSU5UICAgICAgdmFsICA9IHBNZXRhRGF0YS0+ZG14R2FpbklkeDIgJiAweDNGOwoKICAgICAgICAgIC8qIDEwXihkbXhfZ2Fpbl8yLzgwKSAqLwogICAgICAgICAgZG14R2FpbiA9IEZYX0RCTDJGWF9ETVgoIGZMZFBvdygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMMkZYQ09OU1RfREJMKDAuODMwNDgyMDIzNzIxODQxZiksIDIsICAvKiBsb2cyKDEwKSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEZJWFBfREJMKShzaWduKnZhbCooTE9ORylGTDJGWENPTlNUX0RCTCgwLjAxMjVmKSksIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkbXhTY2FsZSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKICAgICAgICAgIC8qIEN1cnJlbnRseSBvbmx5IHBvc2l0aXZlIHNjYWxlIGZhY3RvcnMgc3VwcG9ydGVkISAqLwogICAgICAgICAgaWYgKGRteFNjYWxlIDwgMCkgewogICAgICAgICAgICBkbXhHYWluID4+PSAtZG14U2NhbGU7CiAgICAgICAgICAgIGRteFNjYWxlICA9ICAwOwogICAgICAgICAgfQoKICAgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgTEVGVF9GUk9OVF9DSEFOTkVMLCAgTEVGVF9GUk9OVF9DSEFOTkVMLCAgZG14R2FpbiwgZG14U2NhbGUgKTsKICAgICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgZG14R2FpbiwgZG14U2NhbGUgKTsKICAgICAgICB9CiAgICAgIH0KI2lmZGVmIFBDRV9NRVRBREFUQV9FTkFCTEUKICAgICAgZWxzZSB7CiAgICAgICAgRklYUF9ETVggIGZsZXYsIGNsZXYsIHNsZXZMTCwgc2xldkxSLCBzbGV2UkwsIHNsZXZSUjsKICAgICAgICBGSVhQX0RNWCAgbXRyeE1peER3bkNvZWYgPSBtcGVnTWl4RG93bklkeDJDb2VmW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF07CgogICAgICAgIGlmICggKHBQYXJhbXMtPnBzZXVkb1N1cnJNb2RlID09IEZPUkNFX1BTX0RNWCkKICAgICAgICAgIHx8ICgocFBhcmFtcy0+cHNldWRvU3Vyck1vZGUgPT0gQVVUT19QU19ETVgpICYmIChwTWV0YURhdGEtPnBzZXVkb1N1cnJvdW5kPT0xKSkpCiAgICAgICAgeyAvKiAzLzIgaW5wdXQ6IEwnID0gKDEuNzA3KzIqQSleLTEgKiBbTCswLjcwNypDLUEqTHMtQSpSc107CiAgICAgICAgICAgICAgICAgICAgICAgIFInID0gKDEuNzA3KzIqQSleLTEgKiBbUiswLjcwNypDK0EqTHMrQSpSc107ICovCiAgICAgICAgICBmbGV2ID0gbXBlZ01peERvd25JZHgyUHJlRmFjdFsxXVtwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdOwogICAgICAgICAgc2xldlJSID0gc2xldlJMID0gRlhfREJMMkZYX0RNWChmTXVsdChmbGV2LCBtdHJ4TWl4RHduQ29lZikpOwogICAgICAgICAgc2xldkxMID0gc2xldkxSID0gLXNsZXZSTDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAvKiAzLzIgaW5wdXQ6IEwnID0gKDEuNzA3K0EpXi0xICogW0wrMC43MDcqQytBKkxzXTsKICAgICAgICAgICAgICAgICAgICAgICAgUicgPSAoMS43MDcrQSleLTEgKiBbUiswLjcwNypDK0EqUnNdOyAqLwogICAgICAgICAgZmxldiA9IG1wZWdNaXhEb3duSWR4MlByZUZhY3RbMF1bcE1ldGFEYXRhLT5tYXRyaXhNaXhkb3duSWR4XTsKICAgICAgICAgIHNsZXZSUiA9IHNsZXZMTCA9IEZYX0RCTDJGWF9ETVgoZk11bHQoZmxldiwgbXRyeE1peER3bkNvZWYpKTsKICAgICAgICAgIHNsZXZMUiA9IHNsZXZSTCA9IChGSVhQX1NHTCkwOwogICAgICAgIH0KICAgICAgICAvKiBjb21tb24gZmFjdG9yICovCiAgICAgICAgY2xldiAgPSBGWF9EQkwyRlhfRE1YKGZNdWx0KGZsZXYsIG1wZWdNaXhEb3duSWR4MkNvZWZbMF0gLyogMC43MDcgKi8pKTsKCiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX0ZST05UX0NIQU5ORUwsICAgZmxldiwgICAwICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBDRU5URVJfRlJPTlRfQ0hBTk5FTCwgY2xldiwgICAwICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBMRUZUX1JFQVJfQ0hBTk5FTCwgICAgc2xldkxMLCAwICk7CiAgICAgICAgZG14U2V0Q2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBMRUZUX0ZST05UX0NIQU5ORUwsICBSSUdIVF9SRUFSX0NIQU5ORUwsICAgc2xldkxSLCAwICk7CgogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfRlJPTlRfQ0hBTk5FTCwgIGZsZXYsICAgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgQ0VOVEVSX0ZST05UX0NIQU5ORUwsIGNsZXYsICAgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgTEVGVF9SRUFSX0NIQU5ORUwsICAgIHNsZXZSTCwgMCApOwogICAgICAgIGRteFNldENoYW5uZWwoIG1peEZhY3RvcnMsIG1peFNjYWxlcywgUklHSFRfRlJPTlRfQ0hBTk5FTCwgUklHSFRfUkVBUl9DSEFOTkVMLCAgIHNsZXZSUiwgMCApOwogICAgICB9CiNlbmRpZiAgLyogUENFX01FVEFEQVRBX0VOQUJMRSAqLwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIC8qIFRoaXMgY29uZmlndXJhdGlvbiBkb2VzIG5vdCBmaXQgdG8gYW55IGtub3duIGRvd25taXggZXF1YXRpb24hICovCiAgICAgIGVyciA9IFBDTURNWF9JTlZBTElEX01PREU7CiAgICAgIGJyZWFrOwogICAgfQogICAgLyogTWFyayB0aGUgb3V0cHV0IGNoYW5uZWxzICovCiAgICBGREttZW1jbGVhcih2YWxpZCwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKHVuc2lnbmVkIGludCkpOwogICAgdmFsaWRbTEVGVF9GUk9OVF9DSEFOTkVMXSAgPSAxOwogICAgdmFsaWRbUklHSFRfRlJPTlRfQ0hBTk5FTF0gPSAxOwogICAgLyogVXBkYXRlIGNoYW5uZWwgbW9kZSBmb3IgdGhlIG5leHQgc3RhZ2UgKi8KICAgIGluQ2hNb2RlID0gQ0hfTU9ERV8yXzBfMF8wOwogIH0KCiAgaWYgKG51bU91dENoYW5uZWwgPT0gT05FX0NIQU5ORUwpIHsKICAgIEZJWFBfRE1YIG1vbm9NaXhMZXZlbDsKICAgIElOVCAgICAgIG1vbm9NaXhTY2FsZTsKCiNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCiAgICBpZiAoICAocE1ldGFEYXRhLT50eXBlRmxhZ3MgJiBUWVBFX1BDRV9EQVRBKQogICAgICAmJiAhKHBNZXRhRGF0YS0+dHlwZUZsYWdzICYgVFlQRV9EU0VfREFUQSkgKQogICAgeyAvKiBDJyA9ICgzKzIqQSleLTEgKiBbQytMK1IrQSpMcytBK1JzXTsgKi8KICAgICAgbW9ub01peExldmVsID0gbXBlZ01peERvd25JZHgyUHJlRmFjdFsyXVtwTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHhdOwogICAgICBtb25vTWl4U2NhbGUgPSAwOwoKICAgICAgZG14Q2xlYXJDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMICk7CiAgICAgIG1peEZhY3RvcnNbQ0VOVEVSX0ZST05UX0NIQU5ORUxdW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9IG1vbm9NaXhMZXZlbDsKICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bTEVGVF9GUk9OVF9DSEFOTkVMXSAgID0gbW9ub01peExldmVsOwogICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtSSUdIVF9GUk9OVF9DSEFOTkVMXSAgPSBtb25vTWl4TGV2ZWw7CiAgICAgIG1vbm9NaXhMZXZlbCA9IEZYX0RCTDJGWF9ETVgoZk11bHQobW9ub01peExldmVsLCBtcGVnTWl4RG93bklkeDJDb2VmW3BNZXRhRGF0YS0+bWF0cml4TWl4ZG93bklkeF0pKTsKICAgICAgbWl4RmFjdG9yc1tDRU5URVJfRlJPTlRfQ0hBTk5FTF1bTEVGVF9SRUFSX0NIQU5ORUxdICAgID0gbW9ub01peExldmVsOwogICAgICBtaXhGYWN0b3JzW0NFTlRFUl9GUk9OVF9DSEFOTkVMXVtSSUdIVF9SRUFSX0NIQU5ORUxdICAgPSBtb25vTWl4TGV2ZWw7CiAgICB9CiAgICBlbHNlCiNlbmRpZgogICAgeyAvKiBDJyA9IEwgKyBSOyBbZGVmYXVsdF0gKi8KICAgICAgbW9ub01peExldmVsID0gRkwyRlhDT05TVF9ETVgoMC41Zik7CiAgICAgIG1vbm9NaXhTY2FsZSA9IDE7CiAgICAgIGRteENsZWFyQ2hhbm5lbCggbWl4RmFjdG9ycywgbWl4U2NhbGVzLCBDRU5URVJfRlJPTlRfQ0hBTk5FTCApOyAgLyogQyBpcyBub3QgaW4gdGhlIG1peCAqLwogICAgICBkbXhTZXRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBMRUZUX0ZST05UX0NIQU5ORUwsICBtb25vTWl4TGV2ZWwsIG1vbm9NaXhTY2FsZSApOwogICAgICBkbXhBZGRDaGFubmVsKCBtaXhGYWN0b3JzLCBtaXhTY2FsZXMsIENFTlRFUl9GUk9OVF9DSEFOTkVMLCBSSUdIVF9GUk9OVF9DSEFOTkVMLCBtb25vTWl4TGV2ZWwsIG1vbm9NaXhTY2FsZSApOwogICAgfQoKICAgIC8qIE1hcmsgdGhlIG91dHB1dCBjaGFubmVsICovCiAgICBGREttZW1jbGVhcih2YWxpZCwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKHVuc2lnbmVkIGludCkpOwogICAgdmFsaWRbQ0VOVEVSX0ZST05UX0NIQU5ORUxdID0gMTsKICB9CgojZGVmaW5lIE1BWF9TRUFSQ0hfU1RBUlRfVkFMICAoIC03ICkKCiAgewogICAgTE9ORyBjaFN1bVtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICBJTlQgIGNoU3VtTWF4ID0gTUFYX1NFQVJDSF9TVEFSVF9WQUw7CgogICAgLyogRGV0ZXJtaW5lIHRoZSBjdXJyZW50IG1heGltdW0gc2NhbGUgZmFjdG9yICovCiAgICBmb3IgKG91dENoPTA7IG91dENoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IG91dENoKz0xKSB7CiAgICAgIGlmICh2YWxpZFtvdXRDaF0hPTApIHsKICAgICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7CiAgICAgICAgICBpZiAobWl4U2NhbGVzW291dENoXVtpbkNoXSA+IG1heFNjYWxlKQogICAgICAgICAgeyAvKiBTdG9yZSB0aGUgbmV3IG1heGltdW0gKi8KICAgICAgICAgICAgbWF4U2NhbGUgPSBtaXhTY2FsZXNbb3V0Q2hdW2luQ2hdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qIEluZGl2aWR1YWx5IGFuYWx5c2Ugb3V0cHV0IGNoYW5hbCBsZXZlbHMgKi8KICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKICAgICAgY2hTdW1bb3V0Q2hdID0gTUFYX1NFQVJDSF9TVEFSVF9WQUw7CiAgICAgIGlmICh2YWxpZFtvdXRDaF0hPTApIHsKICAgICAgICBpbnQgIG92cmZsd1Byb3RTY2FsZSA9IDA7CgogICAgICAgIC8qIEFjY3VtdWxhdGUgYWxsIGZhY3RvcnMgZm9yIGVhY2ggb3V0cHV0IGNoYW5uZWwgKi8KICAgICAgICBjaFN1bVtvdXRDaF0gPSAwOwogICAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGluQ2grPTEpIHsKICAgICAgICAgIFNIT1JUIGFkZEZhY3QgPSBGWF9ETVgyU0hSVChtaXhGYWN0b3JzW291dENoXVtpbkNoXSk7CiAgICAgICAgICBpZiAoIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPD0gbWF4U2NhbGUgKSB7CiAgICAgICAgICAgIGFkZEZhY3QgPj49IG1heFNjYWxlIC0gbWl4U2NhbGVzW291dENoXVtpbkNoXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFkZEZhY3QgPDw9IG1peFNjYWxlc1tvdXRDaF1baW5DaF0gLSBtYXhTY2FsZTsKICAgICAgICAgIH0KICAgICAgICAgIGNoU3VtW291dENoXSArPSBhZGRGYWN0OwogICAgICAgIH0KICAgICAgICBpZiAoY2hTdW1bb3V0Q2hdID4gKExPTkcpTUFYVkFMX1NHTCkgewogICAgICAgICAgd2hpbGUgKGNoU3VtW291dENoXSA+IChMT05HKU1BWFZBTF9TR0wpIHsKICAgICAgICAgICAgb3ZyZmx3UHJvdFNjYWxlICs9IDE7CiAgICAgICAgICAgIGNoU3VtW291dENoXSA+Pj0gMTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoU3VtW291dENoXSA+IDApIHsKICAgICAgICAgIHdoaWxlICgoY2hTdW1bb3V0Q2hdPDwxKSA8PSAoTE9ORylNQVhWQUxfU0dMKSB7CiAgICAgICAgICAgIG92cmZsd1Byb3RTY2FsZSAtPSAxOwogICAgICAgICAgICBjaFN1bVtvdXRDaF0gPDw9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qIFN0b3JlIHRoZSBkaWZmZXJlbnRpYWwgc2NhbGluZyBpbiB0aGUgc2FtZSBhcnJheSAqLwogICAgICAgIGNoU3VtW291dENoXSA9IG92cmZsd1Byb3RTY2FsZTsKICAgICAgfQogICAgfQoKICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKICAgICAgaWYgKCAodmFsaWRbb3V0Q2hdICE9IDApCiAgICAgICAgJiYgKGNoU3VtW291dENoXSA+IGNoU3VtTWF4KSApCiAgICAgIHsgLyogU3RvcmUgdGhlIG5ldyBtYXhpbXVtICovCiAgICAgICAgY2hTdW1NYXggPSBjaFN1bVtvdXRDaF07CiAgICAgIH0KICAgIH0KICAgIG1heFNjYWxlID0gRkRLbWF4KG1heFNjYWxlK2NoU3VtTWF4LCAwKTsKCiAgICAvKiBOb3JtYWxpemUgYWxsIGZhY3RvcnMgKi8KICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKICAgICAgaWYgKHZhbGlkW291dENoXSE9MCkgewogICAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGluQ2grPTEpIHsKICAgICAgICAgIGlmIChtaXhGYWN0b3JzW291dENoXVtpbkNoXSAhPSAoRklYUF9ETVgpMCkgewogICAgICAgICAgICBpZiAoIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPD0gbWF4U2NhbGUgKSB7CiAgICAgICAgICAgICAgbWl4RmFjdG9yc1tvdXRDaF1baW5DaF0gPj49IG1heFNjYWxlIC0gbWl4U2NhbGVzW291dENoXVtpbkNoXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA8PD0gbWl4U2NhbGVzW291dENoXVtpbkNoXSAtIG1heFNjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1peFNjYWxlc1tvdXRDaF1baW5DaF0gPSBtYXhTY2FsZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KICB9CgoKICAvKiByZXR1cm4gdGhlIHNjYWxlIGZhY3RvciAqLwogICpwT3V0U2NhbGUgPSBtYXhTY2FsZTsKCiAgcmV0dXJuIChlcnIpOwp9CgoKLyoqIE9wZW4gYW5kIGluaXRpYWxpemUgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZQogKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBhIGJ1ZmZlciByZWNlaXZpbmcgdGhlIGhhbmRsZSBvZiB0aGUgbmV3IGluc3RhbmNlLgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9PcGVuICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAqcFNlbGYKICApCnsKICBIQU5ETEVfUENNX0RPV05NSVggc2VsZjsKICAKICBpZiAocFNlbGYgPT0gTlVMTCkgewogICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogIH0KCiAgKnBTZWxmID0gTlVMTDsKCiAgc2VsZiA9IChIQU5ETEVfUENNX0RPV05NSVgpIEdldFBjbURteEluc3RhbmNlKCAwICk7CiAgaWYgKHNlbGYgPT0gTlVMTCkgewogICAgcmV0dXJuIChQQ01ETVhfT1VUX09GX01FTU9SWSk7CiAgfQoKICAvKiBSZXNldCB0aGUgZnVsbCBpbnN0YW5jZSAqLwogIHBjbURteF9SZXNldCggc2VsZiwgUENNRE1YX1JFU0VUX0ZVTEwgKTsKCiAgKnBTZWxmID0gc2VsZjsKCiAgcmV0dXJuIChQQ01ETVhfT0spOwp9CgoKLyoqIFJlc2V0IGFsbCBzdGF0aWMgdmFsdWVzIGxpa2UgZS5nLiBtaXhkb3duIGNvZWZmaWNpZW50cy4KICogQHBhcmFtIFtpbl0gSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KICogQHBhcmFtIFtpbl0gRmxhZ3MgdGVsbGluZyB3aGljaCBwYXJ0cyBvZiB0aGUgbW9kdWxlIHNoYWxsIGJlIHJlc2V0LgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9SZXNldCAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggIHNlbGYsCiAgICBVSU5UICAgICAgICAgICAgICAgIGZsYWdzCiAgKQp7CiAgaWYgKHNlbGYgPT0gTlVMTCkgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7IH0KCiAgaWYgKGZsYWdzICYgUENNRE1YX1JFU0VUX1BBUkFNUykgewogICAgUENNX0RNWF9VU0VSX1BBUkFNUyAqcFBhcmFtcyA9ICZzZWxmLT51c2VyUGFyYW1zOwoKICAgIHBQYXJhbXMtPmR1YWxDaGFubmVsTW9kZSAgID0gU1RFUkVPX01PREU7CiAgICBwUGFyYW1zLT5wc2V1ZG9TdXJyTW9kZSAgICA9IE5FVkVSX0RPX1BTX0RNWDsKICAgIHBQYXJhbXMtPm51bU91dENoYW5uZWxzTWF4ID0gUENNX0RNWF9ERkxUX01BWF9PVVRfQ0hBTk5FTFM7CiAgICBwUGFyYW1zLT5udW1PdXRDaGFubmVsc01pbiA9IFBDTV9ETVhfREZMVF9NSU5fT1VUX0NIQU5ORUxTOwogICAgcFBhcmFtcy0+ZnJhbWVEZWxheSAgICAgICAgPSAwOwogICAgcFBhcmFtcy0+ZXhwaXJ5RnJhbWUgICAgICAgPSBQQ01fRE1YX0RGTFRfRVhQSVJZX0ZSQU1FOwoKICAgIHNlbGYtPmFwcGx5UHJvY2Vzc2luZyAgICAgID0gMDsKICB9CgogIGlmIChmbGFncyAmIFBDTURNWF9SRVNFVF9CU19EQVRBKSB7CiAgICBpbnQgc2xvdDsKICAgIC8qIEluaXQgYWxsIHNsb3RzIHdpdGggYSBkZWZhdWx0IHNldCAqLwogICAgZm9yIChzbG90ID0gMDsgc2xvdCA8PSBQQ01fRE1YX01BWF9ERUxBWV9GUkFNRVM7IHNsb3QgKz0gMSkgewogICAgICBGREttZW1jcHkoJnNlbGYtPmJzTWV0YURhdGFbc2xvdF0sICZkZmx0TWV0YURhdGEsIHNpemVvZihETVhfQlNfTUVUQV9EQVRBKSk7CiAgICB9CiAgfQoKICByZXR1cm4gKFBDTURNWF9PSyk7Cn0KCgovKiogU2V0IG9uZSBwYXJhbWV0ZXIgZm9yIG9uZSBpbnN0YW5jZSBvZiB0aGUgUENNIGRvd25taXggbW9kdWxlLgogKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgogKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdG8gYmUgc2V0LgogKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdmFsdWUuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X1NldFBhcmFtICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIGNvbnN0IFBDTURNWF9QQVJBTSAgcGFyYW0sCiAgICBjb25zdCBJTlQgICAgICAgICAgIHZhbHVlCiAgKQp7CiAgc3dpdGNoIChwYXJhbSkKICB7CiAgY2FzZSBETVhfQlNfREFUQV9FWFBJUllfRlJBTUU6CiAgICBpZiAoc2VsZiA9PSBOVUxMKQogICAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgICBzZWxmLT51c2VyUGFyYW1zLmV4cGlyeUZyYW1lID0gKHZhbHVlID4gMCkgPyAoVUlOVCl2YWx1ZSA6IDA7CiAgICBicmVhazsKCiAgY2FzZSBETVhfQlNfREFUQV9ERUxBWToKICAgIGlmICggKHZhbHVlID4gUENNX0RNWF9NQVhfREVMQVlfRlJBTUVTKQogICAgICB8fCAodmFsdWUgPCAwKSApIHsKICAgICAgcmV0dXJuIChQQ01ETVhfVU5BQkxFX1RPX1NFVF9QQVJBTSk7CiAgICB9CiAgICBpZiAoc2VsZiA9PSBOVUxMKSB7CiAgICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICAgIH0KICAgIHNlbGYtPnVzZXJQYXJhbXMuZnJhbWVEZWxheSA9IChVQ0hBUil2YWx1ZTsKICAgIGJyZWFrOwoKICBjYXNlIE1JTl9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTOgogICAgc3dpdGNoICh2YWx1ZSkgeyAgLyogc3VwcG9ydGVkIG91dHB1dCBjaGFubmVscyAqLwogICAgY2FzZSAtMTogY2FzZSAwOiBjYXNlIE9ORV9DSEFOTkVMOiBjYXNlIFRXT19DSEFOTkVMOgojaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+PSA2KQogICAgY2FzZSBTSVhfQ0hBTk5FTDoKI2VuZGlmCiNpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID49IDgpCiAgICBjYXNlIEVJR0hUX0NIQU5ORUw6CiNlbmRpZgogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOwogICAgfQogICAgaWYgKHNlbGYgPT0gTlVMTCkKICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogICAgLyogU3RvcmUgdGhlIG5ldyB2YWx1ZSAqLwogICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01pbiA9ICh2YWx1ZSA+IDApID8gdmFsdWUgOiAtMTsKICAgIGlmICggKHZhbHVlID4gMCkKICAgICAgJiYgKHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXggPiAwKQogICAgICAmJiAodmFsdWUgPiBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4KSApCiAgICB7IC8qIE1JTiA+IE1BWCB3b3VsZCBiZSBhbiBpbnZhbGlkIHN0YXRlLiBUaHVzIHNldCBNQVggPSBNSU4gaW4gdGhpcyBjYXNlLiAqLwogICAgICBzZWxmLT51c2VyUGFyYW1zLm51bU91dENoYW5uZWxzTWF4ID0gc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01pbjsKICAgIH0KICAgIGJyZWFrOwoKICBjYXNlIE1BWF9OVU1CRVJfT0ZfT1VUUFVUX0NIQU5ORUxTOgogICAgc3dpdGNoICh2YWx1ZSkgeyAgLyogc3VwcG9ydGVkIG91dHB1dCBjaGFubmVscyAqLwogICAgY2FzZSAtMTogY2FzZSAwOiBjYXNlIE9ORV9DSEFOTkVMOiBjYXNlIFRXT19DSEFOTkVMOgojaWYgKFBDTV9ETVhfTUFYX09VVF9DSEFOTkVMUyA+PSA2KQogICAgY2FzZSBTSVhfQ0hBTk5FTDoKI2VuZGlmCiNpZiAoUENNX0RNWF9NQVhfT1VUX0NIQU5ORUxTID49IDgpCiAgICBjYXNlIEVJR0hUX0NIQU5ORUw6CiNlbmRpZgogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOwogICAgfQogICAgaWYgKHNlbGYgPT0gTlVMTCkKICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogICAgLyogU3RvcmUgdGhlIG5ldyB2YWx1ZSAqLwogICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01heCA9ICh2YWx1ZSA+IDApID8gdmFsdWUgOiAtMTsKICAgIGlmICggKHZhbHVlID4gMCkKICAgICAgJiYgKHZhbHVlIDwgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01pbikgKQogICAgeyAvKiBNQVggPCBNSU4gd291bGQgYmUgYW4gaW52YWxpZCBzdGF0ZS4gVGh1cyBzZXQgTUlOID0gTUFYIGluIHRoaXMgY2FzZS4gKi8KICAgICAgc2VsZi0+dXNlclBhcmFtcy5udW1PdXRDaGFubmVsc01pbiA9IHNlbGYtPnVzZXJQYXJhbXMubnVtT3V0Q2hhbm5lbHNNYXg7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBETVhfRFVBTF9DSEFOTkVMX01PREU6CiAgICBzd2l0Y2ggKChEVUFMX0NIQU5ORUxfTU9ERSl2YWx1ZSkgewogICAgY2FzZSBTVEVSRU9fTU9ERToKICAgIGNhc2UgQ0gxX01PREU6CiAgICBjYXNlIENIMl9NT0RFOgogICAgY2FzZSBNSVhFRF9NT0RFOgogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOwogICAgfQogICAgaWYgKHNlbGYgPT0gTlVMTCkKICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogICAgc2VsZi0+dXNlclBhcmFtcy5kdWFsQ2hhbm5lbE1vZGUgPSAoRFVBTF9DSEFOTkVMX01PREUpdmFsdWU7CiAgICBzZWxmLT5hcHBseVByb2Nlc3NpbmcgPSAxOyAgLyogRm9yY2UgcHJvY2Vzc2luZyAqLwogICAgYnJlYWs7CgogIGNhc2UgRE1YX1BTRVVET19TVVJST1VORF9NT0RFOgogICAgc3dpdGNoICgoUFNFVURPX1NVUlJPVU5EX01PREUpdmFsdWUpIHsKICAgIGNhc2UgTkVWRVJfRE9fUFNfRE1YOgogICAgY2FzZSBBVVRPX1BTX0RNWDoKICAgIGNhc2UgRk9SQ0VfUFNfRE1YOgogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHJldHVybiAoUENNRE1YX1VOQUJMRV9UT19TRVRfUEFSQU0pOwogICAgfQogICAgaWYgKHNlbGYgPT0gTlVMTCkKICAgICAgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9IQU5ETEUpOwogICAgc2VsZi0+dXNlclBhcmFtcy5wc2V1ZG9TdXJyTW9kZSA9IChQU0VVRE9fU1VSUk9VTkRfTU9ERSl2YWx1ZTsKICAgIGJyZWFrOwoKICBkZWZhdWx0OgogICAgcmV0dXJuIChQQ01ETVhfVU5LTk9XTl9QQVJBTSk7CiAgfQoKICByZXR1cm4gKFBDTURNWF9PSyk7Cn0KCi8qKiBHZXQgb25lIHBhcmFtZXRlciB2YWx1ZSBvZiBvbmUgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgogKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgogKiBAcGFyYW0gW2luXSBQYXJhbWV0ZXIgdG8gYmUgc2V0LgogKiBAcGFyYW0gW291dF0gUG9pbnRlciB0byBidWZmZXIgcmVjZWl2aW5nIHRoZSBwYXJhbWV0ZXIgdmFsdWUuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X0dldFBhcmFtICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIGNvbnN0IFBDTURNWF9QQVJBTSAgcGFyYW0sCiAgICBJTlQgKiBjb25zdCAgICAgICAgIHBWYWx1ZQogICkKewogIFBDTV9ETVhfVVNFUl9QQVJBTVMgKnBVc3JQYXJhbXM7CgogIGlmICggKHNlbGYgPT0gTlVMTCkKICAgIHx8IChwVmFsdWUgPT0gTlVMTCkgKSB7CiAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgfQogIHBVc3JQYXJhbXMgPSAmc2VsZi0+dXNlclBhcmFtczsKCiAgc3dpdGNoIChwYXJhbSkKICB7CiAgY2FzZSBETVhfQlNfREFUQV9FWFBJUllfRlJBTUU6CiAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5leHBpcnlGcmFtZTsKICAgIGJyZWFrOwogIGNhc2UgRE1YX0JTX0RBVEFfREVMQVk6CiAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5mcmFtZURlbGF5OwogICAgYnJlYWs7CiAgY2FzZSBNSU5fTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPm51bU91dENoYW5uZWxzTWluOwogICAgYnJlYWs7CiAgY2FzZSBNQVhfTlVNQkVSX09GX09VVFBVVF9DSEFOTkVMUzoKICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPm51bU91dENoYW5uZWxzTWF4OwogICAgYnJlYWs7CiAgY2FzZSBETVhfRFVBTF9DSEFOTkVMX01PREU6CiAgICAqcFZhbHVlID0gKElOVClwVXNyUGFyYW1zLT5kdWFsQ2hhbm5lbE1vZGU7CiAgICBicmVhazsKICBjYXNlIERNWF9QU0VVRE9fU1VSUk9VTkRfTU9ERToKICAgICpwVmFsdWUgPSAoSU5UKXBVc3JQYXJhbXMtPnBzZXVkb1N1cnJNb2RlOwogICAgYnJlYWs7CiAgZGVmYXVsdDoKICAgIHJldHVybiAoUENNRE1YX1VOS05PV05fUEFSQU0pOwogIH0KCiAgcmV0dXJuIChQQ01ETVhfT0spOwp9CgoKI2lmZGVmIERTRV9NRVRBREFUQV9FTkFCTEUKCiNkZWZpbmUgTUFYX0RTRV9BTkNfQllURVMgICAgICAgKCAxNiApICAgIC8qIDE1IGJ5dGVzICovCiNkZWZpbmUgQU5DX0RBVEFfU1lOQ19CWVRFICAgICAgKCAweEJDICkgIC8qIGFuY2lsbGFyeSBkYXRhIHN5bmMgYnl0ZS4gKi8KCi8qCiAqIFJlYWQgRE1YIG1ldGEtZGF0YSBmcm9tIGEgZGF0YSBzdHJlYW0gZWxlbWVudC4KICovClBDTURNWF9FUlJPUiBwY21EbXhfUGFyc2UgKAogICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAogICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCcywKICAgIFVJTlQgIGFuY0RhdGFCaXRzLAogICAgaW50ICAgIGlzTXBlZzIKICApCnsKICBQQ01ETVhfRVJST1IgZXJyb3JTdGF0dXMgPSBQQ01ETVhfT0s7CiAgRE1YX0JTX01FVEFfREFUQSAqcEJzTWV0YURhdGEgPSAmc2VsZi0+YnNNZXRhRGF0YVswXTsKCiAgaW50ICAgc2tpcDREbXggPSAwLCBza2lwNEV4dCA9IDA7CiAgaW50ICAgZG14THZsQXZhaWwgPSAwLCBleHREYXRhQXZhaWwgPSAwOwogIGludCAgIGZvdW5kTmV3RGF0YSA9IDA7CiAgVUlOVCAgbWluQW5jQml0cyA9ICgoaXNNcGVnMikgPyA1IDogMykqODsKCiAgaWYgKCAoc2VsZiA9PSBOVUxMKQogICAgfHwgKGhCcyAgPT0gTlVMTCkgKSB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsgfQoKICBhbmNEYXRhQml0cyA9IEZES2dldFZhbGlkQml0cyhoQnMpOwoKICAvKiBzYW5pdHkgY2hlY2tzICovCiAgaWYgKCAoYW5jRGF0YUJpdHMgPCBtaW5BbmNCaXRzKQogICAgfHwgKGFuY0RhdGFCaXRzID4gRkRLZ2V0VmFsaWRCaXRzKGhCcykpICkgewogICAgcmV0dXJuIChQQ01ETVhfQ09SUlVQVF9BTkNfREFUQSk7CiAgfQoKICBwQnNNZXRhRGF0YSA9ICZzZWxmLT5ic01ldGFEYXRhWzBdOwoKICBpZiAoaXNNcGVnMikgewogICAgLyogc2tpcCBEVkQgYW5jaWxsYXJ5IGRhdGEgKi8KICAgIEZES3B1c2hGb3IoaEJzLCAxNik7CiAgfQoKICAvKiBjaGVjayBzeW5jIHdvcmQgKi8KICBpZiAoRkRLcmVhZEJpdHMoaEJzLDgpICE9IEFOQ19EQVRBX1NZTkNfQllURSkgewogICAgcmV0dXJuIChQQ01ETVhfQ09SUlVQVF9BTkNfREFUQSk7CiAgfQoKICAvKiBza2lwIE1QRUcgYXVkaW8gdHlwZSBhbmQgRG9sYnkgc3Vycm91bmQgbW9kZSAqLwogIEZES3B1c2hGb3IoaEJzLCA0KTsKCiAgaWYgKGlzTXBlZzIpIHsKICAgIC8qIGludCBudW1BbmNCeXRlcyA9ICovIEZES3JlYWRCaXRzKGhCcywgNCk7CiAgICAvKiBhZHZhbmNlZCBkeW5hbWljIHJhbmdlIGNvbnRyb2wgKi8KICAgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RG14ICs9IDI0OwogICAgLyogZGlhbG9nIG5vcm1hbGl6YXRpb24gKi8KICAgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RG14ICs9IDg7CiAgICAvKiByZXByb2R1Y3Rpb25fbGV2ZWwgKi8KICAgIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RG14ICs9IDg7CiAgfSBlbHNlIHsKICAgIEZES3B1c2hGb3IoaEJzLCAyKTsgICAvKiBkcmMgcHJlc2VudGF0aW9uIG1vZGUgKi8KICAgIHBCc01ldGFEYXRhLT5wc2V1ZG9TdXJyb3VuZCA9IEZES3JlYWRCaXQoaEJzKTsKICAgIEZES3B1c2hGb3IoaEJzLCA0KTsgICAvKiByZXNlcnZlZCBiaXRzICovCiAgfQoKICAvKiBkb3dubWl4aW5nIGxldmVscyBNUEVHeCBzdGF0dXMgKi8KICBkbXhMdmxBdmFpbCAgPSBGREtyZWFkQml0KGhCcyk7CgogIGlmIChpc01wZWcyKSB7CiAgICAvKiBzY2FsZSBmYWN0b3IgQ1JDIHN0YXR1cyAqLwogICAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDRFeHQgKz0gMTY7CiAgfSBlbHNlIHsKICAgIC8qIGFuY2lsbGFyeSBkYXRhIGV4dGVuc2lvbiBzdGF0dXMgKi8KICAgIGV4dERhdGFBdmFpbCA9IEZES3JlYWRCaXQoaEJzKTsKICB9CgogIC8qIGF1ZGlvIGNvZGluZyBhbmQgY29tcHJlc3Npb24gc3RhdHVzICovCiAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDRFeHQgKz0gMTY7CiAgLyogY29hcnNlIGdyYWluIHRpbWVjb2RlIHN0YXR1cyAqLwogIGlmIChGREtyZWFkQml0KGhCcykpIHNraXA0RXh0ICs9IDE2OwogIC8qIGZpbmUgZ3JhaW4gdGltZWNvZGUgc3RhdHVzICovCiAgaWYgKEZES3JlYWRCaXQoaEJzKSkgc2tpcDRFeHQgKz0gMTY7CgogIC8qIHNraXAgdGhlIHVzZWxlc3MgZGF0YSB0byBnZXQgdG8gdGhlIERNWCBsZXZlbHMgKi8KICBGREtwdXNoRm9yKGhCcywgc2tpcDREbXgpOwoKICAvKiBkb3dubWl4X2xldmVsc19NUEVHWCAqLwogIGlmIChkbXhMdmxBdmFpbCkKICB7CiAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSB7ICAvKiBjZW50ZXJfbWl4X2xldmVsX29uICovCiAgICAgIHBCc01ldGFEYXRhLT5jTGV2SWR4ID0gRkRLcmVhZEJpdHMoaEJzLCAzKTsKICAgICAgZm91bmROZXdEYXRhID0gMTsKICAgIH0gZWxzZSB7CiAgICAgIEZES3JlYWRCaXRzKGhCcywgMyk7CiAgICB9CiAgICBpZiAoRkRLcmVhZEJpdChoQnMpKSB7ICAvKiBzdXJyb3VuZF9taXhfbGV2ZWxfb24gKi8KICAgICAgcEJzTWV0YURhdGEtPnNMZXZJZHggPSBGREtyZWFkQml0cyhoQnMsIDMpOwogICAgICBmb3VuZE5ld0RhdGEgPSAxOwogICAgfSBlbHNlIHsKICAgICAgRkRLcmVhZEJpdHMoaEJzLCAzKTsKICAgIH0KICB9CgogIC8qIHNraXAgdGhlIHVzZWxlc3MgZGF0YSB0byBnZXQgdG8gdGhlIGFuY2lsbGFyeSBkYXRhIGV4dGVuc2lvbiAqLwogIEZES3B1c2hGb3IoaEJzLCBza2lwNEV4dCk7CgogIC8qIGFuYyBkYXRhIGV4dGVuc2lvbiAoTVBFRy00IG9ubHkpICovCiAgaWYgKGV4dERhdGFBdmFpbCkgewogICAgaW50IGV4dERteEx2bFN0LCBleHREbXhHYWluU3QsIGV4dERteExmZVN0OwoKICAgIEZES3JlYWRCaXQoaEJzKTsgICAgICAgIC8qIHJlc2VydmVkIGJpdCAqLwogICAgZXh0RG14THZsU3QgID0gRkRLcmVhZEJpdChoQnMpOwogICAgZXh0RG14R2FpblN0ID0gRkRLcmVhZEJpdChoQnMpOwogICAgZXh0RG14TGZlU3QgID0gRkRLcmVhZEJpdChoQnMpOwogICAgRkRLcmVhZEJpdHMoaEJzLCA0KTsgICAgLyogcmVzZXJ2ZWQgYml0cyAqLwoKICAgIGlmIChleHREbXhMdmxTdCkgewogICAgICBwQnNNZXRhRGF0YS0+ZG1peElkeEEgPSBGREtyZWFkQml0cyhoQnMsIDMpOwogICAgICBwQnNNZXRhRGF0YS0+ZG1peElkeEIgPSBGREtyZWFkQml0cyhoQnMsIDMpOwogICAgICBGREtyZWFkQml0cyhoQnMsIDIpOyAgLyogcmVzZXJ2ZWQgYml0cyAqLwogICAgICBmb3VuZE5ld0RhdGEgPSAxOwogICAgfQogICAgaWYgKGV4dERteEdhaW5TdCkgewogICAgICBwQnNNZXRhRGF0YS0+ZG14R2FpbklkeDUgPSBGREtyZWFkQml0cyhoQnMsIDcpOwogICAgICBGREtyZWFkQml0KGhCcyk7ICAgICAgLyogcmVzZXJ2ZWQgYml0ICovCiAgICAgIHBCc01ldGFEYXRhLT5kbXhHYWluSWR4MiA9IEZES3JlYWRCaXRzKGhCcywgNyk7CiAgICAgIEZES3JlYWRCaXQoaEJzKTsgICAgICAvKiByZXNlcnZlZCBiaXQgKi8KICAgICAgZm91bmROZXdEYXRhID0gMTsKICAgIH0KICAgIGlmIChleHREbXhMZmVTdCkgewogICAgICBwQnNNZXRhRGF0YS0+ZG1peElkeExmZSA9IEZES3JlYWRCaXRzKGhCcywgNCk7CiAgICAgIEZES3JlYWRCaXRzKGhCcywgNCk7ICAvKiByZXNlcnZlZCBiaXRzICovCiAgICAgIGZvdW5kTmV3RGF0YSA9IDE7CiAgICB9CiAgfQoKICAvKiBmaW5hbCBzYW5pdHkgY2hlY2sgb24gdGhlIGFtb3VudCBvZiByZWFkIGRhdGEgKi8KICBpZiAoKElOVClGREtnZXRWYWxpZEJpdHMoaEJzKSA8IDApIHsKICAgIGVycm9yU3RhdHVzID0gUENNRE1YX0NPUlJVUFRfQU5DX0RBVEE7CiAgfQoKICBpZiAoIChlcnJvclN0YXR1cyAgPT0gUENNRE1YX09LKQogICAgJiYgKGZvdW5kTmV3RGF0YSA9PSAxKSApIHsKICAgIC8qIGFubm91bmNlIG5ldyBkYXRhICovCiAgICBwQnNNZXRhRGF0YS0+dHlwZUZsYWdzIHw9IFRZUEVfRFNFX0RBVEE7CiAgICAvKiByZXNldCBleHBpcnkgY291bnRlciAqLwogICAgcEJzTWV0YURhdGEtPmV4cGlyeUNvdW50ID0gMDsKICB9CgogIHJldHVybiAoZXJyb3JTdGF0dXMpOwp9CgovKgogKiBSZWFkIERNWCBtZXRhLWRhdGEgZnJvbSBhIGRhdGEgc3RyZWFtIGVsZW1lbnQuCiAqLwpQQ01ETVhfRVJST1IgcGNtRG14X1JlYWREdmJBbmNEYXRhICgKICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgc2VsZiwKICAgIFVDSEFSICpwQW5jRGF0YUJ1ZiwKICAgIFVJTlQgICBhbmNEYXRhQnl0ZXMsCiAgICBpbnQgICAgaXNNcGVnMgogICkKewogIEZES19CSVRTVFJFQU0gYnM7CiAgSEFORExFX0ZES19CSVRTVFJFQU0gaEJzID0gJmJzOwogIFBDTURNWF9FUlJPUiBlcnJvclN0YXR1cyA9IFBDTURNWF9PSzsKCiAgaWYgKHNlbGYgPT0gTlVMTCkgeyByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7IH0KCiAgLyogc2FuaXR5IGNoZWNrcyAqLwogIGlmICggKHBBbmNEYXRhQnVmID09IE5VTEwpCiAgICB8fCAoYW5jRGF0YUJ5dGVzID09IDApICkgewogICAgcmV0dXJuIChQQ01ETVhfQ09SUlVQVF9BTkNfREFUQSk7CiAgfQoKICBGREtpbml0Qml0U3RyZWFtIChoQnMsIHBBbmNEYXRhQnVmLCBNQVhfRFNFX0FOQ19CWVRFUywgYW5jRGF0YUJ5dGVzKjgsIEJTX1JFQURFUik7CgogIGVycm9yU3RhdHVzID0gcGNtRG14X1BhcnNlICgKICAgICAgICAgICAgICAgICAgICAgICAgc2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgaEJzLAogICAgICAgICAgICAgICAgICAgICAgICBhbmNEYXRhQnl0ZXMqOCwKICAgICAgICAgICAgICAgICAgICAgICAgaXNNcGVnMiApOwoKICByZXR1cm4gKGVycm9yU3RhdHVzKTsKfQojZW5kaWYgIC8qIERTRV9NRVRBREFUQV9FTkFCTEUgKi8KCiNpZmRlZiBQQ0VfTUVUQURBVEFfRU5BQkxFCi8qKiBTZXQgdGhlIG1hdHJpeCBtaXhkb3duIGluZm9ybWF0aW9uIGV4dHJhY3RlZCBmcm9tIHRoZSBQQ0Ugb2YgYW4gQUFDIGJpdHN0cmVhbS4KICogIE5vdGU6IENhbGwgb25seSBpZiBtYXRyaXhfbWl4ZG93bl9pZHhfcHJlc2VudCBpcyB0cnVlLgogKiBAcGFyYW0gW2luXSBIYW5kbGUgb2YgUENNIGRvd25taXggbW9kdWxlIGluc3RhbmNlLgogKiBAcGFyYW0gW2luXSBUaGUgMiBiaXQgbWF0cml4IG1peGRvd24gaW5kZXggZXh0cmFjdGVkIGZyb20gUENFLgogKiBAcGFyYW0gW2luXSBUaGUgcHNldWRvIHN1cnJvdW5kIGVuYWJsZSBmbGFnIGV4dHJhY3RlZCBmcm9tIFBDRS4KICogQHJldHVybnMgUmV0dXJucyBhbiBlcnJvciBjb2RlLgogKiovClBDTURNWF9FUlJPUiBwY21EbXhfU2V0TWF0cml4TWl4ZG93bkZyb21QY2UgKAogICAgSEFORExFX1BDTV9ET1dOTUlYICBzZWxmLAogICAgaW50ICAgICAgICAgICAgICAgICBtYXRyaXhNaXhkb3duUHJlc2VudCwKICAgIGludCAgICAgICAgICAgICAgICAgbWF0cml4TWl4ZG93bklkeCwKICAgIGludCAgICAgICAgICAgICAgICAgcHNldWRvU3Vycm91bmRFbmFibGUKICApCnsKICBETVhfQlNfTUVUQV9EQVRBICpwQnNNZXRhRGF0YSA9ICZzZWxmLT5ic01ldGFEYXRhWzBdOwoKICBpZiAoc2VsZiA9PSBOVUxMKSB7CiAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgfQoKICBpZiAobWF0cml4TWl4ZG93blByZXNlbnQpIHsKICAgIHBCc01ldGFEYXRhLT5wc2V1ZG9TdXJyb3VuZCA9IHBzZXVkb1N1cnJvdW5kRW5hYmxlOwogICAgcEJzTWV0YURhdGEtPm1hdHJpeE1peGRvd25JZHggPSBtYXRyaXhNaXhkb3duSWR4ICYgMHgwMzsKICAgIHBCc01ldGFEYXRhLT50eXBlRmxhZ3MgfD0gVFlQRV9QQ0VfREFUQTsKICAgIC8qIFJlc2V0IGV4cGlyeSBjb3VudGVyICovCiAgICBwQnNNZXRhRGF0YS0+ZXhwaXJ5Q291bnQgPSAwOwogIH0KCiAgcmV0dXJuIChQQ01ETVhfT0spOwp9CiNlbmRpZiAgLyogUENFX01FVEFEQVRBX0VOQUJMRSAqLwoKCi8qKiBBcHBseSBkb3duIG9yIHVwIG1peGluZy4KICogQHBhcmFtIFtpbl0gICAgSGFuZGxlIG9mIFBDTSBkb3dubWl4IG1vZHVsZSBpbnN0YW5jZS4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBidWZmZXIgdGhhdCBob2xkIHRoZSB0aW1lIGRvbWFpbiBzaWduYWwuCiAqIEBwYXJhbSBbaW5dICAgIFBvaW50ZXIgd2hlcmUgdGhlIGFtb3VudCBvZiBvdXRwdXQgc2FtcGxlcyBpcyByZXR1cm5lZCBpbnRvLgogKiBAcGFyYW0gW2lub3V0XSBQb2ludGVyIHdoZXJlIHRoZSBhbW91bnQgb2Ygb3V0cHV0IGNoYW5uZWxzIGlzIHJldHVybmVkIGludG8uCiAqIEBwYXJhbSBbaW5dICAgIEZsYWcgd2hpY2ggaW5kaWNhdGVzIGlmIG91dHB1dCB0aW1lIGRhdGEgYXJlIHdyaXR0ZXJuIGludGVybGVhdmVkIG9yIGFzIHN1YnNlcXVlbnQgYmxvY2tzLgogKiBAcGFyYW0gW2lub3V0XSBBcnJheSB3aGVyZSB0aGUgY29ycmVzcG9uZGluZyBjaGFubmVsIHR5cGUgZm9yIGVhY2ggb3V0cHV0IGF1ZGlvIGNoYW5uZWwgaXMgc3RvcmVkIGludG8uCiAqIEBwYXJhbSBbaW5vdXRdIEFycmF5IHdoZXJlIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5uZWwgdHlwZSBpbmRleCBmb3IgZWFjaCBvdXRwdXQgYXVkaW8gY2hhbm5lbCBpcyBzdG9yZWQgaW50by4KICogQHBhcmFtIFtpbl0gICAgQXJyYXkgY29udGFpbmluZyB0aGUgb3V0IGNoYW5uZWwgbWFwcGluZyB0byBiZSB1c2VkIChGcm9tIE1QRUcgUENFIG9yZGVyaW5nIHRvIHdoYXRldmVyIGlzIHJlcXVpcmVkKS4KICogQHBhcmFtIFtvdXRdICAgUG9pbnRlciBvbiBhIGZpZWxkIHJlY2VpdmluZyB0aGUgc2NhbGUgZmFjdG9yIHRoYXQgaGFzIHRvIGJlIGFwcGxpZWQgb24gYWxsIHNhbXBsZXMgYWZ0ZXJ3YXJkcy4KICogICAgICAgICAgICAgICAgSWYgdGhlIGhhbmRlZCBwb2ludGVyIGlzIE5VTEwgc2NhbGluZyBpcyBkb25lIGludGVybmFsbHkuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICoqLwpQQ01ETVhfRVJST1IgcGNtRG14X0FwcGx5RnJhbWUgKAogICAgICAgIEhBTkRMRV9QQ01fRE9XTk1JWCAgICAgIHNlbGYsCiAgICAgICAgSU5UX1BDTSAgICAgICAgICAgICAgICAqcFBjbUJ1ZiwKICAgICAgICBVSU5UICAgICAgICAgICAgICAgICAgICBmcmFtZVNpemUsCiAgICAgICAgSU5UICAgICAgICAgICAgICAgICAgICAqbkNoYW5uZWxzLAogICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIGZJbnRlcmxlYXZlZCwKICAgICAgICBBVURJT19DSEFOTkVMX1RZUEUgICAgICBjaGFubmVsVHlwZVtdLAogICAgICAgIFVDSEFSICAgICAgICAgICAgICAgICAgIGNoYW5uZWxJbmRpY2VzW10sCiAgICAgICAgY29uc3QgVUNIQVIgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmdbXVs4XSwKICAgICAgICBJTlQgICAgICAgICAgICAgICAgICAgICpwRG14T3V0U2NhbGUKICApCnsKICBQQ01fRE1YX1VTRVJfUEFSQU1TICAqcFBhcmFtID0gTlVMTDsKICBQQ01ETVhfRVJST1IgIGVycm9yU3RhdHVzID0gUENNRE1YX09LOwogIERVQUxfQ0hBTk5FTF9NT0RFICBkdWFsQ2hhbm5lbE1vZGU7CiAgUENNX0RNWF9DSEFOTkVMX01PREUgIGluQ2hNb2RlOwogIFBDTV9ETVhfQ0hBTk5FTF9NT0RFICBvdXRDaE1vZGU7CiAgSU5UICAgZGV2TnVsbDsgIC8qIEp1c3QgYSBkdW1teSB0byBhdm9pZCBhIGxvdCBvZiBicmFuY2hlcyBpbiB0aGUgY29kZSAqLwogIGludCAgIG51bU91dENoYW5uZWxzLCBudW1JbkNoYW5uZWxzOwogIGludCAgIGluU3RyaWRlLCBvdXRTdHJpZGUsIG9mZnNldDsKICBpbnQgICBkbXhNYXhTY2FsZSwgZG14U2NhbGU7CiAgaW50ICAgY2gsIHNsb3Q7CiAgVUNIQVIgaW5PZmZzZXRUYWJsZVtQQ01fRE1YX01BWF9DSEFOTkVMU107CgogIERNWF9CU19NRVRBX0RBVEEgIGJzTWV0YURhdGE7CgogIGlmICggKHNlbGYgICAgICAgICAgID09IE5VTEwpCiAgICB8fCAobkNoYW5uZWxzICAgICAgPT0gTlVMTCkKICAgIHx8IChjaGFubmVsVHlwZSAgICA9PSBOVUxMKQogICAgfHwgKGNoYW5uZWxJbmRpY2VzID09IE5VTEwpCiAgICB8fCAoY2hhbm5lbE1hcHBpbmcgPT0gTlVMTCkgKSB7CiAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0hBTkRMRSk7CiAgfQoKICAvKiBJbml0IHRoZSBvdXRwdXQgc2NhbGluZyAqLwogIGRteFNjYWxlID0gMDsKICBpZiAocERteE91dFNjYWxlICE9IE5VTEwpIHsKICAgIC8qIEF2b2lkIGZpbmFsIHNjYWxpbmcgaW50ZXJuYWxseSBhbmQgaGFuZCBpdCB0byB0aGUgb3V0c2lkZSB3b3JsZC4gKi8KICAgICpwRG14T3V0U2NhbGUgPSAwOwogICAgZG14TWF4U2NhbGUgPSBQQ01ETVhfTUFYX0hFQURST09NOwogIH0gZWxzZSB7CiAgICAvKiBBcHBseSB0aGUgc2NhbGluZyBpbnRlcm5hbGx5LiAqLwogICAgcERteE91dFNjYWxlID0gJmRldk51bGw7ICAvKiByZWRpcmVjdCB0byB0ZW1wb3JhbCBzdGFjayBtZW1vcnkgKi8KICAgIGRteE1heFNjYWxlID0gMDsKICB9CgogIHBQYXJhbSA9ICZzZWxmLT51c2VyUGFyYW1zOwogIG51bUluQ2hhbm5lbHMgPSAqbkNoYW5uZWxzOwoKICAvKiBQZXJmb3JtIHNvbWUgaW5wdXQgc2FuaXR5IGNoZWNrcyAqLwogIGlmIChwUGNtQnVmID09IE5VTEwpICAgICB7IHJldHVybiAoUENNRE1YX0lOVkFMSURfQVJHVU1FTlQpOyB9CiAgaWYgKGZyYW1lU2l6ZSA9PSAwKSAgICAgIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVCk7IH0KICBpZiAoIChudW1JbkNoYW5uZWxzID09IDApCiAgICB8fCAobnVtSW5DaGFubmVscyA+IFBDTV9ETVhfTUFYX0lOX0NIQU5ORUxTKSApCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVCk7IH0KCiAgLyogQ2hlY2sgb24gbWlzY29uZmlndXJhdGlvbiAqLwogIEZES19BU1NFUlQoIChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4IDw9IDApIFwKICAgICAgICAgICB8fCAocFBhcmFtLT5udW1PdXRDaGFubmVsc01heCA+PSBwUGFyYW0tPm51bU91dENoYW5uZWxzTWluKSk7CgogIC8qIERldGVybWluZSBpZiB0aGUgbW9kdWxlIGhhcyB0byBkbyBwcm9jZXNzaW5nICovCiAgaWYgKCAgIChzZWxmLT5hcHBseVByb2Nlc3NpbmcgPT0gMCkKICAgICYmICAoKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPD0gMCkKICAgICAgfHwgKHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXggPj0gbnVtSW5DaGFubmVscykpCiAgICAmJiAgIChwUGFyYW0tPm51bU91dENoYW5uZWxzTWluIDw9IG51bUluQ2hhbm5lbHMpICkgewogICAgLyogTm90aGluZyB0byBkbyAqLwogICAgcmV0dXJuIChlcnJvclN0YXR1cyk7CiAgfQoKICAvKiBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBvdXRwdXQgY2hhbm5lbHMgKi8KICBpZiAoIChwUGFyYW0tPm51bU91dENoYW5uZWxzTWF4ID4gMCkKICAgICYmIChudW1JbkNoYW5uZWxzID4gcFBhcmFtLT5udW1PdXRDaGFubmVsc01heCkgKSB7CiAgICBudW1PdXRDaGFubmVscyA9IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNYXg7CiAgfQogIGVsc2UgaWYgKG51bUluQ2hhbm5lbHMgPCBwUGFyYW0tPm51bU91dENoYW5uZWxzTWluKSB7CiAgICBudW1PdXRDaGFubmVscyA9IHBQYXJhbS0+bnVtT3V0Q2hhbm5lbHNNaW47CiAgfQogIGVsc2UgewogICAgbnVtT3V0Q2hhbm5lbHMgPSBudW1JbkNoYW5uZWxzOwogIH0KCiAgZHVhbENoYW5uZWxNb2RlID0gcFBhcmFtLT5kdWFsQ2hhbm5lbE1vZGU7CgogIC8qIEFuYWx5c2UgaW5wdXQgY2hhbm5lbCBjb25maWd1cmF0aW9uIGFuZCBnZXQgY2hhbm5lbCBvZmZzZXQKICAgKiB0YWJsZSB0aGF0IGNhbiBiZSBhY2Nlc3NlZCB3aXRoIHRoZSBmaXhlZCBjaGFubmVsIGxhYmVscy4gKi8KICBlcnJvclN0YXR1cyA9IGdldENoYW5uZWxNb2RlKAogICAgICAgICAgICAgICAgICAgbnVtSW5DaGFubmVscywKICAgICAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAogICAgICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXMsCiAgICAgICAgICAgICAgICAgICBpbk9mZnNldFRhYmxlLAogICAgICAgICAgICAgICAgICAmaW5DaE1vZGUKICAgICAgICAgICAgICAgICApOwogIGlmICggUENNRE1YX0lTX0ZBVEFMX0VSUk9SKGVycm9yU3RhdHVzKQogICAgfHwgKGluQ2hNb2RlID09IENIX01PREVfVU5ERUZJTkVEKSApIHsKICAgIC8qIFdlIGRvbid0IG5lZWQgdG8gcmVzdG9yZSBiZWNhdXNlIHRoZSBjaGFubmVsCiAgICAgICBjb25maWd1cmF0aW9uIGhhcyBub3QgYmVlbiBjaGFuZ2VkLiBKdXN0IGV4aXQuICovCiAgICByZXR1cm4gKFBDTURNWF9JTlZBTElEX0NIX0NPTkZJRyk7CiAgfQoKICAvKiBTZXQgaW5wdXQgc3RyaWRlIGFuZCBvZmZzZXQgKi8KICBpZiAoZkludGVybGVhdmVkKSB7CiAgICBpblN0cmlkZSAgPSBudW1JbkNoYW5uZWxzOwogICAgb2Zmc2V0ID0gMTsgICAgICAgICAgICAgICAgLyogQ2hhbm5lbCBzcGVjaWZpYyBvZmZzZXQgZmFjdG9yICovCiAgfSBlbHNlIHsKICAgIGluU3RyaWRlICA9IDE7CiAgICBvZmZzZXQgPSBmcmFtZVNpemU7ICAgICAgICAvKiBDaGFubmVsIHNwZWNpZmljIG9mZnNldCBmYWN0b3IgKi8KICB9CgogIC8qIFJlc2V0IGRvd25taXggbWV0YSBkYXRhIGlmIG5lY2Vzc2FyeSAqLwogIGlmICggKHBQYXJhbS0+ZXhwaXJ5RnJhbWUgPiAwKQogICAgJiYgKCsrc2VsZi0+YnNNZXRhRGF0YVswXS5leHBpcnlDb3VudCA+IHBQYXJhbS0+ZXhwaXJ5RnJhbWUpICkKICB7IC8qIFRoZSBtZXRhZGF0YSByZWFkIGZyb20gYml0c3RyZWFtIGlzIHRvbyBvbGQuICovCiAgICBQQ01ETVhfRVJST1IgZXJyID0gcGNtRG14X1Jlc2V0KHNlbGYsIFBDTURNWF9SRVNFVF9CU19EQVRBKTsKICAgIEZES19BU1NFUlQoZXJyID09IFBDTURNWF9PSyk7CiAgfQogIEZES21lbWNweSgmYnNNZXRhRGF0YSwgJnNlbGYtPmJzTWV0YURhdGFbcFBhcmFtLT5mcmFtZURlbGF5XSwgc2l6ZW9mKERNWF9CU19NRVRBX0RBVEEpKTsKICAvKiBNYWludGFpbiBkZWxheSBsaW5lICovCiAgZm9yIChzbG90ID0gcFBhcmFtLT5mcmFtZURlbGF5OyBzbG90ID4gMDsgc2xvdCAtPSAxKSB7CiAgICBGREttZW1jcHkoJnNlbGYtPmJzTWV0YURhdGFbc2xvdF0sICZzZWxmLT5ic01ldGFEYXRhW3Nsb3QtMV0sIHNpemVvZihETVhfQlNfTUVUQV9EQVRBKSk7CiAgfQoKICAvKiAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KI2lmZGVmIFBDTV9ET1dOTUlYX0VOQUJMRQogIGlmICggbnVtSW5DaGFubmVscyA+IG51bU91dENoYW5uZWxzICkKICB7IC8qIEFwcGx5IGRvd25taXggKi8KICAgIElOVF9QQ00gICpwSW5QY21bUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFNdID0geyBOVUxMIH07CiAgICBJTlRfUENNICAqcE91dFBjbVtQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFNdID0geyBOVUxMIH07CiAgICBGSVhQX0RNWCAgbWl4RmFjdG9yc1tQQ01fRE1YX01BWF9DSEFOTkVMU11bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogICAgVUNIQVIgICAgIG91dE9mZnNldFRhYmxlW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgIFVJTlQgICAgICBzYW1wbGU7CiAgICBpbnQgICAgICAgY2hDZmcgPSAwOwogICAgaW50ICAgICAgIGJ5cFNjYWxlID0gMDsKCiNpZiAoUENNX0RNWF9NQVhfSU5fQ0hBTk5FTFMgPj0gNykKICAgIGlmIChudW1JbkNoYW5uZWxzID4gU0lYX0NIQU5ORUwpIHsKICAgICAgQVVESU9fQ0hBTk5FTF9UWVBFIG11bHRpUHVycG9zZUNoVHlwZVsyXTsKCiAgICAgIC8qIEdldCB0aGUgdHlwZSBvZiB0aGUgbXVsdGlwdXJwb3NlIGNoYW5uZWxzICovCiAgICAgIG11bHRpUHVycG9zZUNoVHlwZVswXSA9IGNoYW5uZWxUeXBlW2luT2Zmc2V0VGFibGVbTEVGVF9NVUxUSVBSUFNfQ0hBTk5FTF1dOwogICAgICBtdWx0aVB1cnBvc2VDaFR5cGVbMV0gPSBjaGFubmVsVHlwZVtpbk9mZnNldFRhYmxlW1JJR0hUX01VTFRJUFJQU19DSEFOTkVMXV07CgogICAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgY29uZmlndXJhdGlvbiBpcyBvbmUgZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQuICovCiAgICAgIHN3aXRjaCAoaW5DaE1vZGUpIHsKICAgICAgY2FzZSBDSF9NT0RFXzVfMF8yXzE6ICAvKiBjaENmZyA3IHx8IDE0ICovCiAgICAgICAgLyogRnVydGhlciBhbmFseXNlIHRoZSBpbnB1dCBjb25maWcgdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBDSF9NT0RFXzVfMF8yXzEgY29uZmlncy4gKi8KICAgICAgICBpZiAoIChtdWx0aVB1cnBvc2VDaFR5cGVbMF0gPT0gQUNUX0ZST05UX1RPUCkKICAgICAgICAgICYmIChtdWx0aVB1cnBvc2VDaFR5cGVbMV0gPT0gQUNUX0ZST05UX1RPUCkgKSB7CiAgICAgICAgICBjaENmZyA9IDE0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjaENmZyA9IDc7CiAgICAgICAgfQogICAgICAgIGJyZWFrOwogICAgICBjYXNlIENIX01PREVfM18wXzNfMTogIC8qIGNoQ2ZnIDExICovCiAgICAgICAgY2hDZmcgPSAxMTsKICAgICAgICBicmVhazsKICAgICAgY2FzZSBDSF9NT0RFXzNfMF80XzE6ICAvKiBjaENmZyAxMiAqLwogICAgICAgIGNoQ2ZnID0gMTI7CiAgICAgICAgYnJlYWs7CiAgICAgIGRlZmF1bHQ6CiAgICAgICAgY2hDZmcgPSAwOyAgLyogTm90IGEga25vd24gY29uZmlnICovCiAgICAgICAgYnJlYWs7CiAgICAgIH0KICAgIH0KI2VuZGlmCgogICAgLyogU2V0IHRoaXMgc3RhZ2VzIG91dHB1dCBzdHJpZGUgYW5kIGNoYW5uZWwgbW9kZTogKi8KICAgIG91dFN0cmlkZSA9IChmSW50ZXJsZWF2ZWQpID8gbnVtT3V0Q2hhbm5lbHMgOiAxOwogICAgb3V0Q2hNb2RlID0gb3V0Q2hNb2RlVGFibGVbbnVtT3V0Q2hhbm5lbHNdOwoKICAgIC8qIEdldCBjaGFubmVsIGRlc2NyaXB0aW9uIGFuZCBjaGFubmVsIG1hcHBpbmcgZm9yIHRoZSBkZXNpcmVkIG91dHB1dCBjb25maWd1cmF0aW9uLiAqLwogICAgZ2V0Q2hhbm5lbERlc2NyaXB0aW9uKAogICAgICAgICAgICBvdXRDaE1vZGUsCiAgICAgICAgICAgIGNoYW5uZWxNYXBwaW5nLAogICAgICAgICAgICBjaGFubmVsVHlwZSwKICAgICAgICAgICAgY2hhbm5lbEluZGljZXMsCiAgICAgICAgICAgIG91dE9mZnNldFRhYmxlCiAgICAgICAgICAgKTsKICAgIC8qIE5vdyB0aGVyZSBpcyBubyB3YXkgYmFjayBiZWNhdXNlIHdlIG1vZGlmaWVkIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24hICovCgogICAgLyogQ3JlYXRlIHRoZSBETVggbWF0cml4ICovCiAgICBlcnJvclN0YXR1cyA9IGdldE1peEZhY3RvcnMgKAogICAgICAgICAgICAgICAgICAgICAgIChjaENmZz4wKSA/IDEgOiAwLAogICAgICAgICAgICAgICAgICAgICAgIChjaENmZz4wKSA/IChQQ01fRE1YX0NIQU5ORUxfTU9ERSljaENmZyA6IGluQ2hNb2RlLAogICAgICAgICAgICAgICAgICAgICAgIG91dENoTW9kZSwKICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW0sCiAgICAgICAgICAgICAgICAgICAgICAmYnNNZXRhRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICBtaXhGYWN0b3JzLAogICAgICAgICAgICAgICAgICAgICAgJmRteFNjYWxlCiAgICAgICAgICAgICAgICAgICAgICk7CiAgICAvKiBObyBmYXRhbCBlcnJvcnMgY2FuIG9jY3VyIGhlcmUuIFRoZSBmdW5jdGlvbiBpcyBkZXNpZ25lZCB0byBhbHdheXMgcmV0dXJuIGEgdmFsaWQgbWF0cml4LgogICAgICAgVGhlIGVycm9yIGNvZGUgaXMgdXNlZCB0byBzaWduYWwgY29uZmlndXJhdGlvbnMgYW5kIG1hdHJpY2VzIHRoYXQgYXJlIG5vdCBjb25mb3JtIHRvIGFueSBzdGFuZGFyZC4gKi8KCiAgICAvKiBEZXRlcm1pbmUgdGhlIGZpbmFsIHNjYWxpbmcgKi8KICAgIGJ5cFNjYWxlID0gRkRLbWluKGRteE1heFNjYWxlLCBkbXhTY2FsZSk7CiAgICAqcERteE91dFNjYWxlICs9IGJ5cFNjYWxlOwogICAgZG14U2NhbGUgLT0gYnlwU2NhbGU7CgogICAgeyAvKiBTZXQgY2hhbm5lbCBwb2ludGVyIGZvciBpbnB1dC4gUmVtb3ZlIGVtcHR5IGNvbHMuICovCiAgICAgIGludCBpbkNoLCBvdXRDaCwgbWFwW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgICAgY2ggPSAwOwogICAgICBmb3IgKGluQ2g9MDsgaW5DaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBpbkNoKz0xKSB7CiAgICAgICAgaWYgKGluT2Zmc2V0VGFibGVbaW5DaF0gIT0gMjU1KSB7CiAgICAgICAgICBwSW5QY21bY2hdID0gJnBQY21CdWZbaW5PZmZzZXRUYWJsZVtpbkNoXSpvZmZzZXRdOwogICAgICAgICAgbWFwW2NoKytdICA9IGluQ2g7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjaCAhPSBudW1JbkNoYW5uZWxzKSB7CiAgICAgICAgICBBTE9HRSgiYi8yMzg3NjQ0NCIpOwogICAgICAgICAgcmV0dXJuIFBDTURNWF9JTlZBTElEX0FSR1VNRU5UOwogICAgICB9CgogICAgICAvKiBSZW1vdmUgdW51c2VkIGNvbHMgZnJvbSBmYWN0b3IgbWF0cml4ICovCiAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgbnVtSW5DaGFubmVsczsgaW5DaCs9MSkgewogICAgICAgIGlmIChpbkNoICE9IG1hcFtpbkNoXSkgewogICAgICAgICAgaW50IG91dENoOwogICAgICAgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBvdXRDaCs9MSkgewogICAgICAgICAgICBtaXhGYWN0b3JzW291dENoXVtpbkNoXSA9IG1peEZhY3RvcnNbb3V0Q2hdW21hcFtpbkNoXV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiBTZXQgY2hhbm5lbCBwb2ludGVyIGZvciBvdXRwdXQuIFJlbW92ZSBlbXB0eSBjb2xzLiAqLwogICAgICBjaCA9IDA7CiAgICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2grPTEpIHsKICAgICAgICBpZiAob3V0T2Zmc2V0VGFibGVbb3V0Q2hdICE9IDI1NSkgewogICAgICAgICAgcE91dFBjbVtjaF0gPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtvdXRDaF0qb2Zmc2V0XTsKICAgICAgICAgIG1hcFtjaCsrXSAgPSBvdXRDaDsKICAgICAgICB9CiAgICAgIH0KICAgICAgRkRLX0FTU0VSVChjaCA9PSBudW1PdXRDaGFubmVscyk7CgogICAgICAvKiBSZW1vdmUgdW51c2VkIHJvd3MgZnJvbSBmYWN0b3IgbWF0cml4ICovCiAgICAgIGZvciAob3V0Q2g9MDsgb3V0Q2ggPCBudW1PdXRDaGFubmVsczsgb3V0Q2grPTEpIHsKICAgICAgICBpZiAob3V0Q2ggIT0gbWFwW291dENoXSkgewogICAgICAgICAgRkRLbWVtY3B5KCZtaXhGYWN0b3JzW291dENoXSwgJm1peEZhY3RvcnNbbWFwW291dENoXV0sIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihGSVhQX0RNWCkpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qIFNhbXBsZSBwcm9jZXNzaW5nIGxvb3AgKi8KICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykKICAgIHsKICAgICAgRklYUF9QQ00gdEluW1BDTV9ETVhfTUFYX0lOX0NIQU5ORUxTXTsKICAgICAgRklYUF9EQkwgdE91dFtQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFNdID0geyAoRklYUF9EQkwpMCB9OwogICAgICBpbnQgaW5DaCwgb3V0Q2g7CgogICAgICAvKiBQcmVsb2FkIGFsbCBpbnB1dCBzYW1wbGVzICovCiAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgbnVtSW5DaGFubmVsczsgaW5DaCs9MSkgewogICAgICAgIHRJbltpbkNoXSA9IChGSVhQX1BDTSkqcEluUGNtW2luQ2hdOwogICAgICAgIHBJblBjbVtpbkNoXSArPSBpblN0cmlkZTsKICAgICAgfQogICAgICAvKiBBcHBseSBkb3dubWl4IGNvZWZmaWNpZW50cyB0byBpbnB1dCBzYW1wbGVzIGFuZCBhY2N1bXVsYXRlIGZvciBvdXRwdXQgKi8KICAgICAgZm9yIChvdXRDaD0wOyBvdXRDaCA8IG51bU91dENoYW5uZWxzOyBvdXRDaCs9MSkgewogICAgICAgIGZvciAoaW5DaD0wOyBpbkNoIDwgbnVtSW5DaGFubmVsczsgaW5DaCs9MSkgewogICAgICAgICAgdE91dFtvdXRDaF0gKz0gZk11bHQodEluW2luQ2hdLCBtaXhGYWN0b3JzW291dENoXVtpbkNoXSk7CiAgICAgICAgfQogICAgICAgIC8qIFdyaXRlIHNhbXBsZSAqLwojaWYgKFNBTVBMRV9CSVRTID09IERGUkFDVF9CSVRTKQogICAgICAgICpwT3V0UGNtW291dENoXSA9IChJTlRfUENNKVNBVFVSQVRFX0xFRlRfU0hJRlQodE91dFtvdXRDaF0sIGRteFNjYWxlLCBTQU1QTEVfQklUUyk7CiNlbHNlCiAgICAgICAgKnBPdXRQY21bb3V0Q2hdID0gKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQodE91dFtvdXRDaF0sIERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLWRteFNjYWxlLCBTQU1QTEVfQklUUyk7CiNlbmRpZgogICAgICAgIHBPdXRQY21bb3V0Q2hdICs9IG91dFN0cmlkZTsKICAgICAgfQogICAgfQoKICAgIC8qIFVwZGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLwogICAgKm5DaGFubmVscyA9IG51bU91dENoYW5uZWxzOwoKICB9IC8qIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gKi8KICBlbHNlCiNlbmRpZiAvKiBQQ01fRE9XTk1JWF9FTkFCTEUgKi8KI2lmZGVmIFBDTV9DSEFOTkVMX0VYVEVOU0lPTl9FTkFCTEUKICBpZiAoIG51bUluQ2hhbm5lbHMgPCBudW1PdXRDaGFubmVscyApCiAgeyAvKiBBcHBseSBydWRpbWVudGFyeSB1cG1peCAqLwogICAgLyogU2V0IHVwIGNoYW5uZWwgcG9pbnRlciAqLwogICAgVUlOVCAgICAgc2FtcGxlOwogICAgVUNIQVIgICAgb3V0T2Zmc2V0VGFibGVbUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwoKICAgIC8qIEZJUlNUIFNUQUdFCiAgICAgICAgIENyZWF0ZSBhIHN0ZXJlby9kdWFsIGNoYW5uZWwgc2lnbmFsICovCiAgICBpZiAobnVtSW5DaGFubmVscyA9PSBPTkVfQ0hBTk5FTCkKICAgIHsKICAgICAgSU5UX1BDTSAgKnBJblBjbVtQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICAgIElOVF9QQ00gICpwT3V0TEYsICpwT3V0UkY7CgogICAgICAvKiBTZXQgdGhpcyBzdGFnZXMgb3V0cHV0IHN0cmlkZSBhbmQgY2hhbm5lbCBtb2RlOiAqLwogICAgICBvdXRTdHJpZGUgPSAoZkludGVybGVhdmVkKSA/IFRXT19DSEFOTkVMIDogMTsKICAgICAgb3V0Q2hNb2RlID0gb3V0Q2hNb2RlVGFibGVbVFdPX0NIQU5ORUxdOwoKICAgICAgLyogR2V0IGNoYW5uZWwgZGVzY3JpcHRpb24gYW5kIGNoYW5uZWwgbWFwcGluZyBmb3IgdGhpcwogICAgICAgKiBzdGFnZXMgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAoYWx3YXlzIFNURVJFTykuICovCiAgICAgIGdldENoYW5uZWxEZXNjcmlwdGlvbigKICAgICAgICAgICAgICBvdXRDaE1vZGUsCiAgICAgICAgICAgICAgY2hhbm5lbE1hcHBpbmcsCiAgICAgICAgICAgICAgY2hhbm5lbFR5cGUsCiAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXMsCiAgICAgICAgICAgICAgb3V0T2Zmc2V0VGFibGUKICAgICAgICAgICAgICk7CiAgICAgIC8qIE5vdyB0aGVyZSBpcyBubyB3YXkgYmFjayBiZWNhdXNlIHdlIG1vZGlmaWVkIHRoZSBjaGFubmVsIGNvbmZpZ3VyYXRpb24hICovCgogICAgICAvKiBTZXQgaW5wdXQgY2hhbm5lbCBwb2ludGVyLiBUaGUgZmlyc3QgY2hhbm5lbCBpcyBhbHdheXMgYXQgaW5kZXggMC4gKi8KICAgICAgcEluUGNtW0NFTlRFUl9GUk9OVF9DSEFOTkVMXSA9ICZwUGNtQnVmWyhmcmFtZVNpemUtMSkqaW5TdHJpZGVdOyAgLyogQ29uc2lkZXJpbmcgaW5wdXQgbWFwcGluZyBjb3VsZCBsZWFkIHRvIGEgaW52YWxpZCBwb2ludGVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlcmUgaWYgdGhlIGNoYW5uZWwgaXMgbm90IGRlY2xhcmVkIHRvIGJlIGEgZnJvbnQgY2hhbm5lbC4gKi8KCiAgICAgIC8qIFNldCBvdXRwdXQgY2hhbm5lbCBwb2ludGVyIChmb3IgdGhpcyBzdGFnZSkuICovCiAgICAgIHBPdXRMRiA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW0xFRlRfRlJPTlRfQ0hBTk5FTF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKICAgICAgcE91dFJGID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbUklHSFRfRlJPTlRfQ0hBTk5FTF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKCiAgICAgIC8qIDEvMCBpbnB1dDogKi8KICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CiAgICAgICAgLyogTCcgPSBDOyAgUicgPSBDOyAqLwogICAgICAgICpwT3V0TEYgPSAqcE91dFJGID0gKnBJblBjbVtDRU5URVJfRlJPTlRfQ0hBTk5FTF07CgogICAgICAgIHBJblBjbVtDRU5URVJfRlJPTlRfQ0hBTk5FTF0gLT0gaW5TdHJpZGU7CiAgICAgICAgcE91dExGIC09IG91dFN0cmlkZTsgcE91dFJGIC09IG91dFN0cmlkZTsKICAgICAgfQoKICAgICAgLyogUHJlcGFyZSBmb3IgbmV4dCBzdGFnZTogKi8KICAgICAgaW5TdHJpZGUgPSBvdXRTdHJpZGU7CiAgICAgIGluQ2hNb2RlID0gb3V0Q2hNb2RlOwogICAgICBGREttZW1jcHkoaW5PZmZzZXRUYWJsZSwgb3V0T2Zmc2V0VGFibGUsIFBDTV9ETVhfTUFYX0NIQU5ORUxTKnNpemVvZihVQ0hBUikpOwogICAgfQoKI2lmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPiAyKQogICAgLyogU0VDT05EIFNUQUdFCiAgICAgICAgIEV4dGVuZCB3aXRoIHplcm8gY2hhbm5lbHMgdG8gYWNoaWV2ZWQgdGhlIGRlc2lyZWQgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscy4gKi8KICAgIGlmIChudW1PdXRDaGFubmVscyA+IFRXT19DSEFOTkVMKQogICAgewogICAgICBJTlRfUENNICpwSW5bUENNX0RNWF9NQVhfQ0hBTk5FTFNdICA9IHsgTlVMTCB9OwogICAgICBJTlRfUENNICpwT3V0W1BDTV9ETVhfTUFYX0NIQU5ORUxTXSA9IHsgTlVMTCB9OwogICAgICBBVURJT19DSEFOTkVMX1RZUEUgIGluQ2hUeXBlc1tQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICAgIFVDSEFSICAgIGluQ2hJbmRpY2VzW1BDTV9ETVhfTUFYX0NIQU5ORUxTXTsKICAgICAgVUNIQVIgICAgbnVtQ2hQZXJHcnBbMl1bUENNX0RNWF9NQVhfQ0hBTk5FTF9HUk9VUFNdOwogICAgICBpbnQgICAgICBuQ29udGVudENoID0gMDsgIC8qIE51bWJlciBvZiBjaGFubmVscyB3aXRoIGNvbnRlbnQgKi8KICAgICAgaW50ICAgICAgbkVtcHR5Q2ggPSAwOyAgICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgd2l0aCBjb250ZW50ICovCiAgICAgIGludCAgICAgIGNoLCBjaEdycCwgaXNDb21wYXRpYmxlID0gMTsKCiAgICAgIC8qIERvIG5vdCBjaGFuZ2UgdGhlIHNpZ25hbGxpbmcgd2hpY2ggaXMgdGhlIGNoYW5uZWwgdHlwZXMgYW5kIGluZGljZXMuCiAgICAgICAgIEp1c3QgcmVvcmRlciBhbmQgYWRkIGNoYW5uZWxzLiBTbyBmaXJzdCBzYXZlIHRoZSBpbnB1dCBzaWduYWxsaW5nLiAqLwogICAgICBGREttZW1jcHkoaW5DaFR5cGVzLCBjaGFubmVsVHlwZSwgUENNX0RNWF9NQVhfQ0hBTk5FTFMqc2l6ZW9mKEFVRElPX0NIQU5ORUxfVFlQRSkpOwogICAgICBGREttZW1jcHkoaW5DaEluZGljZXMsIGNoYW5uZWxJbmRpY2VzLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKCiAgICAgIC8qIFNldCB0aGlzIHN0YWdlcyBvdXRwdXQgc3RyaWRlIGFuZCBjaGFubmVsIG1vZGU6ICovCiAgICAgIG91dFN0cmlkZSA9IChmSW50ZXJsZWF2ZWQpID8gbnVtT3V0Q2hhbm5lbHMgOiAxOwogICAgICBvdXRDaE1vZGUgPSBvdXRDaE1vZGVUYWJsZVtudW1PdXRDaGFubmVsc107CgogICAgICAvKiBDaGVjayBpZiBpbnB1dCBjaGFubmVsIGNvbmZpZyBjYW4gYmUgZWFzaWx5IG1hcHBlZCB0byB0aGUgZGVzaXJlZCBvdXRwdXQgY29uZmlnLiAqLwogICAgICBmb3IgKGNoR3JwID0gMDsgY2hHcnAgPCBQQ01fRE1YX01BWF9DSEFOTkVMX0dST1VQUzsgY2hHcnAgKz0gMSkgewogICAgICAgIG51bUNoUGVyR3JwW0lOXVtjaEdycF0gPSAoaW5DaE1vZGUgPj4gKGNoR3JwKjQpKSAmIDB4RjsKICAgICAgICBudW1DaFBlckdycFtPVVRdW2NoR3JwXSA9IChvdXRDaE1vZGUgPj4gKGNoR3JwKjQpKSAmIDB4RjsKCiAgICAgICAgaWYgKG51bUNoUGVyR3JwW0lOXVtjaEdycF0gPiBudW1DaFBlckdycFtPVVRdW2NoR3JwXSkgewogICAgICAgICAgaXNDb21wYXRpYmxlID0gMDsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKCBpc0NvbXBhdGlibGUgKSB7CiAgICAgICAgLyogR2V0IG5ldyBjaGFubmVsIGRlc2NyaXB0aW9uIGFuZCBjaGFubmVsCiAgICAgICAgICogbWFwcGluZyBmb3IgdGhlIGRlc2lyZWQgb3V0cHV0IGNoYW5uZWwgbW9kZS4gKi8KICAgICAgICBnZXRDaGFubmVsRGVzY3JpcHRpb24oCiAgICAgICAgICAgICAgICBvdXRDaE1vZGUsCiAgICAgICAgICAgICAgICBjaGFubmVsTWFwcGluZywKICAgICAgICAgICAgICAgIGNoYW5uZWxUeXBlLAogICAgICAgICAgICAgICAgY2hhbm5lbEluZGljZXMsCiAgICAgICAgICAgICAgICBvdXRPZmZzZXRUYWJsZQogICAgICAgICAgICAgICApOwogICAgICAgIC8qIElmIHRoZSBpbnB1dCBjb25maWcgaGFzIGEgYmFjayBjZW50ZXIgY2hhbm5lbCBidXQgdGhlIG91dHB1dAogICAgICAgICAgIGNvbmZpZyBoYXMgbm90LCBjb3B5IGl0IHRvIGxlZnQgYW5kIHJpZ2h0IChpZiBhdmFpbGFibGUpLiAqLwogICAgICAgIGlmICggIChudW1DaFBlckdycFtJTl1bQ0hfR1JPVVBfUkVBUl0lMikKICAgICAgICAgICYmICEobnVtQ2hQZXJHcnBbT1VUXVtDSF9HUk9VUF9SRUFSXSUyKSApIHsKICAgICAgICAgIGlmIChudW1DaFBlckdycFtJTl1bQ0hfR1JPVVBfUkVBUl0gPT0gMSkgewogICAgICAgICAgICBpbk9mZnNldFRhYmxlW1JJR0hUX1JFQVJfQ0hBTk5FTF0gPSBpbk9mZnNldFRhYmxlW0xFRlRfUkVBUl9DSEFOTkVMXTsKICAgICAgICAgIH0gZWxzZSBpZiAobnVtQ2hQZXJHcnBbSU5dW0NIX0dST1VQX1JFQVJdID09IDMpIHsKICAgICAgICAgICAgaW5PZmZzZXRUYWJsZVtSSUdIVF9NVUxUSVBSUFNfQ0hBTk5FTF0gPSBpbk9mZnNldFRhYmxlW0xFRlRfTVVMVElQUlBTX0NIQU5ORUxdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBlbHNlIHsKICAgICAgICAvKiBKdXN0IGNvcHkgYW5kIGV4dGVuZCB0aGUgb3JpZ2luYWwgY29uZmlnICovCiAgICAgICAgRkRLbWVtY3B5KG91dE9mZnNldFRhYmxlLCBpbk9mZnNldFRhYmxlLCBQQ01fRE1YX01BWF9DSEFOTkVMUypzaXplb2YoVUNIQVIpKTsKICAgICAgfQoKICAgICAgLyogU2V0IEkvTyBjaGFubmVsIHBvaW50ZXIuCiAgICAgICAgIE5vdGU6IFRoZSBmb2xsb3dpbmcgYXNzaWdubWVudCBhbGdvcml0aG0gY2xlYXJzIHRoZSBjaGFubmVsIG9mZnNldCB0YWJsZXMuCiAgICAgICAgICAgICAgIFRodXMgdGhleSBjYW4gbm90IGJlIHVzZWQgYWZ0ZXJ3YXJkcy4gKi8KICAgICAgZm9yIChjaCA9IDA7IGNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoKz0xKSB7CiAgICAgICAgaWYgKCAob3V0T2Zmc2V0VGFibGVbY2hdIDwgMjU1KQogICAgICAgICAgJiYgKGluT2Zmc2V0VGFibGVbY2hdIDwgMjU1KSApCiAgICAgICAgeyAvKiBTZXQgSS9PIHBvaW50ZXI6ICovCiAgICAgICAgICBwSW5bbkNvbnRlbnRDaF0gPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW2NoXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSppblN0cmlkZV07CiAgICAgICAgICBwT3V0W25Db250ZW50Q2hdID0gJnBQY21CdWZbb3V0T2Zmc2V0VGFibGVbY2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKm91dFN0cmlkZV07CiAgICAgICAgICAvKiBVcGRhdGUgc2lnbmFsbGluZyAqLwogICAgICAgICAgY2hhbm5lbFR5cGVbb3V0T2Zmc2V0VGFibGVbY2hdXSA9IGluQ2hUeXBlc1tpbk9mZnNldFRhYmxlW2NoXV07CiAgICAgICAgICBjaGFubmVsSW5kaWNlc1tvdXRPZmZzZXRUYWJsZVtjaF1dID0gaW5DaEluZGljZXNbaW5PZmZzZXRUYWJsZVtjaF1dOwogICAgICAgICAgaW5PZmZzZXRUYWJsZVtjaF0gPSAyNTU7CiAgICAgICAgICBvdXRPZmZzZXRUYWJsZVtjaF0gPSAyNTU7CiAgICAgICAgICBuQ29udGVudENoICs9IDE7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmICggaXNDb21wYXRpYmxlICkgewogICAgICAgIC8qIEFzc2lnbiB0aGUgcmVtYWluaW5nIGlucHV0IGNoYW5uZWxzLgogICAgICAgICAgIFRoaXMgaXMganVzdCBhIHNhZmV0eSBhcHBsaWFuY2UuIFdlIHNob3VsZCBuZXZlciBuZWVkIGl0LiAqLwogICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IFBDTV9ETVhfTUFYX0NIQU5ORUxTOyBjaCs9MSkgewogICAgICAgICAgaWYgKGluT2Zmc2V0VGFibGVbY2hdIDwgMjU1KSB7CiAgICAgICAgICAgIGludCAgb3V0Q2g7CiAgICAgICAgICAgIGZvciAob3V0Q2ggPSAwIDsgb3V0Q2ggPCBQQ01fRE1YX01BWF9DSEFOTkVMUzsgb3V0Q2ggKz0gMSkgewogICAgICAgICAgICAgIGlmIChvdXRPZmZzZXRUYWJsZVtvdXRDaF0gPCAyNTUpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBTZXQgSS9PIHBvaW50ZXI6ICovCiAgICAgICAgICAgIHBJbltuQ29udGVudENoXSA9ICZwUGNtQnVmW2luT2Zmc2V0VGFibGVbY2hdKm9mZnNldCsoZnJhbWVTaXplLTEpKmluU3RyaWRlXTsKICAgICAgICAgICAgcE91dFtuQ29udGVudENoXSA9ICZwUGNtQnVmW291dE9mZnNldFRhYmxlW291dENoXSpvZmZzZXQrKGZyYW1lU2l6ZS0xKSpvdXRTdHJpZGVdOwogICAgICAgICAgICAvKiBVcGRhdGUgc2lnbmFsbGluZyAqLwogICAgICAgICAgICBjaGFubmVsVHlwZVtvdXRPZmZzZXRUYWJsZVtvdXRDaF1dID0gaW5DaFR5cGVzW2luT2Zmc2V0VGFibGVbY2hdXTsKICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbb3V0T2Zmc2V0VGFibGVbb3V0Q2hdXSA9IGluQ2hJbmRpY2VzW2luT2Zmc2V0VGFibGVbY2hdXTsKICAgICAgICAgICAgaW5PZmZzZXRUYWJsZVtjaF0gPSAyNTU7CiAgICAgICAgICAgIG91dE9mZnNldFRhYmxlW291dENoXSA9IDI1NTsKICAgICAgICAgICAgbkNvbnRlbnRDaCArPSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiBTZXQgdGhlIHJlbWFpbmluZyBvdXRwdXQgY2hhbm5lbCBwb2ludGVyICovCiAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgUENNX0RNWF9NQVhfQ0hBTk5FTFM7IGNoKz0xKSB7CiAgICAgICAgICBpZiAob3V0T2Zmc2V0VGFibGVbY2hdIDwgMjU1KSB7CiAgICAgICAgICAgIHBPdXRbbkNvbnRlbnRDaCtuRW1wdHlDaF0gPSAmcFBjbUJ1ZltvdXRPZmZzZXRUYWJsZVtjaF0qb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKICAgICAgICAgICAgLyogRXhwYW5kIG91dHB1dCBzaWduYWxsaW5nICovCiAgICAgICAgICAgIGNoYW5uZWxUeXBlW291dE9mZnNldFRhYmxlW2NoXV0gPSBBQ1RfTk9ORTsKICAgICAgICAgICAgY2hhbm5lbEluZGljZXNbb3V0T2Zmc2V0VGFibGVbY2hdXSA9IG5FbXB0eUNoOwogICAgICAgICAgICBvdXRPZmZzZXRUYWJsZVtjaF0gPSAyNTU7CiAgICAgICAgICAgIG5FbXB0eUNoICs9IDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGVsc2UgewogICAgICAgIC8qIFNldCB0aGUgcmVtYWluaW5nIG91dHB1dCBjaGFubmVsIHBvaW50ZXIgKi8KICAgICAgICBmb3IgKGNoID0gbkNvbnRlbnRDaDsgY2ggPCBudW1PdXRDaGFubmVsczsgY2grPTEpIHsKICAgICAgICAgIHBPdXRbY2hdID0gJnBQY21CdWZbY2gqb2Zmc2V0KyhmcmFtZVNpemUtMSkqb3V0U3RyaWRlXTsKICAgICAgICAgIC8qIEV4cGFuZCBvdXRwdXQgc2lnbmFsbGluZyAqLwogICAgICAgICAgY2hhbm5lbFR5cGVbY2hdID0gQUNUX05PTkU7CiAgICAgICAgICBjaGFubmVsSW5kaWNlc1tjaF0gPSBuRW1wdHlDaDsKICAgICAgICAgIG5FbXB0eUNoICs9IDE7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiBGaXJzdCBjb3B5IHRoZSBjaGFubmVscyB0aGF0IGhhdmUgc2lnbmFsICovCiAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrPTEpIHsKICAgICAgICBJTlRfUENNIHRJbltQQ01fRE1YX01BWF9DSEFOTkVMU107CiAgICAgICAgLyogUmVhZCBhbGwgY2hhbm5lbCBzYW1wbGVzICovCiAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgbkNvbnRlbnRDaDsgY2grPTEpIHsKICAgICAgICAgIHRJbltjaF0gPSAqcEluW2NoXTsKICAgICAgICAgIHBJbltjaF0gLT0gaW5TdHJpZGU7CiAgICAgICAgfQogICAgICAgIC8qIFdyaXRlIGFsbCBjaGFubmVsIHNhbXBsZXMgKi8KICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBuQ29udGVudENoOyBjaCs9MSkgewogICAgICAgICAgKnBPdXRbY2hdID0gdEluW2NoXTsKICAgICAgICAgIHBPdXRbY2hdIC09IG91dFN0cmlkZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIENsZWFyIGFsbCB0aGUgb3RoZXIgY2hhbm5lbHMgKi8KICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CiAgICAgICAgZm9yIChjaCA9IG5Db250ZW50Q2g7IGNoIDwgbnVtT3V0Q2hhbm5lbHM7IGNoKz0xKSB7CiAgICAgICAgICAqcE91dFtjaF0gPSAoSU5UX1BDTSkwOwogICAgICAgICAgcE91dFtjaF0gLT0gb3V0U3RyaWRlOwogICAgICAgIH0KICAgICAgfQogICAgfQojZW5kaWYgIC8qIGlmIChQQ01fRE1YX01BWF9PVVRfQ0hBTk5FTFMgPiAyKSAqLwoKICAgIC8qIHVwZGF0ZSB0aGUgbnVtYmVyIG9mIG91dHB1dCBjaGFubmVscyAqLwogICAgKm5DaGFubmVscyA9IG51bU91dENoYW5uZWxzOwogIH0gLyogLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAtIC0gLSAqLwogIGVsc2UKI2VuZGlmIC8qIFBDTV9DSEFOTkVMX0VYVEVOU0lPTl9FTkFCTEUgKi8KICBpZiAoIG51bUluQ2hhbm5lbHMgPT0gbnVtT3V0Q2hhbm5lbHMgKQogIHsKICAgIC8qIERvbid0IG5lZWQgdG8gY2hhbmdlIHRoZSBjaGFubmVsIGRlc2NyaXB0aW9uIGhlcmUgKi8KCiAgICBzd2l0Y2ggKG51bUluQ2hhbm5lbHMpCiAgICB7CiAgICBjYXNlIDI6CiAgICAgIHsgLyogU2V0IHVwIGNoYW5uZWwgcG9pbnRlciAqLwogICAgICAgIElOVF9QQ00gICpwSW5QY21bUENNX0RNWF9NQVhfQ0hBTk5FTFNdOwogICAgICAgIElOVF9QQ00gICpwT3V0TCwgKnBPdXRSOwogICAgICAgIEZJWFBfRE1YICBmbGV2OwoKICAgICAgICBVSU5UIHNhbXBsZTsKICAgICAgICBpbnQgaW5TdHJpZGUsIG91dFN0cmlkZSwgb2Zmc2V0OwoKICAgICAgICBpZiAoZkludGVybGVhdmVkKSB7CiAgICAgICAgICBpblN0cmlkZSAgPSBudW1JbkNoYW5uZWxzOwogICAgICAgICAgb3V0U3RyaWRlID0gMjsgIC8qIGZpeGVkICEhISAoYmVsb3cgc3RlcmVvIGlzIGRvbndtaXhlZCB0byBtb25vIGlmIHJlcXVpcmVkICovCiAgICAgICAgICBvZmZzZXQgPSAxOyAvKiBDaGFubmVsIHNwZWNpZmljIG9mZnNldCBmYWN0b3IgKi8KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaW5TdHJpZGUgID0gMTsKICAgICAgICAgIG91dFN0cmlkZSA9IDE7CiAgICAgICAgICBvZmZzZXQgPSBmcmFtZVNpemU7ICAvKiBDaGFubmVsIHNwZWNpZmljIG9mZnNldCBmYWN0b3IgKi8KICAgICAgICB9CgogICAgICAgIC8qIFNldCBpbnB1dCBjaGFubmVsIHBvaW50ZXIgKi8KICAgICAgICBwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSAgPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW0xFRlRfRlJPTlRfQ0hBTk5FTF0qb2Zmc2V0XTsKICAgICAgICBwSW5QY21bUklHSFRfRlJPTlRfQ0hBTk5FTF0gPSAmcFBjbUJ1Zltpbk9mZnNldFRhYmxlW1JJR0hUX0ZST05UX0NIQU5ORUxdKm9mZnNldF07CgogICAgICAgIC8qIFNldCBvdXRwdXQgY2hhbm5lbCBwb2ludGVyIChzYW1lIGFzIGlucHV0KSAqLwogICAgICAgIHBPdXRMICA9ICBwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXTsKICAgICAgICBwT3V0UiAgPSAgcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdOwoKICAgICAgICAvKiBTZXQgZG93bm1peCBsZXZlbHM6ICovCiAgICAgICAgZmxldiA9IEZMMkZYQ09OU1RfRE1YKDAuNzA3MTA2NzhmKTsKICAgICAgICAvKiAyLzAgaW5wdXQ6ICovCiAgICAgICAgc3dpdGNoIChkdWFsQ2hhbm5lbE1vZGUpCiAgICAgICAgewogICAgICAgIGNhc2UgQ0gxX01PREU6ICAvKiBMJyA9IDAuNzA3ICogQ2gxOyAgUicgPSAwLjcwNyAqIENoMSAqLwogICAgICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CiAgICAgICAgICAgICpwT3V0TCA9ICpwT3V0UiA9CiAgICAgICAgICAgICAgKElOVF9QQ00pU0FUVVJBVEVfUklHSFRfU0hJRlQoZk11bHQoKEZJWFBfUENNKSpwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSwgZmxldiksIERGUkFDVF9CSVRTLVNBTVBMRV9CSVRTLCBTQU1QTEVfQklUUyk7CgogICAgICAgICAgICBwSW5QY21bTEVGVF9GUk9OVF9DSEFOTkVMXSArPSBpblN0cmlkZTsKICAgICAgICAgICAgcE91dEwgKz0gb3V0U3RyaWRlOyBwT3V0UiArPSBvdXRTdHJpZGU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIENIMl9NT0RFOiAgLyogTCcgPSAwLjcwNyAqIENoMjsgIFInID0gMC43MDcgKiBDaDIgKi8KICAgICAgICAgIGZvciAoc2FtcGxlID0gMDsgc2FtcGxlIDwgZnJhbWVTaXplOyBzYW1wbGUrKykgewogICAgICAgICAgICAqcE91dEwgPSAqcE91dFIgPQogICAgICAgICAgICAgIChJTlRfUENNKVNBVFVSQVRFX1JJR0hUX1NISUZUKGZNdWx0KChGSVhQX1BDTSkqcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdLCBmbGV2KSwgREZSQUNUX0JJVFMtU0FNUExFX0JJVFMsIFNBTVBMRV9CSVRTKTsKCiAgICAgICAgICAgIHBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSArPSBpblN0cmlkZTsKICAgICAgICAgICAgcE91dEwgKz0gb3V0U3RyaWRlOyBwT3V0UiArPSBvdXRTdHJpZGU7CiAgICAgICAgICB9CiAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIE1JWEVEX01PREU6ICAvKiBMJyA9IDAuNSpDaDEgKyAwLjUqQ2gyOyAgUicgPSAwLjUqQ2gxICsgMC41KkNoMiAqLwogICAgICAgICAgZm9yIChzYW1wbGUgPSAwOyBzYW1wbGUgPCBmcmFtZVNpemU7IHNhbXBsZSsrKSB7CiAgICAgICAgICAgICpwT3V0TCA9ICpwT3V0UiA9ICgqcEluUGNtW0xFRlRfRlJPTlRfQ0hBTk5FTF0gPj4gMSkgKyAoKnBJblBjbVtSSUdIVF9GUk9OVF9DSEFOTkVMXSA+PiAxKTsKCiAgICAgICAgICAgIHBJblBjbVtMRUZUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOyAgcEluUGNtW1JJR0hUX0ZST05UX0NIQU5ORUxdICs9IGluU3RyaWRlOwogICAgICAgICAgICBwT3V0TCArPSBvdXRTdHJpZGU7IHBPdXRSICs9IG91dFN0cmlkZTsKICAgICAgICAgIH0KICAgICAgICAgIGJyZWFrOwogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgY2FzZSBTVEVSRU9fTU9ERToKICAgICAgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAvKiBub3RoaW5nIHRvIGRvICovCiAgICAgIGJyZWFrOwogICAgfQogIH0KCiAgcmV0dXJuIChlcnJvclN0YXR1cyk7Cn0KCgovKiogQ2xvc2UgYW4gaW5zdGFuY2Ugb2YgdGhlIFBDTSBkb3dubWl4IG1vZHVsZS4KICogQHBhcmFtIFtpbm91dF0gUG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZSBoYW5kbGUgb2YgdGhlIGluc3RhbmNlLgogKiBAcmV0dXJucyBSZXR1cm5zIGFuIGVycm9yIGNvZGUuCiAqKi8KUENNRE1YX0VSUk9SIHBjbURteF9DbG9zZSAoCiAgICBIQU5ETEVfUENNX0RPV05NSVggKnBTZWxmCiAgKQp7CiAgaWYgKHBTZWxmID09IE5VTEwpIHsKICAgIHJldHVybiAoUENNRE1YX0lOVkFMSURfSEFORExFKTsKICB9CgogIEZyZWVQY21EbXhJbnN0YW5jZSggcFNlbGYgKTsKICAqcFNlbGYgPSBOVUxMOwoKICByZXR1cm4gKFBDTURNWF9PSyk7Cn0KCgovKiogR2V0IGxpYnJhcnkgaW5mbyBmb3IgdGhpcyBtb2R1bGUuCiAqIEBwYXJhbSBbb3V0XSBQb2ludGVyIHRvIGFuIGFsbG9jYXRlZCBMSUJfSU5GTyBzdHJ1Y3R1cmUuCiAqIEByZXR1cm5zIFJldHVybnMgYW4gZXJyb3IgY29kZS4KICovClBDTURNWF9FUlJPUiBwY21EbXhfR2V0TGliSW5mbyggTElCX0lORk8gKmluZm8gKQp7CiAgaW50IGk7CgogIGlmIChpbmZvID09IE5VTEwpIHsKICAgIHJldHVybiBQQ01ETVhfSU5WQUxJRF9BUkdVTUVOVDsKICB9CgogIC8qIFNlYXJjaCBmb3IgbmV4dCBmcmVlIHRhYiAqLwogIGZvciAoaSA9IDA7IGkgPCBGREtfTU9EVUxFX0xBU1Q7IGkrKykgewogICAgaWYgKGluZm9baV0ubW9kdWxlX2lkID09IEZES19OT05FKSBicmVhazsKICB9CiAgaWYgKGkgPT0gRkRLX01PRFVMRV9MQVNUKSB7CiAgICByZXR1cm4gUENNRE1YX1VOS05PV047CiAgfQoKICAvKiBBZGQgdGhlIGxpYnJhcnkgaW5mbyAqLwogIGluZm9baV0ubW9kdWxlX2lkICA9IEZES19QQ01ETVg7CiAgaW5mb1tpXS52ZXJzaW9uICAgID0gTElCX1ZFUlNJT04oUENNRE1YX0xJQl9WTDAsIFBDTURNWF9MSUJfVkwxLCBQQ01ETVhfTElCX1ZMMik7CiAgTElCX1ZFUlNJT05fU1RSSU5HKGluZm8raSk7CiAgaW5mb1tpXS5idWlsZF9kYXRlID0gUENNRE1YX0xJQl9CVUlMRF9EQVRFOwogIGluZm9baV0uYnVpbGRfdGltZSA9IFBDTURNWF9MSUJfQlVJTERfVElNRTsKICBpbmZvW2ldLnRpdGxlICAgICAgPSBQQ01ETVhfTElCX1RJVExFOwoKICAvKiBTZXQgZmxhZ3MgKi8KICBpbmZvW2ldLmZsYWdzID0gMAojaWZkZWYgUENNX0RPV05NSVhfRU5BQkxFCiAgICAgIHwgQ0FQRl9ETVhfQkxJTkQgICAvKiBBdCBsZWFzdCBibGluZCBkb3dubWl4aW5nIGlzIHBvc3NpYmxlICovCiAjaWZkZWYgUENFX01FVEFEQVRBX0VOQUJMRQogICAgICB8IENBUEZfRE1YX1BDRSAgICAgLyogR3VpZGVkIGRvd25taXggd2l0aCBkYXRhIGZyb20gTVBFRy0yLzQgUHJvZ3JhbSBDb25maWcgRWxlbWVudHMgKFBDRSkuICovCiAgI2lmZGVmIEFSSUJfTUlYRE9XTl9FTkFCTEUKICAgICAgfCBDQVBGX0RNWF9BUklCICAgIC8qIFBDRSBndWlkZWQgZG93bm1peCB3aXRoIHNsaWdodGx5IGRpZmZlcmVudCBlcXVhdGlvbnMgYW5kIGxldmVscy4gKi8KICAjZW5kaWYKICNlbmRpZiAvKiBQQ0VfTUVUQURBVEFfRU5BQkxFICovCiAjaWZkZWYgRFNFX01FVEFEQVRBX0VOQUJMRQogICAgICB8IENBUEZfRE1YX0RWQiAgICAgLyogR3VpZGVkIGRvd25taXggd2l0aCBkYXRhIGZyb20gRFZCIGFuY2lsbGFyeSBkYXRhIGZpZWxkcy4gKi8KICNlbmRpZgojZW5kaWYgLyogUENNX0RPV05NSVhfRU5BQkxFICovCiNpZmRlZiBQQ01fQ0hBTk5FTF9FWFRFTlNJT05fRU5BQkxFCiAgICAgIHwgQ0FQRl9ETVhfQ0hfRVhQICAvKiBTaW1wbGUgdXBtaXhpbmcgYnkgZHVibGljYXRpbmcgY2hhbm5lbHMgb3IgYWRkaW5nIHplcm8gY2hhbm5lbHMuICovCiNlbmRpZgogICAgICA7CgogIC8qIEFkZCBsaWIgaW5mbyBmb3IgRkRLIHRvb2xzIChpZiBub3QgeWV0IGRvbmUpLiAqLwogIEZES190b29sc0dldExpYkluZm8oaW5mbyk7CgogIHJldHVybiBQQ01ETVhfT0s7Cn0KCgoK