LyogSW1wbGVtZW50YXRpb24gb2YgdGhlIERBVEVfQU5EX1RJTUUgaW50cmluc2ljLgogICBDb3B5cmlnaHQgKEMpIDIwMDMsIDIwMDQsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIENvbnRyaWJ1dGVkIGJ5IFN0ZXZlbiBCb3NzY2hlci4KClRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgRm9ydHJhbiA5NSBydW50aW1lIGxpYnJhcnkgKGxpYmdmb3J0cmFuKS4KCkxpYmdmb3J0cmFuIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgptb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCnZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCkluIGFkZGl0aW9uIHRvIHRoZSBwZXJtaXNzaW9ucyBpbiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIHRoZQpGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMgeW91IHVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGxpbmsgdGhlCmNvbXBpbGVkIHZlcnNpb24gb2YgdGhpcyBmaWxlIGludG8gY29tYmluYXRpb25zIHdpdGggb3RoZXIgcHJvZ3JhbXMsCmFuZCB0byBkaXN0cmlidXRlIHRob3NlIGNvbWJpbmF0aW9ucyB3aXRob3V0IGFueSByZXN0cmljdGlvbiBjb21pbmcKZnJvbSB0aGUgdXNlIG9mIHRoaXMgZmlsZS4gIChUaGUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSByZXN0cmljdGlvbnMKZG8gYXBwbHkgaW4gb3RoZXIgcmVzcGVjdHM7IGZvciBleGFtcGxlLCB0aGV5IGNvdmVyIG1vZGlmaWNhdGlvbiBvZgp0aGUgZmlsZSwgYW5kIGRpc3RyaWJ1dGlvbiB3aGVuIG5vdCBsaW5rZWQgaW50byBhIGNvbWJpbmUKZXhlY3V0YWJsZS4pCgpMaWJnZm9ydHJhbiBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLApidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgpNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCkdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgpZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMKTGljZW5zZSBhbG9uZyB3aXRoIGxpYmdmb3J0cmFuOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwKd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLApCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlICJsaWJnZm9ydHJhbi5oIgoKI3VuZGVmIEhBVkVfTk9fREFURV9USU1FCiNpZiBUSU1FX1dJVEhfU1lTX1RJTUUKIyAgaW5jbHVkZSA8c3lzL3RpbWUuaD4KIyAgaW5jbHVkZSA8dGltZS5oPgojZWxzZQojICBpZiBIQVZFX1NZU19USU1FX0gKIyAgICBpbmNsdWRlIDxzeXMvdGltZS5oPgojICBlbHNlCiMgICAgaWZkZWYgSEFWRV9USU1FX0gKIyAgICAgIGluY2x1ZGUgPHRpbWUuaD4KIyAgICBlbHNlCiMgICAgICBkZWZpbmUgSEFWRV9OT19EQVRFX1RJTUUKIyAgICBlbmRpZiAgLyogSEFWRV9USU1FX0ggICovCiMgIGVuZGlmICAvKiBIQVZFX1NZU19USU1FX0ggICovCiNlbmRpZiAgLyogVElNRV9XSVRIX1NZU19USU1FICAqLwoKI2lmbmRlZiBhYnMKI2RlZmluZSBhYnMoeCkgKCh4KT49MCA/ICh4KSA6IC0oeCkpCiNlbmRpZgoKLyogREFURV9BTkRfVElNRSAoW0RBVEUsIFRJTUUsIFpPTkUsIFZBTFVFU10pCgogICBEZXNjcmlwdGlvbjogUmV0dXJucyBkYXRhIG9uIHRoZSByZWFsLXRpbWUgY2xvY2sgYW5kIGRhdGUgaW4gYSBmb3JtCiAgIGNvbXBhdGlibGUgd2l0aCB0aGUgcmVwcmVzZW50YXRpb25zIGRlZmluZWQgaW4gSVNPIDg2MDE6MTk4OC4KCiAgIENsYXNzOiBOb24tZWxlbWVudGFsIHN1YnJvdXRpbmUuCgogICBBcmd1bWVudHM6CgogICBEQVRFIChvcHRpb25hbCkgc2hhbGwgYmUgc2NhbGFyIGFuZCBvZiB0eXBlIGRlZmF1bHQgY2hhcmFjdGVyLCBhbmQKICAgc2hhbGwgYmUgb2YgbGVuZ3RoIGF0IGxlYXN0IDggaW4gb3JkZXIgdG8gY29udGFpbiB0aGUgY29tcGxldGUKICAgdmFsdWUuIEl0IGlzIGFuIElOVEVOVChPVVQpIGFyZ3VtZW50LiBJdHMgbGVmdG1vc3QgOCBjaGFyYWN0ZXJzCiAgIGFyZSBhc3NpZ25lZCBhIHZhbHVlIG9mIHRoZSBmb3JtIENDWVlNTURELCB3aGVyZSBDQyBpcyB0aGUgY2VudHVyeSwKICAgWVkgdGhlIHllYXIgd2l0aGluIHRoZSBjZW50dXJ5LCBNTSB0aGUgbW9udGggd2l0aGluIHRoZSB5ZWFyLCBhbmQKICAgREQgdGhlIGRheSB3aXRoaW4gdGhlIG1vbnRoLiBJZiB0aGVyZSBpcyBubyBkYXRlIGF2YWlsYWJsZSwgdGhleQogICBhcmUgYXNzaWduZWQgYmxhbmtzLgoKICAgVElNRSAob3B0aW9uYWwpIHNoYWxsIGJlIHNjYWxhciBhbmQgb2YgdHlwZSBkZWZhdWx0IGNoYXJhY3RlciwgYW5kCiAgIHNoYWxsIGJlIG9mIGxlbmd0aCBhdCBsZWFzdCAxMCBpbiBvcmRlciB0byBjb250YWluIHRoZSBjb21wbGV0ZQogICB2YWx1ZS4gSXQgaXMgYW4gSU5URU5UKE9VVCkgYXJndW1lbnQuIEl0cyBsZWZ0bW9zdCAxMCBjaGFyYWN0ZXJzCiAgIGFyZSBhc3NpZ25lZCBhIHZhbHVlIG9mIHRoZSBmb3JtIGhobW1zcy5zc3MsIHdoZXJlIGhoIGlzIHRoZSBob3VyCiAgIG9mIHRoZSBkYXksIG1tIGlzIHRoZSBtaW51dGVzIG9mIHRoZSBob3VyLCBhbmQgc3Muc3NzIGlzIHRoZQogICBzZWNvbmRzIGFuZCBtaWxsaXNlY29uZHMgb2YgdGhlIG1pbnV0ZS4gSWYgdGhlcmUgaXMgbm8gY2xvY2sKICAgYXZhaWxhYmxlLCB0aGV5IGFyZSBhc3NpZ25lZCBibGFua3MuCgogICBaT05FIChvcHRpb25hbCkgc2hhbGwgYmUgc2NhbGFyIGFuZCBvZiB0eXBlIGRlZmF1bHQgY2hhcmFjdGVyLCBhbmQKICAgc2hhbGwgYmUgb2YgbGVuZ3RoIGF0IGxlYXN0IDUgaW4gb3JkZXIgdG8gY29udGFpbiB0aGUgY29tcGxldGUKICAgdmFsdWUuIEl0IGlzIGFuIElOVEVOVChPVVQpIGFyZ3VtZW50LiBJdHMgbGVmdG1vc3QgNSBjaGFyYWN0ZXJzCiAgIGFyZSBhc3NpZ25lZCBhIHZhbHVlIG9mIHRoZSBmb3JtILFoaG1tLCB3aGVyZSBoaCBhbmQgbW0gYXJlIHRoZQogICB0aW1lIGRpZmZlcmVuY2Ugd2l0aCByZXNwZWN0IHRvIENvb3JkaW5hdGVkIFVuaXZlcnNhbCBUaW1lIChVVEMpIGluCiAgIGhvdXJzIGFuZCBwYXJ0cyBvZiBhbiBob3VyIGV4cHJlc3NlZCBpbiBtaW51dGVzLCByZXNwZWN0aXZlbHkuIElmCiAgIHRoZXJlIGlzIG5vIGNsb2NrIGF2YWlsYWJsZSwgdGhleSBhcmUgYXNzaWduZWQgYmxhbmtzLgoKICAgVkFMVUVTIChvcHRpb25hbCkgc2hhbGwgYmUgb2YgdHlwZSBkZWZhdWx0IGludGVnZXIgYW5kIG9mIHJhbmsKICAgb25lLiBJdCBpcyBhbiBJTlRFTlQoT1VUKSBhcmd1bWVudC4gSXRzIHNpemUgc2hhbGwgYmUgYXQgbGVhc3QKICAgOC4gVGhlIHZhbHVlcyByZXR1cm5lZCBpbiBWQUxVRVMgYXJlIGFzIGZvbGxvd3M6CgogICAgICBWQUxVRVMoMSkgdGhlIHllYXIgKGZvciBleGFtcGxlLCAyMDAzKSwgb3IgLUhVR0UoMCkgaWYgdGhlcmUgaXMKICAgICAgbm8gZGF0ZSBhdmFpbGFibGU7CgogICAgICBWQUxVRVMoMikgdGhlIG1vbnRoIG9mIHRoZSB5ZWFyLCBvciAtSFVHRSgwKSBpZiB0aGVyZQogICAgICBpcyBubyBkYXRlIGF2YWlsYWJsZTsKCiAgICAgIFZBTFVFUygzKSB0aGUgZGF5IG9mIHRoZSBtb250aCwgb3IgLUhVR0UoMCkgaWYgdGhlcmUgaXMgbm8gZGF0ZQogICAgICBhdmFpbGFibGU7CgogICAgICBWQUxVRVMoNCkgdGhlIHRpbWUgZGlmZmVyZW5jZSB3aXRoIHJlc3BlY3QgdG8gQ29vcmRpbmF0ZWQKICAgICAgVW5pdmVyc2FsIFRpbWUgKFVUQykgaW4gbWludXRlcywgb3IgLUhVR0UoMCkgaWYgdGhpcyBpbmZvcm1hdGlvbgogICAgICBpcyBub3QgYXZhaWxhYmxlOwoKICAgICAgVkFMVUVTKDUpIHRoZSBob3VyIG9mIHRoZSBkYXksIGluIHRoZSByYW5nZSBvZiAwIHRvIDIzLCBvcgogICAgICAtSFVHRSgwKSBpZiB0aGVyZSBpcyBubyBjbG9jazsKCiAgICAgIFZBTFVFUyg2KSB0aGUgbWludXRlcyBvZiB0aGUgaG91ciwgaW4gdGhlIHJhbmdlIDAgdG8gNTksIG9yCiAgICAgIC1IVUdFKDApIGlmIHRoZXJlIGlzIG5vIGNsb2NrOwoKICAgICAgVkFMVUVTKDcpIHRoZSBzZWNvbmRzIG9mIHRoZSBtaW51dGUsIGluIHRoZSByYW5nZSAwIHRvIDYwLCBvcgogICAgICAtSFVHRSgwKSBpZiB0aGVyZSBpcyBubyBjbG9jazsKCiAgICAgIFZBTFVFUyg4KSB0aGUgbWlsbGlzZWNvbmRzIG9mIHRoZSBzZWNvbmQsIGluIHRoZSByYW5nZSAwIHRvCiAgICAgIDk5OSwgb3IgLUhVR0UoMCkgaWYgdGhlcmUgaXMgbm8gY2xvY2suCgogICBOVUxMIHBvaW50ZXIgcmVwcmVzZW50IG1pc3NpbmcgT1BUSU9OQUwgYXJndW1lbnRzLiAgQWxsIGFyZ3VtZW50cwogICBoYXZlIElOVEVOVChPVVQpLiAgQmVjYXVzZSBvZiB0aGUgLWk4IG9wdGlvbiwgd2UgbXVzdCBpbXBsZW1lbnQKICAgVkFMVUVTIGZvciBJTlRFR0VSKGtpbmQ9NCkgYW5kIElOVEVHRVIoa2luZD04KS4KCiAgIEJhc2VkIG9uIGxpYlU3NydzIGRhdGVfdGltZV8uYy4KCiAgIFRPRE8gOgogICAtIENoZWNrIHllYXIgYm91bmRhcmllcy4KICAgLSBUaGVyZSBpcyBubyBTVERDL1BPU0lYIHdheSB0byBnZXQgVkFMVUVTKDgpLiAgQSBHTlVpc2ggd2F5IG1heQogICAgIGJlIHRvIHVzZSBmdGltZS4KKi8KI2RlZmluZSBEQVRFX0xFTiA4CiNkZWZpbmUgVElNRV9MRU4gMTAgICAKI2RlZmluZSBaT05FX0xFTiA1CiNkZWZpbmUgVkFMVUVTX1NJWkUgOAoKZXh0ZXJuIHZvaWQgZGF0ZV9hbmRfdGltZSAoY2hhciAqLCBjaGFyICosIGNoYXIgKiwgZ2ZjX2FycmF5X2k0ICosCgkJCSAgIEdGQ19JTlRFR0VSXzQsIEdGQ19JTlRFR0VSXzQsIEdGQ19JTlRFR0VSXzQpOwpleHBvcnRfcHJvdG8oZGF0ZV9hbmRfdGltZSk7Cgp2b2lkCmRhdGVfYW5kX3RpbWUgKGNoYXIgKl9fZGF0ZSwgY2hhciAqX190aW1lLCBjaGFyICpfX3pvbmUsCgkgICAgICAgZ2ZjX2FycmF5X2k0ICpfX3ZhbHVlcywgR0ZDX0lOVEVHRVJfNCBfX2RhdGVfbGVuLAoJICAgICAgIEdGQ19JTlRFR0VSXzQgX190aW1lX2xlbiwgR0ZDX0lOVEVHRVJfNCBfX3pvbmVfbGVuKQp7CiAgaW50IGk7CiAgY2hhciBkYXRlW0RBVEVfTEVOICsgMV07CiAgY2hhciB0aW1lY1tUSU1FX0xFTiArIDFdOwogIGNoYXIgem9uZVtaT05FX0xFTiArIDFdOwogIEdGQ19JTlRFR0VSXzQgdmFsdWVzW1ZBTFVFU19TSVpFXTsKCiNpZm5kZWYgSEFWRV9OT19EQVRFX1RJTUUKICB0aW1lX3QgbHQ7CiAgc3RydWN0IHRtIGxvY2FsX3RpbWU7CiAgc3RydWN0IHRtIFVUQ190aW1lOwoKICBsdCA9IHRpbWUgKE5VTEwpOwoKICBpZiAobHQgIT0gKHRpbWVfdCkgLTEpCiAgICB7CiAgICAgIGxvY2FsX3RpbWUgPSAqbG9jYWx0aW1lICgmbHQpOwogICAgICBVVENfdGltZSA9ICpnbXRpbWUgKCZsdCk7CgogICAgICAvKiBBbGwgYXJndW1lbnRzIGNhbiBiZSBkZXJpdmVkIGZyb20gVkFMVUVTLiAgKi8KICAgICAgdmFsdWVzWzBdID0gMTkwMCArIGxvY2FsX3RpbWUudG1feWVhcjsKICAgICAgdmFsdWVzWzFdID0gMSArIGxvY2FsX3RpbWUudG1fbW9uOwogICAgICB2YWx1ZXNbMl0gPSBsb2NhbF90aW1lLnRtX21kYXk7CiAgICAgIHZhbHVlc1szXSA9IChsb2NhbF90aW1lLnRtX21pbiAtIFVUQ190aW1lLnRtX21pbiArCgkgICAgICAgICAgIDYwICogKGxvY2FsX3RpbWUudG1faG91ciAtIFVUQ190aW1lLnRtX2hvdXIgKwoJCSAgICAgMjQgKiAobG9jYWxfdGltZS50bV95ZGF5IC0gVVRDX3RpbWUudG1feWRheSkpKTsKICAgICAgdmFsdWVzWzRdID0gbG9jYWxfdGltZS50bV9ob3VyOwogICAgICB2YWx1ZXNbNV0gPSBsb2NhbF90aW1lLnRtX21pbjsKICAgICAgdmFsdWVzWzZdID0gbG9jYWxfdGltZS50bV9zZWM7CiAgICAgIHZhbHVlc1s3XSA9IDA7CgojaWYgSEFWRV9HRVRUSU1FT0ZEQVkKICAgICAgewoJc3RydWN0IHRpbWV2YWwgdHA7CiMgIGlmIEdFVFRJTUVPRkRBWV9PTkVfQVJHVU1FTlQKCWlmICghZ2V0dGltZW9mZGF5ICgmdHApKQojICBlbHNlCiMgICAgaWYgSEFWRV9TVFJVQ1RfVElNRVpPTkUKCXN0cnVjdCB0aW1lem9uZSB0enA7CgogICAgICAvKiBTb21lIHN5c3RlbXMgc3VjaCBhcyBIUC1VWCwgZG8gaGF2ZSBzdHJ1Y3QgdGltZXpvbmUsIGJ1dAoJIGdldHRpbWVvZmRheSB0YWtlcyB2b2lkKiBhcyB0aGUgMm5kIGFyZy4gIEhvd2V2ZXIsIHRoZQoJIGVmZmVjdCBvZiBwYXNzaW5nIGFueXRoaW5nIG90aGVyIHRoYW4gYSBudWxsIHBvaW50ZXIgaXMKCSB1bnNwZWNpZmllZCBvbiBIUC1VWC4gIENvbmZpZ3VyZSBjaGVja3MgaWYgZ2V0dGltZW9mZGF5CgkgYWN0dWFsbHkgZmFpbHMgd2l0aCBhIG5vbi1OVUxMIGFyZyBhbmQgcHJldGVuZHMgdGhhdAoJIHN0cnVjdCB0aW1lem9uZSBpcyBtaXNzaW5nIGlmIGl0IGRvZXMgZmFpbC4gICovCglpZiAoIWdldHRpbWVvZmRheSAoJnRwLCAmdHpwKSkKIyAgICBlbHNlCglpZiAoIWdldHRpbWVvZmRheSAoJnRwLCAodm9pZCAqKSAwKSkKIyAgICBlbmRpZiAvKiBIQVZFX1NUUlVDVF9USU1FWk9ORSAgKi8KIyAgZW5kaWYgLyogR0VUVElNRU9GREFZX09ORV9BUkdVTUVOVCAgKi8KCXZhbHVlc1s3XSA9IHRwLnR2X3VzZWMgLyAxMDAwOwogICAgICB9CiNlbmRpZiAvKiBIQVZFX0dFVFRJTUVPRkRBWSAqLwoKI2lmIEhBVkVfU05QUklOVEYKICAgICAgaWYgKF9fZGF0ZSkKCXNucHJpbnRmIChkYXRlLCBEQVRFX0xFTiArIDEsICIlMDRkJTAyZCUwMmQiLAoJCSAgdmFsdWVzWzBdLCB2YWx1ZXNbMV0sIHZhbHVlc1syXSk7CiAgICAgIGlmIChfX3RpbWUpCglzbnByaW50ZiAodGltZWMsIFRJTUVfTEVOICsgMSwgIiUwMmQlMDJkJTAyZC4lMDNkIiwKCQkgIHZhbHVlc1s0XSwgdmFsdWVzWzVdLCB2YWx1ZXNbNl0sIHZhbHVlc1s3XSk7CgogICAgICBpZiAoX196b25lKQoJc25wcmludGYgKHpvbmUsIFpPTkVfTEVOICsgMSwgIiUrMDNkJTAyZCIsCgkJICB2YWx1ZXNbM10gLyA2MCwgYWJzICh2YWx1ZXNbM10gJSA2MCkpOwojZWxzZQogICAgICBpZiAoX19kYXRlKQoJc3ByaW50ZiAoZGF0ZSwgIiUwNGQlMDJkJTAyZCIsIHZhbHVlc1swXSwgdmFsdWVzWzFdLCB2YWx1ZXNbMl0pOwoKICAgICAgaWYgKF9fdGltZSkKCXNwcmludGYgKHRpbWVjLCAiJTAyZCUwMmQlMDJkLiUwM2QiLAoJCSB2YWx1ZXNbNF0sIHZhbHVlc1s1XSwgdmFsdWVzWzZdLCB2YWx1ZXNbN10pOwoKICAgICAgaWYgKF9fem9uZSkKCXNwcmludGYgKHpvbmUsICIlKzAzZCUwMmQiLAoJCSB2YWx1ZXNbM10gLyA2MCwgYWJzICh2YWx1ZXNbM10gJSA2MCkpOwojZW5kaWYKICAgIH0KICBlbHNlCiAgICB7CiAgICAgIG1lbXNldCAoZGF0ZSwgJyAnLCBEQVRFX0xFTik7CiAgICAgIGRhdGVbREFURV9MRU5dID0gJ1wwJzsKCiAgICAgIG1lbXNldCAodGltZWMsICcgJywgVElNRV9MRU4pOwogICAgICB0aW1lY1tUSU1FX0xFTl0gPSAnXDAnOwoKICAgICAgbWVtc2V0ICh6b25lLCAnICcsIFpPTkVfTEVOKTsKICAgICAgem9uZVtaT05FX0xFTl0gPSAnXDAnOwoKICAgICAgZm9yIChpID0gMDsgaSA8IFZBTFVFU19TSVpFOyBpKyspCgl2YWx1ZXNbaV0gPSAtIEdGQ19JTlRFR0VSXzRfSFVHRTsKICAgIH0gICAKI2Vsc2UgLyogaWYgZGVmaW5lZCBIQVZFX05PX0RBVEVfVElNRSAgKi8KICAvKiBXZSByZWFsbHkgaGF2ZSAqbm90aGluZyogdG8gcmV0dXJuLCBzbyByZXR1cm4gYmxhbmtzIGFuZCBIVUdFKDApLiAgKi8KICAgICAgCiAgbWVtc2V0IChkYXRlLCAnICcsIERBVEVfTEVOKTsKICBkYXRlW0RBVEVfTEVOXSA9ICdcMCc7CgogIG1lbXNldCAodGltZWMsICcgJywgVElNRV9MRU4pOwogIHRpbWVjW1RJTUVfTEVOXSA9ICdcMCc7CgogIG1lbXNldCAoem9uZSwgJyAnLCBaT05FX0xFTik7CiAgem9uZVtaT05FX0xFTl0gPSAnXDAnOwoKICBmb3IgKGkgPSAwOyBpIDwgVkFMVUVTX1NJWkU7IGkrKykKICAgIHZhbHVlc1tpXSA9IC0gR0ZDX0lOVEVHRVJfNF9IVUdFOwojZW5kaWYgIC8qIEhBVkVfTk9fREFURV9USU1FICAqLwoKICAvKiBDb3B5IHRoZSB2YWx1ZXMgaW50byB0aGUgYXJndW1lbnRzLiAgKi8KICBpZiAoX192YWx1ZXMpCiAgICB7CiAgICAgIHNpemVfdCBsZW4sIGRlbHRhLCBlbHRfc2l6ZTsKCiAgICAgIGVsdF9zaXplID0gR0ZDX0RFU0NSSVBUT1JfU0laRSAoX192YWx1ZXMpOwogICAgICBsZW4gPSBfX3ZhbHVlcy0+ZGltWzBdLnVib3VuZCArIDEgLSBfX3ZhbHVlcy0+ZGltWzBdLmxib3VuZDsKICAgICAgZGVsdGEgPSBfX3ZhbHVlcy0+ZGltWzBdLnN0cmlkZTsKICAgICAgaWYgKGRlbHRhID09IDApCglkZWx0YSA9IDE7CgogICAgICBhc3NlcnQgKGxlbiA+PSBWQUxVRVNfU0laRSk7CiAgICAgIC8qIENvcGUgd2l0aCBkaWZmZXJlbnQgdHlwZSBraW5kcy4gICovCiAgICAgIGlmIChlbHRfc2l6ZSA9PSA0KQogICAgICAgIHsKCSAgR0ZDX0lOVEVHRVJfNCAqdnB0cjQgPSBfX3ZhbHVlcy0+ZGF0YTsKCgkgIGZvciAoaSA9IDA7IGkgPCBWQUxVRVNfU0laRTsgaSsrLCB2cHRyNCArPSBkZWx0YSkKCSAgICAqdnB0cjQgPSB2YWx1ZXNbaV07Cgl9CiAgICAgIGVsc2UgaWYgKGVsdF9zaXplID09IDgpCiAgICAgICAgewoJICBHRkNfSU5URUdFUl84ICp2cHRyOCA9IChHRkNfSU5URUdFUl84ICopX192YWx1ZXMtPmRhdGE7CgoJICBmb3IgKGkgPSAwOyBpIDwgVkFMVUVTX1NJWkU7IGkrKywgdnB0cjggKz0gZGVsdGEpCgkgICAgewoJICAgICAgaWYgKHZhbHVlc1tpXSA9PSAtIEdGQ19JTlRFR0VSXzRfSFVHRSkKCQkqdnB0cjggPSAtIEdGQ19JTlRFR0VSXzhfSFVHRTsKCSAgICAgIGVsc2UKCQkqdnB0cjggPSB2YWx1ZXNbaV07CgkgICAgfQoJfQogICAgICBlbHNlIAoJYWJvcnQgKCk7CiAgICB9CgogIGlmIChfX3pvbmUpCiAgICB7CiAgICAgIGFzc2VydCAoX196b25lX2xlbiA+PSBaT05FX0xFTik7CiAgICAgIGZzdHJjcHkgKF9fem9uZSwgWk9ORV9MRU4sIHpvbmUsIFpPTkVfTEVOKTsKICAgIH0KCiAgaWYgKF9fdGltZSkKICAgIHsKICAgICAgYXNzZXJ0IChfX3RpbWVfbGVuID49IFRJTUVfTEVOKTsKICAgICAgZnN0cmNweSAoX190aW1lLCBUSU1FX0xFTiwgdGltZWMsIFRJTUVfTEVOKTsKICAgIH0KCiAgaWYgKF9fZGF0ZSkKICAgIHsKICAgICAgYXNzZXJ0IChfX2RhdGVfbGVuID49IERBVEVfTEVOKTsKICAgICAgZnN0cmNweSAoX19kYXRlLCBEQVRFX0xFTiwgZGF0ZSwgREFURV9MRU4pOwogICAgfQp9Cg==