Ci8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClNvZnR3YXJlIExpY2Vuc2UgZm9yIFRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZAoKqSBDb3B5cmlnaHQgIDE5OTUgLSAyMDEzIEZyYXVuaG9mZXItR2VzZWxsc2NoYWZ0IHp1ciBG9nJkZXJ1bmcgZGVyIGFuZ2V3YW5kdGVuIEZvcnNjaHVuZyBlLlYuCiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KCiAxLiAgICBJTlRST0RVQ1RJT04KVGhlIEZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkICgiRkRLIEFBQyBDb2RlYyIpIGlzIHNvZnR3YXJlIHRoYXQgaW1wbGVtZW50cwp0aGUgTVBFRyBBZHZhbmNlZCBBdWRpbyBDb2RpbmcgKCJBQUMiKSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgc2NoZW1lIGZvciBkaWdpdGFsIGF1ZGlvLgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBvbiBhIHdpZGUgdmFyaWV0eSBvZiBBbmRyb2lkIGRldmljZXMuCgpBQUMncyBIRS1BQUMgYW5kIEhFLUFBQyB2MiB2ZXJzaW9ucyBhcmUgcmVnYXJkZWQgYXMgdG9kYXkncyBtb3N0IGVmZmljaWVudCBnZW5lcmFsIHBlcmNlcHR1YWwKYXVkaW8gY29kZWNzLiBBQUMtRUxEIGlzIGNvbnNpZGVyZWQgdGhlIGJlc3QtcGVyZm9ybWluZyBmdWxsLWJhbmR3aWR0aCBjb21tdW5pY2F0aW9ucyBjb2RlYyBieQppbmRlcGVuZGVudCBzdHVkaWVzIGFuZCBpcyB3aWRlbHkgZGVwbG95ZWQuIEFBQyBoYXMgYmVlbiBzdGFuZGFyZGl6ZWQgYnkgSVNPIGFuZCBJRUMgYXMgcGFydApvZiB0aGUgTVBFRyBzcGVjaWZpY2F0aW9ucy4KClBhdGVudCBsaWNlbnNlcyBmb3IgbmVjZXNzYXJ5IHBhdGVudCBjbGFpbXMgZm9yIHRoZSBGREsgQUFDIENvZGVjIChpbmNsdWRpbmcgdGhvc2Ugb2YgRnJhdW5ob2ZlcikKbWF5IGJlIG9idGFpbmVkIHRocm91Z2ggVmlhIExpY2Vuc2luZyAod3d3LnZpYWxpY2Vuc2luZy5jb20pIG9yIHRocm91Z2ggdGhlIHJlc3BlY3RpdmUgcGF0ZW50IG93bmVycwppbmRpdmlkdWFsbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGVuY29kaW5nIG9yIGRlY29kaW5nIGJpdCBzdHJlYW1zIGluIHByb2R1Y3RzIHRoYXQgYXJlIGNvbXBsaWFudCB3aXRoCnRoZSBJU08vSUVDIE1QRUcgYXVkaW8gc3RhbmRhcmRzLiBQbGVhc2Ugbm90ZSB0aGF0IG1vc3QgbWFudWZhY3R1cmVycyBvZiBBbmRyb2lkIGRldmljZXMgYWxyZWFkeSBsaWNlbnNlCnRoZXNlIHBhdGVudCBjbGFpbXMgdGhyb3VnaCBWaWEgTGljZW5zaW5nIG9yIGRpcmVjdGx5IGZyb20gdGhlIHBhdGVudCBvd25lcnMsIGFuZCB0aGVyZWZvcmUgRkRLIEFBQyBDb2RlYwpzb2Z0d2FyZSBtYXkgYWxyZWFkeSBiZSBjb3ZlcmVkIHVuZGVyIHRob3NlIHBhdGVudCBsaWNlbnNlcyB3aGVuIGl0IGlzIHVzZWQgZm9yIHRob3NlIGxpY2Vuc2VkIHB1cnBvc2VzIG9ubHkuCgpDb21tZXJjaWFsbHktbGljZW5zZWQgQUFDIHNvZnR3YXJlIGxpYnJhcmllcywgaW5jbHVkaW5nIGZsb2F0aW5nLXBvaW50IHZlcnNpb25zIHdpdGggZW5oYW5jZWQgc291bmQgcXVhbGl0eSwKYXJlIGFsc28gYXZhaWxhYmxlIGZyb20gRnJhdW5ob2Zlci4gVXNlcnMgYXJlIGVuY291cmFnZWQgdG8gY2hlY2sgdGhlIEZyYXVuaG9mZXIgd2Vic2l0ZSBmb3IgYWRkaXRpb25hbAphcHBsaWNhdGlvbnMgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uCgoyLiAgICBDT1BZUklHSFQgTElDRU5TRQoKUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCB3aXRob3V0CnBheW1lbnQgb2YgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBwcm92aWRlZCB0aGF0IHlvdSBzYXRpc2Z5IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKCllvdSBtdXN0IHJldGFpbiB0aGUgY29tcGxldGUgdGV4dCBvZiB0aGlzIHNvZnR3YXJlIGxpY2Vuc2UgaW4gcmVkaXN0cmlidXRpb25zIG9mIHRoZSBGREsgQUFDIENvZGVjIG9yCnlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvIGluIHNvdXJjZSBjb2RlIGZvcm0uCgpZb3UgbXVzdCByZXRhaW4gdGhlIGNvbXBsZXRlIHRleHQgb2YgdGhpcyBzb2Z0d2FyZSBsaWNlbnNlIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMKcHJvdmlkZWQgd2l0aCByZWRpc3RyaWJ1dGlvbnMgb2YgdGhlIEZESyBBQUMgQ29kZWMgb3IgeW91ciBtb2RpZmljYXRpb25zIHRoZXJldG8gaW4gYmluYXJ5IGZvcm0uCllvdSBtdXN0IG1ha2UgYXZhaWxhYmxlIGZyZWUgb2YgY2hhcmdlIGNvcGllcyBvZiB0aGUgY29tcGxldGUgc291cmNlIGNvZGUgb2YgdGhlIEZESyBBQUMgQ29kZWMgYW5kIHlvdXIKbW9kaWZpY2F0aW9ucyB0aGVyZXRvIHRvIHJlY2lwaWVudHMgb2YgY29waWVzIGluIGJpbmFyeSBmb3JtLgoKVGhlIG5hbWUgb2YgRnJhdW5ob2ZlciBtYXkgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIGxpYnJhcnkgd2l0aG91dApwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCgpZb3UgbWF5IG5vdCBjaGFyZ2UgY29weXJpZ2h0IGxpY2Vuc2UgZmVlcyBmb3IgYW55b25lIHRvIHVzZSwgY29weSBvciBkaXN0cmlidXRlIHRoZSBGREsgQUFDIENvZGVjCnNvZnR3YXJlIG9yIHlvdXIgbW9kaWZpY2F0aW9ucyB0aGVyZXRvLgoKWW91ciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYyBtdXN0IGNhcnJ5IHByb21pbmVudCBub3RpY2VzIHN0YXRpbmcgdGhhdCB5b3UgY2hhbmdlZCB0aGUgc29mdHdhcmUKYW5kIHRoZSBkYXRlIG9mIGFueSBjaGFuZ2UuIEZvciBtb2RpZmllZCB2ZXJzaW9ucyBvZiB0aGUgRkRLIEFBQyBDb2RlYywgdGhlIHRlcm0KIkZyYXVuaG9mZXIgRkRLIEFBQyBDb2RlYyBMaWJyYXJ5IGZvciBBbmRyb2lkIiBtdXN0IGJlIHJlcGxhY2VkIGJ5IHRoZSB0ZXJtCiJUaGlyZC1QYXJ0eSBNb2RpZmllZCBWZXJzaW9uIG9mIHRoZSBGcmF1bmhvZmVyIEZESyBBQUMgQ29kZWMgTGlicmFyeSBmb3IgQW5kcm9pZC4iCgozLiAgICBOTyBQQVRFTlQgTElDRU5TRQoKTk8gRVhQUkVTUyBPUiBJTVBMSUVEIExJQ0VOU0VTIFRPIEFOWSBQQVRFTlQgQ0xBSU1TLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZSBwYXRlbnRzIG9mIEZyYXVuaG9mZXIsCkFSRSBHUkFOVEVEIEJZIFRISVMgU09GVFdBUkUgTElDRU5TRS4gRnJhdW5ob2ZlciBwcm92aWRlcyBubyB3YXJyYW50eSBvZiBwYXRlbnQgbm9uLWluZnJpbmdlbWVudCB3aXRoCnJlc3BlY3QgdG8gdGhpcyBzb2Z0d2FyZS4KCllvdSBtYXkgdXNlIHRoaXMgRkRLIEFBQyBDb2RlYyBzb2Z0d2FyZSBvciBtb2RpZmljYXRpb25zIHRoZXJldG8gb25seSBmb3IgcHVycG9zZXMgdGhhdCBhcmUgYXV0aG9yaXplZApieSBhcHByb3ByaWF0ZSBwYXRlbnQgbGljZW5zZXMuCgo0LiAgICBESVNDTEFJTUVSCgpUaGlzIEZESyBBQUMgQ29kZWMgc29mdHdhcmUgaXMgcHJvdmlkZWQgYnkgRnJhdW5ob2ZlciBvbiBiZWhhbGYgb2YgdGhlIGNvcHlyaWdodCBob2xkZXJzIGFuZCBjb250cmlidXRvcnMKIkFTIElTIiBhbmQgV0lUSE9VVCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gdGhlIGltcGxpZWQgd2FycmFudGllcwpvZiBtZXJjaGFudGFiaWxpdHkgYW5kIGZpdG5lc3MgZm9yIGEgcGFydGljdWxhciBwdXJwb3NlLiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUIEhPTERFUiBPUgpDT05UUklCVVRPUlMgQkUgTElBQkxFIGZvciBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgaW5jaWRlbnRhbCwgc3BlY2lhbCwgZXhlbXBsYXJ5LCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMsCmluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gcHJvY3VyZW1lbnQgb2Ygc3Vic3RpdHV0ZSBnb29kcyBvciBzZXJ2aWNlczsgbG9zcyBvZiB1c2UsIGRhdGEsIG9yIHByb2ZpdHMsCm9yIGJ1c2luZXNzIGludGVycnVwdGlvbiwgaG93ZXZlciBjYXVzZWQgYW5kIG9uIGFueSB0aGVvcnkgb2YgbGlhYmlsaXR5LCB3aGV0aGVyIGluIGNvbnRyYWN0LCBzdHJpY3QKbGlhYmlsaXR5LCBvciB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGFyaXNpbmcgaW4gYW55IHdheSBvdXQgb2YgdGhlIHVzZSBvZiB0aGlzIHNvZnR3YXJlLCBldmVuIGlmCmFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlLgoKNS4gICAgQ09OVEFDVCBJTkZPUk1BVElPTgoKRnJhdW5ob2ZlciBJbnN0aXR1dGUgZm9yIEludGVncmF0ZWQgQ2lyY3VpdHMgSUlTCkF0dGVudGlvbjogQXVkaW8gYW5kIE11bHRpbWVkaWEgRGVwYXJ0bWVudHMgLSBGREsgQUFDIExMCkFtIFdvbGZzbWFudGVsIDMzCjkxMDU4IEVybGFuZ2VuLCBHZXJtYW55Cgp3d3cuaWlzLmZyYXVuaG9mZXIuZGUvYW1tCmFtbS1pbmZvQGlpcy5mcmF1bmhvZmVyLmRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgovKioqKioqKioqKioqKioqKioqKioqKioqKiogIEZyYXVuaG9mZXIgSUlTIEZESyBTeXNMaWIgICoqKioqKioqKioqKioqKioqKioqKioKCiAgIEF1dGhvcihzKToKICAgRGVzY3JpcHRpb246IGNvbW1hbmQgbGluZSBwYXJzZXIKCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKI2RlZmluZSBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxjdHlwZS5oPgoKI2luY2x1ZGUgImNtZGxfcGFyc2VyLmgiCiNpbmNsdWRlICJnZW5lcmljU3Rkcy5oIgoKCgovKioqKioqKioqKioqKioqKioqKioqKioqIGludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgSU5UICBHZXRBcmdGcm9tU3RyaW5nKElOVCBhcmdjLCBURVhUQ0hBUiogYXJndltdLCBURVhUQ0hBUiogc2VhcmNoX3N0cmluZywgVEVYVENIQVIgdHlwZSwgVEVYVENIQVIqIGZvdW5kX3N0cmluZyAsIElOVCogc3dpdGNoZXNfdXNlZCk7CnN0YXRpYyB2b2lkIFJlbW92ZVdoaXRlU3BhY2UoY29uc3QgVEVYVENIQVIqIHBSZXFBcmdzLCBURVhUQ0hBUiogUmVtb3ZlZCk7CnN0YXRpYyBJTlQgQ2hlY2tBcmcoVEVYVENIQVIqIGFyZywgIFRFWFRDSEFSKiBzdHIsIFVJTlQgbnVtQXJncywgVEVYVENIQVIgdHlwZSwgVEVYVENIQVIqIGN1cnJlbnRfc3RyKTsKc3RhdGljIElOVCBDaGVja0ZvclVudXNlZFN3aXRjaGVzKElOVCBhcmdjLCAvKlRFWFRDSEFSKiBhcmd2W10sKi8gSU5UKiBzd2l0Y2hlc191c2VkKTsKc3RhdGljIElOVCBQYXJzZVN0cmluZyhURVhUQ0hBUiogc3RyLCBJTlQqLCBURVhUQ0hBUiosIFRFWFRDSEFSKik7CnN0YXRpYyB2b2lkIEdldE51bWJlck9mQXJncyhURVhUQ0hBUiogc3RyLCBJTlQqIG5BcmdzKTsKCnN0YXRpYwp2b2lkIHJlbW92ZVF1b3RlcyhjaGFyICpzdHIpCnsKICBpZiAoc3RyWzBdID09ICciJykgewogICAgRkRLc3RyY3B5KHN0ciwgc3RyKzEpOwogICAgc3RyW0ZES3N0cmxlbihzdHIpLTFdID0gMDsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKiBpbXBsZW1lbnRhdGlvbiAqKioqKioqKioqKioqKioqKioqKiovCgpJTlQgSUlTX1NjYW5DbWRsKElOVCBhcmdjLCBURVhUQ0hBUiogYXJndltdLCBjb25zdCBURVhUQ0hBUiogc3RyLCAuLi4pCnsKICBJTlQgaSAgICAgICAgICAgICAgPSAwOwogIElOVCBmb3VuZF9hbmRfc2V0ICA9IDA7CiAgSU5UIG5BcmdzICAgICAgICAgID0gMDsKICBJTlQqIHN3aXRjaGVzX3VzZWQgPSAwOwogIElOVCogICBiX3N0cl9vcHQgICA9IDA7CiAgVEVYVENIQVIqICBzX3N0ciAgICAgICA9IDA7CiAgVEVYVENIQVIqICBjX3N0cl90eXBlICA9IDA7CiAgVEVYVENIQVIqICBzdHJfY2xlYW4gICA9IDA7CgogIHZhX2xpc3QgYXA7CgogIGlmIChhcmdjID09IDAgfHwgYXJnYyA9PSAxKQogIHsKICAgIEZES3ByaW50ZigiTm8gY29tbWFuZCBsaW5lIGFyZ3VtZW50c1xuIik7CiAgICBnb3RvIGJhaWw7CiAgfQoKICBzdHJfY2xlYW4gID0gKFRFWFRDSEFSKikgIEZES2NhbGxvYygodW5zaWduZWQgaW50KV90Y3NsZW4oc3RyKSwgc2l6ZW9mKFRFWFRDSEFSKSk7CiAgaWYgKHN0cl9jbGVhbiA9PSBOVUxMKSB7CiAgICBGREtwcmludGYoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGxpbmUgJWQsIGZpbGUgJXNcbiIsICBfX0xJTkVfXywgX19GSUxFX18pOwogICAgcmV0dXJuIDA7CiAgfQoKICBSZW1vdmVXaGl0ZVNwYWNlKHN0ciwgc3RyX2NsZWFuICk7CiAgR2V0TnVtYmVyT2ZBcmdzKHN0cl9jbGVhbiwgJm5BcmdzKTsKCiAgYl9zdHJfb3B0ICA9IChJTlQqKSAgIEZES2NhbGxvYyhuQXJncywgICAgc2l6ZW9mKElOVCkpOwogIHNfc3RyICAgICAgPSAoVEVYVENIQVIqKSAgRkRLY2FsbG9jKG5BcmdzKkNNRExfTUFYX0FSR0MsIHNpemVvZihURVhUQ0hBUikgKTsKICBjX3N0cl90eXBlID0gKFRFWFRDSEFSKikgIEZES2NhbGxvYyhuQXJncywgICAgc2l6ZW9mKFRFWFRDSEFSKSk7CiAgc3dpdGNoZXNfdXNlZCA9IChJTlQqKSBGREtjYWxsb2MoYXJnYywgc2l6ZW9mKElOVCkpOwoKICBpZiAoYl9zdHJfb3B0ID09IE5VTEwgfHwgc19zdHIgPT0gTlVMTCB8fCBjX3N0cl90eXBlID09IE5VTEwgfHwgc3dpdGNoZXNfdXNlZCA9PSBOVUxMKSB7CiAgICBGREtwcmludGYoIkVycm9yIGFsbG9jYXRpbmcgbWVtb3J5IGxpbmUgJWQsIGZpbGUgJXNcbiIsICBfX0xJTkVfXywgX19GSUxFX18pOwogICAgZ290byBiYWlsOwogIH0KCiAgaWYgKCBQYXJzZVN0cmluZyggc3RyX2NsZWFuLCBiX3N0cl9vcHQsIHNfc3RyLCBjX3N0cl90eXBlICkpIHsKICAgIGdvdG8gYmFpbDsKICB9CgogIHZhX3N0YXJ0KGFwLCBzdHIpOwoKICBmb3IgKCBpID0gMDsgaSA8IG5BcmdzOyBpKysgKQogICAgewogICAgICBURVhUQ0hBUiBhcmdbQ01ETF9NQVhfU1RSTEVOXSA9IHtMJ1wwJ307CiAgICAgIFRFWFRDSEFSKiBwX2FyZyA9IGFyZzsKICAgICAgVEVYVENIQVIqIGN1cnJlbnRfc3RyID0gJihzX3N0cltpKkNNRExfTUFYX0FSR0NdKTsKCiAgICAgIGlmIChHZXRBcmdGcm9tU3RyaW5nKGFyZ2MsIGFyZ3YsIGN1cnJlbnRfc3RyLCBjX3N0cl90eXBlW2ldLCBhcmcsIHN3aXRjaGVzX3VzZWQgKQogICAgICAgICAgJiYgIWJfc3RyX29wdFtpXSApCiAgICAgICAgewojaWZkZWYgX1VOSUNPREUKICAgICAgICAgIF9mdHByaW50ZihzdGRlcnIsIF9URVhUKCJcblxuRXJyb3I6IFBhcnNpbmcgYXJndW1lbnQgZm9yIHJlcXVpcmVkIHN3aXRjaCAnJWxzJy5cbiIgKSwgY3VycmVudF9zdHIpOwojZWxzZQogICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1RFWFQoIlxuXG5FcnJvcjogUGFyc2luZyBhcmd1bWVudCBmb3IgcmVxdWlyZWQgc3dpdGNoICclcycuXG4iICksIGN1cnJlbnRfc3RyKTsKI2VuZGlmCiAgICAgICAgICBmb3VuZF9hbmRfc2V0ID0gMDsKICAgICAgICAgIGdvdG8gYmFpbDsKICAgICAgICB9CiAgICAgIGlmIChDaGVja0FyZyhwX2FyZywgc19zdHIsIG5BcmdzLCBjX3N0cl90eXBlW2ldLCBjdXJyZW50X3N0cikpCiAgICAgICAgewogICAgICAgICAgZ290byBiYWlsOwogICAgICAgIH0KCiAgICAgIHN3aXRjaCAoY19zdHJfdHlwZVtpXSApCiAgICAgICAgewogICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgewogICAgICAgICAgICBURVhUQ0hBUiogdG1wOwogICAgICAgICAgICB0bXAgPSB2YV9hcmcoYXAsIFRFWFRDSEFSKik7CgogICAgICAgICAgICBpZiAoIGFyZ1swXSA9PSAnXDAnICkKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgIF90Y3NuY3B5KCB0bXAsIGFyZywgQ01ETF9NQVhfU1RSTEVOICk7CiAgICAgICAgICAgIC8qIFJlbW92ZSBxdW90ZXMuIFdpbmRvd3MgTW9iaWxlIFdvcmthcm91bmQuICovCiAgICAgICAgICAgIHJlbW92ZVF1b3Rlcyh0bXApOwogICAgICAgICAgICBmb3VuZF9hbmRfc2V0Kys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgewogICAgICAgICAgICBJTlQqIHRtcCA9IHZhX2FyZyhhcCwgSU5UKik7CgogICAgICAgICAgICBpZiAoIGFyZ1swXSA9PSAnXDAnICkKICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICp0bXAgPSBfdGNzdG9sKGFyZywgTlVMTCwgMCk7CiAgICAgICAgICAgIGZvdW5kX2FuZF9zZXQrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICB7CiAgICAgICAgICAgIGNoYXIqIHRtcCA9IHZhX2FyZyhhcCwgY2hhciopOwoKICAgICAgICAgICAgaWYgKCBhcmdbMF0gPT0gJ1wwJyApCiAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAqdG1wID0gKmFyZzsKICAgICAgICAgICAgZm91bmRfYW5kX3NldCsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICBjYXNlICd1JzoKICAgICAgICAgIHsKICAgICAgICAgICAgVUNIQVIqIHRtcCA9IHZhX2FyZyhhcCwgVUNIQVIqKTsKCiAgICAgICAgICAgIGlmICggYXJnWzBdID09ICdcMCcgKQogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgKnRtcCA9IF90c3RvaShhcmcpOwogICAgICAgICAgICBmb3VuZF9hbmRfc2V0Kys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIGNhc2UgJ2YnOgogICAgICAgICAgewogICAgICAgICAgICBmbG9hdCogdG1wID0gKGZsb2F0KikgdmFfYXJnKCBhcCxkb3VibGUqKTsKCiAgICAgICAgICAgIGlmICggYXJnWzBdID09ICdcMCcgKQogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgKnRtcCA9IChmbG9hdCkgX3RzdG9mKGFyZyk7CiAgICAgICAgICAgIGZvdW5kX2FuZF9zZXQrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgY2FzZSAneSc6IC8vIHN1cHBvcnQgJ2RhdGEgdHlwZSBkb3VibGUnCiAgICAgICAgICB7CiAgICAgICAgICAgIGRvdWJsZSogdG1wID0gKGRvdWJsZSopIHZhX2FyZyggYXAsZG91YmxlKik7CiAgICAgICAgICAgIC8vIHVzZSBzc2NhbmYgaW5zdGVhZCBfdHN0b2YgYmVjYXVzZSBvZiBnY2MKICAgICAgICAgICAgLy9fdHN0b2YoYXJnLCIlbGYiLHRtcCk7IC8vICclbGYnIHJlYWRzIGFzIGRvdWJsZQogICAgICAgICAgICAqdG1wID0gX3RzdG9mKGFyZyk7IC8vICclbGYnIHJlYWRzIGFzIGRvdWJsZQogICAgICAgICAgICBmb3VuZF9hbmRfc2V0Kys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIGNhc2UgJzEnOgogICAgICAgICAgewoKICAgICAgICAgICAgSU5UKiB0bXAgPSB2YV9hcmcoIGFwLCBJTlQqKTsKCiAgICAgICAgICAgIGlmICggYXJnWzBdID09ICdcMCcgKQogICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgKnRtcCA9IDE7CiAgICAgICAgICAgIGZvdW5kX2FuZF9zZXQrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICBGREtwcmludGZFcnIoIkJ1ZzogdW5zdXBwb3J0ZWQgZGF0YSBpZGVudGlmaWVyIFwiJWNcIlxuIiwgY19zdHJfdHlwZVtpXSk7CiAgICAgICAgICBicmVhazsKCiAgICAgICAgfQoKICAgIH0KCiAgdmFfZW5kKGFwKTsKCiAgQ2hlY2tGb3JVbnVzZWRTd2l0Y2hlcyhhcmdjLCAvKmFyZ3YsKi8gc3dpdGNoZXNfdXNlZCk7CgpiYWlsOgogIGlmIChiX3N0cl9vcHQpICAgICBGREtmcmVlKGJfc3RyX29wdCk7CiAgaWYgKHNfc3RyKSAgICAgICAgIEZES2ZyZWUoc19zdHIpOwogIGlmIChjX3N0cl90eXBlKSAgICBGREtmcmVlKGNfc3RyX3R5cGUpOwogIGlmIChzdHJfY2xlYW4pICAgICBGREtmcmVlKHN0cl9jbGVhbik7CiAgaWYgKHN3aXRjaGVzX3VzZWQpIEZES2ZyZWUoc3dpdGNoZXNfdXNlZCk7CgogIHJldHVybiBmb3VuZF9hbmRfc2V0Owp9CgoKdm9pZCBHZXROdW1iZXJPZkFyZ3MoVEVYVENIQVIqIHN0ciwgSU5UKiBuQXJncykKewogIFVJTlQgaSA9IDA7CiAgZm9yICggaSA9IDA7IGkgPCBfdGNzbGVuKHN0cik7ICsraSApCiAgICB7CiAgICAgIGlmICggc3RyW2ldID09ICclJykKICAgICAgICAqbkFyZ3MrPSAxOwogICAgfQoKfQoKSU5UIFBhcnNlU3RyaW5nKFRFWFRDSEFSKiBzdHIsIElOVCogYl9zdHJfb3B0LCBURVhUQ0hBUiogc19zdHIsIFRFWFRDSEFSKiBjX3N0cl90eXBlICkKewogICAgVUlOVCBpID0gMDsKICAgIElOVCBhcmdDb3VudGVyID0gMDsKCiAgICBURVhUQ0hBUiogc3RyX3N0YXJ0ID0gMDsKICAgIFRFWFRDSEFSKiBzdHJfc3RvcCA9IDA7CgoKICAgIHN0cl9zdGFydCA9IHN0cjsKICAgIHN0cl9zdG9wID0gc3RyX3N0YXJ0OwoKICAgIGZvciAoIGkgPSAwOyBpIDwgX3Rjc2xlbihzdHIpIC0gMTsgKytpICkKICAgICAgewogICAgICAgIGlmICggc3RyW2ldID09ICclJyApICAvKiBXZSBoYXZlIGFuIEFyZ3VtZW50ICovCiAgICAgICAgICB7CiAgICAgICAgICAgIGlmICggYXJnQ291bnRlciApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCBiX3N0cl9vcHRbYXJnQ291bnRlci0xXSApCiAgICAgICAgICAgICAgICAgIHN0cl9zdGFydCA9IHN0cl9zdG9wICsgMzsKCiAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgIHN0cl9zdGFydCA9IHN0cl9zdG9wICsgMjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBTYXZlIEFyZ3VtZW50IHR5cGUgKi8KICAgICAgICAgICAgY19zdHJfdHlwZVthcmdDb3VudGVyXSA9IHN0cltpKzFdOwoKICAgICAgICAgICAgaWYgKCAqc3RyX3N0YXJ0ID09ICcoJyApIC8qIE9wdGlvbmFsIEFyZ3VtZW50ICovCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYl9zdHJfb3B0W2FyZ0NvdW50ZXJdID0gMTsKICAgICAgICAgICAgICAgIHN0cl9zdGFydCsrOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIFNhdmUgQXJndW1lbnQgKi8KICAgICAgICAgICAgc3RyW2ldID0gJ1wwJzsKCiAgICAgICAgICAgIF90Y3NuY3B5KCYoc19zdHJbYXJnQ291bnRlcipDTURMX01BWF9BUkdDXSksIHN0cl9zdGFydCwgQ01ETF9NQVhfQVJHQyApOwoKICAgICAgICAgICAgc3RyW2ldID0gJyUnOwoKICAgICAgICAgICAgc3RyX3N0b3AgPSAmKHN0cltpXSk7CgogICAgICAgICAgICBpZiAoIGJfc3RyX29wdFthcmdDb3VudGVyXSApCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKCBpKzIgPiAoIF90Y3NsZW4oc3RyKSAtMSApKQogICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVycixfVEVYVCgiXG5cbkludGVybmFsIFBhcnNlciBFcnJvcjogU3RybGVuIFByb2JsZW1cbiIpICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICggc3RyW2krMl0gIT0gJyknICkKICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIF9mdHByaW50ZihzdGRlcnIsX1RFWFQoIlxuXG5JbnRlcm5hbCBQYXJzZXIgRXJyb3I6IE1pc3NpbmcgYnJhY2tldCAnKSdcbiIpICk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgfQoKCiAgICAgICAgICAgIGFyZ0NvdW50ZXIrKzsKICAgICAgICAgIH0KCgogICAgICB9CgogICAgcmV0dXJuIDA7CiAgfQoKCgoKdm9pZCBSZW1vdmVXaGl0ZVNwYWNlKGNvbnN0IFRFWFRDSEFSKiBwUmVxQXJncywgVEVYVENIQVIqIHBSZW1vdmVkKQp7CiAgVUlOVCBpID0gMDsKICBJTlQgayA9IDA7CiAgVUlOVCBsZW4gPSAoVUlOVClfdGNzbGVuKHBSZXFBcmdzKTsKCgogIGZvciAoIGkgPSAwOyBpIDwgbGVuOyArK2kgKQogICAgewoKICAgICAgaWYgKCBwUmVxQXJnc1tpXSAhPSAnICcgKQogICAgICAgIHsKICAgICAgICAgIHBSZW1vdmVkW2tdID0gcFJlcUFyZ3NbaV07CiAgICAgICAgICBrKys7CiAgICAgICAgfQogICAgfQp9CgoKSU5UIEdldEFyZ0Zyb21TdHJpbmcoSU5UIGFyZ2MsIFRFWFRDSEFSKiBhcmd2W10sIFRFWFRDSEFSKiBzZWFyY2hfc3RyaW5nLCBURVhUQ0hBUiB0eXBlLCBURVhUQ0hBUiogZm91bmRfc3RyaW5nLCBJTlQqIHN3X3VzZWQgKQp7CiAgSU5UIGkgPSAwOwoKICBmb3IgKGkgPSAxOyBpIDwgYXJnYzsgKytpICkgewogICAgaWYgKCAhX3Rjc2NtcChzZWFyY2hfc3RyaW5nLCBhcmd2W2ldKSApIC8qIFN0cmluZ3MgYXJlIGVxdWFsICovCiAgICAgIHsKICAgICAgICBpZiAoIHR5cGUgPT0gJzEnICkgLyogU3dpdGNoIHdpdGhvdXQgYXJndW1lbnQgKi8KICAgICAgICB7CiAgICAgICAgICBfdGNzbmNweSggZm91bmRfc3RyaW5nLCBfVEVYVCgiMSIpLCAxKTsKICAgICAgICAgIHN3X3VzZWRbaV0gPSAxOwogICAgICAgICAgcmV0dXJuIDA7CgogICAgICAgIH0KCiAgICAgICAgaWYgKCBpID09IChhcmdjIC0gMSkpICAvKiBXZSBoYXZlICVzIG9yICVkIGJ1dCBhcmUgZmluaXNoZWQqLwogICAgICAgICAgcmV0dXJuIDE7CgogICAgICAgIGlmICggX3Rjc2xlbihhcmd2W2krMV0pID4gQ01ETF9NQVhfU1RSTEVOICkKICAgICAgICAgIHsKI2lmZGVmIF9VTklDT0RFCiAgICAgICAgICAgIF9mdHByaW50ZiAoc3RkZXJyLF9URVhUKCJXYXJuaW5nOiBJZ25vcmluZyBhcmd1bWVudCBmb3Igc3dpdGNoICclbHMnLiAiKSwgc2VhcmNoX3N0cmluZyApOwojZWxzZQogICAgICAgICAgICBfZnRwcmludGYgKHN0ZGVycixfVEVYVCgiV2FybmluZzogSWdub3JpbmcgYXJndW1lbnQgZm9yIHN3aXRjaCAnJXMnLiAiKSwgc2VhcmNoX3N0cmluZyApOwojZW5kaWYKICAgICAgICAgICAgX2Z0cHJpbnRmIChzdGRlcnIsX1RFWFQoIkFyZ3VtZW50IGlzIHRvbyBMT05HLlxuIikgKTsKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgIF90Y3NuY3B5KCBmb3VuZF9zdHJpbmcsIGFyZ3ZbaSsxXSwgQ01ETF9NQVhfU1RSTEVOKTsKICAgICAgICAgIHN3X3VzZWRbaV0gPSAxOwogICAgICAgICAgc3dfdXNlZFtpKzFdID0gMTsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgfQogIH0KICByZXR1cm4gMTsKfQoKCgpJTlQgQ2hlY2tBcmcoVEVYVENIQVIqIGFyZywgVEVYVENIQVIqIHN0ciwgVUlOVCBudW1BcmdzLCBURVhUQ0hBUiB0eXBlLCBURVhUQ0hBUiogY3VyX3N0cikKewogIFVJTlQgaSA9IDA7CgogIC8qIE5vIGFyZ3VtZW50IGdpdmVuLT4gcmV0dXJuICovCiAgaWYgKGFyZ1swXSA9PSAnXDAnKQogICAgcmV0dXJuIDA7CgoKICAvKiBDaGVjayBpZiBhcmcgaXMgc3dpdGNoICovCiAgZm9yICggaSA9IDA7IGkgPCBudW1BcmdzOyArK2kgKQogICAgewogICAgICBpZiAoIV90Y3NjbXAoYXJnLCAmKHN0cltpKkNNRExfTUFYX0FSR0NdKSkpCiAgICAgICAgewojaWZkZWYgX1VOSUNPREUKICAgICAgICAgIF9mdHByaW50ZihzdGRlcnIsIF9URVhUKCJcblxuRXJyb3I6IEFyZ3VtZW50ICclbHMnIGZvciBzd2l0Y2ggJyVscycgaXMgbm90IHZhbGlkIFxuIiApLCBhcmcsIGN1cl9zdHIgKTsKI2Vsc2UKICAgICAgICAgIF9mdHByaW50ZihzdGRlcnIsIF9URVhUKCJcblxuRXJyb3I6IEFyZ3VtZW50ICclcycgZm9yIHN3aXRjaCAnJXMnIGlzIG5vdCB2YWxpZCBcbiIgKSwgYXJnLCBjdXJfc3RyICk7CiNlbmRpZgogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQoKICAgIH0KICAvKiBDaGVjayBpZiB0eXBlIGlzICVkIGJ1dCBhIHN0cmluZyBpcyBnaXZlbiAqLwoKICBmb3IgKCBpID0gMDsgaSA8IF90Y3NsZW4oYXJnKTsgKytpICkKICAgIHsKICAgICAgaWYgKCAodHlwZSA9PSAnZCcpICYmICFfaXN0ZGlnaXQoYXJnW2ldKSAmJiBhcmdbaV0gIT0gJ3gnICYmIGFyZ1tpXSAhPSAnLScpCiAgICAgICAgewojaWZkZWYgX1VOSUNPREUKICAgICAgICAgIF9mdHByaW50ZihzdGRlcnIsIF9URVhUKCJcblxuRXJyb3I6IEFyZ3VtZW50ICclbHMnIGZvciBzd2l0Y2ggJyVscycgaXMgbm90IGEgdmFsaWQgbnVtYmVyLlxuIiApLCBhcmcsIGN1cl9zdHIpOwojZWxzZQogICAgICAgICAgX2Z0cHJpbnRmKHN0ZGVyciwgX1RFWFQoIlxuXG5FcnJvcjogQXJndW1lbnQgJyVzJyBmb3Igc3dpdGNoICclcycgaXMgbm90IGEgdmFsaWQgbnVtYmVyLlxuIiApLCBhcmcsIGN1cl9zdHIpOwojZW5kaWYKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgIH0KCgogIHJldHVybiAwOwp9CgoKSU5UIENoZWNrRm9yVW51c2VkU3dpdGNoZXMoSU5UIGFyZ2MsIC8qVEVYVENIQVIqIGFyZ3ZbXSwqLyBJTlQqIHN3aXRjaGVzX3VzZWQpCnsKICBJTlQgaSA9IDA7CgogIGZvciggaSA9IDE7IGkgPCBhcmdjOyArK2kgKQogICAgewogICAgICBpZiAoICFzd2l0Y2hlc191c2VkW2ldICkKICAgICAgICB7CiAgICAgICAgICArK2k7CiAgICAgICAgfQogICAgfQoKICByZXR1cm4gMDsKfQoKCgpzdGF0aWMgY2hhciBsaW5lW0NNRExfTUFYX1NUUkxFTipDTURMX01BWF9BUkdDXTsKc3RhdGljIGNoYXIgKmFyZ3ZfcHRyW0NNRExfTUFYX0FSR0NdOwojaWZkZWYgQ01ERklMRV9QUkVGSVgKc3RhdGljIGNoYXIgdG1wWzI1Nl07IC8qIHRoaXMgYXJyYXkgaXMgdXNlZCB0byBzdG9yZSB0aGUgcHJlZml4IGFuZCB0aGUgZmlsZXBhdGgvbmFtZSAqLwojZW5kaWYKCmludCBJSVNfUHJvY2Vzc0NtZGxMaXN0KGNvbnN0IGNoYXIqIHBhcmFtX2ZpbGVuYW1lLCBpbnQgKCpwRnVuY3Rpb24pKGludCwgVEVYVENIQVIqKikpCnsKICAvKiBzdGF0aWMgdG8gcmVkdWNlIHJlcXVpcmVkIHN0YWNrIHNpemUgKi8KCiAgRkRLRklMRSAqY29uZmlnX2ZwOwogIGludCBhcmdjOwogIGNoYXIgKmxpbmVfcHRyOwoKI2lmZGVmIENNREZJTEVfUFJFRklYCiAgRkRLc3RyY3B5KHRtcCwgQ01ERklMRV9QUkVGSVgpOwogIEZES3N0cmNweSh0bXArRkRLc3RybGVuKENNREZJTEVfUFJFRklYKSwgcGFyYW1fZmlsZW5hbWUpOwogIC8qIE9wZW4gdGhlIGZpbGUgd2l0aCBjb21tYW5kIGxpbmVzICovCiAgY29uZmlnX2ZwID0gRkRLZm9wZW4odG1wLCAiciIpOwojZWxzZQogIC8qIE9wZW4gdGhlIGZpbGUgd2l0aCBjb21tYW5kIGxpbmVzICovCiAgY29uZmlnX2ZwID0gRkRLZm9wZW4ocGFyYW1fZmlsZW5hbWUsICJyIik7CiNlbmRpZgoKICBpZihjb25maWdfZnAgPT0gTlVMTCkKICB7CiNpZmRlZiBDTURGSUxFX1BSRUZJWAogICAgRkRLcHJpbnRmKCJcbmNvdWxkIG5vdCBvcGVuIGNvbmZpZyBmaWxlICVzIiwgdG1wKTsKI2Vsc2UKICAgIEZES3ByaW50ZigiXG5jb3VsZCBub3Qgb3BlbiBjb25maWcgZmlsZSAlcyIsIHBhcmFtX2ZpbGVuYW1lKTsKI2VuZGlmCiAgICByZXR1cm4gMTsKICB9CgogIC8qIE9idGFpbiBhIGNvbW1hbmQgbGluZSBmcm9tIGNvbmZpZyBmaWxlICovCiAgd2hpbGUgKEZES2ZnZXRzKGxpbmUsIENNRExfTUFYX1NUUkxFTipDTURMX01BWF9BUkdDLCBjb25maWdfZnApICE9IE5VTEwpCiAgewogICAgYXJnYyA9IDE7CgogICAgLyogRWF0IFxuICovCiAgICBsaW5lX3B0ciA9ICAoY2hhciopRkRLc3RyY2hyKGxpbmUsICdcbicpOwogICAgaWYgKGxpbmVfcHRyICE9IE5VTEwpCiAgICAgICpsaW5lX3B0ciA9ICcgJzsKCiAgICBsaW5lX3B0ciA9IGxpbmU7CgogICAgLyogU2NhbiB0aGUgbGluZSBhbmQgcHV0IHRoZSBjb21tYW5kIGxpbmUgcGFyYW1zIGludG8gYXJndiAqLwogICAgZG8gewogICAgICAvKiBTa2lwIGNvbnNlY3V0aXZlIGJsYW5rcy4gKi8KICAgICAgd2hpbGUgKCpsaW5lX3B0ciA9PSAnICcgJiYgbGluZV9wdHIgPCBsaW5lK0NNRExfTUFYX1NUUkxFTikKICAgICAgICBsaW5lX3B0cisrOwogICAgICAvKiBBc3NpZ24gYXJndW1lbnQuICovCiAgICAgIGFyZ3ZfcHRyW2FyZ2NdID0gbGluZV9wdHI7CiAgICAgIC8qIEdldCBwb2ludGVyIHRvIG5leHQgYmxhbmsuICovCiAgICAgIGxpbmVfcHRyID0gKGNoYXIqKUZES3N0cmNocihsaW5lX3B0ciwgJyAnKTsKICAgICAgLyogICovCiAgICAgIGlmIChsaW5lX3B0ciAhPSBOVUxMKSB7CiAgICAgICAgLyogTnVsbCB0ZXJtaW5hdGUgKi8KICAgICAgICAqbGluZV9wdHIgPSAwOwogICAgICAgIC8qIFNraXAgZm9ybWVyIGJsYW5rIChub3cgbnVsbCBjaGFyYWN0ZXIpICovCiAgICAgICAgbGluZV9wdHIrKzsKICAgICAgICAvKiBBZHZhbmNlIGFyZ3VtZW50IGNvdW50ZXIgKi8KICAgICAgfQogICAgICBhcmdjKys7CiAgICB9IHdoaWxlICggbGluZV9wdHIgIT0gTlVMTCAmJiBhcmdjIDwgQ01ETF9NQVhfQVJHQyk7CgogICAgLyogY2FsbCAid291bGQgYmUgbWFpbigpIiAqLwogICAgaWYgKGFyZ2MgPiAyICYmICphcmd2X3B0clsxXSAhPSAnIycgJiYgRkRLc3RybGVuKGFyZ3ZfcHRyWzFdKT4xKQogICAgewogICAgICBpbnQgcmV0dmFsOwoKICAgICAgcmV0dmFsID0gKCpwRnVuY3Rpb24pKGFyZ2MsIGFyZ3ZfcHRyKTsKCiAgICAgIEZES3ByaW50ZigibWFpbiByZXR1cm5lZCAlZFxuIiwgcmV0dmFsKTsKICAgIH0KICB9CgogIEZES2ZjbG9zZShjb25maWdfZnApOwogIHJldHVybiAwOwp9Cgo=