LyoKICogc25tcGQuYwogKi8KLyoqIEBkZWZncm91cCBhZ2VudCBUaGUgTmV0LVNOTVAgYWdlbnQKICogVGhlIHNubXAgYWdlbnQgcmVzcG9uZHMgdG8gU05NUCBxdWVyaWVzIGZyb20gbWFuYWdlbWVudCBzdGF0aW9ucwogKi8KLyogUG9ydGlvbnMgb2YgdGhpcyBmaWxlIGFyZSBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29weXJpZ2h0cy4gIFNlZQogKiB0aGUgTmV0LVNOTVAncyBDT1BZSU5HIGZpbGUgZm9yIG1vcmUgZGV0YWlscyBhbmQgb3RoZXIgY29weXJpZ2h0cwogKiB0aGF0IG1heSBhcHBseToKICovCi8qCiAqIENvcHlyaWdodCAxOTg4LCAxOTg5IGJ5IENhcm5lZ2llIE1lbGxvbiBVbml2ZXJzaXR5CiAqIAogKiBBbGwgUmlnaHRzIFJlc2VydmVkCiAqIAogKiBQZXJtaXNzaW9uIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBhbmQgZGlzdHJpYnV0ZSB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgCiAqIGRvY3VtZW50YXRpb24gZm9yIGFueSBwdXJwb3NlIGFuZCB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZCwgCiAqIHByb3ZpZGVkIHRoYXQgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYXBwZWFyIGluIGFsbCBjb3BpZXMgYW5kIHRoYXQKICogYm90aCB0aGF0IGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2UgYXBwZWFyIGluIAogKiBzdXBwb3J0aW5nIGRvY3VtZW50YXRpb24sIGFuZCB0aGF0IHRoZSBuYW1lIG9mIENNVSBub3QgYmUKICogdXNlZCBpbiBhZHZlcnRpc2luZyBvciBwdWJsaWNpdHkgcGVydGFpbmluZyB0byBkaXN0cmlidXRpb24gb2YgdGhlCiAqIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMsIHdyaXR0ZW4gcHJpb3IgcGVybWlzc2lvbi4gIAogKiAKICogQ01VIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIIFJFR0FSRCBUTyBUSElTIFNPRlRXQVJFLCBJTkNMVURJTkcKICogQUxMIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MsIElOIE5PIEVWRU5UIFNIQUxMCiAqIENNVSBCRSBMSUFCTEUgRk9SIEFOWSBTUEVDSUFMLCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IKICogQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTSBMT1NTIE9GIFVTRSwgREFUQSBPUiBQUk9GSVRTLAogKiBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgTkVHTElHRU5DRSBPUiBPVEhFUiBUT1JUSU9VUyBBQ1RJT04sCiAqIEFSSVNJTkcgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgVVNFIE9SIFBFUkZPUk1BTkNFIE9GIFRISVMKICogU09GVFdBUkUuCiAqICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqLwovKgogKiBDb3B5cmlnaHQgqSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVXNlIGlzIHN1YmplY3QgdG8gbGljZW5zZSB0ZXJtcyBzcGVjaWZpZWQgaW4gdGhlIENPUFlJTkcgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoZSBOZXQtU05NUCBwYWNrYWdlLgogKi8KI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWNvbmZpZy5oPgoKI2lmIEhBVkVfSU9fSAojaW5jbHVkZSA8aW8uaD4KI2VuZGlmCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2lmIEhBVkVfU1RSSU5HX0gKI2luY2x1ZGUgPHN0cmluZy5oPgojZWxzZQojaW5jbHVkZSA8c3RyaW5ncy5oPgojZW5kaWYKI2lmIEhBVkVfU1RETElCX0gKI2luY2x1ZGUgPHN0ZGxpYi5oPgojZW5kaWYKI2lmIEhBVkVfVU5JU1REX0gKI2luY2x1ZGUgPHVuaXN0ZC5oPgojZW5kaWYKI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaWYgSEFWRV9ORVRJTkVUX0lOX0gKI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KI2VuZGlmCiNpZiBIQVZFX0FSUEFfSU5FVF9ICiNpbmNsdWRlIDxhcnBhL2luZXQuaD4KI2VuZGlmCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyBpZmRlZiBXSU4zMgojICBpbmNsdWRlIDxzeXMvdGltZWIuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZW5kaWYKIyBpbmNsdWRlIDx0aW1lLmg+CiNlbHNlCiMgaWYgSEFWRV9TWVNfVElNRV9ICiMgIGluY2x1ZGUgPHN5cy90aW1lLmg+CiMgZWxzZQojICBpbmNsdWRlIDx0aW1lLmg+CiMgZW5kaWYKI2VuZGlmCiNpZiBIQVZFX1NZU19TRUxFQ1RfSAojaW5jbHVkZSA8c3lzL3NlbGVjdC5oPgojZW5kaWYKI2lmIEhBVkVfU1lTX1NPQ0tFVF9ICiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNlbGlmIEhBVkVfV0lOU09DS19ICiNpbmNsdWRlIDx3aW5zb2NrLmg+CiNlbmRpZgojaWYgSEFWRV9ORVRfSUZfSAojaW5jbHVkZSA8bmV0L2lmLmg+CiNlbmRpZgojaWYgSEFWRV9JTkVUX01JQjJfSAojaW5jbHVkZSA8aW5ldC9taWIyLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfSU9DVExfSAojaW5jbHVkZSA8c3lzL2lvY3RsLmg+CiNlbmRpZgojaWYgSEFWRV9TWVNfRklMRV9ICiNpbmNsdWRlIDxzeXMvZmlsZS5oPgojZW5kaWYKI2lmZGVmIEhBVkVfRkNOVExfSAojaW5jbHVkZSA8ZmNudGwuaD4KI2VuZGlmCiNpZiBIQVZFX1NZU19XQUlUX0gKI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNlbmRpZgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpZmRlZiBIQVZFX1NZU19QQVJBTV9ICiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2VuZGlmCiNpZiBIQVZFX1BST0NFU1NfSCAgICAgICAgICAgICAgLyogV2luMzItZ2V0cGlkICovCiNpbmNsdWRlIDxwcm9jZXNzLmg+CiNlbmRpZgojaWYgSEFWRV9MSU1JVFNfSAojaW5jbHVkZSA8bGltaXRzLmg+CiNlbmRpZgojaWYgSEFWRV9QV0RfSAojaW5jbHVkZSA8cHdkLmg+CiNlbmRpZgojaWYgSEFWRV9HUlBfSAojaW5jbHVkZSA8Z3JwLmg+CiNlbmRpZgoKI2lmbmRlZiBQQVRIX01BWAojIGlmZGVmIF9QT1NJWF9QQVRIX01BWAojICBkZWZpbmUgUEFUSF9NQVggX1BPU0lYX1BBVEhfTUFYCiMgZWxzZQojICBkZWZpbmUgUEFUSF9NQVggMjU1CiMgZW5kaWYKI2VuZGlmCgojaWZuZGVmIEZEX1NFVAp0eXBlZGVmIGxvbmcgICAgZmRfbWFzazsKI2RlZmluZSBORkRCSVRTIChzaXplb2YoZmRfbWFzaykgKiBOQkJZKSAgICAgICAgLyogYml0cyBwZXIgbWFzayAqLwojZGVmaW5lIEZEX1NFVChuLCBwKSAgICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gfD0gKDEgPDwgKChuKSAlIE5GREJJVFMpKSkKI2RlZmluZSBGRF9DTFIobiwgcCkgICAgKChwKS0+ZmRzX2JpdHNbKG4pL05GREJJVFNdICY9IH4oMSA8PCAoKG4pICUgTkZEQklUUykpKQojZGVmaW5lIEZEX0lTU0VUKG4sIHApICAoKHApLT5mZHNfYml0c1sobikvTkZEQklUU10gJiAoMSA8PCAoKG4pICUgTkZEQklUUykpKQojZGVmaW5lIEZEX1pFUk8ocCkgICAgICBtZW1zZXQoKHApLCAwLCBzaXplb2YoKihwKSkpCiNlbmRpZgoKI2luY2x1ZGUgPG5ldC1zbm1wL25ldC1zbm1wLWluY2x1ZGVzLmg+CiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9uZXQtc25tcC1hZ2VudC1pbmNsdWRlcy5oPgoKI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvZmRfZXZlbnRfbWFuYWdlci5oPgoKI2luY2x1ZGUgIm0ybS5oIgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvbWliX21vZHVsZV9jb25maWcuaD4KCiNpbmNsdWRlICJzbm1wZC5oIgojaW5jbHVkZSAibWliZ3JvdXAvc3RydWN0LmgiCiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9taWJfbW9kdWxlcy5oPgoKI2luY2x1ZGUgIm1pYmdyb3VwL3V0aWxfZnVuY3MuaCIKCiNpbmNsdWRlIDxuZXQtc25tcC9hZ2VudC9hZ2VudF90cmFwLmg+CgojaW5jbHVkZSA8bmV0LXNubXAvYWdlbnQvdGFibGUuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2FnZW50L3RhYmxlX2l0ZXJhdG9yLmg+CiNpbmNsdWRlICJtaWJfbW9kdWxlX2luY2x1ZGVzLmgiCgovKgogKiBJbmNsdWRlIHdpbnNlcnZpY2UuaCB0byBzdXBwb3J0IFdpbmRvd3MgU2VydmljZQogKi8KI2lmZGVmIFdJTjMyCiNpbmNsdWRlIDx3aW5kb3dzLmg+CiNpbmNsdWRlIDx0Y2hhci5oPgojaW5jbHVkZSA8bmV0LXNubXAvbGlicmFyeS93aW5zZXJ2aWNlLmg+CgojZGVmaW5lIFdJTjMyU0VSVklDRQoKI2VuZGlmCgovKgogKiBHbG9iYWxzLgogKi8KI2lmZGVmIE5FVFNOTVBfVVNFX0xJQldSQVAKI2luY2x1ZGUgPHRjcGQuaD4KI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBORVRTTk1QX1VTRV9MSUJXUkFQICovCgojZGVmaW5lIFRJTUVUSUNLICAgICAgICAgNTAwMDAwTAoKaW50ICAgICAgICAgICAgIHNubXBfZHVtcF9wYWNrZXQ7CmludCAgICAgICAgICAgICByZWNvbmZpZyA9IDA7CmludCAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19EQUVNT047CgojaWZkZWYgV0lOMzJTRVJWSUNFCi8qCiAqIFNOTVAgQWdlbnQgU3RhdHVzIAogKi8KI2RlZmluZSBBR0VOVF9SVU5OSU5HIDEKI2RlZmluZSBBR0VOVF9TVE9QUEVEIDAKaW50ICAgICAgICAgICAgIGFnZW50X3N0YXR1cyA9IEFHRU5UX1NUT1BQRUQ7Ci8qIGFwcF9uYW1lX2xvbmcgdXNlZCBmb3IgRXZlbnQgTG9nIChzeXNsb2cpLCBTQ00sIHJlZ2lzdHJ5IGV0YyAqLwpMUENUU1RSICAgICAgICAgYXBwX25hbWVfbG9uZyA9IF9UKCJOZXQtU05NUCBBZ2VudCIpOyAgICAgLyogQXBwbGljYXRpb24gTmFtZSAqLwojZW5kaWYKCmNvbnN0IGNoYXIgICAgICphcHBfbmFtZSA9ICJzbm1wZCI7CgpleHRlcm4gaW50ICAgICAgbmV0c25tcF9ydW5uaW5nOwpleHRlcm4gY2hhciAgICoqYXJndnJlc3RhcnRwOwpleHRlcm4gY2hhciAgICAqYXJndnJlc3RhcnQ7CmV4dGVybiBjaGFyICAgICphcmd2cmVzdGFydG5hbWU7CgojaWZkZWYgVVNJTkdfU01VWF9NT0RVTEUKI2luY2x1ZGUgPG1pYmdyb3VwL3NtdXgvc211eC5oPgojZW5kaWYgLyogVVNJTkdfU01VWF9NT0RVTEUgKi8KCi8qCiAqIFByb3RvdHlwZXMuCiAqLwppbnQgICAgICAgICAgICAgc25tcF9yZWFkX3BhY2tldChpbnQpOwppbnQgICAgICAgICAgICAgc25tcF9pbnB1dChpbnQsIG5ldHNubXBfc2Vzc2lvbiAqLCBpbnQsIG5ldHNubXBfcGR1ICosCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKik7CnN0YXRpYyB2b2lkICAgICB1c2FnZShjaGFyICopOwpzdGF0aWMgdm9pZCAgICAgU25tcFRyYXBOb2RlRG93bih2b2lkKTsKc3RhdGljIGludCAgICAgIHJlY2VpdmUodm9pZCk7CiNpZmRlZiBXSU4zMlNFUlZJQ0UKdm9pZCAgICAgICAgICAgIFN0b3BTbm1wQWdlbnQodm9pZCk7CmludCAgICAgICAgICAgICBTbm1wRGFlbW9uTWFpbihpbnQgYXJnYywgVENIQVIgKiBhcmd2W10pOwppbnQgX19jZGVjbCAgICAgX3RtYWluKGludCBhcmdjLCBUQ0hBUiAqIGFyZ3ZbXSk7CiNlbHNlCmludCAgICAgICAgICAgICBtYWluKGludCwgY2hhciAqKik7CiNlbmRpZgoKLyoKICogVGhlc2UgZGVmaW5pdGlvbnMgaGFuZGxlIDQuMiBzeXN0ZW1zIHdpdGhvdXQgYWRkaXRpb25hbCBzeXNsb2cgZmFjaWxpdGllcy4KICovCiNpZm5kZWYgTE9HX0NPTlMKI2RlZmluZSBMT0dfQ09OUwkwICAgICAgIC8qIERvbid0IGJvdGhlciBpZiBub3QgZGVmaW5lZC4uLiAqLwojZW5kaWYKI2lmbmRlZiBMT0dfUElECiNkZWZpbmUgTE9HX1BJRAkJMCAgICAgICAvKiBEb24ndCBib3RoZXIgaWYgbm90IGRlZmluZWQuLi4gKi8KI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMMAojZGVmaW5lIExPR19MT0NBTDAJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUwxCiNkZWZpbmUgTE9HX0xPQ0FMMQkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDIKI2RlZmluZSBMT0dfTE9DQUwyCTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMMwojZGVmaW5lIExPR19MT0NBTDMJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUw0CiNkZWZpbmUgTE9HX0xPQ0FMNAkwCiNlbmRpZgojaWZuZGVmIExPR19MT0NBTDUKI2RlZmluZSBMT0dfTE9DQUw1CTAKI2VuZGlmCiNpZm5kZWYgTE9HX0xPQ0FMNgojZGVmaW5lIExPR19MT0NBTDYJMAojZW5kaWYKI2lmbmRlZiBMT0dfTE9DQUw3CiNkZWZpbmUgTE9HX0xPQ0FMNwkwCiNlbmRpZgojaWZuZGVmIExPR19EQUVNT04KI2RlZmluZSBMT0dfREFFTU9OCTAKI2VuZGlmCgoKc3RhdGljIHZvaWQKdXNhZ2UoY2hhciAqcHJvZykKewojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBwcmludGYoIlxuVXNhZ2U6ICAlcyBbLXJlZ2lzdGVyXSBbLXF1aWV0XSBbT1BUSU9OU10gW0xJU1RFTklORyBBRERSRVNTRVNdIiwKICAgICAgICAgICBwcm9nKTsKICAgIHByaW50ZigiXG4gICAgICAgICVzIFstdW5yZWdpc3Rlcl0gWy1xdWlldF0iLCBwcm9nKTsKI2Vsc2UKICAgIHByaW50ZigiXG5Vc2FnZTogICVzIFtPUFRJT05TXSBbTElTVEVOSU5HIEFERFJFU1NFU10iLCBwcm9nKTsKI2VuZGlmCiAgICBwcmludGYoIlxuIik7CiAgICBwcmludGYoIlxuXHRWZXJzaW9uOiAgJXNcbiIsIG5ldHNubXBfZ2V0X3ZlcnNpb24oKSk7CiAgICBwcmludGYoIlx0V2ViOiAgICAgIGh0dHA6Ly93d3cubmV0LXNubXAub3JnL1xuIik7CiAgICBwcmludGYoIlx0RW1haWw6ICAgIG5ldC1zbm1wLWNvZGVyc0BsaXN0cy5zb3VyY2Vmb3JnZS5uZXRcbiIpOwogICAgcHJpbnRmKCJcbiAgLWFcdFx0XHRsb2cgYWRkcmVzc2VzXG4iKTsKICAgIHByaW50ZigiICAtQVx0XHRcdGFwcGVuZCB0byB0aGUgbG9nZmlsZSByYXRoZXIgdGhhbiB0cnVuY2F0aW5nIGl0XG4iKTsKICAgIHByaW50ZigiICAtYyBGSUxFWywuLi5dXHRcdHJlYWQgRklMRShzKSBhcyBjb25maWd1cmF0aW9uIGZpbGUocylcbiIpOwogICAgcHJpbnRmKCIgIC1DXHRcdFx0ZG8gbm90IHJlYWQgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBmaWxlc1xuIik7CiAgICBwcmludGYoIiAgLWRcdFx0XHRkdW1wIHNlbnQgYW5kIHJlY2VpdmVkIFNOTVAgcGFja2V0c1xuIik7CiAgICBwcmludGYoIiAgLURbVE9LRU5bLC4uLl1dXHR0dXJuIG9uIGRlYnVnZ2luZyBvdXRwdXQgZm9yIHRoZSBnaXZlbiBUT0tFTihzKVxuIgoJICAgIlx0XHRcdCAgKHRyeSBBTEwgZm9yIGV4dHJlbWVseSB2ZXJib3NlIG91dHB1dClcbiIKCSAgICJcdFx0XHQgIERvbid0IHB1dCBzcGFjZShzKSBiZXR3ZWVuIC1EIGFuZCBUT0tFTihzKS5cbiIpOwogICAgcHJpbnRmKCIgIC1mXHRcdFx0ZG8gbm90IGZvcmsgZnJvbSB0aGUgc2hlbGxcbiIpOwojaWYgSEFWRV9VTklTVERfSAogICAgcHJpbnRmKCIgIC1nIEdJRFx0XHRjaGFuZ2UgdG8gdGhpcyBudW1lcmljIGdpZCBhZnRlciBvcGVuaW5nXG4iCgkgICAiXHRcdFx0ICB0cmFuc3BvcnQgZW5kcG9pbnRzXG4iKTsKI2VuZGlmCiAgICBwcmludGYoIiAgLWgsIC0taGVscFx0XHRkaXNwbGF5IHRoaXMgdXNhZ2UgbWVzc2FnZVxuIik7CiAgICBwcmludGYoIiAgLUhcdFx0XHRkaXNwbGF5IGNvbmZpZ3VyYXRpb24gZmlsZSBkaXJlY3RpdmVzIHVuZGVyc3Rvb2RcbiIpOwogICAgcHJpbnRmKCIgIC1JIFstXUlOSVRMSVNUXHRsaXN0IG9mIG1pYiBtb2R1bGVzIHRvIGluaXRpYWxpemUgKG9yIG5vdClcbiIpOwogICAgcHJpbnRmKCJcdFx0XHQgIChydW4gc25tcGQgd2l0aCAtRG1pYl9pbml0IGZvciBhIGxpc3QpXG4iKTsKICAgIHByaW50ZigiICAtTCA8TE9HT1BUUz5cdFx0dG9nZ2xlIG9wdGlvbnMgY29udHJvbGxpbmcgd2hlcmUgdG8gbG9nIHRvXG4iKTsKICAgIHNubXBfbG9nX29wdGlvbnNfdXNhZ2UoIlx0Iiwgc3Rkb3V0KTsKICAgIHByaW50ZigiICAtbSBNSUJMSVNUXHRcdHVzZSBNSUJMSVNUIGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgTUlCIGxpc3RcbiIpOwogICAgcHJpbnRmKCIgIC1NIERJUkxJU1RcdFx0dXNlIERJUkxJU1QgYXMgdGhlIGxpc3Qgb2YgbG9jYXRpb25zXG5cdFx0XHQgIHRvIGxvb2sgZm9yIE1JQnNcbiIpOwogICAgcHJpbnRmKCIgIC1wIEZJTEVcdFx0c3RvcmUgcHJvY2VzcyBpZCBpbiBGSUxFXG4iKTsKICAgIHByaW50ZigiICAtcVx0XHRcdHByaW50IGluZm9ybWF0aW9uIGluIGEgbW9yZSBwYXJzYWJsZSBmb3JtYXRcbiIpOwogICAgcHJpbnRmKCIgIC1yXHRcdFx0ZG8gbm90IGV4aXQgaWYgZmlsZXMgb25seSBhY2Nlc3NpYmxlIHRvIHJvb3RcbiIKCSAgICJcdFx0XHQgIGNhbm5vdCBiZSBvcGVuZWRcbiIpOwojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBwcmludGYoIiAgLXJlZ2lzdGVyXHRcdHJlZ2lzdGVyIGFzIGEgV2luZG93cyBzZXJ2aWNlXG4iKTsKICAgIHByaW50ZigiICBcdFx0XHQgIChmb2xsb3dlZCBieSAtcXVpZXQgdG8gcHJldmVudCBtZXNzYWdlIHBvcHVwcylcbiIpOwogICAgcHJpbnRmKCIgIFx0XHRcdCAgKGZvbGxvd2VkIGJ5IHRoZSBzdGFydHVwIHBhcmFtZXRlciBsaXN0KVxuIik7CiAgICBwcmludGYoIiAgXHRcdFx0ICBOb3RlIHRoYXQgc29tZSBwYXJhbWV0ZXJzIGFyZSBub3QgcmVsZXZhbnQgd2hlbiBydW5uaW5nIGFzIGEgc2VydmljZVxuIik7CiNlbmRpZgojaWYgSEFWRV9VTklTVERfSAogICAgcHJpbnRmKCIgIC11IFVJRFx0XHRjaGFuZ2UgdG8gdGhpcyB1aWQgKG51bWVyaWMgb3IgdGV4dHVhbCkgYWZ0ZXJcbiIKCSAgICJcdFx0XHQgIG9wZW5pbmcgdHJhbnNwb3J0IGVuZHBvaW50c1xuIik7CiNlbmRpZgojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBwcmludGYoIiAgLXVucmVnaXN0ZXJcdFx0dW5yZWdpc3RlciBhcyBhIFdpbmRvd3Mgc2VydmljZVxuIik7CiAgICBwcmludGYoIiAgXHRcdFx0ICAoZm9sbG93ZWQgLXF1aWV0IHRvIHByZXZlbnQgbWVzc2FnZSBwb3B1cHMpXG4iKTsKI2VuZGlmCiAgICBwcmludGYoIiAgLXYsIC0tdmVyc2lvblx0XHRkaXNwbGF5IHZlcnNpb24gaW5mb3JtYXRpb25cbiIpOwogICAgcHJpbnRmKCIgIC1WXHRcdFx0dmVyYm9zZSBkaXNwbGF5XG4iKTsKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSl8fCBkZWZpbmVkKFVTSU5HX0FHRU5UWF9NQVNURVJfTU9EVUxFKQogICAgcHJpbnRmKCIgIC14IEFERFJFU1NcdFx0dXNlIEFERFJFU1MgYXMgQWdlbnRYIGFkZHJlc3NcbiIpOwojZW5kaWYKI2lmZGVmIFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUKICAgIHByaW50ZigiICAtWFx0XHRcdHJ1biBhcyBhbiBBZ2VudFggc3ViYWdlbnQgcmF0aGVyIHRoYW4gYXMgYW5cbiIKCSAgICJcdFx0XHQgIFNOTVAgbWFzdGVyIGFnZW50XG4iKTsKI2VuZGlmCgogICAgcHJpbnRmKCJcbkRlcHJlY2F0ZWQgb3B0aW9uczpcbiIpOwogICAgcHJpbnRmKCIgIC1sIEZJTEVcdFx0dXNlIC1MZiA8RklMRT4gaW5zdGVhZFxuIik7CiAgICBwcmludGYoIiAgLVBcdFx0XHR1c2UgLXAgaW5zdGVhZFxuIik7CiAgICBwcmludGYoIiAgLXNcdFx0XHR1c2UgLUxzZCBpbnN0ZWFkXG4iKTsKICAgIHByaW50ZigiICAtUyBkfGl8MC03XHRcdHVzZSAtTHMgPGZhY2lsaXR5PiBpbnN0ZWFkXG4iKTsKCiAgICBwcmludGYoIlxuIik7CiAgICBleGl0KDEpOwp9CgpzdGF0aWMgdm9pZAp2ZXJzaW9uKHZvaWQpCnsKICAgIHByaW50ZigiXG5ORVQtU05NUCB2ZXJzaW9uOiAgJXNcbiIsIG5ldHNubXBfZ2V0X3ZlcnNpb24oKSk7CiAgICBwcmludGYoIldlYjogICAgICAgICAgICAgICBodHRwOi8vd3d3Lm5ldC1zbm1wLm9yZy9cbiIpOwogICAgcHJpbnRmKCJFbWFpbDogICAgICAgICAgICAgbmV0LXNubXAtY29kZXJzQGxpc3RzLnNvdXJjZWZvcmdlLm5ldFxuXG4iKTsKICAgIGV4aXQoMCk7Cn0KClJFVFNJR1RZUEUKU25tcGRTaHV0RG93bihpbnQgYSkKewojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBleHRlcm4gbmV0c25tcF9zZXNzaW9uICptYWluX3Nlc3Npb247CiNlbmRpZgogICAgbmV0c25tcF9ydW5uaW5nID0gMDsKI2lmZGVmIFdJTjMyU0VSVklDRQogICAgLyoKICAgICAqIEluIGNhc2Ugb2Ygd2luZG93cywgc2VsZWN0KCkgaW4gcmVjZWl2ZSgpIGZ1bmN0aW9uIHdpbGwgbm90IHJldHVybiAKICAgICAqIG9uIHNpZ25hbC4gVGhhdHMgd2h5IGZvbGxvd2luZyBmdW5jdGlvbiBpcyBjYWxsZWQsIHdoaWNoIGNsb3NlcyB0aGUgCiAgICAgKiBzb2NrZXQgZGVzY3JpcHRvcnMgYW5kIGNhdXNlcyB0aGUgc2VsZWN0KCkgdG8gcmV0dXJuCiAgICAgKi8KICAgIHNubXBfY2xvc2UobWFpbl9zZXNzaW9uKTsKI2VuZGlmCn0KCiNpZmRlZiBTSUdIVVAKUkVUU0lHVFlQRQpTbm1wZFJlY29uZmlnKGludCBhKQp7CiAgICByZWNvbmZpZyA9IDE7CiAgICBzaWduYWwoU0lHSFVQLCBTbm1wZFJlY29uZmlnKTsKfQojZW5kaWYKCiNpZmRlZiBTSUdVU1IxCmV4dGVybiB2b2lkICAgICBkdW1wX3JlZ2lzdHJ5KHZvaWQpOwpSRVRTSUdUWVBFClNubXBkRHVtcChpbnQgYSkKewogICAgZHVtcF9yZWdpc3RyeSgpOwogICAgc2lnbmFsKFNJR1VTUjEsIFNubXBkRHVtcCk7Cn0KI2VuZGlmCgpSRVRTSUdUWVBFClNubXBkQ2F0Y2hSYW5kb21TaWduYWwoaW50IGEpCnsKICAgIC8qIERpc2FibGUgYWxsIGxvZ3MgYW5kIGxvZyB0aGUgZXJyb3IgdmlhIHN5c2xvZyAqLwogICAgc25tcF9kaXNhYmxlX2xvZygpOwogICAgc25tcF9lbmFibGVfc3lzbG9nKCk7CiAgICBzbm1wX2xvZyhMT0dfRVJSLCAiRXhpdGluZyBvbiBzaWduYWwgJWRcbiIsIGEpOwogICAgc25tcF9kaXNhYmxlX3N5c2xvZygpOwogICAgZXhpdCgxKTsKfQoKc3RhdGljIHZvaWQKU25tcFRyYXBOb2RlRG93bih2b2lkKQp7CiAgICBzZW5kX2Vhc3lfdHJhcChTTk1QX1RSQVBfRU5URVJQUklTRVNQRUNJRklDLCAyKTsKICAgIC8qCiAgICAgKiBYWFggIDIgLSBOb2RlIERvd24gI2RlZmluZSBpdCBhcyBOT0RFX0RPV05fVFJBUCAKICAgICAqLwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiBtYWluIC0gTm9uIFdpbmRvd3MKICogU25tcERhZW1vbk1haW4gLSBXaW5kb3dzIHRvIHN1cHBvcnQgd2luZG93cyBzZXJ2aWNlCiAqCiAqIFBhcmFtZXRlcnM6CiAqCSBhcmdjCiAqCSphcmd2W10KICogICAgICAKICogUmV0dXJuczoKICoJMAlBbHdheXMgc3VjY2VlZHMuICAoPykKICoKICoKICogU2V0dXAgYW5kIHN0YXJ0IHRoZSBhZ2VudCBkYWVtb24uCiAqCiAqIEFsc28gc3VjY2Vzc2Z1bGx5IEVYSVRzIHdpdGggemVybyBmb3Igc29tZSBvcHRpb25zLgogKi8KaW50CiNpZmRlZiBXSU4zMlNFUlZJQ0UKU25tcERhZW1vbk1haW4oaW50IGFyZ2MsIFRDSEFSICogYXJndltdKQojZWxzZQptYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCiNlbmRpZgp7CiAgICBjaGFyICAgICAgICAgICAgb3B0aW9uc1sxMjhdID0gImFBYzpDZEQ6OmZoSEk6bDpMOm06TTpuOnA6UDpxcnNTOlV2Vi06WToiOwogICAgaW50ICAgICAgICAgICAgIGFyZywgaSwgcmV0OwogICAgaW50ICAgICAgICAgICAgIGRvbnRfZm9yayA9IDAsIGRvX2hlbHAgPSAwOwogICAgaW50ICAgICAgICAgICAgIGxvZ19zZXQgPSAwOwogICAgaW50ICAgICAgICAgICAgIHVpZCA9IDAsIGdpZCA9IDA7CiAgICBpbnQgICAgICAgICAgICAgYWdlbnRfbW9kZSA9IC0xOwogICAgY2hhciAgICAgICAgICAgKmNwdHIsICoqYXJndnB0cjsKICAgIGNoYXIgICAgICAgICAgICpwaWRfZmlsZSA9IE5VTEw7CiAgICBjaGFyICAgICAgICAgICAgb3B0aW9uX2NvbXBhdGFiaWxpdHlbXSA9ICItTGUiOwojaWYgSEFWRV9HRVRQSUQKICAgIGludCBmZDsKICAgIEZJTEUgICAgICAgICAgICpQSUQ7CiNlbmRpZgoKI2lmbmRlZiBXSU4zMgogICAgLyoKICAgICAqIGNsb3NlIGFsbCBub24tc3RhbmRhcmQgZmlsZSBkZXNjcmlwdG9ycyB3ZSBtYXkgaGF2ZQogICAgICogaW5oZXJpdGVkIGZyb20gdGhlIHNoZWxsLgogICAgICovCiAgICBmb3IgKGkgPSBnZXRkdGFibGVzaXplKCkgLSAxOyBpID4gMjsgLS1pKSB7CiAgICAgICAgKHZvaWQpIGNsb3NlKGkpOwogICAgfQojZW5kaWYgLyogI1dJTjMyICovCiAgICAKICAgIC8qCiAgICAgKiByZWdpc3RlciBzaWduYWxzIEFTQVAgdG8gcHJldmVudCBkZWZhdWx0IGFjdGlvbiAodXN1YWxseSBjb3JlKQogICAgICogZm9yIHNpZ25hbHMgZHVyaW5nIHN0YXJ0dXAuLi4KICAgICAqLwojaWZkZWYgU0lHVEVSTQogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdURVJNIHNpZ25hbCBoYW5kbGVyXG4iKSk7CiAgICBzaWduYWwoU0lHVEVSTSwgU25tcGRTaHV0RG93bik7CiNlbmRpZgojaWZkZWYgU0lHSU5UCiAgICBERUJVR01TR1RMKCgic2lnbmFsIiwgInJlZ2lzdGVyaW5nIFNJR0lOVCBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR0lOVCwgU25tcGRTaHV0RG93bik7CiNlbmRpZgojaWZkZWYgU0lHSFVQCiAgICBzaWduYWwoU0lHSFVQLCBTSUdfSUdOKTsgICAvKiBkbyBub3QgdGVybWluYXRlIG9uIGVhcmx5IFNJR0hVUCAqLwojZW5kaWYKI2lmZGVmIFNJR1VTUjEKICAgIERFQlVHTVNHVEwoKCJzaWduYWwiLCAicmVnaXN0ZXJpbmcgU0lHVVNSMSBzaWduYWwgaGFuZGxlclxuIikpOwogICAgc2lnbmFsKFNJR1VTUjEsIFNubXBkRHVtcCk7CiNlbmRpZgojaWZkZWYgU0lHUElQRQogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdQSVBFIHNpZ25hbCBoYW5kbGVyXG4iKSk7CiAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7ICAgLyogJ0lubGluZScgZmFpbHVyZSBvZiB3YXl3YXJkIHJlYWRlcnMgKi8KI2VuZGlmCiNpZmRlZiBTSUdYRlNaCiAgICBzaWduYWwoU0lHWEZTWiwgU25tcGRDYXRjaFJhbmRvbVNpZ25hbCk7CiNlbmRpZgoKI2lmZGVmIE5FVFNOTVBfTk9fUk9PVF9BQ0NFU1MKICAgIC8qCiAgICAgKiBEZWZhdWx0IHRvIG5vLiAgCiAgICAgKi8KICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfTk9fUk9PVF9BQ0NFU1MsIDEpOwojZW5kaWYKICAgIC8qCiAgICAgKiBEZWZhdWx0IHRvIE5PVCBydW5uaW5nIGFuIEFnZW50WCBtYXN0ZXIuICAKICAgICAqLwogICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJICAgTkVUU05NUF9EU19BR0VOVF9BR0VOVFhfTUFTVEVSLCAwKTsKICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfQUdFTlRYX1RJTUVPVVQsIC0xKTsKICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELAogICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfQUdFTlRfQUdFTlRYX1JFVFJJRVMsIC0xKTsKCiAgICBuZXRzbm1wX2RzX3NldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwKICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX0NBQ0hFX1RJTUVPVVQsIDUpOwogICAgLyoKICAgICAqIEFkZCBzb21lIG9wdGlvbnMgaWYgdGhleSBhcmUgYXZhaWxhYmxlLiAgCiAgICAgKi8KI2lmIEhBVkVfVU5JU1REX0gKICAgIHN0cmNhdChvcHRpb25zLCAiZzp1OiIpOwojZW5kaWYKI2lmIGRlZmluZWQoVVNJTkdfQUdFTlRYX1NVQkFHRU5UX01PRFVMRSl8fCBkZWZpbmVkKFVTSU5HX0FHRU5UWF9NQVNURVJfTU9EVUxFKQogICAgc3RyY2F0KG9wdGlvbnMsICJ4OiIpOwojZW5kaWYKI2lmZGVmIFVTSU5HX0FHRU5UWF9TVUJBR0VOVF9NT0RVTEUKICAgIHN0cmNhdChvcHRpb25zLCAiWCIpOwojZW5kaWYKCiAgICAvKgogICAgICogVGhpcyBpcyBpbmNyZWRpYmx5IHVnbHksIGJ1dCBpdCdzIHByb2JhYmx5IHRoZSBzaW1wbGVzdCB3YXkKICAgICAqICB0byBoYW5kbGUgdGhlIG9sZCAnLUwnIG9wdGlvbiBhcyB3ZWxsIGFzIHRoZSBuZXcgJy1MeCcgc3R5bGUKICAgICAqLwogICAgZm9yIChpPTA7IGk8YXJnYzsgaSsrKSB7CiAgICAgICAgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1MIikpCiAgICAgICAgICAgIGFyZ3ZbaV0gPSBvcHRpb25fY29tcGF0YWJpbGl0eTsgICAgICAgICAgICAKICAgIH0KCiNpZmRlZiBXSU4zMgogICAgc25tcF9sb2dfc3lzbG9nbmFtZShhcHBfbmFtZV9sb25nKTsKI2Vsc2UKICAgIHNubXBfbG9nX3N5c2xvZ25hbWUoYXBwX25hbWUpOwojZW5kaWYKICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfQVBQVFlQRSwgYXBwX25hbWUpOwoKICAgIC8qCiAgICAgKiBOb3cgcHJvY2VzcyBvcHRpb25zIG5vcm1hbGx5LiAgCiAgICAgKi8KICAgIHdoaWxlICgoYXJnID0gZ2V0b3B0KGFyZ2MsIGFyZ3YsIG9wdGlvbnMpKSAhPSBFT0YpIHsKICAgICAgICBzd2l0Y2ggKGFyZykgewogICAgICAgIGNhc2UgJy0nOgogICAgICAgICAgICBpZiAoc3RyY2FzZWNtcChvcHRhcmcsICJoZWxwIikgPT0gMCkgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN0cmNhc2VjbXAob3B0YXJnLCAidmVyc2lvbiIpID09IDApIHsKICAgICAgICAgICAgICAgIHZlcnNpb24oKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaGFuZGxlX2xvbmdfb3B0KG9wdGFyZyk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgbG9nX2FkZHJlc3NlcysrOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnQSc6CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUEVORF9MT0dGSUxFUywgMSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9zdHJpbmcoTkVUU05NUF9EU19MSUJSQVJZX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfTElCX09QVElPTkFMQ09ORklHLCBvcHRhcmcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ0MnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfTElCUkFSWV9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0xJQl9ET05UX1JFQURfQ09ORklHUywgMSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgc25tcF9zZXRfZHVtcF9wYWNrZXQoKytzbm1wX2R1bXBfcGFja2V0KTsKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfVkVSQk9TRSwgMSk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdEJzoKICAgICAgICAgICAgZGVidWdfcmVnaXN0ZXJfdG9rZW5zKG9wdGFyZyk7CiAgICAgICAgICAgIHNubXBfc2V0X2RvX2RlYnVnZ2luZygxKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ2YnOgogICAgICAgICAgICBkb250X2ZvcmsgPSAxOwogICAgICAgICAgICBicmVhazsKCiNpZiBIQVZFX1VOSVNURF9ICiAgICAgICAgY2FzZSAnZyc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgY2hhciAgICAgICAgICAgKmVjcDsKICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICBnaWQ7CgogICAgICAgICAgICAgICAgZ2lkID0gc3RydG91bChvcHRhcmcsICZlY3AsIDEwKTsKICAgICAgICAgICAgICAgIGlmICgqZWNwKSB7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0gKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3JvdXAgICppbmZvOwogICAgICAgICAgICAgICAgICAgIGluZm8gPSBnZXRncm5hbShvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdpZCA9IGluZm8tPmdyX2dpZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJCYWQgZ3JvdXAgaWQ6ICVzXG4iLCBvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwojaWYgSEFWRV9HRVRQV05BTSAmJiBIQVZFX1BXRF9ICiAgICAgICAgICAgICAgICAgICAgfQojZW5kaWYKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2ludChORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfR1JPVVBJRCwgZ2lkKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwojZW5kaWYKCiAgICAgICAgY2FzZSAnaCc6CiAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgIGRvX2hlbHAgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnSSc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgYWRkX3RvX2luaXRfbGlzdChvcHRhcmcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ2wnOgogICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IC1sIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgLUxmIDxmaWxlPiBpbnN0ZWFkXG4iKTsKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBpZiAoc3RybGVuKG9wdGFyZykgPiBQQVRIX01BWCkgewogICAgICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBsb2dmaWxlIHBhdGggdG9vIGxvbmcgKGxpbWl0ICVkIGNoYXJzKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbMF0sIFBBVEhfTUFYKTsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc25tcF9lbmFibGVfZmlsZWxvZyhvcHRhcmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5FVFNOTVBfRFNfTElCX0FQUEVORF9MT0dGSUxFUykpOwogICAgICAgICAgICAgICAgbG9nX3NldCA9IDE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnTCc6CgkgICAgaWYgIChzbm1wX2xvZ19vcHRpb25zKCBvcHRhcmcsIGFyZ2MsIGFyZ3YgKSA8IDAgKSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb2dfc2V0ID0gMTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ20nOgogICAgICAgICAgICBpZiAob3B0YXJnICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgIHNldGVudigiTUlCUyIsIG9wdGFyZywgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnTSc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgc2V0ZW52KCJNSUJESVJTIiwgb3B0YXJnLCAxKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICduJzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBhcHBfbmFtZSA9IG9wdGFyZzsKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0xJQlJBUllfSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19MSUJfQVBQVFlQRSwgYXBwX25hbWUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ1AnOgogICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IC1QIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgLXAgaW5zdGVhZFxuIik7CiAgICAgICAgY2FzZSAncCc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgcGlkX2ZpbGUgPSBvcHRhcmc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAncSc6CiAgICAgICAgICAgIHNubXBfc2V0X3F1aWNrX3ByaW50KDEpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAncic6CiAgICAgICAgICAgIG5ldHNubXBfZHNfdG9nZ2xlX2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICAgICBORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTKTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICBwcmludGYoIldhcm5pbmc6IC1zIG9wdGlvbiBpcyBkZXByZWNhdGVkLCB1c2UgLUxzZCBpbnN0ZWFkXG4iKTsKICAgICAgICAgICAgc25tcF9lbmFibGVfc3lzbG9nKCk7CiAgICAgICAgICAgIGxvZ19zZXQgPSAxOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgIHByaW50ZigiV2FybmluZzogLVMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQsIHVzZSAtTHMgPGZhY2lsaXR5PiBpbnN0ZWFkXG4iKTsKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKCpvcHRhcmcpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgY2FzZSAnRCc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfREFFTU9OOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnaSc6CiAgICAgICAgICAgICAgICBjYXNlICdJJzoKICAgICAgICAgICAgICAgICAgICBGYWNpbGl0eSA9IExPR19JTkZPOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnMCc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUwwOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnMSc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUwxOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnMic6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUwyOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnMyc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUwzOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnNCc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUw0OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnNSc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUw1OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnNic6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUw2OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnNyc6CiAgICAgICAgICAgICAgICAgICAgRmFjaWxpdHkgPSBMT0dfTE9DQUw3OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgc3lzbG9nIGZhY2lsaXR5OiAtUyVjXG4iLCpvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc25tcF9lbmFibGVfc3lzbG9nX2lkZW50KHNubXBfbG9nX3N5c2xvZ25hbWUoTlVMTCksIEZhY2lsaXR5KTsKICAgICAgICAgICAgICAgIGxvZ19zZXQgPSAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJubyBzeXNsb2cgZmFjaWxpdHkgc3BlY2lmaWVkXG4iKTsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlICdVJzoKICAgICAgICAgICAgbmV0c25tcF9kc190b2dnbGVfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfQUdFTlRfTEVBVkVfUElERklMRSk7CiAgICAgICAgICAgIGJyZWFrOwoKI2lmIEhBVkVfVU5JU1REX0gKICAgICAgICBjYXNlICd1JzoKICAgICAgICAgICAgaWYgKG9wdGFyZyAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICBjaGFyICAgICAgICAgICAqZWNwOwogICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgIHVpZDsKCiAgICAgICAgICAgICAgICB1aWQgPSBzdHJ0b3VsKG9wdGFyZywgJmVjcCwgMTApOwogICAgICAgICAgICAgICAgaWYgKCplY3ApIHsKI2lmIEhBVkVfR0VUUFdOQU0gJiYgSEFWRV9QV0RfSAogICAgICAgICAgICAgICAgICAgIHN0cnVjdCBwYXNzd2QgICppbmZvOwogICAgICAgICAgICAgICAgICAgIGluZm8gPSBnZXRwd25hbShvcHRhcmcpOwogICAgICAgICAgICAgICAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVpZCA9IGluZm8tPnB3X3VpZDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJCYWQgdXNlciBpZDogJXNcbiIsIG9wdGFyZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CiNpZiBIQVZFX0dFVFBXTkFNICYmIEhBVkVfUFdEX0gKICAgICAgICAgICAgICAgICAgICB9CiNlbmRpZgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9VU0VSSUQsIHVpZCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB1c2FnZShhcmd2WzBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKI2VuZGlmCgogICAgICAgIGNhc2UgJ3YnOgogICAgICAgICAgICB2ZXJzaW9uKCk7CgogICAgICAgIGNhc2UgJ1YnOgogICAgICAgICAgICBuZXRzbm1wX2RzX3NldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgTkVUU05NUF9EU19BR0VOVF9WRVJCT1NFLCAxKTsKICAgICAgICAgICAgYnJlYWs7CgojaWYgZGVmaW5lZChVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFKXx8IGRlZmluZWQoVVNJTkdfQUdFTlRYX01BU1RFUl9NT0RVTEUpCiAgICAgICAgY2FzZSAneCc6CiAgICAgICAgICAgIGlmIChvcHRhcmcgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgTkVUU05NUF9EU19BR0VOVF9YX1NPQ0tFVCwgb3B0YXJnKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX0FHRU5UWF9NQVNURVIsIDEpOwogICAgICAgICAgICBicmVhazsKI2VuZGlmCgogICAgICAgIGNhc2UgJ1gnOgojaWYgZGVmaW5lZChVU0lOR19BR0VOVFhfU1VCQUdFTlRfTU9EVUxFKQogICAgICAgICAgICBhZ2VudF9tb2RlID0gU1VCX0FHRU5UOwojZWxzZQogICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzOiBJbGxlZ2FsIGFyZ3VtZW50IC1YOiIKCQkgICAgICAgICAgICAiQWdlbnRYIHN1cHBvcnQgbm90IGNvbXBpbGVkIGluLlxuIiwgYXJndlswXSk7CiAgICAgICAgICAgIHVzYWdlKGFyZ3ZbMF0pOwogICAgICAgICAgICBleGl0KDEpOwojZW5kaWYKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgJ1knOgogICAgICAgICAgICBuZXRzbm1wX2NvbmZpZ19yZW1lbWJlcihvcHRhcmcpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KCiAgICBpZiAoZG9faGVscCkgewogICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX05PX1JPT1RfQUNDRVNTLCAxKTsKICAgICAgICBpbml0X2FnZW50KGFwcF9uYW1lKTsgICAgICAgIC8qIHJlZ2lzdGVyIG91ciAuY29uZiBoYW5kbGVycyAqLwogICAgICAgIGluaXRfbWliX21vZHVsZXMoKTsKICAgICAgICBpbml0X3NubXAoYXBwX25hbWUpOwogICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ29uZmlndXJhdGlvbiBkaXJlY3RpdmVzIHVuZGVyc3Rvb2Q6XG4iKTsKICAgICAgICByZWFkX2NvbmZpZ19wcmludF91c2FnZSgiICAiKTsKICAgICAgICBleGl0KDApOwogICAgfQoKICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CiAgICAgICAgLyoKICAgICAgICAgKiBUaGVyZSBhcmUgb3B0aW9uYWwgdHJhbnNwb3J0IGFkZHJlc3NlcyBvbiB0aGUgY29tbWFuZCBsaW5lLiAgCiAgICAgICAgICovCiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAib3B0aW5kICVkLCBhcmdjICVkXG4iLCBvcHRpbmQsIGFyZ2MpKTsKICAgICAgICBmb3IgKGkgPSBvcHRpbmQ7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICAgICAgY2hhciAqYywgKmFzdHJpbmc7CiAgICAgICAgICAgIGlmICgoYyA9IG5ldHNubXBfZHNfZ2V0X3N0cmluZyhORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCQkgICBORVRTTk1QX0RTX0FHRU5UX1BPUlRTKSkpIHsKICAgICAgICAgICAgICAgIGFzdHJpbmcgPSBtYWxsb2Moc3RybGVuKGMpICsgMiArIHN0cmxlbihhcmd2W2ldKSk7CiAgICAgICAgICAgICAgICBpZiAoYXN0cmluZyA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJtYWxsb2MgZmFpbHVyZSBwcm9jZXNzaW5nIGFyZ3ZbJWRdXG4iLCBpKTsKICAgICAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3ByaW50Zihhc3RyaW5nLCAiJXMsJXMiLCBjLCBhcmd2W2ldKTsKICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X3N0cmluZyhORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgICAgIE5FVFNOTVBfRFNfQUdFTlRfUE9SVFMsIGFzdHJpbmcpOwogICAgICAgICAgICAgICAgU05NUF9GUkVFKGFzdHJpbmcpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfc3RyaW5nKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICAgICAgTkVUU05NUF9EU19BR0VOVF9QT1JUUywgYXJndltpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAicG9ydCBzcGVjOiAlc1xuIiwKICAgICAgICAgICAgICAgICAgICBuZXRzbm1wX2RzX2dldF9zdHJpbmcoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkJICBORVRTTk1QX0RTX0FHRU5UX1BPUlRTKSkpOwogICAgfQoKI2lmZGVmIE5FVFNOTVBfTE9HRklMRQogICAgaWYgKDAgPT0gbG9nX3NldCkKICAgICAgICBzbm1wX2VuYWJsZV9maWxlbG9nKE5FVFNOTVBfTE9HRklMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19MSUJSQVJZX0lELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0xJQl9BUFBFTkRfTE9HRklMRVMpKTsKI2VuZGlmCgogICAgLyoKICAgICAqIEluaXRpYWxpemUgYSBhcmd2IHNldCB0byB0aGUgY3VycmVudCBmb3IgcmVzdGFydGluZyB0aGUgYWdlbnQuICAgCiAgICAgKi8KICAgIGFyZ3ZyZXN0YXJ0cCA9IChjaGFyICoqKW1hbGxvYygoYXJnYyArIDIpICogc2l6ZW9mKGNoYXIgKikpOwogICAgYXJndnB0ciA9IGFyZ3ZyZXN0YXJ0cDsKICAgIGZvciAoaSA9IDAsIHJldCA9IDE7IGkgPCBhcmdjOyBpKyspIHsKICAgICAgICByZXQgKz0gc3RybGVuKGFyZ3ZbaV0pICsgMTsKICAgIH0KICAgIGFyZ3ZyZXN0YXJ0ID0gKGNoYXIgKikgbWFsbG9jKHJldCk7CiAgICBhcmd2cmVzdGFydG5hbWUgPSAoY2hhciAqKSBtYWxsb2Moc3RybGVuKGFyZ3ZbMF0pICsgMSk7CiAgICBpZiAoIWFyZ3ZyZXN0YXJ0cCB8fCAhYXJndnJlc3RhcnQgfHwgIWFyZ3ZyZXN0YXJ0bmFtZSkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAibWFsbG9jIGZhaWx1cmUgcHJvY2Vzc2luZyBhcmd2cmVzdGFydFxuIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIHN0cmNweShhcmd2cmVzdGFydG5hbWUsIGFyZ3ZbMF0pOwogICAgaWYgKGFnZW50X21vZGUgPT0gLTEpIHsKICAgICAgICBpZiAoc3Ryc3RyKGFyZ3ZyZXN0YXJ0bmFtZSwgImFnZW50eGQiKSAhPSBOVUxMKSB7CiAgICAgICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUsIFNVQl9BR0VOVCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV0c25tcF9kc19zZXRfYm9vbGVhbihORVRTTk1QX0RTX0FQUExJQ0FUSU9OX0lELCAKCQkJCSAgIE5FVFNOTVBfRFNfQUdFTlRfUk9MRSwgTUFTVEVSX0FHRU5UKTsKICAgICAgICB9CiAgICB9IGVsc2UgewogICAgICAgIG5ldHNubXBfZHNfc2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgICAgICBORVRTTk1QX0RTX0FHRU5UX1JPTEUsIGFnZW50X21vZGUpOwogICAgfQoKICAgIGZvciAoY3B0ciA9IGFyZ3ZyZXN0YXJ0LCBpID0gMDsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgIHN0cmNweShjcHRyLCBhcmd2W2ldKTsKICAgICAgICAqKGFyZ3ZwdHIrKykgPSBjcHRyOwogICAgICAgIGNwdHIgKz0gc3RybGVuKGFyZ3ZbaV0pICsgMTsKICAgIH0KICAgICpjcHRyID0gMDsKICAgICphcmd2cHRyID0gTlVMTDsKCiNpZmRlZiBCVUZTSVoKICAgIHNldHZidWYoc3Rkb3V0LCBOVUxMLCBfSU9MQkYsIEJVRlNJWik7CiNlbmRpZgogICAgLyoKICAgICAqIEluaXRpYWxpemUgdGhlIHdvcmxkLiAgRGV0YWNoIGZyb20gdGhlIHNoZWxsLiAgQ3JlYXRlIGluaXRpYWwgdXNlci4gIAogICAgICovCiAgICBpZighZG9udF9mb3JrKSB7CiAgICAgICAgaW50IHF1aXQgPSAhIG5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBORVRTTk1QX0RTX0FHRU5UX1FVSVRfSU1NRURJQVRFTFkpOwogICAgICAgIHJldCA9IG5ldHNubXBfZGFlbW9uaXplKHF1aXQsIHNubXBfc3RkZXJybG9nX3N0YXR1cygpKTsKICAgICAgICAvKgogICAgICAgICAqIHh4eC1ya3M6IGRvIHdlIGNhcmUgaWYgZm9yayBmYWlscz8gSSB0aGluayB3ZSBzaG91bGQuLi4KICAgICAgICAgKi8KICAgICAgICBpZihyZXQgIT0gMCkKICAgICAgICAgICAgRXhpdCgxKTsgICAgICAgICAgICAgICAgLyogIEV4aXQgbG9ncyBleGl0IHZhbCBmb3IgdXMgICovCiAgICB9CgogICAgU09DS19TVEFSVFVQOwogICAgaWYgKGluaXRfYWdlbnQoYXBwX25hbWUpICE9IDApIHsKICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAiQWdlbnQgaW5pdGlhbGl6YXRpb24gZmFpbGVkXG4iKTsKICAgICAgICBleGl0KDEpOwogICAgfQogICAgaW5pdF9taWJfbW9kdWxlcygpOwoKICAgIC8qCiAgICAgKiBzdGFydCBsaWJyYXJ5IAogICAgICovCiAgICBpbml0X3NubXAoYXBwX25hbWUpOwoKICAgIGlmICgocmV0ID0gaW5pdF9tYXN0ZXJfYWdlbnQoKSkgIT0gMCkgewogICAgICAgIC8qCiAgICAgICAgICogU29tZSBlcnJvciBvcGVuaW5nIG9uZSBvZiB0aGUgc3BlY2lmaWVkIGFnZW50IHRyYW5zcG9ydHMuICAKICAgICAgICAgKi8KICAgICAgICBFeGl0KDEpOyAgICAgICAgICAgICAgICAvKiAgRXhpdCBsb2dzIGV4aXQgdmFsIGZvciB1cyAgKi8KICAgIH0KCiNpZiBIQVZFX0dFVFBJRAogICAgaWYgKHBpZF9maWxlICE9IE5VTEwpIHsKICAgICAgICAvKgogICAgICAgICAqIHVubGluayB0aGUgcGlkX2ZpbGUsIGlmIGl0IGV4aXN0cywgcHJpb3IgdG8gb3Blbi4gIFdpdGhvdXQKICAgICAgICAgKiBkb2luZyB0aGlzIHRoZSBvcGVuIHdpbGwgZmFpbCBpZiB0aGUgdXNlciBzcGVjaWZpZWQgcGlkX2ZpbGUKICAgICAgICAgKiBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgKi8KICAgICAgICB1bmxpbmsocGlkX2ZpbGUpOwogICAgICAgIGZkID0gb3BlbihwaWRfZmlsZSwgT19DUkVBVCB8IE9fRVhDTCB8IE9fV1JPTkxZLCAwNjAwKTsKICAgICAgICBpZiAoZmQgPT0gLTEpIHsKICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKHBpZF9maWxlKTsKICAgICAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUykpIHsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoKFBJRCA9IGZkb3BlbihmZCwgInciKSkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgc25tcF9sb2dfcGVycm9yKHBpZF9maWxlKTsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKFBJRCwgIiVkXG4iLCAoaW50KSBnZXRwaWQoKSk7CiAgICAgICAgICAgICAgICBmY2xvc2UoUElEKTsKICAgICAgICAgICAgfQojaWZuZGVmIF9NU0NfVkVSCiAgICAgICAgICAgIC8qIFRoZSBzZXF1ZW5jZSBvcGVuKCkvZmRvcGVuKCkvZmNsb3NlKCkvY2xvc2UoKSBtYWtlcyBNU1ZDIGNyYXNoLAogICAgICAgICAgICAgICBoZW5jZSBza2lwIHRoZSBjbG9zZSgpIGNhbGwgd2hlbiB1c2luZyB0aGUgTVNWQyBydW50aW1lLiAqLwogICAgICAgICAgICBjbG9zZShmZCk7CiNlbmRpZgogICAgICAgIH0KICAgIH0KI2VuZGlmCgojaWYgSEFWRV9VTklTVERfSAogICAgewogICAgY29uc3QgY2hhciAqY29uc3QgcGVyc2lzdGVudF9kaXIgPSBnZXRfcGVyc2lzdGVudF9kaXJlY3RvcnkoKTsKICAgIG1rZGlyaGllciggcGVyc2lzdGVudF9kaXIsIE5FVFNOTVBfQUdFTlRfRElSRUNUT1JZX01PREUsIDAgKTsKCiAgICB1aWQgPSBuZXRzbm1wX2RzX2dldF9pbnQoTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCSAgICAgTkVUU05NUF9EU19BR0VOVF9VU0VSSUQpOwogICAgZ2lkID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkgICAgIE5FVFNOTVBfRFNfQUdFTlRfR1JPVVBJRCk7CiAgICAKI2lmZGVmIEhBVkVfQ0hPV04KICAgIGlmICggdWlkICE9IDAgfHwgZ2lkICE9IDAgKQogICAgICAgIGNob3duKCBwZXJzaXN0ZW50X2RpciwgdWlkLCBnaWQgKTsKI2VuZGlmCiAgICB9CgojaWZkZWYgSEFWRV9TRVRHSUQKICAgIGlmICgoZ2lkID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICBORVRTTk1QX0RTX0FHRU5UX0dST1VQSUQpKSA+IDApIHsKICAgICAgICBERUJVR01TR1RMKCgic25tcGQvbWFpbiIsICJDaGFuZ2luZyBnaWQgdG8gJWQuXG4iLCBnaWQpKTsKICAgICAgICBpZiAoc2V0Z2lkKGdpZCkgPT0gLTEKI2lmZGVmIEhBVkVfU0VUR1JPVVBTCiAgICAgICAgICAgIHx8IHNldGdyb3VwcygxLCAoZ2lkX3QgKikmZ2lkKSA9PSAtMQojZW5kaWYKICAgICAgICAgICAgKSB7CiAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigic2V0Z2lkIGZhaWxlZCIpOwogICAgICAgICAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQkJTkVUU05NUF9EU19BR0VOVF9OT19ST09UX0FDQ0VTUykpIHsKICAgICAgICAgICAgICAgIGV4aXQoMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiNlbmRpZgojaWZkZWYgSEFWRV9TRVRVSUQKICAgIGlmICgodWlkID0gbmV0c25tcF9kc19nZXRfaW50KE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJICBORVRTTk1QX0RTX0FHRU5UX1VTRVJJRCkpID4gMCkgewogICAgICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgIkNoYW5naW5nIHVpZCB0byAlZC5cbiIsIHVpZCkpOwogICAgICAgIGlmIChzZXR1aWQodWlkKSA9PSAtMSkgewogICAgICAgICAgICBzbm1wX2xvZ19wZXJyb3IoInNldHVpZCBmYWlsZWQiKTsKICAgICAgICAgICAgaWYgKCFuZXRzbm1wX2RzX2dldF9ib29sZWFuKE5FVFNOTVBfRFNfQVBQTElDQVRJT05fSUQsIAoJCQkJCU5FVFNOTVBfRFNfQUdFTlRfTk9fUk9PVF9BQ0NFU1MpKSB7CiAgICAgICAgICAgICAgICBleGl0KDEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQojZW5kaWYKI2VuZGlmCgogICAgLyoKICAgICAqIFN0b3JlIHBlcnNpc3RlbnQgZGF0YSBpbW1lZGlhdGVseSBpbiBjYXNlIHdlIGNyYXNoIGxhdGVyLiAgCiAgICAgKi8KICAgIHNubXBfc3RvcmUoYXBwX25hbWUpOwoKI2lmZGVmIFNJR0hVUAogICAgREVCVUdNU0dUTCgoInNpZ25hbCIsICJyZWdpc3RlcmluZyBTSUdIVVAgc2lnbmFsIGhhbmRsZXJcbiIpKTsKICAgIHNpZ25hbChTSUdIVVAsIFNubXBkUmVjb25maWcpOwojZW5kaWYKCiAgICAvKgogICAgICogU2VuZCBjb2xkc3RhcnQgdHJhcCBpZiBwb3NzaWJsZS4gIAogICAgICovCiAgICBzZW5kX2Vhc3lfdHJhcCgwLCAwKTsKCiAgICAvKgogICAgICogV2UncmUgdXAsIGxvZyBvdXIgdmVyc2lvbiBudW1iZXIuICAKICAgICAqLwogICAgc25tcF9sb2coTE9HX0lORk8sICJORVQtU05NUCB2ZXJzaW9uICVzXG4iLCBuZXRzbm1wX2dldF92ZXJzaW9uKCkpOwojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBhZ2VudF9zdGF0dXMgPSBBR0VOVF9SVU5OSU5HOwojZW5kaWYKICAgIG5ldHNubXBfYWRkcmNhY2hlX2luaXRpYWxpc2UoKTsKCiAgICAvKgogICAgICogRm9yZXZlciBtb25pdG9yIHRoZSBkZXN0X3BvcnQgZm9yIGluY29taW5nIFBEVXMuICAKICAgICAqLwogICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAiV2UncmUgdXAuICBTdGFydGluZyB0byBwcm9jZXNzIGRhdGEuXG4iKSk7CiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQlORVRTTk1QX0RTX0FHRU5UX1FVSVRfSU1NRURJQVRFTFkpKQogICAgICAgIHJlY2VpdmUoKTsKICAgIERFQlVHTVNHVEwoKCJzbm1wZC9tYWluIiwgInNlbmRpbmcgc2h1dGRvd24gdHJhcFxuIikpOwogICAgU25tcFRyYXBOb2RlRG93bigpOwogICAgREVCVUdNU0dUTCgoInNubXBkL21haW4iLCAiQnllLi4uXG4iKSk7CiAgICBzbm1wX3NodXRkb3duKGFwcF9uYW1lKTsKICAgIHNodXRkb3duX21hc3Rlcl9hZ2VudCgpOwogICAgc2h1dGRvd25fYWdlbnQoKTsKCiAgICBpZiAoIW5ldHNubXBfZHNfZ2V0X2Jvb2xlYW4oTkVUU05NUF9EU19BUFBMSUNBVElPTl9JRCwgCgkJCQlORVRTTk1QX0RTX0FHRU5UX0xFQVZFX1BJREZJTEUpICYmCgkocGlkX2ZpbGUgIT0gTlVMTCkpIHsKICAgICAgICB1bmxpbmsocGlkX2ZpbGUpOwogICAgfQojaWZkZWYgV0lOMzJTRVJWSUNFCiAgICBhZ2VudF9zdGF0dXMgPSBBR0VOVF9TVE9QUEVEOwojZW5kaWYKCiAgICBTTk1QX0ZSRUUoYXJndnJlc3RhcnRuYW1lKTsKICAgIFNOTVBfRlJFRShhcmd2cmVzdGFydCk7CiAgICBTTk1QX0ZSRUUoYXJndnJlc3RhcnRwKTsKICAgIFNPQ0tfQ0xFQU5VUDsKICAgIHJldHVybiAwOwp9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEVuZCBtYWluKCkgLS0gc25tcGQgKi8KCiNpZiBkZWZpbmVkKFdJTjMyKQoKI2luY2x1ZGUgPHByb2Nlc3MuaD4KI2luY2x1ZGUgPG5ldC1zbm1wL2xpYnJhcnkvc25tcF9hc3NlcnQuaD4KCnN0YXRpYyB1bnNpZ25lZCBzX3RocmVhZGlkOwpIQU5ETEUgc190aHJlYWRfaGFuZGxlOwoKc3RhdGljIHVuc2lnbmVkIF9fc3RkY2FsbCB3YWl0X2Zvcl9zdGRpbih2b2lkKiBhcmcpCnsKICAgIGlmIChnZXRjKHN0ZGluKSAhPSBFT0YpCiAgICAgICAgbmV0c25tcF9ydW5uaW5nID0gMDsKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgdm9pZCBjcmVhdGVfc3RkaW5fd2FpdGVyX3RocmVhZCh2b2lkKQp7CiAgICBuZXRzbm1wX2Fzc2VydChzX3RocmVhZF9oYW5kbGUgPT0gMCk7CiAgICBzX3RocmVhZF9oYW5kbGUgPSAoSEFORExFKV9iZWdpbnRocmVhZGV4KDAsIDAsIHdhaXRfZm9yX3N0ZGluLCAwLCAwLCAmc190aHJlYWRpZCk7CiAgICBuZXRzbm1wX2Fzc2VydChzX3RocmVhZF9oYW5kbGUgIT0gMCk7Cn0KCnN0YXRpYyB2b2lkIGpvaW5fc3RkaW5fd2FpdGVyX3RocmVhZCh2b2lkKQp7CiAgICBpbnQgcmVzdWx0OwoKICAgIG5ldHNubXBfYXNzZXJ0KHNfdGhyZWFkX2hhbmRsZSAhPSAwKTsKICAgIHJlc3VsdCA9IFdhaXRGb3JTaW5nbGVPYmplY3Qoc190aHJlYWRfaGFuZGxlLCAxMDAwKTsKICAgIG5ldHNubXBfYXNzZXJ0KHJlc3VsdCAhPSBXQUlUX1RJTUVPVVQpOwogICAgQ2xvc2VIYW5kbGUoc190aHJlYWRfaGFuZGxlKTsKICAgIHNfdGhyZWFkX2hhbmRsZSA9IDA7Cn0KI2VuZGlmCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi1vLSoqKioqKgogKiByZWNlaXZlCiAqCiAqIFBhcmFtZXRlcnM6CiAqICAgICAgCiAqIFJldHVybnM6CiAqCTAJT24gc3VjY2Vzcy4KICoJLTEJU3lzdGVtIGVycm9yLgogKgogKiBJbmZpbml0ZSB3aGlsZS1sb29wIHdoaWNoIG1vbml0b3JzIGluY29taW5nIG1lc3NnZXMgZm9yIHRoZSBhZ2VudC4KICogSW52b2tlIHRoZSBlc3RhYmxpc2hlZCBtZXNzYWdlIGhhbmRsZXJzIGZvciBpbmNvbWluZyBtZXNzYWdlcyBvbiBhIHBlcgogKiBwb3J0IGJhc2lzLiAgSGFuZGxlIHRpbWVvdXRzLgogKi8Kc3RhdGljIGludApyZWNlaXZlKHZvaWQpCnsKICAgIGludCAgICAgICAgICAgICBudW1mZHM7CiAgICBmZF9zZXQgICAgICAgICAgcmVhZGZkcywgd3JpdGVmZHMsIGV4Y2VwdGZkczsKICAgIHN0cnVjdCB0aW1ldmFsICB0aW1lb3V0LCAqdHZwID0gJnRpbWVvdXQ7CiAgICBpbnQgICAgICAgICAgICAgY291bnQsIGJsb2NrLCBpOwojaWZkZWYJVVNJTkdfU01VWF9NT0RVTEUKICAgIGludCAgICAgICAgICAgICBzZDsKI2VuZGlmICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVU0lOR19TTVVYX01PRFVMRSAqLwoKICAgIC8qCiAgICAgKiBpZ25vcmUgZWFybHkgc2lnaHVwIGR1cmluZyBzdGFydHVwCiAgICAgKi8KICAgIHJlY29uZmlnID0gMDsKCiNpZiBkZWZpbmVkKFdJTjMyKQogICAgY3JlYXRlX3N0ZGluX3dhaXRlcl90aHJlYWQoKTsKI2VuZGlmCgogICAgLyoKICAgICAqIExvb3AtZm9yZXZlcjogZXhlY3V0ZSBtZXNzYWdlIGhhbmRsZXJzIGZvciBzb2NrZXRzIHdpdGggZGF0YQogICAgICovCiAgICB3aGlsZSAobmV0c25tcF9ydW5uaW5nKSB7CiAgICAgICAgaWYgKHJlY29uZmlnKSB7CiNpZiBIQVZFX1NJR0hPTEQKICAgICAgICAgICAgc2lnaG9sZChTSUdIVVApOwojZW5kaWYKICAgICAgICAgICAgcmVjb25maWcgPSAwOwogICAgICAgICAgICBzbm1wX2xvZyhMT0dfSU5GTywgIlJlY29uZmlndXJpbmcgZGFlbW9uXG4iKTsKCSAgICAvKiAgU3RvcCBhbmQgcmVzdGFydCBsb2dnaW5nLiAgVGhpcyBhbGxvd3MgbG9nZmlsZXMgdG8gYmUKCQlyb3RhdGVkIGV0Yy4gICovCgkgICAgbmV0c25tcF9sb2dnaW5nX3Jlc3RhcnQoKTsKCSAgICBzbm1wX2xvZyhMT0dfSU5GTywgIk5FVC1TTk1QIHZlcnNpb24gJXMgcmVzdGFydGVkXG4iLAoJCSAgICAgbmV0c25tcF9nZXRfdmVyc2lvbigpKTsKICAgICAgICAgICAgdXBkYXRlX2NvbmZpZygpOwogICAgICAgICAgICBzZW5kX2Vhc3lfdHJhcChTTk1QX1RSQVBfRU5URVJQUklTRVNQRUNJRklDLCAzKTsKI2lmIEhBVkVfU0lHSE9MRAogICAgICAgICAgICBzaWdyZWxzZShTSUdIVVApOwojZW5kaWYKICAgICAgICB9CgogICAgICAgIC8qCiAgICAgICAgICogZGVmYXVsdCB0byBzbGVlcGluZyBmb3IgYSByZWFsbHkgbG9uZyB0aW1lLiBJTlRfTUFYCiAgICAgICAgICogc2hvdWxkIGJlIHN1ZmZpY2llbnQgKGVnIHdlIGRvbid0IGNhcmUgaWYgdGltZV90IGlzCiAgICAgICAgICogYSBsb25nIHRoYXQncyBiaWdnZXIgdGhhbiBhbiBpbnQpLgogICAgICAgICAqLwogICAgICAgIHR2cCA9ICZ0aW1lb3V0OwogICAgICAgIHR2cC0+dHZfc2VjID0gSU5UX01BWDsKICAgICAgICB0dnAtPnR2X3VzZWMgPSAwOwoKICAgICAgICBudW1mZHMgPSAwOwogICAgICAgIEZEX1pFUk8oJnJlYWRmZHMpOwogICAgICAgIEZEX1pFUk8oJndyaXRlZmRzKTsKICAgICAgICBGRF9aRVJPKCZleGNlcHRmZHMpOwogICAgICAgIGJsb2NrID0gMDsKICAgICAgICBzbm1wX3NlbGVjdF9pbmZvKCZudW1mZHMsICZyZWFkZmRzLCB0dnAsICZibG9jayk7CiAgICAgICAgaWYgKGJsb2NrID09IDEpIHsKICAgICAgICAgICAgdHZwID0gTlVMTDsgICAgICAgICAvKiBibG9jayB3aXRob3V0IHRpbWVvdXQgKi8KCX0KCiNpZmRlZglVU0lOR19TTVVYX01PRFVMRQogICAgICAgIGlmIChzbXV4X2xpc3Rlbl9zZCA+PSAwKSB7CiAgICAgICAgICAgIEZEX1NFVChzbXV4X2xpc3Rlbl9zZCwgJnJlYWRmZHMpOwogICAgICAgICAgICBudW1mZHMgPQogICAgICAgICAgICAgICAgc211eF9saXN0ZW5fc2QgPj0gbnVtZmRzID8gc211eF9saXN0ZW5fc2QgKyAxIDogbnVtZmRzOwoKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHNtdXhfc25tcF9zZWxlY3RfbGlzdF9nZXRfbGVuZ3RoKCk7IGkrKykgewogICAgICAgICAgICAgICAgc2QgPSBzbXV4X3NubXBfc2VsZWN0X2xpc3RfZ2V0X1NEX2Zyb21fTGlzdChpKTsKICAgICAgICAgICAgICAgIGlmIChzZCAhPSAwKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgRkRfU0VUKHNkLCAmcmVhZGZkcyk7CiAgICAgICAgICAgICAgICAgICBudW1mZHMgPSBzZCA+PSBudW1mZHMgPyBzZCArIDEgOiBudW1mZHM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVVNJTkdfU01VWF9NT0RVTEUgKi8KCiAgICAgICAgbmV0c25tcF9leHRlcm5hbF9ldmVudF9pbmZvKCZudW1mZHMsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMpOwoKICAgIHJlc2VsZWN0OgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fRVhURVJOQUxfU0lHUzsgaSsrKSB7CiAgICAgICAgICAgIGlmIChleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW2ldKSB7CiAgICAgICAgICAgICAgICBleHRlcm5hbF9zaWduYWxfc2NoZWR1bGVkW2ldLS07CiAgICAgICAgICAgICAgICBleHRlcm5hbF9zaWduYWxfaGFuZGxlcltpXShpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL3NlbGVjdCIsICJzZWxlY3QoIG51bWZkcz0lZCwgLi4uLCB0dnA9JXApXG4iLAogICAgICAgICAgICAgICAgICAgIG51bWZkcywgdHZwKSk7CiAgICAgICAgaWYodHZwKQogICAgICAgICAgICBERUJVR01TR1RMKCgidGltZXIiLCAidHZwICVsZC4lbGRcbiIsIHR2cC0+dHZfc2VjLCB0dnAtPnR2X3VzZWMpKTsKICAgICAgICBjb3VudCA9IHNlbGVjdChudW1mZHMsICZyZWFkZmRzLCAmd3JpdGVmZHMsICZleGNlcHRmZHMsIHR2cCk7CiAgICAgICAgREVCVUdNU0dUTCgoInNubXBkL3NlbGVjdCIsICJyZXR1cm5lZCwgY291bnQgPSAlZFxuIiwgY291bnQpKTsKCiAgICAgICAgaWYgKGNvdW50ID4gMCkgewoKI2lmZGVmIFVTSU5HX1NNVVhfTU9EVUxFCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIGhhbmRsZSB0aGUgU01VWCBzZCdzIAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYgKHNtdXhfbGlzdGVuX3NkID49IDApIHsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzbXV4X3NubXBfc2VsZWN0X2xpc3RfZ2V0X2xlbmd0aCgpOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBzZCA9IHNtdXhfc25tcF9zZWxlY3RfbGlzdF9nZXRfU0RfZnJvbV9MaXN0KGkpOwogICAgICAgICAgICAgICAgICAgIGlmIChGRF9JU1NFVChzZCwgJnJlYWRmZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzbXV4X3Byb2Nlc3Moc2QpIDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc211eF9zbm1wX3NlbGVjdF9saXN0X2RlbChzZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogbmV3IGNvbm5lY3Rpb24gCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmIChGRF9JU1NFVChzbXV4X2xpc3Rlbl9zZCwgJnJlYWRmZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKChzZCA9IHNtdXhfYWNjZXB0KHNtdXhfbGlzdGVuX3NkKSkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBzbXV4X3NubXBfc2VsZWN0X2xpc3RfYWRkKHNkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiNlbmRpZiAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVVNJTkdfU01VWF9NT0RVTEUgKi8KICAgICAgICAgICAgbmV0c25tcF9kaXNwYXRjaF9leHRlcm5hbF9ldmVudHMoJmNvdW50LCAmcmVhZGZkcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ3cml0ZWZkcywgJmV4Y2VwdGZkcyk7CiAgICAgICAgICAgIC8qIElmIHRoZXJlIGFyZSBzdGlsbCBldmVudHMgbGVmdG92ZXIsIHByb2Nlc3MgdGhlbSAqLwogICAgICAgICAgICBpZiAoY291bnQgPiAwKSB7CiAgICAgICAgICAgICAgc25tcF9yZWFkKCZyZWFkZmRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZQogICAgICAgICAgICBzd2l0Y2ggKGNvdW50KSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHNubXBfdGltZW91dCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgLTE6CiAgICAgICAgICAgICAgICBERUJVR01TR1RMKCgic25tcGQvc2VsZWN0IiwgIiAgZXJybm8gPSAlZFxuIiwgZXJybm8pKTsKICAgICAgICAgICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgewogICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICogbGlrZWx5IHRoYXQgd2UgZ290IGEgc2lnbmFsLiBDaGVjayBvdXIgc3BlY2lhbCBzaWduYWwKICAgICAgICAgICAgICAgICAgICAgKiBmbGFncyBiZWZvcmUgcmV0cnlpbmcgc2VsZWN0LgogICAgICAgICAgICAgICAgICAgICAqLwoJCSAgICBpZiAobmV0c25tcF9ydW5uaW5nICYmICFyZWNvbmZpZykgewogICAgICAgICAgICAgICAgICAgICAgICBnb3RvIHJlc2VsZWN0OwoJCSAgICB9CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNubXBfbG9nX3BlcnJvcigic2VsZWN0Iik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBzbm1wX2xvZyhMT0dfRVJSLCAic2VsZWN0IHJldHVybmVkICVkXG4iLCBjb3VudCk7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgLyogZW5kaWYgLS0gY291bnQ+MCAqLwoKICAgICAgICAvKgogICAgICAgICAqIHJ1biByZXF1ZXN0ZWQgYWxhcm1zIAogICAgICAgICAqLwogICAgICAgIHJ1bl9hbGFybXMoKTsKCiAgICAgICAgbmV0c25tcF9jaGVja19vdXRzdGFuZGluZ19hZ2VudF9yZXF1ZXN0cygpOwoKICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmR3aGlsZSAqLwoKI2lmIGRlZmluZWQoV0lOMzIpCiAgICBqb2luX3N0ZGluX3dhaXRlcl90aHJlYWQoKTsKI2VuZGlmCgogICAgc25tcF9sb2coTE9HX0lORk8sICJSZWNlaXZlZCBURVJNIG9yIFNUT1Agc2lnbmFsLi4uICBzaHV0dGluZyBkb3duLi4uXG4iKTsKICAgIHJldHVybiAwOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgcmVjZWl2ZSgpICovCgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLW8tKioqKioqCiAqIHNubXBfaW5wdXQKICoKICogUGFyYW1ldGVyczoKICoJIG9wCiAqCSpzZXNzaW9uCiAqCSByZXF1aWQKICoJKnBkdQogKgkqbWFnaWMKICogICAgICAKICogUmV0dXJuczoKICoJMQkJT24gc3VjY2VzcwktT1ItCiAqCVBhc3NlcyB0aHJvdWdoCVJldHVybiBmcm9tIGFsYXJtR2V0UmVzcG9uc2UoKSB3aGVuIAogKgkgIAkJICBVU0lOR19WMlBBUlRZX0FMQVJNX01PRFVMRSBpcyBkZWZpbmVkLgogKgogKiBDYWxsLWJhY2sgZnVuY3Rpb24gdG8gbWFuYWdlIHJlc3BvbnNlcyB0byB0cmFwcyAoaW5mb3JtcykgYW5kIGFsYXJtcy4KICogTm90IHVzZWQgYnkgdGhlIGFnZW50IHRvIHByb2Nlc3Mgb3RoZXIgUmVzcG9uc2UgUERVcy4KICovCmludApzbm1wX2lucHV0KGludCBvcCwKICAgICAgICAgICBuZXRzbm1wX3Nlc3Npb24gKiBzZXNzaW9uLAogICAgICAgICAgIGludCByZXFpZCwgbmV0c25tcF9wZHUgKnBkdSwgdm9pZCAqbWFnaWMpCnsKICAgIHN0cnVjdCBnZXRfcmVxX3N0YXRlICpzdGF0ZSA9IChzdHJ1Y3QgZ2V0X3JlcV9zdGF0ZSAqKSBtYWdpYzsKCiAgICBpZiAob3AgPT0gTkVUU05NUF9DQUxMQkFDS19PUF9SRUNFSVZFRF9NRVNTQUdFKSB7CiAgICAgICAgaWYgKHBkdS0+Y29tbWFuZCA9PSBTTk1QX01TR19HRVQpIHsKICAgICAgICAgICAgaWYgKHN0YXRlLT50eXBlID09IEVWRU5UX0dFVF9SRVEpIHsKICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgKiB0aGlzIGlzIGp1c3QgdGhlIGFjayB0byBvdXIgaW5mb3JtIHBkdSAKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9IGVsc2UgaWYgKG9wID09IE5FVFNOTVBfQ0FMTEJBQ0tfT1BfVElNRURfT1VUKSB7CiAgICAgICAgaWYgKHN0YXRlLT50eXBlID09IEFMQVJNX0dFVF9SRVEpIHsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogTmVlZCBhIG1lY2hhbmlzbSB0byByZXBsYWNlIG9ic29sZXRlIFNOTVB2MnAgYWxhcm0gCiAgICAgICAgICAgICAqLwogICAgICAgIH0KICAgIH0KICAgIHJldHVybiAxOwoKfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgc25tcF9pbnB1dCgpICovCgoKCi8qCiAqIFdpbmRvd3MgU2VydmljZSBSZWxhdGVkIGZ1bmN0aW9ucyAKICovCiNpZmRlZiBXSU4zMlNFUlZJQ0UKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG1haW4gZnVuY3Rpb24gZm9yIFdpbmRvd3MKKiBQYXJzZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzIGZvciBzdGFydHVwIG9wdGlvbnMsCiogdG8gc3RhcnQgYXMgc2VydmljZSBvciBjb25zb2xlIG1vZGUgYXBwbGljYXRpb24gaW4gd2luZG93cy4KKiBJbnZva2VzIGFwcHJvcHJpYXRlIHN0YXJ0dXAgZnVuY3Rpb25zIGRlcGVuZGluZyBvbiB0aGUgCiogcGFyYW1ldGVycyBwYXNzZWQKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KaW50CiAgICBfX2NkZWNsCl90bWFpbihpbnQgYXJnYywgVENIQVIgKiBhcmd2W10pCnsKICAgIC8qCiAgICAgKiBEZWZpbmUgU2VydmljZSBOYW1lIGFuZCBEZXNjcmlwdGlvbiwgd2hpY2ggYXBwZWFycyBpbiB3aW5kb3dzIFNDTSAKICAgICAqLwogICAgTFBDVFNUUiAgICAgICAgIGxwc3pTZXJ2aWNlTmFtZSA9IGFwcF9uYW1lX2xvbmc7ICAgICAgLyogU2VydmljZSBSZWdpc3RyeSBOYW1lICovCiAgICBMUENUU1RSICAgICAgICAgbHBzelNlcnZpY2VEaXNwbGF5TmFtZSA9IF9UKCJOZXQtU05NUCBBZ2VudCIpOyAgICAgICAvKiBEaXNwbGF5IE5hbWUgKi8KICAgIExQQ1RTVFIgICAgICAgICBscHN6U2VydmljZURlc2NyaXB0aW9uID0KI2lmZGVmIElGREVTQ1IKICAgICAgICBfVCgiU05NUHYyYyAvIFNOTVB2MyBjb21tYW5kIHJlc3BvbmRlciBmcm9tIE5ldC1TTk1QLiBTdXBwb3J0cyBNSUIgb2JqZWN0cyBmb3IgSVAsSUNNUCxUQ1AsVURQLCBhbmQgbmV0d29yayBpbnRlcmZhY2Ugc3ViLWxheWVycy4iKTsKI2Vsc2UKICAgICAgICBfVCgiU05NUHYyYyAvIFNOTVB2MyBjb21tYW5kIHJlc3BvbmRlciBmcm9tIE5ldC1TTk1QIik7CiNlbmRpZgogICAgSW5wdXRQYXJhbXMgICAgIElucHV0T3B0aW9uczsKCgogICAgaW50ICAgICAgICAgICAgIG5SdW5UeXBlID0gUlVOX0FTX0NPTlNPTEU7CiAgICBpbnQgICAgICAgICAgICAgcXVpZXQgPSAwOwogICAgCiAgICBuUnVuVHlwZSA9IFBhcnNlQ21kTGluZUZvclNlcnZpY2VPcHRpb24oYXJnYywgYXJndiwgJnF1aWV0KTsKCiAgICBzd2l0Y2ggKG5SdW5UeXBlKSB7CiAgICBjYXNlIFJFR0lTVEVSX1NFUlZJQ0U6CiAgICAgICAgLyoKICAgICAgICAgKiBSZWdpc3RlciBBcyBzZXJ2aWNlIAogICAgICAgICAqLwogICAgICAgIElucHV0T3B0aW9ucy5BcmdjID0gYXJnYzsKICAgICAgICBJbnB1dE9wdGlvbnMuQXJndiA9IGFyZ3Y7CiAgICAgICAgZXhpdCAoUmVnaXN0ZXJTZXJ2aWNlKGxwc3pTZXJ2aWNlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgbHBzelNlcnZpY2VEaXNwbGF5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgbHBzelNlcnZpY2VEZXNjcmlwdGlvbiwgJklucHV0T3B0aW9ucywgcXVpZXQpKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgVU5fUkVHSVNURVJfU0VSVklDRToKICAgICAgICAvKgogICAgICAgICAqIFVucmVnaXN0ZXIgc2VydmljZSAKICAgICAgICAgKi8KICAgICAgICBleGl0IChVbnJlZ2lzdGVyU2VydmljZShscHN6U2VydmljZU5hbWUsIHF1aWV0KSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFJVTl9BU19TRVJWSUNFOgogICAgICAgIC8qCiAgICAgICAgICogUnVuIGFzIHNlcnZpY2UgCiAgICAgICAgICovCiAgICAgICAgLyoKICAgICAgICAgKiBSZWdpc3RlciBTdG9wIEZ1bmN0aW9uIAogICAgICAgICAqLwogICAgICAgIFJlZ2lzdGVyU3RvcEZ1bmN0aW9uKFN0b3BTbm1wQWdlbnQpOwogICAgICAgIHJldHVybiBSdW5Bc1NlcnZpY2UoU25tcERhZW1vbk1haW4pOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICAvKgogICAgICAgICAqIFJ1biBpbiBjb25zb2xlIG1vZGUgCiAgICAgICAgICovCiAgICAgICAgcmV0dXJuIFNubXBEYWVtb25NYWluKGFyZ2MsIGFyZ3YpOwogICAgICAgIGJyZWFrOwogICAgfQp9CgovKgogKiBUbyBzdG9wIFNubXAgQWdlbnQgZGFlbW9uCiAqIFRoaXMgcG9ydGlvbiBpcyBzdGlsbCBub3Qgd29ya2luZwogKi8Kdm9pZApTdG9wU25tcEFnZW50KHZvaWQpCnsKICAgIC8qCiAgICAgKiBTaHV0IERvd24gQWdlbnQgCiAgICAgKi8KICAgIFNubXBkU2h1dERvd24oMSk7CgogICAgLyoKICAgICAqIFdhaXQgdGlsbCBhZ2VudCBpcyBjb21wbGV0ZWx5IHN0b3BwZWQgCiAgICAgKi8KCiAgICB3aGlsZSAoYWdlbnRfc3RhdHVzICE9IEFHRU5UX1NUT1BQRUQpIHsKICAgICAgICBTbGVlcCgxMDApOwogICAgfQp9CgojZW5kaWYgLypXSU4zMlNFUlZJQ0UqLwo=