Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogIE1QRUcgQXVkaW8gRW5jb2RlciAgKioqKioqKioqKioqKioqKioqKioqKioqKioqCgogICBJbml0aWFsIGF1dGhvcjogICAgICAgTi4gUmV0dGVsYmFjaAogICBjb250ZW50cy9kZXNjcmlwdGlvbjogUGFyYW1ldHJpYyBTdGVyZW8gYml0c3RyZWFtIGVuY29kZXIKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJwc19tYWluLmgiCgoKI2luY2x1ZGUgInBzX2NvbnN0LmgiCiNpbmNsdWRlICJwc19iaXRlbmMuaCIKCnN0YXRpYwppbmxpbmUgVUNIQVIgRkRLc2JyRW5jX1dyaXRlQml0c19wcyhIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0U3RyZWFtLCBVSU5UIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBVSU5UIG51bWJlck9mQml0cykKewogIC8qIGhCaXRTdHJlYW0gPT0gTlVMTCBoYXBwZW5zIGhlcmUgaW50ZW50aW9uYWxseSAqLwogIGlmKGhCaXRTdHJlYW0hPU5VTEwpewogICAgRkRLd3JpdGVCaXRzKGhCaXRTdHJlYW0sIHZhbHVlLCBudW1iZXJPZkJpdHMpOwogIH0KICByZXR1cm4gbnVtYmVyT2ZCaXRzOwp9CgojZGVmaW5lIFNJX1NCUl9FWFRFTlNJT05fU0laRV9CSVRTICAgICAgICAgICAgICA0CiNkZWZpbmUgU0lfU0JSX0VYVEVOU0lPTl9FU0NfQ09VTlRfQklUUyAgICAgICAgIDgKI2RlZmluZSBTSV9TQlJfRVhURU5TSU9OX0lEX0JJVFMgICAgICAgICAgICAgICAgMgojZGVmaW5lIEVYVEVOU0lPTl9JRF9QU19DT0RJTkcgICAgICAgICAgICAgICAgICAyCiNkZWZpbmUgUFNfRVhUX0lEX1YwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAKCnN0YXRpYyBjb25zdCBJTlQgaWlkRGVsdGFDb2Fyc2VfT2Zmc2V0ID0gMTQ7CnN0YXRpYyBjb25zdCBJTlQgaWlkRGVsdGFDb2Fyc2VfTWF4VmFsID0gMjg7CnN0YXRpYyBjb25zdCBJTlQgaWlkRGVsdGFGaW5lX09mZnNldCA9IDMwOwpzdGF0aWMgY29uc3QgSU5UIGlpZERlbHRhRmluZV9NYXhWYWwgPSA2MDsKCi8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGlpZERlbHRhRnJlcUNvYXJzZSAqLwpzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YUZyZXFDb2Fyc2VfTGVuZ3RoW10gPQp7CiAgMTcsICAgIDE3LCAgICAxNywgICAgMTcsICAgIDE2LCAgMTUsICAgIDEzLCAgICAxMCwgICAgIDksICAgICA3LAogICA2LCAgICAgNSwgICAgIDQsICAgICAzLCAgICAgMSwgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNiwKICAgOCwgICAgMTEsICAgIDEzLCAgICAxNCwgICAgMTQsICAxNSwgICAgMTcsICAgIDE4LCAgICAxOAp9OwpzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YUZyZXFDb2Fyc2VfQ29kZVtdICA9CnsKICAweDAwMDFmZmZiLCAgMHgwMDAxZmZmYywgIDB4MDAwMWZmZmQsICAweDAwMDFmZmZhLCAgMHgwMDAwZmZmYywgIDB4MDAwMDdmZmMsICAweDAwMDAxZmZkLCAgMHgwMDAwMDNmZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwMDdlLAogIDB4MDAwMDAwM2MsICAweDAwMDAwMDFkLCAgMHgwMDAwMDAwZCwgIDB4MDAwMDAwMDUsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwNCwgIDB4MDAwMDAwMGMsICAweDAwMDAwMDFjLCAgMHgwMDAwMDAzZCwgIDB4MDAwMDAwM2UsCiAgMHgwMDAwMDBmZSwgIDB4MDAwMDA3ZmUsICAweDAwMDAxZmZjLCAgMHgwMDAwM2ZmYywgIDB4MDAwMDNmZmQsICAweDAwMDA3ZmZkLCAgMHgwMDAxZmZmZSwgIDB4MDAwM2ZmZmUsICAweDAwMDNmZmZmCn07CgovKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpaWREZWx0YUZyZXFGaW5lICovCnN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhRnJlcUZpbmVfTGVuZ3RoW10gPQp7CiAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE4LCAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsICAgIDE3LAogIDE4LCAgICAxNywgICAgMTcsICAgIDE2LCAgICAxNiwgIDE1LCAgICAxNCwgICAgMTQsICAgIDEzLCAgICAxMiwKICAxMiwgICAgMTEsICAgIDEwLCAgICAxMCwgICAgIDgsICAgNywgICAgIDYsICAgICA1LCAgICAgNCwgICAgIDMsCiAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LCAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAogIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNCwgIDE1LCAgICAxNiwgICAgMTYsICAgIDE3LCAgICAxNywKICAxOCwgICAgMTcsICAgIDE4LCAgICAxOCwgICAgMTgsICAxOCwgICAgMTgsICAgIDE4LCAgICAxOCwgICAgMTgsCiAgMTgKfTsKc3RhdGljIGNvbnN0IFVJTlQgaWlkRGVsdGFGcmVxRmluZV9Db2RlW10gPQp7CiAgMHgwMDAxZmViNCwgIDB4MDAwMWZlYjUsICAweDAwMDFmZDc2LCAgMHgwMDAxZmQ3NywgIDB4MDAwMWZkNzQsICAweDAwMDFmZDc1LCAgMHgwMDAxZmU4YSwgIDB4MDAwMWZlOGIsICAweDAwMDFmZTg4LCAgMHgwMDAwZmU4MCwKICAweDAwMDFmZWI2LCAgMHgwMDAwZmU4MiwgIDB4MDAwMGZlYjgsICAweDAwMDA3ZjQyLCAgMHgwMDAwN2ZhZSwgIDB4MDAwMDNmYWYsICAweDAwMDAxZmQxLCAgMHgwMDAwMWZlOSwgIDB4MDAwMDBmZTksICAweDAwMDAwN2VhLAogIDB4MDAwMDA3ZmIsICAweDAwMDAwM2ZiLCAgMHgwMDAwMDFmYiwgIDB4MDAwMDAxZmYsICAweDAwMDAwMDdjLCAgMHgwMDAwMDAzYywgIDB4MDAwMDAwMWMsICAweDAwMDAwMDBjLCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDEsCiAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwZCwgIDB4MDAwMDAwMWQsICAweDAwMDAwMDNkLCAgMHgwMDAwMDA3ZCwgIDB4MDAwMDAwZmMsICAweDAwMDAwMWZjLCAgMHgwMDAwMDNmYywKICAweDAwMDAwM2Y0LCAgMHgwMDAwMDdlYiwgIDB4MDAwMDBmZWEsICAweDAwMDAxZmVhLCAgMHgwMDAwMWZkNiwgIDB4MDAwMDNmZDAsICAweDAwMDA3ZmFmLCAgMHgwMDAwN2Y0MywgIDB4MDAwMGZlYjksICAweDAwMDBmZTgzLAogIDB4MDAwMWZlYjcsICAweDAwMDBmZTgxLCAgMHgwMDAxZmU4OSwgIDB4MDAwMWZlOGUsICAweDAwMDFmZThmLCAgMHgwMDAxZmU4YywgIDB4MDAwMWZlOGQsICAweDAwMDFmZWIyLCAgMHgwMDAxZmViMywgIDB4MDAwMWZlYjAsCiAgMHgwMDAxZmViMQp9OwoKLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaWlkRGVsdGFUaW1lQ29hcnNlICovCnN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUNvYXJzZV9MZW5ndGhbXSA9CnsKICAxOSwgICAgMTksICAgIDE5LCAgICAyMCwgICAgMjAsICAyMCwgICAgMTcsICAgIDE1LCAgICAxMiwgICAgMTAsCiAgIDgsICAgICA2LCAgICAgNCwgICAgIDIsICAgICAxLCAgIDMsICAgICA1LCAgICAgNywgICAgIDksICAgIDExLAogIDEzLCAgICAxNCwgICAgMTcsICAgIDE5LCAgICAyMCwgIDIwLCAgICAyMCwgICAgMjAsICAgIDIwCn07CnN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUNvYXJzZV9Db2RlW10gPQp7CiAgMHgwMDA3ZmZmOSwgIDB4MDAwN2ZmZmEsICAweDAwMDdmZmZiLCAgMHgwMDBmZmZmOCwgIDB4MDAwZmZmZjksICAweDAwMGZmZmZhLCAgMHgwMDAxZmZmZCwgIDB4MDAwMDdmZmUsICAweDAwMDAwZmZlLCAgMHgwMDAwMDNmZSwKICAweDAwMDAwMGZlLCAgMHgwMDAwMDAzZSwgIDB4MDAwMDAwMGUsICAweDAwMDAwMDAyLCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDYsICAweDAwMDAwMDFlLCAgMHgwMDAwMDA3ZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwN2ZlLAogIDB4MDAwMDFmZmUsICAweDAwMDAzZmZlLCAgMHgwMDAxZmZmYywgIDB4MDAwN2ZmZjgsICAweDAwMGZmZmZiLCAgMHgwMDBmZmZmYywgIDB4MDAwZmZmZmQsICAweDAwMGZmZmZlLCAgMHgwMDBmZmZmZgp9OwoKLyogUFMgU3RlcmVvIEh1ZmZtYW50YWJsZTogaWlkRGVsdGFUaW1lRmluZSAqLwpzdGF0aWMgY29uc3QgVUlOVCBpaWREZWx0YVRpbWVGaW5lX0xlbmd0aFtdID0KewogIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgICAxNiwgIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgICAxNSwKICAxNSwgICAgMTUsICAgIDE1LCAgICAxNSwgICAgMTUsICAxNCwgICAgMTQsICAgIDEzLCAgICAxMywgICAgMTMsCiAgMTIsICAgIDEyLCAgICAxMSwgICAgMTAsICAgICA5LCAgIDksICAgICA3LCAgICAgNiwgICAgIDUsICAgICAzLAogICAxLCAgICAgMiwgICAgIDUsICAgICA2LCAgICAgNywgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMSwKICAxMiwgICAgMTIsICAgIDEzLCAgICAxMywgICAgMTQsICAxNCwgICAgMTUsICAgIDE1LCAgICAxNSwgICAgMTUsCiAgMTYsICAgIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LCAgMTYsICAgIDE2LCAgICAxNiwgICAgMTYsICAgIDE2LAogIDE2Cn07CnN0YXRpYyBjb25zdCBVSU5UIGlpZERlbHRhVGltZUZpbmVfQ29kZVtdID0KewogIDB4MDAwMDRlZDQsICAweDAwMDA0ZWQ1LCAgMHgwMDAwNGVjZSwgIDB4MDAwMDRlY2YsICAweDAwMDA0ZWNjLCAgMHgwMDAwNGVkNiwgIDB4MDAwMDRlZDgsICAweDAwMDA0ZjQ2LCAgMHgwMDAwNGY2MCwgIDB4MDAwMDI3MTgsCiAgMHgwMDAwMjcxOSwgIDB4MDAwMDI3NjQsICAweDAwMDAyNzY1LCAgMHgwMDAwMjc2ZCwgIDB4MDAwMDI3YjEsICAweDAwMDAxM2I3LCAgMHgwMDAwMTNkNiwgIDB4MDAwMDA5YzcsICAweDAwMDAwOWU5LCAgMHgwMDAwMDllZCwKICAweDAwMDAwNGVlLCAgMHgwMDAwMDRmNywgIDB4MDAwMDAyNzgsICAweDAwMDAwMTM5LCAgMHgwMDAwMDA5YSwgIDB4MDAwMDAwOWYsICAweDAwMDAwMDIwLCAgMHgwMDAwMDAxMSwgIDB4MDAwMDAwMGEsICAweDAwMDAwMDAzLAogIDB4MDAwMDAwMDEsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwYiwgIDB4MDAwMDAwMTIsICAweDAwMDAwMDIxLCAgMHgwMDAwMDA0YywgIDB4MDAwMDAwOWIsICAweDAwMDAwMTNhLCAgMHgwMDAwMDI3OSwgIDB4MDAwMDAyNzAsCiAgMHgwMDAwMDRlZiwgIDB4MDAwMDA0ZTIsICAweDAwMDAwOWVhLCAgMHgwMDAwMDlkOCwgIDB4MDAwMDEzZDcsICAweDAwMDAxM2QwLCAgMHgwMDAwMjdiMiwgIDB4MDAwMDI3YTIsICAweDAwMDAyNzFhLCAgMHgwMDAwMjcxYiwKICAweDAwMDA0ZjY2LCAgMHgwMDAwNGY2NywgIDB4MDAwMDRmNjEsICAweDAwMDA0ZjQ3LCAgMHgwMDAwNGVkOSwgIDB4MDAwMDRlZDcsICAweDAwMDA0ZWNkLCAgMHgwMDAwNGVkMiwgIDB4MDAwMDRlZDMsICAweDAwMDA0ZWQwLAogIDB4MDAwMDRlZDEKfTsKCnN0YXRpYyBjb25zdCBJTlQgaWNjRGVsdGFfT2Zmc2V0ID0gIDc7CnN0YXRpYyBjb25zdCBJTlQgaWNjRGVsdGFfTWF4VmFsID0gMTQ7Ci8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGljY0RlbHRhRnJlcSAqLwpzdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YUZyZXFfTGVuZ3RoW10gPQp7CiAgMTQsICAgIDE0LCAgICAxMiwgICAgMTAsICAgICA3LCAgIDUsICAgICAzLCAgICAgMSwgICAgIDIsICAgICA0LAogICA2LCAgICAgOCwgICAgIDksICAgIDExLCAgICAxMwp9OwpzdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YUZyZXFfQ29kZVtdID0KewogIDB4MDAwMDNmZmYsICAweDAwMDAzZmZlLCAgMHgwMDAwMGZmZSwgIDB4MDAwMDAzZmUsICAweDAwMDAwMDdlLCAgMHgwMDAwMDAxZSwgIDB4MDAwMDAwMDYsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMGUsCiAgMHgwMDAwMDAzZSwgIDB4MDAwMDAwZmUsICAweDAwMDAwMWZlLCAgMHgwMDAwMDdmZSwgIDB4MDAwMDFmZmUKfTsKCi8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGljY0RlbHRhVGltZSAqLwpzdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YVRpbWVfTGVuZ3RoW10gPQp7CiAgMTQsICAgIDEzLCAgICAxMSwgICAgIDksICAgICA3LCAgIDUsICAgICAzLCAgICAgMSwgICAgIDIsICAgICA0LAogICA2LCAgICAgOCwgICAgMTAsICAgIDEyLCAgICAxNAp9OwpzdGF0aWMgY29uc3QgVUlOVCBpY2NEZWx0YVRpbWVfQ29kZVtdID0KewogIDB4MDAwMDNmZmUsICAweDAwMDAxZmZlLCAgMHgwMDAwMDdmZSwgIDB4MDAwMDAxZmUsICAweDAwMDAwMDdlLCAgMHgwMDAwMDAxZSwgIDB4MDAwMDAwMDYsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMGUsCiAgMHgwMDAwMDAzZSwgIDB4MDAwMDAwZmUsICAweDAwMDAwM2ZlLCAgMHgwMDAwMGZmZSwgIDB4MDAwMDNmZmYKfTsKCgoKc3RhdGljIGNvbnN0IElOVCBpcGREZWx0YV9PZmZzZXQgPSAwOwpzdGF0aWMgY29uc3QgSU5UIGlwZERlbHRhX01heFZhbCA9IDc7Ci8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IGlwZERlbHRhRnJlcSAqLwpzdGF0aWMgY29uc3QgVUlOVCBpcGREZWx0YUZyZXFfTGVuZ3RoW10gPQp7CiAgIDEsICAgICAzLCAgICAgNCwgICAgIDQsICAgICA0LCAgIDQsICAgICA0LCAgICAgNAp9OwpzdGF0aWMgY29uc3QgVUlOVCBpcGREZWx0YUZyZXFfQ29kZVtdID0KewogIDB4MDAwMDAwMDEsICAwMDAwMDAwMDAwLCAgMHgwMDAwMDAwNiwgIDB4MDAwMDAwMDQsICAweDAwMDAwMDAyLCAgMHgwMDAwMDAwMywgIDB4MDAwMDAwMDUsICAweDAwMDAwMDA3Cn07CgovKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBpcGREZWx0YVRpbWUgKi8Kc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFUaW1lX0xlbmd0aFtdID0KewogICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNSwgICA0LCAgICAgNCwgICAgIDMKfTsKc3RhdGljIGNvbnN0IFVJTlQgaXBkRGVsdGFUaW1lX0NvZGVbXSA9CnsKICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwMiwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAzLCAgMHgwMDAwMDAwMiwgIDAwMDAwMDAwMDAsICAweDAwMDAwMDAzLCAgMHgwMDAwMDAwMwp9OwoKCnN0YXRpYyBjb25zdCBJTlQgb3BkRGVsdGFfT2Zmc2V0ID0gMDsKc3RhdGljIGNvbnN0IElOVCBvcGREZWx0YV9NYXhWYWwgPSA3OwovKiBQUyBTdGVyZW8gSHVmZm1hbnRhYmxlOiBvcGREZWx0YUZyZXEgKi8Kc3RhdGljIGNvbnN0IFVJTlQgb3BkRGVsdGFGcmVxX0xlbmd0aFtdID0KewogICAxLCAgICAgMywgICAgIDQsICAgICA0LCAgICAgNSwgICA1LCAgICAgNCwgICAgIDMKfTsKc3RhdGljIGNvbnN0IFVJTlQgb3BkRGVsdGFGcmVxX0NvZGVbXSA9CnsKICAweDAwMDAwMDAxLCAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDYsICAweDAwMDAwMDA0LCAgMHgwMDAwMDAwZiwgIDB4MDAwMDAwMGUsICAweDAwMDAwMDA1LCAgMDAwMDAwMDAwMCwKfTsKCi8qIFBTIFN0ZXJlbyBIdWZmbWFudGFibGU6IG9wZERlbHRhVGltZSAqLwpzdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YVRpbWVfTGVuZ3RoW10gPQp7CiAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA1LCAgIDQsICAgICA0LCAgICAgMwp9OwpzdGF0aWMgY29uc3QgVUlOVCBvcGREZWx0YVRpbWVfQ29kZVtdID0KewogIDB4MDAwMDAwMDEsICAweDAwMDAwMDAyLCAgMHgwMDAwMDAwMSwgIDB4MDAwMDAwMDcsICAweDAwMDAwMDA2LCAgMDAwMDAwMDAwMCwgIDB4MDAwMDAwMDIsICAweDAwMDAwMDAzCn07CgpzdGF0aWMgY29uc3QgSU5UIHBzQmFuZHNbXSA9CnsKICBQU19CQU5EU19DT0FSU0UsCiAgUFNfQkFORFNfTUlECn07CgpzdGF0aWMgSU5UIGdldE5vQmFuZHMoUFNfUkVTT0xVVElPTiBtb2RlKQp7CiAgaWYobW9kZT49NikKICAgIHJldHVybiAwOwoKICBpZihtb2RlPj0zKQogICAgbW9kZSA9IChQU19SRVNPTFVUSU9OKShtb2RlLTMpOwoKICByZXR1cm4gcHNCYW5kc1ttb2RlXTsKfQoKc3RhdGljIElOVCBnZXRJSURSZXMoSU5UIGlpZE1vZGUpCnsKICBpZihpaWRNb2RlPDMpCiAgICByZXR1cm4gUFNfSUlEX1JFU19DT0FSU0U7CiAgZWxzZQogICAgcmV0dXJuIFBTX0lJRF9SRVNfRklORTsKfQoKc3RhdGljIElOVAplbmNvZGVEZWx0YUZyZXEoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwKICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAqdmFsLAogICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBuQmFuZHMsCiAgICAgICAgICAgICAgICBjb25zdCBVSU5UICpjb2RlVGFibGUsCiAgICAgICAgICAgICAgICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZSwKICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgdGFibGVPZmZzZXQsCiAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG1heFZhbCwKICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAqZXJyb3IpCnsKICBJTlQgYml0Q250ID0gMDsKICBJTlQgbGFzdFZhbCA9IDA7CiAgSU5UIGJhbmQ7CgogIGZvcihiYW5kPTA7YmFuZDxuQmFuZHM7YmFuZCsrKSB7CiAgICBJTlQgZGVsdGEgPSAodmFsW2JhbmRdIC0gbGFzdFZhbCkgKyB0YWJsZU9mZnNldDsKICAgIGxhc3RWYWwgPSB2YWxbYmFuZF07CiAgICBpZiggKGRlbHRhPm1heFZhbCkgfHwgKGRlbHRhPDApICkgewogICAgICAqZXJyb3IgPSAxOwogICAgICBkZWx0YSA9IGRlbHRhPjA/bWF4VmFsOjA7CiAgICB9CiAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCBjb2RlVGFibGVbZGVsdGFdLCBsZW5ndGhUYWJsZVtkZWx0YV0pOwogIH0KCiAgcmV0dXJuIGJpdENudDsKfQoKc3RhdGljIElOVAplbmNvZGVEZWx0YVRpbWUoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwKICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAqdmFsLAogICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICp2YWxMYXN0LAogICAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICBuQmFuZHMsCiAgICAgICAgICAgICAgICBjb25zdCBVSU5UICpjb2RlVGFibGUsCiAgICAgICAgICAgICAgICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZSwKICAgICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgdGFibGVPZmZzZXQsCiAgICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgICAgIG1heFZhbCwKICAgICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAqZXJyb3IpCnsKICBJTlQgYml0Q250ID0gMDsKICBJTlQgYmFuZDsKCiAgZm9yKGJhbmQ9MDtiYW5kPG5CYW5kcztiYW5kKyspIHsKICAgIElOVCBkZWx0YSA9ICh2YWxbYmFuZF0gLSB2YWxMYXN0W2JhbmRdKSArIHRhYmxlT2Zmc2V0OwogICAgaWYoIChkZWx0YT5tYXhWYWwpIHx8IChkZWx0YTwwKSApIHsKICAgICAgKmVycm9yID0gMTsKICAgICAgZGVsdGEgPSBkZWx0YT4wP21heFZhbDowOwogICAgfQogICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgY29kZVRhYmxlW2RlbHRhXSwgbGVuZ3RoVGFibGVbZGVsdGFdKTsKICB9CgogIHJldHVybiBiaXRDbnQ7Cn0KCklOVCBGREtzYnJFbmNfRW5jb2RlSWlkKEhBTkRMRV9GREtfQklUU1RSRUFNICAgICBoQml0QnVmLAogICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICAgICAgICAgICppaWRWYWwsCiAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgKmlpZFZhbExhc3QsCiAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgICAgICAgICAgIG5CYW5kcywKICAgICAgICAgICAgICBjb25zdCBQU19JSURfUkVTT0xVVElPTiAgcmVzLAogICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICAgICAgICAgICBtb2RlLAogICAgICAgICAgICAgIElOVCAgICAgICAgICAgICAgICAgICAgICplcnJvcikKewogIGNvbnN0IFVJTlQgKmNvZGVUYWJsZTsKICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZTsKICBJTlQgYml0Q250ID0gMDsKCiAgYml0Q250ID0gMDsKCiAgc3dpdGNoKG1vZGUpIHsKICBjYXNlIFBTX0RFTFRBX0ZSRVE6CiAgICBzd2l0Y2gocmVzKSB7CiAgICBjYXNlIFBTX0lJRF9SRVNfQ09BUlNFOgogICAgICBjb2RlVGFibGUgICA9IGlpZERlbHRhRnJlcUNvYXJzZV9Db2RlOwogICAgICBsZW5ndGhUYWJsZSA9IGlpZERlbHRhRnJlcUNvYXJzZV9MZW5ndGg7CiAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1ZiwgaWlkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWlkRGVsdGFDb2Fyc2VfT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpZERlbHRhQ29hcnNlX01heFZhbCwgZXJyb3IpOwogICAgYnJlYWs7CiAgICBjYXNlIFBTX0lJRF9SRVNfRklORToKICAgICAgY29kZVRhYmxlICAgPSBpaWREZWx0YUZyZXFGaW5lX0NvZGU7CiAgICAgIGxlbmd0aFRhYmxlID0gaWlkRGVsdGFGcmVxRmluZV9MZW5ndGg7CiAgICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1ZiwgaWlkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWlkRGVsdGFGaW5lX09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWREZWx0YUZpbmVfTWF4VmFsLCBlcnJvcik7CiAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgICplcnJvciA9IDE7CiAgICB9CiAgICBicmVhazsKCiAgY2FzZSBQU19ERUxUQV9USU1FOgogICAgc3dpdGNoKHJlcykgewogICAgY2FzZSBQU19JSURfUkVTX0NPQVJTRToKICAgICAgY29kZVRhYmxlICAgPSBpaWREZWx0YVRpbWVDb2Fyc2VfQ29kZTsKICAgICAgbGVuZ3RoVGFibGUgPSBpaWREZWx0YVRpbWVDb2Fyc2VfTGVuZ3RoOwogICAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIGlpZFZhbCwgaWlkVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGlpZERlbHRhQ29hcnNlX09mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaWREZWx0YUNvYXJzZV9NYXhWYWwsIGVycm9yKTsKICAgIGJyZWFrOwogICAgY2FzZSBQU19JSURfUkVTX0ZJTkU6CiAgICAgIGNvZGVUYWJsZSAgID0gaWlkRGVsdGFUaW1lRmluZV9Db2RlOwogICAgICBsZW5ndGhUYWJsZSA9IGlpZERlbHRhVGltZUZpbmVfTGVuZ3RoOwogICAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIGlpZFZhbCwgaWlkVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGlpZERlbHRhRmluZV9PZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkRGVsdGFGaW5lX01heFZhbCwgZXJyb3IpOwogICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICAqZXJyb3IgPSAxOwogICAgfQogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICAqZXJyb3IgPSAxOwogIH0KCiAgcmV0dXJuIGJpdENudDsKfQoKCklOVCBGREtzYnJFbmNfRW5jb2RlSWNjKEhBTkRMRV9GREtfQklUU1RSRUFNIGhCaXRCdWYsCiAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmljY1ZhbCwKICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqaWNjVmFsTGFzdCwKICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAgbkJhbmRzLAogICAgICAgICAgICAgIGNvbnN0IFBTX0RFTFRBICBtb2RlLAogICAgICAgICAgICAgIElOVCAgICAgICAgICAgICplcnJvcikKewogIGNvbnN0IFVJTlQgKmNvZGVUYWJsZTsKICBjb25zdCBVSU5UICpsZW5ndGhUYWJsZTsKICBJTlQgYml0Q250ID0gMDsKCiAgc3dpdGNoKG1vZGUpIHsKICBjYXNlIFBTX0RFTFRBX0ZSRVE6CiAgICBjb2RlVGFibGUgICA9IGljY0RlbHRhRnJlcV9Db2RlOwogICAgbGVuZ3RoVGFibGUgPSBpY2NEZWx0YUZyZXFfTGVuZ3RoOwogICAgYml0Q250ICs9IGVuY29kZURlbHRhRnJlcShoQml0QnVmLCBpY2NWYWwsIG5CYW5kcywgY29kZVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgaWNjRGVsdGFfT2Zmc2V0LCBpY2NEZWx0YV9NYXhWYWwsIGVycm9yKTsKICAgIGJyZWFrOwoKICBjYXNlIFBTX0RFTFRBX1RJTUU6CiAgICBjb2RlVGFibGUgICA9IGljY0RlbHRhVGltZV9Db2RlOwogICAgbGVuZ3RoVGFibGUgPSBpY2NEZWx0YVRpbWVfTGVuZ3RoOwoKICAgIGJpdENudCArPSBlbmNvZGVEZWx0YVRpbWUoaEJpdEJ1ZiwgaWNjVmFsLCBpY2NWYWxMYXN0LCBuQmFuZHMsIGNvZGVUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGljY0RlbHRhX09mZnNldCwgaWNjRGVsdGFfTWF4VmFsLCBlcnJvcik7CiAgICBicmVhazsKCiAgZGVmYXVsdDoKICAgICplcnJvciA9IDE7CiAgfQoKICByZXR1cm4gYml0Q250Owp9CgpJTlQgRkRLc2JyRW5jX0VuY29kZUlwZChIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmLAogICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICppcGRWYWwsCiAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgKmlwZFZhbExhc3QsCiAgICAgICAgICAgICAgY29uc3QgSU5UICAgICAgIG5CYW5kcywKICAgICAgICAgICAgICBjb25zdCBQU19ERUxUQSAgbW9kZSwKICAgICAgICAgICAgICBJTlQgICAgICAgICAgICAqZXJyb3IpCnsKICBjb25zdCBVSU5UICpjb2RlVGFibGU7CiAgY29uc3QgVUlOVCAqbGVuZ3RoVGFibGU7CiAgSU5UIGJpdENudCA9IDA7CgogIHN3aXRjaChtb2RlKSB7CiAgY2FzZSBQU19ERUxUQV9GUkVROgogICAgY29kZVRhYmxlICAgPSBpcGREZWx0YUZyZXFfQ29kZTsKICAgIGxlbmd0aFRhYmxlID0gaXBkRGVsdGFGcmVxX0xlbmd0aDsKICAgIGJpdENudCArPSBlbmNvZGVEZWx0YUZyZXEoaEJpdEJ1ZiwgaXBkVmFsLCBuQmFuZHMsIGNvZGVUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoVGFibGUsIGlwZERlbHRhX09mZnNldCwgaXBkRGVsdGFfTWF4VmFsLCBlcnJvcik7CiAgICBicmVhazsKCiAgY2FzZSBQU19ERUxUQV9USU1FOgogICAgY29kZVRhYmxlICAgPSBpcGREZWx0YVRpbWVfQ29kZTsKICAgIGxlbmd0aFRhYmxlID0gaXBkRGVsdGFUaW1lX0xlbmd0aDsKCiAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFUaW1lKGhCaXRCdWYsIGlwZFZhbCwgaXBkVmFsTGFzdCwgbkJhbmRzLCBjb2RlVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBpcGREZWx0YV9PZmZzZXQsIGlwZERlbHRhX01heFZhbCwgZXJyb3IpOwogICAgYnJlYWs7CgogIGRlZmF1bHQ6CiAgICAqZXJyb3IgPSAxOwogIH0KCiAgcmV0dXJuIGJpdENudDsKfQoKSU5UIEZES3NickVuY19FbmNvZGVPcGQoSEFORExFX0ZES19CSVRTVFJFQU0gaEJpdEJ1ZiwKICAgICAgICAgICAgICBjb25zdCBJTlQgICAgICAqb3BkVmFsLAogICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICpvcGRWYWxMYXN0LAogICAgICAgICAgICAgIGNvbnN0IElOVCAgICAgICBuQmFuZHMsCiAgICAgICAgICAgICAgY29uc3QgUFNfREVMVEEgIG1vZGUsCiAgICAgICAgICAgICAgSU5UICAgICAgICAgICAgKmVycm9yKQp7CiAgY29uc3QgVUlOVCAqY29kZVRhYmxlOwogIGNvbnN0IFVJTlQgKmxlbmd0aFRhYmxlOwogIElOVCBiaXRDbnQgPSAwOwoKICBzd2l0Y2gobW9kZSkgewogIGNhc2UgUFNfREVMVEFfRlJFUToKICAgIGNvZGVUYWJsZSAgID0gb3BkRGVsdGFGcmVxX0NvZGU7CiAgICBsZW5ndGhUYWJsZSA9IG9wZERlbHRhRnJlcV9MZW5ndGg7CiAgICBiaXRDbnQgKz0gZW5jb2RlRGVsdGFGcmVxKGhCaXRCdWYsIG9wZFZhbCwgbkJhbmRzLCBjb2RlVGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aFRhYmxlLCBvcGREZWx0YV9PZmZzZXQsIG9wZERlbHRhX01heFZhbCwgZXJyb3IpOwogICAgYnJlYWs7CgogIGNhc2UgUFNfREVMVEFfVElNRToKICAgIGNvZGVUYWJsZSAgID0gb3BkRGVsdGFUaW1lX0NvZGU7CiAgICBsZW5ndGhUYWJsZSA9IG9wZERlbHRhVGltZV9MZW5ndGg7CgogICAgYml0Q250ICs9IGVuY29kZURlbHRhVGltZShoQml0QnVmLCBvcGRWYWwsIG9wZFZhbExhc3QsIG5CYW5kcywgY29kZVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhUYWJsZSwgb3BkRGVsdGFfT2Zmc2V0LCBvcGREZWx0YV9NYXhWYWwsIGVycm9yKTsKICAgIGJyZWFrOwoKICBkZWZhdWx0OgogICAgKmVycm9yID0gMTsKICB9CgogIHJldHVybiBiaXRDbnQ7Cn0KCnN0YXRpYyBJTlQgZW5jb2RlSXBkT3BkKEhBTkRMRV9QU19PVVQgICAgICAgIHBzT3V0LAogICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSBoQml0QnVmICkKewogIElOVCBiaXRDbnQgPSAwOwogIElOVCBlcnJvciAgPSAwOwogIElOVCBlbnY7CgogIEZES3NickVuY19Xcml0ZUJpdHNfcHMoaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZUlwZE9wZCwgMSk7CgogIGlmKHBzT3V0LT5lbmFibGVJcGRPcGQ9PTEpIHsKICAgIElOVCAqaXBkTGFzdCA9IHBzT3V0LT5pcGRMYXN0OwogICAgSU5UICpvcGRMYXN0ID0gcHNPdXQtPm9wZExhc3Q7CgogICAgZm9yKGVudj0wOyBlbnY8cHNPdXQtPm5FbnZlbG9wZXM7IGVudisrKSB7CiAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZGVsdGFJUERbZW52XSwgMSk7CiAgICAgIGJpdENudCArPSBGREtzYnJFbmNfRW5jb2RlSXBkKCBoQml0QnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+aXBkW2Vudl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwZExhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vQmFuZHMoKFBTX1JFU09MVVRJT04pcHNPdXQtPmlpZE1vZGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+ZGVsdGFJUERbZW52XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKCiAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZGVsdGFPUERbZW52XSwgMSk7CiAgICAgIGJpdENudCArPSBGREtzYnJFbmNfRW5jb2RlT3BkKCBoQml0QnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+b3BkW2Vudl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wZExhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5vQmFuZHMoKFBTX1JFU09MVVRJT04pcHNPdXQtPmlpZE1vZGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+ZGVsdGFPUERbZW52XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yICk7CiAgICB9CiAgICAvKiByZXNlcnZlZCBiaXQgKi8KICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCAwLCAxKTsKICB9CgoKICByZXR1cm4gYml0Q250Owp9CgpzdGF0aWMgSU5UIGdldEVudklkeChjb25zdCBJTlQgbkVudmVsb3BlcywgY29uc3QgSU5UIGZyYW1lQ2xhc3MpCnsKICBJTlQgZW52SWR4ID0gMDsKCiAgc3dpdGNoKG5FbnZlbG9wZXMpIHsKICBjYXNlIDA6CiAgICBlbnZJZHggPSAwOwogICAgYnJlYWs7CgogIGNhc2UgMToKICAgIGlmIChmcmFtZUNsYXNzPT0wKQogICAgICBlbnZJZHggPSAxOwogICAgZWxzZQogICAgICBlbnZJZHggPSAwOwogICAgYnJlYWs7CgogIGNhc2UgMjoKICAgIGlmIChmcmFtZUNsYXNzPT0wKQogICAgICBlbnZJZHggPSAyOwogICAgZWxzZQogICAgICBlbnZJZHggPSAxOwogICAgYnJlYWs7CgogIGNhc2UgMzoKICAgIGVudklkeCA9IDI7CiAgICBicmVhazsKCiAgY2FzZSA0OgogICAgZW52SWR4ID0gMzsKICAgIGJyZWFrOwoKICBkZWZhdWx0OgogICAgLyogdW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGVudmVsb3BlcyAqLwogICAgZW52SWR4ID0gMDsKICB9CgogIHJldHVybiBlbnZJZHg7Cn0KCgpzdGF0aWMgSU5UIGVuY29kZVBTRXh0ZW5zaW9uKGNvbnN0IEhBTkRMRV9QU19PVVQgICBwc091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkRLX0JJVFNUUkVBTSAgaEJpdEJ1ZiApCnsKICBJTlQgYml0Q250ID0gMDsKCiAgaWYocHNPdXQtPmVuYWJsZUlwZE9wZD09MSkgewogICAgSU5UIGlwZE9wZEJpdHMgPSAwOwogICAgSU5UIGV4dFNpemUgPSAoMiArIGVuY29kZUlwZE9wZChwc091dCxOVUxMKSs3KT4+MzsKCiAgICBpZihleHRTaXplPDE1KSB7CiAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsICBleHRTaXplLCA0KTsKICAgIH0KICAgIGVsc2UgewogICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCAgICAgICAgICAxNSAsIDQpOwogICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyhoQml0QnVmLCAoZXh0U2l6ZS0xNSksIDgpOwogICAgfQoKICAgIC8qIHdyaXRlIGlwZCBvcGQgZGF0YSAqLwogICAgaXBkT3BkQml0cyArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIFBTX0VYVF9JRF9WMCwgMik7CiAgICBpcGRPcGRCaXRzICs9IGVuY29kZUlwZE9wZChwc091dCwgaEJpdEJ1ZiApOwoKICAgIC8qIGJ5dGUgYWxpZ24gdGhlIGlwZCBvcGQgZGF0YSAgKi8KICAgIGlmKGlwZE9wZEJpdHMlOCkKICAgICAgaXBkT3BkQml0cyArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKGhCaXRCdWYsIDAsICg4LShpcGRPcGRCaXRzJTgpKSApOwoKICAgIGJpdENudCArPSBpcGRPcGRCaXRzOwogIH0KCiAgcmV0dXJuIChiaXRDbnQpOwp9CgpJTlQgRkRLc2JyRW5jX1dyaXRlUFNCaXRzdHJlYW0oY29uc3QgSEFORExFX1BTX09VVCAgIHBzT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEFORExFX0ZES19CSVRTVFJFQU0gIGhCaXRCdWYgKQp7CiAgSU5UIHBzRXh0RW5hYmxlID0gMDsKICBJTlQgYml0Q250ID0gMDsKICBJTlQgZXJyb3IgPSAwOwogIElOVCBlbnY7CgogIGlmKHBzT3V0ICE9IE5VTEwpewoKICAgIC8qIFBTIEhFQURFUiAqLwogICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5lbmFibGVQU0hlYWRlciwgMSk7CgogICAgaWYocHNPdXQtPmVuYWJsZVBTSGVhZGVyKSB7CgogICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmVuYWJsZUlJRCwgMSk7CiAgICAgIGlmKHBzT3V0LT5lbmFibGVJSUQpIHsKICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmlpZE1vZGUsIDMpOwogICAgICB9CiAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZW5hYmxlSUNDLCAxKTsKICAgICAgaWYocHNPdXQtPmVuYWJsZUlDQykgewogICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+aWNjTW9kZSwgMyk7CiAgICAgIH0KICAgICAgaWYocHNPdXQtPmVuYWJsZUlwZE9wZCkgewogICAgICAgIHBzRXh0RW5hYmxlID0gMTsKICAgICAgfQogICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNFeHRFbmFibGUsIDEpOwogICAgfQoKICAgIC8qIEZyYW1lIGNsYXNzLCBudW1iZXIgb2YgZW52ZWxvcGVzICovCiAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmZyYW1lQ2xhc3MsIDEpOwogICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIGdldEVudklkeChwc091dC0+bkVudmVsb3BlcywgcHNPdXQtPmZyYW1lQ2xhc3MpLCAyKTsKCiAgICBpZihwc091dC0+ZnJhbWVDbGFzcz09MSkgewogICAgICBmb3IoZW52PTA7IGVudjxwc091dC0+bkVudmVsb3BlczsgZW52KyspIHsKICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX1dyaXRlQml0c19wcyggaEJpdEJ1ZiwgcHNPdXQtPmZyYW1lQm9yZGVyW2Vudl0sIDUpOwogICAgICB9CiAgICB9CgogICAgaWYocHNPdXQtPmVuYWJsZUlJRD09MSkgewogICAgICBJTlQgKmlpZExhc3QgPSBwc091dC0+aWlkTGFzdDsKICAgICAgZm9yKGVudj0wOyBlbnY8cHNPdXQtPm5FbnZlbG9wZXM7IGVudisrKSB7CiAgICAgICAgYml0Q250ICs9IEZES3NickVuY19Xcml0ZUJpdHNfcHMoIGhCaXRCdWYsIHBzT3V0LT5kZWx0YUlJRFtlbnZdLCAxKTsKICAgICAgICBiaXRDbnQgKz0gRkRLc2JyRW5jX0VuY29kZUlpZCggaEJpdEJ1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+aWlkW2Vudl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWlkTGFzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXROb0JhbmRzKChQU19SRVNPTFVUSU9OKXBzT3V0LT5paWRNb2RlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoUFNfSUlEX1JFU09MVVRJT04pZ2V0SUlEUmVzKHBzT3V0LT5paWRNb2RlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc091dC0+ZGVsdGFJSURbZW52XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXJyb3IgKTsKCiAgICAgICAgaWlkTGFzdCA9IHBzT3V0LT5paWRbZW52XTsKICAgICAgfQogICAgfQoKICAgIGlmKHBzT3V0LT5lbmFibGVJQ0M9PTEpIHsKICAgICAgSU5UICppY2NMYXN0ID0gcHNPdXQtPmljY0xhc3Q7CiAgICAgIGZvcihlbnY9MDsgZW52PHBzT3V0LT5uRW52ZWxvcGVzOyBlbnYrKykgewogICAgICAgIGJpdENudCArPSBGREtzYnJFbmNfV3JpdGVCaXRzX3BzKCBoQml0QnVmLCBwc091dC0+ZGVsdGFJQ0NbZW52XSwgMSk7CiAgICAgICAgYml0Q250ICs9IEZES3NickVuY19FbmNvZGVJY2MoIGhCaXRCdWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNPdXQtPmljY1tlbnZdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljY0xhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Tm9CYW5kcygoUFNfUkVTT0xVVElPTilwc091dC0+aWNjTW9kZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNPdXQtPmRlbHRhSUNDW2Vudl0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yKTsKCiAgICAgICAgaWNjTGFzdCA9IHBzT3V0LT5pY2NbZW52XTsKICAgICAgfQogICAgfQoKICAgIGlmKHBzRXh0RW5hYmxlIT0wKSB7CiAgICAgIGJpdENudCArPSBlbmNvZGVQU0V4dGVuc2lvbihwc091dCwgaEJpdEJ1Zik7CiAgICB9CgogIH0gLyogaWYocHNPdXQgIT0gTlVMTCkgKi8KCiAgcmV0dXJuIGJpdENudDsKfQoK