I2luY2x1ZGUgPHRlcm1pb3MuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHN5cy91bi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHN5cy9lcG9sbC5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVkZSA8c2lnbmFsLmg+CiNpbmNsdWRlIDx1bmlzdGQuaD4KI2luY2x1ZGUgPHB0aHJlYWQuaD4KI2luY2x1ZGUgPHN5cy9zZWxlY3QuaD4KCiNpbmNsdWRlICJtYnRrX3R5cGUuaCIKI2luY2x1ZGUgIm1idGtfdXRpbHMuaCIKCi8vI2RlZmluZSBBVF9UWVBFX1NPQ0tFVAojZGVmaW5lIE1CVEtfTE9HCgojaWZkZWYgTUJUS19MT0cKI2luY2x1ZGUgIm1idGtfbG9nLmgiCiNlbHNlCiNkZWZpbmUgTE9HRSBwcmludGYKI2RlZmluZSBMT0dEIHByaW50ZgojZGVmaW5lIExPR1YgcHJpbnRmCiNkZWZpbmUgTE9HSSBwcmludGYKI2VuZGlmCgojZGVmaW5lIERBVEFCSVRTCUNTOAojZGVmaW5lIFNUT1BCSVRTCTAKI2RlZmluZSBQQVJJVFlPTiAgICAgICAgMAojZGVmaW5lIFBBUklUWSAgICAgICAgICAwCgp0eXBlZGVmIGVudW0gewogICAgQVRfTU9ERV9TT0NLXzEgPSAwLAogICAgQVRfTU9ERV9TT0NLXzIsCiAgICBBVF9NT0RFX0RFVl8xLAogICAgQVRfTU9ERV9ERVZfMgp9IGF0X21vZGVfZW51bTsKCi8vIHN0YXRpYyBpbnQgZXBvbGxfZmQgPSAtMTsKLy8gc3RhdGljIHN0cnVjdCBlcG9sbF9ldmVudCBlcG9sbF9ldmVudHNbMjBdOwpzdGF0aWMgaW50IGF0X2ZkID0gLTE7CnN0YXRpYyBhdF9tb2RlX2VudW0gYXRfbW9kZSA9IEFUX01PREVfU09DS18xOwoKc3RhdGljIGNoYXIgKmF0X3JzcF9jb21wbGV0ZV90YWdbXSA9IHsKICAgICAgICAiT0siLAogICAgICAgICJFUlJPUiIsCiAgICAgICAgIkNPTk5FQ1QiLAoJCSIrQ01TIEVSUk9SOiIsCgkJIitDTUUgRVJST1I6IiwKCQkiTk8gQU5TV0VSIiwKCQkiTk8gRElBTFRPTkUiLAoJCU5VTEx9OwoKI2lmbmRlZiBURU1QX0ZBSUxVUkVfUkVUUlkKI2RlZmluZSBURU1QX0ZBSUxVUkVfUkVUUlkoZXhwKSAoeyAgICAgICAgIFwKICAgIHR5cGVvZiAoZXhwKSBfcmM7ICAgICAgICAgICAgICAgICAgICAgIFwKICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICBfcmMgPSAoZXhwKTsgICAgICAgICAgICAgICAgICAgICAgIFwKICAgIH0gd2hpbGUgKF9yYyA9PSAtMSAmJiBlcnJubyA9PSBFSU5UUik7IFwKICAgIF9yYzsgfSkKI2VuZGlmCgojaWYgMApzdGF0aWMgdm9pZCBhdF9lcG9sbF9jaGFuZ2UoaW50IGlzX2FkZCxpbnQgZmQpCnsKICAgIHN0cnVjdCBlcG9sbF9ldmVudCBldjsKICAgIG1lbXNldCgmZXYsMHgwLHNpemVvZihzdHJ1Y3QgZXBvbGxfZXZlbnQpKTsKICAgIGV2LmRhdGEuZmQgPSBmZDsKICAgIGV2LmV2ZW50cyA9IEVQT0xMSU4gfCBFUE9MTEVUOwogICAgaWYoaXNfYWRkKQogICAgewogICAgICAgIGVwb2xsX2N0bChlcG9sbF9mZCxFUE9MTF9DVExfQURELGZkLCZldik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZXBvbGxfY3RsKGVwb2xsX2ZkLEVQT0xMX0NUTF9ERUwsZmQsJmV2KTsKICAgIH0KfQoKc3RhdGljIGludCBhdF9zZXRfZmRfbm9ibG9jayhpbnQgZmQpCnsKICAgIC8vIFNldCBPX05PTkJMT0NLCiAgICBpbnQgZmxhZ3MgPSBmY250bChmZCwgRl9HRVRGTCwgMCk7CiAgICBpZiAoZmxhZ3MgPCAwKSB7CiAgICAgICAgTE9HRSgiR2V0IGZsYWdzIGVycm9yOiVzXG4iLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIGZsYWdzIHw9IE9fTk9OQkxPQ0s7CiAgICBpZiAoZmNudGwoZmQsIEZfU0VURkwsIGZsYWdzKSA8IDApIHsKICAgICAgICBMT0dFKCJTZXQgZmxhZ3MgZXJyb3I6JXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHJldHVybiAwOwp9CiNlbmRpZgoKLy8jaWZkZWYgQVRfVFlQRV9TT0NLRVQKaW50IG9wZW5Tb2NrZXQoY29uc3QgY2hhciogc29ja25hbWUpCnsKCWludCBzb2NrID0gc29ja2V0KEFGX1VOSVgsIFNPQ0tfU1RSRUFNLCAwKTsKCWlmIChzb2NrIDwgMCkgewoJCUxPR0UoIkVycm9yIGNyZWF0ZSBzb2NrZXQ6ICVzXG4iLCBzdHJlcnJvcihlcnJubykpOwoJCXJldHVybiAtMTsKCX0KCXN0cnVjdCBzb2NrYWRkcl91biBhZGRyOwoJbWVtc2V0KCZhZGRyLCAwLCBzaXplb2YoYWRkcikpOwoJYWRkci5zdW5fZmFtaWx5ID0gQUZfVU5JWDsKCXN0cm5jcHkoYWRkci5zdW5fcGF0aCwgc29ja25hbWUsIHNpemVvZihhZGRyLnN1bl9wYXRoKSk7Cgl3aGlsZSAoVEVNUF9GQUlMVVJFX1JFVFJZKGNvbm5lY3Qoc29jaywoY29uc3Qgc3RydWN0IHNvY2thZGRyKikmYWRkciwgc2l6ZW9mKGFkZHIpKSkgIT0gMCkgewoJCUxPR0UoIkVycm9yIGNvbm5lY3QgdG8gc29ja2V0ICVzOiAlcywgdHJ5IGFnYWluIiwgc29ja25hbWUsIHN0cmVycm9yKGVycm5vKSk7CgkJc2xlZXAoMSk7Cgl9CgojaWYgMAoJaW50IHNrX2ZsYWdzID0gZmNudGwoc29jaywgRl9HRVRGTCwgMCk7CglmY250bChzb2NrLCBGX1NFVEZMLCBza19mbGFncyB8IE9fTk9OQkxPQ0spOwojZW5kaWYKCglyZXR1cm4gc29jazsKfQoKLy8jZWxzZQoKc3RhdGljIGludCBhdF9vcGVuKGNoYXIgKmRldikKewogICAgLy8gSW5pdCBVU0IgUEMgcG9ydC4KICAgIHN0cnVjdCB0ZXJtaW9zIHNlcl9zZXR0aW5nczsKICAgIGludCBmZCA9IC0xOwoKdXNiX3BjX2luaXQ6CiAgICBmZCA9IG9wZW4oZGV2LE9fUkRXUik7CiAgICBpZihmZCA8PSAwKQogICAgewogICAgICAgIGlmKGVycm5vID09IEVOT0RFVikKICAgICAgICB7CiAgICAgICAgICAgIExPR0QoIldhaXQgZGV2WyVzXSByZWFkeS4uLiIsZGV2KTsKICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgIGdvdG8gdXNiX3BjX2luaXQ7CiAgICAgICAgfQoKICAgICAgICBMT0dFKCJDYW5ub3Qgb3BlbiBVU0IgUEMgcG9ydFslc10gLSBbZXJybm8gPSAlZF0iLGRldixlcnJubyk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHRjZ2V0YXR0cihmZCwgJnNlcl9zZXR0aW5ncyk7CiAgICBjZm1ha2VyYXcoJnNlcl9zZXR0aW5ncyk7CiAgICAvL3Nlcl9zZXR0aW5ncy5jX2xmbGFnIHw9IChFQ0hPIHwgRUNIT05MKTsKICAgIC8vc2VyX3NldHRpbmdzLmNfbGZsYWcgJj0gfkVDSE9DVEw7CiAgICB0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZzZXJfc2V0dGluZ3MpOwoKI2lmIDAKICAgIGlmKGF0X3NldF9mZF9ub2Jsb2NrKGF0X2ZkKSkKICAgIHsKICAgICAgICBMT0dFKCJhdF9zZXRfZmRfbm9ibG9jaygpIGZhaWwuIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIGF0X2Vwb2xsX2NoYW5nZSgxLCBhdF9mZCk7CiNlbmRpZgoKICAgIHJldHVybiBmZDsKfQovLyNlbmRpZgoKc3RhdGljIGludCBhZGJfcG9ydF9vcGVuKGNvbnN0IGNoYXIgKmRldiwgdW5zaWduZWQgaW50IGJhdWQpCnsKCWludCBmZDsKCgl3aGlsZSgoZmQgPSBvcGVuKGRldiwgT19SRFdSKSkgPCAwKQoJewoJCXByaW50ZigiJXM6IG9wZW4gJXMgZmFpbGVkXG4iLCBfX2Z1bmNfXywgZGV2KTsKCQlzbGVlcCgxKTsKCX0KCgkvKiBzZXQgbmV3dGlvICovCglzdHJ1Y3QgdGVybWlvcyBuZXd0aW87CgltZW1zZXQoJm5ld3RpbywgMCwgc2l6ZW9mKG5ld3RpbykpOwojaWYgMAoJKHZvaWQpZmNudGwoZmQsIEZfU0VURkwsIDApOwoJbmV3dGlvLmNfY2ZsYWcgPSBCQVVEIHwgREFUQUJJVFMgfCBTVE9QQklUUyB8IFBBUklUWU9OIHwgUEFSSVRZIHwgQ0xPQ0FMIHwgQ1JFQUQ7CgluZXd0aW8uY19pZmxhZyA9IElHTlBBUjsKCW5ld3Rpby5jX29mbGFnID0gMDsKCW5ld3Rpby5jX2xmbGFnID0gMDsgICAgLyogZGlzYWJsZSBFQ0hPLCBJQ0FOT04sIGV0Yy4uLiAqLwoKCW5ld3Rpby5jX2NjW1ZFUkFTRV0gICA9IDB4ODsgICAgICAvKiBkZWwgKi8KCW5ld3Rpby5jX2NjW1ZFT0ZdICAgICA9IDQ7ICAgICAgLyogQ3RybC1kICovCgluZXd0aW8uY19jY1tWTUlOXSAgICAgPSAxOyAgICAgIC8qIGJsb2NraW5nIHJlYWQgdW50aWwgMSBjaGFyYWN0ZXIgYXJyaXZlcyAqLwoJbmV3dGlvLmNfY2NbVkVPTF0gICAgID0gMHhEOyAgICAgIC8qICdcMCcgKi8KCgl0Y2ZsdXNoKGZkLCBUQ0lGTFVTSCk7Cgl0Y3NldGF0dHIoZmQsIFRDU0FOT1csICZuZXd0aW8pOwojZWxzZQoJaWYgKHRjZmx1c2goZmQsIFRDSU9GTFVTSCkgPCAwKSB7CgkJcHJpbnRmKCJDb3VsZCBub3QgZmx1c2ggdWFydCBwb3J0XG4iKTsKCQlyZXR1cm4gLTE7Cgl9CgogICAgbmV3dGlvLmNfY2NbVlRJTUVdICAgID0gMDsgICAvKiBpbnRlci1jaGFyYWN0ZXIgdGltZXIgdW51c2VkICovCiAgICBuZXd0aW8uY19jY1tWTUlOXQkgICA9IDE7ICAgLyogYmxvY2tpbmcgcmVhZCB1bnRpbCA1IGNoYXJzIHJlY2VpdmVkICovCiAgICBuZXd0aW8uY19jZmxhZyB8PSAoQ1M4IHwgQ0xPQ0FMIHwgQ1JFQUQpOwogICAgbmV3dGlvLmNfaWZsYWcgPSBJR05QQVI7CiAgICBuZXd0aW8uY19vZmxhZyA9IDA7CiAgICBuZXd0aW8uY19sZmxhZyA9IDA7CgoJaW50IHJhdGUgPSBiYXVkOyAgLy8gRGVmYXVsdCBiaXRyYXRlLgoJc3dpdGNoKHJhdGUpCgl7CgkJY2FzZSAzMDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEIzMDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCMzAwKTsKCQkJYnJlYWs7CgkJY2FzZSA2MDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEI2MDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCNjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAxMjAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCMTIwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIxMjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAyNDAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCMjQwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIyNDAwKTsKCQkJYnJlYWs7CgkJY2FzZSA0ODAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCNDgwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEI0ODAwKTsKCQkJYnJlYWs7CgkJY2FzZSA5NjAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCOTYwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEI5NjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAxOTIwMDoKCQkJY2ZzZXRvc3BlZWQoJm5ld3RpbywgQjE5MjAwKTsKCQkJY2ZzZXRpc3BlZWQoJm5ld3RpbywgQjE5MjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAzODQwMDoKCQkJY2ZzZXRvc3BlZWQoJm5ld3RpbywgQjM4NDAwKTsKCQkJY2ZzZXRpc3BlZWQoJm5ld3RpbywgQjM4NDAwKTsKCQkJYnJlYWs7CgkJY2FzZSA1NzYwMDoKCQkJY2ZzZXRvc3BlZWQoJm5ld3RpbywgQjU3NjAwKTsKCQkJY2ZzZXRpc3BlZWQoJm5ld3RpbywgQjU3NjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAxMTUyMDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEIxMTUyMDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCMTE1MjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAyMzA0MDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEIyMzA0MDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCMjMwNDAwKTsKCQkJYnJlYWs7CgkJY2FzZSA0NjA4MDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEI0NjA4MDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCNDYwODAwKTsKCQkJYnJlYWs7CgkJY2FzZSA5MjE2MDA6CgkJCWNmc2V0b3NwZWVkKCZuZXd0aW8sIEI5MjE2MDApOwoJCQljZnNldGlzcGVlZCgmbmV3dGlvLCBCOTIxNjAwKTsKCQkJYnJlYWs7CgkJY2FzZSAxNTAwMDAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCMTUwMDAwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIxNTAwMDAwKTsKCQkJYnJlYWs7CgkJY2FzZSAyMDAwMDAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCMjAwMDAwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIyMDAwMDAwKTsKCQkJYnJlYWs7CgkJY2FzZSAzMDAwMDAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCMzAwMDAwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIzMDAwMDAwKTsKCQkJYnJlYWs7CgkJY2FzZSA0MDAwMDAwOgoJCQljZnNldG9zcGVlZCgmbmV3dGlvLCBCNDAwMDAwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEI0MDAwMDAwKTsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJY2ZzZXRvc3BlZWQoJm5ld3RpbywgQjExNTIwMCk7CgkJCWNmc2V0aXNwZWVkKCZuZXd0aW8sIEIxMTUyMDApOwoJCQlicmVhazsKCX0KCglpZiAodGNzZXRhdHRyKGZkLCBUQ1NBTk9XLCAmbmV3dGlvKSA8IDApIHsKCQlwcmludGYoIkNhbid0IHNldCBwb3J0IHNldHRpbmdcbiIpOwoJCXJldHVybiAtMTsKCX0KCS8qIEJsb2NraW5nIGJlaGF2aW9yICovCglmY250bChmZCwgRl9TRVRGTCwgMCk7CiNlbmRpZgoKICAgIHJldHVybiBmZDsKfQoKCnN0YXRpYyB2b2lkIHNpZ25hbF9wcm9jZXNzKGludCBzaWduYWxfbnVtKSB7CiAgICBpZihhdF9mZCA+IDApIHsKICAgICAgICBjbG9zZShhdF9mZCk7CiAgICB9CiNpZmRlZiBNQlRLX0xPRwogICAgTE9HRCgiRXhpdCBieSBzaWcgLSAlZFxuIiwgc2lnbmFsX251bSk7CiNlbmRpZgogICAgZXhpdCgwKTsKfQoKc3RhdGljIHZvaWQqIHJlYWRfdGhyZWFkX3J1biggdm9pZCAqYXJnKQp7CiAgICAvL1VOVVNFRChhcmcpOwoKICAgIGNoYXIgYXRfcnNwWzEwMjRdOwogICAgY2hhciAqcHRyOwogICAgaW50IGluZGV4OwogICAgaW50IGxlbjsKICAgIHdoaWxlKGF0X2ZkID4gMCkgewogICAgICAgIG1lbXNldChhdF9yc3AsIDB4MCwgMTAyNCk7CiAgICAgICAgaW5kZXggPSAwOwogICAgICAgIGxlbiA9IDA7CiAgICAgICAgd2hpbGUoMSkgewogICAgICAgICAgICBpZigobGVuID0gcmVhZChhdF9mZCwgYXRfcnNwICsgaW5kZXgsIDEwMjQpKSA+IDApIHsKICAgICAgICAgICAgICAgIHB0ciA9IGF0X3JzcDsKICAgICAgICAgICAgICAgIHdoaWxlKCpwdHIgPT0gJ1xyJyB8fCAqcHRyID09ICdcbicpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHRyKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZihzdHJsZW4ocHRyKSA+IDAgJiYgcHRyW3N0cmxlbihwdHIpIC0gMV0gPT0gJ1xuJykgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiPCVzXG4iLCBwdHIpOwojaWZkZWYgTUJUS19MT0cKICAgICAgICAgICAgICAgICAgICBMT0dWKCJSU1A6JXMiLCBwdHIpOwojZW5kaWYKCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIGluZGV4ICs9IGxlbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIExPR0UoIlJlYWQgZXJyb3I6JWQiLGVycm5vKTsKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIExPR0QoInJlYWRfdGhyZWFkX3J1bigpIGV4aXQuXG4iKTsKICAgIHJldHVybiBOVUxMOwp9CgpzdGF0aWMgaW50IHJlYWRfdGhyZWFkX3N0YXJ0KCkKewogICAgcHRocmVhZF90IHRpZDsKICAgIHB0aHJlYWRfYXR0cl90IGF0dHI7CiAgICBwdGhyZWFkX2F0dHJfaW5pdCAoJmF0dHIpOwogICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9ERVRBQ0hFRCk7CiAgICBpbnQgcmV0ID0gcHRocmVhZF9jcmVhdGUoJnRpZCwgJmF0dHIsIHJlYWRfdGhyZWFkX3J1biwgTlVMTCk7CiAgICBpZiAocmV0IDwgMCkKICAgIHsKICAgICAgICBMT0dFKCJwdGhyZWFkX2NyZWF0ZVxuIik7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHJldHVybiAwOwp9CgpzdGF0aWMgaW50IGF0X2NvbXBsZXRlKGNoYXIgKnJzcCkKewojaWYgMAogICAgY2hhciAqcHRyID0gYXRfcnNwX2NvbXBsZXRlX3RhZzsKICAgIHdoaWxlKHB0cikgewogICAgICAgIExPR0QoInB0ciA9ICVzIiwgcHRyKTsKICAgICAgICBpZihzdHJzdHIocnNwLCBwdHIpKSB7CiAgICAgICAgICAgIExPR0QoIiVzICwgJXMiLCByc3AsIHB0cik7CiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KICAgICAgICBwdHIrKzsKICAgIH0KI2Vsc2UKICAgIGludCBpID0gMDsKICAgIHdoaWxlKGF0X3JzcF9jb21wbGV0ZV90YWdbaV0pIHsKICAgICAgICBMT0dEKCJwdHIgPSAlcyIsIGF0X3JzcF9jb21wbGV0ZV90YWdbaV0pOwogICAgICAgIGlmKHN0cnN0cihyc3AsIGF0X3JzcF9jb21wbGV0ZV90YWdbaV0pKSB7CiAgICAgICAgICAgIExPR0QoIiVzICwgJXMiLCByc3AsIGF0X3JzcF9jb21wbGV0ZV90YWdbaV0pOwogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaSsrOwogICAgfQoKI2VuZGlmCiAgICByZXR1cm4gMDsKfQoKc3RhdGljIHZvaWQgYXRfcnNwX3JlYWQoKQp7CiAgICBjaGFyIGF0X3JzcFsxMDI0XTsKICAgIGludCBsZW4gPSAwOwogICAgd2hpbGUoMSkgewogICAgICAgIG1lbXNldChhdF9yc3AsIDB4MCwgMTAyNCk7CiAgICAgICAgaWYoKGxlbiA9IHJlYWQoYXRfZmQsIGF0X3JzcCwgMTAyNCkpID4gMCkgewogICAgICAgICAgICBwcmludGYoIiVzIiwgYXRfcnNwKTsKICAgICAgICAgICAgaWYoYXRfY29tcGxldGUoYXRfcnNwKSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmludGYoIlJlYWQgZXJyb3I6JWRcbiIsZXJybm8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KCnN0YXRpYyB2b2lkIGhlbHAoKQp7CiAgICBwcmludGYoImF0IDogRW50ZXIgQVQgbW9kZShTb2NrZXQpLlxuIik7CiAgICBwcmludGYoImF0IDxhdF9jbWQ+OiBTZW5kIEFUIGNvbW1hbmQoU29ja2V0KS5cbiIpOwogICAgcHJpbnRmKCJhdCA8ZGV2PjogRW50ZXIgQVQgbW9kZShEZXZpY2UpLlxuIik7CiAgICBwcmludGYoImF0IDxkZXY+IGVjaG86ILSuv9rK/b7du9jP1KGjXG4iKTsKICAgIHByaW50ZigiYXQgPGRldj4gPGF0X2NtZD46IFNlbmQgQVQgY29tbWFuZChEZXZpY2UpLlxuIik7Cn0KCnN0YXRpYyB2b2lkIHNpZ19wcm9jZXNzKGludCBzaWcpCnsKICAgIExPR0koIkkgZ290IHNpZ25hbCAlZFxuIiwgc2lnKTsKICAgIHN3aXRjaChzaWcpCiAgICB7CiAgICAgICAgY2FzZSBTSUdJTlQ6IC8vIEN0cmwgKyBDCiAgICAgICAgewogICAgICAgICAgICBMT0dJKCJFeGl0IGJ5IFNJR0lOVC5cbiIpOwogICAgICAgICAgICBleGl0KDApOwogICAgICAgIH0KICAgICAgICBjYXNlIFNJR1FVSVQ6IC8vIEN0cmwgKyBcICjA4MvGIFNJR0lOVCCjrLWr0qqy+sn6Y29yZc7EvP4pCiAgICAgICAgewogICAgICAgICAgICBMT0dJKCJFeGl0IGJ5IFNJR1FVSVQuXG4iKTsKICAgICAgICAgICAgZXhpdCgwKTsKICAgICAgICB9CiAgICAgICAgY2FzZSBTSUdURVJNOi8vIMSsyM9raWxsICAgKM2sIFNJR0tJTEwgo6y1qyBTSUdLSUxMILK7v8mytrvxKQogICAgICAgIHsKICAgICAgICAgICAgTE9HSSgiRXhpdCBieSBTSUdURVJNLlxuIik7CiAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgfQogICAgICAgIGNhc2UgU0lHVFNUUDovLyBDdHJsICsgWiAozawgU0lHU1RPUCCjrLWrIFNJR1NUT1Agsru/ybK2u/EpCiAgICAgICAgewogICAgICAgICAgICBMT0dJKCJFeGl0IGJ5IFNJR1RTVFAuXG4iKTsKICAgICAgICAgICAgZXhpdCgwKTsKICAgICAgICB9CiAgICAgICAgY2FzZSBTSUdTRUdWOiAvLyDI57/V1rjV6wogICAgICAgIHsKICAgICAgICAgICAgTE9HSSgiRXhpdCBieSBTSUdTRUdWLlxuIik7CiAgICAgICAgICAgIGV4aXQoMCk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgewogICAgICAgICAgICBMT0dJKCJVbmtub3duIHNpZzolZFxuIixzaWcpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCnsKICAgIC8vVU5VU0VEKGFyZ2MpOwogICAgLy9VTlVTRUQoYXJndik7CiAgICBzaWduYWwoU0lHSU5ULCBzaWdfcHJvY2Vzcyk7CiAgICBzaWduYWwoU0lHUVVJVCwgc2lnX3Byb2Nlc3MpOwogICAgc2lnbmFsKFNJR1RFUk0sIHNpZ19wcm9jZXNzKTsKICAgIC8vc2lnbmFsKFNJR1RTVFAsIHNpZ19wcm9jZXNzKTsKICAgIC8vc2lnbmFsKFNJR1NFR1YsIHNpZ19wcm9jZXNzKTsKCiNpZmRlZiBNQlRLX0xPRwogICAgbWJ0a19sb2dfaW5pdCgicmFkaW8iLCAiTUJUS19BVCIpOwogICAgTE9HSSgibWJ0a19hdCBzdGFydC4iKTsKI2VuZGlmCgogICAgc2lnbmFsKFNJR0tJTEwsIHNpZ25hbF9wcm9jZXNzKTsKICAgIHNpZ25hbChTSUdJTlQsIHNpZ25hbF9wcm9jZXNzKTsKICAgIHNpZ25hbChTSUdRVUlULCBzaWduYWxfcHJvY2Vzcyk7CiAgICBzaWduYWwoU0lHVEVSTSwgc2lnbmFsX3Byb2Nlc3MpOwoKICAgIGNoYXIgKmF0X2NtZCA9IE5VTEw7CiAgICBib29sIGVjaG8gPSBGQUxTRTsKICAgIGNoYXIgKmRldiA9IE5VTEw7CiAgICBpZihhcmdjID09IDEpIHsKICAgICAgICBhdF9tb2RlID0gQVRfTU9ERV9TT0NLXzE7CiAgICB9IGVsc2UgaWYoYXJnYyA9PSAyKSB7CiAgICAgICAgaWYoIXN0cm5jYXNlY21wKGFyZ3ZbMV0sICJhdCIsIDIpKSB7CiAgICAgICAgICAgIGF0X21vZGUgPSBBVF9NT0RFX1NPQ0tfMjsKICAgICAgICAgICAgYXRfY21kID0gYXJndlsxXTsKICAgICAgICB9IGVsc2UgaWYoIXN0cm5jYXNlY21wKGFyZ3ZbMV0sICIvZGV2LyIsIDUpKSB7CiAgICAgICAgICAgIGF0X21vZGUgPSBBVF9NT0RFX0RFVl8xOwogICAgICAgIH0gZWxzZSBpZighc3RybmNhc2VjbXAoYXJndlsxXSwgIi90bXAvIiwgNSkpIHsKICAgICAgICAgICAgYXRfbW9kZSA9IEFUX01PREVfU09DS18xOwogICAgICAgICAgICBkZXYgPSBhcmd2WzFdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGhlbHAoKTsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgIH0gZWxzZSBpZihhcmdjID09IDMpIHsKICAgICAgICBpZighc3RybmNhc2VjbXAoYXJndlsxXSwgIi9kZXYvIiwgNSkgJiYgKCFzdHJuY2FzZWNtcChhcmd2WzJdLCAiYXQiLCAyKSB8fCAhc3RybmNhc2VjbXAoYXJndlsyXSwgImVjaG8iLCA0KSkpIHsKICAgICAgICAgICAgYXRfbW9kZSA9IEFUX01PREVfREVWXzI7CiAgICAgICAgICAgIGlmKCFzdHJuY2FzZWNtcChhcmd2WzJdLCAiYXQiLCAyKSkgewogICAgICAgICAgICAgICAgYXRfY21kID0gYXJndlsyXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGVjaG8gPSBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGVscCgpOwogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBoZWxwKCk7CiAgICAgICAgcmV0dXJuIC0xOwogICAgfQojaWYgMAojaWZkZWYgQVRfVFlQRV9TT0NLRVQKICAgIGF0X2ZkID0gb3BlblNvY2tldCgiL3RtcC9hdGNtZG1idGsiKTsKI2Vsc2UKCWF0X2ZkID0gYXRfb3Blbihhcmd2WzFdKTsKI2VuZGlmCiAgICBpZihhdF9mZCA+IDApIHsKI2lmZGVmIEFUX1RZUEVfU09DS0VUCiAgICAgICAgaWYoYXJnYyA+IDEpIHsKICAgICAgICAgICAgY2hhciAqYXRfY21kID0gYXJndlsxXTsKI2Vsc2UKCSAgICBpZihhcmdjID4gMikgewogICAgICAgICAgICBjaGFyICphdF9jbWQgPSBhcmd2WzJdOwojZW5kaWYKI2VuZGlmCgogICAgaWYoYXRfbW9kZSA9PSBBVF9NT0RFX1NPQ0tfMSB8fCBhdF9tb2RlID09IEFUX01PREVfU09DS18yKSB7CiAgICAgICAgaWYoZGV2ID09IE5VTEwpIHsKICAgICAgICAgICAgYXRfZmQgPSBvcGVuU29ja2V0KCIvdG1wL2F0Y21kbWJ0ayIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGF0X2ZkID0gb3BlblNvY2tldChkZXYpOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiNpZiAwCiAgICAgICAgYXRfZmQgPSBhdF9vcGVuKGFyZ3ZbMV0pOwojZWxzZQogICAgICAgIGlmKGVjaG8pIHsKICAgICAgICAgICAgYXRfZmQgPSBhZGJfcG9ydF9vcGVuKGFyZ3ZbMV0sIDExNTIwMCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYXRfZmQgPSBhdF9vcGVuKGFyZ3ZbMV0pOwogICAgICAgIH0KI2VuZGlmCiAgICB9CiAgICBpZihhdF9mZCA+IDApIHsKICAgICAgICBpZihhdF9jbWQgIT0gTlVMTCkgewogICAgICAgICAgICBjaGFyICpwdHIgPSBhdF9jbWQgKyBzdHJsZW4oYXRfY21kKSAtIDE7CiAgICAgICAgICAgIHdoaWxlKHB0ciA+PSBhdF9jbWQgJiYgKCpwdHIgPT0gJ1xyJyB8fCAqcHRyID09ICdcbicpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAqcHRyLS0gPSAnXDAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHByaW50ZigiQVQ6WyVsZF0lc1xuIiwgc3RybGVuKGF0X2NtZCksIGF0X2NtZCk7CiAgICAgICAgICAgIGlmKCFzdHJuY2FzZWNtcChhdF9jbWQsICJhdCIsIDIpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAqKCsrcHRyKSA9ICdccic7CiAgICAgICAgICAgICAgICAqKCsrcHRyKSA9ICdcbic7CiAgICAgICAgICAgICAgICBpZih3cml0ZShhdF9mZCwgYXRfY21kLCBzdHJsZW4oYXRfY21kKSkgPD0gMCkgewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiV3JpdGUgZXJyb3I6JWRcbiIsIGVycm5vKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCByZXNwb25zZS4KICAgICAgICAgICAgICAgICAgICBhdF9yc3BfcmVhZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcHJpbnRmKCJBVCBlcnJvciFcbiIpOwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYoZWNobykgewogICAgICAgICAgICAgICAgY2hhciByZWFkX2J1ZmZbMTAyNF07CiAgICAgICAgICAgICAgICBjaGFyIHdyaXRlX2J1ZmZbMTAyNF07CiAgICAgICAgICAgICAgICBpbnQgbGVuOwojaWYgMAogICAgICAgICAgICAgICAgZmRfc2V0IGZkczsKICAgICAgICAgICAgICAgIGludCBmZGNvdW50LCBuZmRzID0gMDsKICAgICAgICAgICAgICAgIHdoaWxlKDEpIHsKICAgICAgICAgICAgICAgICAgICBGRF9TRVQoYXRfZmQsICZmZHMpOwogICAgICAgIAkJICAgIGlmKGF0X2ZkID4gbmZkcykKICAgICAgICAJCQkgICAgbmZkcyA9IGF0X2ZkOwoKICAgICAgICAgICAgICAgICAgICBmZGNvdW50ID0gc2VsZWN0KG5mZHMgKyAxLCAmZmRzLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICAgICAJCQlpZihmZGNvdW50IDwgMCkgLyogZXJyb3IgKi8KICAgICAgICAJCQl7CiAgICAgICAgCQkJCXByaW50Zigic2VsZWN0IHJldHVybmVkICVkLCBlcnJubyAlZCwgY29udGludWVcciIsIGZkY291bnQsIGVycm5vKTsKICAgICAgICAJCQkJc2xlZXAoMSk7CiAgICAgICAgCQkJCWNvbnRpbnVlOwogICAgICAgIAkJCX0KCiAgICAgICAgCQkJaWYoRkRfSVNTRVQoYXRfZmQsICZmZHMpKQogICAgICAgIAkJCXsKICAgICAgICAgICAgICAgICAgICAgICAgRkRfQ0xSKGF0X2ZkLCAmZmRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHJlYWRfYnVmZiwgMHgwLCAxMDI0KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoKGxlbiA9IHJlYWQoYXRfZmQsIHJlYWRfYnVmZiwgMTAyNCkpID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHdyaXRlX2J1ZmYsIDB4MCwgMTAyNCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIiVzXG4iLCByZWFkX2J1ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc25wcmludGYod3JpdGVfYnVmZiwgMTAyNCwgIiVzXG4iLCByZWFkX2J1ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGUoYXRfZmQsIHdyaXRlX2J1ZmYsIGxlbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlJlYWQgZXJyb3I6JWRcbiIsZXJybm8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiNlbHNlCiAgICAgICAgICAgICAgICBwcmludGYoIldhaXR0aW5nIGRhdGEhISFcbiIpOwogICAgICAgICAgICAgICAgd2hpbGUoMSkgewogICAgICAgICAgICAgICAgICAgIG1lbXNldChyZWFkX2J1ZmYsIDB4MCwgMTAyNCk7CiAgICAgICAgICAgICAgICAgICAgaWYoKGxlbiA9IHJlYWQoYXRfZmQsIHJlYWRfYnVmZiwgMTAyNCkpID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQod3JpdGVfYnVmZiwgMHgwLCAxMDI0KTsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlc1xuIiwgcmVhZF9idWZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gc25wcmludGYod3JpdGVfYnVmZiwgMTAyNCwgIiVzXG4iLCByZWFkX2J1ZmYpOwogICAgICAgICAgICAgICAgICAgICAgICBtYnRrX3dyaXRlKGF0X2ZkLCB3cml0ZV9idWZmLCBsZW4pOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiUmVhZCBlcnJvcjolZFxuIixlcnJubyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiNlbmRpZgogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgc2V0YnVmKHN0ZG91dCwgTlVMTCk7CiAgICAgICAgICAgICAgICByZWFkX3RocmVhZF9zdGFydCgpOwogICAgICAgICAgICAgICAgY2hhciBhdF9jbWRbMTAwXTsKICAgICAgICAgICAgICAgIC8vcHJpbnRmKCI+PiIpOwogICAgICAgICAgICAgICAgd2hpbGUoMSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBtZW1zZXQoYXRfY21kLCAweDAsIDEwMCk7CiAgICAgICAgICAgICAgICAgICAgaWYoZmdldHMoYXRfY21kLCAxMDAsIHN0ZGluKSkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKnB0ciA9IGF0X2NtZCArIHN0cmxlbihhdF9jbWQpIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUocHRyID49IGF0X2NtZCAmJiAoKnB0ciA9PSAnXHInIHx8ICpwdHIgPT0gJ1xuJykpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdHItLSA9ICdcMCc7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJpbnRmKCJBVDpbJWxkXSVzXG4iLCBzdHJsZW4oYXRfY21kKSwgYXRfY21kKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXN0cm5jYXNlY21wKGF0X2NtZCwgImF0IiwgMikpCiAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKytwdHIpID0gJ1xyJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICooKytwdHIpID0gJ1xuJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHdyaXRlKGF0X2ZkLCBhdF9jbWQsIHN0cmxlbihhdF9jbWQpKSA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HRSgiV3JpdGUgZXJyb3I6JWQiLGVycm5vKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiPiVzIixhdF9jbWQpOwojaWZkZWYgTUJUS19MT0cKICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR1YoIkFUOiVzIixhdF9jbWQpOwojZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCFzdHJjYXNlY21wKGF0X2NtZCwgInEiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGNsb3NlKGF0X2ZkKTsKCiNpZmRlZiBNQlRLX0xPRwogICAgICAgIExPR0QoIkVYSVQiKTsKI2VuZGlmCiAgICB9CgogICAgcmV0dXJuIDA7Cn0K