LypAejQ4LmM6UERGIGJhY2sgZW5kQCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBUSEUgTE9VVCBET0NVTUVOVCBGT1JNQVRUSU5HIFNZU1RFTSAoVkVSU0lPTiAzLjI0KSAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIENPUFlSSUdIVCAoQykgMTk5MSwgMjAwMCBKZWZmcmV5IEguIEtpbmdzdG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBKZWZmcmV5IEguIEtpbmdzdG9uIChqZWZmQGNzLnVzeWQuZWR1LmF1KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIEJhc3NlciBEZXBhcnRtZW50IG9mIENvbXB1dGVyIFNjaWVuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgVGhlIFVuaXZlcnNpdHkgb2YgU3lkbmV5IDIwMDYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBBVVNUUkFMSUEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgVGhpcyBQREYgQmFjayBFbmQgbW9kdWxlIHdyaXR0ZW4gYnkgVmluY2VudCBUYW4sIE1hcmNoIDE5OTguICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5ICAgICAqLwovKiAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgICAgICovCi8qICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgVmVyc2lvbiAyLCBvciAoYXQgeW91ciBvcHRpb24pICAgICAgKi8KLyogIGFueSBsYXRlciB2ZXJzaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgICAgICAgICAgKi8KLyogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mICAgICAgICAgICAqLwovKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSAgICAgICAgICAgICovCi8qICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgICAgICAgICovCi8qICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSAgICAgICAgICAgICAgKi8KLyogIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24gTUEgMDIxMTEtMTMwNyBVU0EgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBGSUxFOiAgICAgICAgIHo0OC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIE1PRFVMRTogICAgICAgUERGIGJhY2sgZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgRVhURVJOUzogICAgICBQREZGaWxlX0luaXQoKSwgUERGRmlsZV9CZWdpbkZvbnRFbmNvZGluZygpLCAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgIFBERkZpbGVfRW5kRm9udEVuY29kaW5nKCksIFBERkZpbGVfQ2xlYW51cCgpLCAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgUERGUGFnZV9Jbml0KCksIFBERlBhZ2VfQ2xlYW51cCgpLCBQREZQYWdlX1dyaXRlKCksICAgICAgICAqLwovKiAgICAgICAgICAgICAgICBQREZQYWdlX1B1c2goKSwgUERGUGFnZV9Qb3AoKSwgUERGUGFnZV9TY2FsZSgpLCAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgIFBERlBhZ2VfVHJhbnNsYXRlKCksIFBERlBhZ2VfUm90YXRlKCksIFBERlBhZ2VfU2V0VmFycygpLCAgKi8KLyogICAgICAgICAgICAgICAgUERGUGFnZV9Xcml0ZUdyYXBoaWMoKSwgUERGUGFnZV9QcmludFVuZGVybGluZSgpLCAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICBQREZGb250X0FkZEZvbnQoKSwgUERGRm9udF9TZXQoKSwgUERGVGV4dF9PcGVuWFkoKSwgICAgICAgICovCi8qICAgICAgICAgICAgICAgIFBERlRleHRfT3BlblgoKSwgUERGVGV4dF9PcGVuKCksIFBERlRleHRfS2VybigpLCAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgUERGVGV4dF9DbG9zZSgpLCBQREZIYXNWYWxpZFRleHRNYXRyaXgoKSAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSAgUEkgICAzLjE0MTU5MjY1MzU4OTc5MzExNjAKI2luY2x1ZGUgImV4dGVybnMuaCIKCgovKiBBTlNJIGhlYWRlcnMgKi8KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDx0aW1lLmg+CgovKiB6bGliIGhlYWRlcnM6IGRlZmluZSBQREZfQ09NUFJFU1NJT04gPSAwIGlmIHlvdSBkb24ndCBoYXZlIHpsaWIgbGlicmFyeSAqLwojaWYgUERGX0NPTVBSRVNTSU9OCiNpbmNsdWRlICJ6bGliLmgiCiNlbmRpZgoKc3RhdGljIHZvaWQgQXNzZXJ0KEJPT0xFQU4gY29uZGl0aW9uLCBGSUxFX1BPUyAqaW5GaWxlUG9zKQp7CiAgaWYgKCFjb25kaXRpb24pCQkvKiBhbGxvd3MgbWUgdG8gc2V0IGEgYnJlYWtwb2ludCBoZXJlICovCiAgYXNzZXJ0KGNvbmRpdGlvbiwgaW5GaWxlUG9zKTsKfQoKLyogI2RlZmluZSdzIGFuZCB0eXBlZGVmcyAqLwojdW5kZWYgVVNFX01BVFJJQ0VTCiN1bmRlZiBfQ0FMQ19MQVJHRVNUX1BBR0VfT0JKRUNUXwoKZW51bSB7CiAga0Jhc2UxNEZvbnRDb3VudCA9IDE0LCAgICAvKiB0aGVyZSBhcmUgMTQgYmFzZSBQREYgZm9udHMgKi8KICBrQnVmZmVyU2l6ZSA9IDEwMjQJICAgIC8qIHNpemUgb2YgYnVmZmVyIGZvciBza2lwcGluZyBub24tbWFya2luZyBjb21tYW5kcyAqLwp9OwoKI2lmIFBERl9DT01QUkVTU0lPTgplbnVtIHsKICBrUmF3T3V0cHV0QnVmZmVyU2l6ZSA9IDQwOTYsCQkvKiBhcmJpdHJhcnkgY2hvaWNlICovCiAga0NvbXByZXNzZWRPdXRwdXRCdWZmZXJTaXplID0gNDA5NgkvKiBhcmJpdHJhcnkgY2hvaWNlICovCn07CiNlbmRpZgoKZW51bSB7CiAga051bWJlck9mT2JqZWN0c1BlckJsb2NrID0gMjU2LAkvKiBhcmJpdHJhcnkgY2hvaWNlICovCiAga051bWJlck9mUGFnZXNQZXJCbG9jayA9IDY0CQkvKiBhcmJpdHJhcnkgY2hvaWNlICovCn07Cgp0eXBlZGVmIGVudW0gewogIGtGaXROb0NoYW5nZSA9IDAsCS8qIHNwZWNpYWwgZGVmYXVsdCBjYXNlICovCiAga0ZpdCwJCQkvKiBbIC9GaXQgXTogZml0IHRoZSBwYWdlIHRvIHRoZSB3aW5kb3cgKi8KICBrRml0SCwJCS8qIFsgL0ZpdEggdG9wIF06IGZpdCB0aGUgd2lkdGggb2YgdGhlIHBhZ2UgdG8gd2luZG93OyAqLwoJCQkvKiB0b3Agc3BlY2lmaWVzIHktY29vcmQgb2YgdGhlIHRvcCBlZGdlIG9mIHRoZSB3aW5kb3cgKi8KICBrRml0ViwJCS8qIFsgL0ZpdFYgbGVmdCBdOiBmaXQgdGhlIGhlaWdodCBvZiB0aGUgcGFnZSB0byB0aGUgICAqLwoJCQkvKiB3aW5kb3cuIGxlZnQgc3BlY2lmaWVzIHgtY29vcmQgb2YgbGVmdCBlZGdlIG9mIHdpbi4gKi8KICBrRml0UiwJCS8qIFsgL0ZpdFIgbGVmdCBib3R0b20gcmlnaHQgdG9wIF06IGZpdCB0aGUgcmVjdGFuZ2xlICAqLwoJCQkvKiBzcGVjaWZpZWQgYnkgbGVmdCBib3R0b20gcmlnaHQgdG9wIGluIHRoZSB3aW5kb3cuICAgKi8KCQkJLyogSWYgdGhlIGhlaWdodCAodG9wIC0gYm90dG9tKSBhbmQgd2lkdGggKHJpZ2h0LWxlZnQpICovCgkJCS8qIGltcGx5IGRpZmZlcmVudCB6b29tIGZhY3RvcnMsIHRoZSBudW1lcmljYWxseSAgICAgICAqLwoJCQkvKiBzbWFsbGVyIHpvb20gZmFjdG9yIGlzIHVzZWQsIHRvIGVuc3VyZSB0aGF0IHRoZSAgICAgKi8KCQkJLyogc3BlY2lmaWVkIHJlY3RhbmdsZSBmaXRzIGluIHRoZSB3aW5kb3cgICAgICAgICAgICAgICovCiAga0ZpdEIsCQkvKiBbIC9GaXRCIF06IGZpdCB0aGUgcGFnZSdzIGJvdW5kaW5nIGJveCB0byB3aW5kb3cgICAgKi8KICBrRml0QkgsCQkvKiBbIC9GaXRCSCB0b3AgXTogZml0IHRoZSB3aWR0aCBvZiB0aGUgcGFnZSdzIGJvdW5kLiAgKi8KCQkJLyogYm94IHRvIHRoZSB3aW5kb3cuIHRvcCBzcGVjaWZpZXMgdGhlIHktY29vcmRpbmF0ZSAgICovCgkJCS8qIG9mIHRoZSB0b3AgZWRnZSBvZiB0aGUgd2luZG93ICAgICAgICAgICAgICAgICAgICAgICAqLwogIGtGaXRCViwJCS8qIFsgL0ZpdEJWIGxlZnQgXTogZml0IHRoZSBoZWlnaHQgb2YgdGhlIHBhZ2UncyAgICAgICAqLwoJCQkvKiBib3VuZGluZyBib3ggdG8gdGhlIHdpbmRvdy4gbGVmdCBzcGVjaWZpZXMgdGhlICAgICAgKi8KCQkJLyogeC1jb29yZGluYXRlIG9mIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHdpbmRvdyAgICAgICAgICovCgogIGtOdW1iZXJPZkRlc3RMaW5rT3B0aW9ucwp9IFBERl9MSU5LX0RFU1RfT1BUSU9OOwoKZW51bSBlVW5pdHNLZXl3b3JkcyB7CiAga19pbiA9IDAsCiAga19jbSwKICBrX3B0LAogIGtfZW0sCiAga19sb3V0ZiwKICBrX2xvdXR2LAogIGtfbG91dHMsCiAga051bWJlck9mVW5pdEtleXdvcmRzCn07CgplbnVtIGVHcmFwaGljc0tleXdvcmRzIHsKICBrX3hzaXplID0gMCwKICBrX3lzaXplLAogIGtfeG1hcmssCiAga195bWFyaywKICBrTnVtYmVyT2ZHcmFwaGljc0tleXdvcmRzCn07CgplbnVtIGVBcml0aG1ldGljS2V5d29yZHMgewogIGtfYWRkID0gMCwKICBrX3N1YiwKICBrX211bCwKICBrX2RpdiwKICBrX3NpbiwKICBrX2NvcywKICBrX3BpY2ssCiAga051bWJlck9mQXJpdGhtZXRpY0tleXdvcmRzCn07Cgp0eXBlZGVmIGVudW0gewogIGtfbGlua19zb3VyY2UgPSAwLAkvKiBzb3VyY2Ugb2YgYSBsaW5rIHRvIGFuIGludGVybmFsIGRvY3VtZW50IHRhcmdldCAqLwogIGtfbGlua19leHRlcm5hbCwJLyogc291cmNlIG9mIGEgbGluayB0byBhbiBleHRlcm5hbCBkb2N1bWVudCB0YXJnZXQgKi8KICBrX2xpbmtfVVJJLAkJLyogc291cmNlIG9mIGEgbGluayB0byBhbiAoZXh0ZXJuYWwpIFVSSSB0YXJnZXQgICAgKi8KICBrX2xpbmtfdGFyZ2V0LAkvKiBpbnRlcm5hbCBkb2N1bWVudCB0YXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAqLwogIGtfbGlua190YXJnZXRfZm9yX2V4cG9ydCwJLyogZXh0ZXJuYWwgZG9jdW1lbnQgdGFyZ2V0ICAgICAgICAgICAgICAgICovCiAga051bWJlck9mTGlua0tleXdvcmRzCn0gUERGX0xJTktfS0VZV09SRDsKCmVudW0gewogIGtfYXV0aG9yID0gMCwKICBrX3RpdGxlLAogIGtfc3ViamVjdCwKICBrX2tleXdvcmRzLAogIGtOdW1iZXJPZkRvY0luZm9LZXl3b3Jkcwp9OwoKCi8qIGJhc2ljIHR5cGVzICovCiNpZmRlZglVU0VfTUFUUklDRVMKdHlwZWRlZglkb3VibGUJCQl0X21hdHJpeFs5XTsKI2VuZGlmCgp0eXBlZGVmCWNoYXIJCXRfdGVtcGJ1Zls1MTJdOwp0eXBlZGVmCXVuc2lnbmVkIGludAlQREZfT0JKRUNUX05VTTsKdHlwZWRlZglQREZfT0JKRUNUX05VTQlQREZfUEFHRV9PQkpFQ1RfTlVNOyAgLyogYW4gb2JqZWN0IG51bWJlciB0aGF0IGNhbiAqLwoJCQkJCSAgICAgIC8qIHJlZmVyIE9OTFkgdG8gcGFnZSBvYmplY3QgKi8KdHlwZWRlZgl1bnNpZ25lZCBpbnQJUERGX0ZPTlRfTlVNOwp0eXBlZGVmCXVuc2lnbmVkIGludAlQREZfUEFHRV9OVU07CnR5cGVkZWYJdW5zaWduZWQgaW50CVBERl9GSUxFX09GRlNFVDsKCgovKiBmb250IGxpc3QgKi8Kc3RydWN0IHRfZm9udF9saXN0X2VudHJ5IHsKICBzdHJ1Y3QgdF9mb250X2xpc3RfZW50cnkgKm1fbmV4dF9mb250X2VudHJ5OwogIEZVTExfQ0hBUiAqbV9QREZfZm9udF9uYW1lOwogIEZVTExfQ0hBUiAqbV9zaG9ydF9mb250X25hbWU7CiAgRlVMTF9DSEFSICptX2FjdHVhbF9mb250X25hbWU7CiAgUERGX09CSkVDVF9OVU0gbV9mb250X2VuY29kaW5nX29iajsJLyogdmFsaWQgZm9yIGVudGlyZSBQREYgZmlsZSAqLwogIFBERl9PQkpFQ1RfTlVNIG1fcGRmX29iamVjdF9udW1iZXI7CS8qIHZhbGlkIGZvciBlbnRpcmUgUERGIGZpbGUgKi8KICBCT09MRUFOIG1fZm9udF9yZXNvdXJjZV9pbl9wZGY7CS8qIFRSVUUgd2hlbiBQREYgZmlsZSBoYXMgICAgICAgKi8KCQkJCQkvKiAvVHlwZSAvRm9udCByZXNvdXJjZSAgICAgICAgICovCiAgQk9PTEVBTiBtX2luX3VzZTsJCQkvKiB1c2VkIG9uIGEgcGVyLXBhZ2UgYmFzaXMgKi8KfTsKCnR5cGVkZWYgc3RydWN0IHRfZm9udF9saXN0X2VudHJ5IHRfZm9udF9saXN0X2VudHJ5LCAqdF9mb250X2xpc3RfZW50cnlfcHRyOwoKCi8qIG9mZnNldHMgb2YgYWxsIG9iamVjdHMgKGZvciB4cmVmIGxpc3QpICovCnR5cGVkZWYJUERGX0ZJTEVfT0ZGU0VUIHRfb2Zmc2V0X2FycmF5W2tOdW1iZXJPZk9iamVjdHNQZXJCbG9ja107CgpzdHJ1Y3QgdF9vZmZzZXRfYmxvY2sgewogIHN0cnVjdCB0X29mZnNldF9ibG9jayAqbV9uZXh0X2Jsb2NrOwogIHRfb2Zmc2V0X2FycmF5IG1fYmxvY2s7Cn07Cgp0eXBlZGVmIHN0cnVjdCB0X29mZnNldF9ibG9jayB0X29mZnNldF9ibG9jaywgKnRfb2Zmc2V0X2Jsb2NrX3B0cjsKCgovKiBmb3IgL1BhZ2VzIG9iamVjdCAqLwp0eXBlZGVmIFBERl9QQUdFX09CSkVDVF9OVU0gdF9wYWdlX2FycmF5W2tOdW1iZXJPZlBhZ2VzUGVyQmxvY2tdOwoKc3RydWN0IHRfcGFnZV9ibG9jayB7CiAgc3RydWN0IHRfcGFnZV9ibG9jayAqbV9uZXh0X2Jsb2NrOwogIHRfcGFnZV9hcnJheSBtX2Jsb2NrOwp9OwoKdHlwZWRlZglzdHJ1Y3QgdF9wYWdlX2Jsb2NrIHRfcGFnZV9ibG9jaywgKnRfcGFnZV9ibG9ja19wdHI7CgoKLyogZm9yIGZvbnQgZW5jb2RpbmdzICovCnN0cnVjdAl0X2ZvbnRfZW5jb2RpbmdfZW50cnkgewogIHN0cnVjdCB0X2ZvbnRfZW5jb2RpbmdfZW50cnkqIG1fbmV4dF9lbnRyeTsKICBQREZfT0JKRUNUX05VTSBtX29iamVjdF9udW07CiAgRlVMTF9DSEFSICptX2ZvbnRfZW5jb2Rpbmc7Cn07Cgp0eXBlZGVmIHN0cnVjdCB0X2ZvbnRfZW5jb2RpbmdfZW50cnkKICB0X2ZvbnRfZW5jb2RpbmdfZW50cnksICp0X2ZvbnRfZW5jb2RpbmdfZW50cnlfcHRyOwoKCi8qIGZvciBxc2F2ZS9xcmVzdG9yZSBbc2VlIFBERlBhZ2VfUHVzaCgpXSAqLwpzdHJ1Y3QgdF9xc2F2ZV9lbnRyeSB7CiAgc3RydWN0IHRfcXNhdmVfZW50cnkgKm1fbmV4dF9lbnRyeTsKICBpbnQgbV9wYWdlX2hfb3JpZ2luLCBtX3BhZ2Vfdl9vcmlnaW47CiAgZmxvYXQgbV9wYWdlX2hfc2NhbGVfZmFjdG9yLCBtX3BhZ2Vfdl9zY2FsZV9mYWN0b3I7Cn07Cgp0eXBlZGVmIHN0cnVjdCB0X3FzYXZlX2VudHJ5IHRfcXNhdmVfZW50cnksICp0X3FzYXZlX2VudHJ5X3B0cjsKCgovKiBmb3IgcXNhdmUvcXJlc3RvcmUgW3NlZSBQREZQYWdlX1B1c2goKV0gKi8Kc3RydWN0IHRfcXNhdmVfbWFya2luZ19lbnRyeSB7CiAgc3RydWN0IHRfcXNhdmVfbWFya2luZ19lbnRyeSogbV9uZXh0X2VudHJ5OwogIHVuc2lnbmVkIGludCBtX2J1ZmZlcl9wb3M7Cn07Cgp0eXBlZGVmCXN0cnVjdCB0X3FzYXZlX21hcmtpbmdfZW50cnkgdF9xc2F2ZV9tYXJraW5nX2VudHJ5LCAqdF9xc2F2ZV9tYXJraW5nX2VudHJ5X3B0cjsKCgovKiB0YXJnZXQgb2YgbGluayBhbm5vdGF0aW9ucyAqLwpzdHJ1Y3QgdF90YXJnZXRfYW5ub3RfZW50cnkgewogIHN0cnVjdCB0X3RhcmdldF9hbm5vdF9lbnRyeSogbV9uZXh0X2VudHJ5OwoKICAvKiBhbGwgb2YgdGhlIGZvbGxvd2luZyBhcmUgYWx3YXlzIGRlZmluZWQgKi8KICBGVUxMX0NIQVIgKm1fbmFtZTsKICBQREZfUEFHRV9PQkpFQ1RfTlVNIG1fcGFnZV9vYmplY3RfbnVtOwoKICAvKiB0aGVzZSBhcmUgaW4gUERGJ3MgZGVmYXVsdCB1c2VyIHNwYWNlIGNvb3JkaW5hdGVzICovCiAgaW50IG1fbGxfeDsKICBpbnQgbV9sbF95OwogIGludCBtX3VyX3g7CiAgaW50IG1fdXJfeTsKCiAgQk9PTEVBTiBtX2Zvcl9leHBvcnQ7Cn07Cgp0eXBlZGVmIHN0cnVjdCB0X3RhcmdldF9hbm5vdF9lbnRyeSB0X3RhcmdldF9hbm5vdF9lbnRyeSwgKnRfdGFyZ2V0X2Fubm90X2VudHJ5X3B0cjsKCi8qIHNvdXJjZSBvZiBsaW5rIGFubm90YXRpb25zICovCnN0cnVjdCB0X3NvdXJjZV9hbm5vdF9lbnRyeSB7CiAgc3RydWN0IHRfc291cmNlX2Fubm90X2VudHJ5KiBtX25leHRfZW50cnk7CgogIHRfdGFyZ2V0X2Fubm90X2VudHJ5KiBtX3RhcmdldDsJLyogaWYgaXMgYSBsaW5rIGFuZCB0aGlzIGlzIE5VTEwgdGhlbiAqLwoJCQkJCS8qIHRoZSBsaW5rIGlzIGEgZndkIGxpbmsgYW5kIHJlbWFpbnMgKi8KCQkJCQkvKiB1bnJlc29sdmFibGUgdW50aWwgdGhlIHBhZ2UgaXMgICAgICovCgkJCQkJLyogZW5jb3VudGVyZWQgLSBpbnN0ZWFkLCB0aGUgbV9uYW1lICAqLwoJCQkJCS8qIGZpZWxkIGlzIGRlZmluZWQ7IG1fdGFyZ2V0IHdpbGwgYmUgKi8KCQkJCQkvKiBOVUxMIGZvciBVUkkgdHlwZSBsaW5rcyAgICAgICAgICAgICovCgogIEZVTExfQ0hBUiAqbV9uYW1lOwkJCS8qIHRoaXMgc3RyaW5nIGlzIGRlZmluZWQgaWYgbV90YXJnZXQgKi8KCQkJCQkvKiBpcyBOVUxMIG90aGVyd2lzZSBpdCBpcyBudWxsICAgICAgICovCgkJCQkJLyogZm9yIFVSSSBsaW5rcywgdGhpcyBjb250YWlucyB0aGUgICAqLwoJCQkJCS8qIFVSSSB0byBsaW5rIHRvICAgICAgICAgICAgICAgICAgICAgKi8KICBGVUxMX0NIQVIgKm1fZmlsZV9zcGVjOwkJLyogb25seSBkZWZpbmVkIGZvciBsaW5rX3R5cGUgPT0gICAgICAqLwoJCQkJCS8qIGtfbGlua19leHRlcm5hbCAgICAgICAgICAgICAgICAgICAgKi8KCiAgLyogYWxsIG9mIHRoZSBmb2xsb3dpbmcgYXJlIGFsd2F5cyBkZWZpbmVkICovCiAgLyogdGhlc2UgYXJlIGluIFBERidzIGRlZmF1bHQgdXNlciBzcGFjZSBjb29yZGluYXRlcyAqLwogIGludCBtX2xsX3g7CiAgaW50IG1fbGxfeTsKICBpbnQgbV91cl94OwogIGludCBtX3VyX3k7CgogIFBERl9PQkpFQ1RfTlVNIG1fdGhpc19vYmplY3RfbnVtOwkvKiBvYmogbnVtIG9mIHRoaXMgIi9UeXBlIC9Bbm5vdCIgb2JqICovCiAgUERGX1BBR0VfT0JKRUNUX05VTSBtX3RoaXNfcGFnZV9vYmplY3RfbnVtOwkvKiBvYmogbnVtIG9mIHRoZSBwYWdlIHRoYXQgICAqLwoJCQkJCS8qIHRoaXMgYW5ub3QgbGllcyBpbiAgICAgICAgICAgICAgICAgKi8KICBQREZfTElOS19ERVNUX09QVElPTiBtX2Rlc3Rfb3B0aW9uOwogIFBERl9MSU5LX0tFWVdPUkQgbV9saW5rX3R5cGU7CgogIEJPT0xFQU4gbV93cml0dGVuX3RvX1BERl9maWxlOwp9OwoKdHlwZWRlZiBzdHJ1Y3QgdF9zb3VyY2VfYW5ub3RfZW50cnkgdF9zb3VyY2VfYW5ub3RfZW50cnksICp0X3NvdXJjZV9hbm5vdF9lbnRyeV9wdHI7CgoKLyogbWF0cmljZXMgKi8KI2lmZGVmIFVTRV9NQVRSSUNFUwpzdHJ1Y3QgdF9tYXRyaXhfZW50cnkgewogIHN0cnVjdCB0X21hdHJpeF9lbnRyeSogbV9uZXh0X2VudHJ5OwogIHRfbWF0cml4IG1fbWF0cml4Owp9OwoKdHlwZWRlZiBzdHJ1Y3QgdF9tYXRyaXhfZW50cnkgdF9tYXRyaXhfZW50cnksICp0X21hdHJpeF9lbnRyeV9wdHI7CiNlbmRpZgoKCi8qIHN0YXRpY3MgKi8KCi8qIGdlbmVyYWwgKi8Kc3RhdGljIEJPT0xFQU4gZ19QREZfZGVidWc7CgovKiBvYmplY3RzICovCnN0YXRpYyBQREZfT0JKRUNUX05VTQkJZ19uZXh0X29iam51bTsKc3RhdGljIHRfb2Zmc2V0X2Jsb2NrX3B0cglnX29ial9vZmZzZXRfbGlzdDsJLyogZmlyc3QgYmxvY2sgICAgICAgKi8Kc3RhdGljIHRfb2Zmc2V0X2Jsb2NrX3B0cglnX2N1cl9vYmpfb2Zmc2V0X2Jsb2NrOwoKLyogZm9udHMgKi8Kc3RhdGljIHRfZm9udF9saXN0X2VudHJ5X3B0cglnX2ZvbnRfbGlzdDsJCS8qIGJhY2t3YXJkcyAgICAgICAgICovCnN0YXRpYyB0X2ZvbnRfZW5jb2RpbmdfZW50cnlfcHRyIGdfZm9udF9lbmNvZGluZ19saXN0OwkvKiBiYWNrd2FyZHMgICAgICAgICAqLwoKLyogcGFnZXMgKi8Kc3RhdGljIFBERl9QQUdFX05VTQkJZ19wYWdlX2NvdW50OwkJLyogY3VycmVudCBwYWdlIG51bSwgKi8KCQkJCQkJCS8qIHN0YXJ0aW5nIGF0IDEgICAgICovCnN0YXRpYyBQREZfUEFHRV9PQkpFQ1RfTlVNCWdfcGFnZV9vYmplY3RfbnVtOwkvKiBvYmogbnVtIG9mIGN1cnJlbnQqLwoJCQkJCQkJLyogIi9UeXBlIC9QYWdlIiBvYmosKi8KCQkJCQkJCS8qIGNvcnIuIHRvIHBhZ2UgICAgICovCgkJCQkJCQkvKiBudW0gZ19wYWdlX2NvdW50ICAqLwpzdGF0aWMgdF9wYWdlX2Jsb2NrX3B0cgkJZ19wYWdlX2Jsb2NrX2xpc3Q7CS8qIGZpcnN0IGJsb2NrICAgICAgICovCnN0YXRpYyB0X3BhZ2VfYmxvY2tfcHRyCQlnX2N1cl9wYWdlX2Jsb2NrOwpzdGF0aWMgUERGX09CSkVDVF9OVU0JCWdfcGFnZXNfcm9vdDsKCi8qIGRvY3VtZW50ICovCnN0YXRpYyBpbnQgZ19kb2NfaF9ib3VuZDsKc3RhdGljIGludCBnX2RvY192X2JvdW5kOwpzdGF0aWMgRlVMTF9DSEFSKiBnX2RvY19hdXRob3I7CnN0YXRpYyBGVUxMX0NIQVIqIGdfZG9jX3RpdGxlOwpzdGF0aWMgRlVMTF9DSEFSKiBnX2RvY19zdWJqZWN0OwpzdGF0aWMgRlVMTF9DSEFSKiBnX2RvY19rZXl3b3JkczsKCi8qIGxpbmsgYW5ub3RhdGlvbnMgKi8Kc3RhdGljIHRfdGFyZ2V0X2Fubm90X2VudHJ5X3B0ciBnX3RhcmdldF9hbm5vdF9saXN0OwpzdGF0aWMgQk9PTEVBTiBnX2hhc19leHBvcnRlZF90YXJnZXRzOwoKLyogZ2xvYmFscyBmb3IgZWFjaCBwYWdlICovCi8qIHRoZXNlIGluZGljYXRlIHdoYXQga2luZCBvZiBjb250ZW50IHRoZSBwYWdlIGhhcyAqLwpzdGF0aWMgQk9PTEVBTiBnX3BhZ2VfdXNlc19mb250czsKc3RhdGljIEJPT0xFQU4gZ19wYWdlX2hhc190ZXh0OwpzdGF0aWMgQk9PTEVBTiBnX3BhZ2VfaGFzX2dyYXBoaWNzOwoKLyogdGhlc2UgYXJlIG9ubHkgZGVmaW5lZCB3aGVuIHRoZSBwYWdlIGhhcyBzb21lIGNvbnRlbnQgKi8Kc3RhdGljIFBERl9PQkpFQ1RfTlVNIGdfcGFnZV9jb250ZW50c19vYmpfbnVtOwpzdGF0aWMgUERGX09CSkVDVF9OVU0gZ19wYWdlX2xlbmd0aF9vYmpfbnVtOwpzdGF0aWMgUERGX0ZJTEVfT0ZGU0VUIGdfcGFnZV9zdGFydF9vZmZzZXQ7CgovKiB2YWxpZCBhZnRlciBhIFBERl9QdXNoIGFuZCBQREZfUG9wICovCnN0YXRpYyB0X3FzYXZlX2VudHJ5X3B0ciBnX3FzYXZlX3N0YWNrOwoKc3RhdGljIHRfcXNhdmVfbWFya2luZ19lbnRyeV9wdHIgZ19xc2F2ZV9tYXJraW5nX3N0YWNrOwkvKiBpbXBsZW1lbnRlZCBhcyBhICAgKi8KCQkJCQkJCS8qIGxpbmtlZCBsaXN0OyBwdHMgICAqLwoJCQkJCQkJLyogdG8gdG9wIG9mIHN0YWNrICAgICovCnN0YXRpYyBCT09MRUFOIGdfaW5fYnVmZmVyaW5nX21vZGU7CnN0YXRpYyBjaGFyIGdfYnVmZmVyW2tCdWZmZXJTaXplXTsJCQkvKiB0aGlzIGJ1ZmZlciBpcyB1c2VkKi8KCQkJCQkJCS8qIGZvciByZW1vdmluZyByZWR1bmRhbnQgb3BlcmF0aW9ucyAqLwpzdGF0aWMgdW5zaWduZWQgaW50IGdfYnVmZmVyX3BvczsKCi8qIHZhbGlkIGFmdGVyIGEgbGluayBhbm5vdGF0aW9uIGhhcyBiZWVuIGRlZmluZWQgKi8Kc3RhdGljIHRfc291cmNlX2Fubm90X2VudHJ5X3B0ciBnX3NvdXJjZV9hbm5vdF9saXN0OwoKI2lmZGVmIFVTRV9NQVRSSUNFUwpzdGF0aWMgdF9tYXRyaXggZ19jdXJfbWF0cml4OwpzdGF0aWMgdF9tYXRyaXhfZW50cnlfcHRyIGdfbWF0cml4X3N0YWNrOwojZW5kaWYKCi8qIHRyYWNrIHRoZXNlIHZhbHVlcyBpbiBjYXNlIHRoZXkgYXJlIGV2ZXIgcmVxdWlyZWQgKi8Kc3RhdGljIGZsb2F0IGdfcGFnZV9oX3NjYWxlX2ZhY3RvciwgZ19wYWdlX3Zfc2NhbGVfZmFjdG9yOwpzdGF0aWMgaW50IGdfcGFnZV9oX29yaWdpbiwgZ19wYWdlX3Zfb3JpZ2luOwpzdGF0aWMgaW50IGdfcGFnZV9saW5lX3dpZHRoOwoKLyogbWFnaWMga2V5d29yZHMgKGFjdHVhbGx5IHRoZXkgd2lsbCBhcHBlYXIgaW4gTG91dCBkb2N1bWVudHMgYXMgIl9faW4iLCAiX19jbSIsIGV0Yy4pICovCnN0YXRpYyBjaGFyICpnX3VuaXRfa2V5d29yZHNba051bWJlck9mVW5pdEtleXdvcmRzXSA9CnsKICAiaW4iLCAiY20iLCAicHQiLCAiZW0iLCAibG91dGYiLCAibG91dHYiLCAibG91dHMiCS8qIE1VU1QgYmUgZm9sbG93ZWQgYnkgYSBmcCBudW1iZXIgKi8KfTsKCnN0YXRpYyBjaGFyICpnX2dyYXBoaWNfa2V5d29yZHNba051bWJlck9mR3JhcGhpY3NLZXl3b3Jkc10gPQp7CiAgInhzaXplIiwgInlzaXplIiwgInhtYXJrIiwgInltYXJrIgkvKiBsaWtlIG1hY3JvcywgdGhlc2UgZXhwYW5kIHRvIHRoZSBhY3R1YWwgdmFsdWUgKi8KfTsKCnN0YXRpYyBjaGFyICpnX2FyaXRobWV0aWNfa2V5d29yZHNba051bWJlck9mQXJpdGhtZXRpY0tleXdvcmRzXSA9CnsKICAvKiBzeW50YXg6ICJfX211bCh4LCB5KSIgZW1pdHMgKHggKiB5KSB0byAyIGRlY2ltYWwgcGxhY2VzICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogTm90ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgIHNpbiBhbmQgY29zIGV4cGVjdCB0aGVpciBhcmd1bWVudHMgaW4gZGVncmVlcyAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICBmb3IgbmVnYXRpb24sIHVzZSAiX19zdWIoMCwgYXJnKSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgX19waWNrKGksIGV4cHIxLCBleHByMiwgZXhwcjMuLi4pIHBpY2tzIHRoZSBpdGggZXhwciBmcm9tIHRoZSAgICAgKi8KICAvKiAgICBsaXN0IG9mIGV4cHIgdGhlICIsIiBhcmUgb3B0aW9uYWwgKGlmIHRoZXkgYXJlIG5vdCB1c2VkLCB5b3UgICAgICAqLwogIC8qICAgIHNob3VsZCBzZXBhcmF0ZSB2YWx1ZXMgd2l0aCB3aGl0ZXNwYWNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgogICJhZGQiLCAic3ViIiwgIm11bCIsICJkaXYiLCAic2luIiwgImNvcyIsICJwaWNrIgkvKiBsaWtlIG1hY3JvcywgdGhlc2UgZXhwYW5kIHRvIHRoZSBhY3R1YWwgdmFsdWUgKi8KfTsKCnN0YXRpYyBjaGFyICpnX2xpbmtfa2V5d29yZHNba051bWJlck9mTGlua0tleXdvcmRzXSA9CnsKICAvKiBzeW50YXg6ICJfX2xpbmtfc291cmNlPTw8bmFtZV9vZl90YXJnZXRfbGluayBbZGVzdF9saW5rX29wdGlvbl0+PiIgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogZXhhbXBsZTogIl9fbGlua19zb3VyY2U9PDxjaGFwdGVyNj4+IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBleGFtcGxlOiAiX19saW5rX3NvdXJjZT08PHBhcnQ3IF9fRml0SD4+IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoKICAibGlua19zb3VyY2U9PDwiLAoKICAvKiBzeW50YXg6ICJfX2xpbmtfZXh0ZXJuYWw9PDxuYW1lX29mX3RhcmdldF9saW5rIF9fbGlua190bz1maWxlX3NwZWM+PiIqLwogIC8qIHN5bnRheDogIl9fbGlua19leHRlcm5hbD08PG5hbWVfb2ZfdGFyZ2V0X2xpbmsgX19saW5rX3RvPTw8IC9GUyAvVVJMIC9GICh1cmwpPj4+PiIgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICoqCW5vdGUgdGhlIHNwZWNpYWwgZm9ybWF0IHJlcXVpcmVkIGZvciBVUkwgbGlua3MgKiogICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBleGFtcGxlOiAiX19saW5rX2V4dGVybmFsPTw8Y2hhcHRlcjYgX19saW5rX3RvPS91c3IvYmluL2ZpbGUucGRmPj4iICAqLwogIC8qIGV4YW1wbGU6ICJfX2xpbmtfZXh0ZXJuYWw9PDxjaGFwdGVyNiBfX2xpbmtfdG89PDwgL0ZTIC9VUkwgL0YgICAgICAgICovCiAgLyogICAgICAgICAgKGZ0cDovL2Z0cC5jcy51c3lkLmVkdS5hdS9qZWZmL2xvdXQvdXNlci5wZGYpID4+Pj4iICAgICAgICAgKi8KCiAgImxpbmtfZXh0ZXJuYWw9PDwiLAoKICAvKiBzeW50YXg6ICJfX2xpbmtfVVJJPTw8VVJMPj4iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogZXhhbXBsZTogIl9fbGlua19VUkk9PDxodHRwOi8vd3d3LmFkb2JlLmNvbT4+IiAgICAgICAgICAgICAgICAgICAgICAgKi8KCiAgImxpbmtfVVJJPTw8IiwKCiAgLyogc3ludGF4OiAiX19saW5rX3RhcmdldD08PG5hbWVfb2ZfdGFyZ2V0X2xpbms+PiIgd2hlcmUgICAgICAgICAgICAgICAgKi8KICAvKiBuYW1lX29mX3RhcmdldF9saW5rIGlzIGluIHRoaXMgUERGIGZpbGU7IG5hbWVfb2ZfdGFyZ2V0X2xpbmsgQ0FOTk9UICAqLwogIC8qIGJlIGFjY2Vzc2VkIGJ5IGV4dGVybmFsIGRvY3VtZW50cyBpbiBsaW5rcyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiBleGFtcGxlOiAiX19saW5rX3RhcmdldD08PG15X2ludGVybmFsX3RhcmdldD4+IiAgICAgICAgICAgICAgICAgICAgICAqLwoKICAibGlua190YXJnZXQ9PDwiLAoKICAvKiBzeW50YXg6ICJfX2xpbmtfdGFyZ2V0X2Zvcl9leHBvcnQ9PDxuYW1lX29mX3RhcmdldF9saW5rPj4iIHdoZXJlICAgICAqLwogIC8qIG5hbWVfb2ZfdGFyZ2V0X2xpbmsgaXMgaW4gdGhpcyBmaWxlOyBuYW1lX29mX3RhcmdldF9saW5rIGNhbiBiZSAgICAgICovCiAgLyogYWNjZXNzZWQgYnkgZXh0ZXJuYWwgZG9jdW1lbnRzIGluIGxpbmtzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIC8qIGV4YW1wbGU6ICJfX2xpbmtfdGFyZ2V0X2Zvcl9leHBvcnQ9PDxteV9leHBvcnRlZF90YXJnZXQ+PiIgICAgICAgICAgICovCgogICJsaW5rX3RhcmdldF9mb3JfZXhwb3J0PTw8Igp9OwoKc3RhdGljIGNoYXIgKmdfZGVzdF9saW5rX29wdGlvbnNba051bWJlck9mRGVzdExpbmtPcHRpb25zXSA9CnsKICAvKiBzZWUgUERGX0xJTktfREVTVF9PUFRJT04gZm9yIGRlc2NyaXB0aW9ucyBvZiB0aGUgbWVhbmluZ3Mgb2YgdGhlc2UgKi8KICAiX19GaXROb0NoYW5nZSIsCiAgIl9fRml0IiwKICAiX19GaXRIIiwKICAiX19GaXRWIiwKICAiX19GaXRSIiwKICAiX19GaXRCIiwKICAiX19GaXRCSCIsCiAgIl9fRml0QlYiCn07CgpzdGF0aWMgY2hhciogZ19leHRlcm5hbF9maWxlX3NwZWNfa2V5d29yZFsxXSA9CnsKICAiX19saW5rX3RvPSIKfTsKCnN0YXRpYyBjaGFyKiBnX2RvY19pbmZvX2tleXdvcmRzW2tOdW1iZXJPZkRvY0luZm9LZXl3b3Jkc10gPQp7CiAgImF1dGhvcj0iLCAidGl0bGU9IiwgInN1YmplY3Q9IiwgImtleXdvcmRzPSIKfTsKCnN0YXRpYyBpbnQgZ191bml0c1trTnVtYmVyT2ZVbml0S2V5d29yZHNdOwoKc3RhdGljIGludCBnX2dyYXBoaWNzX3ZhcnNba051bWJlck9mR3JhcGhpY3NLZXl3b3Jkc107CgovKiB0ZXh0IHN0YXRlICovCnN0YXRpYyBCT09MRUFOIGdfVEpfcGVuZGluZzsKc3RhdGljIEJPT0xFQU4gZ19FVF9wZW5kaW5nOwpzdGF0aWMgQk9PTEVBTiBnX3ZhbGlkX3RleHRfbWF0cml4OwkvKiB0cnVlIHdoZW4gQlQuLi5FVCBibG9jayBvcGVuICovCgoKLyogZXhwcmVzc2lvbnMgKi8Kc3RhdGljIGludCBnX2V4cHJfZGVwdGggPSAwOwpzdGF0aWMgaW50IGdfZXhwcl9pbmRleDsKc3RhdGljIHRfdGVtcGJ1ZiBnX2V4cHI7CgovKiBsaW5rcyAqLwpzdGF0aWMgaW50IGdfbGlua19kZXB0aCA9IDA7CnN0YXRpYyBpbnQgZ19saW5rX2luZGV4OwpzdGF0aWMgdF90ZW1wYnVmIGdfbGluazsKc3RhdGljIFBERl9MSU5LX0tFWVdPUkQgZ19saW5rX2tleXdvcmQ7CgovKiB0aGUgMTQgYmFzZSBmb250cyAqLwpzdGF0aWMgY2hhciAqZ19zdGFuZGFyZF9iYXNlXzE0X2ZvbnRzW2tCYXNlMTRGb250Q291bnRdID0gewogICJDb3VyaWVyIiwKICAiQ291cmllci1Cb2xkIiwKICAiQ291cmllci1PYmxpcXVlIiwKICAiQ291cmllci1Cb2xkT2JsaXF1ZSIsCiAgIkhlbHZldGljYSIsCiAgIkhlbHZldGljYS1Cb2xkIiwKICAiSGVsdmV0aWNhLU9ibGlxdWUiLAogICJIZWx2ZXRpY2EtQm9sZE9ibGlxdWUiLAogICJTeW1ib2wiLAogICJUaW1lcyIsCiAgIlRpbWVzLUJvbGQiLAogICJUaW1lcy1JdGFsaWMiLAogICJUaW1lcy1Cb2xkSXRhbGljIiwKICAiWmFwZkRpbmdiYXRzIgp9OwoKCiNpZiBQREZfQ09NUFJFU1NJT04Kc3RhdGljIEJPT0xFQU4JCWdfYXBwbHlfY29tcHJlc3Npb247CnN0YXRpYyB6X3N0cmVhbQkJZ19jb21wX3N0cmVhbTsgICAgICAgICAgIC8qIHpsaWIgY29tcHJlc3Npb24gc3RyZWFtICovCnN0YXRpYyB1bnNpZ25lZCBjaGFyKglnX3Jhd19idWZmZXJfcHRyOwoKLyogY29tcHJlc3Npb24gYnVmZmVycyAqLwpzdGF0aWMgdW5zaWduZWQgY2hhcglnX3Jhd19vdXRwdXRba1Jhd091dHB1dEJ1ZmZlclNpemVdOwpzdGF0aWMgdW5zaWduZWQgY2hhcglnX2NvbXByZXNzZWRfb3V0cHV0W2tDb21wcmVzc2VkT3V0cHV0QnVmZmVyU2l6ZV07CiNlbmRpZgoKLyogZm9yIGNhbGN1bGF0aW5nIGxhcmdlc3QgcGFnZSBvYmplY3QgKi8KI2lmZGVmIF9DQUxDX0xBUkdFU1RfUEFHRV9PQkpFQ1RfCnN0YXRpYyBQREZfRklMRV9PRkZTRVQgZ19tYXhfcGFnZV9sZW5ndGggPSAwOwojZW5kaWYKCkJPT0xFQU4gUERGSGFzVmFsaWRUZXh0TWF0cml4KHZvaWQpCS8qIHRoaXMgaXMgY2FsbGVkIGZyb20gejI0LmMgKi8KewogIHJldHVybiBnX3ZhbGlkX3RleHRfbWF0cml4Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB0X29mZnNldF9ibG9ja19wdHIgIFBERk9iamVjdF9GaW5kT2Zmc2V0QmxvY2soUERGX09CSkVDVF9OVU0gaW5fb2JqX251bSkgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgRmluZCB0aGUgb2Zmc2V0IGJsb2NrIGZvciB0aGUgZ2l2ZW4gb2JqZWN0IG51bWJlci4gICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHRfb2Zmc2V0X2Jsb2NrX3B0ciBQREZPYmplY3RfRmluZE9mZnNldEJsb2NrKFBERl9PQkpFQ1RfTlVNIGluX29ial9udW0sCiAgdW5zaWduZWQgaW50KiBvdXRfYmxvY2tfcG9zKQp7CiAgaW50IHdhbnRlZF9ibG9ja19udW0gPSAoaW5fb2JqX251bSAtIDEpIC8ga051bWJlck9mT2JqZWN0c1BlckJsb2NrOwogIGludCBibG9ja19wb3MgPSAoaW5fb2JqX251bSAtIDEpICUga051bWJlck9mT2JqZWN0c1BlckJsb2NrOwogIHRfb2Zmc2V0X2Jsb2NrX3B0ciB0aGVfYmxvY2sgPSBnX29ial9vZmZzZXRfbGlzdDsKCiAgQXNzZXJ0KChpbl9vYmpfbnVtID4gMCkgJiYgKGluX29ial9udW0gPCBnX25leHRfb2JqbnVtKSwgbm9fZnBvcyk7CgogIC8qIGZpbmQgYmxvY2sgKi8KICB3aGlsZSAod2FudGVkX2Jsb2NrX251bSAhPSAwKSB7CiAgICBBc3NlcnQodGhlX2Jsb2NrICE9IE5VTEwsIG5vX2Zwb3MpOwogICAgdGhlX2Jsb2NrID0gdGhlX2Jsb2NrLT5tX25leHRfYmxvY2s7CiAgICB3YW50ZWRfYmxvY2tfbnVtLS07CiAgfQogIEFzc2VydCh0aGVfYmxvY2sgIT0gTlVMTCwgbm9fZnBvcyk7CgogIGlmIChvdXRfYmxvY2tfcG9zICE9IE5VTEwpCiAgICAqb3V0X2Jsb2NrX3BvcyA9IGJsb2NrX3BvczsKICByZXR1cm4gdGhlX2Jsb2NrOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBQREZfT0JKRUNUX05VTSBQREZPYmplY3RfTmV3KEZJTEUqIGluX2ZwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUmV0dXJuIHRoZSBuZXh0IGF2YWlsYWJsZSBvYmplY3QgbnVtYmVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIFBERl9PQkpFQ1RfTlVNIFBERk9iamVjdF9OZXcoLyogRklMRSogaW5fZnAgKi8pCnsKICBpbnQgd2FudGVkX2Jsb2NrX251bSA9IChnX25leHRfb2JqbnVtIC0gMSkgLyBrTnVtYmVyT2ZPYmplY3RzUGVyQmxvY2s7CiAgaW50IGJsb2NrX3BvcyA9IChnX25leHRfb2JqbnVtIC0gMSkgJSBrTnVtYmVyT2ZPYmplY3RzUGVyQmxvY2s7CiAgdF9vZmZzZXRfYmxvY2tfcHRyIHRoZV9ibG9jayA9IGdfY3VyX29ial9vZmZzZXRfYmxvY2s7CgogIC8qIGlmIGZpcnN0IG9iaiBpbiBhIGJsb2NrIHRoZW4gYWxsb2NhdGUgdGhlIGJsb2NrICovCiAgaWYgKGJsb2NrX3BvcyA9PSAwKQogIHsKICAgIHRoZV9ibG9jayA9ICh0X29mZnNldF9ibG9ja19wdHIpIG1hbGxvYyhzaXplb2YodF9vZmZzZXRfYmxvY2spKTsKICAgIGlmICh0aGVfYmxvY2sgPT0gTlVMTCkKICAgICAgRXJyb3IoNDgsIDEsICJQREZPYmplY3RfTmV3OiBydW4gb3V0IG9mIG1lbW9yeSIsIEZBVEFMLCBub19mcG9zKTsKICAgIGlmICh3YW50ZWRfYmxvY2tfbnVtID09IDApICAvKiBpZiBmaXJzdCBibG9jayBpbiBmaWxlICovCiAgICB7CiAgICAgIEFzc2VydChnX29ial9vZmZzZXRfbGlzdCA9PSBOVUxMLCBub19mcG9zKTsKICAgICAgZ19vYmpfb2Zmc2V0X2xpc3QgPSB0aGVfYmxvY2s7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgIEFzc2VydChnX2N1cl9vYmpfb2Zmc2V0X2Jsb2NrICE9IE5VTEwsIG5vX2Zwb3MpOwogICAgICBnX2N1cl9vYmpfb2Zmc2V0X2Jsb2NrLT5tX25leHRfYmxvY2sgPSB0aGVfYmxvY2s7CiAgICB9CiAgICB0aGVfYmxvY2stPm1fbmV4dF9ibG9jayA9IE5VTEw7CS8qIGRvbid0IGZvcmdldCB0byBpbml0IHRoaXMhICovCiAgICBnX2N1cl9vYmpfb2Zmc2V0X2Jsb2NrID0gdGhlX2Jsb2NrOwogIH0KICBlbHNlCiAgewogICAgQXNzZXJ0KHRoZV9ibG9jayAhPSBOVUxMLCBub19mcG9zKTsKICB9CgogIC8qIGluaXRpYWxpc2UgdGhlIG9mZnNldCBvZiB0aGlzIG9iamVjdCB0byB6ZXJvIChpdCBoYXNuJ3QgYmVlbiB3cml0dGVuICAgICovCiAgLyogdG8gdGhlIFBERiBmaWxlIHlldCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICB0aGVfYmxvY2stPm1fYmxvY2tbYmxvY2tfcG9zXSA9IDA7ICAgICAgICAgICAgICAgICAgLyogZnRlbGwoaW5fZnApOyAgICAgICAqLwoKICByZXR1cm4gZ19uZXh0X29iam51bSsrOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkIFBERk9iamVjdF9Xcml0ZVJlZihGSUxFKiBpbl9mcCwgUERGX09CSkVDVF9OVU0gaW5fb2JqZWN0X251bWJlcikgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUmV0dXJuIHRoZSBuZXh0IGF2YWlsYWJsZSBvYmplY3QgbnVtYmVyIGFuZCB3cml0ZSBhIHJlZmVyZW5jZSB0byBpdC4gICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQgUERGT2JqZWN0X1dyaXRlUmVmKEZJTEUqIGluX2ZwLCBQREZfT0JKRUNUX05VTSBpbl9vYmplY3RfbnVtYmVyKQp7CiAgZnByaW50Zihpbl9mcCwgIiV1IDAgUiIsIGluX29iamVjdF9udW1iZXIpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkIFBERk9iamVjdF9Xcml0ZU9iaihGSUxFKiBpbl9mcCwgUERGX09CSkVDVF9OVU0gaW5fb2JqZWN0X251bWJlcikgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgV3JpdGUgdGhlIG9iamVjdCdzIGRlZmluaXRpb24gKGFuZCByZW1lbWJlciBpdHMgZmlsZSBwb3NpdGlvbikuICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQgUERGT2JqZWN0X1dyaXRlT2JqKEZJTEUqIGluX2ZwLCBQREZfT0JKRUNUX05VTSBpbl9vYmplY3RfbnVtYmVyKQp7CiAgdW5zaWduZWQgaW50IGJsb2NrX3BvczsKICB0X29mZnNldF9ibG9ja19wdHIgYmxvY2sgPQogICAgUERGT2JqZWN0X0ZpbmRPZmZzZXRCbG9jayhpbl9vYmplY3RfbnVtYmVyLCAmYmxvY2tfcG9zKTsKICBBc3NlcnQoYmxvY2stPm1fYmxvY2tbYmxvY2tfcG9zXT09MCwgbm9fZnBvcyk7IC8qIG9mZnNldCBzaGQgYmUgInVua25vd24iICAqLwogIGJsb2NrLT5tX2Jsb2NrW2Jsb2NrX3Bvc10gPSBmdGVsbChpbl9mcCk7CSAvKiByZW1lbWJlciBvZmZzZXQgZm9yIHhyZWYgKi8KCiAgZnByaW50Zihpbl9mcCwgIiV1IDAgb2JqXG4iLCBpbl9vYmplY3RfbnVtYmVyKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBQREZfT0JKRUNUX05VTSBQREZPYmplY3RfV3JpdGVOZXdPYmooRklMRSogaW5fZnApICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUmV0dXJuIHRoZSBuZXh0IGF2YWlsYWJsZSBvYmplY3QgbnVtYmVyIGFuZCB3cml0ZSBpdHMgZGVmaW5pdGlvbi4gICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIFBERl9PQkpFQ1RfTlVNIFBERk9iamVjdF9Xcml0ZU5ld09iaihGSUxFKiBpbl9mcCkKewogIFBERl9PQkpFQ1RfTlVNIG5leHRfcmVmID0gUERGT2JqZWN0X05ldygvKiBpbl9mcCAqLyk7CiAgUERGT2JqZWN0X1dyaXRlT2JqKGluX2ZwLCBuZXh0X3JlZik7CiAgcmV0dXJuIG5leHRfcmVmOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBQREZfT0JKRUNUX05VTSBQREZPYmplY3RfV3JpdGVOZXh0UmVmKEZJTEUqIGluX2ZwKSAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUmV0dXJuIHRoZSBuZXh0IGF2YWlsYWJsZSBvYmplY3QgbnVtYmVyIGFuZCB3cml0ZSBhIHJlZmVyZW5jZSB0byBpdC4gICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogKioqCnN0YXRpYyBQREZfT0JKRUNUX05VTSBQREZPYmplY3RfV3JpdGVOZXh0UmVmKEZJTEUqIGluX2ZwKQp7CiAgUERGX09CSkVDVF9OVU0gbmV4dF9yZWYgPSBQREZPYmplY3RfTmV3KGluX2ZwKTsKICBQREZPYmplY3RfV3JpdGVSZWYoaW5fZnAsIG5leHRfcmVmKTsKICByZXR1cm4gbmV4dF9yZWY7Cn0KKioqICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIHZvaWQgUERGRmlsZV9CZWdpbkZvbnRFbmNvZGluZyhGSUxFKiBpbl9mcCwgY29uc3QgY2hhciogaW5fZW5jb2RpbmdfbmFtZSkgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgQmVnaW4gZm9udCBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBQREZGaWxlX0JlZ2luRm9udEVuY29kaW5nKEZJTEUqIGluX2ZwLCBjb25zdCBjaGFyKiBpbl9lbmNvZGluZ19uYW1lKQp7CiAgUERGX09CSkVDVF9OVU0gZW5jb2RpbmdfbnVtOwogIHRfZm9udF9lbmNvZGluZ19lbnRyeV9wdHIgZW5jb2RpbmdfZW50cnk7CgogIC8qIFRPIEZJTEwgSU46IGNyZWF0ZSBlbnRyeSBpbiBmb250LWVuY29kaW5nIGxpc3QgYW5kIGFkZCB0aGlzIGVuY29kaW5nICAgICovCiAgaWYgKGdfUERGX2RlYnVnKQogICAgZnByaW50Zihpbl9mcCwgIiUlXG4lJSBmb250IGVuY29kaW5nICclcyc6XG4lJVxuIiwgaW5fZW5jb2RpbmdfbmFtZSk7CgogIGVuY29kaW5nX251bSA9IFBERk9iamVjdF9Xcml0ZU5ld09iaihpbl9mcCk7CiAgZnB1dHMoIjw8XG4vVHlwZSAvRW5jb2Rpbmdcbi9EaWZmZXJlbmNlcyBbIDBcbiIsIGluX2ZwKTsKCiAgLyogYWRkIGZvbnQgZW5jb2RpbmcgdG8gbGlzdCBvZiBlbmNvZGluZ3MgKGFzc3VtZSB3ZSBkb24ndCBnZXQgcGFzc2VkIHRoZSAgKi8KICAvKiBzYW1lIGVuY29kaW5nIG1vcmUgdGhhbiBvbmNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIGVuY29kaW5nX2VudHJ5ID0KICAgICh0X2ZvbnRfZW5jb2RpbmdfZW50cnlfcHRyKSBtYWxsb2Moc2l6ZW9mKHRfZm9udF9lbmNvZGluZ19lbnRyeSkpOwogIGlmIChlbmNvZGluZ19lbnRyeSA9PSBOVUxMKQogICAgRXJyb3IoNDgsIDIsICJQREZGaWxlX0JlZ2luRm9udEVuY29kaW5nOiBydW4gb3V0IG9mIG1lbW9yeSIsRkFUQUwsbm9fZnBvcyk7CgogIGVuY29kaW5nX2VudHJ5LT5tX2ZvbnRfZW5jb2RpbmcgPQogICAgKEZVTExfQ0hBUiopIG1hbGxvYyhzdHJsZW4oaW5fZW5jb2RpbmdfbmFtZSkgKyAxKTsKICBpZiAoZW5jb2RpbmdfZW50cnktPm1fZm9udF9lbmNvZGluZyA9PSBOVUxMKQogICAgRXJyb3IoNDgsIDMsICJQREZGaWxlX0JlZ2luRm9udEVuY29kaW5nOiBvdXQgb2YgbWVtb3J5IiwgRkFUQUwsIG5vX2Zwb3MpOwoKICBlbmNvZGluZ19lbnRyeS0+bV9uZXh0X2VudHJ5ID0gZ19mb250X2VuY29kaW5nX2xpc3Q7CiAgZW5jb2RpbmdfZW50cnktPm1fb2JqZWN0X251bSA9IGVuY29kaW5nX251bTsKICBzdHJjcHkoKGNoYXIqKSBlbmNvZGluZ19lbnRyeS0+bV9mb250X2VuY29kaW5nLCAoY2hhciopIGluX2VuY29kaW5nX25hbWUpOwogIGdfZm9udF9lbmNvZGluZ19saXN0ID0gZW5jb2RpbmdfZW50cnk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgUERGRmlsZV9FbmRGb250RW5jb2RpbmcoRklMRSogaW5fZnApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBFbmQgb2YgZm9udCBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkIFBERkZpbGVfRW5kRm9udEVuY29kaW5nKEZJTEUqIGluX2ZwKQp7CiAgZnB1dHMoIl1cbj4+XG5lbmRvYmpcbiIsIGluX2ZwKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiBjb25zdCBGVUxMX0NIQVIqIFBERkZvbnRfRmluZExpc3RFbnRyeShjb25zdCBGVUxMX0NIQVIqIGluX3JlYWxfZm9udF9uYW1lKSovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFRyeSB0byBmaW5kIHRoZSBmb250IGxpc3QgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIHJlYWwgZm9udCBuYW1lOyAgICAgICAqLwovKiAgcmV0dXJuIHRoZSBlbnRyeSdzIHJlZmVyZW5jZSBpZiBmb3VuZCBlbHNlIHJldHVybiBOVUxMLiAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHRfZm9udF9saXN0X2VudHJ5X3B0cgogIFBERkZvbnRfRmluZExpc3RFbnRyeShjb25zdCBGVUxMX0NIQVIqIGluX3JlYWxfZm9udF9uYW1lKQp7CiAgdF9mb250X2xpc3RfZW50cnlfcHRyIGVudHJ5ID0gZ19mb250X2xpc3Q7CgogIHdoaWxlIChlbnRyeSAhPSBOVUxMKSB7CiAgICBpZiAoc3RyY21wKChjaGFyKilpbl9yZWFsX2ZvbnRfbmFtZSwgKGNoYXIqKWVudHJ5LT5tX2FjdHVhbF9mb250X25hbWUpPT0wKQogICAgICBicmVhazsKICAgIGVudHJ5ID0gZW50cnktPm1fbmV4dF9mb250X2VudHJ5OwogIH0KICByZXR1cm4gZW50cnk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIGNvbnN0IEZVTExfQ0hBUiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBQREZGb250X0ZpbmRMaXN0RW50cnlfU2hvcnQoY29uc3QgRlVMTF9DSEFSKiBpbl9zaG9ydF9mb250X25hbWUpICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFRyeSB0byBmaW5kIHRoZSBmb250IGxpc3QgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIHJlYWwgZm9udCBuYW1lOyAgICAgICAqLwovKiAgcmV0dXJuIHRoZSBlbnRyeSdzIHJlZmVyZW5jZSBpZiBmb3VuZCBlbHNlIHJldHVybiBOVUxMLiAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHRfZm9udF9saXN0X2VudHJ5X3B0cgogIFBERkZvbnRfRmluZExpc3RFbnRyeV9TaG9ydChjb25zdCBGVUxMX0NIQVIqIGluX3Nob3J0X2ZvbnRfbmFtZSkKewogIHRfZm9udF9saXN0X2VudHJ5X3B0ciBlbnRyeSA9IGdfZm9udF9saXN0OwoKICB3aGlsZSAoZW50cnkgIT0gTlVMTCkgewogICAgaWYgKHN0cmNtcCgoY2hhciopaW5fc2hvcnRfZm9udF9uYW1lLCAoY2hhciopZW50cnktPm1fc2hvcnRfZm9udF9uYW1lKT09MCkKICAgICAgYnJlYWs7CiAgICBlbnRyeSA9IGVudHJ5LT5tX25leHRfZm9udF9lbnRyeTsKICB9CiAgcmV0dXJuIGVudHJ5Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBjb25zdCB0X2ZvbnRfbGlzdF9lbnRyeV9wdHIgUERGRm9udF9OZXdMaXN0RW50cnkoICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICBjb25zdCBGVUxMX0NIQVIqIGluX3Nob3J0X2ZvbnRfbmFtZSwgY29uc3QgRlVMTF9DSEFSKiBpbl9yZWFsX2ZvbnRfbmFtZSkqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBDcmVhdGUgYSBuZXcgZm9udCBlbnRyeSBhbmQgcmV0dXJuIHRoZSBzaG9ydCBuYW1lIG9mIHRoZSBmb250LiAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdF9mb250X2xpc3RfZW50cnlfcHRyCiAgUERGRm9udF9OZXdMaXN0RW50cnkoY29uc3QgRlVMTF9DSEFSKiBpbl9zaG9ydF9mb250X25hbWUsCgkJCWNvbnN0IEZVTExfQ0hBUiogaW5fcmVhbF9mb250X25hbWUsCgkJCVBERl9PQkpFQ1RfTlVNIGluX2ZvbnRfZW5jb2Rpbmdfb2JqKQp7CiAgUERGX0ZPTlRfTlVNIG5leHRfZm9udF9udW0gPSAwOwogIHRfZm9udF9saXN0X2VudHJ5X3B0ciBuZXdfZW50cnkgPSBnX2ZvbnRfbGlzdDsKICAvKiB0X2ZvbnRfbGlzdF9lbnRyeV9wdHIgbGFzdF9mb250X2xpc3RfZW50cnkgPSBOVUxMOyAqLwoKICAvKiBmaW5kIG5leHQgYXZhaWxhYmxlIGZvbnQgbnVtYmVyICovCiAgewogICAgd2hpbGUgKG5ld19lbnRyeSAhPSBOVUxMKSB7CiAgICAgIG5leHRfZm9udF9udW0rKzsKICAgICAgbmV3X2VudHJ5ID0gbmV3X2VudHJ5LT5tX25leHRfZm9udF9lbnRyeTsKICAgIH0KICB9CgogIC8qIG1ha2UgYSBuZXcgZm9udCBsaXN0IGVudHJ5ICovCiAgewogICAgY2hhciBQREZfZm9udF9uYW1lWzY0XSA9ICIvRiI7CiAgICBjaGFyIG51bVszMl07CgogICAgbmV3X2VudHJ5ID0gKHRfZm9udF9saXN0X2VudHJ5X3B0cikgbWFsbG9jKHNpemVvZih0X2ZvbnRfbGlzdF9lbnRyeSkpOwogICAgaWYgKG5ld19lbnRyeSA9PSBOVUxMKQogICAgICBFcnJvcig0OCwgNCwgIlBERkZvbnRfTmV3TGlzdEVudHJ5OiBydW4gb3V0IG9mIG1lbW9yeSIsIEZBVEFMLCBub19mcG9zKTsKCiAgICBzcHJpbnRmKG51bSwgIiV1IiwgbmV4dF9mb250X251bSk7CiAgICBzdHJjYXQoUERGX2ZvbnRfbmFtZSwgbnVtKTsKCiAgICBuZXdfZW50cnktPm1fUERGX2ZvbnRfbmFtZSA9CiAgICAgIChGVUxMX0NIQVIqKSBtYWxsb2Moc3RybGVuKChjaGFyKikgUERGX2ZvbnRfbmFtZSkgKyAxKTsKICAgIGlmIChuZXdfZW50cnktPm1fUERGX2ZvbnRfbmFtZSA9PSBOVUxMKQogICAgICBFcnJvcig0OCwgNSwgIlBERkZvbnRfTmV3TGlzdEVudHJ5OiBydW4gb3V0IG9mIG1lbW9yeSIsIEZBVEFMLCBub19mcG9zKTsKICAgIHN0cmNweSgoY2hhciopIG5ld19lbnRyeS0+bV9QREZfZm9udF9uYW1lLCBQREZfZm9udF9uYW1lKTsKCiAgICBuZXdfZW50cnktPm1fc2hvcnRfZm9udF9uYW1lID0KICAgICAgKEZVTExfQ0hBUiopIG1hbGxvYyhzdHJsZW4oKGNoYXIqKSBpbl9zaG9ydF9mb250X25hbWUpICsgMSk7CiAgICBpZiAobmV3X2VudHJ5LT5tX3Nob3J0X2ZvbnRfbmFtZSA9PSBOVUxMKQogICAgICBFcnJvcig0OCwgNiwgIlBERkZvbnRfTmV3TGlzdEVudHJ5OiBydW4gb3V0IG9mIG1lbW9yeSIsIEZBVEFMLCBub19mcG9zKTsKICAgIHN0cmNweSgoY2hhciopIG5ld19lbnRyeS0+bV9zaG9ydF9mb250X25hbWUsIChjaGFyKikgaW5fc2hvcnRfZm9udF9uYW1lKTsKCiAgICBuZXdfZW50cnktPm1fYWN0dWFsX2ZvbnRfbmFtZSA9CiAgICAgIChGVUxMX0NIQVIqKSBtYWxsb2Moc3RybGVuKChjaGFyKikgaW5fcmVhbF9mb250X25hbWUpICsgMSk7CiAgICBpZiAobmV3X2VudHJ5LT5tX2FjdHVhbF9mb250X25hbWUgPT0gTlVMTCkKICAgICAgRXJyb3IoNDgsIDcsICJQREZGb250X05ld0xpc3RFbnRyeTogcnVuIG91dCBvZiBtZW1vcnkiLCBGQVRBTCwgbm9fZnBvcyk7CiAgICBzdHJjcHkoKGNoYXIqKSBuZXdfZW50cnktPm1fYWN0dWFsX2ZvbnRfbmFtZSwgKGNoYXIqKSBpbl9yZWFsX2ZvbnRfbmFtZSk7CgogICAgbmV3X2VudHJ5LT5tX2ZvbnRfZW5jb2Rpbmdfb2JqID0gaW5fZm9udF9lbmNvZGluZ19vYmo7CgogICAgbmV3X2VudHJ5LT5tX3BkZl9vYmplY3RfbnVtYmVyID0gMDsJLyogZG9uJ3QgZ2l2ZSB0aGlzIGZvbnQgcmVzb3VyY2UgYW4gICovCgkJCQkJLyogb2JqZWN0IG51bWJlciB1bnRpbCBuZWVkZWQgICAgICAgICovCiAgICAvKiBuZXdfZW50cnktPm1faW5fdXNlID0gVFJVRTsgKi8JLyogc2hvdWxkIGJlIGNsZWFyZWQgYWZ0ZXIgZWFjaCBwYWdlICovCiAgICAvKiBnX3BhZ2VfdXNlc19mb250cyA9IFRSVUU7ICAgKi8KICAgIG5ld19lbnRyeS0+bV9mb250X3Jlc291cmNlX2luX3BkZiA9IEZBTFNFOwkvKiBub3QgaW4gUERGIGZpbGUgeWV0ICAgICAgICovCgogICAgbmV3X2VudHJ5LT5tX25leHRfZm9udF9lbnRyeSA9IGdfZm9udF9saXN0OwogICAgZ19mb250X2xpc3QgPSBuZXdfZW50cnk7CiAgfQogIGRlYnVnMShEUEQsIEQsICJuZXcgUERGIGZvbnQgZW50cnkgd2l0aCBzaG9ydCBuYW1lICVzIiwKICAgIG5ld19lbnRyeS0+bV9zaG9ydF9mb250X25hbWUpOwogIHJldHVybiBuZXdfZW50cnk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIGNvbnN0IHRfZm9udF9saXN0X2VudHJ5X3B0ciBQREZHZXRGb250KGNvbnN0IGNoYXIqIGluX3JlYWxfZm9udF9uYW1lKSAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBSZXR1cm4gdGhlIHJlZmVyZW5jZSBvZiBhIGZvbnQgZW50cnkuIE5ldmVyIHJldHVybnMgTlVMTC4gICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qCnN0YXRpYyB0X2ZvbnRfbGlzdF9lbnRyeV9wdHIgUERGR2V0Rm9udChjb25zdCBGVUxMX0NIQVIqIGluX3JlYWxfZm9udF9uYW1lKQp7CiAgdF9mb250X2xpc3RfZW50cnlfcHRyIGVudHJ5ID0gUERGRm9udF9GaW5kTGlzdEVudHJ5KGluX3JlYWxfZm9udF9uYW1lKTsKICBpZiAoZW50cnkgPT0gTlVMTCkKICAgIGVudHJ5ID0gUERGRm9udF9OZXdMaXN0RW50cnkoaW5fcmVhbF9mb250X25hbWUpOwogIHJldHVybiBlbnRyeTsKfQoqLwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBQREZGb250X1dyaXRlT2JqZWN0UmVmKEZJTEUqIGluX2ZwLCB0X2ZvbnRfbGlzdF9lbnRyeV9wdHIgaW5fZm9udF9lbnRyeSkgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgV3JpdGUgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB0byB0aGUgZmlsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQgUERGRm9udF9Xcml0ZU9iamVjdFJlZihGSUxFKiBpbl9mcCwKICBjb25zdCB0X2ZvbnRfbGlzdF9lbnRyeSogaW5fZm9udF9lbnRyeSkKewogIEFzc2VydChpbl9mb250X2VudHJ5LT5tX3BkZl9vYmplY3RfbnVtYmVyICE9IDAsIG5vX2Zwb3MpOwogIFBERk9iamVjdF9Xcml0ZVJlZihpbl9mcCwgaW5fZm9udF9lbnRyeS0+bV9wZGZfb2JqZWN0X251bWJlcik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgUERGRm9udF9Xcml0ZU9iamVjdChGSUxFKiBpbl9mcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICB0X2ZvbnRfbGlzdF9lbnRyeV9wdHIgaW5fZm9udF9lbnRyeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFdyaXRlIGEgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgdG8gdGhlIGZpbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkIFBERkZvbnRfV3JpdGVPYmplY3QoRklMRSogaW5fZnAsIHRfZm9udF9saXN0X2VudHJ5X3B0ciBpbl9mb250X2VudHJ5KQp7CiAgaWYgKGluX2ZvbnRfZW50cnktPm1fcGRmX29iamVjdF9udW1iZXIgPT0gMCkKICAgIGluX2ZvbnRfZW50cnktPm1fcGRmX29iamVjdF9udW1iZXIgPSBQREZPYmplY3RfTmV3KC8qIGluX2ZwICovKTsKICBQREZPYmplY3RfV3JpdGVPYmooaW5fZnAsIGluX2ZvbnRfZW50cnktPm1fcGRmX29iamVjdF9udW1iZXIpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBCT09MRUFOIFBERkZvbnRfSXNPbmVPZlRoZUJhc2UxNEZvbnRzKGNvbnN0IEZVTExfQ0hBUiogaW5fcmVhbF9mb250X25hbWUpKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUmV0dXJucyB0cnVlIGlmIGdpdmVuIGZvbnQgaXMgb25lIG9mIHRoZSBiYXNlIDE0IGZvbnRzLiAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIEJPT0xFQU4gUERGRm9udF9Jc09uZU9mVGhlQmFzZTE0Rm9udHMoY29uc3QgRlVMTF9DSEFSKiBpbl9yZWFsX2ZvbnRfbmFtZSkKewogIGludCBpOwogIGZvciAoaSA9IDA7IGkgPCBrQmFzZTE0Rm9udENvdW50OyBpKyspCiAgICBpZiAoc3RyY21wKGdfc3RhbmRhcmRfYmFzZV8xNF9mb250c1tpXSwgKGNoYXIqKSBpbl9yZWFsX2ZvbnRfbmFtZSkgPT0gMCkKICAgICAgcmV0dXJuIFRSVUU7CiAgcmV0dXJuIEZBTFNFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBQREZGb250X1dyaXRlRm9udFJlc291cmNlKEZJTEUqIGluX2ZwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgdF9mb250X2xpc3RfZW50cnlfcHRyIGluX2ZvbnRfZW50cnkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBXcml0ZXMgb3V0IHRoZSBQREYgaWRlYSBvZiBhIEZvbnQgcmVzb3VyY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBQREZGb250X1dyaXRlRm9udFJlc291cmNlKEZJTEUqIGluX2ZwLAogIHRfZm9udF9saXN0X2VudHJ5X3B0ciBpbl9mb250X2VudHJ5KQp7CiAgaWYgKCEgaW5fZm9udF9lbnRyeS0+bV9mb250X3Jlc291cmNlX2luX3BkZikKICB7CiAgICBpbl9mb250X2VudHJ5LT5tX2ZvbnRfcmVzb3VyY2VfaW5fcGRmID0gVFJVRTsKCiAgICBpZiAoZ19QREZfZGVidWcpCiAgICAgIGZwcmludGYoaW5fZnAsICIlJVxuJSUgZGVjbGFyZSB1c2Ugb2YgZm9udCAlczpcbiUlXG4iLAoJaW5fZm9udF9lbnRyeS0+bV9hY3R1YWxfZm9udF9uYW1lKTsKCiAgICBQREZGb250X1dyaXRlT2JqZWN0KGluX2ZwLCBpbl9mb250X2VudHJ5KTsKICAgIGZwdXRzKCI8PFxuL1R5cGUgL0ZvbnRcbi9TdWJ0eXBlIC9UeXBlMVxuIiwgaW5fZnApOwogICAgZnByaW50Zihpbl9mcCwgIi9OYW1lICVzXG4iLCAoY2hhciopIGluX2ZvbnRfZW50cnktPm1fUERGX2ZvbnRfbmFtZSk7CiAgICBmcHJpbnRmKGluX2ZwLCAiL0Jhc2VGb250IC8lc1xuIiwgKGNoYXIqKSBpbl9mb250X2VudHJ5LT5tX2FjdHVhbF9mb250X25hbWUpOwogICAgaWYgKCEgUERGRm9udF9Jc09uZU9mVGhlQmFzZTE0Rm9udHMoaW5fZm9udF9lbnRyeS0+bV9hY3R1YWxfZm9udF9uYW1lKSkKICAgIHsKICAgICAgLyogKioqCiAgICAgIGZwdXRzKCIvRmlyc3RDaGFyIDAiXG4sIGluX2ZwKTsJLSB3ZSBkb24ndCBkbyBmaXJzdCBjaGFycyAoeWV0KQogICAgICBmcHV0cygiL0xhc3RDaGFyIDI1NVxuIiwgaW5fZnApOwktIHdlIGRvbid0IGRvIGxhc3QgY2hhcnMgKHlldCkKICAgICAgZnB1dHMoIi9XaWR0aHMgIiwgaW5fZnApOwkJLSB3ZSBkb24ndCBkbyBsYXN0IGNoYXJzICh5ZXQpCiAgICAgIGZwdXRzKCIvRm9udERlc2NyaXB0b3IgIiwgaW5fZnApOwktIHdlIGRvbid0IGRvIGZvbnQgZGVzY3JpcHRvcnMgKHlldCkKICAgICAgKioqICovCiAgICB9CgogICAgaWYgKGluX2ZvbnRfZW50cnktPm1fZm9udF9lbmNvZGluZ19vYmogIT0gMCkKICAgIHsKICAgICAgZnB1dHMoIi9FbmNvZGluZyAiLCBpbl9mcCk7CiAgICAgIFBERk9iamVjdF9Xcml0ZVJlZihpbl9mcCwgaW5fZm9udF9lbnRyeS0+bV9mb250X2VuY29kaW5nX29iaik7CiAgICAgIGZwdXRzKCJcbiIsIGluX2ZwKTsKICAgIH0KCiAgICAvKiAqKioKICAgIGVsc2UKICAgICAgRXJyb3IoNDgsIDgsICJQREZGb250X1dyaXRlRm9udFJlc291cmNlOiBhIGZvbnQgaGFzIG5vIGVuY29kaW5nIiwKCVdBUk4sIG5vX2Zwb3MpOwogICAgKioqICovCiAgICBmcHV0cygiPj5cbmVuZG9ialxuIiwgaW5fZnApOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUERGRm9udF9Xcml0ZUZvbnRSZXNvdXJjZV9uYW1lKEZJTEUqIGluX2ZwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgIGNvbnN0IEZVTExfQ0hBUiogaW5fcmVhbF9mb250X25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgV3JpdGVzIG91dCB0aGUgUERGIGlkZWEgb2YgYSBGb250IHJlc291cmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyogKioqCnN0YXRpYyB2b2lkIFBERkZvbnRfV3JpdGVGb250UmVzb3VyY2VfbmFtZShGSUxFKiBpbl9mcCwKICBjb25zdCBGVUxMX0NIQVIqIGluX3JlYWxfZm9udF9uYW1lKQp7CiAgdF9mb250X2xpc3RfZW50cnlfcHRyIGVudHJ5ID0gUERGRm9udF9GaW5kTGlzdEVudHJ5KGluX3JlYWxfZm9udF9uYW1lKTsKICBBc3NlcnQoZW50cnkgIT0gTlVMTCwgbm9fZnBvcyk7CiAgUERGRm9udF9Xcml0ZUZvbnRSZXNvdXJjZShpbl9mcCwgZW50cnkpOwp9CioqKiAqLwoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgY29uc3QgRlVMTF9DSEFSKiBQREZHZXRQREZGb250TmFtZShjb25zdCBGVUxMX0NIQVIqIGluX3JlYWxfZm9udF9uYW1lKSAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFJldHVybiB0aGUgc2hvcnQgbmFtZSBvZiBhIGZvbnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qICoqKgpzdGF0aWMgY29uc3QgRlVMTF9DSEFSKiBQREZHZXRQREZGb250TmFtZShjb25zdCBGVUxMX0NIQVIqIGluX3JlYWxfZm9udF9uYW1lKQp7CiAgdF9mb250X2xpc3RfZW50cnlfcHRyIGVudHJ5ID0gUERGRm9udF9GaW5kTGlzdEVudHJ5KGluX3JlYWxfZm9udF9uYW1lKTsKICBBc3NlcnQoZW50cnkgIT0gTlVMTCwgbm9fZnBvcyk7CiAgcmV0dXJuIGVudHJ5LT5tX1BERl9mb250X25hbWU7Cn0KKioqICovCgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIFBERl9PQkpFQ1RfTlVNIFBERkZvbnRfRmluZEZvbnRFbmNvZGluZyhGVUxMX0NIQVIqIGluX2ZvbnRfZW5jb2RpbmdfbmFtZSkgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUmV0dXJuIHRoZSBvYmplY3QgbnVtYmVyIG9mIGEgZ2l2ZW4gZm9udCBlbmNvZGluZy4gICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIFBERl9PQkpFQ1RfTlVNIFBERkZvbnRfRmluZEZvbnRFbmNvZGluZygKICBjb25zdCBGVUxMX0NIQVIqIGluX2ZvbnRfZW5jb2RpbmdfbmFtZSkKewogIHRfZm9udF9lbmNvZGluZ19lbnRyeV9wdHIgZW50cnkgPSBnX2ZvbnRfZW5jb2RpbmdfbGlzdDsKCiAgLyogdGhlc2UgdHdvIGxpbmVzIGFyZSBVd2UgcGF0Y2ggSnVsIDE4LCAyMDAwICovCiAgaWYgKGluX2ZvbnRfZW5jb2RpbmdfbmFtZSA9PSBOVUxMKQogICAgcmV0dXJuIDA7CgogIHdoaWxlIChlbnRyeSAhPSBOVUxMKQogIHsKICAgIGlmIChzdHJjbXAoKGNoYXIqKWluX2ZvbnRfZW5jb2RpbmdfbmFtZSwgKGNoYXIqKWVudHJ5LT5tX2ZvbnRfZW5jb2RpbmcpPT0wKQogICAgICBicmVhazsKICAgIGVudHJ5ID0gZW50cnktPm1fbmV4dF9lbnRyeTsKICB9CiAgcmV0dXJuIChlbnRyeSAhPSBOVUxMKSA/IGVudHJ5LT5tX29iamVjdF9udW0gOiAwOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkIFBERkZvbnRfQWRkRm9udCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgIEZJTEUqIGluX2ZwLCBjb25zdCBGVUxMX0NIQVIqIGluX3Nob3J0X2ZvbnRfbmFtZSwgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgY29uc3QgRlVMTF9DSEFSKiBpbl9yZWFsX2ZvbnRfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIEFkZCB0aGlzIGZvbnQgdG8gdGhlIGxpc3Qgb2YgZm9udHMgdGhhdCB0aGUgZG9jdW1lbnQgdXNlcy4gQWxzbyByZW1lbWJlciAqLwovKiAgdGhhdCB0aGlzIGZvbnQgaXMgImluIHVzZSIgKG91dHB1dCB3aGVuIHBhZ2UgcmVzb3VyY2VzIGFyZSB3cml0dGVuKS4gICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBQREZGb250X0FkZEZvbnQoRklMRSogaW5fZnAsIGNvbnN0IEZVTExfQ0hBUiogaW5fc2hvcnRfZm9udF9uYW1lLAogIGNvbnN0IEZVTExfQ0hBUiogaW5fcmVhbF9mb250X25hbWUsIGNvbnN0IEZVTExfQ0hBUiogaW5fZm9udF9lbmNvZGluZ19uYW1lKQp7CiAgdF9mb250X2xpc3RfZW50cnlfcHRyIGVudHJ5ID0gUERGRm9udF9GaW5kTGlzdEVudHJ5KGluX3JlYWxfZm9udF9uYW1lKTsKICBkZWJ1ZzQoRFBELCBELCAiUERGRm9udF9BZGRGb250KC0sICVzLCAlcywgJXMpIFtuZXcgPSAlc10iLAogICAgaW5fc2hvcnRfZm9udF9uYW1lLCBpbl9yZWFsX2ZvbnRfbmFtZSwKICAgIChpbl9mb250X2VuY29kaW5nX25hbWUgPyBpbl9mb250X2VuY29kaW5nX25hbWUgOiAiIiksCiAgICBib29sKGVudHJ5ID09IE5VTEwpKTsKICAvKiAqKiogdGhpcyBhdHRlbXB0ZWQgYnVnIGZpeCBieSBKZWZmIEsuIHByb2JsZW0gbWF5IGJlIG11bHRpcGxlIGZvbnQKCSBlbnRyaWVzIGZvciB0aGUgc2FtZSBmb250CiAgaWYgKGVudHJ5ID09IE5VTEwpCiAgKioqICovCiAgaWYgKFRSVUUpCiAgICBlbnRyeSA9IFBERkZvbnRfTmV3TGlzdEVudHJ5KGluX3Nob3J0X2ZvbnRfbmFtZSwgaW5fcmVhbF9mb250X25hbWUsCiAgICAgIFBERkZvbnRfRmluZEZvbnRFbmNvZGluZyhpbl9mb250X2VuY29kaW5nX25hbWUpKTsKCiAgLyogKioqCiAgZW50cnktPm1faW5fdXNlID0gVFJVRTsKICBnX3BhZ2VfdXNlc19mb250cyA9IFRSVUU7CiAgKioqICovCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgUERGUGFnZV9TZXRWYXJzKGludCB4c2l6ZSwgaW50IHlzaXplLCBpbnQgeG1hcmssIGludCB5bWFyaywgICAgICAgICAqLwovKiAgICBpbnQgbG91dGYsIGludCBsb3V0diwgaW50IGxvdXRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFdyaXRlcyBhIHN0cmluZyB0byB0aGUgcGFnZSdzIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgUERGUGFnZV9TZXRWYXJzKGludCB4c2l6ZSwgaW50IHlzaXplLCBpbnQgeG1hcmssIGludCB5bWFyaywKICBpbnQgbG91dGYsIGludCBsb3V0diwgaW50IGxvdXRzKQp7CiAgZ19ncmFwaGljc192YXJzW2tfeHNpemVdID0geHNpemU7CiAgZ19ncmFwaGljc192YXJzW2tfeXNpemVdID0geXNpemU7CiAgZ19ncmFwaGljc192YXJzW2tfeG1hcmtdID0geG1hcms7CiAgZ19ncmFwaGljc192YXJzW2tfeW1hcmtdID0geW1hcms7CgogIGdfdW5pdHNba19sb3V0Zl0gPSBsb3V0ZjsKICBnX3VuaXRzW2tfbG91dHZdID0gbG91dHY7CiAgZ191bml0c1trX2xvdXRzXSA9IGxvdXRzOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkIFBERlBhZ2VfRmx1c2hDb21wcmVzc2VkQnVmZmVyKEZJTEUqIGluX2ZwKSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgRmx1c2hlcyB0aGUgY29tcHJlc3NlZCBvdXRwdXQgYnVmZmVyIHRvIHRoZSBwYWdlJ3Mgc3RyZWFtLiAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIFBERl9DT01QUkVTU0lPTgpzdGF0aWMgdm9pZCBQREZQYWdlX0ZsdXNoQ29tcHJlc3NlZEJ1ZmZlcihGSUxFKiBpbl9mcCkKewogIGludCBlcnI7CgogIEFzc2VydChnX2FwcGx5X2NvbXByZXNzaW9uLCBub19mcG9zKTsKICBkbyB7CiAgICBlcnIgPSBkZWZsYXRlKCZnX2NvbXBfc3RyZWFtLCBaX0ZJTklTSCk7CgogICAgZndyaXRlKGdfY29tcHJlc3NlZF9vdXRwdXQsCiAgICAgIHNpemVvZihnX2NvbXByZXNzZWRfb3V0cHV0KSAtIGdfY29tcF9zdHJlYW0uYXZhaWxfb3V0LCAxLCBpbl9mcCk7CiAgICBnX2NvbXBfc3RyZWFtLm5leHRfb3V0ID0gZ19jb21wcmVzc2VkX291dHB1dDsKICAgIGdfY29tcF9zdHJlYW0uYXZhaWxfb3V0ID0gc2l6ZW9mKGdfY29tcHJlc3NlZF9vdXRwdXQpOwogIH0gd2hpbGUgKGVyciA9PSBaX09LKTsKCiAgaWYgKGVyciAhPSBaX1NUUkVBTV9FTkQpCiAgICBFcnJvcig0OCwgOSwgIlBERlBhZ2VfRmx1c2hDb21wcmVzc2VkQnVmZmVyOiB6bGliIGVycm9yIG9jY3VycmVkIiwKICAgICAgRkFUQUwsIG5vX2Zwb3MpOwoKICBlcnIgPSBkZWZsYXRlRW5kKCZnX2NvbXBfc3RyZWFtKTsKICBpZiAoZXJyICE9IFpfT0spCiAgICBFcnJvcig0OCwgMTAsICJQREZQYWdlX0ZsdXNoQ29tcHJlc3NlZEJ1ZmZlcjogemxpYiBlcnJvciBvY2N1cnJlZCIsCiAgICAgIEZBVEFMLCBub19mcG9zKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCBQREZQYWdlX0ZsdXNoUmF3QnVmZmVyKEZJTEUqIGluX2ZwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIEF0dGVtcHRzIHRvIGNvbXByZXNzIHRoZSByYXcgYnVmZmVyOyBhbHNvIGZsdXNoZXMgdGhlIGNvbXByZXNzZWQgb3V0cHV0ICAqLwovKiAgYnVmZmVyIHRvIHRoZSBwYWdlJ3Mgc3RyZWFtIGlmIGl0IGlzIGZ1bGwuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQgUERGUGFnZV9GbHVzaFJhd0J1ZmZlcihGSUxFKiBpbl9mcCkKewogIGludCBlcnI7CgogIC8qIGNvbXByZXNzIHRoZSByYXcgYnVmZmVyICovCiAgQXNzZXJ0KGdfYXBwbHlfY29tcHJlc3Npb24sIG5vX2Zwb3MpOwogIGdfY29tcF9zdHJlYW0ubmV4dF9pbiA9IGdfcmF3X291dHB1dDsKICBnX2NvbXBfc3RyZWFtLmF2YWlsX2luID0gKHVJbnQpIChnX3Jhd19idWZmZXJfcHRyIC0gZ19yYXdfb3V0cHV0KTsKICBBc3NlcnQoZ19jb21wX3N0cmVhbS5hdmFpbF9vdXQgIT0gMCwgbm9fZnBvcyk7CgogIC8qIGFsd2F5cyBjb21wcmVzcyB0byB0aGUgcG9pbnQgd2hlcmUgdGhlIHJhdyBidWZmZXIgaXMgZW1wdHkgKi8KICBkbyB7CiAgICBlcnIgPSBkZWZsYXRlKCZnX2NvbXBfc3RyZWFtLCBaX05PX0ZMVVNIKTsKICAgIC8qIGJ1ZyBmaXggZnJvbSBuZXdtYW4tYW5keUB5YWxlLmVkdSBGZWIgMjMgMjAwMCBpZiAoZXJyICE9IFpfT0spICovCiAgICBpZiAoIGVyciAhPSBaX09LICYmIGdfY29tcF9zdHJlYW0uYXZhaWxfaW4gIT0gMCApCiAgICAgIEVycm9yKDQ4LCAxMSwgIlBERlBhZ2VfRmx1c2hSYXdCdWZmZXI6IHpsaWIgZXJyb3Igb2NjdXJyZWQiLEZBVEFMLG5vX2Zwb3MpOwoKICAgIC8qIElGIGNvbXByZXNzZWQgb3V0cHV0IGJ1ZmZlciBpcyBmdWxsIFRIRU4gZmx1c2ggaXQgdG8gZGlzayBhbmQgcmVzZXQgaXQgKi8KICAgIGlmIChnX2NvbXBfc3RyZWFtLmF2YWlsX291dCA9PSAwKQogICAgewogICAgICBpZiAoZndyaXRlKGdfY29tcHJlc3NlZF9vdXRwdXQsIHNpemVvZihnX2NvbXByZXNzZWRfb3V0cHV0KSwgMSwgaW5fZnApIT0xKQoJRXJyb3IoNDgsIDEyLCAiUERGUGFnZV9GbHVzaFJhd0J1ZmZlcjogd3JpdGUgZXJyb3Igb2NjdXJyZWQiLAoJICBGQVRBTCwgbm9fZnBvcyk7CiAgICAgIGdfY29tcF9zdHJlYW0ubmV4dF9vdXQgPSBnX2NvbXByZXNzZWRfb3V0cHV0OwogICAgICBnX2NvbXBfc3RyZWFtLmF2YWlsX291dCA9IHNpemVvZihnX2NvbXByZXNzZWRfb3V0cHV0KTsKICAgIH0KICB9IHdoaWxlIChnX2NvbXBfc3RyZWFtLmF2YWlsX2luICE9IDApOwoKICAvKiByZXNldCByYXcgYnVmZmVyIGZvciBuZXh0IGNhbGwgKi8KICBnX3Jhd19idWZmZXJfcHRyID0gZ19yYXdfb3V0cHV0Owp9CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCBQREZQYWdlX1dyaXRlU3RyZWFtKEZJTEUqIGluX2ZwLCBjaGFyKiBpbl9zdHIpICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFdyaXRlcyBhIHN0cmluZyB0byB0aGUgcGFnZSdzIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkIFBERlBhZ2VfV3JpdGVTdHJlYW0oRklMRSogaW5fZnAsIGNoYXIqIGluX3N0cikKewogIGlmICgqaW5fc3RyID09IDApCiAgICByZXR1cm47CgojaWYgUERGX0NPTVBSRVNTSU9OCiAgaWYgKGdfYXBwbHlfY29tcHJlc3Npb24pCiAgewogICAgdW5zaWduZWQgaW50IHRvdGFsID0gc3RybGVuKGluX3N0cik7CiAgICBjaGFyICpwdHIgPSBpbl9zdHI7CgogICAgd2hpbGUgKHRvdGFsICE9IDApCiAgICB7CiAgICAgIHVuc2lnbmVkIGludCBsZW4gPSB0b3RhbDsKICAgICAgQk9PTEVBTiBuZWVkVG9GbHVzaCA9CgkoKGdfcmF3X2J1ZmZlcl9wdHIgKyBsZW4pID4gKGdfcmF3X291dHB1dCArIHNpemVvZihnX3Jhd19vdXRwdXQpKSk7CiAgICAgIGlmIChuZWVkVG9GbHVzaCkKCWxlbiA9IGdfcmF3X291dHB1dCArIHNpemVvZihnX3Jhd19vdXRwdXQpIC0gZ19yYXdfYnVmZmVyX3B0cjsKICAgICAgbWVtY3B5KGdfcmF3X2J1ZmZlcl9wdHIsIHB0ciwgbGVuKTsKCiAgICAgIHB0ciArPSBsZW47CiAgICAgIGdfcmF3X2J1ZmZlcl9wdHIgKz0gbGVuOwogICAgICB0b3RhbCAtPSBsZW47CgogICAgICAvKiBJRiBuZWVkIHRvIGZsdXNoIHJhdyBidWZmZXIgVEhFTiBkbyBzbyAqLwogICAgICBpZiAobmVlZFRvRmx1c2gpIFBERlBhZ2VfRmx1c2hSYXdCdWZmZXIoaW5fZnApOwogICAgfSAvKiB3aGlsZSBzdGlsbCBoYXZlIGJ5dGVzIHRvIHByb2Nlc3MgKi8KICB9CiAgZWxzZQojZW5kaWYKICAgIGZwdXRzKGluX3N0ciwgaW5fZnApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkIFBERlBhZ2VfQmVnaW4oRklMRSogaW5fZnApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgQmVnaW5zIHRoZSBwYWdlJ3Mgc3RyZWFtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQgUERGUGFnZV9CZWdpbihGSUxFKiBpbl9mcCkKewogIGlmIChnX3BhZ2VfY29udGVudHNfb2JqX251bSA9PSAwKQogIHsKICAgIHRfdGVtcGJ1ZiBzdHI7CgogICAgaWYgKGdfUERGX2RlYnVnKQogICAgICBmcHJpbnRmKGluX2ZwLCAiJSVcbiUlIHBhZ2UgJXUncyBjb250ZW50czpcbiUlXG4iLCBnX3BhZ2VfY291bnQpOwoKICAgIGdfcGFnZV9jb250ZW50c19vYmpfbnVtID0gUERGT2JqZWN0X1dyaXRlTmV3T2JqKGluX2ZwKTsKICAgIGdfcGFnZV9sZW5ndGhfb2JqX251bSA9IFBERk9iamVjdF9OZXcoLyogaW5fZnAgKi8pOwogICAgZnB1dHMoIjw8IC9MZW5ndGggIiwgaW5fZnApOwogICAgUERGT2JqZWN0X1dyaXRlUmVmKGluX2ZwLCBnX3BhZ2VfbGVuZ3RoX29ial9udW0pOwojaWYgUERGX0NPTVBSRVNTSU9OCiAgICBpZiAoZ19hcHBseV9jb21wcmVzc2lvbikgZnB1dHMoIiAvRmlsdGVyIC9GbGF0ZURlY29kZSIsIGluX2ZwKTsKI2VuZGlmCiAgICBmcHV0cygiID4+XG5zdHJlYW1cbiIsIGluX2ZwKTsKICAgIGdfcGFnZV9zdGFydF9vZmZzZXQgPSBmdGVsbChpbl9mcCk7CgojaWYgUERGX0NPTVBSRVNTSU9OCiAgICBpZiAoZ19hcHBseV9jb21wcmVzc2lvbikKICAgIHsKICAgICAgaW50IGVycjsKCiAgICAgIGdfcmF3X2J1ZmZlcl9wdHIgPSBnX3Jhd19vdXRwdXQ7CiAgICAgIGdfY29tcF9zdHJlYW0uemFsbG9jID0gKGFsbG9jX2Z1bmMpIFpfTlVMTDsKICAgICAgZ19jb21wX3N0cmVhbS56ZnJlZSA9IChmcmVlX2Z1bmMpIFpfTlVMTDsKICAgICAgZ19jb21wX3N0cmVhbS5vcGFxdWUgPSAodm9pZHBmKSBaX05VTEw7CgogICAgICBlcnIgPSBkZWZsYXRlSW5pdCgmZ19jb21wX3N0cmVhbSwgWl9ERUZBVUxUX0NPTVBSRVNTSU9OKTsKICAgICAgaWYgKGVyciAhPSBaX09LKQoJRXJyb3IoNDgsIDEzLCAiUERGUGFnZV9CZWdpbjogemxpYiBlcnJvciBvY2N1cnJlZCIsIEZBVEFMLCBub19mcG9zKTsKCiAgICAgIGdfY29tcF9zdHJlYW0ubmV4dF9vdXQgPSBnX2NvbXByZXNzZWRfb3V0cHV0OwogICAgICBnX2NvbXBfc3RyZWFtLmF2YWlsX291dCA9IHNpemVvZihnX2NvbXByZXNzZWRfb3V0cHV0KTsKICAgIH0KI2VuZGlmCgojaWZuZGVmIFVTRV9NQVRSSUNFUwogICAgc3ByaW50ZihzdHIsICIlLjJmIDAgMCAlLjJmIDAgMCBjbVxuIiwKICAgICAgZ19wYWdlX2hfc2NhbGVfZmFjdG9yLCBnX3BhZ2Vfdl9zY2FsZV9mYWN0b3IpOwogICAgUERGUGFnZV9Xcml0ZVN0cmVhbShpbl9mcCwgc3RyKTsKI2VuZGlmCiAgICBzcHJpbnRmKHN0ciwgIiV1IHdcbiIsIGdfcGFnZV9saW5lX3dpZHRoKTsKICAgIFBERlBhZ2VfV3JpdGVTdHJlYW0oaW5fZnAsIHN0cik7CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkIFBERlBhZ2VfRmx1c2hCdWZmZXIoRklMRSogaW5fZnApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgRmx1c2ggdGhlIGJ1ZmZlciB0byB0aGUgcGFnZSdzIHN0cmVhbSBhbmQgdHVybiBvZmYgYnVmZmVyaW5nIG1vZGUuICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQgUERGUGFnZV9GbHVzaEJ1ZmZlcihGSUxFKiBpbl9mcCkKewogIGlmIChnX2luX2J1ZmZlcmluZ19tb2RlKQogIHsKICAgIGdfaW5fYnVmZmVyaW5nX21vZGUgPSBGQUxTRTsKCiAgICAvKiBlbXB0eSB0aGUgc3RhY2sgc2luY2UgaXQncyBubyBsb25nZXIgbmVlZGVkICovCiAgICB3aGlsZSAoZ19xc2F2ZV9tYXJraW5nX3N0YWNrICE9IE5VTEwpCiAgICB7CiAgICAgIHRfcXNhdmVfbWFya2luZ19lbnRyeV9wdHIgZW50cnkgPSBnX3FzYXZlX21hcmtpbmdfc3RhY2s7CiAgICAgIGdfcXNhdmVfbWFya2luZ19zdGFjayA9IGVudHJ5LT5tX25leHRfZW50cnk7CiAgICAgIGZyZWUoZW50cnkpOwogICAgfQoKICAgIC8qIG91dHB1dCB0aGUgYnVmZmVyICovCiAgICBQREZQYWdlX1dyaXRlU3RyZWFtKGluX2ZwLCBnX2J1ZmZlcik7CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBQREZfRklMRV9PRkZTRVQgUERGUGFnZV9FbmQoRklMRSogaW5fZnApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgRW5kcyB0aGUgcGFnZSdzIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIFBERl9GSUxFX09GRlNFVCBQREZQYWdlX0VuZChGSUxFKiBpbl9mcCkKewoKICAvKiBpZiBwYWdlIGhhcyBubyBtYXJrcyBvbiBpdCB0aGVuIHdyaXRlIG91dCBhbiBlbXB0eSBzdHJlYW0gKi8KICBpZiAoZ19pbl9idWZmZXJpbmdfbW9kZSkKICB7CiAgICBnX2J1ZmZlcl9wb3MgPSAwOwogICAgZ19idWZmZXJbMF0gPSAnXDAnOwkJCS8qIGZvcmNlIGVtcHR5IHN0cmluZyB0byBiZSB3cml0dGVuICAqLwogICAgUERGUGFnZV9GbHVzaEJ1ZmZlcihpbl9mcCk7CSAgLyogYWxsIEkgcmVhbGx5IHdhbnQgaXMgdG8gZW1wdHkgdGhlIHN0YWNrICovCiAgfQoKICAvKiBJRiBhcHBseWluZyBjb21wcmVzc2lvbiBUSEVOIGZpcnN0IGZsdXNoIHRoZSByYXcgYnVmZmVyIGFuZCB0aGVuIGZsdXNoICovCiAgLyogdGhlIGNvbXByZXNzZWQgYnVmZmVyIChtdXN0IGJlIHBlcmZvcm1lZCBpbiB0aGF0IG9yZGVyISkgICAgICAgICAgICAgICAqLwojaWYgUERGX0NPTVBSRVNTSU9OCiAgaWYgKGdfYXBwbHlfY29tcHJlc3Npb24pCiAgewogICAgaWYgKChnX3Jhd19idWZmZXJfcHRyID4gZ19yYXdfb3V0cHV0KSAmJiAoZ19yYXdfYnVmZmVyX3B0clstMV0gPT0gJ1xuJykpCiAgICAgIGdfcmF3X2J1ZmZlcl9wdHItLTsJCS8qIHJlbW92ZSBsYXN0IGxpbmVmZWVkICovCgogICAgUERGUGFnZV9GbHVzaFJhd0J1ZmZlcihpbl9mcCk7CiAgICBQREZQYWdlX0ZsdXNoQ29tcHJlc3NlZEJ1ZmZlcihpbl9mcCk7CiAgICBmcHV0cygiXG4iLCBpbl9mcCk7CiAgfQojZW5kaWYKCiAgLyogY2xvc2UgcGFnZSdzIHN0cmVhbSAqLwogIEFzc2VydChnX3BhZ2VfY29udGVudHNfb2JqX251bSAhPSAwLCBub19mcG9zKTsKICB7CiAgICBQREZfRklMRV9PRkZTRVQgcGFnZV9sZW5ndGggPSBmdGVsbChpbl9mcCkgLSBnX3BhZ2Vfc3RhcnRfb2Zmc2V0OwoKICAgIC8qIGNsb3NlIHBhZ2UncyBzdHJlYW0gKi8KICAgIGZwdXRzKCJlbmRzdHJlYW1cbmVuZG9ialxuIiwgaW5fZnApOwogICAgcmV0dXJuIHBhZ2VfbGVuZ3RoOwogIH0KICByZXR1cm4gMDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCBQREZQYWdlX1dyaXRlKEZJTEUqIGluX2ZwLCBjaGFyKiBpbl9zdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFdyaXRlcyBhIHN0cmluZyB0byB0aGUgcGFnZSdzIHN0cmVhbS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgUERGUGFnZV9Xcml0ZShGSUxFKiBpbl9mcCwgY2hhciogaW5fc3RyKQp7CiAgaWYgKCppbl9zdHIgPT0gMCkKICAgIHJldHVybjsKCiAgUERGUGFnZV9CZWdpbihpbl9mcCk7CS8qIHdyaXRlIHBhZ2UgY29udGVudCdzIGhkciAiPDwgL0xlbmd0aCA+PiBzdHJlYW0iLi4uKi8KCiAgLyogSUYgdHJ5aW5nIHRvIHJlbW92ZSByZWR1bmRhbnQgb3BlcmF0aW9ucyBUSEVOICovCiAgaWYgKGdfaW5fYnVmZmVyaW5nX21vZGUpCiAgewoKICAgIC8qIGlmIGJ1ZmZlciB3aWxsIG92ZXJmbG93IHRoZW4gdHVybiBvZmYgYnVmZmVyaW5nIGFuZCBmbHVzaCBidWZmZXIgKi8KICAgIHVuc2lnbmVkIGludCBsZW4gPSBzdHJsZW4oaW5fc3RyKTsKICAgIGlmICggKGdfYnVmZmVyX3BvcyArIGxlbikgPiAoa0J1ZmZlclNpemUtMSkgKQkvKiAtMSBmb3IgTlVMTCBjaGFyICovCiAgICB7CiAgICAgIFBERlBhZ2VfRmx1c2hCdWZmZXIoaW5fZnApOwogICAgICBQREZQYWdlX1dyaXRlU3RyZWFtKGluX2ZwLCBpbl9zdHIpOwogICAgfQogICAgZWxzZQogICAgewogICAgICBzdHJjcHkoZ19idWZmZXIgKyBnX2J1ZmZlcl9wb3MsIGluX3N0cik7CQkvKiBzYXZlIGludG8gYnVmZmVyICovCiAgICAgIGdfYnVmZmVyX3BvcyArPSBsZW47CiAgICB9CiAgfQogIGVsc2UKICB7CiAgICBpZiAoZ19USl9wZW5kaW5nKQogICAgewogICAgICBnX1RKX3BlbmRpbmcgID0gRkFMU0U7CQkJCS8qIGNsZWFyIGl0ICovCiAgICAgIFBERlBhZ2VfV3JpdGVTdHJlYW0oaW5fZnAsICIpXVRKXG4iKTsKICAgIH0KCiAgICBpZiAoZ19FVF9wZW5kaW5nKQogICAgewogICAgICBnX0VUX3BlbmRpbmcgID0gRkFMU0U7CQkJCS8qIGNsZWFyIGl0ICovCiAgICAgIFBERlBhZ2VfV3JpdGVTdHJlYW0oaW5fZnAsICJFVFxuIik7CiAgICAgIGdfdmFsaWRfdGV4dF9tYXRyaXggPSBGQUxTRTsJCQkvKiBUZCBpcyBub3QgYWxsb3dlZCAqLwogICAgfQoKICAgIFBERlBhZ2VfV3JpdGVTdHJlYW0oaW5fZnAsIGluX3N0cik7CiAgfQp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBQREZQYWdlX1B1c2goRklMRSogaW5fZnApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgU2F2ZXMgdGhlIGN1cnJlbnQgZ3JhcGhpY3Mgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBQREZQYWdlX1B1c2goRklMRSogaW5fZnApCnsKCiAgLyogcHVzaCBvcmlnaW4gY29vcmRzICovCiAgewogICAgdF9xc2F2ZV9lbnRyeV9wdHIgZW50cnkgPSAodF9xc2F2ZV9lbnRyeV9wdHIpIG1hbGxvYyhzaXplb2YodF9xc2F2ZV9lbnRyeSkpOwogICAgaWYgKGVudHJ5ID09IE5VTEwpCiAgICAgIEVycm9yKDQ4LCAxNCwgIlBERlBhZ2VfUHVzaDogcnVuIG91dCBvZiBtZW1vcnkiLCBGQVRBTCwgbm9fZnBvcyk7CgogICAgZW50cnktPm1fcGFnZV9oX29yaWdpbiA9IGdfcGFnZV9oX29yaWdpbjsKICAgIGVudHJ5LT5tX3BhZ2Vfdl9vcmlnaW4gPSBnX3BhZ2Vfdl9vcmlnaW47CiAgICAvKiBlbnRyeS0+bV9wYWdlX2hfc2NhbGVfZmFjdG9yID0gZ19wYWdlX2hfc2NhbGVfZmFjdG9yOyAqLwogICAgLyogZW50cnktPm1fcGFnZV92X3NjYWxlX2ZhY3RvciA9IGdfcGFnZV92X3NjYWxlX2ZhY3RvcjsgKi8KICAgIGVudHJ5LT5tX25leHRfZW50cnkgPSBnX3FzYXZlX3N0YWNrOwogICAgZ19xc2F2ZV9zdGFjayA9IGVudHJ5OwogIH0KCiAgLyogaWYgYnVmZmVyaW5nIHRleHQgKi8KICBpZiAoZ19pbl9idWZmZXJpbmdfbW9kZSkKICB7CgogICAgLyogcHVzaCBjdXJyZW50IHN0YXRlICovCiAgICB0X3FzYXZlX21hcmtpbmdfZW50cnlfcHRyIGVudHJ5ID0KICAgICAgKHRfcXNhdmVfbWFya2luZ19lbnRyeV9wdHIpIG1hbGxvYyhzaXplb2YodF9xc2F2ZV9tYXJraW5nX2VudHJ5KSk7CiAgICBpZiAoZW50cnkgPT0gTlVMTCkKICAgICAgRXJyb3IoNDgsIDE1LCAiUERGUGFnZV9QdXNoOiBydW4gb3V0IG9mIG1lbW9yeSIsIEZBVEFMLCBub19mcG9zKTsKCiAgICBlbnRyeS0+bV9uZXh0X2VudHJ5ID0gZ19xc2F2ZV9tYXJraW5nX3N0YWNrOyAgICAvKiBuZXh0LXRvLXRvcC1vZi1zdGFjayAqLwogICAgZW50cnktPm1fYnVmZmVyX3BvcyA9IGdfYnVmZmVyX3BvczsKICAgIGdfcXNhdmVfbWFya2luZ19zdGFjayA9IGVudHJ5OwkJICAgIC8qIG5ldyBUT1MgICAgICAgICAgICAgICovCiAgICAvKiBnX2luX2J1ZmZlcmluZ19tb2RlID0gVFJVRTsgKi8KICB9CgogIC8qIHdyaXRlIG91dCBwdXNoIG9wICovCiAgUERGUGFnZV9Xcml0ZShpbl9mcCwgInFcbiIpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBQREZQYWdlX1BvcChGSUxFKiBpbl9mcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUmVzdG9yZXMgdGhlIGN1cnJlbnQgZ3JhcGhpY3Mgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBQREZQYWdlX1BvcChGSUxFKiBpbl9mcCkKewoKICAvKiBwb3Agb3JpZ2luIGNvb3JkcyAqLwogIHsKICAgIHRfcXNhdmVfZW50cnlfcHRyIGVudHJ5ID0gZ19xc2F2ZV9zdGFjazsKCiAgICBnX3BhZ2VfaF9vcmlnaW4gPSBlbnRyeS0+bV9wYWdlX2hfb3JpZ2luOwogICAgZ19wYWdlX3Zfb3JpZ2luID0gZW50cnktPm1fcGFnZV92X29yaWdpbjsKICAgIC8qIGdfcGFnZV9oX3NjYWxlX2ZhY3RvciA9IGVudHJ5LT5tX3BhZ2VfaF9zY2FsZV9mYWN0b3I7ICovCiAgICAvKiBnX3BhZ2Vfdl9zY2FsZV9mYWN0b3IgPSBlbnRyeS0+bV9wYWdlX3Zfc2NhbGVfZmFjdG9yOyAqLwoKICAgIGdfcXNhdmVfc3RhY2sgPSBlbnRyeS0+bV9uZXh0X2VudHJ5OwoKICAgIGZyZWUoZW50cnkpOwogIH0KCiAgLyogaWYgbm8gbWFya3Mgb24gcGFnZSBzaW5jZSBsYXN0IHB1c2ggKGFuZCB0aHVzIHRoZXJlIHNob3VsZCBiZSBhIHN0YWNrKSAqLwogIGlmIChnX2luX2J1ZmZlcmluZ19tb2RlKQogIHsKCiAgICAvKiBwb3Agc3RhdGU6IGJlaGF2ZSBhcyBpZiB0aGUgcS4uLlEgbmV2ZXIgZXhpc3RlZCAqLwogICAgdF9xc2F2ZV9tYXJraW5nX2VudHJ5X3B0ciBlbnRyeSA9IGdfcXNhdmVfbWFya2luZ19zdGFjazsKCiAgICBBc3NlcnQoZW50cnkgIT0gTlVMTCwgbm9fZnBvcyk7CgogICAgZ19xc2F2ZV9tYXJraW5nX3N0YWNrID0gZW50cnktPm1fbmV4dF9lbnRyeTsJLyogbmV3IFRPUyAqLwogICAgZ19idWZmZXJfcG9zICAgPSBlbnRyeS0+bV9idWZmZXJfcG9zOwogICAgZ19idWZmZXJbZ19idWZmZXJfcG9zXSA9ICdcMCc7CS8qIGNob3Agb2ZmIHVud2FudGVkIHRleHQgKi8KCiAgICBmcmVlKGVudHJ5KTsKICB9CiAgZWxzZQogIHsKICAgIEFzc2VydChnX3FzYXZlX21hcmtpbmdfc3RhY2sgPT0gTlVMTCwgbm9fZnBvcyk7CiAgICBQREZQYWdlX1dyaXRlKGluX2ZwLCAiXG5RXG4iKTsKICB9Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFBERkZvbnRfU2V0KEZJTEUqIGluX2ZwLCBGVUxMX0xFTkdUSCBpbl9mb250X3NpemUsICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICBGVUxMX0NIQVIqIGluX2ZvbnRfbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFNldHMgdGhlIGZvbnQgbmFtZSBhbmQgc2l6ZSBmb3Igc3Vic2VxdWVudCB0ZXh0IHdyaXRlIHN0YXRlbWVudHMuICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgUERGRm9udF9TZXQoRklMRSogaW5fZnAsIEZVTExfTEVOR1RIIGluX2ZvbnRfc2l6ZSwKICBGVUxMX0NIQVIgKmluX3Nob3J0X2ZvbnRfbmFtZSkKewogIHRfdGVtcGJ1ZiBzdHI7CgogIHRfZm9udF9saXN0X2VudHJ5X3B0ciBlbnRyeSA9IFBERkZvbnRfRmluZExpc3RFbnRyeV9TaG9ydChpbl9zaG9ydF9mb250X25hbWUpOwogIGlmKCBlbnRyeSA9PSBOVUxMICkKICB7CiAgICBFcnJvcig0OCwgNDIsICJjYW5ub3QgZmluZCBmb250IGVudHJ5IGZvciBuYW1lICVzIiwgRkFUQUwsIG5vX2Zwb3MsCiAgICAgIGluX3Nob3J0X2ZvbnRfbmFtZSk7CiAgfQogIC8qIEFzc2VydChlbnRyeSAhPSBOVUxMLCBub19mcG9zKTsgKi8KI2lmZGVmIFVTRV9NQVRSSUNFUwogIHNwcmludGYoc3RyLCAiJXMgJXUgVGZcbiIsIGVudHJ5LT5tX1BERl9mb250X25hbWUsCiAgICAoaW50KSAoZ19wYWdlX3Zfc2NhbGVfZmFjdG9yICogaW5fZm9udF9zaXplKSk7CiNlbHNlCiAgc3ByaW50ZihzdHIsICIlcyAldSBUZlxuIiwgZW50cnktPm1fUERGX2ZvbnRfbmFtZSwgaW5fZm9udF9zaXplKTsKICAvKiBnX3RleHRfZm9udF9zaXplX2luX2VtcyA9IGdfcGFnZV92X3NjYWxlX2ZhY3RvciAqIGluX2ZvbnRfc2l6ZTsgKi8KI2VuZGlmCgojaWYgMQoKICAvKiBmb250IGNoYW5nZXMgY2FuIG9jY3VyIHdpdGhpbiBCVC4uLkVUIGJsb2Nrcywgc28gdGVtcG9yYXJpbHkgdHVybiBvZmYgICAqLwogIC8qIGdfRVRfcGVuZGluZy4gSSBkbyBpdCB0aGlzIHdheSBzbyB0aGF0IHRoZSBxc2F2ZV9tYXJraW5nX3N0YWNrICAgICAgICAgICovCiAgLyogb3B0aW1pc2F0aW9uIGNhbiBzdGlsbCBiZSBhcHBsaWVkICh0aGlzIGF2b2lkcyBvdXRwdXQgc3VjaCBhcyAgICAgICAgICAgKi8KICAvKiAiL0YwIDI0MCBUZiAvRjAgMjQwIFRmIC9GMSA2MDAgVGYiIGFuZCBpbnN0ZWFkIHByb2R1Y2VzICIiKSAgICAgICAgICAgICAqLwogIGlmIChnX1RKX3BlbmRpbmcpCiAgewogICAgZ19USl9wZW5kaW5nID0gRkFMU0U7CQkvKiBjbGVhciBpdCAqLwogICAgUERGUGFnZV9Xcml0ZVN0cmVhbShpbl9mcCwgIildVEpcbiIpOwogIH0KCiAgewogICAgQk9PTEVBTiBjdXJfRVRfcGVuZGluZyA9IGdfRVRfcGVuZGluZzsKCiAgICBnX0VUX3BlbmRpbmcgPSBGQUxTRTsJCS8qIGNsZWFyIGl0ICovCiAgICBQREZQYWdlX1dyaXRlKGluX2ZwLCBzdHIpOwogICAgZ19FVF9wZW5kaW5nID0gY3VyX0VUX3BlbmRpbmc7CS8qIHJlc3RvcmUgaXQgKi8KICB9CiNlbHNlCiAgLyogZm9udCBjaGFuZ2VzIGNhbiBvY2N1ciB3aXRoaW4gQlQuLi5FVCBibG9ja3MsIHNvIGJ5cGFzcyBQREZQYWdlX1dyaXRlKCkgKi8KICBQREZQYWdlX1dyaXRlU3RyZWFtKGluX2ZwLCBzdHIpOwojZW5kaWYKICBlbnRyeS0+bV9pbl91c2UgPSBUUlVFOwogIGdfcGFnZV91c2VzX2ZvbnRzID0gVFJVRTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCBQREZUZXh0X1JNb3ZlKEZJTEUqIGluX2ZwLCBpbnQgaGRlbHRhLCBpbnQgdmRlbHRhKSAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIE9mZnNldHMgdGV4dCBwZW4gYnkgdGhlIGdpdmVuIG9mZnNldHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qICoqKgp2b2lkIFBERlRleHRfUk1vdmUoRklMRSogaW5fZnAsIGludCBoZGVsdGEsIGludCB2ZGVsdGEpCnsKICB0X3RlbXBidWYgc3RyOwoKICBnX3R4X2hwb3MgKz0gaGRlbHRhOwogIGdfdHhfdnBvcyArPSB2ZGVsdGE7CiNpZiAxCiAgc3ByaW50ZihzdHIsICJFVFxuMSAwIDAgMSAlZCAlZCBjbVxuQlRcbiIsIGhkZWx0YSwgdmRlbHRhKTsKI2Vsc2UKICBzcHJpbnRmKHN0ciwgIjEgMCAwIDEgJWQgJWQgVG1cbiIsIGdfdHhfaHBvcywgZ190eF92cG9zKTsKI2VuZGlmCiAgUERGUGFnZV9Xcml0ZShpbl9mcCwgc3RyKTsKfQoqKiogKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgUERGVGV4dF9Nb3ZlVG8oRklMRSogaW5fZnAsIGludCBocG9zLCBpbnQgdnBvcykgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBNb3ZlIHRleHQgcGVuIHRvIHRoZSBnaXZlbiBjb29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgovKiAqKioKc3RhdGljIHZvaWQgUERGVGV4dF9Nb3ZlVG8oRklMRSogaW5fZnAsIGludCBocG9zLCBpbnQgdnBvcykKewogIGdfdHhfaHBvcyA9IDA7CiAgZ190eF92cG9zID0gMDsKI2lmIDEKICBQREZUZXh0X1JNb3ZlKGluX2ZwLCBocG9zLCB2cG9zKTsKI2Vsc2UKICB7CiAgICB0X3RlbXBidWYgc3RyOwogICAgc3ByaW50ZihzdHIsICIxIDAgMCAxICVkICVkIFRtXG4iLCBocG9zLCB2cG9zKTsKICAgIFBERlBhZ2VfV3JpdGUoaW5fZnAsIHN0cik7CiAgfQojZW5kaWYKfQoqKiogKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgUERGVGV4dF9PcGVuU3RyaW5nKEZJTEUqIGluX2ZwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBPcGVuIFRKIGJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBQREZUZXh0X09wZW5TdHJpbmcoRklMRSogaW5fZnApCnsKICBpZiAoZ19USl9wZW5kaW5nKQogICAgZ19USl9wZW5kaW5nID0gRkFMU0U7CS8qIGNsZWFyIGl0ICovCiAgZWxzZQogICAgUERGUGFnZV9Xcml0ZShpbl9mcCwgIlsoIik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgUERGVGV4dF9Nb3ZlVG9YWUFuZE9wZW4oRklMRSogaW5fZnAsIGludCBocG9zLCBpbnQgdnBvcykgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIE1vdmUgdGV4dCBwZW4gdG8gdGhlIGdpdmVuIGNvb3Jkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkIFBERlRleHRfTW92ZVRvWFlBbmRPcGVuKEZJTEUqIGluX2ZwLCBpbnQgaHBvcywgaW50IHZwb3MpCnsKI2lmIDEKICB0X3RlbXBidWYgc3RyOwogIHNwcmludGYoc3RyLCAiMSAwIDAgMSAlZCAlZCBUbVxuIiwgaHBvcywgdnBvcyk7CiAgUERGUGFnZV9Xcml0ZShpbl9mcCwgc3RyKTsKI2Vsc2UKICBQREZUZXh0X01vdmVUbyhpbl9mcCwgaHBvcywgdnBvcyk7CiNlbmRpZgogIFBERlRleHRfT3BlblN0cmluZyhpbl9mcCk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgUERGVGV4dF9Nb3ZlVG9YQW5kT3BlbihGSUxFKiBpbl9mcCwgaW50IGhwb3MsIGludCB2cG9zKSAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBNb3ZlIHRleHQgcGVuIHRvIHRoZSBnaXZlbiBjb29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBQREZUZXh0X01vdmVUb1hBbmRPcGVuKEZJTEUqIGluX2ZwLCBpbnQgaHBvcykKewojaWYgMQogIHRfdGVtcGJ1ZiBzdHI7CiAgc3ByaW50ZihzdHIsICIlZCAwIFRkXG4iLCBocG9zKTsKICBQREZQYWdlX1dyaXRlKGluX2ZwLCBzdHIpOwojZWxzZQogIFBERlRleHRfTW92ZVRvKGluX2ZwLCBocG9zLCB2cG9zKTsKI2VuZGlmCiAgUERGVGV4dF9PcGVuU3RyaW5nKGluX2ZwKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCBQREZUZXh0X09wZW5CVChGSUxFKiBpbl9mcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIE9wZW5zIGEgdGV4dCBvYmplY3QgYXQgdGhlIGdpdmVuIGNvb3Jkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkIFBERlRleHRfT3BlbkJUKEZJTEUqIGluX2ZwKQp7CiAgUERGUGFnZV9GbHVzaEJ1ZmZlcihpbl9mcCk7CS8qIGFib3V0IHRvIG1hcmsgcGFnZTogZmx1c2ggYnVmZmVyZWQgUERGICAgICovCgogIGdfcGFnZV9oYXNfdGV4dCA9IFRSVUU7CgogIGlmIChnX1RKX3BlbmRpbmcpCiAgewogICAgZ19USl9wZW5kaW5nID0gRkFMU0U7CQkvKiBjbGVhciBpdCAqLwogICAgUERGUGFnZV9Xcml0ZVN0cmVhbShpbl9mcCwgIildVEpcbiIpOwogIH0KCiAgaWYgKGdfRVRfcGVuZGluZykKICAgIGdfRVRfcGVuZGluZyA9IEZBTFNFOwkJLyogY2xlYXIgaXQgKi8KICBlbHNlCiAgewogICAgUERGUGFnZV9Xcml0ZShpbl9mcCwgIkJUXG4iKTsKICAgIGdfdmFsaWRfdGV4dF9tYXRyaXggPSBUUlVFOwkJLyogVGQgaXMgYWxsb3dlZCAqLwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCBQREZUZXh0X09wZW5YWShGSUxFKiBpbl9mcCwgaW50IGhwb3MsIGludCB2cG9zKSAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIE9wZW5zIGEgdGV4dCBvYmplY3QgYXQgdGhlIGdpdmVuIGNvb3Jkcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgUERGVGV4dF9PcGVuWFkoRklMRSogaW5fZnAsIGludCBocG9zLCBpbnQgdnBvcykKewogIFBERlRleHRfT3BlbkJUKGluX2ZwKTsKICBQREZUZXh0X01vdmVUb1hZQW5kT3Blbihpbl9mcCwgaHBvcywgdnBvcyk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgUERGVGV4dF9PcGVuWChGSUxFKiBpbl9mcCwgaW50IGhwb3MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBPcGVucyBhIHRleHQgb2JqZWN0IGF0IHRoZSBnaXZlbiBjb29yZHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkIFBERlRleHRfT3BlblgoRklMRSogaW5fZnAsIGludCBocG9zKQp7CiAgUERGVGV4dF9PcGVuQlQoaW5fZnApOwogIFBERlRleHRfTW92ZVRvWEFuZE9wZW4oaW5fZnAsIGhwb3MpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkIFBERlRleHRfT3BlbihGSUxFKiBpbl9mcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgT3BlbnMgYSB0ZXh0IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBQREZUZXh0X09wZW4oRklMRSogaW5fZnApCnsKICBpZiAoZ19USl9wZW5kaW5nKQogIHsKICAgIGdfVEpfcGVuZGluZyA9IEZBTFNFOwkJLyogY2xlYXIgaXQgKi8KICAgIEFzc2VydChnX0VUX3BlbmRpbmcgPT0gVFJVRSwgbm9fZnBvcyk7CiAgICBnX0VUX3BlbmRpbmcgPSBGQUxTRTsJCS8qIGNsZWFyIGl0ICovCiAgfQogIGVsc2UKICB7CiAgICBQREZUZXh0X09wZW5CVChpbl9mcCk7CiAgICBQREZUZXh0X09wZW5TdHJpbmcoaW5fZnApOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCBQREZUZXh0X0tlcm4oRklMRSogaW5fZnAsIGludCBpbl9rZXJuKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIEFwcGx5IGtlcm5pbmcgdG8gYSB0ZXh0IHN0cmluZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBOb3RlOiBpbl9rZXJuIGlzIGluIDEvMTAwMCBvZiBmb250IHNpemUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkIFBERlRleHRfS2VybihGSUxFKiBpbl9mcCwgaW50IGluX2tlcm4pCnsKICB0X3RlbXBidWYgc3RyOwoKICAvKiBzcHJpbnRmKHN0ciwgIiklZCgiLCAtaW5fa2VybiAqIDEwMDAgLyBnX3RleHRfZm9udF9zaXplX2luX2Vtcyk7ICovCiAgc3ByaW50ZihzdHIsICIpJWQoIiwgLWluX2tlcm4pOwogIFBERlBhZ2VfV3JpdGUoaW5fZnAsIHN0cik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgUERGVGV4dF9DbG9zZShGSUxFKiBpbl9mcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBDbG9zZXMgYSBwcmV2aW91c2x5IG9wZW5lZCB0ZXh0IG9iamVjdC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkIFBERlRleHRfQ2xvc2UoRklMRSogaW5fZnApCnsKICAvKiBQREZQYWdlX0JlZ2luKGluX2ZwKTsgLSBzaG91bGRuJ3QgYmUgbmVlZGVkICovCiAgQXNzZXJ0KGdfcGFnZV9jb250ZW50c19vYmpfbnVtICE9IDAsIG5vX2Zwb3MpOwoKICBnX1RKX3BlbmRpbmcgPSBUUlVFOwogIC8qIFBERlBhZ2VfV3JpdGUoaW5fZnAsICIpXSBUSlxuIik7ICovCiAgZ19FVF9wZW5kaW5nID0gVFJVRTsKfQoKCiNpZmRlZiBVU0VfTUFUUklDRVMKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCBQREZfTWF0cml4X1hZKGRvdWJsZSogaW5fb3V0X3gsIGRvdWJsZSogaW5fb3V0X3kpICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFJldHVybnMgKHgsIHkpIGFmdGVyIGFwcGx5aW5nIHRoZSBjdXJyZW50IG1hdHJpeDogICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgYSBiIDAgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFsgeCB5IDEgXSAgICAgICB4ICAgICAgIFsgYyBkIDAgXSAgICAgICA9ICAgICAgIFsgYXgrY3krZSAgYngrZHkrZiAgMSBdICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIGUgZiAxIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQgUERGX01hdHJpeF9YWShkb3VibGUqIGluX291dF94LCBkb3VibGUqIGluX291dF95KQp7CiAgZG91YmxlIHJlc3VsdF94LCByZXN1bHRfeTsKCiAgcmVzdWx0X3ggPSBnX2N1cl9tYXRyaXhbMF0gKiAqaW5fb3V0X3ggKyBnX2N1cl9tYXRyaXhbM10gKiAqaW5fb3V0X3kgKwogICAgZ19jdXJfbWF0cml4WzZdOwogIHJlc3VsdF95ID0gZ19jdXJfbWF0cml4WzFdICogKmluX291dF94ICsgZ19jdXJfbWF0cml4WzRdICogKmluX291dF95ICsKICAgIGdfY3VyX21hdHJpeFs3XTsKICAqaW5fb3V0X3ggPSByZXN1bHRfeDsKICAqaW5fb3V0X3kgPSByZXN1bHRfeTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUERGX01hdHJpeF9NdWwodF9tYXRyaXggaW5fbGVmdCwgdF9tYXRyaXggaW5fcmlnaHQsIHRfbWF0cml4IG91dF9yZXN1bHQpICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIE11bHRpcGxpZXMgdGhlIGdpdmVuIG1hdHJpY2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBbIGEgYiAwIF0gICAgICAgICAgICAgICBbIGcgaCAwIF0gICAgICAgICAgICAgICBbIGFnK2JpICAgYWgrYmogICAwIF0gICAgKi8KLyogIFsgYyBkIDAgXSAgICAgICB4ICAgICAgIFsgaSBqIDAgXSAgICAgICA9ICAgICAgIFsgY2crZGkgICBjaCtkaiAgIDAgXSAgICAqLwovKiAgWyBlIGYgMSBdICAgICAgICAgICAgICAgWyBrIGwgMSBdICAgICAgICAgICAgICAgWyBlZytmaStrIGVoK2ZqK2wgMSBdICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHZvaWQgUERGX01hdHJpeF9NdWwodF9tYXRyaXggaW5fbGVmdCwgdF9tYXRyaXggaW5fcmlnaHQsCiAgdF9tYXRyaXggb3V0X3Jlc3VsdCkKewogIHRfbWF0cml4IHJlc3VsdDsKICByZXN1bHRbMF0gPSBpbl9sZWZ0WzBdICogaW5fcmlnaHRbMF0gKyBpbl9sZWZ0WzFdICogaW5fcmlnaHRbM107CiAgcmVzdWx0WzFdID0gaW5fbGVmdFswXSAqIGluX3JpZ2h0WzFdICsgaW5fbGVmdFsxXSAqIGluX3JpZ2h0WzRdOwogIHJlc3VsdFsyXSA9IDA7CiAgcmVzdWx0WzNdID0gaW5fbGVmdFszXSAqIGluX3JpZ2h0WzBdICsgaW5fbGVmdFs0XSAqIGluX3JpZ2h0WzNdOwogIHJlc3VsdFs0XSA9IGluX2xlZnRbM10gKiBpbl9yaWdodFsxXSArIGluX2xlZnRbNF0gKiBpbl9yaWdodFs0XTsKICByZXN1bHRbNV0gPSAwOwogIHJlc3VsdFs2XSA9IGluX2xlZnRbNl0gKiBpbl9yaWdodFswXSArIGluX2xlZnRbN10gKiBpbl9yaWdodFszXSArIGluX3JpZ2h0WzZdOwogIHJlc3VsdFs3XSA9IGluX2xlZnRbNl0gKiBpbl9yaWdodFsxXSArIGluX2xlZnRbN10gKiBpbl9yaWdodFs0XSArIGluX3JpZ2h0WzddOwogIHJlc3VsdFs4XSA9IDE7CgogIG1lbWNweShvdXRfcmVzdWx0LCByZXN1bHQsIHNpemVvZih0X21hdHJpeCkpOwp9CiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCAgUERGUGFnZV9TY2FsZShmbG9hdCBpbl9oX3NjYWxlX2ZhY3RvciwgZmxvYXQgaW5fdl9zY2FsZV9mYWN0b3IpICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIENoYW5nZXMgQ1RNIGJ5IHNjYWxlIGZhY3RvcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBbICBzaCAgIDAgIDAgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFsgICAwICBzdiAgMCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgWyAgIDAgICAwICAxIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBQREZQYWdlX1NjYWxlKEZJTEUqIGluX2ZwLCBmbG9hdCBpbl9oX3NjYWxlX2ZhY3RvciwgZmxvYXQgaW5fdl9zY2FsZV9mYWN0b3IpCnsKI2lmZGVmIFVTRV9NQVRSSUNFUwogIHRfbWF0cml4IG0gPSB7IDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDEgfTsKICBtWzBdID0gaW5faF9zY2FsZV9mYWN0b3I7CiAgbVs0XSA9IGluX3Zfc2NhbGVfZmFjdG9yOwoKICBQREZfTWF0cml4X011bChtLCBnX2N1cl9tYXRyaXgsIGdfY3VyX21hdHJpeCk7CiNlbHNlCiAgdF90ZW1wYnVmIHN0cjsKCiAgc3ByaW50ZihzdHIsICIlLjJmIDAgMCAlLjJmIDAgMCBjbVxuIiwgaW5faF9zY2FsZV9mYWN0b3IsIGluX3Zfc2NhbGVfZmFjdG9yKTsKICBQREZQYWdlX1dyaXRlKGluX2ZwLCBzdHIpOwojZW5kaWYKICBnX3BhZ2VfaF9zY2FsZV9mYWN0b3IgKj0gaW5faF9zY2FsZV9mYWN0b3I7CiAgZ19wYWdlX3Zfc2NhbGVfZmFjdG9yICo9IGluX3Zfc2NhbGVfZmFjdG9yOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkICBQREZQYWdlX1JvdGF0ZShGSUxFKiBpbl9mcCwgZmxvYXQgaW5fYW5nbGVfaW5fcmFkaWFucykgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgQ2hhbmdlcyBDVE0gYnkgcm90YXRpb24gZmFjdG9yLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFsgIGNvcyBhICBzaW4gYSAgMCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgWyAtc2luIGEgIGNvcyBhICAwIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBbICAgMCAgICAgICAwICAgIDEgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgp2b2lkIFBERlBhZ2VfUm90YXRlKEZJTEUqIGluX2ZwLCBmbG9hdCBpbl9hbmdsZV9pbl9yYWRpYW5zKQp7CiAgZmxvYXQgY29zX3JhZGlhbnMgPSBjb3MoaW5fYW5nbGVfaW5fcmFkaWFucyk7CiAgZmxvYXQgc2luX3JhZGlhbnMgPSBzaW4oaW5fYW5nbGVfaW5fcmFkaWFucyk7CiNpZmRlZiBVU0VfTUFUUklDRVMKICB0X21hdHJpeCBtID0geyAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAxIH07CiAgbVswXSA9IG1bNF0gPSBjb3NfcmFkaWFuczsKICBtWzFdID0gc2luX3JhZGlhbnM7CiAgbVszXSA9IC1zaW5fcmFkaWFuczsKICBQREZfTWF0cml4X011bChtLCBnX2N1cl9tYXRyaXgsIGdfY3VyX21hdHJpeCk7CiNlbHNlCiAgdF90ZW1wYnVmIHN0cjsKCiAgc3ByaW50ZihzdHIsICIlLjJmICUuMmYgJS4yZiAlLjJmIDAgMCBjbVxuIiwgY29zX3JhZGlhbnMsIHNpbl9yYWRpYW5zLAogICAgLXNpbl9yYWRpYW5zLCBjb3NfcmFkaWFucyk7CiAgUERGUGFnZV9Xcml0ZShpbl9mcCwgc3RyKTsKI2VuZGlmCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgIFBERlBhZ2VfVHJhbnNsYXRlKEZJTEUqIGluX2ZwLCBmbG9hdCBpbl9kZWx0YV9oLCBmbG9hdCBpbl9kZWx0YV92KSAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBDaGFuZ2VzIENUTSBieSB0cmFuc2xhdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgWyAgMSAgMCAgMCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBbICAwICAxICAwIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFsgIGRoIGR2IDEgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgUERGUGFnZV9UcmFuc2xhdGUoRklMRSogaW5fZnAsIGZsb2F0IGluX2RlbHRhX2gsIGZsb2F0IGluX2RlbHRhX3YpCnsKI2lmZGVmIFVTRV9NQVRSSUNFUwogIHRfbWF0cml4IG0gPSB7IDEsIDAsIDAsIDAsIDEsIDAsIDAsIDAsIDEgfTsKICBtWzZdID0gaW5fZGVsdGFfaDsKICBtWzddID0gaW5fZGVsdGFfdjsKICBQREZfTWF0cml4X011bChtLCBnX2N1cl9tYXRyaXgsIGdfY3VyX21hdHJpeCk7CiNlbHNlCiAgdF90ZW1wYnVmIHN0cjsKCiAgc3ByaW50ZihzdHIsICIxIDAgMCAxICUuMmYgJS4yZiBjbVxuIiwgaW5fZGVsdGFfaCwgaW5fZGVsdGFfdik7CiAgUERGUGFnZV9Xcml0ZShpbl9mcCwgc3RyKTsKI2VuZGlmCiAgZ19wYWdlX2hfb3JpZ2luICs9IGluX2RlbHRhX2g7CiAgZ19wYWdlX3Zfb3JpZ2luICs9IGluX2RlbHRhX3Y7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgUERGVGFyZ2V0QW5ub3RfTmV3KEZVTExfQ0hBUiogaW5fYW5ub3RfbmFtZSwgLi4uKSAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBDcmVhdGUgYSBuZXcgdGFyZ2V0IGFubm90YXRpb24gZW50cnkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBQREZUYXJnZXRBbm5vdF9OZXcoRlVMTF9DSEFSKiBpbl9hbm5vdF9uYW1lLAogIHVuc2lnbmVkIGludCBpbl9hbm5vdF9uYW1lX2xlbmd0aCwgaW50IGluX2xsX3gsIGludCBpbl9sbF95LCBpbnQgaW5fdXJfeCwKICBpbnQgaW5fdXJfeSwgQk9PTEVBTiBpbl9mb3JfZXhwb3J0KQp7CiAgdF90YXJnZXRfYW5ub3RfZW50cnlfcHRyIGVudHJ5ID0KICAgICh0X3RhcmdldF9hbm5vdF9lbnRyeV9wdHIpIG1hbGxvYyhzaXplb2YodF90YXJnZXRfYW5ub3RfZW50cnkpKTsKCiAgaWYgKGVudHJ5ID09IE5VTEwpCiAgICBFcnJvcig0OCwgMTYsICJQREZUYXJnZXRBbm5vdF9OZXc6IHJ1biBvdXQgb2YgbWVtb3J5IiwgRkFUQUwsIG5vX2Zwb3MpOwoKICBlbnRyeS0+bV9uYW1lID0gKEZVTExfQ0hBUiopIG1hbGxvYyhpbl9hbm5vdF9uYW1lX2xlbmd0aCArIDEpOwogIGlmIChlbnRyeS0+bV9uYW1lID09IE5VTEwpCiAgICBFcnJvcig0OCwgMTcsICJQREZUYXJnZXRBbm5vdF9OZXc6IHJ1biBvdXQgb2YgbWVtb3J5IiwgRkFUQUwsIG5vX2Zwb3MpOwogIG1lbWNweShlbnRyeS0+bV9uYW1lLCBpbl9hbm5vdF9uYW1lLCBpbl9hbm5vdF9uYW1lX2xlbmd0aCk7CiAgZW50cnktPm1fbmFtZVtpbl9hbm5vdF9uYW1lX2xlbmd0aF0gPSAnXDAnOwoKICBBc3NlcnQoZ19wYWdlX2NvbnRlbnRzX29ial9udW0gIT0gMCwgbm9fZnBvcyk7CiAgZW50cnktPm1fcGFnZV9vYmplY3RfbnVtID0gZ19wYWdlX29iamVjdF9udW07CgogIGVudHJ5LT5tX2xsX3ggPSBpbl9sbF94OwogIGVudHJ5LT5tX2xsX3kgPSBpbl9sbF95OwogIGVudHJ5LT5tX3VyX3ggPSBpbl91cl94OwogIGVudHJ5LT5tX3VyX3kgPSBpbl91cl95OwogIGVudHJ5LT5tX2Zvcl9leHBvcnQgPSBpbl9mb3JfZXhwb3J0OwoKICBlbnRyeS0+bV9uZXh0X2VudHJ5ID0gZ190YXJnZXRfYW5ub3RfbGlzdDsKICBnX3RhcmdldF9hbm5vdF9saXN0ID0gZW50cnk7CgogIGlmIChpbl9mb3JfZXhwb3J0KQogICAgZ19oYXNfZXhwb3J0ZWRfdGFyZ2V0cyA9IGluX2Zvcl9leHBvcnQ7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHRfdGFyZ2V0X2Fubm90X2VudHJ5X3B0ciBQREZUYXJnZXRBbm5vdF9GaW5kKEZVTExfQ0hBUiogaW5fYW5ub3RfbmFtZSkgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBGaW5kcyBhbiBhbm5vdGF0aW9uLiBSZXR1cm5zIE5VTEwgaWYgbm90IGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdF90YXJnZXRfYW5ub3RfZW50cnlfcHRyIFBERlRhcmdldEFubm90X0ZpbmQoRlVMTF9DSEFSKiBpbl9hbm5vdF9uYW1lKQp7CiAgdF90YXJnZXRfYW5ub3RfZW50cnlfcHRyIGVudHJ5ID0gZ190YXJnZXRfYW5ub3RfbGlzdDsKCiAgLyogdGhpcyB0YWtlcyBPKG4pIHRpbWU7IG1heSBuZWVkIHJlLWltcGxlbWVudGluZyBpZiBzcGVlZCBpcyBhIGZhY3RvciAqLwogIHdoaWxlIChlbnRyeSAhPSBOVUxMKQogIHsKICAgIGlmIChzdHJjbXAoKGNoYXIqKSBpbl9hbm5vdF9uYW1lLCAoY2hhciopIGVudHJ5LT5tX25hbWUpID09IDApCiAgICAgIGJyZWFrOwogICAgZW50cnkgPSBlbnRyeS0+bV9uZXh0X2VudHJ5OwogIH0KCiAgcmV0dXJuIGVudHJ5Owp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBQREZTb3VyY2VBbm5vdF9Xcml0ZShGSUxFKiBpbl9mcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgdF9zb3VyY2VfYW5ub3RfZW50cnlfcHRyIGluX3NvdXJjZV9lbnRyeSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBXcml0ZSBhbiBhbm5vdCB3aGljaCBzcGVjaWZpZXMgdGhlIHNvdXJjZSBhbmQgdGFyZ2V0IG9mIHRoZSBsaW5rLiAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdm9pZCBQREZTb3VyY2VBbm5vdF9Xcml0ZShGSUxFKiBpbl9mcCwgdF9zb3VyY2VfYW5ub3RfZW50cnlfcHRyIGluX2VudHJ5KQp7CiAgdF90YXJnZXRfYW5ub3RfZW50cnlfcHRyIHRhcmdldDsKCiAgQXNzZXJ0KGluX2VudHJ5ICE9IE5VTEwsIG5vX2Zwb3MpOwoKICB0YXJnZXQgPSBpbl9lbnRyeS0+bV90YXJnZXQ7CgogIC8qIGlmIGl0IGlzIGFuIHVucmVzb2x2ZWQgZm9yd2FyZCBsaW5rIHRoZW4gZXhpdCAqLwogIGlmICggKGluX2VudHJ5LT5tX2xpbmtfdHlwZSA9PSBrX2xpbmtfc291cmNlKSAmJiAodGFyZ2V0ID09IE5VTEwpICkKICAgIHJldHVybjsKCiAgLyogZ3JlZW4gbGlnaHQ6IHdyaXRlIGl0IG91dCAqLwogIGlmIChnX1BERl9kZWJ1ZykKICB7CiAgICBmcHJpbnRmKGluX2ZwLCAiJSVcbiUlIGFubm90YXRpb24gaW4gcGFnZSBvYmplY3QgIyAldSB0byAlczpcbiUlXG4iLAogICAgICBpbl9lbnRyeS0+bV90aGlzX3BhZ2Vfb2JqZWN0X251bSwgaW5fZW50cnktPm1fdGFyZ2V0LT5tX25hbWUpOwogIH0KCiAgUERGT2JqZWN0X1dyaXRlT2JqKGluX2ZwLCBpbl9lbnRyeS0+bV90aGlzX29iamVjdF9udW0pOwogIGZwcmludGYoaW5fZnAsICI8PFxuL1R5cGUgL0Fubm90XG4vU3VidHlwZSAvTGlua1xuIgogICAgLyogdGhpcyBpcyB3aGF0IEFkb2JlIGRvZXMgKGl0J3MgYWxzbyBtb3JlIGZsZXhpYmxlKSAqLwogICAgIi9SZWN0IFsgJWQgJWQgJWQgJWQgXVxuL0JvcmRlciBbIDAgMCAwIF1cbiIsCiAgICAvKiAiL0JTIDw8IC9UeXBlIC9Cb3JkZXIgL1MgL1UgPj5cbiIgKi8KICAgIC8qIGJvcmRlciBhcHBlYXJhbmNlIGlzICJ1bmRlcmxpbmUiICovCiAgICBpbl9lbnRyeS0+bV9sbF94LCBpbl9lbnRyeS0+bV9sbF95LCBpbl9lbnRyeS0+bV91cl94LCBpbl9lbnRyeS0+bV91cl95KTsKCiAgc3dpdGNoIChpbl9lbnRyeS0+bV9saW5rX3R5cGUpCiAgewogICAgY2FzZSBrX2xpbmtfc291cmNlOgoKICAgICAgZnByaW50Zihpbl9mcCwgIi9EZXN0IFsgIik7CiAgICAgIFBERk9iamVjdF9Xcml0ZVJlZihpbl9mcCwgaW5fZW50cnktPm1fdGFyZ2V0LT5tX3BhZ2Vfb2JqZWN0X251bSk7CiAgICAgIHN3aXRjaCAoaW5fZW50cnktPm1fZGVzdF9vcHRpb24pCiAgICAgIHsKCWNhc2Uga0ZpdE5vQ2hhbmdlOgoKCSAgZnByaW50Zihpbl9mcCwgIiAvWFlaIG51bGwgbnVsbCBudWxsIik7CgkgIC8qIE5CIE5PIEJSRUFLICovCgoJY2FzZSBrRml0OgoKCSAgZnByaW50Zihpbl9mcCwgIiAvRml0Iik7CgkgIGJyZWFrOwoKCgljYXNlIGtGaXRIOgoKCSAgLyogWyAvRml0SCB0b3AgXTogZml0IHRoZSB3aWR0aCBvZiB0aGUgcGFnZSB0byB0aGUgd2luZG93OyB0b3AgICAgKi8KCSAgLyogc3BlY2lmaWVzIHRoZSB5LWNvb3JkaW5hdGUgb2YgdGhlIHRvcCBlZGdlIG9mIHRoZSB3aW5kb3cgICAgICAgKi8KCSAgZnByaW50Zihpbl9mcCwgIiAvRml0SCAldSIsIHRhcmdldC0+bV91cl95KTsKCSAgYnJlYWs7CgoKCWNhc2Uga0ZpdFY6CgoJICAvKiBbIC9GaXRWIGxlZnQgXTogZml0IHRoZSBoZWlnaHQgb2YgdGhlIHBhZ2UgdG8gdGhlIHdpbmRvdzsgICAgICAqLwoJICAvKiBsZWZ0IHNwZWNpZmllcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIHdpbmRvdyAqLwoJICBmcHJpbnRmKGluX2ZwLCAiIC9GaXRWICV1IiwgdGFyZ2V0LT5tX2xsX3gpOwoJICBicmVhazsKCgoJY2FzZSBrRml0UjoKCgkgIC8qIFsgL0ZpdFIgbGVmdCBib3R0b20gcmlnaHQgdG9wIF06IGZpdCB0aGUgcmVjdGFuZ2xlIHNwZWNpZmllZCAgICovCgkgIC8qIGJ5IGxlZnQgYm90dG9tIHJpZ2h0IHRvcCBpbiB0aGUgd2luZG93LiBJZiB0aGUgaGVpZ2h0ICh0b3AgLSAgICovCgkgIC8qIGJvdHRvbSkgYW5kIHdpZHRoIChyaWdodCAtIGxlZnQpIGltcGx5IGRpZmZlcmVudCB6b29tIGZhY3RvcnMsICovCgkgIC8qIHRoZSBudW1lcmljYWxseSBzbWFsbGVyIHpvb20gZmFjdG9yIGlzIHVzZWQsIHRvIGVuc3VyZSB0aGF0ICAgICovCgkgIC8qIHRoZSBzcGVjaWZpZWQgcmVjdGFuZ2xlIGZpdHMgaW4gdGhlIHdpbmRvdyAgICAgICAgICAgICAgICAgICAgICovCgkgIGZwcmludGYoaW5fZnAsICIgL0ZpdFIgJXUgJXUgJXUgJXUiLCB0YXJnZXQtPm1fbGxfeCwgdGFyZ2V0LT5tX2xsX3ksCgkgICAgdGFyZ2V0LT5tX3VyX3gsIHRhcmdldC0+bV91cl95KTsKCSAgYnJlYWs7CgoKCWNhc2Uga0ZpdEI6CgoJICAvKiBbIC9GaXRCIF06IGZpdCB0aGUgcGFnZSdzIGJvdW5kaW5nIGJveCB0byB0aGUgd2luZG93ICAgICAgICAgICAqLwoJICBmcHJpbnRmKGluX2ZwLCAiIC9GaXRCIik7CgkgIGJyZWFrOwoKCgljYXNlIGtGaXRCSDoKCgkgIC8qIFsgL0ZpdEJIIHRvcCBdOiBmaXQgdGhlIHdpZHRoIG9mIHRoZSBwYWdlJ3MgYm91bmRpbmcgYm94IHRvICAgICovCgkgIC8qIHRoZSB3aW5kb3cuIHRvcCBzcGVjaWZpZXMgdGhlIHktY29vcmQgb2YgdG9wIGVkZ2Ugb2Ygd2luZG93ICAgICovCgkgIGZwcmludGYoaW5fZnAsICIgL0ZpdEJIICV1IiwgdGFyZ2V0LT5tX3VyX3kpOwoJICBicmVhazsKCgoJY2FzZSBrRml0QlY6CgoJICAvKiBbIC9GaXRCViBsZWZ0IF06IGZpdCB0aGUgaGVpZ2h0IG9mIHRoZSBwYWdlJyBib3VuZGluZyBib3ggdG8gICAqLwoJICAvKiB0aGUgd2luZG93LiBsZWZ0IHNwZWNpZmllcyB0aGUgeC1jb29yZGluYXRlIG9mIHRoZSBsZWZ0IGVkZ2UgICAqLwoJICAvKiBvZiB0aGUgd2luZG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJICBmcHJpbnRmKGluX2ZwLCAiIC9GaXRCViAldSIsIHRhcmdldC0+bV9sbF94KTsKCSAgYnJlYWs7CgoKCWRlZmF1bHQ6CgoJICBFcnJvcig0OCwgMTgsICJQREZTb3VyY2VBbm5vdF9Xcml0ZTogaW52YWxpZCBsaW5rIGRlc3Qgb3B0aW9uIiwKCSAgICBGQVRBTCwgbm9fZnBvcyk7CiAgICAgIH0KICAgICAgZnByaW50Zihpbl9mcCwgIiBdXG4iKTsKICAgICAgYnJlYWs7CgoKICAgIGNhc2Uga19saW5rX2V4dGVybmFsOgoKI2lmIDEJLyogcmVxdWlyZWQgd3JhcHBlciBmb3IgVVJMcyBpcyBub3cgaW4gdGhlIExvdXQgbGlicmFyaWVzICovCiAgICAgIGZwcmludGYoaW5fZnAsICIvQSA8PCAvVHlwZSAvQWN0aW9uIC9TIC9Hb1RvUiAvRCAoJXMpIC9GXG4iCgkvKiA8PSBzcGxpdCBhY3Jvc3MgbGluZXMgZm9yIExPTkcgZmlsZSBzcGVjcyAqLwoJIiglcykgPj5cbiIsIGluX2VudHJ5LT5tX25hbWUsIGluX2VudHJ5LT5tX2ZpbGVfc3BlYyk7CiNlbHNlCiAgICAgIGlmIChpbl9lbnRyeS0+bV9maWxlX3NwZWNbMF0gIT0gJzwnKQogICAgICB7CgkvKiBub3RlOiBkZXN0aW5hdGlvbi90YXJnZXQgaXMgc3BlY2lmaWVkIGFzIGEgc3RyaW5nLCBhcyBpcyBmaWxlIHNwZWMgKi8KCWZwcmludGYoaW5fZnAsICIvQSA8PCAvVHlwZSAvQWN0aW9uIC9TIC9Hb1RvUiAvRCAoJXMpIC9GXG4iCgkgIC8qIDw9IHNwbGl0IGFjcm9zcyBsaW5lcyBmb3IgTE9ORyBmaWxlIHNwZWNzICovCgkgICIoJXMpID4+XG4iLCBpbl9lbnRyeS0+bV9uYW1lLCBpbl9lbnRyeS0+bV9maWxlX3NwZWMpOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewogICAgICAgIC8qIGlmIGZpbGUgc3BlYyBzdGFydHMgd2l0aCAnPCcgdGhlbiBVUkwsIGVnIDxodHRwOi8vd3d3LmFkb2JlLmNvbT4gKi8KCUFzc2VydChpbl9lbnRyeS0+bV9maWxlX3NwZWNbc3RybGVuKChjaGFyKikgaW5fZW50cnktPm1fZmlsZV9zcGVjKS0xXQoJICA9PSAnPicsIG5vX2Zwb3MpOwoJZnByaW50Zihpbl9mcCwgIi9BIDw8IC9UeXBlIC9BY3Rpb24gL1MgL0dvVG9SIC9EICglcykgL0ZcbiIKCSAgLyogPD0gc3BsaXQgYWNyb3NzIGxpbmVzIGZvciBMT05HIGZpbGUgc3BlY3MgKi8KCSAgIjw8IC9GUyAvVVJMIC9GICglcykgPj4gPj5cbiIsIGluX2VudHJ5LT5tX25hbWUsIGluX2VudHJ5LT5tX2ZpbGVfc3BlYyk7CiAgICAgIH0KI2VuZGlmCiAgICAgIGJyZWFrOwoKCiAgICBjYXNlIGtfbGlua19VUkk6CgogICAgICBmcHJpbnRmKGluX2ZwLCAiL0EgPDwgL1R5cGUgL0FjdGlvbiAvUyAvVVJJIC9VUklcbiIKCS8qIDw9IHNwbGl0IGFjcm9zcyBsaW5lcyBmb3IgTE9ORyBVUkkncyAqLwoJIiglcykgPj5cbiIsIGluX2VudHJ5LT5tX25hbWUpOwogICAgICBicmVhazsKCgogICAgY2FzZSBrX2xpbmtfdGFyZ2V0OgogICAgY2FzZSBrX2xpbmtfdGFyZ2V0X2Zvcl9leHBvcnQ6CiAgICBjYXNlIGtOdW1iZXJPZkxpbmtLZXl3b3JkczoKCiAgICAgIGJyZWFrOwogIH0KCiAgZnByaW50Zihpbl9mcCwgIj4+XG5lbmRvYmpcbiIpOwogIGluX2VudHJ5LT5tX3dyaXR0ZW5fdG9fUERGX2ZpbGUgPSBUUlVFOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkIFBERlNvdXJjZUFubm90X05ldyhGVUxMX0NIQVIqIGluX2Fubm90X25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgQ3JlYXRlIGFuIGVudHJ5IGluIHRoZSBnX3NvdXJjZV9hbm5vdF9saXN0IHdoaWNoIGxpbmtzIHRvIGluX2Fubm90X25hbWUuICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKc3RhdGljIHRfc291cmNlX2Fubm90X2VudHJ5X3B0cgpQREZTb3VyY2VBbm5vdF9OZXcoUERGX0xJTktfS0VZV09SRCBpbl9saW5rX3R5cGUsIEZVTExfQ0hBUiogaW5fYW5ub3RfbmFtZSwKICB1bnNpZ25lZCBpbnQgaW5fYW5ub3RfbmFtZV9sZW5ndGgsIGludCBpbl9sbF94LCBpbnQgaW5fbGxfeSwgaW50IGluX3VyX3gsCiAgaW50IGluX3VyX3ksIFBERl9MSU5LX0RFU1RfT1BUSU9OIGluX2xpbmtfZGVzdF9vcHRpb24pCnsKICB0X3RhcmdldF9hbm5vdF9lbnRyeV9wdHIgdGFyZ2V0ID0gTlVMTDsKICB0X3NvdXJjZV9hbm5vdF9lbnRyeV9wdHIgZW50cnkgPQogICAgKHRfc291cmNlX2Fubm90X2VudHJ5X3B0cikgbWFsbG9jKHNpemVvZih0X3NvdXJjZV9hbm5vdF9lbnRyeSkpOwoKICBpZiAoZW50cnkgPT0gTlVMTCkKICAgIEVycm9yKDQ4LCAxOSwgIlBERlNvdXJjZUFubm90X05ldzogcnVuIG91dCBvZiBtZW1vcnkiLCBGQVRBTCwgbm9fZnBvcyk7CgogIGVudHJ5LT5tX2xsX3ggPSBpbl9sbF94OwogIGVudHJ5LT5tX2xsX3kgPSBpbl9sbF95OwogIGVudHJ5LT5tX3VyX3ggPSBpbl91cl94OwogIGVudHJ5LT5tX3VyX3kgPSBpbl91cl95OwoKICBlbnRyeS0+bV90aGlzX29iamVjdF9udW0gPSBQREZPYmplY3RfTmV3KC8qIGluX2ZwICovKTsKICBlbnRyeS0+bV90aGlzX3BhZ2Vfb2JqZWN0X251bSA9IGdfcGFnZV9vYmplY3RfbnVtOwogIGVudHJ5LT5tX2xpbmtfdHlwZSA9IGluX2xpbmtfdHlwZTsKICBBc3NlcnQoKGluX2xpbmtfZGVzdF9vcHRpb24gPj0ga0ZpdE5vQ2hhbmdlKSAmJgogICAgKGluX2xpbmtfZGVzdF9vcHRpb24gPD0ga0ZpdEJWKSwgbm9fZnBvcyk7CiAgZW50cnktPm1fZGVzdF9vcHRpb24gPSBpbl9saW5rX2Rlc3Rfb3B0aW9uOwogIGVudHJ5LT5tX2ZpbGVfc3BlYyA9IE5VTEw7CiAgZW50cnktPm1fd3JpdHRlbl90b19QREZfZmlsZSA9IEZBTFNFOwoKICBpZiAoaW5fbGlua190eXBlID09IGtfbGlua19zb3VyY2UpCiAgICB0YXJnZXQgPSBQREZUYXJnZXRBbm5vdF9GaW5kKGluX2Fubm90X25hbWUpOwoKICBpZiAodGFyZ2V0ICE9IE5VTEwpCiAgewogICAgZW50cnktPm1fdGFyZ2V0ID0gdGFyZ2V0OwogICAgZW50cnktPm1fbmFtZSA9IE5VTEw7CiAgfQogIGVsc2UKICB7CiAgICBlbnRyeS0+bV90YXJnZXQgPSBOVUxMOwkvKiBmd2QgbGluayAqLwogICAgZW50cnktPm1fbmFtZSA9IChGVUxMX0NIQVIqKSBtYWxsb2MoaW5fYW5ub3RfbmFtZV9sZW5ndGggKyAxKTsKICAgIGlmIChlbnRyeS0+bV9uYW1lID09IE5VTEwpCiAgICAgIEVycm9yKDQ4LCAyMCwgIlBERlNvdXJjZUFubm90X05ldzogcnVuIG91dCBvZiBtZW1vcnkiLCBGQVRBTCwgbm9fZnBvcyk7CiAgICBtZW1jcHkoZW50cnktPm1fbmFtZSwgaW5fYW5ub3RfbmFtZSwgaW5fYW5ub3RfbmFtZV9sZW5ndGgpOwogICAgZW50cnktPm1fbmFtZVtpbl9hbm5vdF9uYW1lX2xlbmd0aF0gPSAnXDAnOwogIH0KCiAgZW50cnktPm1fbmV4dF9lbnRyeSA9IGdfc291cmNlX2Fubm90X2xpc3Q7CiAgZ19zb3VyY2VfYW5ub3RfbGlzdCA9IGVudHJ5OwoKICByZXR1cm4gZW50cnk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFBERlNvdXJjZUFubm90X0Rpc3Bvc2UodF9zb3VyY2VfYW5ub3RfZW50cnlfcHRyIGluX3NvdXJjZV9hbm5vdCkgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBEaXNwb3NlIG9mIGEgc291cmNlIGFubm90IGVudHJ5OyByZXR1cm5zIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBsaXN0LiAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgdF9zb3VyY2VfYW5ub3RfZW50cnlfcHRyCiAgUERGU291cmNlQW5ub3RfRGlzcG9zZSh0X3NvdXJjZV9hbm5vdF9lbnRyeV9wdHIgaW5fc291cmNlX2Fubm90KQp7CiAgdF9zb3VyY2VfYW5ub3RfZW50cnlfcHRyIG5leHRfZW50cnkgPSBpbl9zb3VyY2VfYW5ub3QtPm1fbmV4dF9lbnRyeTsKCiAgaWYgKGluX3NvdXJjZV9hbm5vdC0+bV9uYW1lICE9IE5VTEwpCiAgICBmcmVlKGluX3NvdXJjZV9hbm5vdC0+bV9uYW1lKTsKICBpZiAoaW5fc291cmNlX2Fubm90LT5tX2ZpbGVfc3BlYyAhPSBOVUxMKQogICAgZnJlZShpbl9zb3VyY2VfYW5ub3QtPm1fZmlsZV9zcGVjKTsKICBmcmVlKGluX3NvdXJjZV9hbm5vdCk7CiAgcmV0dXJuIG5leHRfZW50cnk7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIGZsb2F0ICBQREZQYWdlX0dldEZsb2F0KEZVTExfQ0hBUiogaW5fc3RyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBPdXRwdXRzIGFuIGFwcHJvcHJpYXRlIFBERiBzdHJpbmcgZm9yIGRyYXdpbmcgYSBncmFwaGljIGVsZW1lbnQuICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgRlVMTF9DSEFSICpQREZQYWdlX0dldEZsb2F0KEZVTExfQ0hBUiogaW5fc3RyLCBmbG9hdCogb3V0X3ZhbHVlKQp7CiAgaWYgKHNzY2FuZigoY2hhciopIGluX3N0ciwgIiVmIiwgb3V0X3ZhbHVlKSA9PSAxKQogIHsKICAgIC8qIHNraXAgKHByZXN1bWVkKSBmbG9hdGluZyBwb2ludCBudW1iZXI6IFsgXSpbK3wtXVswLTkuXSogKi8KICAgIHdoaWxlIChpc3NwYWNlKCppbl9zdHIpKQogICAgICBpbl9zdHIrKzsKICAgIGlmICggKCppbl9zdHIgPT0gJy0nKSB8fCAoKmluX3N0ciA9PSAnKycpICkKICAgICAgaW5fc3RyKys7CiAgICB3aGlsZSAoaXNkaWdpdCgqaW5fc3RyKSB8fCAoKmluX3N0ciA9PSAnLicpKQogICAgICBpbl9zdHIrKzsKICB9CiAgZWxzZSBFcnJvcig0OCwgMjEsICJQREZQYWdlX0dldEZsb2F0OiB1bmFibGUgdG8gZXZhbHVhdGUgbnVtYmVyIGZvciBMb3V0IGdyYXBoaWMga2V5d29yZCBwcm9jZXNzaW5nIiwKICAgIEZBVEFMLCBub19mcG9zKTsKICByZXR1cm4gaW5fc3RyOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBpbnQgUERGS2V5d29yZF9GaW5kKGludCBpbl9udW1iZXJfb2ZfYXJyYXlfZWxlbWVudHMsICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgY2hhciogaW5fa2V5d29yZF9hcnJheVtdLCBGVUxMX0NIQVIqIGluX3N0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBSZXR1cm4gaW5kZXggaW50byBrZXl3b3JkIGFycmF5IGlmIGFuIGVsZW1lbnQgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLiAgKi8KLyogIFJldHVybnMgLTEgaWYgbm90IGZvdW5kLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBpbnQgUERGS2V5d29yZF9GaW5kKGludCBpbl9udW1iZXJfb2ZfYXJyYXlfZWxlbWVudHMsCiAgY2hhciogaW5fa2V5d29yZF9hcnJheVtdLCBGVUxMX0NIQVIqIGluX3N0cikKewogIHVuc2lnbmVkIGludCBpOwoKICAvKiBsb29rIGZvciBrZXl3b3JkICovCiAgZm9yIChpID0gMDsgaSA8IGluX251bWJlcl9vZl9hcnJheV9lbGVtZW50czsgaSsrKQogIHsKICAgIHVuc2lnbmVkIGludCBsZW4gPSBzdHJsZW4oaW5fa2V5d29yZF9hcnJheVtpXSk7CgogICAgaWYgKG1lbWNtcChpbl9rZXl3b3JkX2FycmF5W2ldLCBpbl9zdHIsIGxlbikgPT0gMCkKICAgICAgYnJlYWs7CiAgfQoKICByZXR1cm4gKGkgPCBpbl9udW1iZXJfb2ZfYXJyYXlfZWxlbWVudHMpID8gaSA6IC0xOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBGVUxMX0NIQVIgKlBERlBhZ2VfUHJvY2Vzc0dyYXBoaWNzS2V5d29yZChGVUxMX0NIQVIqIGNoYXJQdHIsIGludCBpKSAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUHJvY2Vzc2VzIGEgbGluayBrZXl3b3JkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKI2lmIDAJLyogdGhpcyBmdW5jdGlvbiBpcyBubyBsb25nZXIgdXNlZCAqLwoKc3RhdGljIEZVTExfQ0hBUiAqUERGUGFnZV9Qcm9jZXNzR3JhcGhpY3NLZXl3b3JkKEZVTExfQ0hBUiogY2hhclB0ciwgaW50IGksCiAgY2hhcioqIHN0clB0cikKewogIGZsb2F0IHZhbHVlOwoKICAvKiBpZiBuZWVkIGJlLCBleHBhbmQgdGhpcyBsYXRlciB0byBhIGZ1bGwgYmxvd24gZXhwcmVzc2lvbiBldmFsdWF0b3IgKHVnaCkgKi8KICBzd2l0Y2ggKCpjaGFyUHRyKQogIHsKICAgIGNhc2UgJysnOgoKICAgICAgQXNzZXJ0KEZBTFNFLCBub19mcG9zKTsKICAgICAgY2hhclB0ciA9IFBERlBhZ2VfR2V0RmxvYXQoKytjaGFyUHRyLCAmdmFsdWUpOwogICAgICBzcHJpbnRmKCpzdHJQdHIsICIlLjJmIiwgZ19ncmFwaGljc192YXJzW2ldICsgdmFsdWUpOwogICAgICBicmVhazsKCgogICAgY2FzZSAnLSc6CgogICAgICBBc3NlcnQoRkFMU0UsIG5vX2Zwb3MpOwogICAgICBjaGFyUHRyID0gUERGUGFnZV9HZXRGbG9hdCgrK2NoYXJQdHIsICZ2YWx1ZSk7CiAgICAgIHNwcmludGYoKnN0clB0ciwgIiUuMmYiLCBnX2dyYXBoaWNzX3ZhcnNbaV0gLSB2YWx1ZSk7CiAgICAgIGJyZWFrOwoKCiAgICBjYXNlICcqJzoKCiAgICAgIEFzc2VydChGQUxTRSwgbm9fZnBvcyk7CiAgICAgIGNoYXJQdHIgPSBQREZQYWdlX0dldEZsb2F0KCsrY2hhclB0ciwgJnZhbHVlKTsKICAgICAgc3ByaW50Zigqc3RyUHRyLCAiJS4yZiIsIGdfZ3JhcGhpY3NfdmFyc1tpXSAqIHZhbHVlKTsKICAgICAgYnJlYWs7CgoKICAgIGNhc2UgJy8nOgoKICAgICAgQXNzZXJ0KEZBTFNFLCBub19mcG9zKTsKICAgICAgY2hhclB0ciA9IFBERlBhZ2VfR2V0RmxvYXQoKytjaGFyUHRyLCAmdmFsdWUpOwogICAgICBBc3NlcnQodmFsdWUgIT0gMCwgbm9fZnBvcyk7CS8qIG5vdCBncmVhdCBzaW5jZSB2YWx1ZSBpcyBhIGZsb2F0Li4uICovCiAgICAgIHNwcmludGYoKnN0clB0ciwgIiUuMmYiLCBnX2dyYXBoaWNzX3ZhcnNbaV0gLyB2YWx1ZSk7CiAgICAgIGJyZWFrOwoKCiAgICBkZWZhdWx0OgoKICAgICAgc3ByaW50Zigqc3RyUHRyLCAiJWQiLCBnX2dyYXBoaWNzX3ZhcnNbaV0pOwogICAgICBicmVhazsKICB9CiAgKnN0clB0ciArPSBzdHJsZW4oKnN0clB0cik7CiAgcmV0dXJuIGNoYXJQdHI7Cn0KCiNlbmRpZgoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCBQREZQYWdlX1Byb2Nlc3NMaW5rS2V5d29yZCh2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFByb2Nlc3NlcyBhIGxpbmsga2V5d29yZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkIFBERlBhZ2VfUHJvY2Vzc0xpbmtLZXl3b3JkKHZvaWQpCnsKICBGVUxMX0NIQVIqIGNoYXJQdHIgPSAoRlVMTF9DSEFSKikgZ19saW5rOwogIFBERl9MSU5LX0tFWVdPUkQga2V5d29yZCA9IGdfbGlua19rZXl3b3JkOwogIHVuc2lnbmVkIGludCBsaW5rX2xlbiA9IDA7CiAgRlVMTF9DSEFSKiBsaW5rX25hbWUgPSBjaGFyUHRyOwoKICAvKiBzY2FuIGZvciBuYW1lIG9mIGxpbms7IHNjYW4gdW50aWwgZW5kIG9mIHN0cmluZyBvciB1bnRpbCAnIF9fJyByZWFjaGVkICAqLwogIC8qIChzY2FuIGZvciBuYW1lIG9mIGxpbms7IHNjYW4gdW50aWwgZW5kIG9mIHN0cmluZyBvciB3aGl0ZXNwYWNlIHJlYWNoZWQpICovCiNpZiAxCgogIEZVTExfQ0hBUiogcGFybSA9IE5VTEw7CiAgZGVidWcxKERQRCwgRCwgIlBERlBhZ2VfUHJvY2Vzc0xpbmtLZXl3b3JkKGdfbGluayA9ICVzIiwgZ19saW5rKTsKCiAgd2hpbGUgKCgqY2hhclB0ciAhPSAnXDAnKSAmJgogICAgIShpc3NwYWNlKGNoYXJQdHJbMF0pICYmIChjaGFyUHRyWzFdID09ICdfJykgJiYgKGNoYXJQdHJbMl0gPT0gJ18nKSkpCiAgewogICAgbGlua19sZW4rKzsKICAgIGNoYXJQdHIrKzsKICB9CgogIGlmICgqY2hhclB0ciAhPSAnXDAnKQogICAgcGFybSA9ICsrY2hhclB0cjsKCiAgd2hpbGUgKCpjaGFyUHRyICE9ICdcMCcpCiAgICBjaGFyUHRyKys7CiNlbHNlCiAgd2hpbGUgKCgqY2hhclB0ciAhPSAnXDAnKSAmJiAhIGlzc3BhY2UoKmNoYXJQdHIpKQogIHsKICAgIGxpbmtfbGVuKys7CiAgICBjaGFyUHRyKys7CiAgfQojZW5kaWYKICBpZiAobGlua19sZW4gPT0gMCkKICAgIEVycm9yKDQ4LCAyMiwgIlBERlBhZ2VfUHJvY2Vzc0xpbmtLZXl3b3JkOiBlbXB0eSBsaW5rLW5hbWUgLyBVUkk7IGlnbm9yZWQuIiwKICAgICAgV0FSTiwgbm9fZnBvcyk7CiAgZWxzZQogIHsKCiAgICAvKiBzZWUgZG9jdW1lbnRhdG9uIGZvciBAR3JhcGhpYyBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlIHgsIHkgcGFybXMgKi8KICAgIC8qIHRyYW5zbGF0ZSB0aGUgb2JqZWN0J3MgYm94IGludG8gUERGJ3MgZGVmYXVsdCB1c2VyIHNwYWNlICovCiAgICBpbnQgbGxfeCA9IGdfcGFnZV9oX29yaWdpbiAqIGdfcGFnZV9oX3NjYWxlX2ZhY3RvcjsKICAgIGludCBsbF95ID0gZ19wYWdlX3Zfb3JpZ2luICogZ19wYWdlX3Zfc2NhbGVfZmFjdG9yOwogICAgaW50IHVyX3ggPSAoZ19wYWdlX2hfb3JpZ2luICsgZ19ncmFwaGljc192YXJzW2tfeHNpemVdKSAqIGdfcGFnZV9oX3NjYWxlX2ZhY3RvcjsKICAgIGludCB1cl95ID0gKGdfcGFnZV92X29yaWdpbiArIGdfZ3JhcGhpY3NfdmFyc1trX3lzaXplXSkgKiBnX3BhZ2Vfdl9zY2FsZV9mYWN0b3I7CgogICAgLyogcmVtb3ZlIHRoaXMgYmxvY2sgbGF0ZXIgKGl0IHByb2R1Y2VzIGRlYnVnZ2luZyBvdXRwdXQpOiAqLwojaWYgMAogICAgewogICAgICB0X3RlbXBidWYgc3RyeiA9ICJQREZQYWdlX1Byb2Nlc3NMaW5rS2V5d29yZDogIjsKICAgICAgc3dpdGNoIChrZXl3b3JkKQogICAgICB7CgljYXNlIGtfbGlua19zb3VyY2U6CgoJICBzdHJjYXQoc3RyeiwgImxpbmtfc291cmNlICAgICAgICAgICA9Iik7CgkgIGJyZWFrOwoKCgljYXNlIGtfbGlua19leHRlcm5hbDoKCgkgIHN0cmNhdChzdHJ6LCAibGlua19leHRlcm5hbCAgICAgICAgID0iKTsKCSAgYnJlYWs7CgoKCWNhc2Uga19saW5rX1VSSToKCgkgIHN0cmNhdChzdHJ6LCAibGlua19VUkkgICAgICAgICAgICAgID0iKTsKCSAgYnJlYWs7CgoKCWNhc2Uga19saW5rX3RhcmdldDoKCgkgIHN0cmNhdChzdHJ6LCAibGlua190YXJnZXQgICAgICAgICAgID0iKTsKCSAgYnJlYWs7CgoKCWNhc2Uga19saW5rX3RhcmdldF9mb3JfZXhwb3J0OgoKCSAgc3RyY2F0KHN0cnosICJsaW5rX3RhcmdldF9mb3JfZXhwb3J0PSIpOwoJICBicmVhazsKICAgICAgfQogICAgICBzdHJjYXQoc3RyeiwgKGNoYXIqKSBsaW5rX25hbWUpOwogICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzIiwgc3Ryeik7CiAgICAgIC8qIEVyciBvcig0OCwgMjMsIHN0cnosIFdBUk4sIG5vX2Zwb3MpOyAqLwogICAgfQojZW5kaWYKICAgIHN3aXRjaCAoa2V5d29yZCkKICAgIHsKICAgICAgY2FzZSBrX2xpbmtfc291cmNlOgoKCXsKCSAgaW50IGo7CgoJICAvKiBpZiB0aGVyZSBpcyBhIGRlc3Qgb3B0aW9uIHNwZWNpZmllZCB0aGVuIGdldCBpdCAqLwoJICBpZiAocGFybSAhPSBOVUxMKQoJICB7CgkgICAgaiA9IFBERktleXdvcmRfRmluZChrTnVtYmVyT2ZEZXN0TGlua09wdGlvbnMsIGdfZGVzdF9saW5rX29wdGlvbnMsCgkJY2hhclB0cik7CgkgICAgaWYgKGogPj0gMCkJCS8qIG5vdGUgc2lnbmVkIGNvbXBhcmlzb24gKi8KCSAgICAgIGNoYXJQdHIgKz0gc3RybGVuKGdfZGVzdF9saW5rX29wdGlvbnNbal0pOwoJICAgIGVsc2UKCSAgICB7CgkgICAgICBqID0gKGludCkga0ZpdE5vQ2hhbmdlOwkvKiBkZWZhdWx0ICovCgkgICAgICAvKiBtdXN0IGNvbnN1bWUgdGhlIHJlc3Qgb2YgdGhlIHN0cmluZyAqLwoJICAgICAgd2hpbGUgKCpjaGFyUHRyICE9ICdcMCcpCgkJY2hhclB0cisrOwoJICAgICAgbGlua19sZW4gPSBjaGFyUHRyIC0gbGlua19uYW1lOwoJICAgIH0KCSAgfQoJICBlbHNlCgkgICAgaiA9IChpbnQpIGtGaXROb0NoYW5nZTsJLyogZGVmYXVsdCAqLwoKCSAgUERGU291cmNlQW5ub3RfTmV3KGtleXdvcmQsIGxpbmtfbmFtZSwgbGlua19sZW4sCgkgICAgbGxfeCwgbGxfeSwgdXJfeCwgdXJfeSwgKFBERl9MSU5LX0RFU1RfT1BUSU9OKSBqKTsKCSAgYnJlYWs7Cgl9CgoKICAgICAgY2FzZSBrX2xpbmtfZXh0ZXJuYWw6CiAgICAgIGNhc2Uga19saW5rX1VSSToKCgl7CgkgIHRfc291cmNlX2Fubm90X2VudHJ5X3B0ciBzb3VyY2U7CgkgIHNvdXJjZSA9IFBERlNvdXJjZUFubm90X05ldyhrZXl3b3JkLCBsaW5rX25hbWUsIGxpbmtfbGVuLCBsbF94LAoJICAgIGxsX3ksIHVyX3gsIHVyX3ksIChQREZfTElOS19ERVNUX09QVElPTikgMCAvKiBkb2Vzbid0IG1hdHRlciAqLyk7CgkgIGlmIChrZXl3b3JkID09IGtfbGlua19leHRlcm5hbCkKCSAgewoJICAgIGludCBqOwoKCSAgICBsaW5rX2xlbiA9IDA7CgoJICAgIGlmIChwYXJtICE9IE5VTEwpCgkgICAgewoJICAgICAgaiA9IFBERktleXdvcmRfRmluZCgxLCBnX2V4dGVybmFsX2ZpbGVfc3BlY19rZXl3b3JkLCBwYXJtKTsKCSAgICAgIGlmIChqID09IDApCgkgICAgICB7CgkJcGFybSArPSBzdHJsZW4oZ19leHRlcm5hbF9maWxlX3NwZWNfa2V5d29yZFswXSk7CgkJbGlua19sZW4gPSBzdHJsZW4oKGNoYXIqKSBwYXJtKTsKI2lmIDAKCQkvKiBzY2FuIGZvciBuYW1lIG9mIGZpbGUgc3BlYzsgc2NhbiB1bnRpbCBlbmQgb2Ygc3RyaW5nIG9yICovCgkJLyogdW50aWwgd2hpdGVzcGFjZSByZWFjaGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJCWxpbmtfbmFtZSA9IGNoYXJQdHI7CgkJd2hpbGUgKCgqY2hhclB0ciAhPSAnXDAnKSAmJiAhIGlzc3BhY2UoKmNoYXJQdHIpKQoJCXsKCQkgIGxpbmtfbGVuKys7CgkJICBjaGFyUHRyKys7CgkJfQojZW5kaWYKCSAgICAgIH0KCSAgICB9CgoJICAgIGlmIChsaW5rX2xlbiA9PSAwKQoJICAgICAgRXJyb3IoNDgsIDI0LCAiUERGUGFnZV9Qcm9jZXNzTGlua0tleXdvcmQ6IGVtcHR5IGZpbGUgc3BlYyIsCgkJRkFUQUwsIG5vX2Zwb3MpOwoJICAgIGVsc2UKCSAgICB7CgkgICAgICBzb3VyY2UtPm1fZmlsZV9zcGVjID0gKEZVTExfQ0hBUiopIG1hbGxvYyhsaW5rX2xlbiArIDEpOwoJICAgICAgaWYgKHNvdXJjZS0+bV9maWxlX3NwZWMgPT0gTlVMTCkKCQlFcnJvcig0OCwgMjUsICJQREZQYWdlX1Byb2Nlc3NMaW5rS2V5d29yZDogb3V0IG9mIG1lbW9yeSIsCgkJICBGQVRBTCwgbm9fZnBvcyk7CiNpZiAxCgkgICAgICBzdHJjcHkoKGNoYXIqKSBzb3VyY2UtPm1fZmlsZV9zcGVjLCAoY2hhciopIHBhcm0pOwojZWxzZQoJICAgICAgbWVtY3B5KHNvdXJjZS0+bV9maWxlX3NwZWMsIGxpbmtfbmFtZSwgbGlua19sZW4pOwoJICAgICAgc291cmNlLT5tX2ZpbGVfc3BlY1tsaW5rX2xlbl0gPSAnXDAnOwojZW5kaWYKCSAgICB9CgkgIH0KCSAgYnJlYWs7Cgl9CgoKICAgICAgY2FzZSBrX2xpbmtfdGFyZ2V0OgogICAgICBjYXNlIGtfbGlua190YXJnZXRfZm9yX2V4cG9ydDoKCglQREZUYXJnZXRBbm5vdF9OZXcobGlua19uYW1lLCBsaW5rX2xlbiwgbGxfeCwgbGxfeSwgdXJfeCwgdXJfeSwKCSAga2V5d29yZCA9PSBrX2xpbmtfdGFyZ2V0X2Zvcl9leHBvcnQpOwoJYnJlYWs7CgoKICAgICAgY2FzZSBrTnVtYmVyT2ZMaW5rS2V5d29yZHM6CglicmVhazsKCiAgICB9IC8qIHN3aXRjaCAqLwogIH0gLyogZWxzZSAqLwoKICBkZWJ1ZzAoRFBELCBELCAiUERGUGFnZV9Qcm9jZXNzTGlua0tleXdvcmQgcmV0dXJuaW5nIik7CiAgLyogcmV0dXJuIGNoYXJQdHI7ICovCn0gLyogUERGUGFnZV9Qcm9jZXNzTGlua0tleXdvcmQgKi8KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIEZVTExfQ0hBUiogUERGUGFnZV9Qcm9jZXNzRG9jSW5mb0tleXdvcmQoRlVMTF9DSEFSKiBjaGFyUHRyLCBpbnQgaSkgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBQcm9jZXNzZXMgYSBkb2N1bWVudCBpbmZvIGtleXdvcmQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgRlVMTF9DSEFSICpQREZQYWdlX1Byb2Nlc3NEb2NJbmZvS2V5d29yZChGVUxMX0NIQVIqIGNoYXJQdHIsIGludCBpKQp7CiAgc3dpdGNoIChpKQogIHsKICAgIGNhc2Uga19hdXRob3I6CgogICAgICBpZiAoZ19kb2NfYXV0aG9yICE9IE5VTEwpCglmcmVlKGdfZG9jX2F1dGhvcik7CiAgICAgIGdfZG9jX2F1dGhvciA9IChGVUxMX0NIQVIqKSBtYWxsb2Moc3RybGVuKChjaGFyKikgY2hhclB0cikgKyAxKTsKICAgICAgaWYgKGdfZG9jX2F1dGhvciA9PSBOVUxMKQoJRXJyb3IoNDgsIDI2LCAiUERGUGFnZV9Qcm9jZXNzRG9jSW5mb0tleXdvcmQ6IG5vIG1lbW9yeSBmb3IgX19hdXRob3I9IiwKCSAgV0FSTiwgbm9fZnBvcyk7CiAgICAgIGVsc2UKCXN0cmNweSgoY2hhciopIGdfZG9jX2F1dGhvciwgKGNoYXIqKSBjaGFyUHRyKTsKICAgICAgYnJlYWs7CgoKICAgIGNhc2Uga190aXRsZToKCiAgICAgIGlmIChnX2RvY190aXRsZSAhPSBOVUxMKQoJZnJlZShnX2RvY190aXRsZSk7CiAgICAgIGdfZG9jX3RpdGxlID0gKEZVTExfQ0hBUiopIG1hbGxvYyhzdHJsZW4oKGNoYXIqKSBjaGFyUHRyKSArIDEpOwogICAgICBpZiAoZ19kb2NfdGl0bGUgPT0gTlVMTCkKCUVycm9yKDQ4LCAyNywgIlBERlBhZ2VfUHJvY2Vzc0RvY0luZm9LZXl3b3JkOiBubyBtZW1vcnkgZm9yIF9fdGl0bGU9IiwKCSAgV0FSTiwgbm9fZnBvcyk7CiAgICAgICBlbHNlCglzdHJjcHkoKGNoYXIqKSBnX2RvY190aXRsZSwgKGNoYXIqKSBjaGFyUHRyKTsKICAgICAgYnJlYWs7CgoKICAgIGNhc2Uga19zdWJqZWN0OgoKICAgICAgaWYgKGdfZG9jX3N1YmplY3QgIT0gTlVMTCkKCWZyZWUoZ19kb2Nfc3ViamVjdCk7CiAgICAgIGdfZG9jX3N1YmplY3QgPSAoRlVMTF9DSEFSKikgbWFsbG9jKHN0cmxlbigoY2hhciopIGNoYXJQdHIpICsgMSk7CiAgICAgIGlmIChnX2RvY19zdWJqZWN0ID09IE5VTEwpCglFcnJvcig0NywgMjgsICJQREZQYWdlX1Byb2Nlc3NEb2NJbmZvS2V5d29yZDogbm8gbWVtb3J5IGZvciBfX3N1YmplY3Q9IiwKCSAgV0FSTiwgbm9fZnBvcyk7CiAgICAgIGVsc2UKCXN0cmNweSgoY2hhciopIGdfZG9jX3N1YmplY3QsIChjaGFyKikgY2hhclB0cik7CiAgICAgIGJyZWFrOwoKCiAgICBjYXNlIGtfa2V5d29yZHM6CiAgICAgIGlmIChnX2RvY19rZXl3b3JkcyAhPSBOVUxMKQoJZnJlZShnX2RvY19rZXl3b3Jkcyk7CiAgICAgIGdfZG9jX2tleXdvcmRzID0gKEZVTExfQ0hBUiopIG1hbGxvYyhzdHJsZW4oKGNoYXIqKSBjaGFyUHRyKSArIDEpOwogICAgICBpZiAoZ19kb2Nfa2V5d29yZHMgPT0gTlVMTCkKCUVycm9yKDQ4LCAyOSwgIlBERlBhZ2VfUHJvY2Vzc0RvY0luZm9LZXl3b3JkOiBubyBtZW1vcnkgZm9yIF9fa2V5d29yZHM9IiwKCSAgV0FSTiwgbm9fZnBvcyk7CiAgICAgIGVsc2UKCXN0cmNweSgoY2hhciopIGdfZG9jX2tleXdvcmRzLCAoY2hhciopIGNoYXJQdHIpOwogICAgICBicmVhazsKCiAgfQogIHJldHVybiAoY2hhclB0ciArIHN0cmxlbigoY2hhciopIGNoYXJQdHIpKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCAgUERGUGFnZV9FdmFsRXhwcihjaGFyKiBpbkV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIEV2YWx1YXRlIGNvbGxlY3RlZCBleHByZXNzaW9uIGluIHRoZSBnaXZlbiBleHByZXNzaW9uIGJ1ZmZlci4gICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBjaGFyICpQREZQYWdlX0V2YWxFeHByKGNoYXIqIGluRXhwciwgZmxvYXQqIG91dFZhbHVlKQp7CiAgaW50IGk7CiAgY2hhciogY2hwID0gaW5FeHByOwoKICB3aGlsZSAoaXNzcGFjZSggKGludCkgKmNocCkpCS8qIGlnbm9yZSBsZWFkaW5nIHdoaXRlIHNwYWNlICovCiAgICBjaHArKzsKCiAgd2hpbGUgKCpjaHAgPT0gJ18nKQogICAgY2hwKys7CgogIHdoaWxlICgqY2hwID09ICcrJykJLyogaWdub3JlIHVuYXJ5ICsgKi8KICAgIGNocCsrOwoKICBpZiAoaXNkaWdpdCgoaW50KSAqY2hwKSB8fCAoKmNocCA9PSAnLicpKQogIHsKICAgIGNocCA9IChjaGFyKikgUERGUGFnZV9HZXRGbG9hdCgoRlVMTF9DSEFSKikgY2hwLCBvdXRWYWx1ZSk7CiAgfQogIGVsc2UgaWYgKCpjaHAgPT0gJy0nKQkvKiBoYW5kbGUgdW5hcnkgbmVnYXRpb24gKi8KICB7CiAgICBmbG9hdCB2YWw7CgogICAgY2hwID0gUERGUGFnZV9FdmFsRXhwcigrK2NocCwgJnZhbCk7CiAgICAqb3V0VmFsdWUgPSAtdmFsOwogIH0KICBlbHNlCiAgewogICAgaSA9IFBERktleXdvcmRfRmluZChrTnVtYmVyT2ZBcml0aG1ldGljS2V5d29yZHMsCgkgIGdfYXJpdGhtZXRpY19rZXl3b3JkcywgKEZVTExfQ0hBUiopIGNocCk7CiAgICBpZiAoaSA+PSAwKQogICAgewogICAgICBmbG9hdCB2YWwxLCB2YWwyOwoKICAgICAgY2hwICs9IHN0cmxlbihnX2FyaXRobWV0aWNfa2V5d29yZHNbaV0pOwoKICAgICAgd2hpbGUgKGlzc3BhY2UoIChpbnQpICpjaHApKQoJY2hwKys7CiAgICAgIGlmICgqY2hwICE9ICcoJykKCUVycm9yKDQ4LCAzMCwgIlBERlBhZ2VfRXZhbEV4cHI6ICcoJyBleHBlY3RlZCIsIEZBVEFMLCBub19mcG9zKTsKICAgICAgY2hwID0gUERGUGFnZV9FdmFsRXhwcigrK2NocCwgJnZhbDEpOwogICAgICBpZiAoIChpIDw9IGtfZGl2KSB8fCAoaSA9PSBrX3BpY2spICkKICAgICAgewoJaW50IGNvdW50OwoKCWlmIChpID09IGtfcGljaykKCXsKCSAgY291bnQgPSBmbG9vcih2YWwxKTsKCSAgQXNzZXJ0KGNvdW50ICE9IDAsIG5vX2Zwb3MpOwoJfQoJZWxzZQoJICBjb3VudCA9IDE7CgoJaWYgKCpjaHAgIT0gJywnKQoJICBFcnJvcig0OCwgMzEsICJQREZQYWdlX0V2YWxFeHByOiAnLCcgZXhwZWN0ZWQiLCBGQVRBTCwgbm9fZnBvcyk7CgoJZG8gewoJICBjaHAgPSBQREZQYWdlX0V2YWxFeHByKCsrY2hwLCAmdmFsMik7CgkgIGlmICgoY291bnQgIT0gMSkgJiYgKCpjaHAgPT0gJywnKSkKCSAgICArK2NocDsKCX0gd2hpbGUgKC0tY291bnQgIT0gMCk7CiAgICAgIH0KICAgICAgaWYgKCpjaHAgIT0gJyknKQoJRXJyb3IoNDgsIDMyLCAiUERGUGFnZV9FdmFsRXhwcjogJyknIGV4cGVjdGVkIiwgRkFUQUwsIG5vX2Zwb3MpOwogICAgICArK2NocDsKICAgICAgc3dpdGNoIChpKQogICAgICB7CgoJY2FzZSBrX2FkZDoKCSAgKm91dFZhbHVlID0gdmFsMSArIHZhbDI7CgkgIGJyZWFrOwoKCgljYXNlIGtfc3ViOgoKCSAgKm91dFZhbHVlID0gdmFsMSAtIHZhbDI7CgkgIGJyZWFrOwoKCgljYXNlIGtfbXVsOgoKCSAgKm91dFZhbHVlID0gdmFsMSAqIHZhbDI7CgkgIGJyZWFrOwoKCgljYXNlIGtfZGl2OgoKCSAgQXNzZXJ0KHZhbDIgIT0gMCwgbm9fZnBvcyk7IC8qIG5vdCBncmVhdCBzaW5jZSB2YWx1ZSBpcyBhIGZsb2F0Li4uICovCgkgICpvdXRWYWx1ZSA9IHZhbDEgLyB2YWwyOwoJICBicmVhazsKCgoJY2FzZSBrX3NpbjoKCgkgICpvdXRWYWx1ZSA9IHNpbigoZG91YmxlKSB2YWwxICogKGRvdWJsZSkgUEkgLyAoZG91YmxlKSAxODAuMCk7CgkgIGJyZWFrOwoKCgljYXNlIGtfY29zOgoKCSAgKm91dFZhbHVlID0gY29zKChkb3VibGUpIHZhbDEgKiAoZG91YmxlKSBQSSAvIChkb3VibGUpIDE4MC4wKTsKCSAgYnJlYWs7CgoKCWNhc2Uga19waWNrOgoKCSAgKm91dFZhbHVlID0gdmFsMjsKCSAgYnJlYWs7CiAgICAgIH0KICAgIH0KICAgIGVsc2UKICAgIHsKICAgICAgaSA9IFBERktleXdvcmRfRmluZChrTnVtYmVyT2ZHcmFwaGljc0tleXdvcmRzLCBnX2dyYXBoaWNfa2V5d29yZHMsCgkgICAgKEZVTExfQ0hBUiopIGNocCk7CiAgICAgIGlmIChpID49IDApCiAgICAgIHsKCWNocCArPSBzdHJsZW4oZ19ncmFwaGljX2tleXdvcmRzW2ldKTsKCSpvdXRWYWx1ZSA9IGdfZ3JhcGhpY3NfdmFyc1tpXTsKICAgICAgfQogICAgICBlbHNlCiAgICAgIHsKCWkgPSBQREZLZXl3b3JkX0ZpbmQoa051bWJlck9mVW5pdEtleXdvcmRzLCBnX3VuaXRfa2V5d29yZHMsIChGVUxMX0NIQVIqKSBjaHApOwoJaWYgKGkgPj0gMCkKCXsKCSAgY2hwICs9IHN0cmxlbihnX3VuaXRfa2V5d29yZHNbaV0pOwoJICAqb3V0VmFsdWUgPSBnX3VuaXRzW2ldOwoJfQoJZWxzZQoJewoJICBFcnJvcig0OCwgMzMsICJQREZQYWdlX0V2YWxFeHByOiBfX2FkZCwgX19zdWIsIF9fbXVsLCBfX2Rpdiwgb3IgYSB1bml0IGtleXdvcmQgd2FzIGV4cGVjdGVkIiwKCSAgICBGQVRBTCwgbm9fZnBvcyk7Cgl9CiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGNocDsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgRlVMTF9DSEFSICpQREZQYWdlX0NvbGxlY3RFeHByKEZVTExfQ0hBUiogY2hhclB0cikgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIENvbGxlY3QgZXhwcmVzc2lvbiBpbnRvIHRoZSBleHByZXNzaW9uIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBGVUxMX0NIQVIgKlBERlBhZ2VfQ29sbGVjdEV4cHIoRlVMTF9DSEFSKiBjaGFyUHRyLCBCT09MRUFOKiBvdXRIYXNSZXN1bHQsCiAgZmxvYXQqIG91dFJlc3VsdCkKewogICpvdXRIYXNSZXN1bHQgPSBGQUxTRTsKICB3aGlsZSAoKmNoYXJQdHIgIT0gMCkKICB7CiAgICBjaGFyIGNoOwoKICAgIGlmICggZ19leHByX2luZGV4ID49IHNpemVvZihnX2V4cHIpICkKICAgICAgRXJyb3IoNDgsIDM0LCAiUERGUGFnZV9Db2xsZWN0RXhwcjogZXhwcmVzc2lvbiB0b28gbG9uZyAobWF4LiA1MTIgY2hhcnMpIiwKCUZBVEFMLCBub19mcG9zKTsKCiAgICBnX2V4cHJbZ19leHByX2luZGV4KytdID0gY2ggPSAqY2hhclB0cisrOwogICAgaWYgKGNoID09ICcoJykKICAgICAgZ19leHByX2RlcHRoKys7CiAgICBlbHNlIGlmIChjaCA9PSAnKScpCiAgICB7CiAgICAgIEFzc2VydChnX2V4cHJfZGVwdGggIT0gMCwgbm9fZnBvcyk7CiAgICAgIGdfZXhwcl9kZXB0aC0tOwogICAgICBpZiAoZ19leHByX2RlcHRoID09IDApCiAgICAgIHsKCWdfZXhwcltnX2V4cHJfaW5kZXhdID0gJ1wwJzsJLyogdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KCShjaGFyKikgUERGUGFnZV9FdmFsRXhwcihnX2V4cHIsIG91dFJlc3VsdCk7Cgkqb3V0SGFzUmVzdWx0ID0gVFJVRTsKCWJyZWFrOwkvKiBleGl0IHdoaWxlICovCiAgICAgIH0KICAgIH0KICB9CiAgcmV0dXJuIGNoYXJQdHI7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIEZVTExfQ0hBUiAqUERGUGFnZV9Db2xsZWN0TGluayhGVUxMX0NIQVIqIGNoYXJQdHIpICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBDb2xsZWN0IGxpbmsgaW50byB0aGUgbGluayBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgRlVMTF9DSEFSICpQREZQYWdlX0NvbGxlY3RMaW5rKEZVTExfQ0hBUiogY2hhclB0cgogIC8qLCBCT09MRUFOKiBvdXRIYXNSZXN1bHQsIGZsb2F0KiBvdXRSZXN1bHQqLykKewogIGRlYnVnMShEUEQsIEQsICJQREZQYWdlX0NvbGxlY3RMaW5rKFwiJXNcIikiLCBjaGFyUHRyKTsKICB3aGlsZSAoKmNoYXJQdHIgIT0gMCkKICB7CiAgICBjaGFyIGNoOwoKICAgIGlmICggZ19saW5rX2luZGV4ID49IHNpemVvZihnX2xpbmspICkKICAgICAgRXJyb3IoNDgsIDM1LCAiUERGUGFnZV9Db2xsZWN0TGluazogbGluayB0b28gbG9uZyAobWF4LiA1MTIgY2hhcnMpIiwKCUZBVEFMLCBub19mcG9zKTsKCiAgICBnX2xpbmtbZ19saW5rX2luZGV4KytdID0gY2ggPSAqY2hhclB0cisrOwogICAgaWYgKChjaCA9PSAnPCcpICYmICgqY2hhclB0ciA9PSAnPCcpKQogICAgewogICAgICBnX2xpbmtbZ19saW5rX2luZGV4KytdID0gKmNoYXJQdHIrKzsKICAgICAgZ19saW5rX2RlcHRoKys7CiAgICB9CiAgICBlbHNlIGlmICgoY2ggPT0gJz4nKSAmJiAoKmNoYXJQdHIgPT0gJz4nKSkKICAgIHsKICAgICAgQXNzZXJ0KGdfbGlua19kZXB0aCAhPSAwLCBub19mcG9zKTsKCiAgICAgIGdfbGlua19kZXB0aC0tOwogICAgICBpZiAoZ19saW5rX2RlcHRoID09IDApCiAgICAgIHsKCS8qIEkgZG9uJ3Qgd2FudCB0aGUgb3V0ZXJtb3N0ICc8PCcgJz4+JyBwYWlyICovCglnX2xpbmtbLS1nX2xpbmtfaW5kZXhdID0gJ1wwJzsJLyogdGVybWluYXRlIHRoZSBzdHJpbmcgKi8KCglQREZQYWdlX1Byb2Nlc3NMaW5rS2V5d29yZCgpOwoKCWNoYXJQdHIrKzsKCWJyZWFrOwkvKiBleGl0IHdoaWxlICovCiAgICAgIH0KICAgICAgZWxzZQoJZ19saW5rW2dfbGlua19pbmRleCsrXSA9ICpjaGFyUHRyKys7CiAgICB9CiAgfQogIGRlYnVnMChEUEQsIEQsICJQREZQYWdlX0NvbGxlY3RMaW5rIHJldHVybmluZyIpOwogIHJldHVybiBjaGFyUHRyOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkIFBERlBhZ2VfV3JpdGVHcmFwaGljKEZJTEUqIGluX2ZwLCBGVUxMX0NIQVIqIGluX3N0cikgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgT3V0cHV0cyBhbiBhcHByb3ByaWF0ZSBQREYgc3RyaW5nIGZvciBkcmF3aW5nIGEgZ3JhcGhpYyBlbGVtZW50LiAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBQREZQYWdlX1dyaXRlR3JhcGhpYyhGSUxFKiBpbl9mcCwgRlVMTF9DSEFSKiBpbl9zdHIpCnsKICB0X3RlbXBidWYgc3RyOwoKICBGVUxMX0NIQVIgKmNoYXJQdHIgPSBpbl9zdHI7CiAgY2hhciAqc3RyUHRyID0gc3RyOwoKICBpZiAoKmNoYXJQdHIgPT0gMCkKICAgIHJldHVybjsKCiAgLyogaWYgaW4gY29sbGVjdGluZyBhbiBleHByZXNzaW9uIG1vZGUgdGhlbiBjb2xsZWN0IHVudGlsIHRlcm1pbmF0aW5nICcpJyAqLwogIGlmIChnX2V4cHJfZGVwdGggIT0gMCkKICB7CiAgICBCT09MRUFOIGhhc1Jlc3VsdDsKICAgIGZsb2F0IHZhbHVlOwoKICAgIGNoYXJQdHIgPSBQREZQYWdlX0NvbGxlY3RFeHByKGNoYXJQdHIsICZoYXNSZXN1bHQsICZ2YWx1ZSk7CiAgICBpZiAoaGFzUmVzdWx0KQogICAgewogICAgICBzcHJpbnRmKHN0clB0ciwgIiUuMmYiLCB2YWx1ZSk7CiAgICAgIHN0clB0ciArPSBzdHJsZW4oc3RyUHRyKTsKICAgIH0KICB9CgogIC8qIGlmIGluIGNvbGxlY3RpbmctYS1saW5rIG1vZGUgdGhlbiBjb2xsZWN0IHVudGlsIHRlcm1pbmF0aW5nICc+PicgICAgICAgICovCiAgaWYgKGdfbGlua19kZXB0aCAhPSAwKQogICAgY2hhclB0ciA9IFBERlBhZ2VfQ29sbGVjdExpbmsoY2hhclB0cik7CgogIC8qIHNjYW4gdGhlIHN0cmluZyBmb3IgJ19fJyBvdGhlcndpc2Ugb3V0cHV0IGl0ICovCiAgd2hpbGUgKCpjaGFyUHRyICE9IDApCiAgewogICAgaW50IGk7CiAgICBmbG9hdCB2YWx1ZTsKCiAgICBBc3NlcnQoc3RyUHRyIDwgKHN0ciArIHNpemVvZih0X3RlbXBidWYpKSwgbm9fZnBvcyk7CgogICAgLyogbG9vayBmb3IgIl9fIiAoZG91YmxlIHVuZGVybGluZSkgKi8KICAgIGlmICggKGNoYXJQdHJbMF0gPT0gJ18nKSAmJiAoY2hhclB0clsxXSA9PSAnXycpICkKICAgIHsKICAgICAgY2hhclB0ciArPSAyOwoKICAgICAgLyogImluIiwgImNtIiwgInB0IiwgImVtIiwgImxvdXRmIiwgImxvdXR2IiwgImxvdXRzIiAqLwojaWYgMAogICAgICBpID0gUERGS2V5d29yZF9GaW5kKGtOdW1iZXJPZlVuaXRLZXl3b3JkcywgZ191bml0X2tleXdvcmRzLCBjaGFyUHRyKTsKICAgICAgaWYgKGkgPj0gMCkKICAgICAgewoJQXNzZXJ0KEZBTFNFLCBub19mcG9zKTsKCWNoYXJQdHIgKz0gc3RybGVuKGdfdW5pdF9rZXl3b3Jkc1tpXSk7CS8qIHNraXAga2V5d29yZCAqLwoJY2hhclB0ciA9IFBERlBhZ2VfR2V0RmxvYXQoY2hhclB0ciwgJnZhbHVlKTsgLyogZ2V0IHZhbHVlICovCglzcHJpbnRmKHN0clB0ciwgIiUuMmYiLCBnX3VuaXRzW2ldICogdmFsdWUpOyAvKiBvdXRwdXQgaXQgKi8KCXN0clB0ciArPSBzdHJsZW4oc3RyUHRyKTsKICAgICAgfQogICAgICBlbHNlCiNlbmRpZgogICAgICB7CgoJLyogInhzaXplIiwgInlzaXplIiwgInhtYXJrIiwgInltYXJrIiAqLwoJaSA9IFBERktleXdvcmRfRmluZChrTnVtYmVyT2ZHcmFwaGljc0tleXdvcmRzLCBnX2dyYXBoaWNfa2V5d29yZHMsIGNoYXJQdHIpOwoJaWYgKGkgPj0gMCkKCXsKCSAgY2hhclB0ciArPSBzdHJsZW4oZ19ncmFwaGljX2tleXdvcmRzW2ldKTsKI2lmIDEKCSAgc3ByaW50ZihzdHJQdHIsICIlZCIsIGdfZ3JhcGhpY3NfdmFyc1tpXSk7CgkgIHN0clB0ciArPSBzdHJsZW4oc3RyUHRyKTsKI2Vsc2UKCSAgY2hhclB0ciA9IFBERlBhZ2VfUHJvY2Vzc0dyYXBoaWNzS2V5d29yZChjaGFyUHRyLCBpLCAmc3RyUHRyKTsKI2VuZGlmCgl9CgllbHNlCgl7CgkgIC8qICJsaW5rX3NvdXJjZT08PCIsICJsaW5rX3RhcmdldD08PCIsICJsaW5rX3RhcmdldF9mb3JfZXhwb3J0PTw8IiwgImxpbmtfVVJJPTw8IiAqLwoJICBpID0gUERGS2V5d29yZF9GaW5kKGtOdW1iZXJPZkxpbmtLZXl3b3JkcywgZ19saW5rX2tleXdvcmRzLCBjaGFyUHRyKTsKCSAgaWYgKGkgPj0gMCkKCSAgewoJICAgIGNoYXJQdHIgKz0gc3RybGVuKGdfbGlua19rZXl3b3Jkc1tpXSk7CiNpZiAxCgkgICAgd2hpbGUgKGlzc3BhY2UoKmNoYXJQdHIpKQoJICAgICAgY2hhclB0cisrOwoKCSAgICBnX2xpbmtfaW5kZXggPSAwOwoJICAgIGdfbGlua19kZXB0aCsrOwoJICAgIGdfbGlua19rZXl3b3JkID0gKFBERl9MSU5LX0tFWVdPUkQpIGk7CgkgICAgY2hhclB0ciA9IFBERlBhZ2VfQ29sbGVjdExpbmsoY2hhclB0cik7CiNlbHNlCgkgICAgY2hhclB0ciA9IFBERlBhZ2VfUHJvY2Vzc0xpbmtLZXl3b3JkKGNoYXJQdHIsIChQREZfTElOS19LRVlXT1JEKSBpKTsKI2VuZGlmCgkgIH0gLyogaWYgKi8KCSAgZWxzZQoJICB7CgoJICAgIC8qICJhdXRob3I9IiwgInRpdGxlPSIsICJzdWJqZWN0PSIsICJrZXl3b3Jkcz0iICovCgkgICAgaSA9IFBERktleXdvcmRfRmluZChrTnVtYmVyT2ZEb2NJbmZvS2V5d29yZHMsIGdfZG9jX2luZm9fa2V5d29yZHMsIGNoYXJQdHIpOwoJICAgIGlmIChpID49IDApCgkgICAgewoJICAgICAgY2hhclB0ciArPSBzdHJsZW4oZ19kb2NfaW5mb19rZXl3b3Jkc1tpXSk7CgkgICAgICBjaGFyUHRyID0gUERGUGFnZV9Qcm9jZXNzRG9jSW5mb0tleXdvcmQoY2hhclB0ciwgaSk7CgkgICAgfQoJICAgIGVsc2UKCSAgICB7CgoJICAgICAgLyogImFkZCIgInN1YiIgIm11bCIgImRpdiIsICJzaW4iLCAiY29zIiAqLwoJICAgICAgaSA9IFBERktleXdvcmRfRmluZChrTnVtYmVyT2ZBcml0aG1ldGljS2V5d29yZHMsIGdfYXJpdGhtZXRpY19rZXl3b3JkcywgY2hhclB0cik7CgkgICAgICBpZiAoaSA+PSAwKQoJICAgICAgewoJCXN0cmNweShnX2V4cHIsIGdfYXJpdGhtZXRpY19rZXl3b3Jkc1tpXSk7CgkJY2hhclB0ciArPSBzdHJsZW4oZ19hcml0aG1ldGljX2tleXdvcmRzW2ldKTsKCQl3aGlsZSAoaXNzcGFjZSgqY2hhclB0cikpCgkJICBjaGFyUHRyKys7CgkJaWYgKCpjaGFyUHRyICE9ICcoJykKCQkgIEVycm9yKDQ4LCAzNiwgIlBERlBhZ2VfV3JpdGVHcmFwaGljOiAnKCcgZXhwZWN0ZWQiLCBGQVRBTCwgbm9fZnBvcyk7CgoJCXN0cmNhdChnX2V4cHIsICIoIik7CgkJZ19leHByX2luZGV4ID0gc3RybGVuKGdfZXhwcik7CgkJZ19leHByX2RlcHRoKys7CgkJewoJCSAgQk9PTEVBTiBoYXNSZXN1bHQ7CgoJCSAgY2hhclB0ciA9IFBERlBhZ2VfQ29sbGVjdEV4cHIoKytjaGFyUHRyLCAmaGFzUmVzdWx0LCAmdmFsdWUpOwoJCSAgaWYgKGhhc1Jlc3VsdCkKCQkgIHsKCQkgICAgc3ByaW50ZihzdHJQdHIsICIlLjJmIiwgdmFsdWUpOwoJCSAgICBzdHJQdHIgKz0gc3RybGVuKHN0clB0cik7CgkJICB9CgkJfQoJICAgICAgfQoJICAgICAgZWxzZQoJICAgICAgewoJCS8qIGFsZXJ0IHVzZXIgaW4gY2FzZSB0aGVyZSB3YXMgYSBzcGVsbGluZyBtaXN0YWtlICovCgkJRXJyb3IoNDgsIDM3LCAiUERGUGFnZV9Xcml0ZUdyYXBoaWM6ICdfXycgZW5jb3VudGVyZWQgd2hpbGUgcHJvY2Vzc2luZyBAR3JhcGhpYyIsIFdBUk4sIG5vX2Zwb3MpOwoJCSpzdHJQdHIrKyA9ICdfJzsKCQkqc3RyUHRyKysgPSAnXyc7CgkgICAgICB9IC8qIGVsc2UgKi8KCSAgICB9IC8qIGVsc2UgKi8KCSAgfSAvKiBlbHNlICovCgl9IC8qIGVsc2UgKi8KICAgICAgfSAvKiBlbHNlICovCiAgICB9IC8qIGlmICovCiAgICBlbHNlCiAgICB7CiAgICAgICpzdHJQdHIrKyA9ICpjaGFyUHRyKys7CiAgICB9CiAgfQoKICAqc3RyUHRyID0gMDsKCiAgUERGUGFnZV9GbHVzaEJ1ZmZlcihpbl9mcCk7CS8qIHRoaXMgaXMgYSBtYXJraW5nIG9wZXJhdGlvbiwgc28gZmx1c2ggKi8KICBQREZQYWdlX1dyaXRlKGluX2ZwLCBzdHIpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qIFBERlBhZ2VfUHJpbnRVbmRlcmxpbmUoRklMRSogaW5fZnAsIGludCB4MSwgaW50IHgyLCBpbnQgeSwgaW50IHRoaWNrbmVzcykgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgSW1wbGVtZW50cyB1bmRlcmxpbmluZyAoanVzdCBkcmF3cyBhIGhvcml6b250YWwgbGluZSkuICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBQREZQYWdlX1ByaW50VW5kZXJsaW5lKEZJTEUqIGluX2ZwLCBpbnQgaW5feDEsIGludCBpbl94MiwgaW50IGluX3ksCiAgaW50IGluX3RoaWNrbmVzcykKewogIHRfdGVtcGJ1ZiBzdHI7CgogIC8qIHRoaXMgaXMgYSBtYXJraW5nIG9wZXJhdGlvbiwgc28gZmx1c2ggYW5kIHR1cm4gb2ZmIGJ1ZmZlcmluZyAqLwogIFBERlBhZ2VfRmx1c2hCdWZmZXIoaW5fZnApOwoKICAvKiBmcHJpbnRmKG91dF9mcCwgIi91bCB7IGdzYXZlIHNldGxpbmV3aWR0aCBkdXAgMyAxIHJvbGxcbiIpOyAqLwogIC8qIGZwcmludGYob3V0X2ZwLCAiICAgICAgbW92ZXRvIGxpbmV0byBzdHJva2UgZ3Jlc3RvcmUgfSBiaW5kIGRlZlxuIik7ICAqLwoKICBzcHJpbnRmKHN0ciwgInEgJWQgdyAlZCAlZCBtICVkICVkIGwgcyBRXG4iLGluX3RoaWNrbmVzcyxpbl94MSxpbl95LGluX3gyLGluX3kpOwogIFBERlBhZ2VfV3JpdGUoaW5fZnAsIHN0cik7Cn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIHZvaWQgUERGUGFnZV9Jbml0KEZJTEUqIGluX2ZwLCBmbG9hdCBpbl9zY2FsZV9mYWN0b3IsIGludCBpbl9saW5lX3dpZHRoKSAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBJbml0cyB0aGUgdmFycyBmb3IgdGhlIHN0YXJ0IG9mIHByb2Nlc3NpbmcgYSBuZXcgcGFnZS4gICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgWyAwIDEgMiBdICAgICAgICAgICAgICAgWyBzIDAgMCBdICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICBbIDMgNCA1IF0gICAgICAgPSAgICAgICBbIDAgcyAwIF0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFsgNiA3IDggXSAgICAgICAgICAgICAgIFsgMCAwIDEgXSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgIFBERlBhZ2VfSW5pdChGSUxFKiBpbl9mcCwgZmxvYXQgaW5fc2NhbGVfZmFjdG9yLCBpbnQgaW5fbGluZV93aWR0aCkKewoKI2lmZGVmIFVTRV9NQVRSSUNFUwogIGdfY3VyX21hdHJpeFswXSA9IGdfY3VyX21hdHJpeFs0XSA9IGluX3NjYWxlX2ZhY3RvcjsKICBnX2N1cl9tYXRyaXhbMV0gPSBnX2N1cl9tYXRyaXhbMl0gPSBnX2N1cl9tYXRyaXhbM10gPQogIGdfY3VyX21hdHJpeFs1XSA9IGdfY3VyX21hdHJpeFs2XSA9IGdfY3VyX21hdHJpeFs3XSA9IDA7CiAgZ19jdXJfbWF0cml4WzhdID0gMTsKICBnX21hdHJpeF9zdGFjayA9IE5VTEw7CiNlbmRpZgoKICAvKiBjbGVhci9pbml0IHBhZ2UgdmFycyAqLwogIGdfcGFnZV91c2VzX2ZvbnRzID0gRkFMU0U7CiAgZ19wYWdlX2hhc190ZXh0ICA9IEZBTFNFOwogIGdfcGFnZV9oYXNfZ3JhcGhpY3MgPSBGQUxTRTsKCiAgZ19wYWdlX2NvbnRlbnRzX29ial9udW0gPSAwOyAvKiB1bmRlZmluZWQgKi8KICBnX3BhZ2VfbGVuZ3RoX29ial9udW0gPSAwOyAvKiB1bmRlZmluZWQgKi8KICBnX3BhZ2Vfc3RhcnRfb2Zmc2V0ID0gMDsgLyogdW5kZWZpbmVkICovCiAgLyogZ190ZXh0X2ZvbnRfc2l6ZV9pbl9lbXMgPSAwOyAqLyAvKiB1bmRlZmluZWQgKi8KCiAgZ19wYWdlX2hfc2NhbGVfZmFjdG9yID0gZ19wYWdlX3Zfc2NhbGVfZmFjdG9yID0gaW5fc2NhbGVfZmFjdG9yOwogIGdfcGFnZV9oX29yaWdpbiA9IGdfcGFnZV92X29yaWdpbiA9IDA7CiAgZ19wYWdlX2xpbmVfd2lkdGggPSBpbl9saW5lX3dpZHRoOwoKICAvKiAqKioKICBnX2dyYXBoaWNzX3ZhcnNba19pbl0gPSBJTjsKICBnX2dyYXBoaWNzX3ZhcnNba19jbV0gPSBDTTsKICBnX2dyYXBoaWNzX3ZhcnNba19wdF0gPSBQVDsKICBnX2dyYXBoaWNzX3ZhcnNba19lbV0gPSBFTTsKICAqKiogKi8KICBnX2dyYXBoaWNzX3ZhcnNba194c2l6ZV0gPSAwOyAvKiB1bmRlZmluZWQgKi8KICBnX2dyYXBoaWNzX3ZhcnNba195c2l6ZV0gPSAwOyAvKiB1bmRlZmluZWQgKi8KICBnX2dyYXBoaWNzX3ZhcnNba194bWFya10gPSAwOyAvKiB1bmRlZmluZWQgKi8KICBnX2dyYXBoaWNzX3ZhcnNba195bWFya10gPSAwOyAvKiB1bmRlZmluZWQgKi8KICAvKiAqKioKICBnX2dyYXBoaWNzX3ZhcnNba19sb3V0Zl0gPSAwOwogIGdfZ3JhcGhpY3NfdmFyc1trX2xvdXR2XSA9IDA7CiAgZ19ncmFwaGljc192YXJzW2tfbG91dHNdID0gMDsKICAqKiogKi8KCiAgLyogTm8gbmVlZCB0byB0b3VjaCBrX2luIG90aGVyIGNvbnN0YW50IHVuaXRzICovCiAgZ191bml0c1trX2xvdXRmXSA9IDA7IC8qIHVuZGVmaW5lZCAqLwogIGdfdW5pdHNba19sb3V0dl0gPSAwOyAvKiB1bmRlZmluZWQgKi8KICBnX3VuaXRzW2tfbG91dHNdID0gMDsgLyogdW5kZWZpbmVkICovCgogIGdfRVRfcGVuZGluZyA9IEZBTFNFOwogIGdfVEpfcGVuZGluZyA9IEZBTFNFOwogIGdfdmFsaWRfdGV4dF9tYXRyaXggPSBGQUxTRTsJLyogVGQgaXMgbm90IGFsbG93ZWQgKi8KCiAgLyogbWFyayBhbGwgZm9udHMgIm5vdCBpbiB1c2UiICovCiAgewogICAgdF9mb250X2xpc3RfZW50cnlfcHRyIGVudHJ5ID0gZ19mb250X2xpc3Q7CiAgICB3aGlsZSAoZW50cnkgIT0gTlVMTCkgewogICAgICBlbnRyeS0+bV9pbl91c2UgPSBGQUxTRTsJLyogc2V0IHRoZSAiaW4gdXNlIiBzdGF0ZSB0byAibm90IGluIHVzZSIgKi8KICAgICAgZW50cnkgPSBlbnRyeS0+bV9uZXh0X2ZvbnRfZW50cnk7CiAgICB9CiAgfQoKICAvKiBpbml0IHFzYXZlIHN0YWNrICovCiAgZ19xc2F2ZV9zdGFjayA9IE5VTEw7CgogIC8qIGluaXQgcXNhdmVfbWFya2luZyBzdGFjayAqLwogIGdfcXNhdmVfbWFya2luZ19zdGFjayA9IE5VTEw7CiAgZ19idWZmZXJfcG9zICAgPSAwOwogIC8qIGJ1ZmZlciBjb250YWlucyBlbXB0eSBzdHJpbmcgKi8KICBnX2J1ZmZlclswXSAgICA9ICdcMCc7CiAgLyogdHJ5IHRvIGNob3AgZW50aXJlIHN0cmVhbSBpZiBwb3NzaWJsZSEgT3JpZ2luYWxseTogRkFMU0U7ICovCiAgLyogdHVybiBvbiBidWZmZXJpbmcgb25seSBBRlRFUiBhIHNhdmUgcmVxdWVzdCAqLwogIGdfaW5fYnVmZmVyaW5nX21vZGUgID0gRkFMU0U7CiAgLyogdHJ5IHRvIGNob3AgZW50aXJlIHN0cmVhbSBpZiBwb3NzaWJsZSEgT3JpZ2luYWxseTogRkFMU0U7ICovCiAgLyogdHVybiBvbiBidWZmZXJpbmcgb25seSBBRlRFUiBhIHNhdmUgcmVxdWVzdCAqLwogIGdfaW5fYnVmZmVyaW5nX21vZGUgID0gVFJVRTsKCiAgLyogYnVtcCBwYWdlIG51bWJlciAqLwogICsrZ19wYWdlX2NvdW50OwogIGdfcGFnZV9vYmplY3RfbnVtICA9IFBERk9iamVjdF9OZXcoLyogaW5fZnAgKi8pOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkIFBERlBhZ2VfQ2xlYW51cChGSUxFKiBpbl9mcCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgQ2xlYW5zIHVwIHRoZSBwcm9jZXNzaW5nIGFmdGVyIGEgcGFnZSdzIGNvbnRlbnRzIGhhdmUgYmVlbiB3cml0dGVuIG91dC4gICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBQREZQYWdlX0NsZWFudXAoRklMRSogaW5fZnApCnsKICBCT09MRUFOIGhhc0Fubm90ID0gRkFMU0U7CgogIEFzc2VydChnX3FzYXZlX3N0YWNrID09IE5VTEwsIG5vX2Zwb3MpOwoKICAvKiBpZiBwYWdlIGhhcyBzb21lIGNvbnRlbnQgdGhlbiBjbG9zZSBpdHMgc3RyZWFtIG9iamVjdCAqLwogIGlmIChnX3BhZ2VfY29udGVudHNfb2JqX251bSAhPSAwKQogIHsKICAgIFBERl9GSUxFX09GRlNFVCBwYWdlX2xlbmd0aCA9IFBERlBhZ2VfRW5kKGluX2ZwKTsKCiNpZmRlZiBfQ0FMQ19MQVJHRVNUX1BBR0VfT0JKRUNUXwogICAgaWYgKHBhZ2VfbGVuZ3RoID4gZ19tYXhfcGFnZV9sZW5ndGgpCiAgICAgIGdfbWF4X3BhZ2VfbGVuZ3RoID0gcGFnZV9sZW5ndGg7CiNlbmRpZgoKICAgIC8qIHdyaXRlIHBhZ2UncyBsZW5ndGggb2JqZWN0ICovCiAgICBpZiAoZ19QREZfZGVidWcpCiAgICAgIGZwcmludGYoaW5fZnAsICIlJVxuJSUgbGVuZ3RoIG9iamVjdCBmb3IgcGFnZSAldTpcbiUlXG4iLCBnX3BhZ2VfY291bnQpOwoKICAgIFBERk9iamVjdF9Xcml0ZU9iaihpbl9mcCwgZ19wYWdlX2xlbmd0aF9vYmpfbnVtKTsKICAgIGZwcmludGYoaW5fZnAsICIldVxuZW5kb2JqXG4iLCBwYWdlX2xlbmd0aCk7CgogICAgLyogd3JpdGUgb3V0IGFueSB1c2VkIGZvbnQgcmVzb3VyY2VzICovCiAgICB7CiAgICAgIHRfZm9udF9saXN0X2VudHJ5X3B0ciBlbnRyeSA9IGdfZm9udF9saXN0OwogICAgICB3aGlsZSAoZW50cnkgIT0gTlVMTCkgewoJUERGRm9udF9Xcml0ZUZvbnRSZXNvdXJjZShpbl9mcCwgZW50cnkpOwoJZW50cnkgPSBlbnRyeS0+bV9uZXh0X2ZvbnRfZW50cnk7CiAgICAgIH0KICAgIH0KICB9CgogIC8qIHdyaXRlIG91dCBhbm5vdGF0aW9ucyAqLwogIHsKICAgIHRfc291cmNlX2Fubm90X2VudHJ5X3B0ciBzb3VyY2UgPSBnX3NvdXJjZV9hbm5vdF9saXN0OwoKICAgIHdoaWxlIChzb3VyY2UgIT0gTlVMTCkKICAgIHsKICAgICAgaWYgKHNvdXJjZS0+bV90aGlzX3BhZ2Vfb2JqZWN0X251bSA9PSBnX3BhZ2Vfb2JqZWN0X251bSkKICAgICAgewoKCS8qIGV2ZW4gaWYgdGhlIGFubm90YXRpb24ocykgY2Fubm90IGJlIHdyaXR0ZW4gb3V0IG5vdywgZmxhZyB0aGUgKi8KCS8qIGZhY3QgdGhhdCB0aGlzIHBhZ2UgaGFzIGFubm90YXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCWhhc0Fubm90ID0gVFJVRTsKCgkvKiBhdHRlbXB0IHRvIHdyaXRlIG91dCBhbm5vdGF0aW9uICovCglQREZTb3VyY2VBbm5vdF9Xcml0ZShpbl9mcCwgc291cmNlKTsKICAgICAgfSAvKiBpZiBhbm5vdCBlbnRyeSBiZWxvbmdzIHRvIHRoaXMgcGFnZSAqLwogICAgICBzb3VyY2UgPSBzb3VyY2UtPm1fbmV4dF9lbnRyeTsKICAgIH0gLyogd2hpbGUgKi8KICB9CgogIC8qIHN0YXJ0IHdyaXRpbmcgcGFnZSBvYmplY3QgKCIvVHlwZSAvUGFnZSIpOyByZW1lbWJlciBpdHMgbnVtYmVyICovCiAgewogICAgdW5zaWduZWQgaW50IHdhbnRlZF9ibG9ja19udW0gPSAoZ19wYWdlX2NvdW50IC0gMSkgLyBrTnVtYmVyT2ZQYWdlc1BlckJsb2NrOwogICAgdW5zaWduZWQgaW50IGJsb2NrX3BvcyA9IChnX3BhZ2VfY291bnQgLSAxKSAlIGtOdW1iZXJPZlBhZ2VzUGVyQmxvY2s7CiAgICB0X3BhZ2VfYmxvY2tfcHRyIHRoZV9ibG9jayA9IGdfY3VyX3BhZ2VfYmxvY2s7CgogICAgLyogaWYgZmlyc3Qgb2JqIGluIGEgYmxvY2sgdGhlbiBhbGxvY2F0ZSB0aGUgYmxvY2sgKi8KICAgIGlmIChibG9ja19wb3MgPT0gMCkKICAgIHsKICAgICAgdGhlX2Jsb2NrID0gKHRfcGFnZV9ibG9ja19wdHIpIG1hbGxvYyhzaXplb2YodF9wYWdlX2Jsb2NrKSk7CiAgICAgIGlmICh0aGVfYmxvY2sgPT0gTlVMTCkKICAgICAgICBFcnJvcig0OCwgMzgsICJQREZQYWdlX0NsZWFudXA6IHJ1biBvdXQgb2YgbWVtb3J5IiwgRkFUQUwsIG5vX2Zwb3MpOwogICAgICBpZiAod2FudGVkX2Jsb2NrX251bSA9PSAwKQkvKiBpZiBmaXJzdCBibG9jayBpbiBmaWxlICovCiAgICAgIHsKCUFzc2VydChnX3BhZ2VfYmxvY2tfbGlzdCA9PSBOVUxMLCBub19mcG9zKTsKCWdfcGFnZV9ibG9ja19saXN0ID0gdGhlX2Jsb2NrOwogICAgICB9CiAgICAgIGVsc2UKICAgICAgewoJQXNzZXJ0KGdfY3VyX3BhZ2VfYmxvY2sgIT0gTlVMTCwgbm9fZnBvcyk7CglnX2N1cl9wYWdlX2Jsb2NrLT5tX25leHRfYmxvY2sgPSB0aGVfYmxvY2s7CiAgICAgIH0KICAgICAgdGhlX2Jsb2NrLT5tX25leHRfYmxvY2sgPSBOVUxMOwkvKiBkb24ndCBmb3JnZXQgdG8gaW5pdCB0aGlzISAqLwogICAgICBnX2N1cl9wYWdlX2Jsb2NrID0gdGhlX2Jsb2NrOwogICAgfQogICAgZWxzZQogICAgewogICAgICBBc3NlcnQodGhlX2Jsb2NrICE9IE5VTEwsIG5vX2Zwb3MpOwogICAgfQoKICAgIC8qIHNhdmUgb2JqZWN0IG51bWJlciBvZiB0aGlzIHBhZ2UgZm9yIGxhdGVyIHVzZSBpbiB0aGUgL1BhZ2VzIGxpc3QgKi8KICAgIGlmIChnX1BERl9kZWJ1ZykKICAgICAgZnByaW50Zihpbl9mcCwgIiUlXG4lJSBwYWdlIG51bWJlciAldTpcbiUlXG4iLCBnX3BhZ2VfY291bnQpOwogICAgdGhlX2Jsb2NrLT5tX2Jsb2NrW2Jsb2NrX3Bvc10gPSBnX3BhZ2Vfb2JqZWN0X251bTsKICAgIFBERk9iamVjdF9Xcml0ZU9iaihpbl9mcCwgZ19wYWdlX29iamVjdF9udW0pOwogICAgLyogUERGT2JqZWN0X1dyaXRlTmV3T2JqKGluX2ZwKTsgKi8KICB9CgogIC8qIHdyaXRlIG91dCAvUGFnZSBJRCAqLwogIGZwdXRzKCI8PFxuL1R5cGUgL1BhZ2VcbiIsIGluX2ZwKTsKCiAgLyogd3JpdGUgb3V0IHBhZ2Ugc2l6ZSBhbmQgb3JpZW50YXRpb24gKi8KICBmcHJpbnRmKGluX2ZwLCAiL0Nyb3BCb3ggWyAwIDAgJXUgJXUgXVxuIixnX2RvY19oX2JvdW5kLGdfZG9jX3ZfYm91bmQpOwoKICAvKiB3cml0ZSBvdXQgcGFyZW50IG9iamVjdCByZWYgKi8KICBmcHV0cygiL1BhcmVudCAiLCBpbl9mcCk7CiAgUERGT2JqZWN0X1dyaXRlUmVmKGluX2ZwLCBnX3BhZ2VzX3Jvb3QpOwogIGZwdXRzKCJcbiIsIGluX2ZwKTsKCiAgLyogd3JpdGUgb3V0IGNvbnRlbnRzIG9iamVjdCByZWYgKGlmIGl0IGV4aXN0cykgKi8KICBpZiAoZ19wYWdlX2NvbnRlbnRzX29ial9udW0gIT0gMCkKICB7CiAgICBmcHV0cygiL0NvbnRlbnRzICIsIGluX2ZwKTsKICAgIFBERk9iamVjdF9Xcml0ZVJlZihpbl9mcCwgZ19wYWdlX2NvbnRlbnRzX29ial9udW0pOwogICAgZnB1dHMoIlxuIiwgaW5fZnApOwogIH0KCiAgLyogb3BlbiByZXNvdXJjZXMgZGljdGlvbmFyeSAqLwogIGlmIChnX3BhZ2VfdXNlc19mb250cyB8fCBnX3BhZ2VfaGFzX3RleHQgfHwgZ19wYWdlX2hhc19ncmFwaGljcykKICAgIGZwdXRzKCIvUmVzb3VyY2VzXG48PFxuIiwgaW5fZnApOwoKICAvKiB3cml0ZSBvdXQgZm9udCByZXNvdXJjZXMgdXNlZCAqLwogIGlmIChnX3BhZ2VfdXNlc19mb250cykKICB7CiAgICB0X2ZvbnRfbGlzdF9lbnRyeV9wdHIgZW50cnkgPSBnX2ZvbnRfbGlzdDsKICAgIGZwdXRzKCIvRm9udCA8PCIsIGluX2ZwKTsKICAgIHdoaWxlIChlbnRyeSAhPSBOVUxMKSB7CiAgICAgIGlmIChlbnRyeS0+bV9pbl91c2UpIHsKCWZwcmludGYoaW5fZnAsICIgJXMgIiwgZW50cnktPm1fUERGX2ZvbnRfbmFtZSk7CglQREZGb250X1dyaXRlT2JqZWN0UmVmKGluX2ZwLCBlbnRyeSk7CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS0+bV9uZXh0X2ZvbnRfZW50cnk7CiAgICB9CiAgICBmcHV0cygiID4+XG4iLCBpbl9mcCk7CiAgfQoKICAvKiB3cml0ZSBvdXQgYW55IHByb2NzZXRzIHVzZWQgKi8KICBpZiAoZ19wYWdlX2hhc190ZXh0IHx8IGdfcGFnZV9oYXNfZ3JhcGhpY3MpCiAgewogICAgZnB1dHMoIi9Qcm9jU2V0IFsgL1BERiIsIGluX2ZwKTsKICAgIGlmIChnX3BhZ2VfaGFzX3RleHQpCiAgICAgIGZwdXRzKCIgL1RleHQiLCBpbl9mcCk7CiAgICBmcHV0cygiIF1cbiIsIGluX2ZwKTsKICB9CgogIC8qIGNsb3NlIHJlc291cmNlcyBkaWN0aW9uYXJ5ICovCiAgaWYgKGdfcGFnZV91c2VzX2ZvbnRzIHx8IGdfcGFnZV9oYXNfdGV4dCB8fCBnX3BhZ2VfaGFzX2dyYXBoaWNzKQogICAgZnB1dHMoIj4+XG4iLCBpbl9mcCk7CgogIC8qIHdyaXRlIG91dCBhbm5vdCBhcnJheSAqLwogIGlmIChoYXNBbm5vdCkKICB7CiAgICB0X3NvdXJjZV9hbm5vdF9lbnRyeV9wdHIgZW50cnkgPSBnX3NvdXJjZV9hbm5vdF9saXN0OwogICAgdF9zb3VyY2VfYW5ub3RfZW50cnlfcHRyIHByZXZpb3VzX2VudHJ5ID0gTlVMTDsKCiAgICAvKiB3cml0ZSBvdXQgYW5ub3RhdGlvbnMgKi8KICAgIGZwdXRzKCIvQW5ub3RzIFsiLCBpbl9mcCk7CiAgICB3aGlsZSAoZW50cnkgIT0gTlVMTCkKICAgIHsKICAgICAgaWYgKGVudHJ5LT5tX3RoaXNfcGFnZV9vYmplY3RfbnVtID09IGdfcGFnZV9vYmplY3RfbnVtKQogICAgICB7CglmcHV0cygiICIsIGluX2ZwKTsKCVBERk9iamVjdF9Xcml0ZVJlZihpbl9mcCwgZW50cnktPm1fdGhpc19vYmplY3RfbnVtKTsKCgkvKiBpZiB0aGUgYW5ub3RhdGlvbiBoYXMganVzdCBiZWVuIHdyaXR0ZW4gb3V0IGFib3ZlIHRoZW4gZGVsZXRlIGl0ICovCglpZiAoZW50cnktPm1fd3JpdHRlbl90b19QREZfZmlsZSkKCXsKCSAgdF9zb3VyY2VfYW5ub3RfZW50cnlfcHRyIG5leHRfZW50cnkgPSBlbnRyeS0+bV9uZXh0X2VudHJ5OwoJICBpZiAoZ19zb3VyY2VfYW5ub3RfbGlzdCA9PSBlbnRyeSkKCQlnX3NvdXJjZV9hbm5vdF9saXN0ID0gbmV4dF9lbnRyeTsKCSAgaWYgKHByZXZpb3VzX2VudHJ5ICE9IE5VTEwpCgkJcHJldmlvdXNfZW50cnktPm1fbmV4dF9lbnRyeSA9IG5leHRfZW50cnk7CgkgIFBERlNvdXJjZUFubm90X0Rpc3Bvc2UoZW50cnkpOwoJICBlbnRyeSA9IG5leHRfZW50cnk7Cgl9CgllbHNlIC8qIGFubm90IGlzIGEgZndkIHJlZmVycmluZyBvbmU6IGRlZmVyIGRlbGV0aW5nIGl0ICovCgl7CgkgIHByZXZpb3VzX2VudHJ5ID0gZW50cnk7CgkgIGVudHJ5ID0gZW50cnktPm1fbmV4dF9lbnRyeTsKCX0KICAgICAgfSAvKiBpZiBhbm5vdCBlbnRyeSBiZWxvbmdzIHRvIHRoaXMgcGFnZSAqLwogICAgICBlbHNlIC8qIGFubm90IGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIHBhZ2U7IHNraXAgaXQgKi8KICAgICAgewoJcHJldmlvdXNfZW50cnkgPSBlbnRyeTsKCWVudHJ5ID0gZW50cnktPm1fbmV4dF9lbnRyeTsKICAgICAgfQogICAgfSAvKiB3aGlsZSAqLwogICAgZnB1dHMoIiBdXG4iLCBpbl9mcCk7CiAgfSAvKiBpZiAqLwoKICAvKiBjbG9zZSBvYmplY3QgKi8KICBmcHV0cygiPj5cbmVuZG9ialxuIiwgaW5fZnApOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICB2b2lkIFBERkZpbGVfSW5pdChGSUxFKiBpbl9mcCwgaW50IGluX2hfYm91bmQsIGludCBpbl92X2JvdW5kKSAgICAgICAgICAgKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgSW5pdGlhbGl6ZSB0aGlzIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKdm9pZCBQREZGaWxlX0luaXQoRklMRSogaW5fZnAsIGludCBpbl9oX2JvdW5kLCBpbnQgaW5fdl9ib3VuZCwKICBpbnQgaW5fSU4sIGludCBpbl9DTSwgaW50IGluX1BULCBpbnQgaW5fRU0pCnsKICAvKiB3cml0ZSBQREYgaGVhZGVyICovCiAgZnB1dHMoIiVQREYtMS4yXG4iLCBpbl9mcCk7CQkJLyogaWRlbnRpZmllcyB0aGlzIGFzIFBERiAgICovCiAgZnB1dHMoIlwwNDVcMzQyXDM0M1wzMTdcMzIzXG4iLCBpbl9mcCk7CS8qIDB4MjUgMHhFMiAweEUzIDB4Q0YgMHhEMyAqLwoKICAvKiBzZXQgZGVidWdnaW5nIHN0YXR1cyAqLwojaWYgREVCVUdfT04KICBnX1BERl9kZWJ1ZyA9IGRiZ1tEUERdLm9uW0RdIHx8IGRiZ1tEUERdLm9uW0REXSB8fCBkYmdbRFBEXS5vbltERERdOwojZWxzZQogIGdfUERGX2RlYnVnID0gRkFMU0U7CiNlbmRpZgoKI2lmIFBERl9DT01QUkVTU0lPTgogIGdfYXBwbHlfY29tcHJlc3Npb24gPSAhZ19QREZfZGVidWc7CiNlbmRpZgoKICAvKiBvYmplY3RzICovCiAgZ19uZXh0X29iam51bSA9IDE7IC8qIG9iamVjdCBudW1iZXJzIHN0YXJ0IGF0IG9uZSAqLwogIGdfb2JqX29mZnNldF9saXN0ID0gTlVMTDsKICBnX2N1cl9vYmpfb2Zmc2V0X2Jsb2NrID0gTlVMTDsKCiAgLyogZm9udHMgKi8KICBnX2ZvbnRfbGlzdCA9IE5VTEw7CiAgZ19mb250X2VuY29kaW5nX2xpc3QgPSBOVUxMOwoKICAvKiBwYWdlcyAqLwogIGdfcGFnZV9jb3VudCA9IDA7CiAgZ19wYWdlX2Jsb2NrX2xpc3QgPSBOVUxMOwogIGdfY3VyX3BhZ2VfYmxvY2sgPSBOVUxMOwogIGdfcGFnZXNfcm9vdCA9IFBERk9iamVjdF9OZXcoLyogaW5fZnAgKi8pOwoKICAvKiBkb2MgKi8KICBnX2RvY19oX2JvdW5kID0gaW5faF9ib3VuZDsKICBnX2RvY192X2JvdW5kID0gaW5fdl9ib3VuZDsKICBnX2RvY19hdXRob3IgPSBOVUxMOwogIGdfZG9jX3RpdGxlID0gTlVMTDsKICBnX2RvY19zdWJqZWN0ID0gTlVMTDsKICBnX2RvY19rZXl3b3JkcyA9IE5VTEw7CgogIC8qIGxpbmsgYW5ub3RhdGlvbnMgKi8KICBnX3RhcmdldF9hbm5vdF9saXN0ID0gTlVMTDsKICBnX2hhc19leHBvcnRlZF90YXJnZXRzID0gRkFMU0U7CiAgZ19zb3VyY2VfYW5ub3RfbGlzdCA9IE5VTEw7CgogIC8qIHVuaXRzICovCiAgZ191bml0c1trX2luXSA9IGluX0lOOwogIGdfdW5pdHNba19jbV0gPSBpbl9DTTsKICBnX3VuaXRzW2tfcHRdID0gaW5fUFQ7CiAgZ191bml0c1trX2VtXSA9IGluX0VNOwoKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCBQREZGaWxlX1dyaXRlUGFnZXNPYmplY3QoRklMRSogaW5fZnApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIENsZWFucyB1cCBwcm9jZXNzaW5nIGFmdGVyIGFsbCBwYWdlcyBoYXMgYmVlbiB3cml0dGVuIG91dC4gICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyB2b2lkIFBERkZpbGVfV3JpdGVQYWdlc09iamVjdChGSUxFKiBpbl9mcCkKewogIHVuc2lnbmVkIGludCAgaTsKICB0X3BhZ2VfYmxvY2tfcHRyIHRoZV9ibG9jayAgPSBnX3BhZ2VfYmxvY2tfbGlzdDsKCiAgaWYgKGdfUERGX2RlYnVnKQogICAgZnByaW50Zihpbl9mcCwgIiUlXG4lJSByb290IG9mIHBhZ2VzIHRyZWU6XG4lJVxuIik7CgogIC8qIHdyaXRlIG91dCB0aGUgcm9vdCBvZiB0aGUgUGFnZXMgdHJlZSAqLwogIFBERk9iamVjdF9Xcml0ZU9iaihpbl9mcCwgZ19wYWdlc19yb290KTsKICBmcHV0cygiPDxcbiIsIGluX2ZwKTsKICBmcHV0cygiL1R5cGUgL1BhZ2VzXG4iLCBpbl9mcCk7CiAgZnB1dHMoIi9LaWRzIFsgIiwgaW5fZnApOwogIGZvciAoaSA9IDA7IGkgPCBnX3BhZ2VfY291bnQ7IGkrKykKICB7CiAgICBpbnQgYmxvY2tfcG9zID0gaSAlIGtOdW1iZXJPZlBhZ2VzUGVyQmxvY2s7CiAgICBQREZPYmplY3RfV3JpdGVSZWYoaW5fZnAsIHRoZV9ibG9jay0+bV9ibG9ja1tibG9ja19wb3NdKTsKICAgIGlmIChibG9ja19wb3MgPT0gKGtOdW1iZXJPZlBhZ2VzUGVyQmxvY2sgLSAxKSkKICAgIHsKICAgICAgdGhlX2Jsb2NrID0gdGhlX2Jsb2NrLT5tX25leHRfYmxvY2s7CiAgICAgIC8qIEFzc2VydCh0aGVfYmxvY2sgIT0gTlVMTCwgbm9fZnBvcyk7ICBub3QgYWx3YXlzIHRydWUhICovCiAgICB9CiAgICBmcHV0cygiICIsIGluX2ZwKTsKICB9CiAgZnByaW50Zihpbl9mcCwgIiBdXG4vQ291bnQgJXVcbiIsIGdfcGFnZV9jb3VudCk7CiAgLyogKioqCiAgZnByaW50Zihpbl9mcCwgIi9NZWRpYUJveCBbIDAgMCA2MTIgNzkyIF1cbiIpOwogIGZwcmludGYoaW5fZnAsICIvTWVkaWFCb3ggWyAwIDAgJXUgJXUgXVxuIixnX2RvY19oX2JvdW5kLGdfZG9jX3ZfYm91bmQpOwogICoqKiAqLwogIGZwcmludGYoaW5fZnAsICIvTWVkaWFCb3ggWyAwIDAgJXUgJXUgXVxuIiwgZ19kb2NfaF9ib3VuZCwgZ19kb2Nfdl9ib3VuZCk7CiAgZnB1dHMoIj4+XG5lbmRvYmpcbiIsIGluX2ZwKTsKfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgUERGX0ZJTEVfT0ZGU0VUIFBERkZpbGVfV3JpdGVYUkVGKEZJTEUqIGluX2ZwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIFdyaXRlcyBvdXQgdGhlIFhSRUYgdGFibGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnN0YXRpYyBQREZfRklMRV9PRkZTRVQgUERGRmlsZV9Xcml0ZVhSRUYoRklMRSogaW5fZnApCnsKICBpbnQgaTsKICBQREZfRklMRV9PRkZTRVQgeHJlZl9zdGFydDsKICB0X29mZnNldF9ibG9ja19wdHIgdGhlX2Jsb2NrID0gZ19vYmpfb2Zmc2V0X2xpc3Q7CgogIGlmIChnX1BERl9kZWJ1ZykKICAgIGZwcmludGYoaW5fZnAsICIlJVxuJSUgeHJlZiB0YWJsZTpcbiUlXG4iKTsKCiAgeHJlZl9zdGFydCA9IGZ0ZWxsKGluX2ZwKTsKICBmcHV0cygieHJlZlxuIiwgaW5fZnApOwogIGZwcmludGYoaW5fZnAsICIwICV1XG4iLCBnX25leHRfb2JqbnVtKTsKICBmcHV0cygiMDAwMDAwMDAwMCA2NTUzNSBmIFxuIiwgaW5fZnApOwkvKiBvYmplY3QgMCBpcyBhIGRlbGV0ZWQgb2JqICovCiAgQXNzZXJ0KCAoZ19uZXh0X29iam51bSA9PSAxKSB8fCAodGhlX2Jsb2NrICE9IE5VTEwpLCBub19mcG9zKTsKICBmb3IgKGkgPSAxOyBpIDwgZ19uZXh0X29iam51bTsgaSsrKQkvKiB3cml0ZSBvdXQgbGlzdCBvZiBvYmplY3Qgb2Zmc2V0cyAqLwogIHsKICAgIGludCBibG9ja19wb3MgPSAoaSAtIDEpICUga051bWJlck9mT2JqZWN0c1BlckJsb2NrOwoKICAgIC8qIGFsd2F5cyB3cml0ZSBhbiBlbnRyeSAoZXZlbiBpZiB0aGUgb2JqZWN0IGRvZXNuJ3QgZXhpc3QpICovCiAgICBmcHJpbnRmKGluX2ZwLCAiJTAxMHUgMDAwMDAgbiBcbiIsIHRoZV9ibG9jay0+bV9ibG9ja1tibG9ja19wb3NdKTsKCiAgICBpZiAodGhlX2Jsb2NrLT5tX2Jsb2NrW2Jsb2NrX3Bvc10gPT0gMCkKICAgIHsKICAgICAgdF90ZW1wYnVmIHN0cjsKCiAgICAgIHN0cmNweShzdHIsICJQREZGaWxlX1dyaXRlWFJFRjogdW5kZWZpbmVkIG9iamVjdCBudW1iZXI6ICIpOwogICAgICBzcHJpbnRmKHN0ciArIHN0cmxlbihzdHIpLCAiJXUiLCBpKTsKICAgICAgRXJyb3IoNDgsIDM5LCAiJXMiLCBXQVJOLCBub19mcG9zLCBzdHIpOwogICAgfQoKICAgIGlmIChibG9ja19wb3MgPT0gKGtOdW1iZXJPZk9iamVjdHNQZXJCbG9jayAtIDEpKQogICAgewogICAgICB0aGVfYmxvY2sgPSB0aGVfYmxvY2stPm1fbmV4dF9ibG9jazsKICAgICAgLyogQXNzZXJ0KHRoZV9ibG9jayAhPSBOVUxMLCBub19mcG9zKTsgIG5vdCBhbHdheXMgdHJ1ZSEgKi8KICAgIH0KICB9CiAgcmV0dXJuIHhyZWZfc3RhcnQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiAgdm9pZCBQREZGaWxlX0NsZWFudXAoRklMRSogaW5fZnApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLyogIENsZWFucyB1cCBwcm9jZXNzaW5nIGFmdGVyIGFsbCBwYWdlcyBoYXMgYmVlbiB3cml0dGVuIG91dC4gICAgICAgICAgICAgICAqLwovKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCnZvaWQgUERGRmlsZV9DbGVhbnVwKEZJTEUqIGluX2ZwKQp7CiAgUERGX0ZJTEVfT0ZGU0VUIHhyZWZfc3RhcnQ7CS8qIGZpbGUgb2Zmc2V0IG9mIHN0YXJ0IG9mIHhyZWYgdGFibGUgKi8KICBQREZfT0JKRUNUX05VTSBjYXRhbG9nX29ial9udW07CiAgUERGX09CSkVDVF9OVU0gaW5mb19vYmpfbnVtOwogIFBERl9PQkpFQ1RfTlVNIGRlc3RzX29ial9udW07CgogIC8qIHdyaXRlIG91dCBhbnkgdW5yZXNvbHZlZCBsaW5rIGFubm90YXRpb25zLiAgVGhpcyBjb3VsZCBiZSBkb25lIGVhcmxpZXIgICovCiAgLyogKGluIGZhY3QsIGl0IGNhbiBiZSBkb25lIGFzIGVhY2ggbmV3IHRhcmdldCBpcyBkZWZpbmVkKSBidXQgSSd2ZSAgICAgICAgKi8KICAvKiBhcmJpdHJhcmlseSBkZWNpZGVkIHRvIGRvIGl0IGhlcmUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogIHsKICAgIHRfc291cmNlX2Fubm90X2VudHJ5X3B0ciBzb3VyY2UgPSBnX3NvdXJjZV9hbm5vdF9saXN0OwoKICAgIHdoaWxlIChzb3VyY2UgIT0gTlVMTCkKICAgIHsKICAgICAgdF90YXJnZXRfYW5ub3RfZW50cnlfcHRyIHRhcmdldDsKCiAgICAgIEFzc2VydChzb3VyY2UtPm1fdGFyZ2V0ID09IE5VTEwsIG5vX2Zwb3MpOwogICAgICB0YXJnZXQgPSBQREZUYXJnZXRBbm5vdF9GaW5kKHNvdXJjZS0+bV9uYW1lKTsKICAgICAgaWYgKHRhcmdldCAhPSBOVUxMKQogICAgICB7Cglzb3VyY2UtPm1fdGFyZ2V0ID0gdGFyZ2V0OwoJUERGU291cmNlQW5ub3RfV3JpdGUoaW5fZnAsIHNvdXJjZSk7CiAgICAgIH0KICAgICAgc291cmNlID0gc291cmNlLT5tX25leHRfZW50cnk7CiAgICB9CiAgfQoKICAvKiB3cml0ZSBvdXQgcGFnZXMgb2JqZWN0ICovCiAgUERGRmlsZV9Xcml0ZVBhZ2VzT2JqZWN0KGluX2ZwKTsKCiAgLyogaWYgZmlsZSBoYXMgZXhwb3J0ZWQgdGFyZ2V0cyBmb3IgbGlua3MgdGhlbiB3cml0ZSBvdXQgL0Rlc3RzIGRpY3Rpb25hcnkgKi8KICBpZiAoZ19oYXNfZXhwb3J0ZWRfdGFyZ2V0cykKICB7CiAgICB0X3RhcmdldF9hbm5vdF9lbnRyeV9wdHIgZW50cnkgPSBnX3RhcmdldF9hbm5vdF9saXN0OwoKICAgIEFzc2VydChlbnRyeSAhPSBOVUxMLCBub19mcG9zKTsJLyogc2hvdWxkIGJlIGF0IGxlYXN0IGFuIGVudHJ5ISAqLwoKICAgIC8qIHdyaXRlIFBERiAxLjEgc3R5bGUgL0Rlc3RzIGRpY3Rpb25hcnkgKi8KICAgIGlmIChnX1BERl9kZWJ1ZykKICAgICAgZnByaW50Zihpbl9mcCwgIiUlXG4lJSAvRGVzdHMgZGljdGlvbmFyeSAoZXhwb3J0ZWQgbGlua3MpOlxuJSVcbiIpOwoKICAgIGRlc3RzX29ial9udW0gPSBQREZPYmplY3RfV3JpdGVOZXdPYmooaW5fZnApOwogICAgZnB1dHMoIjw8XG4iLCBpbl9mcCk7CgogICAgd2hpbGUgKGVudHJ5ICE9IE5VTEwpCiAgICB7CiAgICAgIGlmIChlbnRyeS0+bV9mb3JfZXhwb3J0KQogICAgICB7CglmcHJpbnRmKGluX2ZwLCAiLyVzIFsgIiwgZW50cnktPm1fbmFtZSk7CglQREZPYmplY3RfV3JpdGVSZWYoaW5fZnAsIGVudHJ5LT5tX3BhZ2Vfb2JqZWN0X251bSk7CglmcHJpbnRmKGluX2ZwLCAiIC9YWVogbnVsbCBudWxsIG51bGwgXVxuIik7CiAgICAgIH0KICAgICAgZW50cnkgPSBlbnRyeS0+bV9uZXh0X2VudHJ5OwogICAgfQogICAgZnB1dHMoIj4+XG5lbmRvYmpcbiIsIGluX2ZwKTsKICB9CgogIC8qIHdyaXRlIG91dCBjYXRhbG9nIG9iamVjdCAqLwogIGlmIChnX1BERl9kZWJ1ZykKICAgIGZwcmludGYoaW5fZnAsICIlJVxuJSUgY2F0YWxvZzpcbiUlXG4iKTsKCiAgY2F0YWxvZ19vYmpfbnVtID0gUERGT2JqZWN0X1dyaXRlTmV3T2JqKGluX2ZwKTsKICBmcHV0cygiPDxcbiIsIGluX2ZwKTsKICBmcHV0cygiL1R5cGUgL0NhdGFsb2dcbiIsIGluX2ZwKTsKICBmcHV0cygiL1BhZ2VzICIsIGluX2ZwKTsKICBQREZPYmplY3RfV3JpdGVSZWYoaW5fZnAsIGdfcGFnZXNfcm9vdCk7CiAgZnB1dHMoIlxuIiwgaW5fZnApOwoKICAvKiBpZiBmaWxlIGhhcyBleHBvcnRlZCB0YXJnZXRzIGZvciBsaW5rcyB0aGVuIHdyaXRlIG91dCBhIC9EZXN0IGRpY3Rpb25hcnkgKi8KICBpZiAoZ19oYXNfZXhwb3J0ZWRfdGFyZ2V0cykKICB7CiAgICBmcHV0cygiL0Rlc3RzICIsIGluX2ZwKTsKICAgIFBERk9iamVjdF9Xcml0ZVJlZihpbl9mcCwgZGVzdHNfb2JqX251bSk7CiAgICBmcHV0cygiXG4iLCBpbl9mcCk7CiAgfQoKICAvKiAqKioKICBmcHV0cygiL1BhZ2VNb2RlICIsIGluX2ZwKTsKICBzd2l0Y2ggKCkKICB7CiAgfQogIGZwdXRzKCJcbiIsIGluX2ZwKTsKICAqKiogKi8KCiAgZnB1dHMoIj4+XG5lbmRvYmpcbiIsIGluX2ZwKTsKCiAgLyogd3JpdGUgb3V0IGluZm8gb2JqZWN0ICovCiAgaWYgKGdfUERGX2RlYnVnKQogICAgZnByaW50Zihpbl9mcCwgIiUlXG4lJSBJbmZvIG9iamVjdDpcbiUlXG4iKTsKCiAgLyogKioqCiAgQXV0aG9yIHN0cmluZyAoT3B0aW9uYWwpIFRoZSBuYW1lIG9mIHRoZSBwZXJzb24gd2hvIGNyZWF0ZWQgdGhlIGRvY3VtZW50LgogIENyZWF0aW9uRGF0ZSBEYXRlIChPcHRpb25hbCkgVGhlIGRhdGUgdGhlIGRvY3VtZW50IHdhcyBjcmVhdGVkLgogIE1vZERhdGUgRGF0ZSAoT3B0aW9uYWwpIFRoZSBkYXRlIHRoZSBkb2N1bWVudCB3YXMgbGFzdCBtb2RpZmllZC4KICBDcmVhdG9yIHN0cmluZyAoT3B0aW9uYWwpIElmIHRoZSBkb2N1bWVudCB3YXMgY29udmVydGVkIGludG8gYSBQREYgZG9jdW1lbnQgZnJvbSBhbm90aGVyCiAgZm9ybSwgdGhpcyBpcyB0aGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCBjcmVhdGVkIHRoZSBvcmlnaW5hbCBkb2N1bWVudC4KICBQcm9kdWNlciBzdHJpbmcgKE9wdGlvbmFsKSBUaGUgbmFtZSBvZiB0aGUgYXBwbGljYXRpb24gdGhhdCBjb252ZXJ0ZWQgdGhlIGRvY3VtZW50IGZyb20gaXRzIG5hdGl2ZQogIGZvcm1hdCB0byBQREYuCiAgVGl0bGUgc3RyaW5nIChPcHRpb25hbCkgVGhlIGRvY3VtZW501XMgdGl0bGUuCiAgU3ViamVjdCBzdHJpbmcgKE9wdGlvbmFsKSBUaGUgc3ViamVjdCBvZiB0aGUgZG9jdW1lbnQuCiAgS2V5d29yZHMgc3RyaW5nIChPcHRpb25hbCkgS2V5d29yZHMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkb2N1bWVudC4KCiAgZXhhbXBsZToKCiAgL0NyZWF0b3IgKEFkb2JlIElsbHVzdHJhdG9yKQogIC9DcmVhdGlvbkRhdGUgKEQ6MTk5MzAyMDQwODA2MDMtMDgnMDAnKQogIC9BdXRob3IgKFdlcm5lciBIZWlzZW5iZXJnKQogIC9Qcm9kdWNlciAoQWNyb2JhdCBOZXR3b3JrIERpc3RpbGxlciAxLjAgZm9yIE1hY2ludG9zaCkKICAqKiogKi8KCiAgaW5mb19vYmpfbnVtID0gUERGT2JqZWN0X1dyaXRlTmV3T2JqKGluX2ZwKTsKICBmcHV0cygiPDxcbiIsIGluX2ZwKTsKCiAgZnByaW50Zihpbl9mcCwgIi9DcmVhdG9yICglcylcbiIsIExPVVRfVkVSU0lPTik7CiAgZnByaW50Zihpbl9mcCwgIi9Qcm9kdWNlciAoJXMpXG4iLCBMT1VUX1ZFUlNJT04pOwoKICB7CiAgICB0aW1lX3Qgbm93OwogICAgc3RydWN0IHRtICpkYXRlOwoKICAgIC8qIEkgd2lsbCBwcmVzdW1lIHRoYXQgbG9jYWx0aW1lKCkgaXMgWTJLIGNvbXBsaWFudC4gIElmIGl0IGlzbid0ICAgICovCiAgICAvKiBvbiB5b3VyIHN5c3RlbSwgZmVlbCBmcmVlIHRvIHR3ZWFrIHRoaXMgY29kZS4gOi0pICAgICAgICAgICAgICAgICAqLwoKICAgIG5vdyA9IHRpbWUoIE5VTEwgKTsKICAgIGRhdGUgPSBsb2NhbHRpbWUoICZub3cgKTsKICAgIGZwcmludGYoaW5fZnAsICIvQ3JlYXRpb25EYXRlIChTb21ldGltZSBUb2RheSlcbiIpOwogIH0KCiAgaWYgKGdfZG9jX2F1dGhvciAhPSBOVUxMKQogICAgZnByaW50Zihpbl9mcCwgIi9BdXRob3IgKCVzKVxuIiwgZ19kb2NfYXV0aG9yKTsKCiAgaWYgKGdfZG9jX3RpdGxlICE9IE5VTEwpCiAgICBmcHJpbnRmKGluX2ZwLCAiL1RpdGxlICglcylcbiIsIGdfZG9jX3RpdGxlKTsKCiAgaWYgKGdfZG9jX3N1YmplY3QgIT0gTlVMTCkKICAgIGZwcmludGYoaW5fZnAsICIvU3ViamVjdCAoJXMpXG4iLCBnX2RvY19zdWJqZWN0KTsKCiAgaWYgKGdfZG9jX2tleXdvcmRzICE9IE5VTEwpCiAgICBmcHJpbnRmKGluX2ZwLCAiL0tleXdvcmRzICglcylcbiIsIGdfZG9jX2tleXdvcmRzKTsKCiAgZnB1dHMoIj4+XG5lbmRvYmpcbiIsIGluX2ZwKTsKCiAgLyogd3JpdGUgb3V0IHhyZWYgdGFibGUgKi8KICB4cmVmX3N0YXJ0ID0gUERGRmlsZV9Xcml0ZVhSRUYoaW5fZnApOwoKICAvKiB3cml0ZSBvdXQgdHJhaWxlciAqLwogIC8qICoqKiB1d2U6IGNvbW1lbnRzIGNhbiBhcHBlYXIgaW4gdGhlIGJvZHkgb25seS4KICBpZiAoZ19QREZfZGVidWcpCiAgICBmcHJpbnRmKGluX2ZwLCAiJSVcbiUlIHRyYWlsZXI6XG4lJVxuIik7CiAgKioqICovCgogIGZwdXRzKCJ0cmFpbGVyXG48PFxuIiwgaW5fZnApOwogIGZwcmludGYoaW5fZnAsICIvU2l6ZSAldVxuIiwgZ19uZXh0X29iam51bSk7CiAgZnB1dHMoIi9Sb290ICIsIGluX2ZwKTsKICBQREZPYmplY3RfV3JpdGVSZWYoaW5fZnAsIGNhdGFsb2dfb2JqX251bSk7CiAgZnB1dHMoIlxuL0luZm8gIiwgaW5fZnApOwogIFBERk9iamVjdF9Xcml0ZVJlZihpbl9mcCwgaW5mb19vYmpfbnVtKTsKCiAgZnByaW50Zihpbl9mcCwgIiA+Plxuc3RhcnR4cmVmXG4ldVxuIiwgeHJlZl9zdGFydCk7CiAgZnB1dHMoIiUlRU9GXG4iLCBpbl9mcCk7CgogIC8qIG1lbW9yeSBkZWFsbG9jYXRpb24gKG5vIG5lZWQgdG8gZGlzcG9zZSBvZiB0aGUgcXNhdmVfbWFya2luZ19zdGFjayAgKi8KICAvKiBiZWNhdXNlIGl0J3MgYWx3YXlzIGVtcHR5IGFmdGVyIGEgcGFnZSBoYXMgYmVlbiBwcm9jZXNzZWQpICAgICAgICAgICovCgogIHdoaWxlIChnX29ial9vZmZzZXRfbGlzdCAhPSBOVUxMKQogIHsKICAgIHRfb2Zmc2V0X2Jsb2NrX3B0ciB0aGVfYmxvY2sgPSBnX29ial9vZmZzZXRfbGlzdDsKICAgIGdfb2JqX29mZnNldF9saXN0ID0gdGhlX2Jsb2NrLT5tX25leHRfYmxvY2s7CiAgICBmcmVlKHRoZV9ibG9jayk7CiAgfQoKICB3aGlsZSAoZ19mb250X2VuY29kaW5nX2xpc3QgIT0gTlVMTCkKICB7CiAgICB0X2ZvbnRfZW5jb2RpbmdfZW50cnlfcHRyIHRoZV9ibG9jayA9IGdfZm9udF9lbmNvZGluZ19saXN0OwogICAgZ19mb250X2VuY29kaW5nX2xpc3QgPSB0aGVfYmxvY2stPm1fbmV4dF9lbnRyeTsKICAgIGZyZWUodGhlX2Jsb2NrLT5tX2ZvbnRfZW5jb2RpbmcpOwogICAgZnJlZSh0aGVfYmxvY2spOwogIH0KCiAgd2hpbGUgKGdfZm9udF9saXN0ICE9IE5VTEwpCiAgewogICAgdF9mb250X2xpc3RfZW50cnlfcHRyIHRoZV9ibG9jayA9IGdfZm9udF9saXN0OwogICAgZ19mb250X2xpc3QgPSB0aGVfYmxvY2stPm1fbmV4dF9mb250X2VudHJ5OwogICAgZnJlZSh0aGVfYmxvY2stPm1fUERGX2ZvbnRfbmFtZSk7CiAgICBmcmVlKHRoZV9ibG9jay0+bV9zaG9ydF9mb250X25hbWUpOwogICAgZnJlZSh0aGVfYmxvY2stPm1fYWN0dWFsX2ZvbnRfbmFtZSk7CiAgICBmcmVlKHRoZV9ibG9jayk7CiAgfQoKICB3aGlsZSAoZ19wYWdlX2Jsb2NrX2xpc3QgIT0gTlVMTCkKICB7CiAgICB0X3BhZ2VfYmxvY2tfcHRyIHRoZV9ibG9jayA9IGdfcGFnZV9ibG9ja19saXN0OwogICAgZ19wYWdlX2Jsb2NrX2xpc3QgPSB0aGVfYmxvY2stPm1fbmV4dF9ibG9jazsKICAgIGZyZWUodGhlX2Jsb2NrKTsKICB9CgogIHdoaWxlIChnX3NvdXJjZV9hbm5vdF9saXN0ICE9IE5VTEwpCiAgewogICAgdF9zb3VyY2VfYW5ub3RfZW50cnlfcHRyIGVudHJ5ID0gZ19zb3VyY2VfYW5ub3RfbGlzdDsKCiAgICBpZiAoZW50cnktPm1fdGFyZ2V0ID09IE5VTEwpCiAgICB7CiAgICAgIHRfdGVtcGJ1ZiBzdHI7CiAgICAgIHN0cmNweShzdHIsICJQREZGaWxlX0NsZWFudXA6IHVucmVzb2x2ZWQgbGluayBhbm5vdGF0aW9uIG5hbWVkICIpOwogICAgICBzdHJjYXQoc3RyLCAoY2hhciopIGVudHJ5LT5tX25hbWUpOwogICAgICBFcnJvcig0OCwgNDAsICIlcyIsIFdBUk4sIG5vX2Zwb3MsIHN0cik7CiAgICB9CgogICAgZ19zb3VyY2VfYW5ub3RfbGlzdCA9IFBERlNvdXJjZUFubm90X0Rpc3Bvc2UoZW50cnkpOwogIH0KCiAgd2hpbGUgKGdfdGFyZ2V0X2Fubm90X2xpc3QgIT0gTlVMTCkKICB7CiAgICB0X3RhcmdldF9hbm5vdF9lbnRyeV9wdHIgZW50cnkgPSBnX3RhcmdldF9hbm5vdF9saXN0OwogICAgZ190YXJnZXRfYW5ub3RfbGlzdCA9IGVudHJ5LT5tX25leHRfZW50cnk7CiAgICBmcmVlKGVudHJ5LT5tX25hbWUpOwogICAgZnJlZShlbnRyeSk7CiAgfQoKI2lmZGVmIF9DQUxDX0xBUkdFU1RfUEFHRV9PQkpFQ1RfCiAgLyogZGlzcGxheSBsYXJnZXN0IHBhZ2Ugb2JqZWN0ICovCiAgewogICAgdF90ZW1wYnVmIHN0cjsKICAgIC8qIEpLIHNwcmludGYoc3RyLCAiVGhlIGxhcmdlc3QgcGFnZSBvYmplY3QgaXMgJXUgYnl0ZXMgbG9uZy4iLCBnX21heF9wYWdlX2xlbmd0aCk7ICovCiAgICBFcnJvcig0OCwgNDEsICJUaGUgbGFyZ2VzdCBwYWdlIG9iamVjdCBpcyAldSBieXRlcyBsb25nLiIsIFdBUk4sIG5vX2Zwb3MsIGdfbWF4X3BhZ2VfbGVuZ3RoKTsKICB9CiNlbmRpZgp9Cg==