LyogYWdldHR5LmMgLSBhbm90aGVyIGdldHR5IHByb2dyYW0gZm9yIExpbnV4LiBCeSBXLiBaLiBWZW5lbWEgMTk4OQogICBQb3J0ZWQgdG8gTGludXggYnkgUGV0ZXIgT3JiYWVrIDxwb2VAZGFpbWkuYWF1LmRrPgogICBUaGlzIHByb2dyYW0gaXMgZnJlZWx5IGRpc3RyaWJ1dGFibGUuIFRoZSBlbnRpcmUgbWFuLXBhZ2UgdXNlZCB0bwogICBiZSBoZXJlLiBOb3cgcmVhZCB0aGUgcmVhbCBtYW4tcGFnZSBhZ2V0dHkuOCBpbnN0ZWFkLgoKICAgLWYgb3B0aW9uIGFkZGVkIGJ5IEVyaWMgUmFzbXVzc2VuIDxlYXJAdXNmaXJzdC5vcmc+IC0gMTIvMjgvOTUKICAgCiAgIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogICAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CgogICAxOTk5LTA1LTA1IFRob3JzdGVuIEtyYW56a293c2tpIDxkbDhiY3VAZ214Lm5ldD4KICAgLSBlbmFibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIGJlZm9yZSBkaXNwbGF5aW5nIC9ldGMvaXNzdWUKICAgCiovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPHNpZ25hbC5oPgojaW5jbHVkZSA8ZXJybm8uaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5oPgojaW5jbHVkZSA8c3lzL3N0YXQuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdGRhcmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDx1dG1wLmg+CiNpbmNsdWRlIDxnZXRvcHQuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPHN5cy9maWxlLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxuZXRkYi5oPgoKI2luY2x1ZGUgInhzdHJuY3B5LmgiCiNpbmNsdWRlICJubHMuaCIKI2luY2x1ZGUgInBhdGhuYW1lcy5oIgoKI2lmZGVmIF9fbGludXhfXwojaW5jbHVkZSA8c3lzL3BhcmFtLmg+CiNkZWZpbmUgVVNFX1NZU0xPRwojZW5kaWYKCiAvKiBJZiBVU0VfU1lTTE9HIGlzIHVuZGVmaW5lZCBhbGwgZGlhZ25vc3RpY3MgZ28gZGlyZWN0bHkgdG8gL2Rldi9jb25zb2xlLiAqLwoKI2lmZGVmCVVTRV9TWVNMT0cKI2luY2x1ZGUgPHN5c2xvZy5oPgojZW5kaWYKCiAvKgogICogU29tZSBoZXVyaXN0aWNzIHRvIGZpbmQgb3V0IHdoYXQgZW52aXJvbm1lbnQgd2UgYXJlIGluOiBpZiBpdCBpcyBub3QKICAqIFN5c3RlbSBWLCBhc3N1bWUgaXQgaXMgU3VuT1MgNC4KICAqLwoKI2lmZGVmIExPR0lOX1BST0NFU1MJCQkvKiBkZWZpbmVkIGluIFN5c3RlbSBWIHV0bXAuaCAqLwojZGVmaW5lCVNZU1ZfU1RZTEUJCQkvKiBzZWxlY3QgU3lzdGVtIFYgc3R5bGUgZ2V0dHkgKi8KI2VuZGlmCgogLyoKICAqIFRoaW5ncyB5b3UgbWF5IHdhbnQgdG8gbW9kaWZ5LgogICogCiAgKiBJZiBJU1NVRSBpcyBub3QgZGVmaW5lZCwgYWdldHR5IHdpbGwgbmV2ZXIgZGlzcGxheSB0aGUgY29udGVudHMgb2YgdGhlCiAgKiAvZXRjL2lzc3VlIGZpbGUuIFlvdSB3aWxsIG5vdCB3YW50IHRvIHNwaXQgb3V0IGxhcmdlICJpc3N1ZSIgZmlsZXMgYXQgdGhlCiAgKiB3cm9uZyBiYXVkIHJhdGUuIFJlbGV2YW50IGZvciBTeXN0ZW0gViBvbmx5LgogICogCiAgKiBZb3UgbWF5IGRpc2FncmVlIHdpdGggdGhlIGRlZmF1bHQgbGluZS1lZGl0aW5nIGV0Yy4gY2hhcmFjdGVycyBkZWZpbmVkCiAgKiBiZWxvdy4gTm90ZSwgaG93ZXZlciwgdGhhdCBERUwgY2Fubm90IGJlIHVzZWQgZm9yIGludGVycnVwdCBnZW5lcmF0aW9uCiAgKiBhbmQgZm9yIGxpbmUgZWRpdGluZyBhdCB0aGUgc2FtZSB0aW1lLgogICovCgojaWZkZWYJU1lTVl9TVFlMRQojZGVmaW5lCUlTU1VFICIvZXRjL2lzc3VlIgkJLyogZGlzcGxheWVkIGJlZm9yZSB0aGUgbG9naW4gcHJvbXB0ICovCiNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPgojZW5kaWYKCiNkZWZpbmUgTE9HSU4gIiBsb2dpbjogIgkJLyogbG9naW4gcHJvbXB0ICovCgovKiBTb21lIHNob3J0aGFuZHMgZm9yIGNvbnRyb2wgY2hhcmFjdGVycy4gKi8KCiNkZWZpbmUgQ1RMKHgpCQkoeCBeIDAxMDApCS8qIEFzc3VtZXMgQVNDSUkgZGlhbGVjdCAqLwojZGVmaW5lCUNSCQlDVEwoJ00nKQkvKiBjYXJyaWFnZSByZXR1cm4gKi8KI2RlZmluZQlOTAkJQ1RMKCdKJykJLyogbGluZSBmZWVkICovCiNkZWZpbmUJQlMJCUNUTCgnSCcpCS8qIGJhY2sgc3BhY2UgKi8KI2RlZmluZQlERUwJCUNUTCgnPycpCS8qIGRlbGV0ZSAqLwoKLyogRGVmYXVsdHMgZm9yIGxpbmUtZWRpdGluZyBldGMuIGNoYXJhY3RlcnM7IHlvdSBtYXkgd2FudCB0byBjaGFuZ2UgdGhpcy4gKi8KCiNkZWZpbmUgREVGX0VSQVNFCURFTAkJLyogZGVmYXVsdCBlcmFzZSBjaGFyYWN0ZXIgKi8KI2RlZmluZSBERUZfSU5UUglDVEwoJ0MnKQkvKiBkZWZhdWx0IGludGVycnVwdCBjaGFyYWN0ZXIgKi8KI2RlZmluZSBERUZfUVVJVAlDVEwoJ1xcJykJLyogZGVmYXVsdCBxdWl0IGNoYXIgKi8KI2RlZmluZSBERUZfS0lMTAlDVEwoJ1UnKQkvKiBkZWZhdWx0IGtpbGwgY2hhciAqLwojZGVmaW5lIERFRl9FT0YJCUNUTCgnRCcpCS8qIGRlZmF1bHQgRU9GIGNoYXIgKi8KI2RlZmluZSBERUZfRU9MCQkwCiNkZWZpbmUgREVGX1NXSVRDSAkwCQkvKiBkZWZhdWx0IHN3aXRjaCBjaGFyICovCgojaWZuZGVmIE1BWEhPU1ROQU1FTEVOCiMgaWZkZWYgSE9TVF9OQU1FX01BWAojICBkZWZpbmUgTUFYSE9TVE5BTUVMRU4gSE9TVF9OQU1FX01BWAojIGVsc2UKIyAgZGVmaW5lIE1BWEhPU1ROQU1FTEVOIDY0CiMgZW5kaWYKI2VuZGlmCgogLyoKICAqIFdoZW4gbXVsdGlwbGUgYmF1ZCByYXRlcyBhcmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIHRoZSBmaXJzdCBvbmUKICAqIHdlIHdpbGwgdHJ5IGlzIHRoZSBmaXJzdCBvbmUgc3BlY2lmaWVkLgogICovCgojZGVmaW5lCUZJUlNUX1NQRUVECTAKCi8qIFN0b3JhZ2UgZm9yIGNvbW1hbmQtbGluZSBvcHRpb25zLiAqLwoKI2RlZmluZQlNQVhfU1BFRUQJMTAJCS8qIG1heC4gbnIuIG9mIGJhdWQgcmF0ZXMgKi8KCnN0cnVjdCBvcHRpb25zIHsKICAgIGludCAgICAgZmxhZ3M7CQkJLyogdG9nZ2xlIHN3aXRjaGVzLCBzZWUgYmVsb3cgKi8KICAgIGludCAgICAgdGltZW91dDsJCQkvKiB0aW1lLW91dCBwZXJpb2QgKi8KICAgIGNoYXIgICAqbG9naW47CQkJLyogbG9naW4gcHJvZ3JhbSAqLwogICAgY2hhciAgICp0dHk7CQkJLyogbmFtZSBvZiB0dHkgKi8KICAgIGNoYXIgICAqaW5pdHN0cmluZzsJCQkvKiBtb2RlbSBpbml0IHN0cmluZyAqLwogICAgY2hhciAgICppc3N1ZTsJCQkvKiBhbHRlcm5hdGl2ZSBpc3N1ZSBmaWxlICovCiAgICBpbnQgICAgIG51bXNwZWVkOwkJCS8qIG51bWJlciBvZiBiYXVkIHJhdGVzIHRvIHRyeSAqLwogICAgaW50ICAgICBzcGVlZHNbTUFYX1NQRUVEXTsJCS8qIGJhdWQgcmF0ZXMgdG8gYmUgdHJpZWQgKi8KICAgIGludCAgICAgZWlnaHRiaXRzOwkJCS8qIGFzc3VtZSA4Yml0LWNsZWFuIHR0eSAqLwp9OwoKI2RlZmluZQlGX1BBUlNFCQkoMTw8MCkJCS8qIHByb2Nlc3MgbW9kZW0gc3RhdHVzIG1lc3NhZ2VzICovCiNkZWZpbmUJRl9JU1NVRQkJKDE8PDEpCQkvKiBkaXNwbGF5IC9ldGMvaXNzdWUgKi8KI2RlZmluZQlGX1JUU0NUUwkoMTw8MikJCS8qIGVuYWJsZSBSVFMvQ1RTIGZsb3cgY29udHJvbCAqLwojZGVmaW5lIEZfTE9DQUwJCSgxPDwzKQkJLyogZm9yY2UgbG9jYWwgKi8KI2RlZmluZSBGX0lOSVRTVFJJTkcgICAgKDE8PDQpCQkvKiBpbml0c3RyaW5nIGlzIHNldCAqLwojZGVmaW5lIEZfV0FJVENSTEYJKDE8PDUpCQkvKiB3YWl0IGZvciBDUiBvciBMRiAqLwojZGVmaW5lIEZfQ1VTVElTU1VFCSgxPDw2KQkJLyogZ2l2ZSBhbHRlcm5hdGl2ZSBpc3N1ZSBmaWxlICovCiNkZWZpbmUgRl9OT1BST01QVAkoMTw8NykJCS8qIGRvbid0IGFzayBmb3IgbG9naW4gbmFtZSEgKi8KI2RlZmluZSBGX0xDVUMJCSgxPDw4KQkJLyogU3VwcG9ydCBmb3IgKkxDVUMgc3R0eSBtb2RlcyAqLwoKLyogU3RvcmFnZSBmb3IgdGhpbmdzIGRldGVjdGVkIHdoaWxlIHRoZSBsb2dpbiBuYW1lIHdhcyByZWFkLiAqLwoKc3RydWN0IGNoYXJkYXRhIHsKICAgIGludCAgICAgZXJhc2U7CQkJLyogZXJhc2UgY2hhcmFjdGVyICovCiAgICBpbnQgICAgIGtpbGw7CQkJLyoga2lsbCBjaGFyYWN0ZXIgKi8KICAgIGludCAgICAgZW9sOwkJCS8qIGVuZC1vZi1saW5lIGNoYXJhY3RlciAqLwogICAgaW50ICAgICBwYXJpdHk7CQkJLyogd2hhdCBwYXJpdHkgZGlkIHdlIHNlZSAqLwogICAgaW50ICAgICBjYXBzbG9jazsJCQkvKiB1cHBlciBjYXNlIHdpdGhvdXQgbG93ZXIgY2FzZSAqLwp9OwoKLyogSW5pdGlhbCB2YWx1ZXMgZm9yIHRoZSBhYm92ZS4gKi8KCnN0cnVjdCBjaGFyZGF0YSBpbml0X2NoYXJkYXRhID0gewogICAgREVGX0VSQVNFLAkJCQkvKiBkZWZhdWx0IGVyYXNlIGNoYXJhY3RlciAqLwogICAgREVGX0tJTEwsCQkJCS8qIGRlZmF1bHQga2lsbCBjaGFyYWN0ZXIgKi8KICAgIDEzLAkJCQkJLyogZGVmYXVsdCBlb2wgY2hhciAqLwogICAgMCwJCQkJCS8qIHNwYWNlIHBhcml0eSAqLwogICAgMCwJCQkJCS8qIG5vIGNhcHNsb2NrICovCn07CgpzdHJ1Y3QgU3BlZWR0YWIgewogICAgbG9uZyAgICBzcGVlZDsKICAgIGludCAgICAgY29kZTsKfTsKCnN0YXRpYyBzdHJ1Y3QgU3BlZWR0YWIgc3BlZWR0YWJbXSA9IHsKICAgIHsgNTAsIEI1MCB9LAogICAgeyA3NSwgQjc1IH0sCiAgICB7IDExMCwgQjExMCB9LAogICAgeyAxMzQsIEIxMzQgfSwKICAgIHsgMTUwLCBCMTUwIH0sCiAgICB7IDIwMCwgQjIwMCB9LAogICAgeyAzMDAsIEIzMDAgfSwKICAgIHsgNjAwLCBCNjAwIH0sCiAgICB7IDEyMDAsIEIxMjAwIH0sCiAgICB7IDE4MDAsIEIxODAwIH0sCiAgICB7IDI0MDAsIEIyNDAwIH0sCiAgICB7IDQ4MDAsIEI0ODAwIH0sCiAgICB7IDk2MDAsIEI5NjAwIH0sCiNpZmRlZglCMTkyMDAKICAgIHsgMTkyMDAsIEIxOTIwMCB9LAojZW5kaWYKI2lmZGVmCUIzODQwMAogICAgeyAzODQwMCwgQjM4NDAwIH0sCiNlbmRpZgojaWZkZWYJRVhUQQogICAgeyAxOTIwMCwgRVhUQSB9LAojZW5kaWYKI2lmZGVmCUVYVEIKICAgIHsgMzg0MDAsIEVYVEIgfSwKI2VuZGlmCiNpZmRlZiBCNTc2MDAKICAgIHsgNTc2MDAsIEI1NzYwMCB9LAojZW5kaWYKI2lmZGVmIEIxMTUyMDAKICAgIHsgMTE1MjAwLCBCMTE1MjAwIH0sCiNlbmRpZgojaWZkZWYgQjIzMDQwMAogICAgeyAyMzA0MDAsIEIyMzA0MDAgfSwKI2VuZGlmCiAgICB7IDAsIDAgfSwKfTsKCiNkZWZpbmUgUF8ocykgcwppbnQgbWFpbiBQXygoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSk7CnZvaWQgcGFyc2VfYXJncyBQXygoaW50IGFyZ2MsIGNoYXIgKiphcmd2LCBzdHJ1Y3Qgb3B0aW9ucyAqb3ApKTsKdm9pZCBwYXJzZV9zcGVlZHMgUF8oKHN0cnVjdCBvcHRpb25zICpvcCwgY2hhciAqYXJnKSk7CnZvaWQgdXBkYXRlX3V0bXAgUF8oKGNoYXIgKmxpbmUpKTsKdm9pZCBvcGVuX3R0eSBQXygoY2hhciAqdHR5LCBzdHJ1Y3QgdGVybWlvcyAqdHAsIGludCBsb2NhbCkpOwp2b2lkIHRlcm1pb19pbml0IFBfKChzdHJ1Y3QgdGVybWlvcyAqdHAsIGludCBzcGVlZCwgc3RydWN0IG9wdGlvbnMgKm9wKSk7CnZvaWQgYXV0b19iYXVkIFBfKChzdHJ1Y3QgdGVybWlvcyAqdHApKTsKdm9pZCBkb19wcm9tcHQgUF8oKHN0cnVjdCBvcHRpb25zICpvcCwgc3RydWN0IHRlcm1pb3MgKnRwKSk7CnZvaWQgbmV4dF9zcGVlZCBQXygoc3RydWN0IHRlcm1pb3MgKnRwLCBzdHJ1Y3Qgb3B0aW9ucyAqb3ApKTsKY2hhciAqZ2V0X2xvZ25hbWUgUF8oKHN0cnVjdCBvcHRpb25zICpvcCwgc3RydWN0IGNoYXJkYXRhICpjcCwgc3RydWN0IHRlcm1pb3MgKnRwKSk7CnZvaWQgdGVybWlvX2ZpbmFsIFBfKChzdHJ1Y3Qgb3B0aW9ucyAqb3AsIHN0cnVjdCB0ZXJtaW9zICp0cCwgc3RydWN0IGNoYXJkYXRhICpjcCkpOwppbnQgY2Fwc19sb2NrIFBfKChjaGFyICpzKSk7CmludCBiY29kZSBQXygoY2hhciAqcykpOwp2b2lkIHVzYWdlIFBfKCh2b2lkKSk7CnZvaWQgZXJyb3IgUF8oKGNvbnN0IGNoYXIgKiwgLi4uKSk7CiN1bmRlZiBQXwoKLyogVGhlIGZvbGxvd2luZyBpcyB1c2VkIGZvciB1bmRlcnN0YW5kYWJsZSBkaWFnbm9zdGljcy4gKi8KCmNoYXIgKnByb2duYW1lOwoKLyogRmFrZSBob3N0bmFtZSBmb3IgdXRfaG9zdCBzcGVjaWZpZWQgb24gY29tbWFuZCBsaW5lLiAqLwpjaGFyICpmYWtlaG9zdCA9IE5VTEw7CgovKiAuLi4gKi8KI2lmZGVmIERFQlVHR0lORwojZGVmaW5lIGRlYnVnKHMpIGZwcmludGYoZGJmLHMpOyBmZmx1c2goZGJmKQpGSUxFICpkYmY7CiNlbHNlCiNkZWZpbmUgZGVidWcocykgLyogbm90aGluZyAqLwojZW5kaWYKCmludAptYWluKGFyZ2MsIGFyZ3YpCiAgICAgaW50ICAgICBhcmdjOwogICAgIGNoYXIgICoqYXJndjsKewogICAgY2hhciAgICpsb2duYW1lID0gTlVMTDsJCS8qIGxvZ2luIG5hbWUsIGdpdmVuIHRvIC9iaW4vbG9naW4gKi8KICAgIHN0cnVjdCBjaGFyZGF0YSBjaGFyZGF0YTsJCS8qIHNldCBieSBnZXRfbG9nbmFtZSgpICovCiAgICBzdHJ1Y3QgdGVybWlvcyB0ZXJtaW9zOwkJLyogdGVybWluYWwgbW9kZSBiaXRzICovCiAgICBzdGF0aWMgc3RydWN0IG9wdGlvbnMgb3B0aW9ucyA9IHsKCUZfSVNTVUUsCQkJLyogc2hvdyAvZXRjL2lzc3VlIChTWVNWX1NUWUxFKSAqLwoJMCwJCQkJLyogbm8gdGltZW91dCAqLwoJX1BBVEhfTE9HSU4sCQkJLyogZGVmYXVsdCBsb2dpbiBwcm9ncmFtICovCgkidHR5MSIsCQkJCS8qIGRlZmF1bHQgdHR5IGxpbmUgKi8KCSIiLAkJCQkvKiBtb2RlbSBpbml0IHN0cmluZyAqLwoJSVNTVUUsCQkJCS8qIGRlZmF1bHQgaXNzdWUgZmlsZSAqLwoJMCwJCQkJLyogbm8gYmF1ZCByYXRlcyBrbm93biB5ZXQgKi8KICAgIH07CgogICAgICAgc2V0bG9jYWxlKExDX0FMTCwgIiIpOwogICAgICAgYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKICAgICAgIHRleHRkb21haW4oUEFDS0FHRSk7CiAgICAKICAgIC8qIFRoZSBCU0Qtc3R5bGUgaW5pdCBjb21tYW5kIHBhc3NlcyB1cyBhIHVzZWxlc3MgcHJvY2VzcyBuYW1lLiAqLwoKI2lmZGVmCVNZU1ZfU1RZTEUKICAgICAgIHsKCSAgICAgICBjaGFyICpwdHI7CgkgICAgICAgcHJvZ25hbWUgPSBhcmd2WzBdOwoJICAgICAgIGlmICgocHRyID0gc3RycmNocihhcmd2WzBdLCAnLycpKSkKCQkgICAgICAgcHJvZ25hbWUgPSArK3B0cjsKICAgICAgIH0KI2Vsc2UKICAgICAgIHByb2duYW1lID0gImFnZXR0eSI7CiNlbmRpZgoKI2lmZGVmIERFQlVHR0lORwoJZGJmID0gZm9wZW4oIi9kZXYvdHR5cDAiLCAidyIpOwoKCXsJaW50IGk7CgkKCQlmb3IoaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKCQkJZGVidWcoYXJndltpXSk7CgkJfQoJfQojZW5kaWYKCiAgICAvKiBQYXJzZSBjb21tYW5kLWxpbmUgYXJndW1lbnRzLiAqLwoKICAgIHBhcnNlX2FyZ3MoYXJnYywgYXJndiwgJm9wdGlvbnMpOwoKI2lmZGVmIF9fbGludXhfXwoJc2V0c2lkKCk7CiNlbmRpZgoJCiAgICAvKiBVcGRhdGUgdGhlIHV0bXAgZmlsZS4gKi8KCiNpZmRlZglTWVNWX1NUWUxFCiAgICB1cGRhdGVfdXRtcChvcHRpb25zLnR0eSk7CiNlbmRpZgoKICAgIGRlYnVnKCJjYWxsaW5nIG9wZW5fdHR5XG4iKTsKICAgIC8qIE9wZW4gdGhlIHR0eSBhcyBzdGFuZGFyZCB7IGlucHV0LCBvdXRwdXQsIGVycm9yIH0uICovCiAgICBvcGVuX3R0eShvcHRpb25zLnR0eSwgJnRlcm1pb3MsIG9wdGlvbnMuZmxhZ3MgJiBGX0xPQ0FMKTsKCiAgICB0Y3NldHBncnAoMCwgZ2V0cGlkKCkpOwogICAgLyogSW5pdGlhbGl6ZSB0aGUgdGVybWlvcyBzZXR0aW5ncyAocmF3IG1vZGUsIGVpZ2h0LWJpdCwgYmxvY2tpbmcgaS9vKS4gKi8KICAgIGRlYnVnKCJjYWxsaW5nIHRlcm1pb19pbml0XG4iKTsKICAgIHRlcm1pb19pbml0KCZ0ZXJtaW9zLCBvcHRpb25zLnNwZWVkc1tGSVJTVF9TUEVFRF0sICZvcHRpb25zKTsKCiAgICAvKiB3cml0ZSB0aGUgbW9kZW0gaW5pdCBzdHJpbmcgYW5kIERPTidUIGZsdXNoIHRoZSBidWZmZXJzICovCiAgICBpZiAob3B0aW9ucy5mbGFncyAmIEZfSU5JVFNUUklORykgewoJZGVidWcoIndyaXRpbmcgaW5pdCBzdHJpbmdcbiIpOwoJd3JpdGUoMSwgb3B0aW9ucy5pbml0c3RyaW5nLCBzdHJsZW4ob3B0aW9ucy5pbml0c3RyaW5nKSk7CiAgICB9CgogICAgaWYgKCEob3B0aW9ucy5mbGFncyAmIEZfTE9DQUwpKSB7CgkvKiBnbyB0byBibG9ja2luZyB3cml0ZSBtb2RlIHVubGVzcyAtTCBpcyBzcGVjaWZpZWQgKi8KCWZjbnRsKDEsIEZfU0VURkwsIGZjbnRsKDEsIEZfR0VURkwsIDApICYgfk9fTk9OQkxPQ0spOwogICAgfQoKICAgIC8qIE9wdGlvbmFsbHkgZGV0ZWN0IHRoZSBiYXVkIHJhdGUgZnJvbSB0aGUgbW9kZW0gc3RhdHVzIG1lc3NhZ2UuICovCiAgICBkZWJ1ZygiYmVmb3JlIGF1dG9iYXVkXG4iKTsKICAgIGlmIChvcHRpb25zLmZsYWdzICYgRl9QQVJTRSkKCWF1dG9fYmF1ZCgmdGVybWlvcyk7CgogICAgLyogU2V0IHRoZSBvcHRpb25hbCB0aW1lci4gKi8KICAgIGlmIChvcHRpb25zLnRpbWVvdXQpCgkodm9pZCkgYWxhcm0oKHVuc2lnbmVkKSBvcHRpb25zLnRpbWVvdXQpOwoKICAgIC8qIG9wdGlvbmFsbHkgd2FpdCBmb3IgQ1Igb3IgTEYgYmVmb3JlIHdyaXRpbmcgL2V0Yy9pc3N1ZSAqLwogICAgaWYgKG9wdGlvbnMuZmxhZ3MgJiBGX1dBSVRDUkxGKSB7CgljaGFyIGNoOwoKCWRlYnVnKCJ3YWl0aW5nIGZvciBjci1sZlxuIik7Cgl3aGlsZShyZWFkKDAsICZjaCwgMSkgPT0gMSkgewoJICAgIGNoICY9IDB4N2Y7ICAgLyogc3RyaXAgInBhcml0eSBiaXQiICovCiNpZmRlZiBERUJVR0dJTkcKCSAgICBmcHJpbnRmKGRiZiwgInJlYWQgJWNcbiIsIGNoKTsKI2VuZGlmCgkgICAgaWYgKGNoID09ICdcbicgfHwgY2ggPT0gJ1xyJykgYnJlYWs7Cgl9CiAgICB9CgogICAgY2hhcmRhdGEgPSBpbml0X2NoYXJkYXRhOwogICAgaWYgKCEob3B0aW9ucy5mbGFncyAmIEZfTk9QUk9NUFQpKSB7CgkvKiBSZWFkIHRoZSBsb2dpbiBuYW1lLiAqLwoJZGVidWcoInJlYWRpbmcgbG9naW4gbmFtZVxuIik7Cgl3aGlsZSAoKGxvZ25hbWUgPSBnZXRfbG9nbmFtZSgmb3B0aW9ucywgJmNoYXJkYXRhLCAmdGVybWlvcykpID09IDApCgkgIG5leHRfc3BlZWQoJnRlcm1pb3MsICZvcHRpb25zKTsKICAgIH0KCiAgICAvKiBEaXNhYmxlIHRpbWVyLiAqLwoKICAgIGlmIChvcHRpb25zLnRpbWVvdXQpCgkodm9pZCkgYWxhcm0oMCk7CgogICAgLyogRmluYWxpemUgdGhlIHRlcm1pb3Mgc2V0dGluZ3MuICovCgogICAgdGVybWlvX2ZpbmFsKCZvcHRpb25zLCAmdGVybWlvcywgJmNoYXJkYXRhKTsKCiAgICAvKiBOb3cgdGhlIG5ld2xpbmUgY2hhcmFjdGVyIHNob3VsZCBiZSBwcm9wZXJseSB3cml0dGVuLiAqLwoKICAgICh2b2lkKSB3cml0ZSgxLCAiXG4iLCAxKTsKCiAgICAvKiBMZXQgdGhlIGxvZ2luIHByb2dyYW0gdGFrZSBjYXJlIG9mIHBhc3N3b3JkIHZhbGlkYXRpb24uICovCgogICAgKHZvaWQpIGV4ZWNsKG9wdGlvbnMubG9naW4sIG9wdGlvbnMubG9naW4sICItLSIsIGxvZ25hbWUsIE5VTEwpOwogICAgZXJyb3IoXygiJXM6IGNhbid0IGV4ZWMgJXM6ICVtIiksIG9wdGlvbnMudHR5LCBvcHRpb25zLmxvZ2luKTsKICAgIGV4aXQoMCk7ICAvKiBxdWlldCBHQ0MgKi8KfQoKLyogcGFyc2UtYXJncyAtIHBhcnNlIGNvbW1hbmQtbGluZSBhcmd1bWVudHMgKi8KCnZvaWQKcGFyc2VfYXJncyhhcmdjLCBhcmd2LCBvcCkKICAgICBpbnQgICAgIGFyZ2M7CiAgICAgY2hhciAgKiphcmd2OwogICAgIHN0cnVjdCBvcHRpb25zICpvcDsKewogICAgZXh0ZXJuIGNoYXIgKm9wdGFyZzsJCS8qIGdldG9wdCAqLwogICAgZXh0ZXJuIGludCBvcHRpbmQ7CQkJLyogZ2V0b3B0ICovCiAgICBpbnQgICAgIGM7CgogICAgd2hpbGUgKGlzYXNjaWkoYyA9IGdldG9wdChhcmdjLCBhcmd2LCAiOEk6TEg6ZjpoaWw6bXQ6d1VuIikpKSB7Cglzd2l0Y2ggKGMpIHsKCWNhc2UgJzgnOgoJICAgIG9wLT5laWdodGJpdHMgPSAxOwoJICAgIGJyZWFrOwoJY2FzZSAnSSc6CgkgICAgaWYgKCEob3AtPmluaXRzdHJpbmcgPSBtYWxsb2Moc3RybGVuKG9wdGFyZykrMSkpKSB7CgkJZXJyb3IoXygiY2FuJ3QgbWFsbG9jIGluaXRzdHJpbmciKSk7CgkJYnJlYWs7CgkgICAgfQoJICAgIHsKCQljaGFyIGNoLCAqcCwgKnE7CgkJaW50IGk7CgoJCS8qIGNvcHkgb3B0YXJnIGludG8gb3AtPmluaXRzdHJpbmcgZGVjb2RpbmcgXGRkZAoJCSAgIG9jdGFsIGNvZGVzIGludG8gY2hhcnMgKi8KCQlxID0gb3AtPmluaXRzdHJpbmc7CgkJcCA9IG9wdGFyZzsKCQl3aGlsZSAoKnApIHsKCQkgICAgaWYgKCpwID09ICdcXCcpIHsJCS8qIGtub3cgXFwgbWVhbnMgXCAqLwoJCQlwKys7CgkJCWlmICgqcCA9PSAnXFwnKSB7CgkJCSAgICBjaCA9ICdcXCc7CgkJCSAgICBwKys7CgkJCX0gZWxzZSB7CQkvKiBoYW5kbGUgXDAwMCAtIFwxNzcgKi8KCQkJICAgIGNoID0gMDsKCQkJICAgIGZvciAoaSA9IDE7IGkgPD0gMzsgaSsrKSB7CgkJCQlpZiAoKnAgPj0gJzAnICYmICpwIDw9ICc3JykgewoJCQkJICAgIGNoIDw8PSAzOwoJCQkJICAgIGNoICs9ICpwIC0gJzAnOwoJCQkJICAgIHArKzsKCQkJCX0gZWxzZSAKCQkJCSAgYnJlYWs7CgkJCSAgICB9CgkJCX0KCQkJKnErKyA9IGNoOwoJCSAgICB9IGVsc2UgewoJCQkqcSsrID0gKnArKzsKCQkgICAgfQoJCX0KCQkqcSA9ICdcMCc7CgkgICAgfQoJICAgIG9wLT5mbGFncyB8PSBGX0lOSVRTVFJJTkc7CgkgICAgYnJlYWs7CgoJY2FzZSAnTCc6CQkJCS8qIGZvcmNlIGxvY2FsICovCiAJICAgIG9wLT5mbGFncyB8PSBGX0xPQ0FMOwogCSAgICBicmVhazsKCWNhc2UgJ0gnOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmYWtlIGxvZ2luIGhvc3QgKi8KCSAgICBmYWtlaG9zdCA9IG9wdGFyZzsKCSAgICBicmVhazsKCWNhc2UgJ2YnOgkJCQkvKiBjdXN0b20gaXNzdWUgZmlsZSAqLwoJICAgIG9wLT5mbGFncyB8PSBGX0NVU1RJU1NVRTsKCSAgICBvcC0+aXNzdWUgPSBvcHRhcmc7CgkgICAgYnJlYWs7CgljYXNlICdoJzoJCQkJLyogZW5hYmxlIGgvdyBmbG93IGNvbnRyb2wgKi8KCSAgICBvcC0+ZmxhZ3MgfD0gRl9SVFNDVFM7CgkgICAgYnJlYWs7CgljYXNlICdpJzoJCQkJLyogZG8gbm90IHNob3cgL2V0Yy9pc3N1ZSAqLwoJICAgIG9wLT5mbGFncyAmPSB+Rl9JU1NVRTsKCSAgICBicmVhazsKCWNhc2UgJ2wnOgoJICAgIG9wLT5sb2dpbiA9IG9wdGFyZzsJCQkvKiBub24tZGVmYXVsdCBsb2dpbiBwcm9ncmFtICovCgkgICAgYnJlYWs7CgljYXNlICdtJzoJCQkJLyogcGFyc2UgbW9kZW0gc3RhdHVzIG1lc3NhZ2UgKi8KCSAgICBvcC0+ZmxhZ3MgfD0gRl9QQVJTRTsKCSAgICBicmVhazsKCWNhc2UgJ24nOgoJICAgIG9wLT5mbGFncyB8PSBGX05PUFJPTVBUOwoJICAgIGJyZWFrOwoJY2FzZSAndCc6CQkJCS8qIHRpbWUgb3V0ICovCgkgICAgaWYgKChvcC0+dGltZW91dCA9IGF0b2kob3B0YXJnKSkgPD0gMCkKCQllcnJvcihfKCJiYWQgdGltZW91dCB2YWx1ZTogJXMiKSwgb3B0YXJnKTsKCSAgICBicmVhazsKCWNhc2UgJ3cnOgoJICAgIG9wLT5mbGFncyB8PSBGX1dBSVRDUkxGOwoJICAgIGJyZWFrOwoJY2FzZSAnVSc6CgkgICAgb3AtPmZsYWdzIHw9IEZfTENVQzsKCSAgICBicmVhazsKCWRlZmF1bHQ6CgkgICAgdXNhZ2UoKTsKCX0KICAgIH0KCWRlYnVnKCJhZnRlciBnZXRvcHQgbG9vcFxuIik7CiAgICBpZiAoYXJnYyA8IG9wdGluZCArIDIpCQkJLyogY2hlY2sgcGFyYW1ldGVyIGNvdW50ICovCgl1c2FnZSgpOwoKICAgIC8qIHdlIGxvb3NlbiB1cCBhIGJpdCBhbmQgYWNjZXB0IGJvdGggImJhdWRyYXRlIHR0eSIgYW5kICJ0dHkgYmF1ZHJhdGUiICovCiAgICBpZignMCcgPD0gYXJndltvcHRpbmRdWzBdICYmIGFyZ3Zbb3B0aW5kXVswXSA8PSAnOScpIHsKCS8qIGEgbnVtYmVyIGZpcnN0LCBhc3N1bWUgaXQncyBhIHNwZWVkIChCU0Qgc3R5bGUpICovCglwYXJzZV9zcGVlZHMob3AsIGFyZ3Zbb3B0aW5kKytdKTsJLyogYmF1ZCByYXRlKHMpICovCglvcC0+dHR5ID0gYXJndltvcHRpbmRdOwkJCS8qIHR0eSBuYW1lICovCiAgICB9IGVsc2UgewoJb3AtPnR0eSA9IGFyZ3Zbb3B0aW5kKytdOwkJLyogdHR5IG5hbWUgKi8KCXBhcnNlX3NwZWVkcyhvcCwgYXJndltvcHRpbmRdKTsJCS8qIGJhdWQgcmF0ZShzKSAqLwogICAgfQoKICAgIG9wdGluZCsrOwogICAgaWYgKGFyZ2MgPiBvcHRpbmQgJiYgYXJndltvcHRpbmRdKQoJc2V0ZW52ICgiVEVSTSIsIGFyZ3Zbb3B0aW5kXSwgMSk7CgojaWZkZWYgRE9fREVWRlNfRklERExJTkcKICAgIC8qCiAgICAgKiBzb21lIGRldmZzIGp1bmssIGZvbGxvd2luZyBHb3N3aW4gQnJlZGVybG93OgogICAgICogICB0dXJuIHR0eVM8bj4gaW50byB0dHMvPG4+CiAgICAgKiAgIHR1cm4gdHR5PG4+IGludG8gdmMvPG4+CiAgICAgKi8KICAgIGlmIChvcC0+dHR5ICYmIHN0cmxlbihvcC0+dHR5KSA8IDkwKSB7CgkgICAgY2hhciBkZXZfbmFtZVsxMDBdOwoJICAgIHN0cnVjdCBzdGF0IHN0OwoKCSAgICBpZiAoc3RybmNtcChvcC0+dHR5LCAidHR5UyIsIDQpID09IDApIHsKCQkgICAgc3RyY3B5KGRldl9uYW1lLCAiL2Rldi8iKTsKCQkgICAgc3RyY2F0KGRldl9uYW1lLCBvcC0+dHR5KTsKCQkgICAgaWYgKHN0YXQoZGV2X25hbWUsICZzdCkgPCAwKSB7CgkJCSAgICBzdHJjcHkoZGV2X25hbWUsICIvZGV2L3R0cy8iKTsKCQkJICAgIHN0cmNhdChkZXZfbmFtZSwgb3AtPnR0eSArIDQpOwoJCQkgICAgaWYgKHN0YXQoZGV2X25hbWUsICZzdCkgPT0gMCkKCQkJCSAgICBvcC0+dHR5ID0gc3RyZHVwKGRldl9uYW1lICsgNSk7CgkJICAgIH0KCSAgICB9IGVsc2UgaWYgKHN0cm5jbXAob3AtPnR0eSwgInR0eSIsIDMpID09IDApIHsKCQkgICAgc3RyY3B5KGRldl9uYW1lLCAiL2Rldi8iKTsKCQkgICAgc3RybmNhdChkZXZfbmFtZSwgb3AtPnR0eSwgOTApOwoJCSAgICBpZiAoc3RhdChkZXZfbmFtZSwgJnN0KSA8IDApIHsKCQkJICAgIHN0cmNweShkZXZfbmFtZSwgIi9kZXYvdmMvIik7CgkJCSAgICBzdHJjYXQoZGV2X25hbWUsIG9wLT50dHkgKyAzKTsKCQkJICAgIGlmIChzdGF0KGRldl9uYW1lLCAmc3QpID09IDApCgkJCQkgICAgb3AtPnR0eSA9IHN0cmR1cChkZXZfbmFtZSArIDUpOwoJCSAgICB9CgkgICAgfQogICAgfQojZW5kaWYKCiAgICBkZWJ1ZygiZXhpdGluZyBwYXJzZWFyZ3NcbiIpOwp9CgovKiBwYXJzZV9zcGVlZHMgLSBwYXJzZSBhbHRlcm5hdGUgYmF1ZCByYXRlcyAqLwoKdm9pZApwYXJzZV9zcGVlZHMob3AsIGFyZykKICAgICBzdHJ1Y3Qgb3B0aW9ucyAqb3A7CiAgICAgY2hhciAgICphcmc7CnsKICAgIGNoYXIgICAqY3A7CgoJZGVidWcoImVudGVyZWQgcGFyc2Vfc3BlZWRzXG4iKTsKICAgIGZvciAoY3AgPSBzdHJ0b2soYXJnLCAiLCIpOyBjcCAhPSAwOyBjcCA9IHN0cnRvaygoY2hhciAqKSAwLCAiLCIpKSB7CglpZiAoKG9wLT5zcGVlZHNbb3AtPm51bXNwZWVkKytdID0gYmNvZGUoY3ApKSA8PSAwKQoJICAgIGVycm9yKF8oImJhZCBzcGVlZDogJXMiKSwgY3ApOwoJaWYgKG9wLT5udW1zcGVlZCA+PSBNQVhfU1BFRUQpCgkgICAgZXJyb3IoXygidG9vIG1hbnkgYWx0ZXJuYXRlIHNwZWVkcyIpKTsKICAgIH0KICAgIGRlYnVnKCJleGl0aW5nIHBhcnNlc3BlZWRzXG4iKTsKfQoKI2lmZGVmCVNZU1ZfU1RZTEUKCi8qIHVwZGF0ZV91dG1wIC0gdXBkYXRlIG91ciB1dG1wIGVudHJ5ICovCnZvaWQKdXBkYXRlX3V0bXAobGluZSkKICAgICBjaGFyICAgKmxpbmU7CnsKICAgIHN0cnVjdCAgdXRtcCB1dDsKICAgIHRpbWVfdCAgdDsKICAgIGludCAgICAgbXlwaWQgPSBnZXRwaWQoKTsKICAgIHN0cnVjdCAgdXRtcCAqdXRwOwoKICAgIC8qCiAgICAgKiBUaGUgdXRtcCBmaWxlIGhvbGRzIG1pc2NlbGxhbmVvdXMgaW5mb3JtYXRpb24gYWJvdXQgdGhpbmdzIHN0YXJ0ZWQgYnkKICAgICAqIC9zYmluL2luaXQgYW5kIG90aGVyIHN5c3RlbS1yZWxhdGVkIGV2ZW50cy4gT3VyIHB1cnBvc2UgaXMgdG8gdXBkYXRlCiAgICAgKiB0aGUgdXRtcCBlbnRyeSBmb3IgdGhlIGN1cnJlbnQgcHJvY2VzcywgaW4gcGFydGljdWxhciB0aGUgcHJvY2VzcyB0eXBlCiAgICAgKiBhbmQgdGhlIHR0eSBsaW5lIHdlIGFyZSBsaXN0ZW5pbmcgdG8uIFJldHVybiBzdWNjZXNzZnVsbHkgb25seSBpZiB0aGUKICAgICAqIHV0bXAgZmlsZSBjYW4gYmUgb3BlbmVkIGZvciB1cGRhdGUsIGFuZCBpZiB3ZSBhcmUgYWJsZSB0byBmaW5kIG91cgogICAgICogZW50cnkgaW4gdGhlIHV0bXAgZmlsZS4KICAgICAqLwoKICAgIHV0bXBuYW1lKF9QQVRIX1VUTVApOwogICAgc2V0dXRlbnQoKTsKCiAgICAvKiBGaW5kIG15cGlkIGluIHV0bXAuIEVhcmxpZXIgY29kZSBoZXJlIHRlc3RlZCBvbmx5CiAgICAgICB1dHAtPnV0X3R5cGUgIT0gSU5JVF9QUk9DRVNTLCBzbyBtYXliZSB0aGUgPj0gaGVyZSBzaG91bGQgYmUgPi4KICAgICAgIFRoZSBwcmVzZW50IGNvZGUgaXMgdGFrZW4gZnJvbSBsb2dpbi5jLCBzbyBpZiB0aGlzIGlzIGNoYW5nZWQsCiAgICAgICBtYXliZSBsb2dpbiBoYXMgdG8gYmUgY2hhbmdlZCBhcyB3ZWxsLiAqLwogICAgd2hpbGUgKCh1dHAgPSBnZXR1dGVudCgpKSkKCSAgICBpZiAodXRwLT51dF9waWQgPT0gbXlwaWQKCQkmJiB1dHAtPnV0X3R5cGUgPj0gSU5JVF9QUk9DRVNTCgkJJiYgdXRwLT51dF90eXBlIDw9IERFQURfUFJPQ0VTUykKCQkgICAgYnJlYWs7CgogICAgaWYgKHV0cCkgewoJbWVtY3B5KCZ1dCwgdXRwLCBzaXplb2YodXQpKTsKICAgIH0gZWxzZSB7CgkvKiBzb21lIGluaXRzIGRvbid0IGluaXRpYWxpemUgdXRtcC4uLiAqLwoJbWVtc2V0KCZ1dCwgMCwgc2l6ZW9mKHV0KSk7CglzdHJuY3B5KHV0LnV0X2lkLCBsaW5lICsgMywgc2l6ZW9mKHV0LnV0X2lkKSk7CiAgICB9CgkKICAgIHN0cm5jcHkodXQudXRfdXNlciwgIkxPR0lOIiwgc2l6ZW9mKHV0LnV0X3VzZXIpKTsKICAgIHN0cm5jcHkodXQudXRfbGluZSwgbGluZSwgc2l6ZW9mKHV0LnV0X2xpbmUpKTsKICAgIGlmIChmYWtlaG9zdCkKCXN0cm5jcHkodXQudXRfaG9zdCwgZmFrZWhvc3QsIHNpemVvZih1dC51dF9ob3N0KSk7CiAgICB0aW1lKCZ0KTsKICAgIHV0LnV0X3RpbWUgPSB0OwogICAgdXQudXRfdHlwZSA9IExPR0lOX1BST0NFU1M7CiAgICB1dC51dF9waWQgPSBteXBpZDsKCiAgICBwdXR1dGxpbmUoJnV0KTsKICAgIGVuZHV0ZW50KCk7CgogICAgewojaWZkZWYgSEFWRV9VUERXVE1QCgl1cGR3dG1wKF9QQVRIX1dUTVAsICZ1dCk7CiNlbHNlCglpbnQgdXRfZmQ7CglpbnQgbGY7CgoJaWYgKChsZiA9IG9wZW4oX1BBVEhfV1RNUExPQ0ssIE9fQ1JFQVR8T19XUk9OTFksIDA2NjApKSA+PSAwKSB7CgkgICAgZmxvY2sobGYsIExPQ0tfRVgpOwoJICAgIGlmICgodXRfZmQgPSBvcGVuKF9QQVRIX1dUTVAsIE9fQVBQRU5EfE9fV1JPTkxZKSkgPj0gMCkgewoJCXdyaXRlKHV0X2ZkLCAmdXQsIHNpemVvZih1dCkpOwoJCWNsb3NlKHV0X2ZkKTsKCSAgICB9CgkgICAgZmxvY2sobGYsIExPQ0tfVU4pOwoJICAgIGNsb3NlKGxmKTsKCX0KI2VuZGlmCiAgICB9Cn0KCiNlbmRpZgoKLyogb3Blbl90dHkgLSBzZXQgdXAgdHR5IGFzIHN0YW5kYXJkIHsgaW5wdXQsIG91dHB1dCwgZXJyb3IgfSAqLwp2b2lkCm9wZW5fdHR5KHR0eSwgdHAsIGxvY2FsKQogICAgIGNoYXIgICAqdHR5OwogICAgIHN0cnVjdCB0ZXJtaW9zICp0cDsKICAgICBpbnQgICAgbG9jYWw7CnsKICAgIC8qIEdldCByaWQgb2YgdGhlIHByZXNlbnQgc3RhbmRhcmQgeyBvdXRwdXQsIGVycm9yfSBpZiBhbnkuICovCgogICAgKHZvaWQpIGNsb3NlKDEpOwogICAgKHZvaWQpIGNsb3NlKDIpOwogICAgZXJybm8gPSAwOwkJCQkJLyogaWdub3JlIGFib3ZlIGVycm9ycyAqLwoKICAgIC8qIFNldCB1cCBuZXcgc3RhbmRhcmQgaW5wdXQsIHVubGVzcyB3ZSBhcmUgZ2l2ZW4gYW4gYWxyZWFkeSBvcGVuZWQgcG9ydC4gKi8KCiAgICBpZiAoc3RyY21wKHR0eSwgIi0iKSkgewoJc3RydWN0IHN0YXQgc3Q7CgoJLyogU2FuaXR5IGNoZWNrcy4uLiAqLwoKCWlmIChjaGRpcigiL2RldiIpKQoJICAgIGVycm9yKF8oIi9kZXY6IGNoZGlyKCkgZmFpbGVkOiAlbSIpKTsKCWlmIChzdGF0KHR0eSwgJnN0KSA8IDApCgkgICAgZXJyb3IoIi9kZXYvJXM6ICVtIiwgdHR5KTsKCWlmICgoc3Quc3RfbW9kZSAmIFNfSUZNVCkgIT0gU19JRkNIUikKCSAgICBlcnJvcihfKCIvZGV2LyVzOiBub3QgYSBjaGFyYWN0ZXIgZGV2aWNlIiksIHR0eSk7CgoJLyogT3BlbiB0aGUgdHR5IGFzIHN0YW5kYXJkIGlucHV0LiAqLwoKCSh2b2lkKSBjbG9zZSgwKTsKCWVycm5vID0gMDsJCQkJLyogaWdub3JlIGNsb3NlKDIpIGVycm9ycyAqLwoKCWRlYnVnKCJvcGVuKDIpXG4iKTsKCWlmIChvcGVuKHR0eSwgT19SRFdSfE9fTk9OQkxPQ0ssIDApICE9IDApCgkgICAgZXJyb3IoXygiL2Rldi8lczogY2Fubm90IG9wZW4gYXMgc3RhbmRhcmQgaW5wdXQ6ICVtIiksIHR0eSk7CgogICAgfSBlbHNlIHsKCgkvKgoJICogU3RhbmRhcmQgaW5wdXQgc2hvdWxkIGFscmVhZHkgYmUgY29ubmVjdGVkIHRvIGFuIG9wZW4gcG9ydC4gTWFrZQoJICogc3VyZSBpdCBpcyBvcGVuIGZvciByZWFkL3dyaXRlLgoJICovCgoJaWYgKChmY250bCgwLCBGX0dFVEZMLCAwKSAmIE9fUkRXUikgIT0gT19SRFdSKQoJICAgIGVycm9yKF8oIiVzOiBub3Qgb3BlbiBmb3IgcmVhZC93cml0ZSIpLCB0dHkpOwogICAgfQoKICAgIC8qIFNldCB1cCBzdGFuZGFyZCBvdXRwdXQgYW5kIHN0YW5kYXJkIGVycm9yIGZpbGUgZGVzY3JpcHRvcnMuICovCiAgICBkZWJ1ZygiZHVwaW5nXG4iKTsKICAgIGlmIChkdXAoMCkgIT0gMSB8fCBkdXAoMCkgIT0gMikJCS8qIHNldCB1cCBzdGRvdXQgYW5kIHN0ZGVyciAqLwoJZXJyb3IoXygiJXM6IGR1cCBwcm9ibGVtOiAlbSIpLCB0dHkpOwkvKiB3ZSBoYXZlIGEgcHJvYmxlbSAqLwoKICAgIC8qCiAgICAgKiBUaGUgZm9sbG93aW5nIGlvY3RsIHdpbGwgZmFpbCBpZiBzdGRpbiBpcyBub3QgYSB0dHksIGJ1dCBhbHNvIHdoZW4KICAgICAqIHRoZXJlIGlzIG5vaXNlIG9uIHRoZSBtb2RlbSBjb250cm9sIGxpbmVzLiBJbiB0aGUgbGF0dGVyIGNhc2UsIHRoZQogICAgICogY29tbW9uIGNvdXJzZSBvZiBhY3Rpb24gaXMgKDEpIGZpeCB5b3VyIGNhYmxlcyAoMikgZ2l2ZSB0aGUgbW9kZW0gbW9yZQogICAgICogdGltZSB0byBwcm9wZXJseSByZXNldCBhZnRlciBoYW5naW5nIHVwLiBTdW5PUyB1c2VycyBjYW4gYWNoaWV2ZSAoMikKICAgICAqIGJ5IHBhdGNoaW5nIHRoZSBTdW5PUyBrZXJuZWwgdmFyaWFibGUgInpzYWR0cmxvdyIgdG8gYSBsYXJnZXIgdmFsdWU7CiAgICAgKiA1IHNlY29uZHMgc2VlbXMgdG8gYmUgYSBnb29kIHZhbHVlLgogICAgICovCgogICAgaWYgKHRjZ2V0YXR0cigwLCB0cCkgPCAwKQoJZXJyb3IoIiVzOiB0Y2dldGF0dHI6ICVtIiwgdHR5KTsKCiAgICAvKgogICAgICogSXQgc2VlbXMgdG8gYmUgYSB0ZXJtaW5hbC4gU2V0IHByb3BlciBwcm90ZWN0aW9ucyBhbmQgb3duZXJzaGlwLiBNb2RlCiAgICAgKiAwNjIyIGlzIHN1aXRhYmxlIGZvciBTWVNWIDw0IGJlY2F1c2UgL2Jpbi9sb2dpbiBkb2VzIG5vdCBjaGFuZ2UKICAgICAqIHByb3RlY3Rpb25zLiBTdW5PUyA0IGxvZ2luIHdpbGwgY2hhbmdlIHRoZSBwcm90ZWN0aW9ucyB0byAwNjIwICh3cml0ZQogICAgICogYWNjZXNzIGZvciBncm91cCB0dHkpIGFmdGVyIHRoZSBsb2dpbiBoYXMgc3VjY2VlZGVkLgogICAgICovCgogICAgLyoKICAgICAqIExldCB1cyB1c2UgMDYwMCBmb3IgTGludXggZm9yIHRoZSBwZXJpb2QgYmV0d2VlbiBnZXR0eSBhbmQgbG9naW4KICAgICAqLwoKICAgICh2b2lkKSBjaG93bih0dHksIDAsIDApOwkJCS8qIHJvb3QsIHN5cyAqLwogICAgKHZvaWQpIGNobW9kKHR0eSwgMDYwMCk7CQkJLyogMDYyMjogY3J3LS13LS13LSAqLwogICAgZXJybm8gPSAwOwkJCQkJLyogaWdub3JlIGFib3ZlIGVycm9ycyAqLwp9CgovKiB0ZXJtaW9faW5pdCAtIGluaXRpYWxpemUgdGVybWlvcyBzZXR0aW5ncyAqLwoKY2hhciBnYnVmWzEwMjRdOwpjaGFyIGFyZWFbMTAyNF07Cgp2b2lkCnRlcm1pb19pbml0KHRwLCBzcGVlZCwgb3ApCiAgICAgc3RydWN0IHRlcm1pb3MgKnRwOwogICAgIGludCAgICAgc3BlZWQ7CiAgICAgc3RydWN0IG9wdGlvbnMgKm9wOwp7CgogICAgLyoKICAgICAqIEluaXRpYWwgdGVybWlvcyBzZXR0aW5nczogOC1iaXQgY2hhcmFjdGVycywgcmF3LW1vZGUsIGJsb2NraW5nIGkvby4KICAgICAqIFNwZWNpYWwgY2hhcmFjdGVycyBhcmUgc2V0IGFmdGVyIHdlIGhhdmUgcmVhZCB0aGUgbG9naW4gbmFtZTsgYWxsCiAgICAgKiByZWFkcyB3aWxsIGJlIGRvbmUgaW4gcmF3IG1vZGUgYW55d2F5LiBFcnJvcnMgd2lsbCBiZSBkZWFsdCB3aXRoCiAgICAgKiBsYXRlcm9uLgogICAgICovCiAgICAvKiBmbHVzaCBpbnB1dCBhbmQgb3V0cHV0IHF1ZXVlcywgaW1wb3J0YW50IGZvciBtb2RlbXMhICovCiAgICAodm9pZCkgdGNmbHVzaCgwLCBUQ0lPRkxVU0gpOwoKICAgIHRwLT5jX2NmbGFnID0gQ1M4IHwgSFVQQ0wgfCBDUkVBRDsKICAgIGNmc2V0aXNwZWVkKHRwLCBzcGVlZCk7CiAgICBjZnNldG9zcGVlZCh0cCwgc3BlZWQpOwogICAgaWYgKG9wLT5mbGFncyAmIEZfTE9DQUwpIHsKCXRwLT5jX2NmbGFnIHw9IENMT0NBTDsKICAgIH0KCiAgICB0cC0+Y19pZmxhZyA9IHRwLT5jX2xmbGFnID0gdHAtPmNfb2ZsYWcgPSAwOwojaWZkZWYgSEFWRV9TVFJVQ1RfVEVSTUlPU19DX0xJTkUKICAgIHRwLT5jX2xpbmUgPSAwOwojZW5kaWYKICAgIHRwLT5jX2NjW1ZNSU5dID0gMTsKICAgIHRwLT5jX2NjW1ZUSU1FXSA9IDA7CgogICAgLyogT3B0aW9uYWxseSBlbmFibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sICovCgojaWZkZWYJQ1JUU0NUUwogICAgaWYgKG9wLT5mbGFncyAmIEZfUlRTQ1RTKQoJdHAtPmNfY2ZsYWcgfD0gQ1JUU0NUUzsKI2VuZGlmCgogICAgKHZvaWQpIHRjc2V0YXR0cigwLCBUQ1NBTk9XLCB0cCk7CgogICAgLyogZ28gdG8gYmxvY2tpbmcgaW5wdXQgZXZlbiBpbiBsb2NhbCBtb2RlICovCiAgICBmY250bCgwLCBGX1NFVEZMLCBmY250bCgwLCBGX0dFVEZMLCAwKSAmIH5PX05PTkJMT0NLKTsKCiAgICBkZWJ1ZygidGVybV9pbyAyXG4iKTsKfQoKLyogYXV0b19iYXVkIC0gZXh0cmFjdCBiYXVkIHJhdGUgZnJvbSBtb2RlbSBzdGF0dXMgbWVzc2FnZSAqLwp2b2lkCmF1dG9fYmF1ZCh0cCkKICAgICBzdHJ1Y3QgdGVybWlvcyAqdHA7CnsKICAgIGludCAgICAgc3BlZWQ7CiAgICBpbnQgICAgIHZtaW47CiAgICB1bnNpZ25lZCBpZmxhZzsKICAgIGNoYXIgICAgYnVmW0JVRlNJWl07CiAgICBjaGFyICAgKmJwOwogICAgaW50ICAgICBucmVhZDsKCiAgICAvKgogICAgICogVGhpcyB3b3JrcyBvbmx5IGlmIHRoZSBtb2RlbSBwcm9kdWNlcyBpdHMgc3RhdHVzIGNvZGUgQUZURVIgcmFpc2luZwogICAgICogdGhlIERDRCBsaW5lLCBhbmQgaWYgdGhlIGNvbXB1dGVyIGlzIGZhc3QgZW5vdWdoIHRvIHNldCB0aGUgcHJvcGVyCiAgICAgKiBiYXVkIHJhdGUgYmVmb3JlIHRoZSBtZXNzYWdlIGhhcyBnb25lIGJ5LiBXZSBleHBlY3QgYSBtZXNzYWdlIG9mIHRoZQogICAgICogZm9sbG93aW5nIGZvcm1hdDoKICAgICAqIAogICAgICogPGp1bms+PG51bWJlcj48anVuaz4KICAgICAqIAogICAgICogVGhlIG51bWJlciBpcyBpbnRlcnByZXRlZCBhcyB0aGUgYmF1ZCByYXRlIG9mIHRoZSBpbmNvbWluZyBjYWxsLiBJZiB0aGUKICAgICAqIG1vZGVtIGRvZXMgbm90IHRlbGwgdXMgdGhlIGJhdWQgcmF0ZSB3aXRoaW4gb25lIHNlY29uZCwgd2Ugd2lsbCBrZWVwCiAgICAgKiB1c2luZyB0aGUgY3VycmVudCBiYXVkIHJhdGUuIEl0IGlzIGFkdmlzYWJsZSB0byBlbmFibGUgQlJFQUsKICAgICAqIHByb2Nlc3NpbmcgKGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGJhdWQgcmF0ZXMpIGlmIHRoZSBwcm9jZXNzaW5nIG9mCiAgICAgKiBtb2RlbSBzdGF0dXMgbWVzc2FnZXMgaXMgZW5hYmxlZC4KICAgICAqLwoKICAgIC8qCiAgICAgKiBVc2UgNy1iaXQgY2hhcmFjdGVycywgZG9uJ3QgYmxvY2sgaWYgaW5wdXQgcXVldWUgaXMgZW1wdHkuIEVycm9ycyB3aWxsCiAgICAgKiBiZSBkZWFsdCB3aXRoIGxhdGVyb24uCiAgICAgKi8KCiAgICBpZmxhZyA9IHRwLT5jX2lmbGFnOwogICAgdHAtPmNfaWZsYWcgfD0gSVNUUklQOwkJCS8qIGVuYWJsZSA4dGgtYml0IHN0cmlwcGluZyAqLwogICAgdm1pbiA9IHRwLT5jX2NjW1ZNSU5dOwogICAgdHAtPmNfY2NbVk1JTl0gPSAwOwkJCQkvKiBkb24ndCBibG9jayBpZiBxdWV1ZSBlbXB0eSAqLwogICAgdGNzZXRhdHRyKDAsIFRDU0FOT1csIHRwKTsKCiAgICAvKgogICAgICogV2FpdCBmb3IgYSB3aGlsZSwgdGhlbiByZWFkIGV2ZXJ5dGhpbmcgdGhlIG1vZGVtIGhhcyBzYWlkIHNvIGZhciBhbmQKICAgICAqIHRyeSB0byBleHRyYWN0IHRoZSBzcGVlZCBvZiB0aGUgZGlhbC1pbiBjYWxsLgogICAgICovCgogICAgKHZvaWQpIHNsZWVwKDEpOwogICAgaWYgKChucmVhZCA9IHJlYWQoMCwgYnVmLCBzaXplb2YoYnVmKSAtIDEpKSA+IDApIHsKCWJ1ZltucmVhZF0gPSAnXDAnOwoJZm9yIChicCA9IGJ1ZjsgYnAgPCBidWYgKyBucmVhZDsgYnArKykgewoJICAgIGlmIChpc2FzY2lpKCpicCkgJiYgaXNkaWdpdCgqYnApKSB7CgkJaWYgKChzcGVlZCA9IGJjb2RlKGJwKSkpIHsKCQkgICAgY2ZzZXRpc3BlZWQodHAsIHNwZWVkKTsKCQkgICAgY2ZzZXRvc3BlZWQodHAsIHNwZWVkKTsKCQl9CgkJYnJlYWs7CgkgICAgfQoJfQogICAgfQogICAgLyogUmVzdG9yZSB0ZXJtaW5hbCBzZXR0aW5ncy4gRXJyb3JzIHdpbGwgYmUgZGVhbHQgd2l0aCBsYXRlcm9uLiAqLwoKICAgIHRwLT5jX2lmbGFnID0gaWZsYWc7CiAgICB0cC0+Y19jY1tWTUlOXSA9IHZtaW47CiAgICAodm9pZCkgdGNzZXRhdHRyKDAsIFRDU0FOT1csIHRwKTsKfQoKLyogZG9fcHJvbXB0IC0gc2hvdyBsb2dpbiBwcm9tcHQsIG9wdGlvbmFsbHkgcHJlY2VkZWQgYnkgL2V0Yy9pc3N1ZSBjb250ZW50cyAqLwp2b2lkCmRvX3Byb21wdChvcCwgdHApCiAgICAgc3RydWN0IG9wdGlvbnMgKm9wOwogICAgIHN0cnVjdCB0ZXJtaW9zICp0cDsKewojaWZkZWYJSVNTVUUKICAgIEZJTEUgICAgKmZkOwogICAgaW50ICAgICBvZmxhZzsKICAgIGludCAgICAgYzsKICAgIHN0cnVjdCB1dHNuYW1lIHV0czsKCiAgICAodm9pZCkgdW5hbWUoJnV0cyk7CiNlbmRpZgoKICAgICh2b2lkKSB3cml0ZSgxLCAiXHJcbiIsIDIpOwkJCS8qIHN0YXJ0IGEgbmV3IGxpbmUgKi8KI2lmZGVmCUlTU1VFCQkJCQkvKiBvcHRpb25hbDogc2hvdyAvZXRjL2lzc3VlICovCiAgICBpZiAoKG9wLT5mbGFncyAmIEZfSVNTVUUpICYmIChmZCA9IGZvcGVuKG9wLT5pc3N1ZSwgInIiKSkpIHsKCW9mbGFnID0gdHAtPmNfb2ZsYWc7CQkJLyogc2F2ZSBjdXJyZW50IHNldHRpbmcgKi8KCXRwLT5jX29mbGFnIHw9IChPTkxDUiB8IE9QT1NUKTsJCS8qIG1hcCBOTCBpbiBvdXRwdXQgdG8gQ1ItTkwgKi8KCSh2b2lkKSB0Y3NldGF0dHIoMCwgVENTQURSQUlOLCB0cCk7CgoKCXdoaWxlICgoYyA9IGdldGMoZmQpKSAhPSBFT0YpCgl7CgkgICAgaWYgKGMgPT0gJ1xcJykKCSAgICAgIHsKCQljID0gZ2V0YyhmZCk7CgkJCgkJc3dpdGNoIChjKQoJCSAgewoJCSAgY2FzZSAncyc6CgkJICAgICh2b2lkKSBwcmludGYgKCIlcyIsIHV0cy5zeXNuYW1lKTsKCQkgICAgYnJlYWs7CgkJICAgIAoJCSAgY2FzZSAnbic6CgkJICAgICh2b2lkKSBwcmludGYgKCIlcyIsIHV0cy5ub2RlbmFtZSk7CgkJICAgIGJyZWFrOwoJCSAgICAKCQkgIGNhc2UgJ3InOgoJCSAgICAodm9pZCkgcHJpbnRmICgiJXMiLCB1dHMucmVsZWFzZSk7CgkJICAgIGJyZWFrOwoJCSAgICAKCQkgIGNhc2UgJ3YnOgoJCSAgICAodm9pZCkgcHJpbnRmICgiJXMiLCB1dHMudmVyc2lvbik7CgkJICAgIGJyZWFrOwoJCSAgICAKCQkgIGNhc2UgJ20nOgoJCSAgICAodm9pZCkgcHJpbnRmICgiJXMiLCB1dHMubWFjaGluZSk7CgkJICAgIGJyZWFrOwoKCQkgIGNhc2UgJ28nOgoJCSAgIHsKCQkgICAgIGNoYXIgZG9tYWlubmFtZVtNQVhIT1NUTkFNRUxFTisxXTsKI2lmZGVmIEhBVkVfR0VURE9NQUlOTkFNRQoJCSAgICAgaWYgKGdldGRvbWFpbm5hbWUoZG9tYWlubmFtZSwgc2l6ZW9mKGRvbWFpbm5hbWUpKSkKI2VuZGlmCgkJCSBzdHJjcHkoZG9tYWlubmFtZSwgInVua25vd25fZG9tYWluIik7CgkJICAgICBkb21haW5uYW1lW3NpemVvZihkb21haW5uYW1lKS0xXSA9ICdcMCc7CgkJICAgICBwcmludGYgKCIlcyIsIGRvbWFpbm5hbWUpOwoJCSAgIH0KCQkgIGJyZWFrOwoKCQkgIGNhc2UgJ08nOgoJCSAgIHsKCQkJY2hhciAqZG9tID0gInVua25vd25fZG9tYWluIjsKCQkJY2hhciBob3N0W01BWEhPU1ROQU1FTEVOKzFdOwoJCQlzdHJ1Y3QgYWRkcmluZm8gaGludHMsICppbmZvID0gTlVMTDsKCgkJCW1lbXNldCgmaGludHMsIDAsIHNpemVvZihoaW50cykpOwoJCQloaW50cy5haV9mbGFncyA9IEFJX0NBTk9OTkFNRTsKCgkJCWlmIChnZXRob3N0bmFtZShob3N0LCBzaXplb2YoaG9zdCkpIHx8CgkJCSAgICBnZXRhZGRyaW5mbyhob3N0LCBOVUxMLCAmaGludHMsICZpbmZvKSB8fAoJCQkgICAgaW5mbyA9PSBOVUxMKQoJCQkJZnB1dHMoZG9tLCBzdGRvdXQpOwoJCQllbHNlIHsKCQkJCWNoYXIgKmNhbm9uOwoKCQkJCWlmIChpbmZvLT5haV9jYW5vbm5hbWUgJiYKCQkJCSAgICAoY2Fub24gPSBzdHJjaHIoaW5mby0+YWlfY2Fub25uYW1lLCAnLicpKSkKCQkJCQlkb20gPSBjYW5vbiArIDE7CgkJCQlmcHV0cyhkb20sIHN0ZG91dCk7CgkJCQlmcmVlYWRkcmluZm8oaW5mbyk7CgkJCX0KCQkgICB9CgkJICBicmVhazsKCgkJICBjYXNlICdkJzoKCQkgIGNhc2UgJ3QnOgoJCSAgICB7CgkJICAgICAgLyogVE9ETzogdXNlIG5sX2xhbmdpbmZvKCkgKi8KCQkgICAgICBjaGFyICp3ZWVrZGF5W10gPSB7ICJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwKCQkJCQkgICJGcmkiLCAiU2F0IiB9OwoJCSAgICAgIGNoYXIgKm1vbnRoW10gPSB7ICJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwKCQkJCQkiSnVuIiwgIkp1bCIsICJBdWciLCAiU2VwIiwgIk9jdCIsCgkJCQkJIk5vdiIsICJEZWMiIH07CgkJICAgICAgdGltZV90IG5vdzsKCQkgICAgICBzdHJ1Y3QgdG0gKnRtOwoKCQkgICAgICAodm9pZCkgdGltZSAoJm5vdyk7CgkJICAgICAgdG0gPSBsb2NhbHRpbWUoJm5vdyk7CgoJCSAgICAgIGlmIChjID09ICdkJykKCQkJKHZvaWQpIHByaW50ZiAoIiVzICVzICVkICAlZCIsCgkJCQl3ZWVrZGF5W3RtLT50bV93ZGF5XSwgbW9udGhbdG0tPnRtX21vbl0sCgkJCQl0bS0+dG1fbWRheSwgCgkJCQl0bS0+dG1feWVhciA8IDcwID8gdG0tPnRtX3llYXIgKyAyMDAwIDoKCQkJCXRtLT50bV95ZWFyICsgMTkwMCk7CgkJICAgICAgZWxzZQoJCQkodm9pZCkgcHJpbnRmICgiJTAyZDolMDJkOiUwMmQiLAoJCQkJdG0tPnRtX2hvdXIsIHRtLT50bV9taW4sIHRtLT50bV9zZWMpOwoJCSAgICAgIAoJCSAgICAgIGJyZWFrOwoJCSAgICB9CgoJCSAgY2FzZSAnbCc6CgkJICAgICAgKHZvaWQpIHByaW50ZiAoIiVzIiwgb3AtPnR0eSk7CgkJICAgICAgYnJlYWs7CgoJCSAgY2FzZSAnYic6CgkJICAgIHsKCQkJaW50IGk7CgoJCQlmb3IgKGkgPSAwOyBzcGVlZHRhYltpXS5zcGVlZDsgaSsrKSB7CgkJCSAgICBpZiAoc3BlZWR0YWJbaV0uY29kZSA9PSBjZmdldGlzcGVlZCh0cCkpIHsKCQkJCXByaW50ZigiJWxkIiwgc3BlZWR0YWJbaV0uc3BlZWQpOwoJCQkJYnJlYWs7CgkJCSAgICB9CgkJCX0KCQkJYnJlYWs7CgkJICAgIH0KCQkgIGNhc2UgJ3UnOgoJCSAgY2FzZSAnVSc6CgkJICAgIHsKCQkgICAgICBpbnQgdXNlcnMgPSAwOwoJCSAgICAgIHN0cnVjdCB1dG1wICp1dDsKCQkgICAgICBzZXR1dGVudCgpOwoJCSAgICAgIHdoaWxlICgodXQgPSBnZXR1dGVudCgpKSkKCQkgICAgICAgIGlmICh1dC0+dXRfdHlwZSA9PSBVU0VSX1BST0NFU1MpCgkJCSAgdXNlcnMrKzsKCQkgICAgICBlbmR1dGVudCgpOwoJCSAgICAgIHByaW50ZiAoIiVkICIsIHVzZXJzKTsKCQkgICAgICBpZiAoYyA9PSAnVScpCgkJICAgICAgICBwcmludGYgKCh1c2VycyA9PSAxKSA/IF8oInVzZXIiKSA6IF8oInVzZXJzIikpOwoJCSAgICAgIGJyZWFrOwoJCSAgICB9CgkJICBkZWZhdWx0OgoJCSAgICAodm9pZCkgcHV0Y2hhcihjKTsKCQkgIH0KCSAgICAgIH0KCSAgICBlbHNlCgkgICAgICAodm9pZCkgcHV0Y2hhcihjKTsKCX0KCWZmbHVzaChzdGRvdXQpOwoKCXRwLT5jX29mbGFnID0gb2ZsYWc7CQkJLyogcmVzdG9yZSBzZXR0aW5ncyAqLwoJKHZvaWQpIHRjc2V0YXR0cigwLCBUQ1NBRFJBSU4sIHRwKTsJLyogd2FpdCB0aWxsIG91dHB1dCBpcyBnb25lICovCgkodm9pZCkgZmNsb3NlKGZkKTsKICAgIH0KI2VuZGlmCiAgICB7CgljaGFyIGhuW01BWEhPU1ROQU1FTEVOKzFdOwoJaWYgKGdldGhvc3RuYW1lKGhuLCBzaXplb2YoaG4pKSA9PSAwKQoJICAgIHdyaXRlKDEsIGhuLCBzdHJsZW4oaG4pKTsKICAgIH0KICAgICh2b2lkKSB3cml0ZSgxLCBMT0dJTiwgc2l6ZW9mKExPR0lOKSAtIDEpOwkvKiBhbHdheXMgc2hvdyBsb2dpbiBwcm9tcHQgKi8KfQoKLyogbmV4dF9zcGVlZCAtIHNlbGVjdCBuZXh0IGJhdWQgcmF0ZSAqLwp2b2lkCm5leHRfc3BlZWQodHAsIG9wKQogICAgIHN0cnVjdCB0ZXJtaW9zICp0cDsKICAgICBzdHJ1Y3Qgb3B0aW9ucyAqb3A7CnsKICAgIHN0YXRpYyBpbnQgYmF1ZF9pbmRleCA9IEZJUlNUX1NQRUVEOy8qIGN1cnJlbnQgc3BlZWQgaW5kZXggKi8KCiAgICBiYXVkX2luZGV4ID0gKGJhdWRfaW5kZXggKyAxKSAlIG9wLT5udW1zcGVlZDsKICAgIGNmc2V0aXNwZWVkKHRwLCBvcC0+c3BlZWRzW2JhdWRfaW5kZXhdKTsKICAgIGNmc2V0b3NwZWVkKHRwLCBvcC0+c3BlZWRzW2JhdWRfaW5kZXhdKTsKICAgICh2b2lkKSB0Y3NldGF0dHIoMCwgVENTQU5PVywgdHApOwp9CgovKiBnZXRfbG9nbmFtZSAtIGdldCB1c2VyIG5hbWUsIGVzdGFibGlzaCBwYXJpdHksIHNwZWVkLCBlcmFzZSwga2lsbCwgZW9sICovCgpjaGFyICAgKmdldF9sb2duYW1lKG9wLCBjcCwgdHApCiAgICAgc3RydWN0IG9wdGlvbnMgKm9wOwogICAgIHN0cnVjdCBjaGFyZGF0YSAqY3A7CiAgICAgc3RydWN0IHRlcm1pb3MgKnRwOwp7CiAgICBzdGF0aWMgY2hhciBsb2duYW1lW0JVRlNJWl07CiAgICBjaGFyICAgKmJwOwogICAgY2hhciAgICBjOwkJCQkvKiBpbnB1dCBjaGFyYWN0ZXIsIGZ1bGwgZWlnaHQgYml0cyAqLwogICAgY2hhciAgICBhc2N2YWw7CQkJLyogbG93IDcgYml0cyBvZiBpbnB1dCBjaGFyYWN0ZXIgKi8KICAgIGludCAgICAgYml0czsJCQkvKiAjIG9mICIxIiBiaXRzIHBlciBjaGFyYWN0ZXIgKi8KICAgIGludCAgICAgbWFzazsJCQkvKiBtYXNrIHdpdGggMSBiaXQgdXAgKi8KICAgIHN0YXRpYyBjaGFyICplcmFzZVtdID0gewkJLyogYmFja3NwYWNlLXNwYWNlLWJhY2tzcGFjZSAqLwoJIlwwMTBcMDQwXDAxMCIsCQkJLyogc3BhY2UgcGFyaXR5ICovCgkiXDAxMFwwNDBcMDEwIiwJCQkvKiBvZGQgcGFyaXR5ICovCgkiXDIxMFwyNDBcMjEwIiwJCQkvKiBldmVuIHBhcml0eSAqLwoJIlwyMTBcMjQwXDIxMCIsCQkJLyogbm8gcGFyaXR5ICovCiAgICB9OwoKICAgIC8qIEluaXRpYWxpemUga2lsbCwgZXJhc2UsIHBhcml0eSBldGMuIChhbHNvIGFmdGVyIHN3aXRjaGluZyBzcGVlZHMpLiAqLwoKICAgICpjcCA9IGluaXRfY2hhcmRhdGE7CgogICAgLyogRmx1c2ggcGVuZGluZyBpbnB1dCAoZXNwLiBhZnRlciBwYXJzaW5nIG9yIHN3aXRjaGluZyB0aGUgYmF1ZCByYXRlKS4gKi8KCiAgICAodm9pZCkgc2xlZXAoMSk7CiAgICAodm9pZCkgdGNmbHVzaCgwLCBUQ0lGTFVTSCk7CgogICAgLyogUHJvbXB0IGZvciBhbmQgcmVhZCBhIGxvZ2luIG5hbWUuICovCgogICAgZm9yICgqbG9nbmFtZSA9IDA7ICpsb2duYW1lID09IDA7IC8qIHZvaWQgKi8gKSB7CgoJLyogV3JpdGUgaXNzdWUgZmlsZSBhbmQgcHJvbXB0LCB3aXRoICJwYXJpdHkiIGJpdCA9PSAwLiAqLwoKCWRvX3Byb21wdChvcCwgdHApOwoKCS8qIFJlYWQgbmFtZSwgd2F0Y2ggZm9yIGJyZWFrLCBwYXJpdHksIGVyYXNlLCBraWxsLCBlbmQtb2YtbGluZS4gKi8KCglmb3IgKGJwID0gbG9nbmFtZSwgY3AtPmVvbCA9IDA7IGNwLT5lb2wgPT0gMDsgLyogdm9pZCAqLyApIHsKCgkgICAgLyogRG8gbm90IHJlcG9ydCB0cml2aWFsIEVJTlRSL0VJTyBlcnJvcnMuICovCgoJICAgIGlmIChyZWFkKDAsICZjLCAxKSA8IDEpIHsKCQlpZiAoZXJybm8gPT0gRUlOVFIgfHwgZXJybm8gPT0gRUlPKQoJCSAgICBleGl0KDApOwoJCWVycm9yKF8oIiVzOiByZWFkOiAlbSIpLCBvcC0+dHR5KTsKCSAgICB9CgkgICAgLyogRG8gQlJFQUsgaGFuZGxpbmcgZWxzZXdoZXJlLiAqLwoKCSAgICBpZiAoKGMgPT0gMCkgJiYgb3AtPm51bXNwZWVkID4gMSkKCQlyZXR1cm4gKDApOwoJICAgIC8qIERvIHBhcml0eSBiaXQgaGFuZGxpbmcuICovCgoJICAgIGlmIChvcC0+ZWlnaHRiaXRzKSB7CgkJYXNjdmFsID0gYzsKCSAgICB9IGVsc2UgaWYgKGMgIT0gKGFzY3ZhbCA9IChjICYgMDE3NykpKSB7CS8qICJwYXJpdHkiIGJpdCBvbiAqLwoJCWZvciAoYml0cyA9IDEsIG1hc2sgPSAxOyBtYXNrICYgMDE3NzsgbWFzayA8PD0gMSkKCQkgICAgaWYgKG1hc2sgJiBhc2N2YWwpCgkJCWJpdHMrKzsJCQkvKiBjb3VudCAiMSIgYml0cyAqLwoJCWNwLT5wYXJpdHkgfD0gKChiaXRzICYgMSkgPyAxIDogMik7CgkgICAgfQoJICAgIC8qIERvIGVyYXNlLCBraWxsIGFuZCBlbmQtb2YtbGluZSBwcm9jZXNzaW5nLiAqLwoKCSAgICBzd2l0Y2ggKGFzY3ZhbCkgewoJICAgIGNhc2UgQ1I6CgkgICAgY2FzZSBOTDoKCQkqYnAgPSAwOwkJCS8qIHRlcm1pbmF0ZSBsb2duYW1lICovCgkJY3AtPmVvbCA9IGFzY3ZhbDsJCS8qIHNldCBlbmQtb2YtbGluZSBjaGFyICovCgkJYnJlYWs7CgkgICAgY2FzZSBCUzoKCSAgICBjYXNlIERFTDoKCSAgICBjYXNlICcjJzoKCQljcC0+ZXJhc2UgPSBhc2N2YWw7CQkvKiBzZXQgZXJhc2UgY2hhcmFjdGVyICovCgkJaWYgKGJwID4gbG9nbmFtZSkgewoJCSAgICAodm9pZCkgd3JpdGUoMSwgZXJhc2VbY3AtPnBhcml0eV0sIDMpOwoJCSAgICBicC0tOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIENUTCgnVScpOgoJICAgIGNhc2UgJ0AnOgoJCWNwLT5raWxsID0gYXNjdmFsOwkJLyogc2V0IGtpbGwgY2hhcmFjdGVyICovCgkJd2hpbGUgKGJwID4gbG9nbmFtZSkgewoJCSAgICAodm9pZCkgd3JpdGUoMSwgZXJhc2VbY3AtPnBhcml0eV0sIDMpOwoJCSAgICBicC0tOwoJCX0KCQlicmVhazsKCSAgICBjYXNlIENUTCgnRCcpOgoJCWV4aXQoMCk7CgkgICAgZGVmYXVsdDoKCQlpZiAoIWlzYXNjaWkoYXNjdmFsKSB8fCAhaXNwcmludChhc2N2YWwpKSB7CgkJICAgICAvKiBpZ25vcmUgZ2FyYmFnZSBjaGFyYWN0ZXJzICovIDsKCQl9IGVsc2UgaWYgKGJwIC0gbG9nbmFtZSA+PSBzaXplb2YobG9nbmFtZSkgLSAxKSB7CgkJICAgIGVycm9yKF8oIiVzOiBpbnB1dCBvdmVycnVuIiksIG9wLT50dHkpOwoJCX0gZWxzZSB7CgkJICAgICh2b2lkKSB3cml0ZSgxLCAmYywgMSk7CS8qIGVjaG8gdGhlIGNoYXJhY3RlciAqLwoJCSAgICAqYnArKyA9IGFzY3ZhbDsJCS8qIGFuZCBzdG9yZSBpdCAqLwoJCX0KCQlicmVhazsKCSAgICB9Cgl9CiAgICB9CiAgICAvKiBIYW5kbGUgbmFtZXMgd2l0aCB1cHBlciBjYXNlIGFuZCBubyBsb3dlciBjYXNlLiAqLwogICAgaWYgKChvcC0+ZmxhZ3MgJiBGX0xDVUMpICYmIChjcC0+Y2Fwc2xvY2sgPSBjYXBzX2xvY2sobG9nbmFtZSkpKSB7Cglmb3IgKGJwID0gbG9nbmFtZTsgKmJwOyBicCsrKQoJICAgIGlmIChpc3VwcGVyKCpicCkpCgkJKmJwID0gdG9sb3dlcigqYnApOwkJLyogbWFwIG5hbWUgdG8gbG93ZXIgY2FzZSAqLwogICAgfQogICAgcmV0dXJuIChsb2duYW1lKTsKfQoKLyogdGVybWlvX2ZpbmFsIC0gc2V0IHRoZSBmaW5hbCB0dHkgbW9kZSBiaXRzICovCnZvaWQKdGVybWlvX2ZpbmFsKG9wLCB0cCwgY3ApCiAgICAgc3RydWN0IG9wdGlvbnMgKm9wOwogICAgIHN0cnVjdCB0ZXJtaW9zICp0cDsKICAgICBzdHJ1Y3QgY2hhcmRhdGEgKmNwOwp7CiAgICAvKiBHZW5lcmFsIHRlcm1pbmFsLWluZGVwZW5kZW50IHN0dWZmLiAqLwoKICAgIHRwLT5jX2lmbGFnIHw9IElYT04gfCBJWE9GRjsJCS8qIDItd2F5IGZsb3cgY29udHJvbCAqLwogICAgdHAtPmNfbGZsYWcgfD0gSUNBTk9OIHwgSVNJRyB8IEVDSE8gfCBFQ0hPRSB8IEVDSE9LfCBFQ0hPS0U7CiAgICAgIC8qIG5vIGxvbmdlcnwgRUNIT0NUTCB8IEVDSE9QUlQqLwogICAgdHAtPmNfb2ZsYWcgfD0gT1BPU1Q7CiAgICAvKiB0cC0+Y19jZmxhZyA9IDA7ICovCiAgICB0cC0+Y19jY1tWSU5UUl0gPSBERUZfSU5UUjsJCQkvKiBkZWZhdWx0IGludGVycnVwdCAqLwogICAgdHAtPmNfY2NbVlFVSVRdID0gREVGX1FVSVQ7CQkJLyogZGVmYXVsdCBxdWl0ICovCiAgICB0cC0+Y19jY1tWRU9GXSA9IERFRl9FT0Y7CQkJLyogZGVmYXVsdCBFT0YgY2hhcmFjdGVyICovCiAgICB0cC0+Y19jY1tWRU9MXSA9IERFRl9FT0w7CiNpZmRlZiBfX2xpbnV4X18KICAgIHRwLT5jX2NjW1ZTV1RDXSA9IERFRl9TV0lUQ0g7CQkvKiBkZWZhdWx0IHN3aXRjaCBjaGFyYWN0ZXIgKi8KI2VsaWYgZGVmaW5lZChWU1dUQ0gpCiAgICB0cC0+Y19jY1tWU1dUQ0hdID0gREVGX1NXSVRDSDsJCS8qIGRlZmF1bHQgc3dpdGNoIGNoYXJhY3RlciAqLwojZW5kaWYKCiAgICAvKiBBY2NvdW50IGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgc2VlbiBpbiBpbnB1dC4gKi8KCiAgICBpZiAoY3AtPmVvbCA9PSBDUikgewoJdHAtPmNfaWZsYWcgfD0gSUNSTkw7CQkJLyogbWFwIENSIGluIGlucHV0IHRvIE5MICovCgl0cC0+Y19vZmxhZyB8PSBPTkxDUjsJCQkvKiBtYXAgTkwgaW4gb3V0cHV0IHRvIENSLU5MICovCiAgICB9CiAgICB0cC0+Y19jY1tWRVJBU0VdID0gY3AtPmVyYXNlOwkJLyogc2V0IGVyYXNlIGNoYXJhY3RlciAqLwogICAgdHAtPmNfY2NbVktJTExdID0gY3AtPmtpbGw7CQkJLyogc2V0IGtpbGwgY2hhcmFjdGVyICovCgogICAgLyogQWNjb3VudCBmb3IgdGhlIHByZXNlbmNlIG9yIGFic2VuY2Ugb2YgcGFyaXR5IGJpdHMgaW4gaW5wdXQuICovCgogICAgc3dpdGNoIChjcC0+cGFyaXR5KSB7CiAgICBjYXNlIDA6CQkJCQkvKiBzcGFjZSAoYWx3YXlzIDApIHBhcml0eSAqLwoJYnJlYWs7CiAgICBjYXNlIDE6CQkJCQkvKiBvZGQgcGFyaXR5ICovCgl0cC0+Y19jZmxhZyB8PSBQQVJPREQ7CgkvKiBGQUxMVEhST1VHSCAqLwogICAgY2FzZSAyOgkJCQkJLyogZXZlbiBwYXJpdHkgKi8KCXRwLT5jX2NmbGFnIHw9IFBBUkVOQjsKCXRwLT5jX2lmbGFnIHw9IElOUENLIHwgSVNUUklQOwoJLyogRkFMTFRIUk9VR0ggKi8KICAgIGNhc2UgKDEgfCAyKToJCQkJLyogbm8gcGFyaXR5IGJpdCAqLwoJdHAtPmNfY2ZsYWcgJj0gfkNTSVpFOwoJdHAtPmNfY2ZsYWcgfD0gQ1M3OwoJYnJlYWs7CiAgICB9CiAgICAvKiBBY2NvdW50IGZvciB1cHBlciBjYXNlIHdpdGhvdXQgbG93ZXIgY2FzZS4gKi8KCiAgICBpZiAoY3AtPmNhcHNsb2NrKSB7CiNpZmRlZiBJVUNMQwoJdHAtPmNfaWZsYWcgfD0gSVVDTEM7CiNlbmRpZgojaWZkZWYgWENBU0UJCgl0cC0+Y19sZmxhZyB8PSBYQ0FTRTsKI2VuZGlmCiNpZmRlZiBPTENVQwoJdHAtPmNfb2ZsYWcgfD0gT0xDVUM7CiNlbmRpZgogICAgfQogICAgLyogT3B0aW9uYWxseSBlbmFibGUgaGFyZHdhcmUgZmxvdyBjb250cm9sICovCgojaWZkZWYJQ1JUU0NUUwogICAgaWYgKG9wLT5mbGFncyAmIEZfUlRTQ1RTKQoJdHAtPmNfY2ZsYWcgfD0gQ1JUU0NUUzsKI2VuZGlmCgogICAgLyogRmluYWxseSwgbWFrZSB0aGUgbmV3IHNldHRpbmdzIGVmZmVjdGl2ZSAqLwoKICAgIGlmICh0Y3NldGF0dHIoMCwgVENTQU5PVywgdHApIDwgMCkKCWVycm9yKCIlczogdGNzZXRhdHRyOiBUQ1NBTk9XOiAlbSIsIG9wLT50dHkpOwp9CgovKiBjYXBzX2xvY2sgLSBzdHJpbmcgY29udGFpbnMgdXBwZXIgY2FzZSB3aXRob3V0IGxvd2VyIGNhc2UgKi8KaW50CmNhcHNfbG9jayhzKQogICAgIGNoYXIgICAqczsKewogICAgaW50ICAgICBjYXBzbG9jazsKCiAgICBmb3IgKGNhcHNsb2NrID0gMDsgKnM7IHMrKykgewoJaWYgKGlzbG93ZXIoKnMpKQoJICAgIHJldHVybiAoMCk7CglpZiAoY2Fwc2xvY2sgPT0gMCkKCSAgICBjYXBzbG9jayA9IGlzdXBwZXIoKnMpOwogICAgfQogICAgcmV0dXJuIChjYXBzbG9jayk7Cn0KCi8qIGJjb2RlIC0gY29udmVydCBzcGVlZCBzdHJpbmcgdG8gc3BlZWQgY29kZTsgcmV0dXJuIDAgb24gZmFpbHVyZSAqLwppbnQKYmNvZGUocykKICAgICBjaGFyICAgKnM7CnsKICAgIHN0cnVjdCBTcGVlZHRhYiAqc3A7CiAgICBsb25nICAgIHNwZWVkID0gYXRvbChzKTsKCiAgICBmb3IgKHNwID0gc3BlZWR0YWI7IHNwLT5zcGVlZDsgc3ArKykKCWlmIChzcC0+c3BlZWQgPT0gc3BlZWQpCgkgICAgcmV0dXJuIChzcC0+Y29kZSk7CiAgICByZXR1cm4gKDApOwp9CgovKiB1c2FnZSAtIGV4cGxhaW4gKi8KCnZvaWQKdXNhZ2UoKQp7CiAgICBmcHJpbnRmKHN0ZGVyciwgXygiVXNhZ2U6ICVzIFstOGhpTG1Vd10gWy1sIGxvZ2luX3Byb2dyYW1dIFstdCB0aW1lb3V0XSBbLUkgaW5pdHN0cmluZ10gWy1IIGxvZ2luX2hvc3RdIGJhdWRfcmF0ZSwuLi4gbGluZSBbdGVybXR5cGVdXG5vclx0Wy1oaUxtd10gWy1sIGxvZ2luX3Byb2dyYW1dIFstdCB0aW1lb3V0XSBbLUkgaW5pdHN0cmluZ10gWy1IIGxvZ2luX2hvc3RdIGxpbmUgYmF1ZF9yYXRlLC4uLiBbdGVybXR5cGVdXG4iKSwgcHJvZ25hbWUpOwogICAgZXhpdCgxKTsKfQoKLyogZXJyb3IgLSByZXBvcnQgZXJyb3JzIHRvIGNvbnNvbGUgb3Igc3lzbG9nOyBvbmx5IHVuZGVyc3RhbmRzICVzIGFuZCAlbSAqLwoKI2RlZmluZQlzdHIyY3B5KGIsczEsczIpCXN0cmNhdChzdHJjcHkoYixzMSksczIpCgp2b2lkCmVycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7CiAgICB2YV9saXN0IGFwOwojaWZuZGVmCVVTRV9TWVNMT0cKICAgIGludCAgICAgZmQ7CiNlbmRpZgogICAgY2hhciAgICBidWZbQlVGU0laXTsKICAgIGNoYXIgICAqYnA7CgogICAgLyoKICAgICAqIElmIHRoZSBkaWFnbm9zdGljIGlzIHJlcG9ydGVkIHZpYSBzeXNsb2coMyksIHRoZSBwcm9jZXNzIG5hbWUgaXMKICAgICAqIGF1dG9tYXRpY2FsbHkgcHJlcGVuZGVkIHRvIHRoZSBtZXNzYWdlLiBJZiB3ZSB3cml0ZSBkaXJlY3RseSB0bwogICAgICogL2Rldi9jb25zb2xlLCB3ZSBtdXN0IHByZXBlbmQgdGhlIHByb2Nlc3MgbmFtZSBvdXJzZWx2ZXMuCiAgICAgKi8KCiNpZmRlZiBVU0VfU1lTTE9HCiAgICBidWZbMF0gPSAnXDAnOwogICAgYnAgPSBidWY7CiNlbHNlCiAgICAodm9pZCkgc3RyMmNweShidWYsIHByb2duYW1lLCAiOiAiKTsKICAgIGJwID0gYnVmICsgc3RybGVuKGJ1Zik7CiNlbmRpZgoKICAgIC8qCiAgICAgKiAlcyBleHBhbnNpb24gaXMgZG9uZSBieSBoYW5kLiBPbiBhIFN5c3RlbSBWIFJlbGVhc2UgMiBzeXN0ZW0gd2l0aG91dAogICAgICogc2hhcmVkIGxpYnJhcmllcyBhbmQgd2l0aG91dCBzeXNsb2coMyksIGxpbmtpbmcgd2l0aCB0aGUgdGhlIHN0ZGlvCiAgICAgKiBsaWJyYXJ5IHdvdWxkIG1ha2UgdGhlIHByb2dyYW0gdGhyZWUgdGltZXMgYXMgYmlnLi4uCiAgICAgKgogICAgICogJW0gZXhwYW5zaW9uIGlzIGRvbmUgaGVyZSBhcyB3ZWxsLiBUb28gYmFkIHN5c2xvZygzKSBkb2VzIG5vdCBoYXZlIGEKICAgICAqIHZzcHJpbnRmKCkgbGlrZSBpbnRlcmZhY2UuCiAgICAgKi8KCiAgICB2YV9zdGFydChhcCwgZm10KTsKICAgIHdoaWxlICgqZm10ICYmIGJwIDwgJmJ1ZltCVUZTSVotMV0pIHsKCWlmIChzdHJuY21wKGZtdCwgIiVzIiwgMikgPT0gMCkgewoJICAgIHhzdHJuY3B5KGJwLCB2YV9hcmcoYXAsIGNoYXIgKiksICZidWZbQlVGU0laLTFdIC0gYnApOwoJICAgIGJwICs9IHN0cmxlbihicCk7CgkgICAgZm10ICs9IDI7Cgl9IGVsc2UgaWYgKHN0cm5jbXAoZm10LCAiJW0iLCAyKSA9PSAwKSB7CgkgICAgeHN0cm5jcHkoYnAsIHN0cmVycm9yKGVycm5vKSwgJmJ1ZltCVUZTSVotMV0gLSBicCk7CgkgICAgYnAgKz0gc3RybGVuKGJwKTsKCSAgICBmbXQgKz0gMjsKCX0gZWxzZSB7CgkgICAgKmJwKysgPSAqZm10Kys7Cgl9CiAgICB9CiAgICAqYnAgPSAwOwogICAgdmFfZW5kKGFwKTsKCiAgICAvKgogICAgICogV3JpdGUgdGhlIGRpYWdub3N0aWMgZGlyZWN0bHkgdG8gL2Rldi9jb25zb2xlIGlmIHdlIGRvIG5vdCB1c2UgdGhlCiAgICAgKiBzeXNsb2coMykgZmFjaWxpdHkuCiAgICAgKi8KCiNpZmRlZglVU0VfU1lTTE9HCiAgICAodm9pZCkgb3BlbmxvZyhwcm9nbmFtZSwgTE9HX1BJRCwgTE9HX0FVVEhQUklWKTsKICAgICh2b2lkKSBzeXNsb2coTE9HX0VSUiwgIiVzIiwgYnVmKTsKICAgIGNsb3NlbG9nKCk7CiNlbHNlCiAgICAvKiBUZXJtaW5hdGUgd2l0aCBDUi1MRiBzaW5jZSB0aGUgY29uc29sZSBtb2RlIGlzIHVua25vd24uICovCiAgICAodm9pZCkgc3RyY2F0KGJwLCAiXHJcbiIpOwogICAgaWYgKChmZCA9IG9wZW4oIi9kZXYvY29uc29sZSIsIDEpKSA+PSAwKSB7Cgkodm9pZCkgd3JpdGUoZmQsIGJ1Ziwgc3RybGVuKGJ1ZikpOwoJKHZvaWQpIGNsb3NlKGZkKTsKICAgIH0KI2VuZGlmCiAgICAodm9pZCkgc2xlZXAoKHVuc2lnbmVkKSAxMCk7CQkvKiBiZSBraW5kIHRvIGluaXQoOCkgKi8KICAgIGV4aXQoMSk7Cn0K