LyoKICogICRJZDogbmZzcm9vdC5jLHYgMS40NSAxOTk4LzAzLzA3IDEwOjQ0OjQ2IG1qIEV4cCAkCiAqCiAqICBDb3B5cmlnaHQgKEMpIDE5OTUsIDE5OTYgIEdlcm8gS3VobG1hbm4gPGdlcm9AZ2ttaW5peC5oYW4uZGU+CiAqCiAqICBBbGxvdyBhbiBORlMgZmlsZXN5c3RlbSB0byBiZSBtb3VudGVkIGFzIHJvb3QuIFRoZSB3YXkgdGhpcyB3b3JrcyBpczoKICogICAgICgxKSBVc2UgdGhlIElQIGF1dG9jb25maWcgbWVjaGFuaXNtIHRvIHNldCBsb2NhbCBJUCBhZGRyZXNzZXMgYW5kIHJvdXRlcy4KICogICAgICgyKSBIYW5kbGUgUlBDIG5lZ290aWF0aW9uIHdpdGggdGhlIHN5c3RlbSB3aGljaCByZXBsaWVkIHRvIFJBUlAgb3IKICogICAgICAgICB3YXMgcmVwb3J0ZWQgYXMgYSBib290IHNlcnZlciBieSBCT09UUCBvciBtYW51YWxseS4KICogICAgICgzKSBUaGUgYWN0dWFsIG1vdW50aW5nIGlzIGRvbmUgbGF0ZXIsIHdoZW4gaW5pdCgpIGlzIHJ1bm5pbmcuCiAqCiAqCiAqCUNoYW5nZXM6CiAqCiAqCUFsYW4gQ294CToJUmVtb3ZlZCBnZXRfYWRkcmVzcyBuYW1lIGNsYXNoIHdpdGggRlBVLgogKglBbGFuIENveAk6CVJlZm9ybWF0dGVkIGEgYml0LgogKglHZXJvIEt1aGxtYW5uCToJQ29kZSBjbGVhbnVwCiAqCU1pY2hhZWwgUmF1c2NoICA6CUZpeGVkIHJlY29nbml0aW9uIG9mIGFuIGluY29taW5nIFJBUlAgYW5zd2VyLgogKglNYXJ0aW4gTWFyZXMJOiAoMi4wKQlBdXRvLWNvbmZpZ3VyYXRpb24gdmlhIEJPT1RQIHN1cHBvcnRlZC4KICoJTWFydGluIE1hcmVzCToJTWFudWFsIHNlbGVjdGlvbiBvZiBpbnRlcmZhY2UgJiBCT09UUC9SQVJQLgogKglNYXJ0aW4gTWFyZXMJOglVc2luZyBuZXR3b3JrIHJvdXRlcyBpbnN0ZWFkIG9mIGhvc3Qgcm91dGVzLAogKgkJCQlhbGxvd2luZyB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHRvIGJlIHVzZWQKICoJCQkJZm9yIG5vcm1hbCBvcGVyYXRpb24gb2YgdGhlIGhvc3QuCiAqCU1hcnRpbiBNYXJlcwk6CVJhbmRvbWl6ZWQgdGltZXIgd2l0aCBleHBvbmVudGlhbCBiYWNrb2ZmCiAqCQkJCWluc3RhbGxlZCB0byBtaW5pbWl6ZSBuZXR3b3JrIGNvbmdlc3Rpb24uCiAqCU1hcnRpbiBNYXJlcwk6CUNvZGUgY2xlYW51cC4KICoJTWFydGluIE1hcmVzCTogKDIuMSkJQk9PVFAgYW5kIFJBUlAgbWFkZSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCiAqCU1hcnRpbiBNYXJlcwk6CVNlcnZlciBob3N0bmFtZSBnZW5lcmF0aW9uIGZpeGVkLgogKglHZXJkIEtub3JyCToJRml4ZWQgd2lyZWQgaW5vZGUgaGFuZGxpbmcKICoJTWFydGluIE1hcmVzCTogKDIuMikJIjAuMC4wLjAiIGFkZHJlc3NlcyBmcm9tIGNvbW1hbmQgbGluZSBpZ25vcmVkLgogKglNYXJ0aW4gTWFyZXMJOglSQVJQIHJlcGxpZXMgbm90IHRlc3RlZCBmb3Igc2VydmVyIGFkZHJlc3MuCiAqCUdlcm8gS3VobG1hbm4JOiAoMi4zKSBTb21lIGJ1ZyBmaXhlcyBhbmQgY29kZSBjbGVhbnVwIGFnYWluIChwbGVhc2UKICoJCQkJc2VuZCBtZSB5b3VyIG5ldyBwYXRjaGVzIF9iZWZvcmVfIGJvdGhlcmluZwogKgkJCQlMaW51cyBzbyB0aGF0IEkgZG9uJyBhbHdheXMgaGF2ZSB0byBjbGVhbnVwCiAqCQkJCV9hZnRlcndhcmRzXyAtIHRoYW5rcykKICoJR2VybyBLdWhsbWFubgk6CUxhc3QgY2hhbmdlcyBvZiBNYXJ0aW4gTWFyZXMgdW5kb25lLgogKglHZXJvIEt1aGxtYW5uCTogCVJBUlAgcmVwbGllcyBhcmUgdGVzdGVkIGZvciBzcGVjaWZpZWQgc2VydmVyCiAqCQkJCWFnYWluLiBIb3dldmVyLCBpdCdzIG5vdyBwb3NzaWJsZSB0byBoYXZlCiAqCQkJCWRpZmZlcmVudCBSQVJQIGFuZCBORlMgc2VydmVycy4KICoJR2VybyBLdWhsbWFubgk6CSIwLjAuMC4wIiBhZGRyZXNzZXMgZnJvbSBjb21tYW5kIGxpbmUgYXJlCiAqCQkJCW5vdyBtYXBwZWQgdG8gSU5BRERSX05PTkUuCiAqCUdlcm8gS3VobG1hbm4JOglGaXhlZCBhIGJ1ZyB3aGljaCBwcmV2ZW50ZWQgQk9PVFAgcGF0aCBuYW1lCiAqCQkJCWZyb20gYmVpbmcgdXNlZCAodGhhbmtzIHRvIExlbyBTcGlla21hbikKICoJQW5keSBXYWxrZXIJOglBbGxvdyB0byBzcGVjaWZ5IHRoZSBORlMgc2VydmVyIGluIG5mc19yb290CiAqCQkJCXdpdGhvdXQgZ2l2aW5nIGEgcGF0aCBuYW1lCiAqCVN3ZW4gVGj8bW1sZXIJOglBbGxvdyB0byBzcGVjaWZ5IHRoZSBORlMgb3B0aW9ucyBpbiBuZnNfcm9vdAogKgkJCQl3aXRob3V0IGdpdmluZyBhIHBhdGggbmFtZS4gRml4IEJPT1RQIHJlcXVlc3QKICoJCQkJZm9yIGRvbWFpbm5hbWUgKGRvbWFpbm5hbWUgaXMgTklTIGRvbWFpbiwgbm90CiAqCQkJCUROUyBkb21haW4hKS4gU2tpcCBkdW1teSBkZXZpY2VzIGZvciBCT09UUC4KICoJSmFjZWsgWmFwYWxhCToJRml4ZWQgYSBidWcgd2hpY2ggcHJldmVudGVkIHNlcnZlci1pcCBhZGRyZXNzCiAqCQkJCWZyb20gbmZzcm9vdCBwYXJhbWV0ZXIgZnJvbSBiZWluZyB1c2VkLgogKglPbGFmIEtpcmNoCToJQWRhcHRlZCB0byBuZXcgTkZTIGNvZGUuCiAqCUpha3ViIEplbGluZWsJOglGcmVlIHVzZWQgY29kZSBzZWdtZW50LgogKglNYXJrbyBLb2h0YWxhCToJRml4ZWQgc29tZSBidWdzLgogKglNYXJ0aW4gTWFyZXMJOglEZWJ1ZyBtZXNzYWdlIGNsZWFudXAKICoJTWFydGluIE1hcmVzCToJQ2hhbmdlZCB0byB1c2UgdGhlIG5ldyBnZW5lcmljIElQIGxheWVyIGF1dG9jb25maWcKICoJCQkJY29kZS4gQk9PVFAgYW5kIFJBUlAgbW92ZWQgdGhlcmUuCiAqCU1hcnRpbiBNYXJlcwk6CURlZmF1bHQgcGF0aCBub3cgY29udGFpbnMgaG9zdCBuYW1lIGluc3RlYWQgb2YKICoJCQkJaG9zdCBJUCBhZGRyZXNzIChidXQgaG9zdCBuYW1lIGRlZmF1bHRzIHRvIElQCiAqCQkJCWFkZHJlc3MgYW55d2F5KS4KICoJTWFydGluIE1hcmVzCToJVXNlIHJvb3Rfc2VydmVyX2FkZHIgYXBwcm9wcmlhdGVseSBkdXJpbmcgc2V0dXAuCiAqCU1hcnRpbiBNYXJlcwk6CVJld3JvdGUgcGFyYW1ldGVyIHBhcnNpbmcsIG5vdyBob3BlZnVsbHkgZ2l2aW5nCiAqCQkJCWNvcnJlY3Qgb3ZlcnJpZGluZy4KICoJVHJvbmQgTXlrbGVidXN0IDoJQWRkIGluIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIE5GU3YzIGFuZCBUQ1AuCiAqCQkJCUZpeCBidWcgaW4gcm9vdF9uZnNfYWRkcigpLiBuZnNfZGF0YS5uYW1sZW4KICoJCQkJaXMgTk9UIGZvciB0aGUgbGVuZ3RoIG9mIHRoZSBob3N0bmFtZS4KICoJSHVhIFFpbgkJOglTdXBwb3J0IGZvciBtb3VudGluZyByb290IGZpbGUgc3lzdGVtIHZpYQogKgkJCQlORlMgb3ZlciBUQ1AuCiAqCUZhYmlhbiBGcmVkZXJpY2s6CU9wdGlvbiBwYXJzZXIgcmVidWlsdCAodXNpbmcgcGFyc2VyIGxpYikKKi8KCiNpbmNsdWRlIDxsaW51eC9jb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPgojaW5jbHVkZSA8bGludXgvdGltZS5oPgojaW5jbHVkZSA8bGludXgvZnMuaD4KI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4KI2luY2x1ZGUgPGxpbnV4L3N1bnJwYy9jbG50Lmg+CiNpbmNsdWRlIDxsaW51eC9uZnMuaD4KI2luY2x1ZGUgPGxpbnV4L25mc19mcy5oPgojaW5jbHVkZSA8bGludXgvbmZzX21vdW50Lmg+CiNpbmNsdWRlIDxsaW51eC9pbi5oPgojaW5jbHVkZSA8bGludXgvbWFqb3IuaD4KI2luY2x1ZGUgPGxpbnV4L3V0c25hbWUuaD4KI2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KI2luY2x1ZGUgPGxpbnV4L3Jvb3RfZGV2Lmg+CiNpbmNsdWRlIDxuZXQvaXBjb25maWcuaD4KI2luY2x1ZGUgPGxpbnV4L3BhcnNlci5oPgoKLyogRGVmaW5lIHRoaXMgdG8gYWxsb3cgZGVidWdnaW5nIG91dHB1dCAqLwojdW5kZWYgTkZTUk9PVF9ERUJVRwojZGVmaW5lIE5GU0RCR19GQUNJTElUWSBORlNEQkdfUk9PVAoKLyogRGVmYXVsdCBwYXRoIHdlIHRyeSB0byBtb3VudC4gIiVzIiBnZXRzIHJlcGxhY2VkIGJ5IG91ciBJUCBhZGRyZXNzICovCiNkZWZpbmUgTkZTX1JPT1QJCSIvdGZ0cGJvb3QvJXMiCgovKiBQYXJhbWV0ZXJzIHBhc3NlZCBmcm9tIHRoZSBrZXJuZWwgY29tbWFuZCBsaW5lICovCnN0YXRpYyBjaGFyIG5mc19yb290X25hbWVbMjU2XSBfX2luaXRkYXRhID0gIiI7CgovKiBBZGRyZXNzIG9mIE5GUyBzZXJ2ZXIgKi8Kc3RhdGljIF9fdTMyIHNlcnZhZGRyIF9faW5pdGRhdGEgPSAwOwoKLyogTmFtZSBvZiBkaXJlY3RvcnkgdG8gbW91bnQgKi8Kc3RhdGljIGNoYXIgbmZzX3BhdGhbTkZTX01BWFBBVEhMRU5dIF9faW5pdGRhdGEgPSB7IDAsIH07CgovKiBORlMtcmVsYXRlZCBkYXRhICovCnN0YXRpYyBzdHJ1Y3QgbmZzX21vdW50X2RhdGEgbmZzX2RhdGEgX19pbml0ZGF0YSA9IHsgMCwgfTsvKiBORlMgbW91bnQgaW5mbyAqLwpzdGF0aWMgaW50IG5mc19wb3J0IF9faW5pdGRhdGEgPSAwOwkJLyogUG9ydCB0byBjb25uZWN0IHRvIGZvciBORlMgKi8Kc3RhdGljIGludCBtb3VudF9wb3J0IF9faW5pdGRhdGEgPSAwOwkJLyogTW91bnQgZGFlbW9uIHBvcnQgbnVtYmVyICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoKCQkJICAgICBQYXJzaW5nIG9mIG9wdGlvbnMKCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgplbnVtIHsKCS8qIE9wdGlvbnMgdGhhdCB0YWtlIGludGVnZXIgYXJndW1lbnRzICovCglPcHRfcG9ydCwgT3B0X3JzaXplLCBPcHRfd3NpemUsIE9wdF90aW1lbywgT3B0X3JldHJhbnMsIE9wdF9hY3JlZ21pbiwKCU9wdF9hY3JlZ21heCwgT3B0X2FjZGlybWluLCBPcHRfYWNkaXJtYXgsCgkvKiBPcHRpb25zIHRoYXQgdGFrZSBubyBhcmd1bWVudHMgKi8KCU9wdF9zb2Z0LCBPcHRfaGFyZCwgT3B0X2ludHIsCglPcHRfbm9pbnRyLCBPcHRfcG9zaXgsIE9wdF9ub3Bvc2l4LCBPcHRfY3RvLCBPcHRfbm9jdG8sIE9wdF9hYywgCglPcHRfbm9hYywgT3B0X2xvY2ssIE9wdF9ub2xvY2ssIE9wdF92MiwgT3B0X3YzLCBPcHRfdWRwLCBPcHRfdGNwLAoJLyogRXJyb3IgdG9rZW4gKi8KCU9wdF9lcnIKfTsKCnN0YXRpYyBtYXRjaF90YWJsZV90IF9faW5pdGRhdGEgdG9rZW5zID0gewoJe09wdF9wb3J0LCAicG9ydD0ldSJ9LAoJe09wdF9yc2l6ZSwgInJzaXplPSV1In0sCgl7T3B0X3dzaXplLCAid3NpemU9JXUifSwKCXtPcHRfdGltZW8sICJ0aW1lbz0ldSJ9LAoJe09wdF9yZXRyYW5zLCAicmV0cmFucz0ldSJ9LAoJe09wdF9hY3JlZ21pbiwgImFjcmVnbWluPSV1In0sCgl7T3B0X2FjcmVnbWF4LCAiYWNyZWdtYXg9JXUifSwKCXtPcHRfYWNkaXJtaW4sICJhY2Rpcm1pbj0ldSJ9LAoJe09wdF9hY2Rpcm1heCwgImFjZGlybWF4PSV1In0sCgl7T3B0X3NvZnQsICJzb2Z0In0sCgl7T3B0X2hhcmQsICJoYXJkIn0sCgl7T3B0X2ludHIsICJpbnRyIn0sCgl7T3B0X25vaW50ciwgIm5vaW50ciJ9LAoJe09wdF9wb3NpeCwgInBvc2l4In0sCgl7T3B0X25vcG9zaXgsICJub3Bvc2l4In0sCgl7T3B0X2N0bywgImN0byJ9LAoJe09wdF9ub2N0bywgIm5vY3RvIn0sCgl7T3B0X2FjLCAiYWMifSwKCXtPcHRfbm9hYywgIm5vYWMifSwKCXtPcHRfbG9jaywgImxvY2sifSwKCXtPcHRfbm9sb2NrLCAibm9sb2NrIn0sCgl7T3B0X3YyLCAibmZzdmVycz0yIn0sCgl7T3B0X3YyLCAidjIifSwKCXtPcHRfdjMsICJuZnN2ZXJzPTMifSwKCXtPcHRfdjMsICJ2MyJ9LAoJe09wdF91ZHAsICJwcm90bz11ZHAifSwKCXtPcHRfdWRwLCAidWRwIn0sCgl7T3B0X3RjcCwgInByb3RvPXRjcCJ9LAoJe09wdF90Y3AsICJ0Y3AifSwKCXtPcHRfZXJyLCBOVUxMfQoJCn07CgovKgogKiAgUGFyc2Ugb3B0aW9uIHN0cmluZy4KICovCgpzdGF0aWMgaW50IF9faW5pdCByb290X25mc19wYXJzZShjaGFyICpuYW1lLCBjaGFyICpidWYpCnsKCgljaGFyICpwOwoJc3Vic3RyaW5nX3QgYXJnc1tNQVhfT1BUX0FSR1NdOwoJaW50IG9wdGlvbjsKCglpZiAoIW5hbWUpCgkJcmV0dXJuIDE7CgoJLyogU2V0IHRoZSBORlMgcmVtb3RlIHBhdGggKi8KCXAgPSBzdHJzZXAoJm5hbWUsICIsIik7CglpZiAocFswXSAhPSAnXDAnICYmIHN0cmNtcChwLCAiZGVmYXVsdCIpICE9IDApCgkJc3RybGNweShidWYsIHAsIE5GU19NQVhQQVRITEVOKTsKCgl3aGlsZSAoKHAgPSBzdHJzZXAgKCZuYW1lLCAiLCIpKSAhPSBOVUxMKSB7CgkJaW50IHRva2VuOyAKCQlpZiAoISpwKQoJCQljb250aW51ZTsKCQl0b2tlbiA9IG1hdGNoX3Rva2VuKHAsIHRva2VucywgYXJncyk7CgoJCS8qICV1IHRva2VucyBvbmx5LiBCZXdhcmUgaWYgeW91IGFkZCBuZXcgdG9rZW5zISAqLwoJCWlmICh0b2tlbiA8IE9wdF9zb2Z0ICYmIG1hdGNoX2ludCgmYXJnc1swXSwgJm9wdGlvbikpCgkJCXJldHVybiAwOwoJCXN3aXRjaCAodG9rZW4pIHsKCQkJY2FzZSBPcHRfcG9ydDoKCQkJCW5mc19wb3J0ID0gb3B0aW9uOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X3JzaXplOgoJCQkJbmZzX2RhdGEucnNpemUgPSBvcHRpb247CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfd3NpemU6CgkJCQluZnNfZGF0YS53c2l6ZSA9IG9wdGlvbjsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF90aW1lbzoKCQkJCW5mc19kYXRhLnRpbWVvID0gb3B0aW9uOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X3JldHJhbnM6CgkJCQluZnNfZGF0YS5yZXRyYW5zID0gb3B0aW9uOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X2FjcmVnbWluOgoJCQkJbmZzX2RhdGEuYWNyZWdtaW4gPSBvcHRpb247CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfYWNyZWdtYXg6CgkJCQluZnNfZGF0YS5hY3JlZ21heCA9IG9wdGlvbjsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9hY2Rpcm1pbjoKCQkJCW5mc19kYXRhLmFjZGlybWluID0gb3B0aW9uOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X2FjZGlybWF4OgoJCQkJbmZzX2RhdGEuYWNkaXJtYXggPSBvcHRpb247CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfc29mdDoKCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9TT0ZUOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X2hhcmQ6CgkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX1NPRlQ7CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfaW50cjoKCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9JTlRSOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X25vaW50cjoKCQkJCW5mc19kYXRhLmZsYWdzICY9IH5ORlNfTU9VTlRfSU5UUjsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9wb3NpeDoKCQkJCW5mc19kYXRhLmZsYWdzIHw9IE5GU19NT1VOVF9QT1NJWDsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9ub3Bvc2l4OgoJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9QT1NJWDsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9jdG86CgkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX05PQ1RPOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X25vY3RvOgoJCQkJbmZzX2RhdGEuZmxhZ3MgfD0gTkZTX01PVU5UX05PQ1RPOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X2FjOgoJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9OT0FDOwoJCQkJYnJlYWs7CgkJCWNhc2UgT3B0X25vYWM6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfTk9BQzsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9sb2NrOgoJCQkJbmZzX2RhdGEuZmxhZ3MgJj0gfk5GU19NT1VOVF9OT05MTTsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF9ub2xvY2s6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfTk9OTE07CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfdjI6CgkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX1ZFUjM7CgkJCQlicmVhazsKCQkJY2FzZSBPcHRfdjM6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfVkVSMzsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF91ZHA6CgkJCQluZnNfZGF0YS5mbGFncyAmPSB+TkZTX01PVU5UX1RDUDsKCQkJCWJyZWFrOwoJCQljYXNlIE9wdF90Y3A6CgkJCQluZnNfZGF0YS5mbGFncyB8PSBORlNfTU9VTlRfVENQOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQgOiAKCQkJCXJldHVybiAwOwoJCX0KCX0KCglyZXR1cm4gMTsKfQoKLyoKICogIFByZXBhcmUgdGhlIE5GUyBkYXRhIHN0cnVjdHVyZSBhbmQgcGFyc2UgYWxsIG9wdGlvbnMuCiAqLwpzdGF0aWMgaW50IF9faW5pdCByb290X25mc19uYW1lKGNoYXIgKm5hbWUpCnsKCXN0YXRpYyBjaGFyIGJ1ZltORlNfTUFYUEFUSExFTl0gX19pbml0ZGF0YTsKCWNoYXIgKmNwOwoKCS8qIFNldCBzb21lIGRlZmF1bHQgdmFsdWVzICovCgltZW1zZXQoJm5mc19kYXRhLCAwLCBzaXplb2YobmZzX2RhdGEpKTsKCW5mc19wb3J0ICAgICAgICAgID0gLTE7CgluZnNfZGF0YS52ZXJzaW9uICA9IE5GU19NT1VOVF9WRVJTSU9OOwoJbmZzX2RhdGEuZmxhZ3MgICAgPSBORlNfTU9VTlRfTk9OTE07CS8qIE5vIGxvY2tkIGluIG5mcyByb290IHlldCAqLwoJbmZzX2RhdGEucnNpemUgICAgPSBORlNfREVGX0ZJTEVfSU9fQlVGRkVSX1NJWkU7CgluZnNfZGF0YS53c2l6ZSAgICA9IE5GU19ERUZfRklMRV9JT19CVUZGRVJfU0laRTsKCW5mc19kYXRhLmFjcmVnbWluID0gMzsKCW5mc19kYXRhLmFjcmVnbWF4ID0gNjA7CgluZnNfZGF0YS5hY2Rpcm1pbiA9IDMwOwoJbmZzX2RhdGEuYWNkaXJtYXggPSA2MDsKCXN0cmNweShidWYsIE5GU19ST09UKTsKCgkvKiBQcm9jZXNzIG9wdGlvbnMgcmVjZWl2ZWQgZnJvbSB0aGUgcmVtb3RlIHNlcnZlciAqLwoJcm9vdF9uZnNfcGFyc2Uocm9vdF9zZXJ2ZXJfcGF0aCwgYnVmKTsKCgkvKiBPdmVycmlkZSB0aGVtIGJ5IG9wdGlvbnMgc2V0IG9uIGtlcm5lbCBjb21tYW5kLWxpbmUgKi8KCXJvb3RfbmZzX3BhcnNlKG5hbWUsIGJ1Zik7CgoJY3AgPSBzeXN0ZW1fdXRzbmFtZS5ub2RlbmFtZTsKCWlmIChzdHJsZW4oYnVmKSArIHN0cmxlbihjcCkgPiBORlNfTUFYUEFUSExFTikgewoJCXByaW50ayhLRVJOX0VSUiAiUm9vdC1ORlM6IFBhdGhuYW1lIGZvciByZW1vdGUgZGlyZWN0b3J5IHRvbyBsb25nLlxuIik7CgkJcmV0dXJuIC0xOwoJfQoJc3ByaW50ZihuZnNfcGF0aCwgYnVmLCBjcCk7CgoJcmV0dXJuIDE7Cn0KCgovKgogKiAgR2V0IE5GUyBzZXJ2ZXIgYWRkcmVzcy4KICovCnN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2FkZHIodm9pZCkKewoJaWYgKChzZXJ2YWRkciA9IHJvb3Rfc2VydmVyX2FkZHIpID09IElOQUREUl9OT05FKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogTm8gTkZTIHNlcnZlciBhdmFpbGFibGUsIGdpdmluZyB1cC5cbiIpOwoJCXJldHVybiAtMTsKCX0KCglzbnByaW50ZihuZnNfZGF0YS5ob3N0bmFtZSwgc2l6ZW9mKG5mc19kYXRhLmhvc3RuYW1lKSwKCQkgIiV1LiV1LiV1LiV1IiwgTklQUVVBRChzZXJ2YWRkcikpOwoJcmV0dXJuIDA7Cn0KCi8qCiAqICBUZWxsIHRoZSB1c2VyIHdoYXQncyBnb2luZyBvbi4KICovCiNpZmRlZiBORlNST09UX0RFQlVHCnN0YXRpYyB2b2lkIF9faW5pdCByb290X25mc19wcmludCh2b2lkKQp7CglwcmludGsoS0VSTl9OT1RJQ0UgIlJvb3QtTkZTOiBNb3VudGluZyAlcyBvbiBzZXJ2ZXIgJXMgYXMgcm9vdFxuIiwKCQluZnNfcGF0aCwgbmZzX2RhdGEuaG9zdG5hbWUpOwoJcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogICAgIHJzaXplID0gJWQsIHdzaXplID0gJWQsIHRpbWVvID0gJWQsIHJldHJhbnMgPSAlZFxuIiwKCQluZnNfZGF0YS5yc2l6ZSwgbmZzX2RhdGEud3NpemUsIG5mc19kYXRhLnRpbWVvLCBuZnNfZGF0YS5yZXRyYW5zKTsKCXByaW50ayhLRVJOX05PVElDRSAiUm9vdC1ORlM6ICAgICBhY3JlZyAobWluLG1heCkgPSAoJWQsJWQpLCBhY2RpciAobWluLG1heCkgPSAoJWQsJWQpXG4iLAoJCW5mc19kYXRhLmFjcmVnbWluLCBuZnNfZGF0YS5hY3JlZ21heCwKCQluZnNfZGF0YS5hY2Rpcm1pbiwgbmZzX2RhdGEuYWNkaXJtYXgpOwoJcHJpbnRrKEtFUk5fTk9USUNFICJSb290LU5GUzogICAgIG5mc2QgcG9ydCA9ICVkLCBtb3VudGQgcG9ydCA9ICVkLCBmbGFncyA9ICUwOHhcbiIsCgkJbmZzX3BvcnQsIG1vdW50X3BvcnQsIG5mc19kYXRhLmZsYWdzKTsKfQojZW5kaWYKCgpzdGF0aWMgaW50IF9faW5pdCByb290X25mc19pbml0KHZvaWQpCnsKI2lmZGVmIE5GU1JPT1RfREVCVUcKCW5mc19kZWJ1ZyB8PSBORlNEQkdfUk9PVDsKI2VuZGlmCgoJLyoKCSAqIERlY29kZSB0aGUgcm9vdCBkaXJlY3RvcnkgcGF0aCBuYW1lIGFuZCBORlMgb3B0aW9ucyBmcm9tCgkgKiB0aGUga2VybmVsIGNvbW1hbmQgbGluZS4gVGhpcyBoYXMgdG8gZ28gaGVyZSBpbiBvcmRlciB0bwoJICogYmUgYWJsZSB0byB1c2UgdGhlIGNsaWVudCBJUCBhZGRyZXNzIGZvciB0aGUgcmVtb3RlIHJvb3QKCSAqIGRpcmVjdG9yeSAobmVjZXNzYXJ5IGZvciBwdXJlIFJBUlAgYm9vdGluZykuCgkgKi8KCWlmIChyb290X25mc19uYW1lKG5mc19yb290X25hbWUpIDwgMCB8fAoJICAgIHJvb3RfbmZzX2FkZHIoKSA8IDApCgkJcmV0dXJuIC0xOwoKI2lmZGVmIE5GU1JPT1RfREVCVUcKCXJvb3RfbmZzX3ByaW50KCk7CiNlbmRpZgoKCXJldHVybiAwOwp9CgoKLyoKICogIFBhcnNlIE5GUyBzZXJ2ZXIgYW5kIGRpcmVjdG9yeSBpbmZvcm1hdGlvbiBwYXNzZWQgb24gdGhlIGtlcm5lbAogKiAgY29tbWFuZCBsaW5lLgogKi8Kc3RhdGljIGludCBfX2luaXQgbmZzX3Jvb3Rfc2V0dXAoY2hhciAqbGluZSkKewoJUk9PVF9ERVYgPSBSb290X05GUzsKCWlmIChsaW5lWzBdID09ICcvJyB8fCBsaW5lWzBdID09ICcsJyB8fCAobGluZVswXSA+PSAnMCcgJiYgbGluZVswXSA8PSAnOScpKSB7CgkJc3RybGNweShuZnNfcm9vdF9uYW1lLCBsaW5lLCBzaXplb2YobmZzX3Jvb3RfbmFtZSkpOwoJfSBlbHNlIHsKCQlpbnQgbiA9IHN0cmxlbihsaW5lKSArIHNpemVvZihORlNfUk9PVCkgLSAxOwoJCWlmIChuID49IHNpemVvZihuZnNfcm9vdF9uYW1lKSkKCQkJbGluZVtzaXplb2YobmZzX3Jvb3RfbmFtZSkgLSBzaXplb2YoTkZTX1JPT1QpIC0gMl0gPSAnXDAnOwoJCXNwcmludGYobmZzX3Jvb3RfbmFtZSwgTkZTX1JPT1QsIGxpbmUpOwoJfQoJcm9vdF9zZXJ2ZXJfYWRkciA9IHJvb3RfbmZzX3BhcnNlX2FkZHIobmZzX3Jvb3RfbmFtZSk7CglyZXR1cm4gMTsKfQoKX19zZXR1cCgibmZzcm9vdD0iLCBuZnNfcm9vdF9zZXR1cCk7CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCgoJICAgICAgIFJvdXRpbmVzIHRvIGFjdHVhbGx5IG1vdW50IHRoZSByb290IGRpcmVjdG9yeQoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qCiAqICBDb25zdHJ1Y3Qgc29ja2FkZHJfaW4gZnJvbSBhZGRyZXNzIGFuZCBwb3J0IG51bWJlci4KICovCnN0YXRpYyBpbmxpbmUgdm9pZApzZXRfc29ja2FkZHIoc3RydWN0IHNvY2thZGRyX2luICpzaW4sIF9fdTMyIGFkZHIsIF9fdTE2IHBvcnQpCnsKCXNpbi0+c2luX2ZhbWlseSA9IEFGX0lORVQ7CglzaW4tPnNpbl9hZGRyLnNfYWRkciA9IGFkZHI7CglzaW4tPnNpbl9wb3J0ID0gcG9ydDsKfQoKLyoKICogIFF1ZXJ5IHNlcnZlciBwb3J0bWFwcGVyIGZvciB0aGUgcG9ydCBvZiBhIGRhZW1vbiBwcm9ncmFtLgogKi8Kc3RhdGljIGludCBfX2luaXQgcm9vdF9uZnNfZ2V0cG9ydChpbnQgcHJvZ3JhbSwgaW50IHZlcnNpb24sIGludCBwcm90bykKewoJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKCglwcmludGsoS0VSTl9OT1RJQ0UgIkxvb2tpbmcgdXAgcG9ydCBvZiBSUEMgJWQvJWQgb24gJXUuJXUuJXUuJXVcbiIsCgkJcHJvZ3JhbSwgdmVyc2lvbiwgTklQUVVBRChzZXJ2YWRkcikpOwoJc2V0X3NvY2thZGRyKCZzaW4sIHNlcnZhZGRyLCAwKTsKCXJldHVybiBycGNfZ2V0cG9ydF9leHRlcm5hbCgmc2luLCBwcm9ncmFtLCB2ZXJzaW9uLCBwcm90byk7Cn0KCgovKgogKiAgVXNlIHBvcnRtYXBwZXIgdG8gZmluZCBtb3VudGQgYW5kIG5mc2QgcG9ydCBudW1iZXJzIGlmIG5vdCBvdmVycmlkZW4KICogIGJ5IHRoZSB1c2VyLiBVc2UgZGVmYXVsdHMgaWYgcG9ydG1hcHBlciBpcyBub3QgYXZhaWxhYmxlLgogKiAgWFhYOiBJcyB0aGVyZSBhbnkgbmZzIHNlcnZlciB3aXRoIG5vIHBvcnRtYXBwZXI/CiAqLwpzdGF0aWMgaW50IF9faW5pdCByb290X25mc19wb3J0cyh2b2lkKQp7CglpbnQgcG9ydDsKCWludCBuZnNkX3ZlciwgbW91bnRkX3ZlcjsKCWludCBuZnNkX3BvcnQsIG1vdW50ZF9wb3J0OwoJaW50IHByb3RvOwoKCWlmIChuZnNfZGF0YS5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSB7CgkJbmZzZF92ZXIgPSBORlMzX1ZFUlNJT047CgkJbW91bnRkX3ZlciA9IE5GU19NTlQzX1ZFUlNJT047CgkJbmZzZF9wb3J0ID0gTkZTX1BPUlQ7CgkJbW91bnRkX3BvcnQgPSBORlNfTU5UX1BPUlQ7Cgl9IGVsc2UgewoJCW5mc2RfdmVyID0gTkZTMl9WRVJTSU9OOwoJCW1vdW50ZF92ZXIgPSBORlNfTU5UX1ZFUlNJT047CgkJbmZzZF9wb3J0ID0gTkZTX1BPUlQ7CgkJbW91bnRkX3BvcnQgPSBORlNfTU5UX1BPUlQ7Cgl9CgoJcHJvdG8gPSAobmZzX2RhdGEuZmxhZ3MgJiBORlNfTU9VTlRfVENQKSA/IElQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7CgoJaWYgKG5mc19wb3J0IDwgMCkgewoJCWlmICgocG9ydCA9IHJvb3RfbmZzX2dldHBvcnQoTkZTX1BST0dSQU0sIG5mc2RfdmVyLCBwcm90bykpIDwgMCkgewoJCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBVbmFibGUgdG8gZ2V0IG5mc2QgcG9ydCAiCgkJCQkJIm51bWJlciBmcm9tIHNlcnZlciwgdXNpbmcgZGVmYXVsdFxuIik7CgkJCXBvcnQgPSBuZnNkX3BvcnQ7CgkJfQoJCW5mc19wb3J0ID0gaHRvbnMocG9ydCk7CgkJZHByaW50aygiUm9vdC1ORlM6IFBvcnRtYXBwZXIgb24gc2VydmVyIHJldHVybmVkICVkICIKCQkJImFzIG5mc2QgcG9ydFxuIiwgcG9ydCk7Cgl9CgoJaWYgKChwb3J0ID0gcm9vdF9uZnNfZ2V0cG9ydChORlNfTU5UX1BST0dSQU0sIG1vdW50ZF92ZXIsIHByb3RvKSkgPCAwKSB7CgkJcHJpbnRrKEtFUk5fRVJSICJSb290LU5GUzogVW5hYmxlIHRvIGdldCBtb3VudGQgcG9ydCAiCgkJCQkibnVtYmVyIGZyb20gc2VydmVyLCB1c2luZyBkZWZhdWx0XG4iKTsKCQlwb3J0ID0gbW91bnRkX3BvcnQ7Cgl9Cgltb3VudF9wb3J0ID0gaHRvbnMocG9ydCk7CglkcHJpbnRrKCJSb290LU5GUzogbW91bnRkIHBvcnQgaXMgJWRcbiIsIHBvcnQpOwoKCXJldHVybiAwOwp9CgoKLyoKICogIEdldCBhIGZpbGUgaGFuZGxlIGZyb20gdGhlIHNlcnZlciBmb3IgdGhlIGRpcmVjdG9yeSB3aGljaCBpcyB0byBiZQogKiAgbW91bnRlZC4KICovCnN0YXRpYyBpbnQgX19pbml0IHJvb3RfbmZzX2dldF9oYW5kbGUodm9pZCkKewoJc3RydWN0IG5mc19maCBmaDsKCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CglpbnQgc3RhdHVzOwoJaW50IHByb3RvY29sID0gKG5mc19kYXRhLmZsYWdzICYgTkZTX01PVU5UX1RDUCkgPwoJCQkJCUlQUFJPVE9fVENQIDogSVBQUk9UT19VRFA7CglpbnQgdmVyc2lvbiA9IChuZnNfZGF0YS5mbGFncyAmIE5GU19NT1VOVF9WRVIzKSA/CgkJCQkJTkZTX01OVDNfVkVSU0lPTiA6IE5GU19NTlRfVkVSU0lPTjsKCglzZXRfc29ja2FkZHIoJnNpbiwgc2VydmFkZHIsIG1vdW50X3BvcnQpOwoJc3RhdHVzID0gbmZzcm9vdF9tb3VudCgmc2luLCBuZnNfcGF0aCwgJmZoLCB2ZXJzaW9uLCBwcm90b2NvbCk7CglpZiAoc3RhdHVzIDwgMCkKCQlwcmludGsoS0VSTl9FUlIgIlJvb3QtTkZTOiBTZXJ2ZXIgcmV0dXJuZWQgZXJyb3IgJWQgIgoJCQkJIndoaWxlIG1vdW50aW5nICVzXG4iLCBzdGF0dXMsIG5mc19wYXRoKTsKCWVsc2UgewoJCW5mc19kYXRhLnJvb3Quc2l6ZSA9IGZoLnNpemU7CgkJbWVtY3B5KG5mc19kYXRhLnJvb3QuZGF0YSwgZmguZGF0YSwgZmguc2l6ZSk7Cgl9CgoJcmV0dXJuIHN0YXR1czsKfQoKLyoKICogIEdldCB0aGUgTkZTIHBvcnQgbnVtYmVycyBhbmQgZmlsZSBoYW5kbGUsIGFuZCByZXR1cm4gdGhlIHByZXBhcmVkICdkYXRhJwogKiAgYXJndW1lbnQgZm9yIG1vdW50KCkgaWYgZXZlcnl0aGluZyB3ZW50IE9LLiBSZXR1cm4gTlVMTCBvdGhlcndpc2UuCiAqLwp2b2lkICogX19pbml0IG5mc19yb290X2RhdGEodm9pZCkKewoJaWYgKHJvb3RfbmZzX2luaXQoKSA8IDAKCSB8fCByb290X25mc19wb3J0cygpIDwgMAoJIHx8IHJvb3RfbmZzX2dldF9oYW5kbGUoKSA8IDApCgkJcmV0dXJuIE5VTEw7CglzZXRfc29ja2FkZHIoKHN0cnVjdCBzb2NrYWRkcl9pbiAqKSAmbmZzX2RhdGEuYWRkciwgc2VydmFkZHIsIG5mc19wb3J0KTsKCXJldHVybiAodm9pZCopJm5mc19kYXRhOwp9Cg==