LyoKICogc25tcGQuYwogKi8KLyoqIEBkZWZncm91cCBhZ2VudCBUaGUgTmV0LVNOTVAgYWdlbnQKICogVGhlIHNubXAgYWdlbnQgcmVzcG9uZHMgdG8gU05NUCBxdWVyaWVzIGZyb20gbWFuYWdlbWVudCBzdGF0aW9ucwogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIENvcHlyaWdodCAxOTg4LCAxOTg5IGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CiAqIAogKiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqIAogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCiAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKICogYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAogKiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIENNVSBub3QgYmUKICogdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCiAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAogKiAKICogQ01VIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKICogQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCiAqIENNVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAogKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCiAqIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKICogU09GVFdBUkUuCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgojaW5jbHVkZSA8bmV0LXNubXAvbmV0LXNubXAtZmVhdHVyZXMuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL3R5cGVzLmg+CgojaWYgSEFWRV9JT19ICiNpbmNsdWRlIDxpby5oPgojZW5kaWYKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaWYgSEFWRV9TVFJJTkdfSAojaW5jbHVkZSA8c3RyaW5nLmg+CiNlbHNlCiNpbmNsdWRlIDxzdHJpbmdzLmg+CiNlbmRpZgojaWYgSEFWRV9TVERMSUJfSAojaW5jbHVkZSA8c3RkbGliLmg+CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAojaW5jbHVkZSA8dW5pc3RkLmg+CiNlbmRpZgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpZiBIQVZFX05FVElORVRfSU5fSAojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojZW5kaWYKI2lmIEhBVkVfQVJQQV9JTkVUX0gKI2luY2x1ZGUgPGFycGEvaW5ldC5oPgojZW5kaWYKI2lmIFRJTUVfV0lUSF9TWVNfVElNRQojIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojIGlmIEhBVkVfU1lTX1RJTUVfSAojICBpbmNsdWRlIDxzeXMvdGltZS5oPgojIGVsc2UKIyAgaW5jbHVkZSA8dGltZS5oPgojIGVuZGlmCiNlbmRpZgojaWYgSEFWRV9TWVNfU0VMRUNUX0gKI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19TT0NLRVRfSAojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojZW5kaWYKI2lmIEhBVkVfTkVUX0lGX0gKI2luY2x1ZGUgPG5ldC9pZi5oPgojZW5kaWYKI2lmIEhBVkVfSU5FVF9NSUIyX0gKI2luY2x1ZGUgPGluZXQvbWliMi5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX0lPQ1RMX0gKI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX0ZJTEVfSAojaW5jbHVkZSA8c3lzL2ZpbGUuaD4KI2VuZGlmCiNpZmRlZiBIQVZFX0ZDTlRMX0gKI2luY2x1ZGUgPGZjbnRsLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfV0FJVF9ICiNpbmNsdWRlIDxzeXMvd2FpdC5oPgojZW5kaWYKI2luY2x1ZGUgPHNpZ25hbC5oPgojaWZkZWYgSEFWRV9TWVNfUEFSQU1fSAojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNlbmRpZgojaWYgSEFWRV9QUk9DRVNTX0ggICAgICAgICAgICAgIC8qIFdpbjMyLWdldHBpZCAqLwojaW5jbHVkZSA8cHJvY2Vzcy5oPgojZW5kaWYKI2lmIEhBVkVfTElNSVRTX0gKI2luY2x1ZGUgPGxpbWl0cy5oPgojZW5kaWYKI2lmIEhBVkVfUFdEX0gKI2luY2x1ZGUgPHB3ZC5oPgojZW5kaWYKI2lmIEhBVkVfR1JQX0gKI2luY2x1ZGUgPGdycC5oPgojZW5kaWYKI2lmZGVmIEhBVkVfQ1JUREJHX0gKI2luY2x1ZGUgPGNydGRiZy5oPgojZW5kaWYKCiNpZm5kZWYgUEFUSF9NQVgKIyBpZmRlZiBfUE9TSVhfUEFUSF9NQVgKIyAgZGVmaW5lIFBBVEhfTUFYIF9QT1NJWF9QQVRIX01BWAojIGVsc2UKIyAgZGVmaW5lIFBBVEhfTUFYIDI1NQojIGVuZGlmCiNlbmRpZgoKI2lmbmRlZiBGRF9TRVQKdHlwZWRlZiBsb25nICAgIGZkX21hc2s7CiNkZWZpbmUgTkZEQklUUyAoc2l6ZW9mKGZkX21hc2spICogTkJCWSkgICAgICAgIC8qIGJpdHMgcGVyIG1hc2sgKi8KI2RlZmluZSBGRF9TRVQobiwgcCkgICAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdIHw9ICgxIDw8ICgobikgJSBORkRCSVRTKSkpCiNkZWZpbmUgRkRfQ0xSKG4sIHApICAgICgocCktPmZkc19iaXRzWyhuKS9ORkRCSVRTXSAmPSB+KDEgPDwgKChuKSAlIE5GREJJVFMpKSkKI2RlZmluZSBGRF9JU1NFVChuLCBwKSAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICYgKDEgPDwgKChuKSAlIE5GREJJVFMpKSkKI2RlZmluZSBGRF9aRVJPKHApICAgICAgbWVtc2V0KChwKSwgMCwgc2l6ZW9mKCoocCkpKQojZW5kaWYKCiNpbmNsdWRlIDxuZXQtc25tcC9uZXQtc25tcC1pbmNsdWRlcy5oPgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbmV0LXNubXAtYWdlbnQtaW5jbHVkZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L2ZkX2V2ZW50X21hbmFnZXIuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvbGFyZ2VfZmRfc2V0Lmg+CgojaW5jbHVkZSAibTJtLmgiCiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hZ2VudF9tb2R1bGVfY29uZmlnLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9taWJfbW9kdWxlX2NvbmZpZy5oPgoKI2luY2x1ZGUgInNubXBkLmgiCgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbWliX21vZHVsZXMuaD4KCiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hZ2VudF90cmFwLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvdGFibGUuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3RhYmxlX2l0ZXJhdG9yLmg+CgovKgogKiBJbmNsdWRlIHdpbnNlcnZpY2UuaCB0byBzdXBwb3J0IFdpbmRvd3MgU2VydmljZQogKi8KI2lmZGVmIFdJTjMyCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDx0Y2hhci5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS93aW5zZXJ2aWNlLmg+CgojZGVmaW5lIFdJTjMyU0VSVklDRQoKI2VuZGlmCgpuZXRzbm1wX2ZlYXR1cmVfd2FudChsb2dnaW5nX2ZpbGUpCm5ldHNubXBfZmVhdHVyZV93YW50KGxvZ2dpbmdfc3RkaW8pCm5ldHNubXBfZmVhdHVyZV93YW50KGxvZ2dpbmdfc3lzbG9nKQoKLyoKICogR2xvYmFscy4KICovCiNpZmRlZiBORVRTTk1QX1VTRV9MSUJXUkFQCiNpbmNsdWRlIDx0Y3BkLmg+CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTkVUU05NUF9VU0VfTElCV1JBUCAqLwoKI2RlZmluZSBUSU1FVElDSyAgICAgICAgIDUwMDAwMEwKCmludCAgICAgICAgICAgICBzbm1wX2R1bXBfcGFja2V0OwpzdGF0aWMgaW50ICAgICAgcmVjb25maWcgPSAwOwppbnQgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfREFFTU9OOwoKI2lmZGVmIFdJTjMyU0VSVklDRQovKgogKiBTTk1QIEFnZW50IFN0YXR1cyAKICovCiNkZWZpbmUgQUdFTlRfUlVOTklORyAxCiNkZWZpbmUgQUdFTlRfU1RPUFBFRCAwCmludCAgICAgICAgICAgICBhZ2VudF9zdGF0dXMgPSBBR0VOVF9TVE9QUEVEOwovKiBhcHBfbmFtZV9sb25nIHVzZWQgZm9yIEV2ZW50IExvZyAoc3lzbG9nKSwgU0NNLCByZWdpc3RyeSBldGMgKi8KTFBDVFNUUiAgICAgICAgIGFwcF9uYW1lX2xvbmcgPSBfVCgiTmV0LVNOTVAgQWdlbnQiKTsgICAgIC8qIEFwcGxpY2F0aW9uIE5hbWUgKi8KI2VuZGlmCgpjb25zdCBjaGFyICAgICAqYXBwX25hbWUgPSAic25tcGQiOwoKZXh0ZXJuIGludCAgICAgIG5ldHNubXBfcnVubmluZzsKI2lmZGVmIFVTSU5HX1VUSUxfRlVOQ1NfUkVTVEFSVF9NT0RVTEUKZXh0ZXJuIGNoYXIgICAqKmFyZ3ZyZXN0YXJ0cDsKZXh0ZXJuIGNoYXIgICAgKmFyZ3ZyZXN0YXJ0OwpleHRlcm4gY2hhciAgICAqYXJndnJlc3RhcnRuYW1lOwojZW5kaWYgLyogVVNJTkdfVVRJTF9GVU5DU19SRVNUQVJUX01PRFVMRSAqLwoKI2lmZGVmIFVTSU5HX1NNVVhfTU9EVUxFCiNpbmNsdWRlIDxtaWJncm91cC9zbXV4L3NtdXguaD4KI2VuZGlmIC8qIFVTSU5HX1NNVVhfTU9EVUxFICovCgovKgogKiBQcm90b3R5cGVzLgogKi8KaW50ICAgICAgICAgICAgIHNubXBfcmVhZF9wYWNrZXQoaW50KTsKaW50ICAgICAgICAgICAgIHNubXBfaW5wdXQoaW50LCBuZXRzbm1wX3Nlc3Npb24gKiwgaW50LCBuZXRzbm1wX3BkdSAqLAogICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopOwpzdGF0aWMgdm9pZCAgICAgdXNhZ2UoY2hhciAqKTsKc3RhdGljIHZvaWQgICAgIFNubXBUcmFwTm9kZURvd24odm9pZCk7CnN0YXRpYyBpbnQgICAgICByZWNlaXZlKHZvaWQpOwojaWZkZWYgV0lOMzJTRVJWSUNFCnZvaWQgICAgICAgICAgICBTdG9wU25tcEFnZW50KHZvaWQpOwppbnQgICAgICAgICAgICAgU25tcERhZW1vbk1haW4oaW50IGFyZ2MsIFRDSEFSICogYXJndltdKTsKaW50IF9fY2RlY2wgICAgIF90bWFpbihpbnQgYXJnYywgVENIQVIgKiBhcmd2W10pOwojZWxzZQppbnQgICAgICAgICAgICAgbWFpbihpbnQsIGNoYXIgKiopOwojZW5kaWYKCi8qCiAqIFRoZXNlIGRlZmluaXRpb25zIGhhbmRsZSA0LjIgc3lzdGVtcyB3aXRob3V0IGFkZGl0aW9uYWwgc3lzbG9nIGZhY2lsaXRpZXMuCiAqLwojaWZuZGVmIExPR19DT05TCiNkZWZpbmUgTE9HX0NPTlMJMCAgICAgICAvKiBEb24ndCBib3RoZXIgaWYgbm90IGRlZmluZWQuLi4gKi8KI2VuZGlmCiNpZm5kZWYgTE9HX1BJRAojZGVmaW5lIExPR19QSUQJCTAgICAgICAgLyogRG9uJ3QgYm90aGVyIGlmIG5vdCBkZWZpbmVkLi4uICovCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDAKI2RlZmluZSBMT0dfTE9DQUwwCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMMQojZGVmaW5lIExPR19MT0NBTDEJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUwyCiNkZWZpbmUgTE9HX0xPQ0FMMgkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDMKI2RlZmluZSBMT0dfTE9DQUwzCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNAojZGVmaW5lIExPR19MT0NBTDQJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUw1CiNkZWZpbmUgTE9HX0xPQ0FMNQkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDYKI2RlZmluZSBMT0dfTE9DQUw2CTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNwojZGVmaW5lIExPR19MT0NBTDcJMAojZW5kaWYKI2lmbmRlZiBMT0dfREFFTU9OCiNkZWZpbmUgTE9HX0RBRU1PTgkwCiNlbmRpZgoKCnN0YXRpYyB2b2lkCnVzYWdlKGNoYXIgKnByb2cpCnsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgcHJpbnRmKCJcblVzYWdlOiAgJXMgWy1yZWdpc3Rlcl0gWy1xdWlldF0gW09QVElPTlNdIFtMSVNURU5JTkcgQUREUkVTU0VTXSIKICAgICAgICAgICAiXG4gICAgICAgICVzIFstdW5yZWdpc3Rlcl0gWy1xdWlldF0iLCBwcm9nLCBwcm9nKTsKI2Vsc2UKICAgIHByaW50ZigiXG5Vc2FnZTogICVzIFtPUFRJT05TXSBbTElTVEVOSU5HIEFERFJFU1NFU10iLCBwcm9nKTsKI2VuZGlmCiAgICBwcmludGYoIlxuIgogICAgICAgICAgICJcblx0VmVyc2lvbjogICVzXG4lcyIKICAgICAgICAgICAiXHRcdFx0ICAoY29uZmlnIHNlYXJjaCBwYXRoOiAlcylcbiVzJXMiLAogICAgICAgICAgIG5ldHNubXBfZ2V0X3ZlcnNpb24oKSwKICAgICAgICAgICAiXHRXZWI6ICAgICAgaHR0cDovL3d3dy5uZXQtc25tcC5vcmcvXG4iCiAgICAgICAgICAgIlx0RW1haWw6ICAgIG5ldC1zbm1wLWNvZGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXRcbiIKICAgICAgICAgICAiXG4gIC1hXHRcdFx0bG9nIGFkZHJlc3Nlc1xuIgogICAgICAgICAgICIgIC1BXHRcdFx0YXBwZW5kIHRvIHRoZSBsb2dmaWxlIHJhdGhlciB0aGFuIHRydW5jYXRpbmcgaXRcbiIKICAgICAgICAgICAiICAtYyBGSUxFWywuLi5dXHRcdHJlYWQgRklMRShzKSBhcyBjb25maWd1cmF0aW9uIGZpbGUocylcbiIKICAgICAgICAgICAiICAtQ1x0XHRcdGRvIG5vdCByZWFkIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZmlsZXNcbiIsCiAgICAgICAgICAgZ2V0X2NvbmZpZ3VyYXRpb25fZGlyZWN0b3J5KCksCiAgICAgICAgICAgIiAgLWRcdFx0XHRkdW1wIHNlbnQgYW5kIHJlY2VpdmVkIFNOTVAgcGFja2V0c1xuIgogICAgICAgICAgICIgIC1EW1RPS0VOWywuLi5dXVx0dHVybiBvbiBkZWJ1Z2dpbmcgb3V0cHV0IGZvciB0aGUgZ2l2ZW4gVE9LRU4ocylcbiIKCSAgICJcdFx0XHQgICh0cnkgQUxMIGZvciBleHRyZW1lbHkgdmVyYm9zZSBvdXRwdXQpXG4iCgkgICAiXHRcdFx0ICBEb24ndCBwdXQgc3BhY2UocykgYmV0d2VlbiAtRCBhbmQgVE9LRU4ocykuXG4iCiAgICAgICAgICAgIiAgLWZcdFx0XHRkbyBub3QgZm9yayBmcm9tIHRoZSBzaGVsbFxuIiwKI2lmIEhBVkVfVU5JU1REX0gKICAgICAgICAgICAiICAtZyBHSURcdFx0Y2hhbmdlIHRvIHRoaXMgbnVtZXJpYyBnaWQgYWZ0ZXIgb3BlbmluZ1xuIgoJICAgIlx0XHRcdCAgdHJhbnNwb3J0IGVuZHBvaW50c1xuIgojZW5kaWYKICAgICAgICAgICAiICAtaCwgLS1oZWxwXHRcdGRpc3BsYXkgdGhpcyB1c2FnZSBtZXNzYWdlXG4iCiAgICAgICAgICAgIiAgLUhcdFx0XHRkaXNwbGF5IGNvbmZpZ3VyYXRpb24gZmlsZSBkaXJlY3RpdmVzIHVuZGVyc3Rvb2RcbiIKICAgICAgICAgICAiICAtSSBbLV1JTklUTElTVFx0bGlzdCBvZiBtaWIgbW9kdWxlcyB0byBpbml0aWFsaXplIChvciBub3QpXG4iCiAgICAgICAgICAgIlx0XHRcdCAgKHJ1biBzbm1wZCB3aXRoIC1EbWliX2luaXQgZm9yIGEgbGlzdClcbiIKICAgICAgICAgICAiICAtTCA8TE9HT1BUUz5cdFx0dG9nZ2xlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hlcmUgdG8gbG9nIHRvXG4iKTsKICAgIHNubXBfbG9nX29wdGlvbnNfdXNhZ2UoIlx0Iiwgc3Rkb3V0KTsKICAgIHByaW50ZigiICAtbSBNSUJMSVNUXHRcdHVzZSBNSUJMSVNUIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgTUlCIGxpc3RcbiIKICAgICAgICAgICAiICAtTSBESVJMSVNUXHRcdHVzZSBESVJMSVNUIGFzIHRoZSBsaXN0IG9mIGxvY2F0aW9ucyB0byBsb29rIGZvciBNSUJzXG4iCiAgICAgICAgICAgIlx0XHRcdCAgKGRlZmF1bHQgJXMpXG4lcyVzIiwKI2lmbmRlZiBORVRTTk1QX0RJU0FCTEVfTUlCX0xPQURJTkcKICAgICAgICAgICBuZXRzbm1wX2dldF9taWJfZGlyZWN0b3J5KCksCiNlbHNlCiAgICAgICAgICAgIk1JQnMgbm90IGxvYWRlZCIsCiNlbmRpZgogICAgICAgICAgICIgIC1wIEZJTEVcdFx0c3RvcmUgcHJvY2VzcyBpZCBpbiBGSUxFXG4iCiAgICAgICAgICAgIiAgLXFcdFx0XHRwcmludCBpbmZvcm1hdGlvbiBpbiBhIG1vcmUgcGFyc2FibGUgZm9ybWF0XG4iCiAgICAgICAgICAgIiAgLXJcdFx0XHRkbyBub3QgZXhpdCBpZiBmaWxlcyBvbmx5IGFjY2Vzc2libGUgdG8gcm9vdFxuIgoJICAgIlx0XHRcdCAgY2Fubm90IGJlIG9wZW5lZFxuIgojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICAgICAgICAgIiAgLXJlZ2lzdGVyXHRcdHJlZ2lzdGVyIGFzIGEgV2luZG93cyBzZXJ2aWNlXG4iCiAgICAgICAgICAgIiAgXHRcdFx0ICAoZm9sbG93ZWQgYnkgLXF1aWV0IHRvIHByZXZlbnQgbWVzc2FnZSBwb3B1cHMpXG4iCiAgICAgICAgICAgIiAgXHRcdFx0ICAoZm9sbG93ZWQgYnkgdGhlIHN0YXJ0dXAgcGFyYW1ldGVyIGxpc3QpXG4iCiAgICAgICAgICAgIiAgXHRcdFx0ICBOb3RlIHRoYXQgc29tZSBwYXJhbWV0ZXJzIGFyZSBub3QgcmVsZXZhbnQgd2hlbiBydW5uaW5nIGFzIGEgc2VydmljZVxuIgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKICAgICAgICAgICAiICAtdSBVSURcdFx0Y2hhbmdlIHRvIHRoaXMgdWlkIChudW1lcmljIG9yIHRleHR1YWwpIGFmdGVyXG4iCgkgICAiXHRcdFx0ICBvcGVuaW5nIHRyYW5zcG9ydCBlbmRwb2ludHNcbiIKI2VuZGlmCiNpZmRlZiBXSU4zMlNFUlZJQ0UKICAgICAgICAgICAiICAtdW5yZWdpc3Rlclx0XHR1bnJlZ2lzdGVyIGFzIGEgV2luZG93cyBzZXJ2aWNlXG4iCiAgICAgICAgICAgIiAgXHRcdFx0ICAoZm9sbG93ZWQgLXF1aWV0IHRvIHByZXZlbnQgbWVzc2FnZSBwb3B1cHMpXG4iCiNlbmRpZgogICAgICAgICAgICIgIC12LCAtLXZlcnNpb25cdFx0ZGlzcGxheSB2ZXJzaW9uIGluZm9ybWF0aW9uXG4iCiAgICAgICAgICAgIiAgLVZcdFx0XHR2ZXJib3NlIGRpc3BsYXlcbiIKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSl8fCBkZWZpbmVkKFVTSU5HX0FHRU5UWF9NQVNURVJfTU9EVUxFKQogICAgICAgICAgICIgIC14IEFERFJFU1NcdFx0dXNlIEFERFJFU1MgYXMgQWdlbnRYIGFkZHJlc3NcbiIKI2VuZGlmCiNpZmRlZiBVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFCiAgICAgICAgICAgIiAgLVhcdFx0XHRydW4gYXMgYW4gQWdlbnRYIHN1YmFnZW50IHJhdGhlciB0aGFuIGFzIGFuXG4iCgkgICAiXHRcdFx0ICBTTk1QIG1hc3RlciBhZ2VudFxuIgojZW5kaWYKICAgICAgICAgICAsCiAgICAgICAgICAgIlxuRGVwcmVjYXRlZCBvcHRpb25zOlxuIgogICAgICAgICAgICIgIC1sIEZJTEVcdFx0dXNlIC1MZiA8RklMRT4gaW5zdGVhZFxuIgogICAgICAgICAgICIgIC1QXHRcdFx0dXNlIC1wIGluc3RlYWRcbiIKICAgICAgICAgICAiICAtc1x0XHRcdHVzZSAtTHNkIGluc3RlYWRcbiIKICAgICAgICAgICAiICAtUyBkfGl8MC03XHRcdHVzZSAtTHMgPGZhY2lsaXR5PiBpbnN0ZWFkXG4iCiAgICAgICAgICAgIlxuIgogICAgICAgICAgICk7CiAgICBleGl0KDEpOwp9CgpzdGF0aWMgdm9pZAp2ZXJzaW9uKHZvaWQpCnsKICAgIHByaW50ZigiXG5ORVQtU05NUCB2ZXJzaW9uOiAgJXNcbiIKICAgICAgICAgICAiV2ViOiAgICAgICAgICAgICAgIGh0dHA6Ly93d3cubmV0LXNubXAub3JnL1xuIgogICAgICAgICAgICJFbWFpbDogICAgICAgICAgICAgbmV0LXNubXAtY29kZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldFxuXG4iLAogICAgICAgICAgIG5ldHNubXBfZ2V0X3ZlcnNpb24oKSk7CiAgICBleGl0KDApOwp9CgpSRVRTSUdUWVBFClNubXBkU2h1dERvd24oaW50IGEpCnsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgZXh0ZXJuIG5ldHNubXBfc2Vzc2lvbiAqbWFpbl9zZXNzaW9uOwojZW5kaWYKICAgIG5ldHNubXBfcnVubmluZyA9IDA7CiNpZmRlZiBXSU4zMlNFUlZJQ0UKICAgIC8qCiAgICAgKiBJbiBjYXNlIG9mIHdpbmRvd3MsIHNlbGVjdCgpIGluIHJlY2VpdmUoKSBmdW5jdGlvbiB3aWxsIG5vdCByZXR1cm4gCiAgICAgKiBvbiBzaWduYWwuIFRoYXRzIHdoeSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgY2FsbGVkLCB3aGljaCBjbG9zZXMgdGhlIAogICAgICogc29ja2V0IGRlc2NyaXB0b3JzIGFuZCBjYXVzZXMgdGhlIHNlbGVjdCgpIHRvIHJldHVybgogICAgICovCiAgICBzbm1wX2Nsb3NlKG1haW5fc2Vzc2lvbik7CiNlbmRpZgp9CgojaWZkZWYgU0lHSFVQClJFVFNJR1RZUEUKU25tcGRSZWNvbmZpZyhpbnQgYSkKewogICAgcmVjb25maWcgPSAxOwogICAgc2lnbmFsKFNJR0hVUCwgU25tcGRSZWNvbmZpZyk7Cn0KI2VuZGlmCgojaWZkZWYgU0lHVVNSMQpleHRlcm4gdm9pZCAgICAgZHVtcF9yZWdpc3RyeSh2b2lkKTsKUkVUU0lHVFlQRQpTbm1wZER1bXAoaW50IGEpCnsKICAgIGR1bXBfcmVnaXN0cnkoKTsKICAgIHNpZ25hbChTSUdVU1IxLCBTbm1wZER1bXApOwp9CiNlbmRpZgoKUkVUU0lHVFlQRQpTbm1wZENhdGNoUmFuZG9tU2lnbmFsKGludCBhKQp7CiAgICAvKiBEaXNhYmxlIGFsbCBsb2dzIGFuZCBsb2cgdGhlIGVycm9yIHZpYSBzeXNsb2cgKi8KICAgIHNubXBfZGlzYWJsZV9sb2coKTsKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HCiAgICBzbm1wX2VuYWJsZV9zeXNsb2coKTsKI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19TWVNMT0cgKi8KICAgIHNubXBfbG9nKExPR19FUlIsICJFeGl0aW5nIG9uIHNpZ25hbCAlZFxuIiwgYSk7CiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRwogICAgc25tcF9kaXNhYmxlX3N5c2xvZygpOwojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRyAqLwogICAgZXhpdCgxKTsKfQoKc3RhdGljIHZvaWQKU25tcFRyYXBOb2RlRG93bih2b2lkKQp7CiAgICBzZW5kX2Vhc3lfdHJhcChTTk1QX1RSQVBfRU5URVJQUklTRVNQRUNJRklDLCAyKTsKICAgIC8qCiAgICAgKiBYWFggIDIgLSBOb2RlIERvd24gI2RlZmluZSBpdCBhcyBOT0RFX0RPV05fVFJBUCAKICAgICAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBtYWluIC0gTm9uIFdpbmRvd3MKICogU25tcERhZW1vbk1haW4gLSBXaW5kb3dzIHRvIHN1cHBvcnQgd2luZG93cyBzZXJ2aWNlCiAqCiAqIFBhcmFtZXRlcnM6CiAqCSBhcmdjCiAqCSphcmd2W10KICogICAgICAKICogUmV0dXJuczoKICoJMAlBbHdheXMgc3VjY2VlZHMuICAoPykKICoKICoKICogU2V0dXAgYW5kIHN0YXJ0IHRoZSBhZ2VudCBkYWVtb24uCiAqCiAqIEFsc28gc3VjY2Vzc2Z1bGx5IEVYSVRzIHdpdGggemVybyBmb3Igc29tZSBvcHRpb25zLgogKi8KaW50CiNpZmRlZiBXSU4zMlNFUlZJQ0UKU25tcERhZW1vbk1haW4oaW50IGFyZ2MsIFRDSEFSICogYXJndltdKQojZWxzZQptYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiNlbmRpZgp7CiAgICBjaGFyICAgICAgICAgICAgb3B0aW9uc1sxMjhdID0gImFBYzpDZEQ6OmZoSEk6bDpMOm06TTpuOnA6UDpxcnNTOlV2Vi06WToiOwogICAgaW50ICAgICAgICAgICAgIGFyZywgaSwgcmV0OwogICAgaW50ICAgICAgICAgICAgIGRvbnRfZm9yayA9IDAsIGRvX2hlbHAgPSAwOwogICAgaW50ICAgICAgICAgICAgIGxvZ19zZXQgPSAwOwogICAgaW50ICAgICAgICAgICAgIGFnZW50X21vZGUgPSAtMTsKICAgIGNoYXIgICAgICAgICAgICpwaWRfZmlsZSA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAgb3B0aW9uX2NvbXBhdGFiaWxpdHlbXSA9ICItTGUiOwojaWYgSEFWRV9HRVRQSUQKICAgIGludCBmZDsKICAgIEZJTEUgICAgICAgICAgICpQSUQ7CiNlbmRpZgoKI2lmbmRlZiBXSU4zMgogICAgLyoKICAgICAqIGNsb3NlIGFsbCBub24tc3RhbmRhcmQgZmlsZSBkZXNjcmlwdG9ycyB3ZSBtYXkgaGF2ZQogICAgICogaW5oZXJpdGVkIGZyb20gdGhlIHNoZWxsLgogICAgICovCiAgICBmb3IgKGkgPSBnZXRkdGFibGVzaXplKCkgLSAxOyBpID4gMjsgLS1pKSB7CiAgICAgICAgKHZvaWQpIGNsb3NlKGkpOwogICAgfQojZW5kaWYgLyogI1dJTjMyICovCiAgICAKICAgIC8qCiAgICAgKiByZWdpc3RlciBzaWduYWxzIEFTQVAgdG8gcHJldmVudCBkZWZhdWx0IGFjdGlvbiAodXN1YWxseSBjb3JlKQogICAgICogZm9yIHNpZ25hbHMgZHVyaW5nIHN0YXJ0dXAuLi4KICAgICAqLwojaWZkZWYgU0lHVEVSTQogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdURVJNIHNpZ25hbCBoYW5kbGVyXG4iKSk7CiAgICBzaWduYWwoU0lHVEVSTSwgU25tcGRTaHV0RG93bik7CiNlbmRpZgojaWZkZWYgU0lHSU5UCiAgICBERUJVR01TR1RMKCgic2lnbmFsIiwgInJlZ2lzdGVyaW5nIFNJR0lOVCBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR0lOVCwgU25tcGRTaHV0RG93bik7CiNlbmRpZgojaWZkZWYgU0lHSFVQCiAgICBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsgICAvKiBkbyBub3QgdGVybWluYXRlIG9uIGVhcmx5IFNJR0hVUCAqLwojZW5kaWYKI2lmZGVmIFNJR1VTUjEKICAgIERFQlVHTVNHVEwoKCJzaWduYWwiLCAicmVnaXN0ZXJpbmcgU0lHVVNSMSBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR1VTUjEsIFNubXBkRHVtcCk7CiNlbmRpZgojaWZkZWYgU0lHUElQRQogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdQSVBFIHNpZ25hbCBoYW5kbGVyXG4iKSk7CiAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7ICAgLyogJ0lubGluZScgZmFpbHVyZSBvZiB3YXl3YXJkIHJlYWRlcnMgKi8KI2VuZGlmCiNpZmRlZiBTSUdYRlNaCiAgICBzaWduYWwoU0lHWEZTWiwgU25tcGRDYXRjaFJhbmRvbVNpZ25hbCk7CiNlbmRpZgoKI2lmZGVmIE5FVFNOTVBfTk9fUk9PVF9BQ0NFU1MKICAgIC8qCiAgICAgKiBEZWZhdWx0IHRvIG5vLiAgCiAgICAgKi8KICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfTk9fUk9PVF9BQ0NFU1MsIDEpOwojZW5kaWYKICAgIC8qCiAgICAgKiBEZWZhdWx0IHRvIE5PVCBydW5uaW5nIGFuIEFnZW50WCBtYXN0ZXIuICAKICAgICAqLwogICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJICAgTkVUU05NUF9EU19BR0VOVF9BR0VOVFhfTUFTVEVSLCAwKTsKICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfQUdFTlRYX1RJTUVPVVQsIC0xKTsKICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfQUdFTlRYX1JFVFJJRVMsIC0xKTsKCiAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX0NBQ0hFX1RJTUVPVVQsIDUpOwogICAgLyoKICAgICAqIEFkZCBzb21lIG9wdGlvbnMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLiAgCiAgICAgKi8KI2lmIEhBVkVfVU5JU1REX0gKICAgIHN0cmNhdChvcHRpb25zLCAiZzp1OiIpOwojZW5kaWYKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSl8fCBkZWZpbmVkKFVTSU5HX0FHRU5UWF9NQVNURVJfTU9EVUxFKQogICAgc3RyY2F0KG9wdGlvbnMsICJ4OiIpOwojZW5kaWYKI2lmZGVmIFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUKICAgIHN0cmNhdChvcHRpb25zLCAiWCIpOwojZW5kaWYKCiAgICAvKgogICAgICogVGhpcyBpcyBpbmNyZWRpYmx5IHVnbHksIGJ1dCBpdCdzIHByb2JhYmx5IHRoZSBzaW1wbGVzdCB3YXkKICAgICAqICB0byBoYW5kbGUgdGhlIG9sZCAnLUwnIG9wdGlvbiBhcyB3ZWxsIGFzIHRoZSBuZXcgJy1MeCcgc3R5bGUKICAgICAqLwogICAgZm9yIChpPTA7IGk8YXJnYzsgaSsrKSB7CiAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1MIikpCiAgICAgICAgICAgIGFyZ3ZbaV0gPSBvcHRpb25fY29tcGF0YWJpbGl0eTsgICAgICAgICAgICAKICAgIH0KCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX1NZU0xPRwojaWZkZWYgV0lOMzIKICAgIHNubXBfbG9nX3N5c2xvZ25hbWUoYXBwX25hbWVfbG9uZyk7CiNlbHNlCiAgICBzbm1wX2xvZ19zeXNsb2duYW1lKGFwcF9uYW1lKTsKI2VuZGlmCiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HICovCiAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUFRZUEUsIGFwcF9uYW1lKTsKCiAgICAvKgogICAgICogTm93IHByb2Nlc3Mgb3B0aW9ucyBub3JtYWxseS4gIAogICAgICovCiAgICB3aGlsZSAoKGFyZyA9IGdldG9wdChhcmdjLCBhcmd2LCBvcHRpb25zKSkgIT0gRU9GKSB7CiAgICAgICAgc3dpdGNoIChhcmcpIHsKICAgICAgICBjYXNlICctJzoKICAgICAgICAgICAgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAiaGVscCIpID09IDApIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG9wdGFyZywgInZlcnNpb24iKSA9PSAwKSB7CiAgICAgICAgICAgICAgICB2ZXJzaW9uKCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGhhbmRsZV9sb25nX29wdChvcHRhcmcpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgIGxvZ19hZGRyZXNzZXMrKzsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0EnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BUFBFTkRfTE9HRklMRVMsIDEpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnYyc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0xJQl9PUFRJT05BTENPTkZJRywgb3B0YXJnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdDJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAoJCQkJICAgTkVUU05NUF9EU19MSUJfRE9OVF9SRUFEX0NPTkZJR1MsIDEpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0RVTVBfUEFDS0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrc25tcF9kdW1wX3BhY2tldCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdEJzoKICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXJfdG9rZW5zKG9wdGFyZyk7CiAgICAgICAgICAgIHNubXBfc2V0X2RvX2RlYnVnZ2luZygxKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ2YnOgogICAgICAgICAgICBkb250X2ZvcmsgPSAxOwogICAgICAgICAgICBicmVhazsKCiNpZiBIQVZFX1VOSVNURF9ICiAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgKmVjcDsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBnaWQ7CgogICAgICAgICAgICAgICAgZ2lkID0gc3RydG91bChvcHRhcmcsICZlY3AsIDEwKTsKI2lmIEhBVkVfR0VUR1JOQU0gJiYgSEFWRV9QV0RfSAogICAgICAgICAgICAgICAgaWYgKCplY3ApIHsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3JvdXAgICppbmZvOwoKICAgICAgICAgICAgICAgICAgICBpbmZvID0gZ2V0Z3JuYW0ob3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICBnaWQgPSBpbmZvID8gaW5mby0+Z3JfZ2lkIDogLTE7CiAgICAgICAgICAgICAgICAgICAgZW5kZ3JlbnQoKTsKICAgICAgICAgICAgICAgIH0KI2VuZGlmCiAgICAgICAgICAgICAgICBpZiAoZ2lkIDwgMCkgewogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQmFkIGdyb3VwIGlkOiAlc1xuIiwgb3B0YXJnKTsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9HUk9VUElELCBnaWQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgoKICAgICAgICBjYXNlICdoJzoKICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdIJzoKICAgICAgICAgICAgZG9faGVscCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdJJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBhZGRfdG9faW5pdF9saXN0KG9wdGFyZyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiNpZm5kZWYgTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX0ZJTEUKICAgICAgICBjYXNlICdsJzoKICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiAtbCBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1MZiA8ZmlsZT4gaW5zdGVhZFxuIik7CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgaWYgKHN0cmxlbihvcHRhcmcpID4gUEFUSF9NQVgpIHsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlczogbG9nZmlsZSBwYXRoIHRvbyBsb25nIChsaW1pdCAlZCBjaGFycylcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd2WzBdLCBQQVRIX01BWCk7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNubXBfZW5hYmxlX2ZpbGVsb2cob3B0YXJnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BUFBFTkRfTE9HRklMRVMpKTsKICAgICAgICAgICAgICAgIGxvZ19zZXQgPSAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfRklMRSAqLwoKICAgICAgICBjYXNlICdMJzoKCSAgICBpZiAgKHNubXBfbG9nX29wdGlvbnMoIG9wdGFyZywgYXJnYywgYXJndiApIDwgMCApIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvZ19zZXQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnbSc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgc2V0ZW52KCJNSUJTIiwgb3B0YXJnLCAxKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdNJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzZXRlbnYoIk1JQkRJUlMiLCBvcHRhcmcsIDEpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ24nOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGFwcF9uYW1lID0gb3B0YXJnOwogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BUFBUWVBFLCBhcHBfbmFtZSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnUCc6CiAgICAgICAgICAgIHByaW50ZigiV2FybmluZzogLVAgb3B0aW9uIGlzIGRlcHJlY2F0ZWQsIHVzZSAtcCBpbnN0ZWFkXG4iKTsKICAgICAgICBjYXNlICdwJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBwaWRfZmlsZSA9IG9wdGFyZzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdxJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX1FVSUNLX1BSSU5ULCAxKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ3InOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUyk7CiAgICAgICAgICAgIGJyZWFrOwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HCiAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgIHByaW50ZigiV2FybmluZzogLXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQsIHVzZSAtTHNkIGluc3RlYWRcbiIpOwogICAgICAgICAgICBzbm1wX2VuYWJsZV9zeXNsb2coKTsKICAgICAgICAgICAgbG9nX3NldCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdTJzoKICAgICAgICAgICAgcHJpbnRmKCJXYXJuaW5nOiAtUyBvcHRpb24gaXMgZGVwcmVjYXRlZCwgdXNlIC1McyA8ZmFjaWxpdHk+IGluc3RlYWRcbiIpOwogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoKm9wdGFyZykgewogICAgICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICBjYXNlICdEJzoKICAgICAgICAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19EQUVNT047CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdpJzoKICAgICAgICAgICAgICAgIGNhc2UgJ0knOgogICAgICAgICAgICAgICAgICAgIEZhY2lsaXR5ID0gTE9HX0lORk87CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICcwJzoKICAgICAgICAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19MT0NBTDA7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICcxJzoKICAgICAgICAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19MT0NBTDE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICcyJzoKICAgICAgICAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19MT0NBTDI7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICczJzoKICAgICAgICAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19MT0NBTDM7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICc0JzoKICAgICAgICAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19MT0NBTDQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICc1JzoKICAgICAgICAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19MT0NBTDU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICc2JzoKICAgICAgICAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19MT0NBTDY7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICc3JzoKICAgICAgICAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19MT0NBTDc7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiaW52YWxpZCBzeXNsb2cgZmFjaWxpdHk6IC1TJWNcbiIsKm9wdGFyZyk7CiAgICAgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzbm1wX2VuYWJsZV9zeXNsb2dfaWRlbnQoc25tcF9sb2dfc3lzbG9nbmFtZShOVUxMKSwgRmFjaWxpdHkpOwogICAgICAgICAgICAgICAgbG9nX3NldCA9IDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIm5vIHN5c2xvZyBmYWNpbGl0eSBzcGVjaWZpZWRcbiIpOwogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1lTTE9HICovCgogICAgICAgIGNhc2UgJ1UnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3RvZ2dsZV9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgTkVUU05NUF9EU19BR0VOVF9MRUFWRV9QSURGSUxFKTsKICAgICAgICAgICAgYnJlYWs7CgojaWYgSEFWRV9VTklTVERfSAogICAgICAgIGNhc2UgJ3UnOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIGNoYXIgICAgICAgICAgICplY3A7CiAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgICAgdWlkOwoKICAgICAgICAgICAgICAgIHVpZCA9IHN0cnRvdWwob3B0YXJnLCAmZWNwLCAxMCk7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0gKICAgICAgICAgICAgICAgIGlmICgqZWNwKSB7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHBhc3N3ZCAgKmluZm87CgogICAgICAgICAgICAgICAgICAgIGluZm8gPSBnZXRwd25hbShvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgIHVpZCA9IGluZm8gPyBpbmZvLT5wd191aWQgOiAtMTsKICAgICAgICAgICAgICAgICAgICBlbmRwd2VudCgpOwogICAgICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgICAgIGlmICh1aWQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJCYWQgdXNlciBpZDogJXNcbiIsIG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfVVNFUklELCB1aWQpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgoKICAgICAgICBjYXNlICd2JzoKICAgICAgICAgICAgdmVyc2lvbigpOwoKICAgICAgICBjYXNlICdWJzoKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfVkVSQk9TRSwgMSk7CiAgICAgICAgICAgIGJyZWFrOwoKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSl8fCBkZWZpbmVkKFVTSU5HX0FHRU5UWF9NQVNURVJfTU9EVUxFKQogICAgICAgIGNhc2UgJ3gnOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfQUdFTlRfWF9TT0NLRVQsIG9wdGFyZyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9BR0VOVFhfTUFTVEVSLCAxKTsKICAgICAgICAgICAgYnJlYWs7CiNlbmRpZgoKICAgICAgICBjYXNlICdYJzoKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSkKICAgICAgICAgICAgYWdlbnRfbW9kZSA9IFNVQl9BR0VOVDsKI2Vsc2UKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlczogSWxsZWdhbCBhcmd1bWVudCAtWDoiCgkJICAgICAgICAgICAgIkFnZW50WCBzdXBwb3J0IG5vdCBjb21waWxlZCBpbi5cbiIsIGFyZ3ZbMF0pOwogICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgZXhpdCgxKTsKI2VuZGlmCiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdZJzoKICAgICAgICAgICAgbmV0c25tcF9jb25maWdfcmVtZW1iZXIob3B0YXJnKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9CgogICAgaWYgKGRvX2hlbHApIHsKICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUywgMSk7CiAgICAgICAgaW5pdF9hZ2VudChhcHBfbmFtZSk7ICAgICAgICAvKiByZWdpc3RlciBvdXIgLmNvbmYgaGFuZGxlcnMgKi8KICAgICAgICBpbml0X21pYl9tb2R1bGVzKCk7CiAgICAgICAgaW5pdF9zbm1wKGFwcF9uYW1lKTsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlcyB1bmRlcnN0b29kOlxuIik7CiAgICAgICAgcmVhZF9jb25maWdfcHJpbnRfdXNhZ2UoIiAgIik7CiAgICAgICAgZXhpdCgwKTsKICAgIH0KCiAgICBpZiAob3B0aW5kIDwgYXJnYykgewojaWZuZGVmIE5FVFNOTVBfTk9fTElTVEVOX1NVUFBPUlQKICAgICAgICAvKgogICAgICAgICAqIFRoZXJlIGFyZSBvcHRpb25hbCB0cmFuc3BvcnQgYWRkcmVzc2VzIG9uIHRoZSBjb21tYW5kIGxpbmUuICAKICAgICAgICAgKi8KICAgICAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJvcHRpbmQgJWQsIGFyZ2MgJWRcbiIsIG9wdGluZCwgYXJnYykpOwogICAgICAgIGZvciAoaSA9IG9wdGluZDsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICAgICBjaGFyICpjLCAqYXN0cmluZzsKICAgICAgICAgICAgaWYgKChjID0gbmV0c25tcF9kc19nZXRfc3RyaW5nKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfUE9SVFMpKSkgewogICAgICAgICAgICAgICAgYXN0cmluZyA9IChjaGFyKiltYWxsb2Moc3RybGVuKGMpICsgMiArIHN0cmxlbihhcmd2W2ldKSk7CiAgICAgICAgICAgICAgICBpZiAoYXN0cmluZyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWxsb2MgZmFpbHVyZSBwcm9jZXNzaW5nIGFyZ3ZbJWRdXG4iLCBpKTsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3ByaW50Zihhc3RyaW5nLCAiJXMsJXMiLCBjLCBhcmd2W2ldKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfQUdFTlRfUE9SVFMsIGFzdHJpbmcpOwogICAgICAgICAgICAgICAgU05NUF9GUkVFKGFzdHJpbmcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgTkVUU05NUF9EU19BR0VOVF9QT1JUUywgYXJndltpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAicG9ydCBzcGVjOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkJICBORVRTTk1QX0RTX0FHRU5UX1BPUlRTKSkpOwojZWxzZSAvKiBORVRTTk1QX05PX0xJU1RFTl9TVVBQT1JUICovCiAgICAgICAgZnByaW50ZihzdGRlcnIsICJZb3Ugc3BlY2lmaWVkIHBvcnRzIHRvIG9wZW47IHRoaXMgYWdlbnQgd2FzIGJ1aWx0IHRvIG9ubHkgc2VuZCBub3RpZmljYXRpb25zXG4iKTsKICAgICAgICBleGl0KDEpOwojZW5kaWYgLyogTkVUU05NUF9OT19MSVNURU5fU1VQUE9SVCAqLwogICAgfQoKI2lmZGVmIE5FVFNOTVBfTE9HRklMRQojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfTE9HR0lOR19GSUxFCiAgICBpZiAoMCA9PSBsb2dfc2V0KQogICAgICAgIHNubXBfZW5hYmxlX2ZpbGVsb2coTkVUU05NUF9MT0dGSUxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUEVORF9MT0dGSUxFUykpOwojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9MT0dHSU5HX0ZJTEUgKi8KI2VuZGlmCgojaWZkZWYgVVNJTkdfVVRJTF9GVU5DU19SRVNUQVJUX01PRFVMRQogICAgewogICAgICAgIC8qCiAgICAgICAgICogSW5pdGlhbGl6ZSBhIGFyZ3Ygc2V0IHRvIHRoZSBjdXJyZW50IGZvciByZXN0YXJ0aW5nIHRoZSBhZ2VudC4KICAgICAgICAgKi8KICAgICAgICBjaGFyICpjcHRyLCAqKmFyZ3ZwdHI7CgogICAgICAgIGFyZ3ZyZXN0YXJ0cCA9IChjaGFyICoqKW1hbGxvYygoYXJnYyArIDIpICogc2l6ZW9mKGNoYXIgKikpOwogICAgICAgIGFyZ3ZwdHIgPSBhcmd2cmVzdGFydHA7CiAgICAgICAgZm9yIChpID0gMCwgcmV0ID0gMTsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICAgICByZXQgKz0gc3RybGVuKGFyZ3ZbaV0pICsgMTsKICAgICAgICB9CiAgICAgICAgYXJndnJlc3RhcnQgPSAoY2hhciAqKSBtYWxsb2MocmV0KTsKICAgICAgICBhcmd2cmVzdGFydG5hbWUgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGFyZ3ZbMF0pICsgMSk7CiAgICAgICAgaWYgKCFhcmd2cmVzdGFydHAgfHwgIWFyZ3ZyZXN0YXJ0IHx8ICFhcmd2cmVzdGFydG5hbWUpIHsKICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWxsb2MgZmFpbHVyZSBwcm9jZXNzaW5nIGFyZ3ZyZXN0YXJ0XG4iKTsKICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICB9CiAgICAgICAgc3RyY3B5KGFyZ3ZyZXN0YXJ0bmFtZSwgYXJndlswXSk7CgogICAgICAgIGZvciAoY3B0ciA9IGFyZ3ZyZXN0YXJ0LCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICAgICBzdHJjcHkoY3B0ciwgYXJndltpXSk7CiAgICAgICAgICAgICooYXJndnB0cisrKSA9IGNwdHI7CiAgICAgICAgICAgIGNwdHIgKz0gc3RybGVuKGFyZ3ZbaV0pICsgMTsKICAgICAgICB9CiAgICB9CiNlbmRpZiAvKiBVU0lOR19VVElMX0ZVTkNTX1JFU1RBUlRfTU9EVUxFICovCgogICAgaWYgKGFnZW50X21vZGUgPT0gLTEpIHsKICAgICAgICBpZiAoc3Ryc3RyKGFyZ3ZbMF0sICJhZ2VudHhkIikgIT0gTlVMTCkgewogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUsIFNVQl9BR0VOVCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9ST0xFLCBNQVNURVJfQUdFTlQpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAoJCQkgICAgICAgTkVUU05NUF9EU19BR0VOVF9ST0xFLCBhZ2VudF9tb2RlKTsKICAgIH0KCiAgICBTT0NLX1NUQVJUVVA7CiAgICBpZiAoaW5pdF9hZ2VudChhcHBfbmFtZSkgIT0gMCkgewogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJBZ2VudCBpbml0aWFsaXphdGlvbiBmYWlsZWRcbiIpOwogICAgICAgIGV4aXQoMSk7CiAgICB9CiAgICBpbml0X21pYl9tb2R1bGVzKCk7CgogICAgLyoKICAgICAqIHN0YXJ0IGxpYnJhcnkgCiAgICAgKi8KICAgIGluaXRfc25tcChhcHBfbmFtZSk7CgogICAgaWYgKChyZXQgPSBpbml0X21hc3Rlcl9hZ2VudCgpKSAhPSAwKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBTb21lIGVycm9yIG9wZW5pbmcgb25lIG9mIHRoZSBzcGVjaWZpZWQgYWdlbnQgdHJhbnNwb3J0cy4gIAogICAgICAgICAqLwogICAgICAgIHNubXBfbG9nKExPR19FUlIsICJTZXJ2ZXIgRXhpdGluZyB3aXRoIGNvZGUgMVxuIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCiAgICAvKgogICAgICogSW5pdGlhbGl6ZSB0aGUgd29ybGQuICBEZXRhY2ggZnJvbSB0aGUgc2hlbGwuICBDcmVhdGUgaW5pdGlhbCB1c2VyLiAgCiAgICAgKi8KICAgIGlmKCFkb250X2ZvcmspIHsKICAgICAgICBpbnQgcXVpdCA9ICEgbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfUVVJVF9JTU1FRElBVEVMWSk7CiAgICAgICAgcmV0ID0gbmV0c25tcF9kYWVtb25pemUocXVpdCwKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1RESU8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbm1wX3N0ZGVycmxvZ19zdGF0dXMoKQojZWxzZSAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1RESU8gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwCiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0xPR0dJTkdfU1RESU8gKi8KICAgICAgICAgICAgKTsKICAgICAgICAvKgogICAgICAgICAqIHh4eC1ya3M6IGRvIHdlIGNhcmUgaWYgZm9yayBmYWlscz8gSSB0aGluayB3ZSBzaG91bGQuLi4KICAgICAgICAgKi8KICAgICAgICBpZihyZXQgIT0gMCkgewogICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiU2VydmVyIEV4aXRpbmcgd2l0aCBjb2RlIDFcbiIpOwogICAgICAgICAgICBleGl0KDEpOwogICAgICAgIH0KICAgIH0KCiNpZiBIQVZFX0dFVFBJRAogICAgaWYgKHBpZF9maWxlICE9IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIHVubGluayB0aGUgcGlkX2ZpbGUsIGlmIGl0IGV4aXN0cywgcHJpb3IgdG8gb3Blbi4gIFdpdGhvdXQKICAgICAgICAgKiBkb2luZyB0aGlzIHRoZSBvcGVuIHdpbGwgZmFpbCBpZiB0aGUgdXNlciBzcGVjaWZpZWQgcGlkX2ZpbGUKICAgICAgICAgKiBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgKi8KICAgICAgICB1bmxpbmsocGlkX2ZpbGUpOwogICAgICAgIGZkID0gb3BlbihwaWRfZmlsZSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjAwKTsKICAgICAgICBpZiAoZmQgPT0gLTEpIHsKICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKHBpZF9maWxlKTsKICAgICAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUykpIHsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKFBJRCA9IGZkb3BlbihmZCwgInciKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKHBpZF9maWxlKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKFBJRCwgIiVkXG4iLCAoaW50KSBnZXRwaWQoKSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoUElEKTsKICAgICAgICAgICAgfQojaWZuZGVmIF9NU0NfVkVSCiAgICAgICAgICAgIC8qIFRoZSBzZXF1ZW5jZSBvcGVuKCkvZmRvcGVuKCkvZmNsb3NlKCkvY2xvc2UoKSBtYWtlcyBNU1ZDIGNyYXNoLAogICAgICAgICAgICAgICBoZW5jZSBza2lwIHRoZSBjbG9zZSgpIGNhbGwgd2hlbiB1c2luZyB0aGUgTVNWQyBydW50aW1lLiAqLwogICAgICAgICAgICBjbG9zZShmZCk7CiNlbmRpZgogICAgICAgIH0KICAgIH0KI2VuZGlmCgojaWYgZGVmaW5lZChIQVZFX1VOSVNURF9IKSAmJiAoZGVmaW5lZChIQVZFX0NIT1dOKSB8fCBkZWZpbmVkKEhBVkVfU0VUR0lEKSB8fCBkZWZpbmVkKEhBVkVfU0VUVUlEKSkKICAgIHsKICAgIGNvbnN0IGNoYXIgICAgICpwZXJzaXN0ZW50X2RpcjsKICAgIGludCAgICAgICAgICAgICB1aWQsIGdpZDsKCiAgICBwZXJzaXN0ZW50X2RpciA9IGdldF9wZXJzaXN0ZW50X2RpcmVjdG9yeSgpOwogICAgbWtkaXJoaWVyKCBwZXJzaXN0ZW50X2RpciwgTkVUU05NUF9BR0VOVF9ESVJFQ1RPUllfTU9ERSwgMCApOwogICAKICAgIHVpZCA9IG5ldHNubXBfZHNfZ2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJICAgICBORVRTTk1QX0RTX0FHRU5UX1VTRVJJRCk7CiAgICBnaWQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgICAgTkVUU05NUF9EU19BR0VOVF9HUk9VUElEKTsKICAgIAojaWZkZWYgSEFWRV9DSE9XTgogICAgaWYgKCB1aWQgIT0gMCB8fCBnaWQgIT0gMCApCiAgICAgICAgY2hvd24oIHBlcnNpc3RlbnRfZGlyLCB1aWQsIGdpZCApOwojZW5kaWYKCiNpZmRlZiBIQVZFX1NFVEdJRAogICAgaWYgKChnaWQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgIE5FVFNOTVBfRFNfQUdFTlRfR1JPVVBJRCkpID4gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIkNoYW5naW5nIGdpZCB0byAlZC5cbiIsIGdpZCkpOwogICAgICAgIGlmIChzZXRnaWQoZ2lkKSA9PSAtMQojaWZkZWYgSEFWRV9TRVRHUk9VUFMKICAgICAgICAgICAgfHwgc2V0Z3JvdXBzKDEsIChnaWRfdCAqKSZnaWQpID09IC0xCiNlbmRpZgogICAgICAgICAgICApIHsKICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKCJzZXRnaWQgZmFpbGVkIik7CiAgICAgICAgICAgIGlmICghbmV0c25tcF9kc19nZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCQlORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTKSkgewogICAgICAgICAgICAgICAgZXhpdCgxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KI2VuZGlmCiNpZmRlZiBIQVZFX1NFVFVJRAogICAgaWYgKCh1aWQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgIE5FVFNOTVBfRFNfQUdFTlRfVVNFUklEKSkgPiAwKSB7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0ggJiYgSEFWRV9JTklUR1JPVVBTCiAgICAgICAgc3RydWN0IHBhc3N3ZCAqaW5mbzsKCiAgICAgICAgLyoKICAgICAgICAgKiBTZXQgc3VwcGxlbWVudGFyeSBncm91cHMgYmVmb3JlIGNoYW5naW5nIFVJRAogICAgICAgICAqICAgKHdoaWNoIHByb2JhYmx5IGludm9sdmVzIGdpdmluZyB1cCBwcml2aWxlZ2VzKQogICAgICAgICAqLwogICAgICAgIGluZm8gPSBnZXRwd3VpZCh1aWQpOwogICAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIlN1cHBsZW1lbnRhcnkgZ3JvdXBzIGZvciAlcy5cbiIsIGluZm8tPnB3X25hbWUpKTsKICAgICAgICAgICAgaWYgKGluaXRncm91cHMoaW5mby0+cHdfbmFtZSwgKGdpZCAhPSAwID8gKGdpZF90KWdpZCA6IGluZm8tPnB3X2dpZCkpID09IC0xKSB7CiAgICAgICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoImluaXRncm91cHMgZmFpbGVkIik7CiAgICAgICAgICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUykpIHsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVuZHB3ZW50KCk7CiNlbmRpZgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIkNoYW5naW5nIHVpZCB0byAlZC5cbiIsIHVpZCkpOwogICAgICAgIGlmIChzZXR1aWQodWlkKSA9PSAtMSkgewogICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoInNldHVpZCBmYWlsZWQiKTsKICAgICAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJCU5FVFNOTVBfRFNfQUdFTlRfTk9fUk9PVF9BQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojZW5kaWYKICAgIH0KI2VuZGlmCgogICAgLyoKICAgICAqIFN0b3JlIHBlcnNpc3RlbnQgZGF0YSBpbW1lZGlhdGVseSBpbiBjYXNlIHdlIGNyYXNoIGxhdGVyLiAgCiAgICAgKi8KICAgIHNubXBfc3RvcmUoYXBwX25hbWUpOwoKI2lmZGVmIFNJR0hVUAogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdIVVAgc2lnbmFsIGhhbmRsZXJcbiIpKTsKICAgIHNpZ25hbChTSUdIVVAsIFNubXBkUmVjb25maWcpOwojZW5kaWYKCiAgICAvKgogICAgICogU2VuZCBjb2xkc3RhcnQgdHJhcCBpZiBwb3NzaWJsZS4gIAogICAgICovCiAgICBzZW5kX2Vhc3lfdHJhcCgwLCAwKTsKCiAgICAvKgogICAgICogV2UncmUgdXAsIGxvZyBvdXIgdmVyc2lvbiBudW1iZXIuICAKICAgICAqLwogICAgc25tcF9sb2coTE9HX0lORk8sICJORVQtU05NUCB2ZXJzaW9uICVzXG4iLCBuZXRzbm1wX2dldF92ZXJzaW9uKCkpOwojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBhZ2VudF9zdGF0dXMgPSBBR0VOVF9SVU5OSU5HOwojZW5kaWYKICAgIG5ldHNubXBfYWRkcmNhY2hlX2luaXRpYWxpc2UoKTsKCiAgICAvKgogICAgICogRm9yZXZlciBtb25pdG9yIHRoZSBkZXN0X3BvcnQgZm9yIGluY29taW5nIFBEVXMuICAKICAgICAqLwogICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAiV2UncmUgdXAuICBTdGFydGluZyB0byBwcm9jZXNzIGRhdGEuXG4iKSk7CiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQlORVRTTk1QX0RTX0FHRU5UX1FVSVRfSU1NRURJQVRFTFkpKQogICAgICAgIHJlY2VpdmUoKTsKICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgInNlbmRpbmcgc2h1dGRvd24gdHJhcFxuIikpOwogICAgU25tcFRyYXBOb2RlRG93bigpOwogICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAiQnllLi4uXG4iKSk7CiAgICBzbm1wX3NodXRkb3duKGFwcF9uYW1lKTsKICAgIHNodXRkb3duX21hc3Rlcl9hZ2VudCgpOwogICAgc2h1dGRvd25fYWdlbnQoKTsKCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQlORVRTTk1QX0RTX0FHRU5UX0xFQVZFX1BJREZJTEUpICYmCgkocGlkX2ZpbGUgIT0gTlVMTCkpIHsKICAgICAgICB1bmxpbmsocGlkX2ZpbGUpOwogICAgfQojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBhZ2VudF9zdGF0dXMgPSBBR0VOVF9TVE9QUEVEOwojZW5kaWYKCiNpZmRlZiBVU0lOR19VVElMX0ZVTkNTX1JFU1RBUlRfTU9EVUxFCiAgICBTTk1QX0ZSRUUoYXJndnJlc3RhcnRuYW1lKTsKICAgIFNOTVBfRlJFRShhcmd2cmVzdGFydCk7CiAgICBTTk1QX0ZSRUUoYXJndnJlc3RhcnRwKTsKI2VuZGlmIC8qIFVTSU5HX1VUSUxfRlVOQ1NfUkVTVEFSVF9NT0RVTEUgKi8KCiAgICBTT0NLX0NMRUFOVVA7CiAgICByZXR1cm4gMDsKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBFbmQgbWFpbigpIC0tIHNubXBkICovCgojaWYgZGVmaW5lZChXSU4zMikKCiNpbmNsdWRlIDxwcm9jZXNzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9saWJyYXJ5L3NubXBfYXNzZXJ0Lmg+CgpzdGF0aWMgdW5zaWduZWQgc190aHJlYWRpZDsKSEFORExFIHNfdGhyZWFkX2hhbmRsZTsKCnN0YXRpYyB1bnNpZ25lZCBfX3N0ZGNhbGwgd2FpdF9mb3Jfc3RkaW4odm9pZCogYXJnKQp7CiAgICBpZiAoZ2V0YyhzdGRpbikgIT0gRU9GKQogICAgICAgIG5ldHNubXBfcnVubmluZyA9IDA7CiAgICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgY3JlYXRlX3N0ZGluX3dhaXRlcl90aHJlYWQodm9pZCkKewogICAgbmV0c25tcF9hc3NlcnQoc190aHJlYWRfaGFuZGxlID09IDApOwogICAgc190aHJlYWRfaGFuZGxlID0gKEhBTkRMRSlfYmVnaW50aHJlYWRleCgwLCAwLCB3YWl0X2Zvcl9zdGRpbiwgMCwgMCwgJnNfdGhyZWFkaWQpOwogICAgbmV0c25tcF9hc3NlcnQoc190aHJlYWRfaGFuZGxlICE9IDApOwp9CgpzdGF0aWMgdm9pZCBqb2luX3N0ZGluX3dhaXRlcl90aHJlYWQodm9pZCkKewogICAgaW50IHJlc3VsdDsKCiAgICBuZXRzbm1wX2Fzc2VydChzX3RocmVhZF9oYW5kbGUgIT0gMCk7CiAgICByZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KHNfdGhyZWFkX2hhbmRsZSwgMTAwMCk7CiAgICBuZXRzbm1wX2Fzc2VydChyZXN1bHQgIT0gV0FJVF9USU1FT1VUKTsKICAgIENsb3NlSGFuZGxlKHNfdGhyZWFkX2hhbmRsZSk7CiAgICBzX3RocmVhZF9oYW5kbGUgPSAwOwp9CiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiotby0qKioqKioKICogcmVjZWl2ZQogKgogKiBQYXJhbWV0ZXJzOgogKiAgICAgIAogKiBSZXR1cm5zOgogKgkwCU9uIHN1Y2Nlc3MuCiAqCS0xCVN5c3RlbSBlcnJvci4KICoKICogSW5maW5pdGUgd2hpbGUtbG9vcCB3aGljaCBtb25pdG9ycyBpbmNvbWluZyBtZXNzYWdlcyBmb3IgdGhlIGFnZW50LgogKiBJbnZva2UgdGhlIGVzdGFibGlzaGVkIG1lc3NhZ2UgaGFuZGxlcnMgZm9yIGluY29taW5nIG1lc3NhZ2VzIG9uIGEgcGVyCiAqIHBvcnQgYmFzaXMuICBIYW5kbGUgdGltZW91dHMuCiAqLwpzdGF0aWMgaW50CnJlY2VpdmUodm9pZCkKewogICAgaW50ICAgICAgICAgICAgIG51bWZkczsKICAgIG5ldHNubXBfbGFyZ2VfZmRfc2V0IHJlYWRmZHMsIHdyaXRlZmRzLCBleGNlcHRmZHM7CiAgICBzdHJ1Y3QgdGltZXZhbCAgdGltZW91dCwgKnR2cCA9ICZ0aW1lb3V0OwogICAgaW50ICAgICAgICAgICAgIGNvdW50LCBibG9jaywgaTsKI2lmZGVmCVVTSU5HX1NNVVhfTU9EVUxFCiAgICBpbnQgICAgICAgICAgICAgc2Q7CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVVNJTkdfU01VWF9NT0RVTEUgKi8KCiAgICBuZXRzbm1wX2xhcmdlX2ZkX3NldF9pbml0KCZyZWFkZmRzLCBGRF9TRVRTSVpFKTsKICAgIG5ldHNubXBfbGFyZ2VfZmRfc2V0X2luaXQoJndyaXRlZmRzLCBGRF9TRVRTSVpFKTsKICAgIG5ldHNubXBfbGFyZ2VfZmRfc2V0X2luaXQoJmV4Y2VwdGZkcywgRkRfU0VUU0laRSk7CgogICAgLyoKICAgICAqIGlnbm9yZSBlYXJseSBzaWdodXAgZHVyaW5nIHN0YXJ0dXAKICAgICAqLwogICAgcmVjb25maWcgPSAwOwoKI2lmIGRlZmluZWQoV0lOMzIpCiAgICBjcmVhdGVfc3RkaW5fd2FpdGVyX3RocmVhZCgpOwojZW5kaWYKCiAgICAvKgogICAgICogTG9vcC1mb3JldmVyOiBleGVjdXRlIG1lc3NhZ2UgaGFuZGxlcnMgZm9yIHNvY2tldHMgd2l0aCBkYXRhCiAgICAgKi8KICAgIHdoaWxlIChuZXRzbm1wX3J1bm5pbmcpIHsKICAgICAgICBpZiAocmVjb25maWcpIHsKI2lmIEhBVkVfU0lHSE9MRAogICAgICAgICAgICBzaWdob2xkKFNJR0hVUCk7CiNlbmRpZgogICAgICAgICAgICByZWNvbmZpZyA9IDA7CiAgICAgICAgICAgIHNubXBfbG9nKExPR19JTkZPLCAiUmVjb25maWd1cmluZyBkYWVtb25cbiIpOwoJICAgIC8qICBTdG9wIGFuZCByZXN0YXJ0IGxvZ2dpbmcuICBUaGlzIGFsbG93cyBsb2dmaWxlcyB0byBiZQoJCXJvdGF0ZWQgZXRjLiAgKi8KCSAgICBuZXRzbm1wX2xvZ2dpbmdfcmVzdGFydCgpOwoJICAgIHNubXBfbG9nKExPR19JTkZPLCAiTkVULVNOTVAgdmVyc2lvbiAlcyByZXN0YXJ0ZWRcbiIsCgkJICAgICBuZXRzbm1wX2dldF92ZXJzaW9uKCkpOwogICAgICAgICAgICB1cGRhdGVfY29uZmlnKCk7CiAgICAgICAgICAgIHNlbmRfZWFzeV90cmFwKFNOTVBfVFJBUF9FTlRFUlBSSVNFU1BFQ0lGSUMsIDMpOwojaWYgSEFWRV9TSUdIT0xECiAgICAgICAgICAgIHNpZ3JlbHNlKFNJR0hVUCk7CiNlbmRpZgogICAgICAgIH0KCiAgICAgICAgLyoKICAgICAgICAgKiBkZWZhdWx0IHRvIHNsZWVwaW5nIGZvciBhIHJlYWxseSBsb25nIHRpbWUuIElOVF9NQVgKICAgICAgICAgKiBzaG91bGQgYmUgc3VmZmljaWVudCAoZWcgd2UgZG9uJ3QgY2FyZSBpZiB0aW1lX3QgaXMKICAgICAgICAgKiBhIGxvbmcgdGhhdCdzIGJpZ2dlciB0aGFuIGFuIGludCkuCiAgICAgICAgICovCiAgICAgICAgdHZwID0gJnRpbWVvdXQ7CiAgICAgICAgdHZwLT50dl9zZWMgPSBJTlRfTUFYOwogICAgICAgIHR2cC0+dHZfdXNlYyA9IDA7CgogICAgICAgIG51bWZkcyA9IDA7CiAgICAgICAgTkVUU05NUF9MQVJHRV9GRF9aRVJPKCZyZWFkZmRzKTsKICAgICAgICBORVRTTk1QX0xBUkdFX0ZEX1pFUk8oJndyaXRlZmRzKTsKICAgICAgICBORVRTTk1QX0xBUkdFX0ZEX1pFUk8oJmV4Y2VwdGZkcyk7CiAgICAgICAgYmxvY2sgPSAwOwogICAgICAgIHNubXBfc2VsZWN0X2luZm8yKCZudW1mZHMsICZyZWFkZmRzLCB0dnAsICZibG9jayk7CiAgICAgICAgaWYgKGJsb2NrID09IDEpIHsKICAgICAgICAgICAgdHZwID0gTlVMTDsgICAgICAgICAvKiBibG9jayB3aXRob3V0IHRpbWVvdXQgKi8KCX0KCiNpZmRlZglVU0lOR19TTVVYX01PRFVMRQogICAgICAgIGlmIChzbXV4X2xpc3Rlbl9zZCA+PSAwKSB7CiAgICAgICAgICAgIE5FVFNOTVBfTEFSR0VfRkRfU0VUKHNtdXhfbGlzdGVuX3NkLCAmcmVhZGZkcyk7CiAgICAgICAgICAgIG51bWZkcyA9CiAgICAgICAgICAgICAgICBzbXV4X2xpc3Rlbl9zZCA+PSBudW1mZHMgPyBzbXV4X2xpc3Rlbl9zZCArIDEgOiBudW1mZHM7CgogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc211eF9zbm1wX3NlbGVjdF9saXN0X2dldF9sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICBzZCA9IHNtdXhfc25tcF9zZWxlY3RfbGlzdF9nZXRfU0RfZnJvbV9MaXN0KGkpOwogICAgICAgICAgICAgICAgaWYgKHNkICE9IDApCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICBORVRTTk1QX0xBUkdFX0ZEX1NFVChzZCwgJnJlYWRmZHMpOwogICAgICAgICAgICAgICAgICAgbnVtZmRzID0gc2QgPj0gbnVtZmRzID8gc2QgKyAxIDogbnVtZmRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQojZW5kaWYgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFVTSU5HX1NNVVhfTU9EVUxFICovCgojaWZuZGVmIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfRkRfRVZFTlRfTUFOQUdFUgogICAgICAgIG5ldHNubXBfZXh0ZXJuYWxfZXZlbnRfaW5mbzIoJm51bWZkcywgJnJlYWRmZHMsICZ3cml0ZWZkcywgJmV4Y2VwdGZkcyk7CiNlbmRpZiAvKiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0ZEX0VWRU5UX01BTkFHRVIgKi8KCiAgICByZXNlbGVjdDoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX1JFR0lTVEVSX1NJR05BTAogICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRVhURVJOQUxfU0lHUzsgaSsrKSB7CiAgICAgICAgICAgIGlmIChleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW2ldKSB7CiAgICAgICAgICAgICAgICBleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW2ldLS07CiAgICAgICAgICAgICAgICBleHRlcm5hbF9zaWduYWxfaGFuZGxlcltpXShpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KI2VuZGlmIC8qIE5FVFNOTVBfRkVBVFVSRV9SRU1PVkVfUkVHSVNURVJfU0lHTkFMICovCgogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9zZWxlY3QiLCAic2VsZWN0KCBudW1mZHM9JWQsIC4uLiwgdHZwPSVwKVxuIiwKICAgICAgICAgICAgICAgICAgICBudW1mZHMsIHR2cCkpOwogICAgICAgIGlmICh0dnApCiAgICAgICAgICAgIERFQlVHTVNHVEwoKCJ0aW1lciIsICJ0dnAgJWxkLiVsZFxuIiwgKGxvbmcpIHR2cC0+dHZfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgdHZwLT50dl91c2VjKSk7CiAgICAgICAgY291bnQgPSBuZXRzbm1wX2xhcmdlX2ZkX3NldF9zZWxlY3QobnVtZmRzLCAmcmVhZGZkcywgJndyaXRlZmRzLCAmZXhjZXB0ZmRzLAoJCQkJICAgICB0dnApOwogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9zZWxlY3QiLCAicmV0dXJuZWQsIGNvdW50ID0gJWRcbiIsIGNvdW50KSk7CgogICAgICAgIGlmIChjb3VudCA+IDApIHsKCiNpZmRlZiBVU0lOR19TTVVYX01PRFVMRQogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBoYW5kbGUgdGhlIFNNVVggc2QncyAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzbXV4X2xpc3Rlbl9zZCA+PSAwKSB7CiAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgc211eF9zbm1wX3NlbGVjdF9saXN0X2dldF9sZW5ndGgoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgc2QgPSBzbXV4X3NubXBfc2VsZWN0X2xpc3RfZ2V0X1NEX2Zyb21fTGlzdChpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoTkVUU05NUF9MQVJHRV9GRF9JU1NFVChzZCwgJnJlYWRmZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbXV4X3Byb2Nlc3Moc2QpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc211eF9zbm1wX3NlbGVjdF9saXN0X2RlbChzZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbmV3IGNvbm5lY3Rpb24gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmIChORVRTTk1QX0xBUkdFX0ZEX0lTU0VUKHNtdXhfbGlzdGVuX3NkLCAmcmVhZGZkcykpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoKHNkID0gc211eF9hY2NlcHQoc211eF9saXN0ZW5fc2QpKSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNtdXhfc25tcF9zZWxlY3RfbGlzdF9hZGQoc2QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0lOR19TTVVYX01PRFVMRSAqLwoKI2lmbmRlZiBORVRTTk1QX0ZFQVRVUkVfUkVNT1ZFX0ZEX0VWRU5UX01BTkFHRVIKICAgICAgICAgICAgbmV0c25tcF9kaXNwYXRjaF9leHRlcm5hbF9ldmVudHMyKCZjb3VudCwgJnJlYWRmZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmd3JpdGVmZHMsICZleGNlcHRmZHMpOwojZW5kaWYgLyogTkVUU05NUF9GRUFUVVJFX1JFTU9WRV9GRF9FVkVOVF9NQU5BR0VSICovCgogICAgICAgICAgICAvKiBJZiB0aGVyZSBhcmUgc3RpbGwgZXZlbnRzIGxlZnRvdmVyLCBwcm9jZXNzIHRoZW0gKi8KICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICAgICAgIHNubXBfcmVhZDIoJnJlYWRmZHMpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlCiAgICAgICAgICAgIHN3aXRjaCAoY291bnQpIHsKICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgc25tcF90aW1lb3V0KCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAtMToKICAgICAgICAgICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9zZWxlY3QiLCAiICBlcnJubyA9ICVkXG4iLCBlcnJubykpOwogICAgICAgICAgICAgICAgaWYgKGVycm5vID09IEVJTlRSKSB7CiAgICAgICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgKiBsaWtlbHkgdGhhdCB3ZSBnb3QgYSBzaWduYWwuIENoZWNrIG91ciBzcGVjaWFsIHNpZ25hbAogICAgICAgICAgICAgICAgICAgICAqIGZsYWdzIGJlZm9yZSByZXRyeWluZyBzZWxlY3QuCiAgICAgICAgICAgICAgICAgICAgICovCgkJICAgIGlmIChuZXRzbm1wX3J1bm5pbmcgJiYgIXJlY29uZmlnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gcmVzZWxlY3Q7CgkJICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKCJzZWxlY3QiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHNubXBfbG9nKExPR19FUlIsICJzZWxlY3QgcmV0dXJuZWQgJWRcbiIsIGNvdW50KTsKICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAvKiBlbmRpZiAtLSBjb3VudD4wICovCgogICAgICAgIC8qCiAgICAgICAgICogc2VlIGlmIHBlcnNpc3RlbnQgc3RvcmUgbmVlZHMgdG8gYmUgc2F2ZWQKICAgICAgICAgKi8KICAgICAgICBzbm1wX3N0b3JlX2lmX25lZWRlZCgpOwoKICAgICAgICAvKgogICAgICAgICAqIHJ1biByZXF1ZXN0ZWQgYWxhcm1zIAogICAgICAgICAqLwogICAgICAgIHJ1bl9hbGFybXMoKTsKCiAgICAgICAgbmV0c25tcF9jaGVja19vdXRzdGFuZGluZ19hZ2VudF9yZXF1ZXN0cygpOwoKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmR3aGlsZSAqLwoKICAgIG5ldHNubXBfbGFyZ2VfZmRfc2V0X2NsZWFudXAoJnJlYWRmZHMpOwogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfY2xlYW51cCgmd3JpdGVmZHMpOwogICAgbmV0c25tcF9sYXJnZV9mZF9zZXRfY2xlYW51cCgmZXhjZXB0ZmRzKTsKCiNpZiBkZWZpbmVkKFdJTjMyKQogICAgam9pbl9zdGRpbl93YWl0ZXJfdGhyZWFkKCk7CiNlbmRpZgoKICAgIHNubXBfbG9nKExPR19JTkZPLCAiUmVjZWl2ZWQgVEVSTSBvciBTVE9QIHNpZ25hbC4uLiAgc2h1dHRpbmcgZG93bi4uLlxuIik7CiAgICByZXR1cm4gMDsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHJlY2VpdmUoKSAqLwoKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBzbm1wX2lucHV0CiAqCiAqIFBhcmFtZXRlcnM6CiAqCSBvcAogKgkqc2Vzc2lvbgogKgkgcmVxdWlkCiAqCSpwZHUKICoJKm1hZ2ljCiAqICAgICAgCiAqIFJldHVybnM6CiAqCTEJCU9uIHN1Y2Nlc3MJLU9SLQogKglQYXNzZXMgdGhyb3VnaAlSZXR1cm4gZnJvbSBhbGFybUdldFJlc3BvbnNlKCkgd2hlbiAKICoJICAJCSAgVVNJTkdfVjJQQVJUWV9BTEFSTV9NT0RVTEUgaXMgZGVmaW5lZC4KICoKICogQ2FsbC1iYWNrIGZ1bmN0aW9uIHRvIG1hbmFnZSByZXNwb25zZXMgdG8gdHJhcHMgKGluZm9ybXMpIGFuZCBhbGFybXMuCiAqIE5vdCB1c2VkIGJ5IHRoZSBhZ2VudCB0byBwcm9jZXNzIG90aGVyIFJlc3BvbnNlIFBEVXMuCiAqLwppbnQKc25tcF9pbnB1dChpbnQgb3AsCiAgICAgICAgICAgbmV0c25tcF9zZXNzaW9uICogc2Vzc2lvbiwKICAgICAgICAgICBpbnQgcmVxaWQsIG5ldHNubXBfcGR1ICpwZHUsIHZvaWQgKm1hZ2ljKQp7CiAgICBzdHJ1Y3QgZ2V0X3JlcV9zdGF0ZSAqc3RhdGUgPSAoc3RydWN0IGdldF9yZXFfc3RhdGUgKikgbWFnaWM7CgogICAgaWYgKG9wID09IE5FVFNOTVBfQ0FMTEJBQ0tfT1BfUkVDRUlWRURfTUVTU0FHRSkgewogICAgICAgIGlmIChwZHUtPmNvbW1hbmQgPT0gU05NUF9NU0dfR0VUKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS0+dHlwZSA9PSBFVkVOVF9HRVRfUkVRKSB7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogdGhpcyBpcyBqdXN0IHRoZSBhY2sgdG8gb3VyIGluZm9ybSBwZHUgCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmIChvcCA9PSBORVRTTk1QX0NBTExCQUNLX09QX1RJTUVEX09VVCkgewogICAgICAgIGlmIChzdGF0ZS0+dHlwZSA9PSBBTEFSTV9HRVRfUkVRKSB7CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIE5lZWQgYSBtZWNoYW5pc20gdG8gcmVwbGFjZSBvYnNvbGV0ZSBTTk1QdjJwIGFsYXJtIAogICAgICAgICAgICAgKi8KICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMTsKCn0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIHNubXBfaW5wdXQoKSAqLwoKCgovKgogKiBXaW5kb3dzIFNlcnZpY2UgUmVsYXRlZCBmdW5jdGlvbnMgCiAqLwojaWZkZWYgV0lOMzJTRVJWSUNFCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiBtYWluIGZ1bmN0aW9uIGZvciBXaW5kb3dzCiogUGFyc2UgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBmb3Igc3RhcnR1cCBvcHRpb25zLAoqIHRvIHN0YXJ0IGFzIHNlcnZpY2Ugb3IgY29uc29sZSBtb2RlIGFwcGxpY2F0aW9uIGluIHdpbmRvd3MuCiogSW52b2tlcyBhcHByb3ByaWF0ZSBzdGFydHVwIGZ1bmN0aW9ucyBkZXBlbmRpbmcgb24gdGhlIAoqIHBhcmFtZXRlcnMgcGFzc2VkCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmludAogICAgX19jZGVjbApfdG1haW4oaW50IGFyZ2MsIFRDSEFSICogYXJndltdKQp7CiAgICAvKgogICAgICogRGVmaW5lIFNlcnZpY2UgTmFtZSBhbmQgRGVzY3JpcHRpb24sIHdoaWNoIGFwcGVhcnMgaW4gd2luZG93cyBTQ00gCiAgICAgKi8KICAgIExQQ1RTVFIgICAgICAgICBscHN6U2VydmljZU5hbWUgPSBhcHBfbmFtZV9sb25nOyAgICAgIC8qIFNlcnZpY2UgUmVnaXN0cnkgTmFtZSAqLwogICAgTFBDVFNUUiAgICAgICAgIGxwc3pTZXJ2aWNlRGlzcGxheU5hbWUgPSBfVCgiTmV0LVNOTVAgQWdlbnQiKTsgICAgICAgLyogRGlzcGxheSBOYW1lICovCiAgICBMUENUU1RSICAgICAgICAgbHBzelNlcnZpY2VEZXNjcmlwdGlvbiA9CiNpZmRlZiBJRkRFU0NSCiAgICAgICAgX1QoIlNOTVB2MmMgLyBTTk1QdjMgY29tbWFuZCByZXNwb25kZXIgZnJvbSBOZXQtU05NUC4gU3VwcG9ydHMgTUlCIG9iamVjdHMgZm9yIElQLElDTVAsVENQLFVEUCwgYW5kIG5ldHdvcmsgaW50ZXJmYWNlIHN1Yi1sYXllcnMuIik7CiNlbHNlCiAgICAgICAgX1QoIlNOTVB2MmMgLyBTTk1QdjMgY29tbWFuZCByZXNwb25kZXIgZnJvbSBOZXQtU05NUCIpOwojZW5kaWYKICAgIElucHV0UGFyYW1zICAgICBJbnB1dE9wdGlvbnM7CgoKICAgIGludCAgICAgICAgICAgICBuUnVuVHlwZSA9IFJVTl9BU19DT05TT0xFOwogICAgaW50ICAgICAgICAgICAgIHF1aWV0ID0gMDsKICAgIAojaWYgMAogICAgX0NydFNldERiZ0ZsYWcoX0NSVERCR19BTExPQ19NRU1fREYgfCBfQ1JUREJHX0xFQUtfQ0hFQ0tfREYgLyp8IF9DUlREQkdfQ0hFQ0tfQUxXQVlTX0RGKi8pOwojZW5kaWYKCiAgICBuUnVuVHlwZSA9IFBhcnNlQ21kTGluZUZvclNlcnZpY2VPcHRpb24oYXJnYywgYXJndiwgJnF1aWV0KTsKCiAgICBzd2l0Y2ggKG5SdW5UeXBlKSB7CiAgICBjYXNlIFJFR0lTVEVSX1NFUlZJQ0U6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWdpc3RlciBBcyBzZXJ2aWNlIAogICAgICAgICAqLwogICAgICAgIElucHV0T3B0aW9ucy5BcmdjID0gYXJnYzsKICAgICAgICBJbnB1dE9wdGlvbnMuQXJndiA9IGFyZ3Y7CiAgICAgICAgZXhpdCAoUmVnaXN0ZXJTZXJ2aWNlKGxwc3pTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgbHBzelNlcnZpY2VEaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgbHBzelNlcnZpY2VEZXNjcmlwdGlvbiwgJklucHV0T3B0aW9ucywgcXVpZXQpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVU5fUkVHSVNURVJfU0VSVklDRToKICAgICAgICAvKgogICAgICAgICAqIFVucmVnaXN0ZXIgc2VydmljZSAKICAgICAgICAgKi8KICAgICAgICBleGl0IChVbnJlZ2lzdGVyU2VydmljZShscHN6U2VydmljZU5hbWUsIHF1aWV0KSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFJVTl9BU19TRVJWSUNFOgogICAgICAgIC8qCiAgICAgICAgICogUnVuIGFzIHNlcnZpY2UgCiAgICAgICAgICovCiAgICAgICAgLyoKICAgICAgICAgKiBSZWdpc3RlciBTdG9wIEZ1bmN0aW9uIAogICAgICAgICAqLwogICAgICAgIFJlZ2lzdGVyU3RvcEZ1bmN0aW9uKFN0b3BTbm1wQWdlbnQpOwogICAgICAgIHJldHVybiBSdW5Bc1NlcnZpY2UoU25tcERhZW1vbk1haW4pOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAvKgogICAgICAgICAqIFJ1biBpbiBjb25zb2xlIG1vZGUgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuIFNubXBEYWVtb25NYWluKGFyZ2MsIGFyZ3YpOwogICAgICAgIGJyZWFrOwogICAgfQp9CgovKgogKiBUbyBzdG9wIFNubXAgQWdlbnQgZGFlbW9uCiAqIFRoaXMgcG9ydGlvbiBpcyBzdGlsbCBub3Qgd29ya2luZwogKi8Kdm9pZApTdG9wU25tcEFnZW50KHZvaWQpCnsKICAgIC8qCiAgICAgKiBTaHV0IERvd24gQWdlbnQgCiAgICAgKi8KICAgIFNubXBkU2h1dERvd24oMSk7CgogICAgLyoKICAgICAqIFdhaXQgdGlsbCBhZ2VudCBpcyBjb21wbGV0ZWx5IHN0b3BwZWQgCiAgICAgKi8KCiAgICB3aGlsZSAoYWdlbnRfc3RhdHVzICE9IEFHRU5UX1NUT1BQRUQpIHsKICAgICAgICBTbGVlcCgxMDApOwogICAgfQp9CgojZW5kaWYgLypXSU4zMlNFUlZJQ0UqLwo=