LyoKICogc25tcGQuYwogKi8KLyoqIEBkZWZncm91cCBhZ2VudCBUaGUgTmV0LVNOTVAgYWdlbnQKICogVGhlIHNubXAgYWdlbnQgcmVzcG9uZHMgdG8gU05NUCBxdWVyaWVzIGZyb20gbWFuYWdlbWVudCBzdGF0aW9ucwogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIENvcHlyaWdodCAxOTg4LCAxOTg5IGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CiAqIAogKiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqIAogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCiAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKICogYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAogKiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIENNVSBub3QgYmUKICogdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCiAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAogKiAKICogQ01VIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKICogQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCiAqIENNVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAogKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCiAqIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKICogU09GVFdBUkUuCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvdHlwZXMuaD4KCiNpZiBIQVZFX0lPX0gKI2luY2x1ZGUgPGlvLmg+CiNlbmRpZgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpZiBIQVZFX1NUUklOR19ICiNpbmNsdWRlIDxzdHJpbmcuaD4KI2Vsc2UKI2luY2x1ZGUgPHN0cmluZ3MuaD4KI2VuZGlmCiNpZiBIQVZFX1NURExJQl9ICiNpbmNsdWRlIDxzdGRsaWIuaD4KI2VuZGlmCiNpZiBIQVZFX1VOSVNURF9ICiNpbmNsdWRlIDx1bmlzdGQuaD4KI2VuZGlmCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2lmIEhBVkVfTkVUSU5FVF9JTl9ICiNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CiNlbmRpZgojaWYgSEFWRV9BUlBBX0lORVRfSAojaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiNlbmRpZgojaWYgVElNRV9XSVRIX1NZU19USU1FCiMgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19TRUxFQ1RfSAojaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfSUZfSAojaW5jbHVkZSA8bmV0L2lmLmg+CiNlbmRpZgojaWYgSEFWRV9JTkVUX01JQjJfSAojaW5jbHVkZSA8aW5ldC9taWIyLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfRklMRV9ICiNpbmNsdWRlIDxzeXMvZmlsZS5oPgojZW5kaWYKI2lmZGVmIEhBVkVfRkNOVExfSAojaW5jbHVkZSA8ZmNudGwuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19XQUlUX0gKI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNlbmRpZgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpZiBIQVZFX1BST0NFU1NfSCAgICAgICAgICAgICAgLyogV2luMzItZ2V0cGlkICovCiNpbmNsdWRlIDxwcm9jZXNzLmg+CiNlbmRpZgojaWYgSEFWRV9MSU1JVFNfSAojaW5jbHVkZSA8bGltaXRzLmg+CiNlbmRpZgojaWYgSEFWRV9QV0RfSAojaW5jbHVkZSA8cHdkLmg+CiNlbmRpZgojaWYgSEFWRV9HUlBfSAojaW5jbHVkZSA8Z3JwLmg+CiNlbmRpZgoKI2lmbmRlZiBQQVRIX01BWAojIGlmZGVmIF9QT1NJWF9QQVRIX01BWAojICBkZWZpbmUgUEFUSF9NQVggX1BPU0lYX1BBVEhfTUFYCiMgZWxzZQojICBkZWZpbmUgUEFUSF9NQVggMjU1CiMgZW5kaWYKI2VuZGlmCgojaWZuZGVmIEZEX1NFVAp0eXBlZGVmIGxvbmcgICAgZmRfbWFzazsKI2RlZmluZSBORkRCSVRTIChzaXplb2YoZmRfbWFzaykgKiBOQkJZKSAgICAgICAgLyogYml0cyBwZXIgbWFzayAqLwojZGVmaW5lIEZEX1NFVChuLCBwKSAgICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gfD0gKDEgPDwgKChuKSAlIE5GREJJVFMpKSkKI2RlZmluZSBGRF9DTFIobiwgcCkgICAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICY9IH4oMSA8PCAoKG4pICUgTkZEQklUUykpKQojZGVmaW5lIEZEX0lTU0VUKG4sIHApICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQojZGVmaW5lIEZEX1pFUk8ocCkgICAgICBtZW1zZXQoKHApLCAwLCBzaXplb2YoKihwKSkpCiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvZmRfZXZlbnRfbWFuYWdlci5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS9sYXJnZV9mZF9zZXQuaD4KCiNpbmNsdWRlICJtMm0uaCIKI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L21pYl9tb2R1bGVfY29uZmlnLmg+CgojaW5jbHVkZSAic25tcGQuaCIKI2luY2x1ZGUgIm1pYmdyb3VwL3N0cnVjdC5oIgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbWliX21vZHVsZXMuaD4KCiNpbmNsdWRlICJtaWJncm91cC91dGlsX2Z1bmNzLmgiCgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvYWdlbnRfdHJhcC5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3RhYmxlLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC90YWJsZV9pdGVyYXRvci5oPgojaW5jbHVkZSAibWliX21vZHVsZV9pbmNsdWRlcy5oIgoKLyoKICogSW5jbHVkZSB3aW5zZXJ2aWNlLmggdG8gc3VwcG9ydCBXaW5kb3dzIFNlcnZpY2UKICovCiNpZmRlZiBXSU4zMgojaW5jbHVkZSA8d2luZG93cy5oPgojaW5jbHVkZSA8dGNoYXIuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvd2luc2VydmljZS5oPgoKI2RlZmluZSBXSU4zMlNFUlZJQ0UKCiNlbmRpZgoKLyoKICogR2xvYmFscy4KICovCiNpZmRlZiBORVRTTk1QX1VTRV9MSUJXUkFQCiNpbmNsdWRlIDx0Y3BkLmg+CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfTElCV1JBUCAqLwoKI2RlZmluZSBUSU1FVElDSyAgICAgICAgIDUwMDAwMEwKCmludCAgICAgICAgICAgICBzbm1wX2R1bXBfcGFja2V0OwpzdGF0aWMgaW50ICAgICAgcmVjb25maWcgPSAwOwppbnQgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfREFFTU9OOwoKI2lmZGVmIFdJTjMyU0VSVklDRQovKgogKiBTTk1QIEFnZW50IFN0YXR1cyAKICovCiNkZWZpbmUgQUdFTlRfUlVOTklORyAxCiNkZWZpbmUgQUdFTlRfU1RPUFBFRCAwCmludCAgICAgICAgICAgICBhZ2VudF9zdGF0dXMgPSBBR0VOVF9TVE9QUEVEOwovKiBhcHBfbmFtZV9sb25nIHVzZWQgZm9yIEV2ZW50IExvZyAoc3lzbG9nKSwgU0NNLCByZWdpc3RyeSBldGMgKi8KTFBDVFNUUiAgICAgICAgIGFwcF9uYW1lX2xvbmcgPSBfVCgiTmV0LVNOTVAgQWdlbnQiKTsgICAgIC8qIEFwcGxpY2F0aW9uIE5hbWUgKi8KI2VuZGlmCgpjb25zdCBjaGFyICAgICAqYXBwX25hbWUgPSAic25tcGQiOwoKZXh0ZXJuIGludCAgICAgIG5ldHNubXBfcnVubmluZzsKZXh0ZXJuIGNoYXIgICAqKmFyZ3ZyZXN0YXJ0cDsKZXh0ZXJuIGNoYXIgICAgKmFyZ3ZyZXN0YXJ0OwpleHRlcm4gY2hhciAgICAqYXJndnJlc3RhcnRuYW1lOwoKI2lmZGVmIFVTSU5HX1NNVVhfTU9EVUxFCiNpbmNsdWRlIDxtaWJncm91cC9zbXV4L3NtdXguaD4KI2VuZGlmIC8qIFVTSU5HX1NNVVhfTU9EVUxFICovCgovKgogKiBQcm90b3R5cGVzLgogKi8KaW50ICAgICAgICAgICAgIHNubXBfcmVhZF9wYWNrZXQoaW50KTsKaW50ICAgICAgICAgICAgIHNubXBfaW5wdXQoaW50LCBuZXRzbm1wX3Nlc3Npb24gKiwgaW50LCBuZXRzbm1wX3BkdSAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopOwpzdGF0aWMgdm9pZCAgICAgdXNhZ2UoY2hhciAqKTsKc3RhdGljIHZvaWQgICAgIFNubXBUcmFwTm9kZURvd24odm9pZCk7CnN0YXRpYyBpbnQgICAgICByZWNlaXZlKHZvaWQpOwojaWZkZWYgV0lOMzJTRVJWSUNFCnZvaWQgICAgICAgICAgICBTdG9wU25tcEFnZW50KHZvaWQpOwppbnQgICAgICAgICAgICAgU25tcERhZW1vbk1haW4oaW50IGFyZ2MsIFRDSEFSICogYXJndltdKTsKaW50IF9fY2RlY2wgICAgIF90bWFpbihpbnQgYXJnYywgVENIQVIgKiBhcmd2W10pOwojZWxzZQppbnQgICAgICAgICAgICAgbWFpbihpbnQsIGNoYXIgKiopOwojZW5kaWYKCi8qCiAqIFRoZXNlIGRlZmluaXRpb25zIGhhbmRsZSA0LjIgc3lzdGVtcyB3aXRob3V0IGFkZGl0aW9uYWwgc3lzbG9nIGZhY2lsaXRpZXMuCiAqLwojaWZuZGVmIExPR19DT05TCiNkZWZpbmUgTE9HX0NPTlMJMCAgICAgICAvKiBEb24ndCBib3RoZXIgaWYgbm90IGRlZmluZWQuLi4gKi8KI2VuZGlmCiNpZm5kZWYgTE9HX1BJRAojZGVmaW5lIExPR19QSUQJCTAgICAgICAgLyogRG9uJ3QgYm90aGVyIGlmIG5vdCBkZWZpbmVkLi4uICovCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDAKI2RlZmluZSBMT0dfTE9DQUwwCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMMQojZGVmaW5lIExPR19MT0NBTDEJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUwyCiNkZWZpbmUgTE9HX0xPQ0FMMgkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDMKI2RlZmluZSBMT0dfTE9DQUwzCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNAojZGVmaW5lIExPR19MT0NBTDQJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUw1CiNkZWZpbmUgTE9HX0xPQ0FMNQkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDYKI2RlZmluZSBMT0dfTE9DQUw2CTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNwojZGVmaW5lIExPR19MT0NBTDcJMAojZW5kaWYKI2lmbmRlZiBMT0dfREFFTU9OCiNkZWZpbmUgTE9HX0RBRU1PTgkwCiNlbmRpZgoKCnN0YXRpYyB2b2lkCnVzYWdlKGNoYXIgKnByb2cpCnsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgcHJpbnRmKCJcblVzYWdlOiAgJXMgWy1yZWdpc3Rlcl0gWy1xdWlldF0gW09QVElPTlNdIFtMSVNURU5JTkcgQUREUkVTU0VTXSIKICAgICAgICAgICAiXG4gICAgICAgICVzIFstdW5yZWdpc3Rlcl0gWy1xdWlldF0iLCBwcm9nLCBwcm9nKTsKI2Vsc2UKICAgIHByaW50ZigiXG5Vc2FnZTogICVzIFtPUFRJT05TXSBbTElTVEVOSU5HIEFERFJFU1NFU10iLCBwcm9nKTsKI2VuZGlmCiAgICBwcmludGYoIlxuIgogICAgICAgICAgICJcblx0VmVyc2lvbjogICVzXG4lcyIKICAgICAgICAgICAiXHRcdFx0ICAoY29uZmlnIHNlYXJjaCBwYXRoOiAlcylcbiVzJXMiLAogICAgICAgICAgIG5ldHNubXBfZ2V0X3ZlcnNpb24oKSwKICAgICAgICAgICAiXHRXZWI6ICAgICAgaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvXG4iCiAgICAgICAgICAgIlx0RW1haWw6ICAgIG5ldC1zbm1wLWNvZGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXRcbiIKICAgICAgICAgICAiXG4gIC1hXHRcdFx0bG9nIGFkZHJlc3Nlc1xuIgogICAgICAgICAgICIgIC1BXHRcdFx0YXBwZW5kIHRvIHRoZSBsb2dmaWxlIHJhdGhlciB0aGFuIHRydW5jYXRpbmcgaXRcbiIKICAgICAgICAgICAiICAtYyBGSUxFWywuLi5dXHRcdHJlYWQgRklMRShzKSBhcyBjb25maWd1cmF0aW9uIGZpbGUocylcbiIKICAgICAgICAgICAiICAtQ1x0XHRcdGRvIG5vdCByZWFkIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZXNcbiIsCiAgICAgICAgICAgZ2V0X2NvbmZpZ3VyYXRpb25fZGlyZWN0b3J5KCksCiAgICAgICAgICAgIiAgLWRcdFx0XHRkdW1wIHNlbnQgYW5kIHJlY2VpdmVkIFNOTVAgcGFja2V0c1xuIgojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9ERUJVR0dJTkcKICAgICAgICAgICAiICAtRFtUT0tFTlssLi4uXV1cdHR1cm4gb24gZGVidWdnaW5nIG91dHB1dCBmb3IgdGhlIGdpdmVuIFRPS0VOKHMpXG4iCgkgICAiXHRcdFx0ICAodHJ5IEFMTCBmb3IgZXh0cmVtZWx5IHZlcmJvc2Ugb3V0cHV0KVxuIgoJICAgIlx0XHRcdCAgRG9uJ3QgcHV0IHNwYWNlKHMpIGJldHdlZW4gLUQgYW5kIFRPS0VOKHMpLlxuIgojZW5kaWYKICAgICAgICAgICAiICAtZlx0XHRcdGRvIG5vdCBmb3JrIGZyb20gdGhlIHNoZWxsXG4iLAojaWYgSEFWRV9VTklTVERfSAogICAgICAgICAgICIgIC1nIEdJRFx0XHRjaGFuZ2UgdG8gdGhpcyBudW1lcmljIGdpZCBhZnRlciBvcGVuaW5nXG4iCgkgICAiXHRcdFx0ICB0cmFuc3BvcnQgZW5kcG9pbnRzXG4iCiNlbmRpZgogICAgICAgICAgICIgIC1oLCAtLWhlbHBcdFx0ZGlzcGxheSB0aGlzIHVzYWdlIG1lc3NhZ2VcbiIKICAgICAgICAgICAiICAtSFx0XHRcdGRpc3BsYXkgY29uZmlndXJhdGlvbiBmaWxlIGRpcmVjdGl2ZXMgdW5kZXJzdG9vZFxuIgogICAgICAgICAgICIgIC1JIFstXUlOSVRMSVNUXHRsaXN0IG9mIG1pYiBtb2R1bGVzIHRvIGluaXRpYWxpemUgKG9yIG5vdClcbiIKICAgICAgICAgICAiXHRcdFx0ICAocnVuIHNubXBkIHdpdGggLURtaWJfaW5pdCBmb3IgYSBsaXN0KVxuIgogICAgICAgICAgICIgIC1MIDxMT0dPUFRTPlx0XHR0b2dnbGUgb3B0aW9ucyBjb250cm9sbGluZyB3aGVyZSB0byBsb2cgdG9cbiIpOwogICAgc25tcF9sb2dfb3B0aW9uc191c2FnZSgiXHQiLCBzdGRvdXQpOwogICAgcHJpbnRmKCIgIC1tIE1JQkxJU1RcdFx0dXNlIE1JQkxJU1QgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBNSUIgbGlzdFxuIgogICAgICAgICAgICIgIC1NIERJUkxJU1RcdFx0dXNlIERJUkxJU1QgYXMgdGhlIGxpc3Qgb2YgbG9jYXRpb25zIHRvIGxvb2sgZm9yIE1JQnNcbiIKICAgICAgICAgICAiXHRcdFx0ICAoZGVmYXVsdCAlcylcbiVzJXMiLAojaWZuZGVmIE5FVFNOTVBfRElTQUJMRV9NSUJfTE9BRElORwogICAgICAgICAgIG5ldHNubXBfZ2V0X21pYl9kaXJlY3RvcnkoKSwKI2Vsc2UKICAgICAgICAgICAiTUlCcyBub3QgbG9hZGVkIiwKI2VuZGlmCiAgICAgICAgICAgIiAgLXAgRklMRVx0XHRzdG9yZSBwcm9jZXNzIGlkIGluIEZJTEVcbiIKICAgICAgICAgICAiICAtcVx0XHRcdHByaW50IGluZm9ybWF0aW9uIGluIGEgbW9yZSBwYXJzYWJsZSBmb3JtYXRcbiIKICAgICAgICAgICAiICAtclx0XHRcdGRvIG5vdCBleGl0IGlmIGZpbGVzIG9ubHkgYWNjZXNzaWJsZSB0byByb290XG4iCgkgICAiXHRcdFx0ICBjYW5ub3QgYmUgb3BlbmVkXG4iCiNpZmRlZiBXSU4zMlNFUlZJQ0UKICAgICAgICAgICAiICAtcmVnaXN0ZXJcdFx0cmVnaXN0ZXIgYXMgYSBXaW5kb3dzIHNlcnZpY2VcbiIKICAgICAgICAgICAiICBcdFx0XHQgIChmb2xsb3dlZCBieSAtcXVpZXQgdG8gcHJldmVudCBtZXNzYWdlIHBvcHVwcylcbiIKICAgICAgICAgICAiICBcdFx0XHQgIChmb2xsb3dlZCBieSB0aGUgc3RhcnR1cCBwYXJhbWV0ZXIgbGlzdClcbiIKICAgICAgICAgICAiICBcdFx0XHQgIE5vdGUgdGhhdCBzb21lIHBhcmFtZXRlcnMgYXJlIG5vdCByZWxldmFudCB3aGVuIHJ1bm5pbmcgYXMgYSBzZXJ2aWNlXG4iCiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAogICAgICAgICAgICIgIC11IFVJRFx0XHRjaGFuZ2UgdG8gdGhpcyB1aWQgKG51bWVyaWMgb3IgdGV4dHVhbCkgYWZ0ZXJcbiIKCSAgICJcdFx0XHQgIG9wZW5pbmcgdHJhbnNwb3J0IGVuZHBvaW50c1xuIgojZW5kaWYKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgICAgICAgICIgIC11bnJlZ2lzdGVyXHRcdHVucmVnaXN0ZXIgYXMgYSBXaW5kb3dzIHNlcnZpY2VcbiIKICAgICAgICAgICAiICBcdFx0XHQgIChmb2xsb3dlZCAtcXVpZXQgdG8gcHJldmVudCBtZXNzYWdlIHBvcHVwcylcbiIKI2VuZGlmCiAgICAgICAgICAgIiAgLXYsIC0tdmVyc2lvblx0XHRkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb25cbiIKICAgICAgICAgICAiICAtVlx0XHRcdHZlcmJvc2UgZGlzcGxheVxuIgojaWYgZGVmaW5lZChVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFKXx8IGRlZmluZWQoVVNJTkdfQUdFTlRYX01BU1RFUl9NT0RVTEUpCiAgICAgICAgICAgIiAgLXggQUREUkVTU1x0XHR1c2UgQUREUkVTUyBhcyBBZ2VudFggYWRkcmVzc1xuIgojZW5kaWYKI2lmZGVmIFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUKICAgICAgICAgICAiICAtWFx0XHRcdHJ1biBhcyBhbiBBZ2VudFggc3ViYWdlbnQgcmF0aGVyIHRoYW4gYXMgYW5cbiIKCSAgICJcdFx0XHQgIFNOTVAgbWFzdGVyIGFnZW50XG4iCiNlbmRpZgogICAgICAgICAgICwKICAgICAgICAgICAiXG5EZXByZWNhdGVkIG9wdGlvbnM6XG4iCiAgICAgICAgICAgIiAgLWwgRklMRVx0XHR1c2UgLUxmIDxGSUxFPiBpbnN0ZWFkXG4iCiAgICAgICAgICAgIiAgLVBcdFx0XHR1c2UgLXAgaW5zdGVhZFxuIgogICAgICAgICAgICIgIC1zXHRcdFx0dXNlIC1Mc2QgaW5zdGVhZFxuIgogICAgICAgICAgICIgIC1TIGR8aXwwLTdcdFx0dXNlIC1McyA8ZmFjaWxpdHk+IGluc3RlYWRcbiIKICAgICAgICAgICAiXG4iCiAgICAgICAgICAgKTsKICAgIGV4aXQoMSk7Cn0KCnN0YXRpYyB2b2lkCnZlcnNpb24odm9pZCkKewogICAgcHJpbnRmKCJcbk5FVC1TTk1QIHZlcnNpb246ICAlc1xuIgogICAgICAgICAgICJXZWI6ICAgICAgICAgICAgICAgaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvXG4iCiAgICAgICAgICAgIkVtYWlsOiAgICAgICAgICAgICBuZXQtc25tcC1jb2RlcnNAbGlzdHMuc291cmNlZm9yZ2UubmV0XG5cbiIsCiAgICAgICAgICAgbmV0c25tcF9nZXRfdmVyc2lvbigpKTsKICAgIGV4aXQoMCk7Cn0KClJFVFNJR1RZUEUKU25tcGRTaHV0RG93bihpbnQgYSkKewojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBleHRlcm4gbmV0c25tcF9zZXNzaW9uICptYWluX3Nlc3Npb247CiNlbmRpZgogICAgbmV0c25tcF9ydW5uaW5nID0gMDsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgLyoKICAgICAqIEluIGNhc2Ugb2Ygd2luZG93cywgc2VsZWN0KCkgaW4gcmVjZWl2ZSgpIGZ1bmN0aW9uIHdpbGwgbm90IHJldHVybiAKICAgICAqIG9uIHNpZ25hbC4gVGhhdHMgd2h5IGZvbGxvd2luZyBmdW5jdGlvbiBpcyBjYWxsZWQsIHdoaWNoIGNsb3NlcyB0aGUgCiAgICAgKiBzb2NrZXQgZGVzY3JpcHRvcnMgYW5kIGNhdXNlcyB0aGUgc2VsZWN0KCkgdG8gcmV0dXJuCiAgICAgKi8KICAgIHNubXBfY2xvc2UobWFpbl9zZXNzaW9uKTsKI2VuZGlmCn0KCiNpZmRlZiBTSUdIVVAKUkVUU0lHVFlQRQpTbm1wZFJlY29uZmlnKGludCBhKQp7CiAgICByZWNvbmZpZyA9IDE7CiAgICBzaWduYWwoU0lHSFVQLCBTbm1wZFJlY29uZmlnKTsKfQojZW5kaWYKCiNpZmRlZiBTSUdVU1IxCmV4dGVybiB2b2lkICAgICBkdW1wX3JlZ2lzdHJ5KHZvaWQpOwpSRVRTSUdUWVBFClNubXBkRHVtcChpbnQgYSkKewogICAgZHVtcF9yZWdpc3RyeSgpOwogICAgc2lnbmFsKFNJR1VTUjEsIFNubXBkRHVtcCk7Cn0KI2VuZGlmCgpSRVRTSUdUWVBFClNubXBkQ2F0Y2hSYW5kb21TaWduYWwoaW50IGEpCnsKICAgIC8qIERpc2FibGUgYWxsIGxvZ3MgYW5kIGxvZyB0aGUgZXJyb3IgdmlhIHN5c2xvZyAqLwogICAgc25tcF9kaXNhYmxlX2xvZygpOwogICAgc25tcF9lbmFibGVfc3lzbG9nKCk7CiAgICBzbm1wX2xvZyhMT0dfRVJSLCAiRXhpdGluZyBvbiBzaWduYWwgJWRcbiIsIGEpOwogICAgc25tcF9kaXNhYmxlX3N5c2xvZygpOwogICAgZXhpdCgxKTsKfQoKc3RhdGljIHZvaWQKU25tcFRyYXBOb2RlRG93bih2b2lkKQp7CiAgICBzZW5kX2Vhc3lfdHJhcChTTk1QX1RSQVBfRU5URVJQUklTRVNQRUNJRklDLCAyKTsKICAgIC8qCiAgICAgKiBYWFggIDIgLSBOb2RlIERvd24gI2RlZmluZSBpdCBhcyBOT0RFX0RPV05fVFJBUCAKICAgICAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBtYWluIC0gTm9uIFdpbmRvd3MKICogU25tcERhZW1vbk1haW4gLSBXaW5kb3dzIHRvIHN1cHBvcnQgd2luZG93cyBzZXJ2aWNlCiAqCiAqIFBhcmFtZXRlcnM6CiAqCSBhcmdjCiAqCSphcmd2W10KICogICAgICAKICogUmV0dXJuczoKICoJMAlBbHdheXMgc3VjY2VlZHMuICAoPykKICoKICoKICogU2V0dXAgYW5kIHN0YXJ0IHRoZSBhZ2VudCBkYWVtb24uCiAqCiAqIEFsc28gc3VjY2Vzc2Z1bGx5IEVYSVRzIHdpdGggemVybyBmb3Igc29tZSBvcHRpb25zLgogKi8KaW50CiNpZmRlZiBXSU4zMlNFUlZJQ0UKU25tcERhZW1vbk1haW4oaW50IGFyZ2MsIFRDSEFSICogYXJndltdKQojZWxzZQptYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiNlbmRpZgp7CiAgICBjaGFyICAgICAgICAgICAgb3B0aW9uc1sxMjhdID0gImFBYzpDZEQ6OmZoSEk6bDpMOm06TTpuOnA6UDpxcnNTOlV2Vi06WToiOwogICAgaW50ICAgICAgICAgICAgIGFyZywgaSwgcmV0OwogICAgaW50ICAgICAgICAgICAgIGRvbnRfZm9yayA9IDAsIGRvX2hlbHAgPSAwOwogICAgaW50ICAgICAgICAgICAgIGxvZ19zZXQgPSAwOwogICAgaW50ICAgICAgICAgICAgIGFnZW50X21vZGUgPSAtMTsKICAgIGNoYXIgICAgICAgICAgICpjcHRyLCAqKmFyZ3ZwdHI7CiAgICBjaGFyICAgICAgICAgICAqcGlkX2ZpbGUgPSBOVUxMOwogICAgY2hhciAgICAgICAgICAgIG9wdGlvbl9jb21wYXRhYmlsaXR5W10gPSAiLUxlIjsKI2lmIEhBVkVfR0VUUElECiAgICBpbnQgZmQ7CiAgICBGSUxFICAgICAgICAgICAqUElEOwojZW5kaWYKI2lmIEhBVkVfR0VUUFdOQU0gJiYgSEFWRV9QV0RfSAogICAgc3RydWN0IHBhc3N3ZCAgKmluZm87CiNlbmRpZgoKI2lmbmRlZiBXSU4zMgogICAgLyoKICAgICAqIGNsb3NlIGFsbCBub24tc3RhbmRhcmQgZmlsZSBkZXNjcmlwdG9ycyB3ZSBtYXkgaGF2ZQogICAgICogaW5oZXJpdGVkIGZyb20gdGhlIHNoZWxsLgogICAgICovCiAgICBmb3IgKGkgPSBnZXRkdGFibGVzaXplKCkgLSAxOyBpID4gMjsgLS1pKSB7CiAgICAgICAgKHZvaWQpIGNsb3NlKGkpOwogICAgfQojZW5kaWYgLyogI1dJTjMyICovCiAgICAKICAgIC8qCiAgICAgKiByZWdpc3RlciBzaWduYWxzIEFTQVAgdG8gcHJldmVudCBkZWZhdWx0IGFjdGlvbiAodXN1YWxseSBjb3JlKQogICAgICogZm9yIHNpZ25hbHMgZHVyaW5nIHN0YXJ0dXAuLi4KICAgICAqLwojaWZkZWYgU0lHVEVSTQogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdURVJNIHNpZ25hbCBoYW5kbGVyXG4iKSk7CiAgICBzaWduYWwoU0lHVEVSTSwgU25tcGRTaHV0RG93bik7CiNlbmRpZgojaWZkZWYgU0lHSU5UCiAgICBERUJVR01TR1RMKCgic2lnbmFsIiwgInJlZ2lzdGVyaW5nIFNJR0lOVCBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR0lOVCwgU25tcGRTaHV0RG93bik7CiNlbmRpZgojaWZkZWYgU0lHSFVQCiAgICBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsgICAvKiBkbyBub3QgdGVybWluYXRlIG9uIGVhcmx5IFNJR0hVUCAqLwojZW5kaWYKI2lmZGVmIFNJR1VTUjEKICAgIERFQlVHTVNHVEwoKCJzaWduYWwiLCAicmVnaXN0ZXJpbmcgU0lHVVNSMSBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR1VTUjEsIFNubXBkRHVtcCk7CiNlbmRpZgojaWZkZWYgU0lHUElQRQogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdQSVBFIHNpZ25hbCBoYW5kbGVyXG4iKSk7CiAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7ICAgLyogJ0lubGluZScgZmFpbHVyZSBvZiB3YXl3YXJkIHJlYWRlcnMgKi8KI2VuZGlmCiNpZmRlZiBTSUdYRlNaCiAgICBzaWduYWwoU0lHWEZTWiwgU25tcGRDYXRjaFJhbmRvbVNpZ25hbCk7CiNlbmRpZgoKI2lmZGVmIE5FVFNOTVBfTk9fUk9PVF9BQ0NFU1MKICAgIC8qCiAgICAgKiBEZWZhdWx0IHRvIG5vLiAgCiAgICAgKi8KICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfTk9fUk9PVF9BQ0NFU1MsIDEpOwojZW5kaWYKICAgIC8qCiAgICAgKiBEZWZhdWx0IHRvIE5PVCBydW5uaW5nIGFuIEFnZW50WCBtYXN0ZXIuICAKICAgICAqLwogICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJICAgTkVUU05NUF9EU19BR0VOVF9BR0VOVFhfTUFTVEVSLCAwKTsKICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfQUdFTlRYX1RJTUVPVVQsIC0xKTsKICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfQUdFTlRYX1JFVFJJRVMsIC0xKTsKCiAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX0NBQ0hFX1RJTUVPVVQsIDUpOwogICAgLyoKICAgICAqIEFkZCBzb21lIG9wdGlvbnMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLiAgCiAgICAgKi8KI2lmIEhBVkVfVU5JU1REX0gKICAgIHN0cmNhdChvcHRpb25zLCAiZzp1OiIpOwojZW5kaWYKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSl8fCBkZWZpbmVkKFVTSU5HX0FHRU5UWF9NQVNURVJfTU9EVUxFKQogICAgc3RyY2F0KG9wdGlvbnMsICJ4OiIpOwojZW5kaWYKI2lmZGVmIFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUKICAgIHN0cmNhdChvcHRpb25zLCAiWCIpOwojZW5kaWYKCiAgICAvKgogICAgICogVGhpcyBpcyBpbmNyZWRpYmx5IHVnbHksIGJ1dCBpdCdzIHByb2JhYmx5IHRoZSBzaW1wbGVzdCB3YXkKICAgICAqICB0byBoYW5kbGUgdGhlIG9sZCAnLUwnIG9wdGlvbiBhcyB3ZWxsIGFzIHRoZSBuZXcgJy1MeCcgc3R5bGUKICAgICAqLwogICAgZm9yIChpPTA7IGk8YXJnYzsgaSsrKSB7CiAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1MIikpCiAgICAgICAgICAgIGFyZ3ZbaV0gPSBvcHRpb25fY29tcGF0YWJpbGl0eTsgICAgICAgICAgICAKICAgIH0KCiNpZmRlZiBXSU4zMgogICAgc25tcF9sb2dfc3lzbG9nbmFtZShhcHBfbmFtZV9sb25nKTsKI2Vsc2UKICAgIHNubXBfbG9nX3N5c2xvZ25hbWUoYXBwX25hbWUpOwojZW5kaWYKICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfQVBQVFlQRSwgYXBwX25hbWUpOwoKICAgIC8qCiAgICAgKiBOb3cgcHJvY2VzcyBvcHRpb25zIG5vcm1hbGx5LiAgCiAgICAgKi8KICAgIHdoaWxlICgoYXJnID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIG9wdGlvbnMpKSAhPSBFT0YpIHsKICAgICAgICBzd2l0Y2ggKGFyZykgewogICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJoZWxwIikgPT0gMCkgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAidmVyc2lvbiIpID09IDApIHsKICAgICAgICAgICAgICAgIHZlcnNpb24oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaGFuZGxlX2xvbmdfb3B0KG9wdGFyZyk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgbG9nX2FkZHJlc3NlcysrOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnQSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUEVORF9MT0dGSUxFUywgMSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfTElCX09QVElPTkFMQ09ORklHLCBvcHRhcmcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0MnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0xJQl9ET05UX1JFQURfQ09ORklHUywgMSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgc25tcF9zZXRfZHVtcF9wYWNrZXQoKytzbm1wX2R1bXBfcGFja2V0KTsKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfVkVSQk9TRSwgMSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdEJzoKI2lmZGVmIE5FVFNOTVBfRElTQUJMRV9ERUJVR0dJTkcKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJEZWJ1Z2dpbmcgbm90IGNvbmZpZ3VyZWRcbiIpOwogICAgICAgICAgICBleGl0KDEpOwojZWxzZQogICAgICAgICAgICBkZWJ1Z19yZWdpc3Rlcl90b2tlbnMob3B0YXJnKTsKICAgICAgICAgICAgc25tcF9zZXRfZG9fZGVidWdnaW5nKDEpOwojZW5kaWYKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ2YnOgogICAgICAgICAgICBkb250X2ZvcmsgPSAxOwogICAgICAgICAgICBicmVhazsKCiNpZiBIQVZFX1VOSVNURF9ICiAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgKmVjcDsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBnaWQ7CgogICAgICAgICAgICAgICAgZ2lkID0gc3RydG91bChvcHRhcmcsICZlY3AsIDEwKTsKICAgICAgICAgICAgICAgIGlmICgqZWNwKSB7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0gKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3JvdXAgICppbmZvOwogICAgICAgICAgICAgICAgICAgIGluZm8gPSBnZXRncm5hbShvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdpZCA9IGluZm8tPmdyX2dpZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJCYWQgZ3JvdXAgaWQ6ICVzXG4iLCBvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9ICiAgICAgICAgICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfR1JPVVBJRCwgZ2lkKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwojZW5kaWYKCiAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgIGRvX2hlbHAgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnSSc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgYWRkX3RvX2luaXRfbGlzdChvcHRhcmcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ2wnOgogICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IC1sIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgLUxmIDxmaWxlPiBpbnN0ZWFkXG4iKTsKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKG9wdGFyZykgPiBQQVRIX01BWCkgewogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBsb2dmaWxlIHBhdGggdG9vIGxvbmcgKGxpbWl0ICVkIGNoYXJzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIFBBVEhfTUFYKTsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc25tcF9lbmFibGVfZmlsZWxvZyhvcHRhcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUEVORF9MT0dGSUxFUykpOwogICAgICAgICAgICAgICAgbG9nX3NldCA9IDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnTCc6CgkgICAgaWYgIChzbm1wX2xvZ19vcHRpb25zKCBvcHRhcmcsIGFyZ2MsIGFyZ3YgKSA8IDAgKSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb2dfc2V0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHNldGVudigiTUlCUyIsIG9wdGFyZywgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnTSc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgc2V0ZW52KCJNSUJESVJTIiwgb3B0YXJnLCAxKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBhcHBfbmFtZSA9IG9wdGFyZzsKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfQVBQVFlQRSwgYXBwX25hbWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ1AnOgogICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IC1QIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgLXAgaW5zdGVhZFxuIik7CiAgICAgICAgY2FzZSAncCc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgcGlkX2ZpbGUgPSBvcHRhcmc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAncSc6CiAgICAgICAgICAgIHNubXBfc2V0X3F1aWNrX3ByaW50KDEpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAncic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IC1zIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgLUxzZCBpbnN0ZWFkXG4iKTsKICAgICAgICAgICAgc25tcF9lbmFibGVfc3lzbG9nKCk7CiAgICAgICAgICAgIGxvZ19zZXQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgIHByaW50ZigiV2FybmluZzogLVMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQsIHVzZSAtTHMgPGZhY2lsaXR5PiBpbnN0ZWFkXG4iKTsKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKCpvcHRhcmcpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgY2FzZSAnRCc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfREFFTU9OOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnaSc6CiAgICAgICAgICAgICAgICBjYXNlICdJJzoKICAgICAgICAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19JTkZPOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnMCc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUwwOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnMSc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUwxOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnMic6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUwyOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnMyc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUwzOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnNCc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUw0OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnNSc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUw1OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnNic6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUw2OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnNyc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUw3OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgc3lzbG9nIGZhY2lsaXR5OiAtUyVjXG4iLCpvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc25tcF9lbmFibGVfc3lzbG9nX2lkZW50KHNubXBfbG9nX3N5c2xvZ25hbWUoTlVMTCksIEZhY2lsaXR5KTsKICAgICAgICAgICAgICAgIGxvZ19zZXQgPSAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJubyBzeXNsb2cgZmFjaWxpdHkgc3BlY2lmaWVkXG4iKTsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdVJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfQUdFTlRfTEVBVkVfUElERklMRSk7CiAgICAgICAgICAgIGJyZWFrOwoKI2lmIEhBVkVfVU5JU1REX0gKICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAqZWNwOwogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHVpZDsKCiAgICAgICAgICAgICAgICB1aWQgPSBzdHJ0b3VsKG9wdGFyZywgJmVjcCwgMTApOwogICAgICAgICAgICAgICAgaWYgKCplY3ApIHsKI2lmIEhBVkVfR0VUUFdOQU0gJiYgSEFWRV9QV0RfSAogICAgICAgICAgICAgICAgICAgIGluZm8gPSBnZXRwd25hbShvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVpZCA9IGluZm8tPnB3X3VpZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJCYWQgdXNlciBpZDogJXNcbiIsIG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0gKICAgICAgICAgICAgICAgICAgICB9CiNlbmRpZgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9VU0VSSUQsIHVpZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKI2VuZGlmCgogICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgICB2ZXJzaW9uKCk7CgogICAgICAgIGNhc2UgJ1YnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9WRVJCT1NFLCAxKTsKICAgICAgICAgICAgYnJlYWs7CgojaWYgZGVmaW5lZChVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFKXx8IGRlZmluZWQoVVNJTkdfQUdFTlRYX01BU1RFUl9NT0RVTEUpCiAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgTkVUU05NUF9EU19BR0VOVF9YX1NPQ0tFVCwgb3B0YXJnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX0FHRU5UWF9NQVNURVIsIDEpOwogICAgICAgICAgICBicmVhazsKI2VuZGlmCgogICAgICAgIGNhc2UgJ1gnOgojaWYgZGVmaW5lZChVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFKQogICAgICAgICAgICBhZ2VudF9tb2RlID0gU1VCX0FHRU5UOwojZWxzZQogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBJbGxlZ2FsIGFyZ3VtZW50IC1YOiIKCQkgICAgICAgICAgICAiQWdlbnRYIHN1cHBvcnQgbm90IGNvbXBpbGVkIGluLlxuIiwgYXJndlswXSk7CiAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICBleGl0KDEpOwojZW5kaWYKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ1knOgogICAgICAgICAgICBuZXRzbm1wX2NvbmZpZ19yZW1lbWJlcihvcHRhcmcpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoZG9faGVscCkgewogICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTLCAxKTsKICAgICAgICBpbml0X2FnZW50KGFwcF9uYW1lKTsgICAgICAgIC8qIHJlZ2lzdGVyIG91ciAuY29uZiBoYW5kbGVycyAqLwogICAgICAgIGluaXRfbWliX21vZHVsZXMoKTsKICAgICAgICBpbml0X3NubXAoYXBwX25hbWUpOwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIHVuZGVyc3Rvb2Q6XG4iKTsKICAgICAgICByZWFkX2NvbmZpZ19wcmludF91c2FnZSgiICAiKTsKICAgICAgICBleGl0KDApOwogICAgfQoKICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBUaGVyZSBhcmUgb3B0aW9uYWwgdHJhbnNwb3J0IGFkZHJlc3NlcyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgCiAgICAgICAgICovCiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAib3B0aW5kICVkLCBhcmdjICVkXG4iLCBvcHRpbmQsIGFyZ2MpKTsKICAgICAgICBmb3IgKGkgPSBvcHRpbmQ7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgICAgY2hhciAqYywgKmFzdHJpbmc7CiAgICAgICAgICAgIGlmICgoYyA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCQkgICBORVRTTk1QX0RTX0FHRU5UX1BPUlRTKSkpIHsKICAgICAgICAgICAgICAgIGFzdHJpbmcgPSAoY2hhciopbWFsbG9jKHN0cmxlbihjKSArIDIgKyBzdHJsZW4oYXJndltpXSkpOwogICAgICAgICAgICAgICAgaWYgKGFzdHJpbmcgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsbG9jIGZhaWx1cmUgcHJvY2Vzc2luZyBhcmd2WyVkXVxuIiwgaSk7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNwcmludGYoYXN0cmluZywgIiVzLCVzIiwgYywgYXJndltpXSk7CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0FHRU5UX1BPUlRTLCBhc3RyaW5nKTsKICAgICAgICAgICAgICAgIFNOTVBfRlJFRShhc3RyaW5nKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfQUdFTlRfUE9SVFMsIGFyZ3ZbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgInBvcnQgc3BlYzogJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJCSAgTkVUU05NUF9EU19BR0VOVF9QT1JUUykpKTsKICAgIH0KCiNpZmRlZiBORVRTTk1QX0xPR0ZJTEUKICAgIGlmICgwID09IGxvZ19zZXQpCiAgICAgICAgc25tcF9lbmFibGVfZmlsZWxvZyhORVRTTk1QX0xPR0ZJTEUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfQVBQRU5EX0xPR0ZJTEVTKSk7CiNlbmRpZgoKICAgIC8qCiAgICAgKiBJbml0aWFsaXplIGEgYXJndiBzZXQgdG8gdGhlIGN1cnJlbnQgZm9yIHJlc3RhcnRpbmcgdGhlIGFnZW50LiAgIAogICAgICovCiAgICBhcmd2cmVzdGFydHAgPSAoY2hhciAqKiltYWxsb2MoKGFyZ2MgKyAyKSAqIHNpemVvZihjaGFyICopKTsKICAgIGFyZ3ZwdHIgPSBhcmd2cmVzdGFydHA7CiAgICBmb3IgKGkgPSAwLCByZXQgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CiAgICAgICAgcmV0ICs9IHN0cmxlbihhcmd2W2ldKSArIDE7CiAgICB9CiAgICBhcmd2cmVzdGFydCA9IChjaGFyICopIG1hbGxvYyhyZXQpOwogICAgYXJndnJlc3RhcnRuYW1lID0gKGNoYXIgKikgbWFsbG9jKHN0cmxlbihhcmd2WzBdKSArIDEpOwogICAgaWYgKCFhcmd2cmVzdGFydHAgfHwgIWFyZ3ZyZXN0YXJ0IHx8ICFhcmd2cmVzdGFydG5hbWUpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm1hbGxvYyBmYWlsdXJlIHByb2Nlc3NpbmcgYXJndnJlc3RhcnRcbiIpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBzdHJjcHkoYXJndnJlc3RhcnRuYW1lLCBhcmd2WzBdKTsKICAgIGlmIChhZ2VudF9tb2RlID09IC0xKSB7CiAgICAgICAgaWYgKHN0cnN0cihhcmd2cmVzdGFydG5hbWUsICJhZ2VudHhkIikgIT0gTlVMTCkgewogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9ST0xFLCBTVUJfQUdFTlQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUsIE1BU1RFUl9BR0VOVCk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkgICAgICAgTkVUU05NUF9EU19BR0VOVF9ST0xFLCBhZ2VudF9tb2RlKTsKICAgIH0KCiAgICBmb3IgKGNwdHIgPSBhcmd2cmVzdGFydCwgaSA9IDA7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICBzdHJjcHkoY3B0ciwgYXJndltpXSk7CiAgICAgICAgKihhcmd2cHRyKyspID0gY3B0cjsKICAgICAgICBjcHRyICs9IHN0cmxlbihhcmd2W2ldKSArIDE7CiAgICB9CiAgICAqY3B0ciA9IDA7CiAgICAqYXJndnB0ciA9IE5VTEw7CgogICAgU09DS19TVEFSVFVQOwogICAgaWYgKGluaXRfYWdlbnQoYXBwX25hbWUpICE9IDApIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiQWdlbnQgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgaW5pdF9taWJfbW9kdWxlcygpOwoKICAgIC8qCiAgICAgKiBzdGFydCBsaWJyYXJ5IAogICAgICovCiAgICBpbml0X3NubXAoYXBwX25hbWUpOwoKICAgIGlmICgocmV0ID0gaW5pdF9tYXN0ZXJfYWdlbnQoKSkgIT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogU29tZSBlcnJvciBvcGVuaW5nIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGFnZW50IHRyYW5zcG9ydHMuICAKICAgICAgICAgKi8KICAgICAgICBFeGl0KDEpOyAgICAgICAgICAgICAgICAvKiAgRXhpdCBsb2dzIGV4aXQgdmFsIGZvciB1cyAgKi8KICAgIH0KCiAgICAvKgogICAgICogSW5pdGlhbGl6ZSB0aGUgd29ybGQuICBEZXRhY2ggZnJvbSB0aGUgc2hlbGwuICBDcmVhdGUgaW5pdGlhbCB1c2VyLiAgCiAgICAgKi8KICAgIGlmKCFkb250X2ZvcmspIHsKICAgICAgICBpbnQgcXVpdCA9ICEgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfUVVJVF9JTU1FRElBVEVMWSk7CiAgICAgICAgcmV0ID0gbmV0c25tcF9kYWVtb25pemUocXVpdCwgc25tcF9zdGRlcnJsb2dfc3RhdHVzKCkpOwogICAgICAgIC8qCiAgICAgICAgICogeHh4LXJrczogZG8gd2UgY2FyZSBpZiBmb3JrIGZhaWxzPyBJIHRoaW5rIHdlIHNob3VsZC4uLgogICAgICAgICAqLwogICAgICAgIGlmKHJldCAhPSAwKQogICAgICAgICAgICBFeGl0KDEpOyAgICAgICAgICAgICAgICAvKiAgRXhpdCBsb2dzIGV4aXQgdmFsIGZvciB1cyAgKi8KICAgIH0KCiNpZiBIQVZFX0dFVFBJRAogICAgaWYgKHBpZF9maWxlICE9IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIHVubGluayB0aGUgcGlkX2ZpbGUsIGlmIGl0IGV4aXN0cywgcHJpb3IgdG8gb3Blbi4gIFdpdGhvdXQKICAgICAgICAgKiBkb2luZyB0aGlzIHRoZSBvcGVuIHdpbGwgZmFpbCBpZiB0aGUgdXNlciBzcGVjaWZpZWQgcGlkX2ZpbGUKICAgICAgICAgKiBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgKi8KICAgICAgICB1bmxpbmsocGlkX2ZpbGUpOwogICAgICAgIGZkID0gb3BlbihwaWRfZmlsZSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjAwKTsKICAgICAgICBpZiAoZmQgPT0gLTEpIHsKICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKHBpZF9maWxlKTsKICAgICAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUykpIHsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKFBJRCA9IGZkb3BlbihmZCwgInciKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKHBpZF9maWxlKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKFBJRCwgIiVkXG4iLCAoaW50KSBnZXRwaWQoKSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoUElEKTsKICAgICAgICAgICAgfQojaWZuZGVmIF9NU0NfVkVSCiAgICAgICAgICAgIC8qIFRoZSBzZXF1ZW5jZSBvcGVuKCkvZmRvcGVuKCkvZmNsb3NlKCkvY2xvc2UoKSBtYWtlcyBNU1ZDIGNyYXNoLAogICAgICAgICAgICAgICBoZW5jZSBza2lwIHRoZSBjbG9zZSgpIGNhbGwgd2hlbiB1c2luZyB0aGUgTVNWQyBydW50aW1lLiAqLwogICAgICAgICAgICBjbG9zZShmZCk7CiNlbmRpZgogICAgICAgIH0KICAgIH0KI2VuZGlmCgojaWYgZGVmaW5lZChIQVZFX1VOSVNURF9IKSAmJiAoZGVmaW5lZChIQVZFX0NIT1dOKSB8fCBkZWZpbmVkKEhBVkVfU0VUR0lEKSB8fCBkZWZpbmVkKEhBVkVfU0VUVUlEKSkKICAgIHsKICAgIGNvbnN0IGNoYXIgICAgICpwZXJzaXN0ZW50X2RpcjsKICAgIGludCAgICAgICAgICAgICB1aWQsIGdpZDsKCiAgICBwZXJzaXN0ZW50X2RpciA9IGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpOwogICAgbWtkaXJoaWVyKCBwZXJzaXN0ZW50X2RpciwgTkVUU05NUF9BR0VOVF9ESVJFQ1RPUllfTU9ERSwgMCApOwogICAKICAgIHVpZCA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJICAgICBORVRTTk1QX0RTX0FHRU5UX1VTRVJJRCk7CiAgICBnaWQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgICAgTkVUU05NUF9EU19BR0VOVF9HUk9VUElEKTsKICAgIAojaWZkZWYgSEFWRV9DSE9XTgogICAgaWYgKCB1aWQgIT0gMCB8fCBnaWQgIT0gMCApCiAgICAgICAgY2hvd24oIHBlcnNpc3RlbnRfZGlyLCB1aWQsIGdpZCApOwojZW5kaWYKCiNpZmRlZiBIQVZFX1NFVEdJRAogICAgaWYgKChnaWQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgIE5FVFNOTVBfRFNfQUdFTlRfR1JPVVBJRCkpID4gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIkNoYW5naW5nIGdpZCB0byAlZC5cbiIsIGdpZCkpOwogICAgICAgIGlmIChzZXRnaWQoZ2lkKSA9PSAtMQojaWZkZWYgSEFWRV9TRVRHUk9VUFMKICAgICAgICAgICAgfHwgc2V0Z3JvdXBzKDEsIChnaWRfdCAqKSZnaWQpID09IC0xCiNlbmRpZgogICAgICAgICAgICApIHsKICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKCJzZXRnaWQgZmFpbGVkIik7CiAgICAgICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCQlORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTKSkgewogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KI2VuZGlmCiNpZmRlZiBIQVZFX1NFVFVJRAogICAgaWYgKCh1aWQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgIE5FVFNOTVBfRFNfQUdFTlRfVVNFUklEKSkgPiAwKSB7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0ggJiYgSEFWRV9JTklUR1JPVVBTCiAgICAgICAgLyoKICAgICAgICAgKiBTZXQgc3VwcGxlbWVudGFyeSBncm91cHMgYmVmb3JlIGNoYW5naW5nIFVJRAogICAgICAgICAqICAgKHdoaWNoIHByb2JhYmx5IGludm9sdmVzIGdpdmluZyB1cCBwcml2aWxlZ2VzKQogICAgICAgICAqLwogICAgICAgIGluZm8gPSBnZXRwd3VpZCh1aWQpOwogICAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIlN1cHBsZW1lbnRhcnkgZ3JvdXBzIGZvciAlcy5cbiIsIGluZm8tPnB3X25hbWUpKTsKICAgICAgICAgICAgaWYgKGluaXRncm91cHMoaW5mby0+cHdfbmFtZSwgKGdpZCAhPSAwID8gKGdpZF90KWdpZCA6IGluZm8tPnB3X2dpZCkpID09IC0xKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoImluaXRncm91cHMgZmFpbGVkIik7CiAgICAgICAgICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUykpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQojZW5kaWYKICAgICAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJDaGFuZ2luZyB1aWQgdG8gJWQuXG4iLCB1aWQpKTsKICAgICAgICBpZiAoc2V0dWlkKHVpZCkgPT0gLTEpIHsKICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKCJzZXR1aWQgZmFpbGVkIik7CiAgICAgICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCQlORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTKSkgewogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KI2VuZGlmCiAgICB9CiNlbmRpZgoKICAgIC8qCiAgICAgKiBTdG9yZSBwZXJzaXN0ZW50IGRhdGEgaW1tZWRpYXRlbHkgaW4gY2FzZSB3ZSBjcmFzaCBsYXRlci4gIAogICAgICovCiAgICBzbm1wX3N0b3JlKGFwcF9uYW1lKTsKCiNpZmRlZiBTSUdIVVAKICAgIERFQlVHTVNHVEwoKCJzaWduYWwiLCAicmVnaXN0ZXJpbmcgU0lHSFVQIHNpZ25hbCBoYW5kbGVyXG4iKSk7CiAgICBzaWduYWwoU0lHSFVQLCBTbm1wZFJlY29uZmlnKTsKI2VuZGlmCgogICAgLyoKICAgICAqIFNlbmQgY29sZHN0YXJ0IHRyYXAgaWYgcG9zc2libGUuICAKICAgICAqLwogICAgc2VuZF9lYXN5X3RyYXAoMCwgMCk7CgogICAgLyoKICAgICAqIFdlJ3JlIHVwLCBsb2cgb3VyIHZlcnNpb24gbnVtYmVyLiAgCiAgICAgKi8KICAgIHNubXBfbG9nKExPR19JTkZPLCAiTkVULVNOTVAgdmVyc2lvbiAlc1xuIiwgbmV0c25tcF9nZXRfdmVyc2lvbigpKTsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgYWdlbnRfc3RhdHVzID0gQUdFTlRfUlVOTklORzsKI2VuZGlmCiAgICBuZXRzbm1wX2FkZHJjYWNoZV9pbml0aWFsaXNlKCk7CgogICAgLyoKICAgICAqIEZvcmV2ZXIgbW9uaXRvciB0aGUgZGVzdF9wb3J0IGZvciBpbmNvbWluZyBQRFVzLiAgCiAgICAgKi8KICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIldlJ3JlIHVwLiAgU3RhcnRpbmcgdG8gcHJvY2VzcyBkYXRhLlxuIikpOwogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJTkVUU05NUF9EU19BR0VOVF9RVUlUX0lNTUVESUFURUxZKSkKICAgICAgICByZWNlaXZlKCk7CiAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJzZW5kaW5nIHNodXRkb3duIHRyYXBcbiIpKTsKICAgIFNubXBUcmFwTm9kZURvd24oKTsKICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIkJ5ZS4uLlxuIikpOwogICAgc25tcF9zaHV0ZG93bihhcHBfbmFtZSk7CiAgICBzaHV0ZG93bl9tYXN0ZXJfYWdlbnQoKTsKICAgIHNodXRkb3duX2FnZW50KCk7CgogICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJTkVUU05NUF9EU19BR0VOVF9MRUFWRV9QSURGSUxFKSAmJgoJKHBpZF9maWxlICE9IE5VTEwpKSB7CiAgICAgICAgdW5saW5rKHBpZF9maWxlKTsKICAgIH0KI2lmZGVmIFdJTjMyU0VSVklDRQogICAgYWdlbnRfc3RhdHVzID0gQUdFTlRfU1RPUFBFRDsKI2VuZGlmCgogICAgU05NUF9GUkVFKGFyZ3ZyZXN0YXJ0bmFtZSk7CiAgICBTTk1QX0ZSRUUoYXJndnJlc3RhcnQpOwogICAgU05NUF9GUkVFKGFyZ3ZyZXN0YXJ0cCk7CiAgICBTT0NLX0NMRUFOVVA7CiAgICByZXR1cm4gMDsKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgbWFpbigpIC0tIHNubXBkICovCgojaWYgZGVmaW5lZChXSU4zMikKCiNpbmNsdWRlIDxwcm9jZXNzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfYXNzZXJ0Lmg+CgpzdGF0aWMgdW5zaWduZWQgc190aHJlYWRpZDsKSEFORExFIHNfdGhyZWFkX2hhbmRsZTsKCnN0YXRpYyB1bnNpZ25lZCBfX3N0ZGNhbGwgd2FpdF9mb3Jfc3RkaW4odm9pZCogYXJnKQp7CiAgICBpZiAoZ2V0YyhzdGRpbikgIT0gRU9GKQogICAgICAgIG5ldHNubXBfcnVubmluZyA9IDA7CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgY3JlYXRlX3N0ZGluX3dhaXRlcl90aHJlYWQodm9pZCkKewogICAgbmV0c25tcF9hc3NlcnQoc190aHJlYWRfaGFuZGxlID09IDApOwogICAgc190aHJlYWRfaGFuZGxlID0gKEhBTkRMRSlfYmVnaW50aHJlYWRleCgwLCAwLCB3YWl0X2Zvcl9zdGRpbiwgMCwgMCwgJnNfdGhyZWFkaWQpOwogICAgbmV0c25tcF9hc3NlcnQoc190aHJlYWRfaGFuZGxlICE9IDApOwp9CgpzdGF0aWMgdm9pZCBqb2luX3N0ZGluX3dhaXRlcl90aHJlYWQodm9pZCkKewogICAgaW50IHJlc3VsdDsKCiAgICBuZXRzbm1wX2Fzc2VydChzX3RocmVhZF9oYW5kbGUgIT0gMCk7CiAgICByZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KHNfdGhyZWFkX2hhbmRsZSwgMTAwMCk7CiAgICBuZXRzbm1wX2Fzc2VydChyZXN1bHQgIT0gV0FJVF9USU1FT1VUKTsKICAgIENsb3NlSGFuZGxlKHNfdGhyZWFkX2hhbmRsZSk7CiAgICBzX3RocmVhZF9oYW5kbGUgPSAwOwp9CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogcmVjZWl2ZQogKgogKiBQYXJhbWV0ZXJzOgogKiAgICAgIAogKiBSZXR1cm5zOgogKgkwCU9uIHN1Y2Nlc3MuCiAqCS0xCVN5c3RlbSBlcnJvci4KICoKICogSW5maW5pdGUgd2hpbGUtbG9vcCB3aGljaCBtb25pdG9ycyBpbmNvbWluZyBtZXNzYWdlcyBmb3IgdGhlIGFnZW50LgogKiBJbnZva2UgdGhlIGVzdGFibGlzaGVkIG1lc3NhZ2UgaGFuZGxlcnMgZm9yIGluY29taW5nIG1lc3NhZ2VzIG9uIGEgcGVyCiAqIHBvcnQgYmFzaXMuICBIYW5kbGUgdGltZW91dHMuCiAqLwpzdGF0aWMgaW50CnJlY2VpdmUodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIG51bWZkczsKICAgIG5ldHNubXBfbGFyZ2VfZmRfc2V0IHJlYWRmZHMsIHdyaXRlZmRzLCBleGNlcHRmZHM7CiAgICBzdHJ1Y3QgdGltZXZhbCAgdGltZW91dCwgKnR2cCA9ICZ0aW1lb3V0OwogICAgaW50ICAgICAgICAgICAgIGNvdW50LCBibG9jaywgaTsKI2lmZGVmCVVTSU5HX1NNVVhfTU9EVUxFCiAgICBpbnQgICAgICAgICAgICAgc2Q7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVVNJTkdfU01VWF9NT0RVTEUgKi8KCiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldF9pbml0KCZyZWFkZmRzLCBGRF9TRVRTSVpFKTsKICAgIG5ldHNubXBfbGFyZ2VfZmRfc2V0X2luaXQoJndyaXRlZmRzLCBGRF9TRVRTSVpFKTsKICAgIG5ldHNubXBfbGFyZ2VfZmRfc2V0X2luaXQoJmV4Y2VwdGZkcywgRkRfU0VUU0laRSk7CgogICAgLyoKICAgICAqIGlnbm9yZSBlYXJseSBzaWdodXAgZHVyaW5nIHN0YXJ0dXAKICAgICAqLwogICAgcmVjb25maWcgPSAwOwoKI2lmIGRlZmluZWQoV0lOMzIpCiAgICBjcmVhdGVfc3RkaW5fd2FpdGVyX3RocmVhZCgpOwojZW5kaWYKCiAgICAvKgogICAgICogTG9vcC1mb3JldmVyOiBleGVjdXRlIG1lc3NhZ2UgaGFuZGxlcnMgZm9yIHNvY2tldHMgd2l0aCBkYXRhCiAgICAgKi8KICAgIHdoaWxlIChuZXRzbm1wX3J1bm5pbmcpIHsKICAgICAgICBpZiAocmVjb25maWcpIHsKI2lmIEhBVkVfU0lHSE9MRAogICAgICAgICAgICBzaWdob2xkKFNJR0hVUCk7CiNlbmRpZgogICAgICAgICAgICByZWNvbmZpZyA9IDA7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19JTkZPLCAiUmVjb25maWd1cmluZyBkYWVtb25cbiIpOwoJICAgIC8qICBTdG9wIGFuZCByZXN0YXJ0IGxvZ2dpbmcuICBUaGlzIGFsbG93cyBsb2dmaWxlcyB0byBiZQoJCXJvdGF0ZWQgZXRjLiAgKi8KCSAgICBuZXRzbm1wX2xvZ2dpbmdfcmVzdGFydCgpOwoJICAgIHNubXBfbG9nKExPR19JTkZPLCAiTkVULVNOTVAgdmVyc2lvbiAlcyByZXN0YXJ0ZWRcbiIsCgkJICAgICBuZXRzbm1wX2dldF92ZXJzaW9uKCkpOwogICAgICAgICAgICB1cGRhdGVfY29uZmlnKCk7CiAgICAgICAgICAgIHNlbmRfZWFzeV90cmFwKFNOTVBfVFJBUF9FTlRFUlBSSVNFU1BFQ0lGSUMsIDMpOwojaWYgSEFWRV9TSUdIT0xECiAgICAgICAgICAgIHNpZ3JlbHNlKFNJR0hVUCk7CiNlbmRpZgogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBkZWZhdWx0IHRvIHNsZWVwaW5nIGZvciBhIHJlYWxseSBsb25nIHRpbWUuIElOVF9NQVgKICAgICAgICAgKiBzaG91bGQgYmUgc3VmZmljaWVudCAoZWcgd2UgZG9uJ3QgY2FyZSBpZiB0aW1lX3QgaXMKICAgICAgICAgKiBhIGxvbmcgdGhhdCdzIGJpZ2dlciB0aGFuIGFuIGludCkuCiAgICAgICAgICovCiAgICAgICAgdHZwID0gJnRpbWVvdXQ7CiAgICAgICAgdHZwLT50dl9zZWMgPSBJTlRfTUFYOwogICAgICAgIHR2cC0+dHZfdXNlYyA9IDA7CgogICAgICAgIG51bWZkcyA9IDA7CiAgICAgICAgTkVUU05NUF9MQVJHRV9GRF9aRVJPKCZyZWFkZmRzKTsKICAgICAgICBORVRTTk1QX0xBUkdFX0ZEX1pFUk8oJndyaXRlZmRzKTsKICAgICAgICBORVRTTk1QX0xBUkdFX0ZEX1pFUk8oJmV4Y2VwdGZkcyk7CiAgICAgICAgYmxvY2sgPSAwOwogICAgICAgIHNubXBfc2VsZWN0X2luZm8yKCZudW1mZHMsICZyZWFkZmRzLCB0dnAsICZibG9jayk7CiAgICAgICAgaWYgKGJsb2NrID09IDEpIHsKICAgICAgICAgICAgdHZwID0gTlVMTDsgICAgICAgICAvKiBibG9jayB3aXRob3V0IHRpbWVvdXQgKi8KCX0KCiNpZmRlZglVU0lOR19TTVVYX01PRFVMRQogICAgICAgIGlmIChzbXV4X2xpc3Rlbl9zZCA+PSAwKSB7CiAgICAgICAgICAgIE5FVFNOTVBfTEFSR0VfRkRfU0VUKHNtdXhfbGlzdGVuX3NkLCAmcmVhZGZkcyk7CiAgICAgICAgICAgIG51bWZkcyA9CiAgICAgICAgICAgICAgICBzbXV4X2xpc3Rlbl9zZCA+PSBudW1mZHMgPyBzbXV4X2xpc3Rlbl9zZCArIDEgOiBudW1mZHM7CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc211eF9zbm1wX3NlbGVjdF9saXN0X2dldF9sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBzZCA9IHNtdXhfc25tcF9zZWxlY3RfbGlzdF9nZXRfU0RfZnJvbV9MaXN0KGkpOwogICAgICAgICAgICAgICAgaWYgKHNkICE9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBORVRTTk1QX0xBUkdFX0ZEX1NFVChzZCwgJnJlYWRmZHMpOwogICAgICAgICAgICAgICAgICAgbnVtZmRzID0gc2QgPj0gbnVtZmRzID8gc2QgKyAxIDogbnVtZmRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTSU5HX1NNVVhfTU9EVUxFICovCgogICAgICAgIG5ldHNubXBfZXh0ZXJuYWxfZXZlbnRfaW5mbzIoJm51bWZkcywgJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcyk7CgogICAgcmVzZWxlY3Q6CiAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9FWFRFUk5BTF9TSUdTOyBpKyspIHsKICAgICAgICAgICAgaWYgKGV4dGVybmFsX3NpZ25hbF9zY2hlZHVsZWRbaV0pIHsKICAgICAgICAgICAgICAgIGV4dGVybmFsX3NpZ25hbF9zY2hlZHVsZWRbaV0tLTsKICAgICAgICAgICAgICAgIGV4dGVybmFsX3NpZ25hbF9oYW5kbGVyW2ldKGkpOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBERUJVR01TR1RMKCgic25tcGQvc2VsZWN0IiwgInNlbGVjdCggbnVtZmRzPSVkLCAuLi4sIHR2cD0lcClcbiIsCiAgICAgICAgICAgICAgICAgICAgbnVtZmRzLCB0dnApKTsKICAgICAgICBpZih0dnApCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0aW1lciIsICJ0dnAgJWxkLiVsZFxuIiwgdHZwLT50dl9zZWMsIHR2cC0+dHZfdXNlYykpOwogICAgICAgIGNvdW50ID0gbmV0X3NubXBfbGFyZ2VfZmRfc2V0X3NlbGVjdChudW1mZHMsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMsCgkJCQkgICAgICB0dnApOwogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9zZWxlY3QiLCAicmV0dXJuZWQsIGNvdW50ID0gJWRcbiIsIGNvdW50KSk7CgogICAgICAgIGlmIChjb3VudCA+IDApIHsKCiNpZmRlZiBVU0lOR19TTVVYX01PRFVMRQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBoYW5kbGUgdGhlIFNNVVggc2QncyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzbXV4X2xpc3Rlbl9zZCA+PSAwKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc211eF9zbm1wX3NlbGVjdF9saXN0X2dldF9sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgc2QgPSBzbXV4X3NubXBfc2VsZWN0X2xpc3RfZ2V0X1NEX2Zyb21fTGlzdChpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTkVUU05NUF9MQVJHRV9GRF9JU1NFVChzZCwgJnJlYWRmZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbXV4X3Byb2Nlc3Moc2QpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc211eF9zbm1wX3NlbGVjdF9saXN0X2RlbChzZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbmV3IGNvbm5lY3Rpb24gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmIChORVRTTk1QX0xBUkdFX0ZEX0lTU0VUKHNtdXhfbGlzdGVuX3NkLCAmcmVhZGZkcykpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKHNkID0gc211eF9hY2NlcHQoc211eF9saXN0ZW5fc2QpKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNtdXhfc25tcF9zZWxlY3RfbGlzdF9hZGQoc2QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0lOR19TTVVYX01PRFVMRSAqLwogICAgICAgICAgICBuZXRzbm1wX2Rpc3BhdGNoX2V4dGVybmFsX2V2ZW50czIoJmNvdW50LCAmcmVhZGZkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3cml0ZWZkcywgJmV4Y2VwdGZkcyk7CiAgICAgICAgICAgIC8qIElmIHRoZXJlIGFyZSBzdGlsbCBldmVudHMgbGVmdG92ZXIsIHByb2Nlc3MgdGhlbSAqLwogICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgICAgICAgICAgc25tcF9yZWFkMigmcmVhZGZkcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UKICAgICAgICAgICAgc3dpdGNoIChjb3VudCkgewogICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICBzbm1wX3RpbWVvdXQoKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL3NlbGVjdCIsICIgIGVycm5vID0gJWRcbiIsIGVycm5vKSk7CiAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKICAgICAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICAgICAqIGxpa2VseSB0aGF0IHdlIGdvdCBhIHNpZ25hbC4gQ2hlY2sgb3VyIHNwZWNpYWwgc2lnbmFsCiAgICAgICAgICAgICAgICAgICAgICogZmxhZ3MgYmVmb3JlIHJldHJ5aW5nIHNlbGVjdC4KICAgICAgICAgICAgICAgICAgICAgKi8KCQkgICAgaWYgKG5ldHNubXBfcnVubmluZyAmJiAhcmVjb25maWcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZ290byByZXNlbGVjdDsKCQkgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoInNlbGVjdCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgc25tcF9sb2coTE9HX0VSUiwgInNlbGVjdCByZXR1cm5lZCAlZFxuIiwgY291bnQpOwogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgIC8qIGVuZGlmIC0tIGNvdW50PjAgKi8KCiAgICAgICAgLyoKICAgICAgICAgKiBzZWUgaWYgcGVyc2lzdGVudCBzdG9yZSBuZWVkcyB0byBiZSBzYXZlZAogICAgICAgICAqLwogICAgICAgIHNubXBfc3RvcmVfaWZfbmVlZGVkKCk7CgogICAgICAgIC8qCiAgICAgICAgICogcnVuIHJlcXVlc3RlZCBhbGFybXMgCiAgICAgICAgICovCiAgICAgICAgcnVuX2FsYXJtcygpOwoKICAgICAgICBuZXRzbm1wX2NoZWNrX291dHN0YW5kaW5nX2FnZW50X3JlcXVlc3RzKCk7CgogICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVuZHdoaWxlICovCgogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfY2xlYW51cCgmcmVhZGZkcyk7CiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldF9jbGVhbnVwKCZ3cml0ZWZkcyk7CiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldF9jbGVhbnVwKCZleGNlcHRmZHMpOwoKI2lmIGRlZmluZWQoV0lOMzIpCiAgICBqb2luX3N0ZGluX3dhaXRlcl90aHJlYWQoKTsKI2VuZGlmCgogICAgc25tcF9sb2coTE9HX0lORk8sICJSZWNlaXZlZCBURVJNIG9yIFNUT1Agc2lnbmFsLi4uICBzaHV0dGluZyBkb3duLi4uXG4iKTsKICAgIHJldHVybiAwOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgcmVjZWl2ZSgpICovCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHNubXBfaW5wdXQKICoKICogUGFyYW1ldGVyczoKICoJIG9wCiAqCSpzZXNzaW9uCiAqCSByZXF1aWQKICoJKnBkdQogKgkqbWFnaWMKICogICAgICAKICogUmV0dXJuczoKICoJMQkJT24gc3VjY2VzcwktT1ItCiAqCVBhc3NlcyB0aHJvdWdoCVJldHVybiBmcm9tIGFsYXJtR2V0UmVzcG9uc2UoKSB3aGVuIAogKgkgIAkJICBVU0lOR19WMlBBUlRZX0FMQVJNX01PRFVMRSBpcyBkZWZpbmVkLgogKgogKiBDYWxsLWJhY2sgZnVuY3Rpb24gdG8gbWFuYWdlIHJlc3BvbnNlcyB0byB0cmFwcyAoaW5mb3JtcykgYW5kIGFsYXJtcy4KICogTm90IHVzZWQgYnkgdGhlIGFnZW50IHRvIHByb2Nlc3Mgb3RoZXIgUmVzcG9uc2UgUERVcy4KICovCmludApzbm1wX2lucHV0KGludCBvcCwKICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzZXNzaW9uLAogICAgICAgICAgIGludCByZXFpZCwgbmV0c25tcF9wZHUgKnBkdSwgdm9pZCAqbWFnaWMpCnsKICAgIHN0cnVjdCBnZXRfcmVxX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgZ2V0X3JlcV9zdGF0ZSAqKSBtYWdpYzsKCiAgICBpZiAob3AgPT0gTkVUU05NUF9DQUxMQkFDS19PUF9SRUNFSVZFRF9NRVNTQUdFKSB7CiAgICAgICAgaWYgKHBkdS0+Y29tbWFuZCA9PSBTTk1QX01TR19HRVQpIHsKICAgICAgICAgICAgaWYgKHN0YXRlLT50eXBlID09IEVWRU5UX0dFVF9SRVEpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIGp1c3QgdGhlIGFjayB0byBvdXIgaW5mb3JtIHBkdSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG9wID09IE5FVFNOTVBfQ0FMTEJBQ0tfT1BfVElNRURfT1VUKSB7CiAgICAgICAgaWYgKHN0YXRlLT50eXBlID09IEFMQVJNX0dFVF9SRVEpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTmVlZCBhIG1lY2hhbmlzbSB0byByZXBsYWNlIG9ic29sZXRlIFNOTVB2MnAgYWxhcm0gCiAgICAgICAgICAgICAqLwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgc25tcF9pbnB1dCgpICovCgoKCi8qCiAqIFdpbmRvd3MgU2VydmljZSBSZWxhdGVkIGZ1bmN0aW9ucyAKICovCiNpZmRlZiBXSU4zMlNFUlZJQ0UKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG1haW4gZnVuY3Rpb24gZm9yIFdpbmRvd3MKKiBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciBzdGFydHVwIG9wdGlvbnMsCiogdG8gc3RhcnQgYXMgc2VydmljZSBvciBjb25zb2xlIG1vZGUgYXBwbGljYXRpb24gaW4gd2luZG93cy4KKiBJbnZva2VzIGFwcHJvcHJpYXRlIHN0YXJ0dXAgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgCiogcGFyYW1ldGVycyBwYXNzZWQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CiAgICBfX2NkZWNsCl90bWFpbihpbnQgYXJnYywgVENIQVIgKiBhcmd2W10pCnsKICAgIC8qCiAgICAgKiBEZWZpbmUgU2VydmljZSBOYW1lIGFuZCBEZXNjcmlwdGlvbiwgd2hpY2ggYXBwZWFycyBpbiB3aW5kb3dzIFNDTSAKICAgICAqLwogICAgTFBDVFNUUiAgICAgICAgIGxwc3pTZXJ2aWNlTmFtZSA9IGFwcF9uYW1lX2xvbmc7ICAgICAgLyogU2VydmljZSBSZWdpc3RyeSBOYW1lICovCiAgICBMUENUU1RSICAgICAgICAgbHBzelNlcnZpY2VEaXNwbGF5TmFtZSA9IF9UKCJOZXQtU05NUCBBZ2VudCIpOyAgICAgICAvKiBEaXNwbGF5IE5hbWUgKi8KICAgIExQQ1RTVFIgICAgICAgICBscHN6U2VydmljZURlc2NyaXB0aW9uID0KI2lmZGVmIElGREVTQ1IKICAgICAgICBfVCgiU05NUHYyYyAvIFNOTVB2MyBjb21tYW5kIHJlc3BvbmRlciBmcm9tIE5ldC1TTk1QLiBTdXBwb3J0cyBNSUIgb2JqZWN0cyBmb3IgSVAsSUNNUCxUQ1AsVURQLCBhbmQgbmV0d29yayBpbnRlcmZhY2Ugc3ViLWxheWVycy4iKTsKI2Vsc2UKICAgICAgICBfVCgiU05NUHYyYyAvIFNOTVB2MyBjb21tYW5kIHJlc3BvbmRlciBmcm9tIE5ldC1TTk1QIik7CiNlbmRpZgogICAgSW5wdXRQYXJhbXMgICAgIElucHV0T3B0aW9uczsKCgogICAgaW50ICAgICAgICAgICAgIG5SdW5UeXBlID0gUlVOX0FTX0NPTlNPTEU7CiAgICBpbnQgICAgICAgICAgICAgcXVpZXQgPSAwOwogICAgCiAgICBuUnVuVHlwZSA9IFBhcnNlQ21kTGluZUZvclNlcnZpY2VPcHRpb24oYXJnYywgYXJndiwgJnF1aWV0KTsKCiAgICBzd2l0Y2ggKG5SdW5UeXBlKSB7CiAgICBjYXNlIFJFR0lTVEVSX1NFUlZJQ0U6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWdpc3RlciBBcyBzZXJ2aWNlIAogICAgICAgICAqLwogICAgICAgIElucHV0T3B0aW9ucy5BcmdjID0gYXJnYzsKICAgICAgICBJbnB1dE9wdGlvbnMuQXJndiA9IGFyZ3Y7CiAgICAgICAgZXhpdCAoUmVnaXN0ZXJTZXJ2aWNlKGxwc3pTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgbHBzelNlcnZpY2VEaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgbHBzelNlcnZpY2VEZXNjcmlwdGlvbiwgJklucHV0T3B0aW9ucywgcXVpZXQpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVU5fUkVHSVNURVJfU0VSVklDRToKICAgICAgICAvKgogICAgICAgICAqIFVucmVnaXN0ZXIgc2VydmljZSAKICAgICAgICAgKi8KICAgICAgICBleGl0IChVbnJlZ2lzdGVyU2VydmljZShscHN6U2VydmljZU5hbWUsIHF1aWV0KSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFJVTl9BU19TRVJWSUNFOgogICAgICAgIC8qCiAgICAgICAgICogUnVuIGFzIHNlcnZpY2UgCiAgICAgICAgICovCiAgICAgICAgLyoKICAgICAgICAgKiBSZWdpc3RlciBTdG9wIEZ1bmN0aW9uIAogICAgICAgICAqLwogICAgICAgIFJlZ2lzdGVyU3RvcEZ1bmN0aW9uKFN0b3BTbm1wQWdlbnQpOwogICAgICAgIHJldHVybiBSdW5Bc1NlcnZpY2UoU25tcERhZW1vbk1haW4pOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAvKgogICAgICAgICAqIFJ1biBpbiBjb25zb2xlIG1vZGUgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuIFNubXBEYWVtb25NYWluKGFyZ2MsIGFyZ3YpOwogICAgICAgIGJyZWFrOwogICAgfQp9CgovKgogKiBUbyBzdG9wIFNubXAgQWdlbnQgZGFlbW9uCiAqIFRoaXMgcG9ydGlvbiBpcyBzdGlsbCBub3Qgd29ya2luZwogKi8Kdm9pZApTdG9wU25tcEFnZW50KHZvaWQpCnsKICAgIC8qCiAgICAgKiBTaHV0IERvd24gQWdlbnQgCiAgICAgKi8KICAgIFNubXBkU2h1dERvd24oMSk7CgogICAgLyoKICAgICAqIFdhaXQgdGlsbCBhZ2VudCBpcyBjb21wbGV0ZWx5IHN0b3BwZWQgCiAgICAgKi8KCiAgICB3aGlsZSAoYWdlbnRfc3RhdHVzICE9IEFHRU5UX1NUT1BQRUQpIHsKICAgICAgICBTbGVlcCgxMDApOwogICAgfQp9CgojZW5kaWYgLypXSU4zMlNFUlZJQ0UqLwo=