LyoKICogQ29weXJpZ2h0IChjKSAxOTg3IFJlZ2VudHMgb2YgdGhlIFVuaXZlcnNpdHkgb2YgQ2FsaWZvcm5pYS4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICogMy4gQWxsIGFkdmVydGlzaW5nIG1hdGVyaWFscyBtZW50aW9uaW5nIGZlYXR1cmVzIG9yIHVzZSBvZiB0aGlzIHNvZnR3YXJlCiAqICAgIG11c3QgZGlzcGxheSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdlbWVudDoKICoJVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUgVW5pdmVyc2l0eSBvZgogKglDYWxpZm9ybmlhLCBCZXJrZWxleSBhbmQgaXRzIGNvbnRyaWJ1dG9ycy4KICogNC4gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBub3IgdGhlIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMKICogICAgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlCiAqICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBSRUdFTlRTIEFORCBDT05UUklCVVRPUlMgYGBBUyBJUycnIEFORAogKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUKICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UKICogQVJFIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgUkVHRU5UUyBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFCiAqIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMCiAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTCiAqIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKQogKiBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVAogKiBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZCiAqIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKICogU1VDSCBEQU1BR0UuCiAqCiAqIFVwZGF0ZWQgVGh1IE9jdCAxMiAwOTo1Njo1NSAxOTk1IGJ5IGZhaXRoQGNzLnVuYy5lZHUgd2l0aCBzZWN1cml0eQogKiBwYXRjaGVzIGZyb20gWmVmcmFtIDxBLk1haW5AZGNzLndhcndpY2suYWMudWs+CiAqCiAqIFVwZGF0ZWQgVGh1IE5vdiAgOSAyMTo1ODo1MyAxOTk1IGJ5IE1hcnRpbiBTY2h1bHplIAogKiA8am9leUBmaW5sYW5kaWEuaW5mb2Ryb20ubm9ydGguZGU+LiAgU3VwcG9ydCBmb3Igdmlnci4KICoKICogTWFydGluIFNjaHVsemUncyBwYXRjaGVzIGFkYXB0ZWQgdG8gVXRpbC1MaW51eCBieSBOaWNvbGFpIExhbmdmZWxkdC4KICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICogU3VuIE1hciAyMSAxOTk5IC0gQXJuYWxkbyBDYXJ2YWxobyBkZSBNZWxvIDxhY21lQGNvbmVjdGl2YS5jb20uYnI+CiAqIC0gZml4ZWQgc3RyZXJyKGVycm5vKSBpbiBnZXR0ZXh0IGNhbGxzCiAqLwoKc3RhdGljIGNoYXIgdmVyc2lvbl9zdHJpbmdbXSA9ICJ2aXB3IDEuNCI7CgojaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiNpbmNsdWRlIDxzeXMvc3RhdC5oPgojaW5jbHVkZSA8cHdkLmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL3RpbWUuaD4KI2luY2x1ZGUgPHN5cy93YWl0Lmg+CiNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KI2luY2x1ZGUgPHN5cy9maWxlLmg+CiNpbmNsdWRlIDxzaWduYWwuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaW5jbHVkZSA8cGF0aHMuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgoKI2luY2x1ZGUgInNldHB3bmFtLmgiCiNpbmNsdWRlICJ4c3RybmNweS5oIgojaW5jbHVkZSAibmxzLmgiCgojaWZkZWYgSEFWRV9MSUJTRUxJTlVYCiNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KI2VuZGlmCgojZGVmaW5lIEZJTEVOQU1FTEVOIDY3CgpjaGFyICpwcm9nbmFtZTsKZW51bSB7IFZJUFcsIFZJR1IgfTsKaW50IHByb2dyYW07CmNoYXIgb3JpZ19maWxlW0ZJTEVOQU1FTEVOXTsgICAvKiBvcmlnaW5hbCBmaWxlIC9ldGMvcGFzc3dkIG9yIC9ldGMvZ3JvdXAgKi8KY2hhciB0bXBfZmlsZVtGSUxFTkFNRUxFTl07ICAgIC8qIHRtcCBmaWxlICovCmNoYXIgdG1wdG1wX2ZpbGVbRklMRU5BTUVMRU5dOyAvKiB2ZXJ5IHRtcCBmaWxlICovCgp2b2lkIHB3X2Vycm9yIF9fUCgoY2hhciAqLCBpbnQsIGludCkpOwoKc3RhdGljIHZvaWQKY29weWZpbGUoaW50IGZyb20sIGludCB0bykgewoJaW50IG5yLCBudywgb2ZmOwoJY2hhciBidWZbOCoxMDI0XTsKCQoJd2hpbGUgKChuciA9IHJlYWQoZnJvbSwgYnVmLCBzaXplb2YoYnVmKSkpID4gMCkKCQlmb3IgKG9mZiA9IDA7IG9mZiA8IG5yOyBuciAtPSBudywgb2ZmICs9IG53KQoJCQlpZiAoKG53ID0gd3JpdGUodG8sIGJ1ZiArIG9mZiwgbnIpKSA8IDApCgkJCSAgcHdfZXJyb3IodG1wX2ZpbGUsIDEsIDEpOwoKCWlmIChuciA8IDApCgkgIHB3X2Vycm9yKG9yaWdfZmlsZSwgMSwgMSk7Cn0KCgpzdGF0aWMgdm9pZApwd19pbml0KHZvaWQpIHsKCXN0cnVjdCBybGltaXQgcmxpbTsKCgkvKiBVbmxpbWl0ZWQgcmVzb3VyY2UgbGltaXRzLiAqLwoJcmxpbS5ybGltX2N1ciA9IHJsaW0ucmxpbV9tYXggPSBSTElNX0lORklOSVRZOwoJKHZvaWQpc2V0cmxpbWl0KFJMSU1JVF9DUFUsICZybGltKTsKCSh2b2lkKXNldHJsaW1pdChSTElNSVRfRlNJWkUsICZybGltKTsKCSh2b2lkKXNldHJsaW1pdChSTElNSVRfU1RBQ0ssICZybGltKTsKCSh2b2lkKXNldHJsaW1pdChSTElNSVRfREFUQSwgJnJsaW0pOwoJKHZvaWQpc2V0cmxpbWl0KFJMSU1JVF9SU1MsICZybGltKTsKCgkvKiBEb24ndCBkcm9wIGNvcmUgKG5vdCByZWFsbHkgbmVjZXNzYXJ5LCBidXQgR1AncykuICovCglybGltLnJsaW1fY3VyID0gcmxpbS5ybGltX21heCA9IDA7Cgkodm9pZClzZXRybGltaXQoUkxJTUlUX0NPUkUsICZybGltKTsKCgkvKiBUdXJuIG9mZiBzaWduYWxzLiAqLwoJKHZvaWQpc2lnbmFsKFNJR0FMUk0sIFNJR19JR04pOwoJKHZvaWQpc2lnbmFsKFNJR0hVUCwgU0lHX0lHTik7Cgkodm9pZClzaWduYWwoU0lHSU5ULCBTSUdfSUdOKTsKCSh2b2lkKXNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKCSh2b2lkKXNpZ25hbChTSUdRVUlULCBTSUdfSUdOKTsKCSh2b2lkKXNpZ25hbChTSUdURVJNLCBTSUdfSUdOKTsKCSh2b2lkKXNpZ25hbChTSUdUU1RQLCBTSUdfSUdOKTsKCSh2b2lkKXNpZ25hbChTSUdUVE9VLCBTSUdfSUdOKTsKCgkvKiBDcmVhdGUgd2l0aCBleGFjdCBwZXJtaXNzaW9ucy4gKi8KCSh2b2lkKXVtYXNrKDApOwp9CgpzdGF0aWMgaW50CnB3X2xvY2sodm9pZCkgewoJaW50IGxvY2tmZCwgZmQsIHJldDsKCgkvKiAKCSAqIElmIHRoZSBwYXNzd29yZCBmaWxlIGRvZXNuJ3QgZXhpc3QsIHRoZSBzeXN0ZW0gaXMgaG9zZWQuCgkgKiBNaWdodCBhcyB3ZWxsIHRyeSB0byBidWlsZCBvbmUuICBTZXQgdGhlIGNsb3NlLW9uLWV4ZWMgYml0IHNvCgkgKiB0aGF0IHVzZXJzIGNhbid0IGdldCBhdCB0aGUgZW5jcnlwdGVkIHBhc3N3b3JkcyB3aGlsZSBlZGl0aW5nLgoJICogT3BlbiBzaG91bGQgYWxsb3cgZmxvY2snaW5nIHRoZSBmaWxlOyBzZWUgNC40QlNELglYWFgKCSAqLwojaWYgMCAvKiBmbG9jaygpaW5nIGlzIHN1cGVyZmx1b3VzIGhlcmUsIHdpdGggdGhlIHB0bXAvcHRtcHRtcCBzeXN0ZW0uICovCglpZiAoZmxvY2sobG9ja2ZkLCBMT0NLX0VYfExPQ0tfTkIpKSB7CgkJaWYgKHByb2dyYW0gPT0gVklQVykKCQkJZnByaW50ZihzdGRlcnIsIF8oIiVzOiB0aGUgcGFzc3dvcmQgZmlsZSBpcyBidXN5LlxuIiksCgkJCQlwcm9nbmFtZSk7CgkJZWxzZQoJCQlmcHJpbnRmKHN0ZGVyciwgXygiJXM6IHRoZSBncm91cCBmaWxlIGlzIGJ1c3kuXG4iKSwKCQkJCXByb2duYW1lKTsKCQlleGl0KDEpOwoJfQojZW5kaWYKCglpZiAoKGZkID0gb3Blbih0bXB0bXBfZmlsZSwgT19XUk9OTFl8T19DUkVBVCwgMDYwMCkpID09IC0xKSB7CgkgICh2b2lkKWZwcmludGYoc3RkZXJyLAoJCSAgICIlczogJXM6ICVzXG4iLCBwcm9nbmFtZSwgdG1wdG1wX2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CgkgIGV4aXQoMSk7Cgl9CglyZXQgPSBsaW5rKHRtcHRtcF9maWxlLCB0bXBfZmlsZSk7Cgkodm9pZCl1bmxpbmsodG1wdG1wX2ZpbGUpOwoJaWYgKHJldCA9PSAtMSkgewoJICAgIGlmIChlcnJubyA9PSBFRVhJU1QpCgkJKHZvaWQpZnByaW50ZihzdGRlcnIsIAoJCQkgICAgICBfKCIlczogdGhlICVzIGZpbGUgaXMgYnVzeSAoJXMgcHJlc2VudClcbiIpLAoJCQkgICAgICBwcm9nbmFtZSwKCQkJICAgICAgcHJvZ3JhbSA9PSBWSVBXID8gInBhc3N3b3JkIiA6ICJncm91cCIsCgkJCSAgICAgIHRtcF9maWxlKTsKCSAgICBlbHNlIHsKCQlpbnQgZXJyc3YgPSBlcnJubzsKCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgXygiJXM6IGNhbid0IGxpbmsgJXM6ICVzXG4iKSwgcHJvZ25hbWUsCgkJCSAgICAgIHRtcF9maWxlLCBzdHJlcnJvcihlcnJzdikpOwoJICAgIH0KCSAgICBleGl0KDEpOwoJfQoKCWxvY2tmZCA9IG9wZW4ob3JpZ19maWxlLCBPX1JET05MWSwgMCk7CgoJaWYgKGxvY2tmZCA8IDApIHsKCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgIiVzOiAlczogJXNcbiIsCgkJICAgIHByb2duYW1lLCBvcmlnX2ZpbGUsIHN0cmVycm9yKGVycm5vKSk7CgkJdW5saW5rKHRtcF9maWxlKTsKCQlleGl0KDEpOwoJfQoKCWNvcHlmaWxlKGxvY2tmZCwgZmQpOwoJKHZvaWQpY2xvc2UobG9ja2ZkKTsKCSh2b2lkKWNsb3NlKGZkKTsKCXJldHVybigxKTsKfQoKc3RhdGljIHZvaWQKcHdfdW5sb2NrKHZvaWQpIHsKCWNoYXIgdG1wW0ZJTEVOQU1FTEVOKzRdOwogIAoJc3ByaW50Zih0bXAsICIlcyVzIiwgb3JpZ19maWxlLCAiLk9MRCIpOwoJdW5saW5rKHRtcCk7CglsaW5rKG9yaWdfZmlsZSwgdG1wKTsKCiNpZmRlZiBIQVZFX0xJQlNFTElOVVgKCWlmIChpc19zZWxpbnV4X2VuYWJsZWQoKSA+IDApIHsKCSAgc2VjdXJpdHlfY29udGV4dF90IHBhc3N3ZF9jb250ZXh0PU5VTEw7CgkgIGludCByZXQ9MDsKCSAgaWYgKGdldGZpbGVjb24ob3JpZ19maWxlLCZwYXNzd2RfY29udGV4dCkgPCAwKSB7CgkgICAgKHZvaWQpIGZwcmludGYoc3RkZXJyLF8oIiVzOiBDYW4ndCBnZXQgY29udGV4dCBmb3IgJXMiKSxwcm9nbmFtZSxvcmlnX2ZpbGUpOwoJICAgIHB3X2Vycm9yKG9yaWdfZmlsZSwgMSwgMSk7CgkgIH0KCSAgcmV0PXNldGZpbGVjb24odG1wX2ZpbGUscGFzc3dkX2NvbnRleHQpOwoJICBmcmVlY29uKHBhc3N3ZF9jb250ZXh0KTsKCSAgaWYgKHJldCE9MCkgewoJICAgICh2b2lkKSBmcHJpbnRmKHN0ZGVycixfKCIlczogQ2FuJ3Qgc2V0IGNvbnRleHQgZm9yICVzIikscHJvZ25hbWUsdG1wX2ZpbGUpOwoJICAgIHB3X2Vycm9yKHRtcF9maWxlLCAxLCAxKTsKCSAgfQoJfQojZW5kaWYKCglpZiAocmVuYW1lKHRtcF9maWxlLCBvcmlnX2ZpbGUpID09IC0xKSB7CgkJaW50IGVycnN2ID0gZXJybm87CgkJZnByaW50ZihzdGRlcnIsIAoJCQlfKCIlczogY2FuJ3QgdW5sb2NrICVzOiAlcyAoeW91ciBjaGFuZ2VzIGFyZSBzdGlsbCBpbiAlcylcbiIpLCAKCQkJcHJvZ25hbWUsIG9yaWdfZmlsZSwgc3RyZXJyb3IoZXJyc3YpLCB0bXBfZmlsZSk7CgkJZXhpdCgxKTsKCX0KCXVubGluayh0bXBfZmlsZSk7Cn0KCgpzdGF0aWMgdm9pZApwd19lZGl0KGludCBub3RzZXR1aWQpIHsKCWludCBwc3RhdDsKCXBpZF90IHBpZDsKCWNoYXIgKnAsICplZGl0b3I7CgoJaWYgKCEoZWRpdG9yID0gZ2V0ZW52KCJFRElUT1IiKSkpCgkJZWRpdG9yID0gc3RyZHVwKF9QQVRIX1ZJKTsgLyogYWRpYUBlZ25hdGlhLmVlLmF1dGguZ3IgKi8KCWlmICgocCA9IHN0cnJjaHIoc3RydG9rKGVkaXRvciwiIFx0IiksICcvJykpICE9IE5VTEwpCgkJKytwOwoJZWxzZSAKCQlwID0gZWRpdG9yOwoKCXBpZCA9IGZvcmsoKTsKCWlmIChwaWQgPCAwKSB7CgkJKHZvaWQpZnByaW50ZihzdGRlcnIsIF8oIiVzOiBDYW5ub3QgZm9ya1xuIiksIHByb2duYW1lKTsKCQlleGl0KDEpOwoJfQoJaWYgKCFwaWQpIHsKCQlpZiAobm90c2V0dWlkKSB7CgkJCSh2b2lkKXNldGdpZChnZXRnaWQoKSk7CgkJCSh2b2lkKXNldHVpZChnZXR1aWQoKSk7CgkJfQoJCWV4ZWNscChlZGl0b3IsIHAsIHRtcF9maWxlLCBOVUxMKTsKCQlfZXhpdCgxKTsKCX0KCWZvciAoOzspIHsKCSAgICBwaWQgPSB3YWl0cGlkKHBpZCwgJnBzdGF0LCBXVU5UUkFDRUQpOwoJICAgIGlmIChXSUZTVE9QUEVEKHBzdGF0KSkgewoJCS8qIHRoZSBlZGl0b3Igc3VzcGVuZGVkLCBzbyBzdXNwZW5kIHVzIGFzIHdlbGwgKi8KCQlraWxsKGdldHBpZCgpLCBTSUdTVE9QKTsKCQlraWxsKHBpZCwgU0lHQ09OVCk7CgkgICAgfSBlbHNlIHsKCQlicmVhazsKCSAgICB9Cgl9CglpZiAocGlkID09IC0xIHx8ICFXSUZFWElURUQocHN0YXQpIHx8IFdFWElUU1RBVFVTKHBzdGF0KSAhPSAwKQoJCXB3X2Vycm9yKGVkaXRvciwgMSwgMSk7Cn0KCnZvaWQKcHdfZXJyb3IoY2hhciAqbmFtZSwgaW50IGVyciwgaW50IGV2YWwpIHsKCWlmIChlcnIpIHsKCQlpbnQgc3ZlcnJubyA9IGVycm5vOwoKCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiAiLCBwcm9nbmFtZSk7CgkJaWYgKG5hbWUpCgkJCSh2b2lkKWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIG5hbWUpOwoJCWZwcmludGYoc3RkZXJyLCAiJXNcbiIsIHN0cmVycm9yKHN2ZXJybm8pKTsKCX0KCWZwcmludGYoc3RkZXJyLAoJICAgIF8oIiVzOiAlcyB1bmNoYW5nZWRcbiIpLCBwcm9nbmFtZSwgb3JpZ19maWxlKTsKCXVubGluayh0bXBfZmlsZSk7CglleGl0KGV2YWwpOwp9CgpzdGF0aWMgdm9pZAplZGl0X2ZpbGUoaW50IGlzX3NoYWRvdykKewoJc3RydWN0IHN0YXQgYmVnaW4sIGVuZDsKCglwd19pbml0KCk7Cglwd19sb2NrKCk7CgoJaWYgKHN0YXQodG1wX2ZpbGUsICZiZWdpbikpCgkJcHdfZXJyb3IodG1wX2ZpbGUsIDEsIDEpOwoKCXB3X2VkaXQoMCk7CgoJaWYgKHN0YXQodG1wX2ZpbGUsICZlbmQpKQoJCXB3X2Vycm9yKHRtcF9maWxlLCAxLCAxKTsKCWlmIChiZWdpbi5zdF9tdGltZSA9PSBlbmQuc3RfbXRpbWUpIHsKCQkodm9pZClmcHJpbnRmKHN0ZGVyciwgXygiJXM6IG5vIGNoYW5nZXMgbWFkZVxuIiksIHByb2duYW1lKTsKCQlwd19lcnJvcigoY2hhciAqKU5VTEwsIDAsIDApOwoJfQoJLyogc2VlIHB3X2xvY2soKSB3aGVyZSB3ZSBjcmVhdGUgdGhlIGZpbGUgd2l0aCBtb2RlIDYwMCAqLwoJaWYgKCFpc19zaGFkb3cpCgkJY2htb2QodG1wX2ZpbGUsIDA2NDQpOwoJZWxzZQoJCWNobW9kKHRtcF9maWxlLCAwNDAwKTsKCXB3X3VubG9jaygpOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKSB7CgoJc2V0bG9jYWxlKExDX0FMTCwgIiIpOwoJYmluZHRleHRkb21haW4oUEFDS0FHRSwgTE9DQUxFRElSKTsKCXRleHRkb21haW4oUEFDS0FHRSk7CgoJbWVtc2V0KHRtcF9maWxlLCAnXDAnLCBGSUxFTkFNRUxFTik7Cglwcm9nbmFtZSA9IChzdHJyY2hyKGFyZ3ZbMF0sICcvJykpID8gc3RycmNocihhcmd2WzBdLCAnLycpICsgMSA6IGFyZ3ZbMF07CglpZiAoIXN0cmNtcChwcm9nbmFtZSwgInZpZ3IiKSkgewoJCXByb2dyYW0gPSBWSUdSOwoJCXhzdHJuY3B5KG9yaWdfZmlsZSwgR1JPVVBfRklMRSwgc2l6ZW9mKG9yaWdfZmlsZSkpOwoJCXhzdHJuY3B5KHRtcF9maWxlLCBHVE1QX0ZJTEUsIHNpemVvZih0bXBfZmlsZSkpOwoJCXhzdHJuY3B5KHRtcHRtcF9maWxlLCBHVE1QVE1QX0ZJTEUsIHNpemVvZih0bXB0bXBfZmlsZSkpOwoJfSBlbHNlIHsKCQlwcm9ncmFtID0gVklQVzsKCQl4c3RybmNweShvcmlnX2ZpbGUsIFBBU1NXRF9GSUxFLCBzaXplb2Yob3JpZ19maWxlKSk7CgkJeHN0cm5jcHkodG1wX2ZpbGUsIFBUTVBfRklMRSwgc2l6ZW9mKHRtcF9maWxlKSk7CgkJeHN0cm5jcHkodG1wdG1wX2ZpbGUsIFBUTVBUTVBfRklMRSwgc2l6ZW9mKHRtcHRtcF9maWxlKSk7Cgl9CgoJaWYgKChhcmdjID4gMSkgJiYgCgkgICAgKCFzdHJjbXAoYXJndlsxXSwgIi1WIikgfHwgIXN0cmNtcChhcmd2WzFdLCAiLS12ZXJzaW9uIikpKSB7CgkJcHJpbnRmKCIlc1xuIiwgdmVyc2lvbl9zdHJpbmcpOwoJCWV4aXQoMCk7Cgl9CgoJZWRpdF9maWxlKDApOwoKCWlmIChwcm9ncmFtID09IFZJR1IpIHsKCQlzdHJuY3B5KG9yaWdfZmlsZSwgU0dST1VQX0ZJTEUsIEZJTEVOQU1FTEVOLTEpOwoJCXN0cm5jcHkodG1wX2ZpbGUsIFNHVE1QX0ZJTEUsIEZJTEVOQU1FTEVOLTEpOwoJCXN0cm5jcHkodG1wdG1wX2ZpbGUsIFNHVE1QVE1QX0ZJTEUsIEZJTEVOQU1FTEVOLTEpOwoJfSBlbHNlIHsKCQlzdHJuY3B5KG9yaWdfZmlsZSwgU0hBRE9XX0ZJTEUsIEZJTEVOQU1FTEVOLTEpOwoJCXN0cm5jcHkodG1wX2ZpbGUsIFNQVE1QX0ZJTEUsIEZJTEVOQU1FTEVOLTEpOwoJCXN0cm5jcHkodG1wdG1wX2ZpbGUsIFNQVE1QVE1QX0ZJTEUsIEZJTEVOQU1FTEVOLTEpOwoJfQoKCWlmIChhY2Nlc3Mob3JpZ19maWxlLCBGX09LKSA9PSAwKSB7CgkJY2hhciByZXNwb25zZVs4MF07CgoJCXByaW50ZigocHJvZ3JhbSA9PSBWSUdSKQoJCSAgICAgICA/IF8oIllvdSBhcmUgdXNpbmcgc2hhZG93IGdyb3VwcyBvbiB0aGlzIHN5c3RlbS5cbiIpCgkJICAgICAgIDogXygiWW91IGFyZSB1c2luZyBzaGFkb3cgcGFzc3dvcmRzIG9uIHRoaXMgc3lzdGVtLlxuIikpOwoJCXByaW50ZihfKCJXb3VsZCB5b3UgbGlrZSB0byBlZGl0ICVzIG5vdyBbeS9uXT8gIiksIG9yaWdfZmlsZSk7CgoJCS8qIEVPRiBtZWFucyBubyAqLwoJCWlmIChmZ2V0cyhyZXNwb25zZSwgc2l6ZW9mKHJlc3BvbnNlKSwgc3RkaW4pKSB7CgkJCWlmIChyZXNwb25zZVswXSA9PSAneScgfHwgcmVzcG9uc2VbMF0gPT0gJ1knKQoJCQkJZWRpdF9maWxlKDEpOwoJCX0KCX0KCglleGl0KDApOwp9Cg==