LyoKICogVkdBIGhhcmR3YXJlIGVtdWxhdGlvbgogKgogKiBDb3B5cmlnaHQgMTk5OCBPdmUgS+V2ZW4gKHdpdGggc29tZSBoZWxwIGZyb20gTWFyY3VzIE1laXNzbmVyKQogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8c3RyaW5nLmg+CgojZGVmaW5lIE5PTkFNRUxFU1NVTklPTgojZGVmaW5lIE5PTkFNRUxFU1NTVFJVQ1QKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIndpbmdkaS5oIgojaW5jbHVkZSAid2ludXNlci5oIgojaW5jbHVkZSAid2luY29uLmgiCiNpbmNsdWRlICJtaXNjZW11LmgiCiNpbmNsdWRlICJkb3NleGUuaCIKI2luY2x1ZGUgInZnYS5oIgojaW5jbHVkZSAiZGRyYXcuaCIKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGRkcmF3KTsKCnN0YXRpYyBJRGlyZWN0RHJhdyAqbHBkZHJhdyA9IE5VTEw7CnN0YXRpYyBJRGlyZWN0RHJhd1N1cmZhY2UgKmxwZGRzdXJmOwpzdGF0aWMgSURpcmVjdERyYXdQYWxldHRlICpscGRkcGFsOwpzdGF0aWMgRERTVVJGQUNFREVTQyBzZGVzYzsKCnN0YXRpYyBCT09MIHZnYV9yZXRyYWNlX3ZlcnRpY2FsOwpzdGF0aWMgQk9PTCB2Z2FfcmV0cmFjZV9ob3Jpem9udGFsOwoKLyoKICogVkdBIGNvbnRyb2xsZXIgbWVtb3J5IGlzIGVtdWxhdGVkIHVzaW5nIGxpbmVhciBmcmFtZWJ1ZmZlci4KICogVGhpcyBmcmFtYnVmZmVyIGFsc28gYWN0cyBhcyBhbiBpbnRlcmZhY2UKICogYmV0d2VlbiBWR0EgY29udHJvbGxlciBlbXVsYXRpb24gYW5kIERpcmVjdERyYXcuCiAqCiAqIHZnYV9mYl93aWR0aDogRGlzcGxheSB3aWR0aCBpbiBwaXhlbHMuIENhbiBiZSBtb2RpZmllZCB3aGVuCiAqICAgICAgICAgICAgICAgZGlzcGxheSBtb2RlIGlzIGNoYW5nZWQuCiAqIHZnYV9mYl9oZWlnaHQ6IERpc3BsYXkgaGVpZ2h0IGluIHBpeGVscy4gQ2FuIGJlIG1vZGlmaWVkIHdoZW4KICogICAgICAgICAgICAgICAgZGlzcGxheSBtb2RlIGlzIGNoYW5nZWQuCiAqIHZnYV9mYl9kZXB0aDogTnVtYmVyIG9mIGJpdHMgdXNlZCB0byBzdG9yZSBzaW5nbGUgcGl4ZWwgY29sb3IgaW5mb3JtYXRpb24uCiAqICAgICAgICAgICAgICAgRWFjaCBwaXhlbCB1c2VzICh2Z2FfZmJfZGVwdGgrNykvOCBieXRlcyBiZWNhdXNlCiAqICAgICAgICAgICAgICAgMS0xNiBjb2xvciBtb2RlcyBhcmUgbWFwcGVkIHRvIDI1NiBjb2xvciBtb2RlLgogKiAgICAgICAgICAgICAgIENhbiBiZSBtb2RpZmllZCB3aGVuIGRpc3BsYXkgbW9kZSBpcyBjaGFuZ2VkLgogKiB2Z2FfZmJfcGl0Y2g6IEhvdyBtYW55IGJ5dGVzIHRvIGFkZCB0byBwb2ludGVyIGluIG9yZGVyIHRvIG1vdmUKICogICAgICAgICAgICAgICBmcm9tIG9uZSByb3cgdG8gYW5vdGhlci4gVGhpcyBpcyBmaXhlZCBpbiBWR0EgbW9kZXMsCiAqICAgICAgICAgICAgICAgYnV0IGNhbiBiZSBtb2RpZmllZCBpbiBTVkdBIG1vZGVzLgogKiB2Z2FfZmJfb2Zmc2V0OiBPZmZzZXQgYWRkZWQgdG8gZnJhbWVidWZmZXIgc3RhcnQgYWRkcmVzcyBpbiBvcmRlcgogKiAgICAgICAgICAgICAgICB0byBmaW5kIHRoZSBkaXNwbGF5IG9yaWdpbi4gUHJvZ3JhbXMgdXNlIHRoaXMgdG8gZG8KICogICAgICAgICAgICAgICAgZG91YmxlIGJ1ZmZlcmluZyBhbmQgdG8gc2Nyb2xsIGRpc3BsYXkuIFRoZSB2YWx1ZSBjYW4KICogICAgICAgICAgICAgICAgYmUgbW9kaWZpZWQgaW4gVkdBIGFuZCBTVkdBIG1vZGVzLgogKiB2Z2FfZmJfc2l6ZTogSG93IG1hbnkgYnl0ZXMgYXJlIGFsbG9jYXRlZCB0byBmcmFtZWJ1ZmZlci4KICogICAgICAgICAgICAgIFZHQSBmcmFtZWJ1ZmZlcnMgYXJlIGFsd2F5cyBsYXJnZXIgdGhhbiBkaXNwbGF5IHNpemUgYW5kCiAqICAgICAgICAgICAgICBTVkdBIGZyYW1lYnVmZmVycyBtYXkgYWxzbyBiZS4KICogdmdhX2ZiX2RhdGE6IFBvaW50ZXIgdG8gZnJhbWVidWZmZXIgc3RhcnQuCiAqIHZnYV9mYl93aW5kb3c6IE9mZnNldCBvZiA2NGsgd2luZG93IDB4YTAwMDAgaW4gYnl0ZXMgZnJvbSBmcmFtZWJ1ZmZlciBzdGFydC4KICogICAgICAgICAgICAgICAgVGhpcyB2YWx1ZSBpcyA+PSAwLCBpZiBtb2RlIHVzZXMgbGluZWFyIGZyYW1lYnVmZmVyIGFuZAogKiAgICAgICAgICAgICAgICAtMSwgaWYgbW9kZSB1c2VzIGNvbG9yIHBsYW5lcy4gVGhpcyB2YWx1ZSBpcyBmaXhlZAogKiAgICAgICAgICAgICAgICBpbiBhbGwgbW9kZXMgZXhjZXB0IDB4MTMgKDI1NiBjb2xvciBWR0EpIHdoZXJlCiAqICAgICAgICAgICAgICAgIDAgbWVhbnMgbm9ybWFsIG1vZGUgYW5kIC0xIG1lYW5zIE1vZGUtWCAodW5jaGFpbmVkIG1vZGUpLgogKi8Kc3RhdGljIGludCAgIHZnYV9mYl93aWR0aDsKc3RhdGljIGludCAgIHZnYV9mYl9oZWlnaHQ7CnN0YXRpYyBpbnQgICB2Z2FfZmJfZGVwdGg7CnN0YXRpYyBpbnQgICB2Z2FfZmJfcGl0Y2g7CnN0YXRpYyBpbnQgICB2Z2FfZmJfb2Zmc2V0OwpzdGF0aWMgaW50ICAgdmdhX2ZiX3NpemUgPSAwOwpzdGF0aWMgY2hhciAqdmdhX2ZiX2RhdGEgPSAwOwpzdGF0aWMgaW50ICAgdmdhX2ZiX3dpbmRvdyA9IDA7CgovKgogKiBWR0EgdGV4dCBtb2RlIGRhdGEuCiAqCiAqIHZnYV90ZXh0X2F0dHI6IEN1cnJlbnQgYWN0aXZlIGF0dHJpYnV0ZS4KICogdmdhX3RleHRfb2xkOiBMYXN0IGRhdGEgc2VudCB0byBjb25zb2xlLiAKICogICAgICAgICAgICAgICBUaGlzIGlzIHVzZWQgdG8gb3B0aW1pemUgY29uc29sZSB1cGRhdGVzLgogKiB2Z2FfdGV4dF93aWR0aDogIFdpZHRoIG9mIHRoZSB0ZXh0IGRpc3BsYXkgaW4gY2hhcmFjdGVycy4KICogdmdhX3RleHRfaGVpZ2h0OiBIZWlnaHQgb2YgdGhlIHRleHQgZGlzcGxheSBpbiBjaGFyYWN0ZXJzLgogKiB2Z2FfdGV4dF94OiBDdXJyZW50IGN1cnNvciBYLXBvc2l0aW9uLiBTdGFydHMgZnJvbSB6ZXJvLgogKiB2Z2FfdGV4dF95OiBDdXJyZW50IGN1cnNvciBZLXBvc2l0aW9uLiBTdGFydHMgZnJvbSB6ZXJvLgogKiB2Z2FfdGV4dF9jb25zb2xlOiBUUlVFIGlmIHN0ZG91dCBpcyBjb25zb2xlLCAKICogICAgICAgICAgICAgICAgICAgRkFMU0UgaWYgaXQgaXMgcmVndWxhciBmaWxlLgogKi8Kc3RhdGljIEJZVEUgIHZnYV90ZXh0X2F0dHI7CnN0YXRpYyBjaGFyICp2Z2FfdGV4dF9vbGQgPSBOVUxMOwpzdGF0aWMgQllURSAgdmdhX3RleHRfd2lkdGg7CnN0YXRpYyBCWVRFICB2Z2FfdGV4dF9oZWlnaHQ7CnN0YXRpYyBCWVRFICB2Z2FfdGV4dF94OwpzdGF0aWMgQllURSAgdmdhX3RleHRfeTsKc3RhdGljIEJPT0wgIHZnYV90ZXh0X2NvbnNvbGU7CgovKgogKiBWR0EgY29udHJvbGxlciBwb3J0cyAweDNjMCwgMHgzYzQsIDB4M2NlIGFuZCAweDNkNCBhcmUKICogaW5kZXhlZCByZWdpc3RlcnMuIFRoZXNlIHBvcnRzIGFyZSB1c2VkIHRvIHNlbGVjdCBWR0EgY29udHJvbGxlcgogKiBzdWJyZWdpc3RlciB0aGF0IGNhbiBiZSB3cml0dGVuIHRvIG9yIHJlYWQgZnJvbSB1c2luZyBwb3J0cyAweDNjMSwKICogMHgzYzUsIDB4M2NmIG9yIDB4M2Q1LiBTZWxlY3RlZCBzdWJyZWdpc3RlciBpbmRleGVzIGFyZQogKiBzdG9yZWQgaW4gdmFyaWFibGVzIHZnYV9pbmRleF8qLgogKgogKiBQb3J0IDB4M2MwIGlzIHNwZWNpYWwgYmVjYXVzZSBpdCBpcyBib3RoIGluZGV4IGFuZAogKiBkYXRhLXdyaXRlIHJlZ2lzdGVyLiBGbGlwLWZsb3AgdmdhX2FkZHJlc3NfM2MwIHRlbGxzIHdoZXRoZXIKICogdGhlIHBvcnQgYWN0cyBjdXJyZW50bHkgYXMgYW4gYWRkcmVzcyByZWdpc3Rlci4gUmVhZGluZyBmcm9tIHBvcnQKICogMHgzZGEgcmVzZXRzIHRoZSBmbGlwLWZsb3AgdG8gYWRkcmVzcyBtb2RlLgogKi8Kc3RhdGljIEJZVEUgdmdhX2luZGV4XzNjMDsKc3RhdGljIEJZVEUgdmdhX2luZGV4XzNjNDsKc3RhdGljIEJZVEUgdmdhX2luZGV4XzNjZTsKc3RhdGljIEJZVEUgdmdhX2luZGV4XzNkNDsKc3RhdGljIEJPT0wgdmdhX2FkZHJlc3NfM2MwID0gVFJVRTsKCi8qCiAqIFRoaXMgbXV0ZXggaXMgdXNlZCB0byBwcm90ZWN0IFZHQSBzdGF0ZSBkdXJpbmcgYXN5bmNocm9ub3VzCiAqIHNjcmVlbiB1cGRhdGVzIChzZWUgVkdBX1BvbGwpLiBJdCBtYWtlcyBzdXJlIHRoYXQgVkdBIHN0YXRlIGNoYW5nZXMKICogYXJlIGF0b21pYyBhbmQgdGhlIHVzZXIgaW50ZXJmYWNlIGlzIHByb3RlY3RlZCBmcm9tIGZsaWNrZXIgYW5kCiAqIGNvcnJ1cHRpb24uCiAqCiAqIFRoZSBtdXRleCBhY3R1YWxseSBzZXJpYWxpemVzIFZHQSBvcGVyYXRpb25zIGFuZCB0aGUgc2NyZWVuIHVwZGF0ZS4gCiAqIFdoaWNoIG1lYW5zIHRoYXQgd2hlbmV2ZXIgVkdBX1BvbGwgb2NjdXJzLCBhcHBsaWNhdGlvbiBzdGFsbHMgaWYgaXQgCiAqIHRyaWVzIHRvIG1vZGlmeSBWR0Egc3RhdGUuIFRoaXMgaXMgbm90IGhvdyByZWFsIFZHQSBhZGFwdGVycyB3b3JrLAogKiBidXQgaXQgbWFrZXMgdGltaW5nIGFuZCBjb3JyZWN0bmVzcyBpc3N1ZXMgbXVjaCBlYXNpZXIgdG8gZGVhbCB3aXRoLgogKi8Kc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gdmdhX2xvY2sgPSBDUklUSUNBTF9TRUNUSU9OX0lOSVQoIlZHQSIpOwoKdHlwZWRlZiBIUkVTVUxUIChXSU5BUEkgKkRpcmVjdERyYXdDcmVhdGVQcm9jKShMUEdVSUQsTFBESVJFQ1REUkFXICosTFBVTktOT1dOKTsKc3RhdGljIERpcmVjdERyYXdDcmVhdGVQcm9jIHBEaXJlY3REcmF3Q3JlYXRlOwoKc3RhdGljIHZvaWQgQ0FMTEJBQ0sgVkdBX1BvbGwoIExQVk9JRCBhcmcsIERXT1JEIGxvdywgRFdPUkQgaGlnaCApOwoKc3RhdGljIEhXTkQgdmdhX2h3bmQgPSBOVUxMOwoKLyoKICogRm9yIHNpbXBsaWNpdHksIEknbSBjcmVhdGluZyBhIHNlY29uZCBwYWxldHRlLgogKiAxNiBjb2xvciBhY2Nlc3NlcyB3aWxsIHVzZSB0aGVzZSBwb2ludGVycyBhbmQgaW5zZXJ0CiAqIGVudHJpZXMgZnJvbSB0aGUgNjQtY29sb3IgcGFsZXR0ZSBpbnRvIHRoZSBkZWZhdWx0CiAqIHBhbGV0dGUuICAgLS1Sb2JlcnQgJ0FkbWlyYWwnIENvZXltYW4KICovCgpzdGF0aWMgY2hhciB2Z2FfMTZfcGFsZXR0ZVsxN109ewogIDB4MDAsICAvKiAwIC0gQmxhY2sgICAgICAgICAqLwogIDB4MDEsICAvKiAxIC0gQmx1ZSAgICAgICAgICAqLwogIDB4MDIsICAvKiAyIC0gR3JlZW4gICAgICAgICAqLwogIDB4MDMsICAvKiAzIC0gQ3lhbiAgICAgICAgICAqLwogIDB4MDQsICAvKiA0IC0gUmVkICAgICAgICAgICAqLwogIDB4MDUsICAvKiA1IC0gTWFnZW50YSAgICAgICAqLwogIDB4MTQsICAvKiA2IC0gQnJvd24gICAgICAgICAqLwogIDB4MDcsICAvKiA3IC0gTGlnaHQgZ3JheSAgICAqLwogIDB4MzgsICAvKiA4IC0gRGFyayBncmF5ICAgICAqLwogIDB4MzksICAvKiA5IC0gTGlnaHQgYmx1ZSAgICAqLwogIDB4M2EsICAvKiBBIC0gTGlnaHQgZ3JlZW4gICAqLwogIDB4M2IsICAvKiBCIC0gTGlnaHQgY3lhbiAgICAqLwogIDB4M2MsICAvKiBDIC0gTGlnaHQgcmVkICAgICAqLwogIDB4M2QsICAvKiBEIC0gTGlnaHQgbWFnZW50YSAqLwogIDB4M2UsICAvKiBFIC0gWWVsbG93ICAgICAgICAqLwogIDB4M2YsICAvKiBGIC0gV2hpdGUgICAgICAgICAqLwogIDB4MDAgICAvKiBCb3JkZXIgQ29sb3IgICAgICAqLwp9OwoKc3RhdGljIFBBTEVUVEVFTlRSWSB2Z2FfZGVmX3BhbGV0dGVbMjU2XT17Ci8qIHJlZCAgZ3JlZW4gIGJsdWUgKi8KICB7MHgwMCwgMHgwMCwgMHgwMH0sIC8qIDAgLSBCbGFjayAqLwogIHsweDAwLCAweDAwLCAweDgwfSwgLyogMSAtIEJsdWUgKi8KICB7MHgwMCwgMHg4MCwgMHgwMH0sIC8qIDIgLSBHcmVlbiAqLwogIHsweDAwLCAweDgwLCAweDgwfSwgLyogMyAtIEN5YW4gKi8KICB7MHg4MCwgMHgwMCwgMHgwMH0sIC8qIDQgLSBSZWQgKi8KICB7MHg4MCwgMHgwMCwgMHg4MH0sIC8qIDUgLSBNYWdlbnRhICovCiAgezB4ODAsIDB4ODAsIDB4MDB9LCAvKiA2IC0gQnJvd24gKi8KICB7MHhDMCwgMHhDMCwgMHhDMH0sIC8qIDcgLSBMaWdodCBncmF5ICovCiAgezB4ODAsIDB4ODAsIDB4ODB9LCAvKiA4IC0gRGFyayBncmF5ICovCiAgezB4MDAsIDB4MDAsIDB4RkZ9LCAvKiA5IC0gTGlnaHQgYmx1ZSAqLwogIHsweDAwLCAweEZGLCAweDAwfSwgLyogQSAtIExpZ2h0IGdyZWVuICovCiAgezB4MDAsIDB4RkYsIDB4RkZ9LCAvKiBCIC0gTGlnaHQgY3lhbiAqLwogIHsweEZGLCAweDAwLCAweDAwfSwgLyogQyAtIExpZ2h0IHJlZCAqLwogIHsweEZGLCAweDAwLCAweEZGfSwgLyogRCAtIExpZ2h0IG1hZ2VudGEgKi8KICB7MHhGRiwgMHhGRiwgMHgwMH0sIC8qIEUgLSBZZWxsb3cgKi8KICB7MHhGRiwgMHhGRiwgMHhGRn0sIC8qIEYgLSBXaGl0ZSAqLwogIHswLDAsMH0gLyogRklYTUU6IGEgc2VyaWVzIG9mIGNvbnRpbnVvdXMgcmFpbmJvdyBodWVzIHNob3VsZCBmb2xsb3cgKi8KfTsKCi8qCiAqICAgVGhpcyBwYWxldHRlIGlzIHRoZSBkb3MgZGVmYXVsdCwgY29udmVydGVkIGZyb20gMTggYml0IGNvbG9yIHRvIDI0LgogKiAgICAgIEl0IGNvbnRhaW5zIG9ubHkgNjQgZW50cmllcyBvZiBjb2xvcnMtLWFsbCBvdGhlcnMgYXJlIHplcm9zLgogKiAgICAgICAgICAtLVJvYmVydCAnQWRtaXJhbCcgQ29leW1hbgogKi8Kc3RhdGljIFBBTEVUVEVFTlRSWSB2Z2FfZGVmNjRfcGFsZXR0ZVsyNTZdPXsKLyogcmVkICBncmVlbiAgYmx1ZSAqLwogIHsweDAwLCAweDAwLCAweDAwfSwgLyogMHgwMCAgICAgIEJsYWNrICAgICAgKi8KICB7MHgwMCwgMHgwMCwgMHhhYX0sIC8qIDB4MDEgICAgICBCbHVlICAgICAgICovCiAgezB4MDAsIDB4YWEsIDB4MDB9LCAvKiAweDAyICAgICAgR3JlZW4gICAgICAqLwogIHsweDAwLCAweGFhLCAweGFhfSwgLyogMHgwMyAgICAgIEN5YW4gICAgICAgKi8KICB7MHhhYSwgMHgwMCwgMHgwMH0sIC8qIDB4MDQgICAgICBSZWQgICAgICAgICovCiAgezB4YWEsIDB4MDAsIDB4YWF9LCAvKiAweDA1ICAgICAgTWFnZW50YSAgICAqLwogIHsweGFhLCAweGFhLCAweDAwfSwgLyogMHgwNiAgICAgICovCiAgezB4YWEsIDB4YWEsIDB4YWF9LCAvKiAweDA3ICAgICAgTGlnaHQgR3JheSAqLwogIHsweDAwLCAweDAwLCAweDU1fSwgLyogMHgwOCAgICAgICovCiAgezB4MDAsIDB4MDAsIDB4ZmZ9LCAvKiAweDA5ICAgICAgKi8KICB7MHgwMCwgMHhhYSwgMHg1NX0sIC8qIDB4MGEgICAgICAqLwogIHsweDAwLCAweGFhLCAweGZmfSwgLyogMHgwYiAgICAgICovCiAgezB4YWEsIDB4MDAsIDB4NTV9LCAvKiAweDBjICAgICAgKi8KICB7MHhhYSwgMHgwMCwgMHhmZn0sIC8qIDB4MGQgICAgICAqLwogIHsweGFhLCAweGFhLCAweDU1fSwgLyogMHgwZSAgICAgICovCiAgezB4YWEsIDB4YWEsIDB4ZmZ9LCAvKiAweDBmICAgICAgKi8KICB7MHgwMCwgMHg1NSwgMHgwMH0sIC8qIDB4MTAgICAgICAqLwogIHsweDAwLCAweDU1LCAweGFhfSwgLyogMHgxMSAgICAgICovCiAgezB4MDAsIDB4ZmYsIDB4MDB9LCAvKiAweDEyICAgICAgKi8KICB7MHgwMCwgMHhmZiwgMHhhYX0sIC8qIDB4MTMgICAgICAqLwogIHsweGFhLCAweDU1LCAweDAwfSwgLyogMHgxNCAgICAgIEJyb3duICAgICAgKi8KICB7MHhhYSwgMHg1NSwgMHhhYX0sIC8qIDB4MTUgICAgICAqLwogIHsweGFhLCAweGZmLCAweDAwfSwgLyogMHgxNiAgICAgICovCiAgezB4YWEsIDB4ZmYsIDB4YWF9LCAvKiAweDE3ICAgICAgKi8KICB7MHgwMCwgMHg1NSwgMHg1NX0sIC8qIDB4MTggICAgICAqLwogIHsweDAwLCAweDU1LCAweGZmfSwgLyogMHgxOSAgICAgICovCiAgezB4MDAsIDB4ZmYsIDB4NTV9LCAvKiAweDFhICAgICAgKi8KICB7MHgwMCwgMHhmZiwgMHhmZn0sIC8qIDB4MWIgICAgICAqLwogIHsweGFhLCAweDU1LCAweDU1fSwgLyogMHgxYyAgICAgICovCiAgezB4YWEsIDB4NTUsIDB4ZmZ9LCAvKiAweDFkICAgICAgKi8KICB7MHhhYSwgMHhmZiwgMHg1NX0sIC8qIDB4MWUgICAgICAqLwogIHsweGFhLCAweGZmLCAweGZmfSwgLyogMHgxZiAgICAgICovCiAgezB4NTUsIDB4MDAsIDB4MDB9LCAvKiAweDIwICAgICAgKi8KICB7MHg1NSwgMHgwMCwgMHhhYX0sIC8qIDB4MjEgICAgICAqLwogIHsweDU1LCAweGFhLCAweDAwfSwgLyogMHgyMiAgICAgICovCiAgezB4NTUsIDB4YWEsIDB4YWF9LCAvKiAweDIzICAgICAgKi8KICB7MHhmZiwgMHgwMCwgMHgwMH0sIC8qIDB4MjQgICAgICAqLwogIHsweGZmLCAweDAwLCAweGFhfSwgLyogMHgyNSAgICAgICovCiAgezB4ZmYsIDB4YWEsIDB4MDB9LCAvKiAweDI2ICAgICAgKi8KICB7MHhmZiwgMHhhYSwgMHhhYX0sIC8qIDB4MjcgICAgICAqLwogIHsweDU1LCAweDAwLCAweDU1fSwgLyogMHgyOCAgICAgICovCiAgezB4NTUsIDB4MDAsIDB4ZmZ9LCAvKiAweDI5ICAgICAgKi8KICB7MHg1NSwgMHhhYSwgMHg1NX0sIC8qIDB4MmEgICAgICAqLwogIHsweDU1LCAweGFhLCAweGZmfSwgLyogMHgyYiAgICAgICovCiAgezB4ZmYsIDB4MDAsIDB4NTV9LCAvKiAweDJjICAgICAgKi8KICB7MHhmZiwgMHgwMCwgMHhmZn0sIC8qIDB4MmQgICAgICAqLwogIHsweGZmLCAweGFhLCAweDU1fSwgLyogMHgyZSAgICAgICovCiAgezB4ZmYsIDB4YWEsIDB4ZmZ9LCAvKiAweDJmICAgICAgKi8KICB7MHg1NSwgMHg1NSwgMHgwMH0sIC8qIDB4MzAgICAgICAqLwogIHsweDU1LCAweDU1LCAweGFhfSwgLyogMHgzMSAgICAgICovCiAgezB4NTUsIDB4ZmYsIDB4MDB9LCAvKiAweDMyICAgICAgKi8KICB7MHg1NSwgMHhmZiwgMHhhYX0sIC8qIDB4MzMgICAgICAqLwogIHsweGZmLCAweDU1LCAweDAwfSwgLyogMHgzNCAgICAgICovCiAgezB4ZmYsIDB4NTUsIDB4YWF9LCAvKiAweDM1ICAgICAgKi8KICB7MHhmZiwgMHhmZiwgMHgwMH0sIC8qIDB4MzYgICAgICAqLwogIHsweGZmLCAweGZmLCAweGFhfSwgLyogMHgzNyAgICAgICovCiAgezB4NTUsIDB4NTUsIDB4NTV9LCAvKiAweDM4ICAgICAgRGFyayBHcmF5ICAgICAqLwogIHsweDU1LCAweDU1LCAweGZmfSwgLyogMHgzOSAgICAgIExpZ2h0IEJsdWUgICAgKi8KICB7MHg1NSwgMHhmZiwgMHg1NX0sIC8qIDB4M2EgICAgICBMaWdodCBHcmVlbiAgICovCiAgezB4NTUsIDB4ZmYsIDB4ZmZ9LCAvKiAweDNiICAgICAgTGlnaHQgQ3lhbiAgICAqLwogIHsweGZmLCAweDU1LCAweDU1fSwgLyogMHgzYyAgICAgIExpZ2h0IFJlZCAgICAgKi8KICB7MHhmZiwgMHg1NSwgMHhmZn0sIC8qIDB4M2QgICAgICBMaWdodCBNYWdlbnRhICovCiAgezB4ZmYsIDB4ZmYsIDB4NTV9LCAvKiAweDNlICAgICAgWWVsbG93ICAgICAgICAqLwogIHsweGZmLCAweGZmLCAweGZmfSwgLyogMHgzZiAgICAgIFdoaXRlICAgICAgICAgKi8KICB7MCwwLDB9IC8qIFRoZSBuZXh0IDE5MiBlbnRyaWVzIGFyZSBhbGwgemVyb3MgICovCn07CgpzdGF0aWMgSEFORExFIFZHQV90aW1lcjsKc3RhdGljIEhBTkRMRSBWR0FfdGltZXJfdGhyZWFkOwoKLyogc2V0IHRoZSB0aW1lciByYXRlOyBjYWxsZWQgaW4gdGhlIHBvbGxpbmcgdGhyZWFkIGNvbnRleHQgKi8Kc3RhdGljIHZvaWQgQ0FMTEJBQ0sgc2V0X3RpbWVyX3JhdGUoIFVMT05HX1BUUiBhcmcgKQp7CiAgICBMQVJHRV9JTlRFR0VSIHdoZW47CgogICAgd2hlbi5zLkxvd1BhcnQgPSB3aGVuLnMuSGlnaFBhcnQgPSAwOwogICAgU2V0V2FpdGFibGVUaW1lciggVkdBX3RpbWVyLCAmd2hlbiwgYXJnLCBWR0FfUG9sbCwgMCwgRkFMU0UgKTsKfQoKc3RhdGljIERXT1JEIENBTExCQUNLIFZHQV9UaW1lclRocmVhZCggdm9pZCAqZHVtbXkgKQp7CiAgICBmb3IgKDs7KSBTbGVlcEV4KCBJTkZJTklURSwgVFJVRSApOwp9CgpzdGF0aWMgdm9pZCBWR0FfRGVpbnN0YWxsVGltZXIodm9pZCkKewogICAgaWYgKFZHQV90aW1lcl90aHJlYWQpCiAgICB7CiAgICAgICAgLyoKICAgICAgICAgKiBNYWtlIHN1cmUgdGhlIHVwZGF0ZSB0aHJlYWQgaXMgbm90IGhvbGRpbmcKICAgICAgICAgKiBzeXN0ZW0gcmVzb3VyY2VzIHdoZW4gd2Uga2lsbCBpdC4KICAgICAgICAgKgogICAgICAgICAqIE5vdywgd2Ugb25seSBuZWVkIHRvIHdvcnJ5IGFib3V0IHVwZGF0ZSB0aHJlYWQKICAgICAgICAgKiBnZXR0aW5nIHRlcm1pbmF0ZWQgd2hpbGUgaW4gRW50ZXJDcml0aWNhbFNlY3Rpb24gCiAgICAgICAgICogb3IgV2FpdEZvck11bHRpcGxlT2JqZWN0c0V4LgogICAgICAgICAqCiAgICAgICAgICogRklYTUU6IElzIHRoaXMgYSBwcm9ibGVtPwogICAgICAgICAqLwogICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZ2Z2FfbG9jayk7CgogICAgICAgIENhbmNlbFdhaXRhYmxlVGltZXIoIFZHQV90aW1lciApOwogICAgICAgIENsb3NlSGFuZGxlKCBWR0FfdGltZXIgKTsKICAgICAgICBUZXJtaW5hdGVUaHJlYWQoIFZHQV90aW1lcl90aHJlYWQsIDAgKTsKICAgICAgICBDbG9zZUhhbmRsZSggVkdBX3RpbWVyX3RocmVhZCApOwogICAgICAgIFZHQV90aW1lcl90aHJlYWQgPSAwOwoKICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwoKICAgICAgICAvKgogICAgICAgICAqIFN5bmNocm9uaXplIGRpc3BsYXkuIFRoaXMgbWFrZXMgc3VyZSB0aGF0CiAgICAgICAgICogY2hhbmdlcyB0byBkaXNwbGF5IGJlY29tZSB2aXNpYmxlIGV2ZW4gaWYgcHJvZ3JhbSAKICAgICAgICAgKiB0ZXJtaW5hdGVzIGJlZm9yZSB1cGRhdGUgdGhyZWFkIGhhZCB0aW1lIHRvIHJ1bi4KICAgICAgICAgKi8KICAgICAgICBWR0FfUG9sbCggMCwgMCwgMCApOwogICAgfQp9CgpzdGF0aWMgdm9pZCBWR0FfSW5zdGFsbFRpbWVyKHVuc2lnbmVkIFJhdGUpCnsKICAgIGlmICghVkdBX3RpbWVyX3RocmVhZCkKICAgIHsKICAgICAgICBWR0FfdGltZXIgPSBDcmVhdGVXYWl0YWJsZVRpbWVyQSggTlVMTCwgRkFMU0UsIE5VTEwgKTsKICAgICAgICBWR0FfdGltZXJfdGhyZWFkID0gQ3JlYXRlVGhyZWFkKCBOVUxMLCAwLCBWR0FfVGltZXJUaHJlYWQsIE5VTEwsIDAsIE5VTEwgKTsKICAgIH0KICAgIFF1ZXVlVXNlckFQQyggc2V0X3RpbWVyX3JhdGUsIFZHQV90aW1lcl90aHJlYWQsIChVTE9OR19QVFIpUmF0ZSApOwp9CgpzdGF0aWMgQk9PTCBWR0FfSXNUaW1lclJ1bm5pbmcodm9pZCkKewogICAgcmV0dXJuIFZHQV90aW1lcl90aHJlYWQgPyBUUlVFIDogRkFMU0U7Cn0KCkhBTkRMRSBWR0FfQWxwaGFDb25zb2xlKHZvaWQpCnsKICAgIC8qIHRoaXMgYXNzdW1lcyB0aGF0IG5vIFdpbjMyIHJlZGlyZWN0aW9uIGhhcyB0YWtlbiBwbGFjZSwgYnV0IHRoZW4gYWdhaW4sCiAgICAgKiBvbmx5IDE2LWJpdCBhcHBzIGFyZSBsaWtlbHkgdG8gdXNlIHRoaXMgcGFydCBvZiBXaW5lLi4uICovCiAgICByZXR1cm4gR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKTsKfQoKY2hhcipWR0FfQWxwaGFCdWZmZXIodm9pZCkKewogICAgcmV0dXJuIChjaGFyICopMHhiODAwMDsKfQoKLyoqKiBHUkFQSElDUyBNT0RFICoqKi8KCnR5cGVkZWYgc3RydWN0IHsKICB1bnNpZ25lZCBYcmVzLCBZcmVzLCBEZXB0aDsKICBpbnQgcmV0Owp9IE1vZGVTZXQ7CgpzdGF0aWMgdm9pZCBXSU5BUEkgVkdBX0RvRXhpdChVTE9OR19QVFIgYXJnKQp7CiAgICBWR0FfRGVpbnN0YWxsVGltZXIoKTsKICAgIElEaXJlY3REcmF3U3VyZmFjZV9TZXRQYWxldHRlKGxwZGRzdXJmLE5VTEwpOwogICAgSURpcmVjdERyYXdTdXJmYWNlX1JlbGVhc2UobHBkZHN1cmYpOwogICAgbHBkZHN1cmY9TlVMTDsKICAgIElEaXJlY3REcmF3UGFsZXR0ZV9SZWxlYXNlKGxwZGRwYWwpOwogICAgbHBkZHBhbD1OVUxMOwogICAgSURpcmVjdERyYXdfUmVsZWFzZShscGRkcmF3KTsKICAgIGxwZGRyYXc9TlVMTDsKfQoKc3RhdGljIHZvaWQgV0lOQVBJIFZHQV9Eb1NldE1vZGUoVUxPTkdfUFRSIGFyZykKewogICAgTFJFU1VMVAlyZXM7CiAgICBNb2RlU2V0ICpwYXIgPSAoTW9kZVNldCAqKWFyZzsKICAgIHBhci0+cmV0PTE7CgogICAgaWYgKGxwZGRyYXcpIFZHQV9Eb0V4aXQoMCk7CiAgICBpZiAoIWxwZGRyYXcpIHsKICAgICAgICBpZiAoIXBEaXJlY3REcmF3Q3JlYXRlKQogICAgICAgIHsKICAgICAgICAgICAgSE1PRFVMRSBobW9kID0gTG9hZExpYnJhcnlBKCAiZGRyYXcuZGxsIiApOwogICAgICAgICAgICBpZiAoaG1vZCkgcERpcmVjdERyYXdDcmVhdGUgPSAoRGlyZWN0RHJhd0NyZWF0ZVByb2MpR2V0UHJvY0FkZHJlc3MoIGhtb2QsICJEaXJlY3REcmF3Q3JlYXRlIiApOwoJICAgIGlmICghcERpcmVjdERyYXdDcmVhdGUpIHsKCQlFUlIoIkNhbid0IGxvb2t1cCBEaXJlY3REcmF3Q3JlYXRlIGZyb20gZGRyYXcuZGxsLlxuIik7CgkJcmV0dXJuOwoJICAgIH0KICAgICAgICB9CiAgICAgICAgcmVzID0gcERpcmVjdERyYXdDcmVhdGUoTlVMTCwmbHBkZHJhdyxOVUxMKTsKICAgICAgICBpZiAoIWxwZGRyYXcpIHsKICAgICAgICAgICAgRVJSKCJEaXJlY3REcmF3IGlzIG5vdCBhdmFpbGFibGUgKHJlcyA9ICVseClcbiIscmVzKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXZnYV9od25kKSB7CiAgICAgICAgICAgIHZnYV9od25kID0gQ3JlYXRlV2luZG93RXhBKDAsIlNUQVRJQyIsIldJTkVET1MgVkdBIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1NfUE9QVVB8V1NfVklTSUJMRXxTU19OT1RJRlksMCwwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXItPlhyZXMscGFyLT5ZcmVzLDAsMCwwLE5VTEwpOwogICAgICAgICAgICBpZiAoIXZnYV9od25kKSB7CiAgICAgICAgICAgICAgICBFUlIoIkZhaWxlZCB0byBjcmVhdGUgdXNlciB3aW5kb3cuXG4iKTsKICAgICAgICAgICAgICAgIElEaXJlY3REcmF3X1JlbGVhc2UobHBkZHJhdyk7CiAgICAgICAgICAgICAgICBscGRkcmF3PU5VTEw7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgICAgICBTZXRXaW5kb3dQb3ModmdhX2h3bmQsMCwwLDAscGFyLT5YcmVzLHBhci0+WXJlcyxTV1BfTk9NT1ZFfFNXUF9OT1pPUkRFUik7CgogICAgICAgIGlmICgocmVzPUlEaXJlY3REcmF3X1NldENvb3BlcmF0aXZlTGV2ZWwobHBkZHJhdyx2Z2FfaHduZCxERFNDTF9GVUxMU0NSRUVOfEREU0NMX0VYQ0xVU0lWRSkpKSB7CgkgICAgRVJSKCJDb3VsZCBub3Qgc2V0IGNvb3BlcmF0aXZlIGxldmVsIHRvIGV4Y2x1c2l2ZSAoJWx4KVxuIixyZXMpOwoJfQoKICAgICAgICBpZiAoKHJlcz1JRGlyZWN0RHJhd19TZXREaXNwbGF5TW9kZShscGRkcmF3LHBhci0+WHJlcyxwYXItPllyZXMscGFyLT5EZXB0aCkpKSB7CiAgICAgICAgICAgIEVSUigiRGlyZWN0RHJhdyBkb2VzIG5vdCBzdXBwb3J0IHJlcXVlc3RlZCBkaXNwbGF5IG1vZGUgKCVkeCVkeCVkKSwgcmVzID0gJWx4IVxuIixwYXItPlhyZXMscGFyLT5ZcmVzLHBhci0+RGVwdGgscmVzKTsKICAgICAgICAgICAgSURpcmVjdERyYXdfUmVsZWFzZShscGRkcmF3KTsKICAgICAgICAgICAgbHBkZHJhdz1OVUxMOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICByZXM9SURpcmVjdERyYXdfQ3JlYXRlUGFsZXR0ZShscGRkcmF3LEREUENBUFNfOEJJVCxOVUxMLCZscGRkcGFsLE5VTEwpOwogICAgICAgIGlmIChyZXMpIHsKCSAgICBFUlIoIkNvdWxkIG5vdCBjcmVhdGUgcGFsZXR0ZSAocmVzID0gJWx4KVxuIixyZXMpOwogICAgICAgICAgICBJRGlyZWN0RHJhd19SZWxlYXNlKGxwZGRyYXcpOwogICAgICAgICAgICBscGRkcmF3PU5VTEw7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKChyZXM9SURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMobHBkZHBhbCwwLDAsMjU2LHZnYV9kZWZfcGFsZXR0ZSkpKSB7CiAgICAgICAgICAgIEVSUigiQ291bGQgbm90IHNldCBkZWZhdWx0IHBhbGV0dGUgZW50cmllcyAocmVzID0gJWx4KVxuIiwgcmVzKTsKICAgICAgICB9CgogICAgICAgIG1lbXNldCgmc2Rlc2MsMCxzaXplb2Yoc2Rlc2MpKTsKICAgICAgICBzZGVzYy5kd1NpemU9c2l6ZW9mKHNkZXNjKTsKCXNkZXNjLmR3RmxhZ3MgPSBERFNEX0NBUFM7CglzZGVzYy5kZHNDYXBzLmR3Q2FwcyA9IEREU0NBUFNfUFJJTUFSWVNVUkZBQ0U7CiAgICAgICAgaWYgKElEaXJlY3REcmF3X0NyZWF0ZVN1cmZhY2UobHBkZHJhdywmc2Rlc2MsJmxwZGRzdXJmLE5VTEwpfHwoIWxwZGRzdXJmKSkgewogICAgICAgICAgICBFUlIoIkRpcmVjdERyYXcgc3VyZmFjZSBpcyBub3QgYXZhaWxhYmxlXG4iKTsKICAgICAgICAgICAgSURpcmVjdERyYXdfUmVsZWFzZShscGRkcmF3KTsKICAgICAgICAgICAgbHBkZHJhdz1OVUxMOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIElEaXJlY3REcmF3U3VyZmFjZV9TZXRQYWxldHRlKGxwZGRzdXJmLGxwZGRwYWwpOwogICAgICAgIHZnYV9yZXRyYWNlX3ZlcnRpY2FsID0gdmdhX3JldHJhY2VfaG9yaXpvbnRhbCA9IEZBTFNFOwogICAgICAgIC8qIHBvbGwgZXZlcnkgMjBtcyAoNTBmcHMgc2hvdWxkIHByb3ZpZGUgYWRlcXVhdGUgcmVzcG9uc2l2ZW5lc3MpICovCiAgICAgICAgVkdBX0luc3RhbGxUaW1lcigyMCk7CiAgICB9CiAgICBwYXItPnJldD0wOwogICAgcmV0dXJuOwp9CgppbnQgVkdBX1NldE1vZGUodW5zaWduZWQgWHJlcyx1bnNpZ25lZCBZcmVzLHVuc2lnbmVkIERlcHRoKQp7CiAgICBNb2RlU2V0IHBhcjsKICAgIGludCAgICAgbmV3U2l6ZTsKCiAgICB2Z2FfZmJfd2lkdGggPSBYcmVzOwogICAgdmdhX2ZiX2hlaWdodCA9IFlyZXM7CiAgICB2Z2FfZmJfZGVwdGggPSBEZXB0aDsKICAgIHZnYV9mYl9vZmZzZXQgPSAwOwogICAgdmdhX2ZiX3BpdGNoID0gWHJlcyAqICgoRGVwdGggKyA3KSAvIDgpOwoKICAgIG5ld1NpemUgPSBYcmVzICogWXJlcyAqICgoRGVwdGggKyA3KSAvIDgpOwogICAgaWYobmV3U2l6ZSA8IDI1NiAqIDEwMjQpCiAgICAgIG5ld1NpemUgPSAyNTYgKiAxMDI0OwoKICAgIGlmKHZnYV9mYl9zaXplIDwgbmV3U2l6ZSkgewogICAgICBpZih2Z2FfZmJfZGF0YSkKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCB2Z2FfZmJfZGF0YSk7CiAgICAgIHZnYV9mYl9kYXRhID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIG5ld1NpemUpOwogICAgICB2Z2FfZmJfc2l6ZSA9IG5ld1NpemU7CiAgICB9CgogICAgaWYoWHJlcyA+PSA2NDAgfHwgWXJlcyA+PSA0ODApIHsKICAgICAgcGFyLlhyZXMgPSBYcmVzOwogICAgICBwYXIuWXJlcyA9IFlyZXM7CiAgICB9IGVsc2UgewogICAgICBwYXIuWHJlcyA9IDY0MDsKICAgICAgcGFyLllyZXMgPSA0ODA7CiAgICB9CgogICAgVkdBX1NldFdpbmRvd1N0YXJ0KChEZXB0aCA8IDgpID8gLTEgOiAwKTsKCiAgICBwYXIuRGVwdGggPSAoRGVwdGggPCA4KSA/IDggOiBEZXB0aDsKCiAgICBNWl9SdW5JblRocmVhZChWR0FfRG9TZXRNb2RlLCAoVUxPTkdfUFRSKSZwYXIpOwogICAgcmV0dXJuIHBhci5yZXQ7Cn0KCmludCBWR0FfR2V0TW9kZSh1bnNpZ25lZCpIZWlnaHQsdW5zaWduZWQqV2lkdGgsdW5zaWduZWQqRGVwdGgpCnsKICAgIGlmICghbHBkZHJhdykgcmV0dXJuIDE7CiAgICBpZiAoIWxwZGRzdXJmKSByZXR1cm4gMTsKICAgIGlmIChIZWlnaHQpICpIZWlnaHQ9c2Rlc2MuZHdIZWlnaHQ7CiAgICBpZiAoV2lkdGgpICpXaWR0aD1zZGVzYy5kd1dpZHRoOwogICAgaWYgKERlcHRoKSAqRGVwdGg9c2Rlc2MuZGRwZlBpeGVsRm9ybWF0LnUxLmR3UkdCQml0Q291bnQ7CiAgICByZXR1cm4gMDsKfQoKdm9pZCBWR0FfRXhpdCh2b2lkKQp7CiAgICBpZiAobHBkZHJhdykgTVpfUnVuSW5UaHJlYWQoVkdBX0RvRXhpdCwgMCk7Cn0KCnZvaWQgVkdBX1NldFBhbGV0dGUoUEFMRVRURUVOVFJZKnBhbCxpbnQgc3RhcnQsaW50IGxlbikKewogICAgaWYgKCFscGRkcmF3KSByZXR1cm47CiAgICBJRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcyhscGRkcGFsLDAsc3RhcnQsbGVuLHBhbCk7Cn0KCi8qIHNldCBhIHNpbmdsZSBbY2hhciB3aWRlXSBjb2xvciBpbiAxNiBjb2xvciBtb2RlLiAqLwp2b2lkIFZHQV9TZXRDb2xvcjE2KGludCByZWcsaW50IGNvbG9yKQp7CglQQUxFVFRFRU5UUlkgKnBhbDsKCiAgICBpZiAoIWxwZGRyYXcpIHJldHVybjsKCXBhbD0gJnZnYV9kZWY2NF9wYWxldHRlW2NvbG9yXTsKICAgICAgICBJRGlyZWN0RHJhd1BhbGV0dGVfU2V0RW50cmllcyhscGRkcGFsLDAscmVnLDEscGFsKTsKCXZnYV8xNl9wYWxldHRlW3JlZ109KGNoYXIpY29sb3I7Cn0KCi8qIEdldCBhIHNpbmdsZSBbY2hhciB3aWRlXSBjb2xvciBpbiAxNiBjb2xvciBtb2RlLiAqLwpjaGFyIFZHQV9HZXRDb2xvcjE2KGludCByZWcpCnsKCiAgICBpZiAoIWxwZGRyYXcpIHJldHVybiAwOwoJcmV0dXJuIChjaGFyKXZnYV8xNl9wYWxldHRlW3JlZ107Cn0KCi8qIHNldCBhbGwgMTcgW2NoYXIgd2lkZV0gY29sb3JzIGF0IG9uY2UgaW4gMTYgY29sb3IgbW9kZS4gKi8Kdm9pZCBWR0FfU2V0MTZQYWxldHRlKGNoYXIgKlRhYmxlKQp7CglQQUxFVFRFRU5UUlkgKnBhbDsKCWludCBjOwoKICAgIGlmICghbHBkZHJhdykgcmV0dXJuOyAgICAgICAgIC8qIHJldHVybiBpZiB3ZSdyZSBpbiB0ZXh0IG9ubHkgbW9kZSAqLwogICAgbWVtY3B5KCBUYWJsZSwgJnZnYV8xNl9wYWxldHRlLCAxNyApOyAvKiBjb3B5IHRoZSBlbnRyaWVzIGludG8gdGhlIHRhYmxlICovCgogICAgZm9yIChjPTA7IGM8MTc7IGMrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogMTcgZW50cmllcyAqLwoJcGFsPSAmdmdhX2RlZjY0X3BhbGV0dGVbKGludCl2Z2FfMTZfcGFsZXR0ZVtjXV07ICAvKiBnZXQgY29sb3IgICovCiAgICAgICAgSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMobHBkZHBhbCwwLGMsMSxwYWwpOyAvKiBzZXQgZW50cnkgICovCglUUkFDRSgiUGFsZXR0ZSByZWdpc3RlciAlZCBzZXQgdG8gJWRcbiIsYywoaW50KXZnYV8xNl9wYWxldHRlW2NdKTsKICAgfSAvKiBlbmQgb2YgdGhlIGNvdW50aW5nIGxvb3AgKi8KfQoKLyogR2V0IGFsbCAxNyBbIGNoYXIgd2lkZSBdIGNvbG9ycyBhdCBvbmNlIGluIDE2IGNvbG9yIG1vZGUuICovCnZvaWQgVkdBX0dldDE2UGFsZXR0ZShjaGFyICpUYWJsZSkKewoKICAgIGlmICghbHBkZHJhdykgcmV0dXJuOyAgICAgICAgIC8qIHJldHVybiBpZiB3ZSdyZSBpbiB0ZXh0IG9ubHkgbW9kZSAqLwogICAgbWVtY3B5KCAmdmdhXzE2X3BhbGV0dGUsIFRhYmxlLCAxNyApOyAvKiBjb3B5IHRoZSBlbnRyaWVzIGludG8gdGhlIHRhYmxlICovCn0KCnZvaWQgVkdBX1NldFF1YWRQYWxldHRlKFJHQlFVQUQqY29sb3IsaW50IHN0YXJ0LGludCBsZW4pCnsKICAgIFBBTEVUVEVFTlRSWSBwYWxbMjU2XTsKICAgIGludCBjOwoKICAgIGlmICghbHBkZHJhdykgcmV0dXJuOwogICAgZm9yIChjPTA7IGM8bGVuOyBjKyspIHsKICAgICAgICBwYWxbY10ucGVSZWQgID1jb2xvcltjXS5yZ2JSZWQ7CiAgICAgICAgcGFsW2NdLnBlR3JlZW49Y29sb3JbY10ucmdiR3JlZW47CiAgICAgICAgcGFsW2NdLnBlQmx1ZSA9Y29sb3JbY10ucmdiQmx1ZTsKICAgICAgICBwYWxbY10ucGVGbGFncz0wOwogICAgfQogICAgSURpcmVjdERyYXdQYWxldHRlX1NldEVudHJpZXMobHBkZHBhbCwwLHN0YXJ0LGxlbixwYWwpOwp9CgpMUFNUUiBWR0FfTG9jayh1bnNpZ25lZCpQaXRjaCx1bnNpZ25lZCpIZWlnaHQsdW5zaWduZWQqV2lkdGgsdW5zaWduZWQqRGVwdGgpCnsKICAgIGlmICghbHBkZHJhdykgcmV0dXJuIE5VTEw7CiAgICBpZiAoIWxwZGRzdXJmKSByZXR1cm4gTlVMTDsKICAgIGlmIChJRGlyZWN0RHJhd1N1cmZhY2VfTG9jayhscGRkc3VyZixOVUxMLCZzZGVzYywwLDApKSB7CiAgICAgICAgRVJSKCJjb3VsZCBub3QgbG9jayBzdXJmYWNlIVxuIik7CiAgICAgICAgcmV0dXJuIE5VTEw7CiAgICB9CiAgICBpZiAoUGl0Y2gpICpQaXRjaD1zZGVzYy51MS5sUGl0Y2g7CiAgICBpZiAoSGVpZ2h0KSAqSGVpZ2h0PXNkZXNjLmR3SGVpZ2h0OwogICAgaWYgKFdpZHRoKSAqV2lkdGg9c2Rlc2MuZHdXaWR0aDsKICAgIGlmIChEZXB0aCkgKkRlcHRoPXNkZXNjLmRkcGZQaXhlbEZvcm1hdC51MS5kd1JHQkJpdENvdW50OwogICAgcmV0dXJuIHNkZXNjLmxwU3VyZmFjZTsKfQoKdm9pZCBWR0FfVW5sb2NrKHZvaWQpCnsKICAgIElEaXJlY3REcmF3U3VyZmFjZV9VbmxvY2sobHBkZHN1cmYsc2Rlc2MubHBTdXJmYWNlKTsKfQoKLyoKICogU2V0IHN0YXJ0IG9mIDY0ayB3aW5kb3cgYXQgMHhhMDAwMCBpbiBieXRlcy4KICogSWYgdmFsdWUgaXMgLTEsIGluaXRpYWxpemUgY29sb3IgcGxhbmUgc3VwcG9ydC4KICogSWYgdmFsdWUgaXMgPj0gMCwgd2luZG93IGNvbnRhaW5zIGRpcmVjdCBjb3B5IG9mIGZyYW1lYnVmZmVyLgogKi8Kdm9pZCBWR0FfU2V0V2luZG93U3RhcnQoaW50IHN0YXJ0KQp7CiAgICBpZihzdGFydCA9PSB2Z2FfZmJfd2luZG93KQogICAgICAgIHJldHVybjsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwoKICAgIGlmKHZnYV9mYl93aW5kb3cgPT0gLTEpCiAgICAgICAgRklYTUUoIlJlbW92ZSBWR0EgbWVtb3J5IGVtdWxhdGlvbi5cbiIpOwogICAgZWxzZQogICAgICAgIG1lbW1vdmUodmdhX2ZiX2RhdGEgKyB2Z2FfZmJfd2luZG93LCAoY2hhciAqKTB4YTAwMDAsIDY0ICogMTAyNCk7CgogICAgdmdhX2ZiX3dpbmRvdyA9IHN0YXJ0OwoKICAgIGlmKHZnYV9mYl93aW5kb3cgPT0gLTEpCiAgICAgICAgRklYTUUoIkluc3RhbGwgVkdBIG1lbW9yeSBlbXVsYXRpb24uXG4iKTsKICAgIGVsc2UKICAgICAgICBtZW1tb3ZlKCAoY2hhciAqKTB4YTAwMDAsIHZnYV9mYl9kYXRhICsgdmdhX2ZiX3dpbmRvdywgNjQgKiAxMDI0KTsKCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwp9CgovKgogKiBHZXQgc3RhcnQgb2YgNjRrIHdpbmRvdyBhdCAweGEwMDAwIGluIGJ5dGVzLgogKiBWYWx1ZSBpcyAtMSBpbiBjb2xvciBwbGFuZSBtb2Rlcy4KICovCmludCBWR0FfR2V0V2luZG93U3RhcnQoKQp7CiAgICByZXR1cm4gdmdhX2ZiX3dpbmRvdzsKfQoKLyoqKiBURVhUIE1PREUgKioqLwoKLyogcHJlcGFyZSB0aGUgdGV4dCBtb2RlIHZpZGVvIG1lbW9yeSBjb3B5IHRoYXQgaXMgdXNlZCB0byBvbmx5CiAqIHVwZGF0ZSB0aGUgdmlkZW8gbWVtb3J5IGxpbmUgdGhhdCBkaWQgZ2V0IHVwZGF0ZWQuICovCnZvaWQgVkdBX1ByZXBhcmVWaWRlb01lbUNvcHkodW5zaWduZWQgWHJlcywgdW5zaWduZWQgWXJlcykKewogICAgY2hhciAqcCwgKnAyOwogICAgaW50IGk7CgogICAgLyoKICAgICAqIEFsbG9jYXRlIHNwYWNlIGZvciBjaGFyICsgYXR0ci4KICAgICAqLwogICAgdmdhX3RleHRfb2xkID0gSGVhcFJlQWxsb2MoIEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZnYV90ZXh0X29sZCwgWHJlcyAqIFlyZXMgKiAyICk7CgogICAgcCA9IFZHQV9BbHBoYUJ1ZmZlcigpOwogICAgcDIgPSB2Z2FfdGV4dF9vbGQ7CgogICAgLyogbWFrZSBzdXJlIHRoZSB2aWRlbyBtZW0gY29weSBjb250YWlucyB0aGUgZXhhY3Qgb3Bwb3NpdGUgb2Ygb3VyCiAgICAgKiBhY3R1YWwgdGV4dCBtb2RlIG1lbW9yeSBhcmVhIHRvIG1ha2Ugc3VyZSB0aGUgc2NyZWVuCiAgICAgKiBkb2VzIGdldCB1cGRhdGVkIGZ1bGx5IGluaXRpYWxseSAqLwogICAgZm9yIChpPTA7IGkgPCBYcmVzKllyZXMqMjsgaSsrKQoJKnAyKysgPSAqcCsrIF4gMHhmZjsgLyogWE9SIGl0ICovCn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgVkdBX1NldEFscGhhTW9kZQogKgogKiBTZXQgVkdBIGVtdWxhdGlvbiB0byB0ZXh0IG1vZGUuCiAqLwp2b2lkIFZHQV9TZXRBbHBoYU1vZGUodW5zaWduZWQgWHJlcyx1bnNpZ25lZCBZcmVzKQp7CiAgICBWR0FfRXhpdCgpOwogICAgVkdBX0RlaW5zdGFsbFRpbWVyKCk7CiAgICAKICAgIFZHQV9QcmVwYXJlVmlkZW9NZW1Db3B5KFhyZXMsIFlyZXMpOwogICAgdmdhX3RleHRfd2lkdGggPSBYcmVzOwogICAgdmdhX3RleHRfaGVpZ2h0ID0gWXJlczsKCiAgICBpZiAodmdhX3RleHRfeCA+PSB2Z2FfdGV4dF93aWR0aCB8fCB2Z2FfdGV4dF95ID49IHZnYV90ZXh0X2hlaWdodCkKICAgICAgICBWR0FfU2V0Q3Vyc29yUG9zKDAsMCk7CgogICAgaWYodmdhX3RleHRfY29uc29sZSkgewogICAgICAgIENPT1JEIHNpemU7CiAgICAgICAgc2l6ZS5YID0gWHJlczsKICAgICAgICBzaXplLlkgPSBZcmVzOwogICAgICAgIFNldENvbnNvbGVTY3JlZW5CdWZmZXJTaXplKCBWR0FfQWxwaGFDb25zb2xlKCksIHNpemUgKTsKCiAgICAgICAgLyogcG9sbCBldmVyeSAzMG1zICgzM2ZwcyBzaG91bGQgcHJvdmlkZSBhZGVxdWF0ZSByZXNwb25zaXZlbmVzcykgKi8KICAgICAgICBWR0FfSW5zdGFsbFRpbWVyKDMwKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBWR0FfSW5pdEFscGhhTW9kZQogKgogKiBJbml0aWFsaXplIFZHQSB0ZXh0IG1vZGUgaGFuZGxpbmcgYW5kIHJldHVybiBkZWZhdWx0IHRleHQgbW9kZS4KICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzZXQgVkdBIGVtdWxhdGlvbiB0byB0ZXh0IG1vZGUuCiAqLwp2b2lkIFZHQV9Jbml0QWxwaGFNb2RlKHVuc2lnbmVkKlhyZXMsdW5zaWduZWQqWXJlcykKewogICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gaW5mbzsKCiAgICBpZihHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyggVkdBX0FscGhhQ29uc29sZSgpLCAmaW5mbyApKQogICAgewogICAgICAgIHZnYV90ZXh0X2NvbnNvbGUgPSBUUlVFOwogICAgICAgIHZnYV90ZXh0X3ggPSBpbmZvLmR3Q3Vyc29yUG9zaXRpb24uWDsKICAgICAgICB2Z2FfdGV4dF95ID0gaW5mby5kd0N1cnNvclBvc2l0aW9uLlk7CiAgICAgICAgdmdhX3RleHRfYXR0ciA9IGluZm8ud0F0dHJpYnV0ZXM7CiAgICAgICAgKlhyZXMgPSBpbmZvLmR3U2l6ZS5YOwogICAgICAgICpZcmVzID0gaW5mby5kd1NpemUuWTsKICAgIH0gCiAgICBlbHNlCiAgICB7CiAgICAgICAgdmdhX3RleHRfY29uc29sZSA9IEZBTFNFOwogICAgICAgIHZnYV90ZXh0X3ggPSAwOwogICAgICAgIHZnYV90ZXh0X3kgPSAwOwogICAgICAgIHZnYV90ZXh0X2F0dHIgPSAweDBmOwogICAgICAgICpYcmVzID0gODA7CiAgICAgICAgKllyZXMgPSAyNTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBWR0FfR2V0QWxwaGFNb2RlCiAqCiAqIEdldCBjdXJyZW50IHRleHQgbW9kZS4gUmV0dXJucyBUUlVFIGFuZCBzZXRzIHJlc29sdXRpb24gaWYKICogYW55IFZHQSB0ZXh0IG1vZGUgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCiAqLwpCT09MIFZHQV9HZXRBbHBoYU1vZGUodW5zaWduZWQqWHJlcyx1bnNpZ25lZCpZcmVzKQp7CiAgICBpZiAodmdhX3RleHRfd2lkdGggIT0gMCAmJiB2Z2FfdGV4dF9oZWlnaHQgIT0gMCkgewogICAgICAgICpYcmVzID0gdmdhX3RleHRfd2lkdGg7CiAgICAgICAgKllyZXMgPSB2Z2FfdGV4dF9oZWlnaHQ7CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICB9IGVsc2UKICAgICAgICByZXR1cm4gRkFMU0U7Cn0KCnZvaWQgVkdBX1NldEN1cnNvclNoYXBlKHVuc2lnbmVkIGNoYXIgc3RhcnRfb3B0aW9ucywgdW5zaWduZWQgY2hhciBlbmQpCnsKICAgIENPTlNPTEVfQ1VSU09SX0lORk8gY2NpOwoKICAgIC8qIHN0YW5kYXJkIGN1cnNvciBzZXR0aW5nczoKICAgICAqIDB4MDYwNyA9PSBDR0EsIDB4MGIwYyA9PSBtb25vY2hyb21lLCAweDBkMGUgPT0gRUdBL1ZHQSAqLwoKICAgIC8qIGNhbGN1bGF0ZSBwZXJjZW50YWdlIGZyb20gYm90dG9tIC0gYXNzdW1pbmcgVkdBIChib3R0b20gMHgwZSkgKi8KICAgIGNjaS5kd1NpemUgPSAoKGVuZCAmIDB4MWYpIC0gKHN0YXJ0X29wdGlvbnMgJiAweDFmKSkvMHgwZSAqIDEwMDsKICAgIGlmICghY2NpLmR3U2l6ZSkgY2NpLmR3U2l6ZSsrOyAvKiBOVUxMIGN1cnNvciB3b3VsZCBtYWtlIFNDQ0koKSBmYWlsICEgKi8KICAgIGNjaS5iVmlzaWJsZSA9ICgoc3RhcnRfb3B0aW9ucyAmIDB4NjApICE9IDB4MjApOyAvKiBpbnZpc2libGUgPyAqLwoKICAgIFNldENvbnNvbGVDdXJzb3JJbmZvKFZHQV9BbHBoYUNvbnNvbGUoKSwmY2NpKTsKfQoKdm9pZCBWR0FfU2V0Q3Vyc29yUG9zKHVuc2lnbmVkIFgsdW5zaWduZWQgWSkKewogICAgdmdhX3RleHRfeCA9IFg7CiAgICB2Z2FfdGV4dF95ID0gWTsKfQoKdm9pZCBWR0FfR2V0Q3Vyc29yUG9zKHVuc2lnbmVkKlgsdW5zaWduZWQqWSkKewogICAgaWYgKFgpICpYID0gdmdhX3RleHRfeDsKICAgIGlmIChZKSAqWSA9IHZnYV90ZXh0X3k7Cn0KCnN0YXRpYyB2b2lkIFZHQV9QdXRDaGFyQXQodW5zaWduZWQgeCwgdW5zaWduZWQgeSwgQllURSBhc2NpaSwgaW50IGF0dHIpCnsKICAgIGNoYXIgKmRhdCA9IFZHQV9BbHBoYUJ1ZmZlcigpICsgKCh2Z2FfdGV4dF93aWR0aCAqIHkgKyB4KSAqIDIpOwogICAgZGF0WzBdID0gYXNjaWk7CiAgICBpZiAoYXR0cj49MCkKICAgICAgICBkYXRbMV0gPSBhdHRyOwp9Cgp2b2lkIFZHQV9Xcml0ZUNoYXJzKHVuc2lnbmVkIFgsdW5zaWduZWQgWSx1bnNpZ25lZCBjaCxpbnQgYXR0cixpbnQgY291bnQpCnsKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZ2Z2FfbG9jayk7CgogICAgd2hpbGUgKGNvdW50LS0pIAogICAgICAgIFZHQV9QdXRDaGFyQXQoWCArIGNvdW50LCBZLCBjaCwgYXR0cik7CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnZnYV9sb2NrKTsKfQoKdm9pZCBWR0FfUHV0Q2hhcihCWVRFIGFzY2lpKQp7CiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwoKICAgIHN3aXRjaChhc2NpaSkgewogICAgY2FzZSAnXGInOgogICAgICAgIGlmICh2Z2FfdGV4dF94KQogICAgICAgICAgICB2Z2FfdGV4dF94LS07CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAnXHQnOgogICAgICAgIHZnYV90ZXh0X3ggKz0gKCh2Z2FfdGV4dF94ICsgOCkgJiB+NykgLSB2Z2FfdGV4dF94OwogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ1xuJzoKICAgICAgICB2Z2FfdGV4dF95Kys7CiAgICAgICAgdmdhX3RleHRfeCA9IDA7CiAgICAgICAgYnJlYWs7CgogICAgY2FzZSAnXGEnOgogICAgICAgIGJyZWFrOwoKICAgIGNhc2UgJ1xyJzoKICAgICAgICB2Z2FfdGV4dF94ID0gMDsKICAgICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICAgIFZHQV9QdXRDaGFyQXQodmdhX3RleHRfeCwgdmdhX3RleHRfeSwgYXNjaWksIHZnYV90ZXh0X2F0dHIpOwogICAgICAgIHZnYV90ZXh0X3grKzsKICAgIH0KCiAgICBpZiAodmdhX3RleHRfeCA+PSB2Z2FfdGV4dF93aWR0aCkKICAgIHsKICAgICAgICB2Z2FfdGV4dF94ID0gMDsKICAgICAgICB2Z2FfdGV4dF95Kys7CiAgICB9CgogICAgaWYgKHZnYV90ZXh0X3kgPj0gdmdhX3RleHRfaGVpZ2h0KQogICAgewogICAgICAgIHZnYV90ZXh0X3kgPSB2Z2FfdGV4dF9oZWlnaHQgLSAxOwogICAgICAgIFZHQV9TY3JvbGxVcFRleHQoIDAsIDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgIHZnYV90ZXh0X2hlaWdodCAtIDEsIHZnYV90ZXh0X3dpZHRoIC0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgdmdhX3RleHRfYXR0ciApOwogICAgfQoKICAgIC8qCiAgICAgKiBJZiB3ZSBkb24ndCBoYXZlIGEgY29uc29sZSwgd3JpdGUgZGlyZWN0bHkgdG8gc3RhbmRhcmQgb3V0cHV0LgogICAgICovCiAgICBpZighdmdhX3RleHRfY29uc29sZSkKICAgICAgICBXcml0ZUZpbGUoVkdBX0FscGhhQ29uc29sZSgpLCAmYXNjaWksIDEsIE5VTEwsIE5VTEwpOwoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZ2Z2FfbG9jayk7Cn0KCnZvaWQgVkdBX1NldFRleHRBdHRyaWJ1dGUoQllURSBhdHRyKQp7CiAgICB2Z2FfdGV4dF9hdHRyID0gYXR0cjsKfQoKdm9pZCBWR0FfQ2xlYXJUZXh0KHVuc2lnbmVkIHJvdzEsIHVuc2lnbmVkIGNvbDEsCiAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByb3cyLCB1bnNpZ25lZCBjb2wyLAogICAgICAgICAgICAgICAgICAgQllURSBhdHRyKQp7CiAgICB1bnNpZ25lZCB4LCB5OwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZ2Z2FfbG9jayk7CgogICAgZm9yKHk9cm93MTsgeTw9cm93MjsgeSsrKQogICAgICAgIGZvcih4PWNvbDE7IHg8PWNvbDI7IHgrKykKICAgICAgICAgICAgVkdBX1B1dENoYXJBdCh4LCB5LCAweDIwLCBhdHRyKTsKCiAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwp9Cgp2b2lkIFZHQV9TY3JvbGxVcFRleHQodW5zaWduZWQgcm93MSwgIHVuc2lnbmVkIGNvbDEsCiAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByb3cyLCAgdW5zaWduZWQgY29sMiwKICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxpbmVzLCBCWVRFIGF0dHIpCnsKICAgIGNoYXIgICAgKmJ1ZmZlciA9IFZHQV9BbHBoYUJ1ZmZlcigpOwogICAgdW5zaWduZWQgeTsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmdmdhX2xvY2spOwoKICAgIC8qCiAgICAgKiBTY3JvbGwgYnVmZmVyLgogICAgICovCiAgICBmb3IgKHkgPSByb3cxOyB5IDw9IHJvdzIgLSBsaW5lczsgeSsrKQogICAgICAgIG1lbW1vdmUoIGJ1ZmZlciArIGNvbDEgKyB5ICogdmdhX3RleHRfd2lkdGggKiAyLAogICAgICAgICAgICAgICAgIGJ1ZmZlciArIGNvbDEgKyAoeSArIGxpbmVzKSAqIHZnYV90ZXh0X3dpZHRoICogMiwKICAgICAgICAgICAgICAgICAoY29sMiAtIGNvbDEgKyAxKSAqIDIgKTsKCiAgICAvKgogICAgICogRmlsbCBleHBvc2VkIGxpbmVzLgogICAgICovCiAgICBmb3IgKHkgPSBtYXgocm93MSwgcm93MiAtIGxpbmVzICsgMSk7IHkgPD0gcm93MjsgeSsrKQogICAgICAgIFZHQV9Xcml0ZUNoYXJzKCBjb2wxLCB5LCAnICcsIGF0dHIsIGNvbDIgLSBjb2wxICsgMSApOwoKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZ2Z2FfbG9jayk7Cn0KCnZvaWQgVkdBX1Njcm9sbERvd25UZXh0KHVuc2lnbmVkIHJvdzEsICB1bnNpZ25lZCBjb2wxLAogICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCByb3cyLCAgdW5zaWduZWQgY29sMiwKICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbGluZXMsIEJZVEUgYXR0cikKewogICAgY2hhciAgICAqYnVmZmVyID0gVkdBX0FscGhhQnVmZmVyKCk7CiAgICB1bnNpZ25lZCB5OwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZ2Z2FfbG9jayk7CgogICAgLyoKICAgICAqIFNjcm9sbCBidWZmZXIuCiAgICAgKi8KICAgIGZvciAoeSA9IHJvdzI7IHkgPj0gcm93MSArIGxpbmVzOyB5LS0pCiAgICAgICAgbWVtbW92ZSggYnVmZmVyICsgY29sMSArIHkgKiB2Z2FfdGV4dF93aWR0aCAqIDIsCiAgICAgICAgICAgICAgICAgYnVmZmVyICsgY29sMSArICh5IC0gbGluZXMpICogdmdhX3RleHRfd2lkdGggKiAyLAogICAgICAgICAgICAgICAgIChjb2wyIC0gY29sMSArIDEpICogMiApOwoKICAgIC8qCiAgICAgKiBGaWxsIGV4cG9zZWQgbGluZXMuCiAgICAgKi8KICAgIGZvciAoeSA9IHJvdzE7IHkgPD0gbWluKHJvdzEgKyBsaW5lcyAtIDEsIHJvdzIpOyB5KyspCiAgICAgICAgVkdBX1dyaXRlQ2hhcnMoIGNvbDEsIHksICcgJywgYXR0ciwgY29sMiAtIGNvbDEgKyAxICk7CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnZnYV9sb2NrKTsKfQoKdm9pZCBWR0FfR2V0Q2hhcmFjdGVyQXRDdXJzb3IoQllURSAqYXNjaWksIEJZVEUgKmF0dHIpCnsKICAgIGNoYXIgKmRhdDsKCiAgICBkYXQgPSBWR0FfQWxwaGFCdWZmZXIoKSArICgodmdhX3RleHRfd2lkdGggKiB2Z2FfdGV4dF95ICsgdmdhX3RleHRfeCkgKiAyKTsKCiAgICAqYXNjaWkgPSBkYXRbMF07CiAgICAqYXR0ciA9IGRhdFsxXTsKfQoKCi8qKiogQ09OVFJPTCAqKiovCgovKiBGSVhNRTogb3B0aW1pemUgYnkgZG9pbmcgdGhpcyBvbmx5IGlmIHRoZSBkYXRhIGhhcyBhY3R1YWxseSBjaGFuZ2VkCiAqICAgICAgICAoaW4gYSB3YXkgc2ltaWxhciB0byBESUJTZWN0aW9uLCBwZXJoYXBzKSAqLwpzdGF0aWMgdm9pZCBWR0FfUG9sbF9HcmFwaGljcyh2b2lkKQp7CiAgdW5zaWduZWQgaW50IFBpdGNoLCBIZWlnaHQsIFdpZHRoLCBYLCBZOwogIGNoYXIgKnN1cmY7CiAgY2hhciAqZGF0ID0gdmdhX2ZiX2RhdGEgKyB2Z2FfZmJfb2Zmc2V0OwogIGludCAgIGJwcCA9ICh2Z2FfZmJfZGVwdGggKyA3KSAvIDg7CgogIHN1cmYgPSBWR0FfTG9jaygmUGl0Y2gsJkhlaWdodCwmV2lkdGgsTlVMTCk7CiAgaWYgKCFzdXJmKSByZXR1cm47CgogIC8qCiAgICogU3luY2hyb25pemUgZnJhbWVidWZmZXIgY29udGVudHMuCiAgICovCiAgaWYodmdhX2ZiX3dpbmRvdyAhPSAtMSkKICAgIG1lbW1vdmUodmdhX2ZiX2RhdGEgKyB2Z2FfZmJfd2luZG93LCAoY2hhciAqKTB4YTAwMDAsIDY0ICogMTAyNCk7CgogIC8qCiAgICogRG91YmxlIFZHQSBmcmFtZWJ1ZmZlciAoMzIweDIwMCAtPiA2NDB4NDAwKSwgaWYgbmVlZGVkLgogICAqLwogIGlmKEhlaWdodCA+PSAyICogdmdhX2ZiX2hlaWdodCAmJiBXaWR0aCA+PSAyICogdmdhX2ZiX3dpZHRoICYmIGJwcCA9PSAxKQogICAgZm9yIChZPTA7IFk8dmdhX2ZiX2hlaWdodDsgWSsrLHN1cmYrPVBpdGNoKjIsZGF0Kz12Z2FfZmJfcGl0Y2gpCiAgICAgIGZvciAoWD0wOyBYPHZnYV9mYl93aWR0aDsgWCsrKSB7CiAgICAgICBCWVRFIHZhbHVlID0gZGF0W1hdOwogICAgICAgc3VyZltYKjJdID0gdmFsdWU7CiAgICAgICBzdXJmW1gqMisxXSA9IHZhbHVlOwogICAgICAgc3VyZltYKjIrUGl0Y2hdID0gdmFsdWU7CiAgICAgICBzdXJmW1gqMitQaXRjaCsxXSA9IHZhbHVlOwogICAgICB9CiAgZWxzZQogICAgZm9yIChZPTA7IFk8dmdhX2ZiX2hlaWdodDsgWSsrLHN1cmYrPVBpdGNoLGRhdCs9dmdhX2ZiX3BpdGNoKQogICAgICBtZW1jcHkoc3VyZiwgZGF0LCB2Z2FfZmJfd2lkdGggKiBicHApOwoKICBWR0FfVW5sb2NrKCk7Cn0KCnN0YXRpYyB2b2lkIFZHQV9Qb2xsX1RleHQodm9pZCkKewogICAgY2hhciAqZGF0LCAqb2xkLCAqcF9saW5lOwogICAgdW5zaWduZWQgaW50IFgsIFk7CiAgICBDSEFSX0lORk8gY2hbMjU2XTsgLyogdGhhdCBzaG91bGQgc3VmZmljZSBmb3IgdGhlIGxhcmdlc3QgdGV4dCB3aWR0aCAqLwogICAgQ09PUkQgc2l6LCBvZmY7CiAgICBTTUFMTF9SRUNUIGRlc3Q7CiAgICBIQU5ETEUgY29uID0gVkdBX0FscGhhQ29uc29sZSgpOwogICAgQk9PTCBsaW5lY2hhbmdlZCA9IEZBTFNFOyAvKiB2aWRlbyBtZW1vcnkgYXJlYSBkaWZmZXJzIGZyb20gc3RvcmVkIGNvcHk/ICovCgogICAgLyogU3luY2hyb25pemUgY3Vyc29yIHBvc2l0aW9uLiAqLwogICAgb2ZmLlggPSB2Z2FfdGV4dF94OwogICAgb2ZmLlkgPSB2Z2FfdGV4dF95OwogICAgU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGNvbixvZmYpOwoKICAgIGRhdCA9IFZHQV9BbHBoYUJ1ZmZlcigpOwogICAgb2xkID0gdmdhX3RleHRfb2xkOyAvKiBwb2ludGVyIHRvIHN0b3JlZCB2aWRlbyBtZW0gY29weSAqLwogICAgc2l6LlggPSB2Z2FfdGV4dF93aWR0aDsgc2l6LlkgPSAxOwogICAgb2ZmLlggPSAwOyBvZmYuWSA9IDA7CgogICAgLyogY29weSBmcm9tIHZpcnR1YWwgVkdBIGZyYW1lIGJ1ZmZlciB0byBjb25zb2xlICovCiAgICBmb3IgKFk9MDsgWTx2Z2FfdGV4dF9oZWlnaHQ7IFkrKykgewoJbGluZWNoYW5nZWQgPSBtZW1jbXAoZGF0LCBvbGQsIHZnYV90ZXh0X3dpZHRoKjIpOwoJaWYgKGxpbmVjaGFuZ2VkKQoJewoJICAgIC8qVFJBQ0UoImxpbmUgJWQgY2hhbmdlZFxuIiwgWSk7Ki8KCSAgICBwX2xpbmUgPSBkYXQ7CiAgICAgICAgICAgIGZvciAoWD0wOyBYPHZnYV90ZXh0X3dpZHRoOyBYKyspIHsKICAgICAgICAgICAgICAgIGNoW1hdLkNoYXIuQXNjaWlDaGFyID0gKnBfbGluZSsrOwogICAgICAgICAgICAgICAgLyogV3JpdGVDb25zb2xlT3V0cHV0QSBkb2Vzbid0IGxpa2UgImRlYWQiIGNoYXJzICovCiAgICAgICAgICAgICAgICBpZiAoY2hbWF0uQ2hhci5Bc2NpaUNoYXIgPT0gJ1wwJykKICAgICAgICAgICAgICAgICAgICBjaFtYXS5DaGFyLkFzY2lpQ2hhciA9ICcgJzsKICAgICAgICAgICAgICAgIGNoW1hdLkF0dHJpYnV0ZXMgPSAqcF9saW5lKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzdC5Ub3A9WTsgZGVzdC5Cb3R0b209WTsKICAgICAgICAgICAgZGVzdC5MZWZ0PTA7IGRlc3QuUmlnaHQ9dmdhX3RleHRfd2lkdGgrMTsKICAgICAgICAgICAgV3JpdGVDb25zb2xlT3V0cHV0QShjb24sIGNoLCBzaXosIG9mZiwgJmRlc3QpOwoJICAgIG1lbWNweShvbGQsIGRhdCwgdmdhX3RleHRfd2lkdGgqMik7Cgl9CgkvKiBhZHZhbmNlIHRvIG5leHQgdGV4dCBsaW5lICovCglkYXQgKz0gdmdhX3RleHRfd2lkdGgqMjsKCW9sZCArPSB2Z2FfdGV4dF93aWR0aCoyOwogICAgfQp9CgpzdGF0aWMgdm9pZCBDQUxMQkFDSyBWR0FfUG9sbCggTFBWT0lEIGFyZywgRFdPUkQgbG93LCBEV09SRCBoaWdoICkKewogICAgRW50ZXJDcml0aWNhbFNlY3Rpb24oJnZnYV9sb2NrKTsKCiAgICBpZiAobHBkZHJhdykKICAgICAgICBWR0FfUG9sbF9HcmFwaGljcygpOwogICAgZWxzZQogICAgICAgIFZHQV9Qb2xsX1RleHQoKTsKCiAgICAvKgogICAgICogRmFrZSBzdGFydCBvZiByZXRyYWNlLgogICAgICovCiAgICB2Z2FfcmV0cmFjZV92ZXJ0aWNhbCA9IFRSVUU7CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJnZnYV9sb2NrKTsKfQoKc3RhdGljIEJZVEUgcGFscmVnLHBhbGNudDsKc3RhdGljIFBBTEVUVEVFTlRSWSBwYWxkYXQ7Cgp2b2lkIFZHQV9pb3BvcnRfb3V0KCBXT1JEIHBvcnQsIEJZVEUgdmFsICkKewogICAgc3dpdGNoIChwb3J0KSB7CiAgICAgICAgY2FzZSAweDNjMDoKICAgICAgICAgICBpZiAodmdhX2FkZHJlc3NfM2MwKQogICAgICAgICAgICAgICB2Z2FfaW5kZXhfM2MwID0gdmFsOwogICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgRklYTUUoIlVuc3VwcG9ydGVkIGluZGV4LCByZWdpc3RlciAweDNjMDogMHglMDJ4ICh2YWx1ZSAweCUwMngpXG4iLAogICAgICAgICAgICAgICAgICAgICB2Z2FfaW5kZXhfM2MwLCB2YWwpOwogICAgICAgICAgIHZnYV9hZGRyZXNzXzNjMCA9ICF2Z2FfYWRkcmVzc18zYzA7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDNjNDoKICAgICAgICAgICB2Z2FfaW5kZXhfM2M0ID0gdmFsOwogICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzYzU6CiAgICAgICAgICBzd2l0Y2godmdhX2luZGV4XzNjNCkgewogICAgICAgICAgICAgICBjYXNlIDB4MDQ6IC8qIFNlcXVlbmNlcjogTWVtb3J5IE1vZGUgUmVnaXN0ZXIgKi8KICAgICAgICAgICAgICAgICAgaWYodmdhX2ZiX2RlcHRoID09IDgpCiAgICAgICAgICAgICAgICAgICAgICBWR0FfU2V0V2luZG93U3RhcnQoKHZhbCAmIDgpID8gMCA6IC0xKTsKICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgRklYTUUoIk1lbW9yeSBNb2RlIFJlZ2lzdGVyIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBtb2RlLlxuIik7CiAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2M0OiAweCUwMnggKHZhbHVlIDB4JTAyeClcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgIHZnYV9pbmRleF8zYzQsIHZhbCk7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzYzg6CiAgICAgICAgICAgIHBhbHJlZz12YWw7IHBhbGNudD0wOyBicmVhazsKICAgICAgICBjYXNlIDB4M2M5OgogICAgICAgICAgICAoKEJZVEUqKSZwYWxkYXQpW3BhbGNudCsrXT12YWwgPDwgMjsKICAgICAgICAgICAgaWYgKHBhbGNudD09MykgewogICAgICAgICAgICAgICAgVkdBX1NldFBhbGV0dGUoJnBhbGRhdCxwYWxyZWcrKywxKTsKICAgICAgICAgICAgICAgIHBhbGNudD0wOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMHgzY2U6CiAgICAgICAgICAgIHZnYV9pbmRleF8zY2UgPSB2YWw7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDNjZjoKICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2NlOiAweCUwMnggKHZhbHVlIDB4JTAyeClcbiIsCiAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNjZSwgdmFsKTsKICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDB4M2Q0OgogICAgICAgICAgIHZnYV9pbmRleF8zZDQgPSB2YWw7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAweDNkNToKICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2Q0OiAweCUwMnggKHZhbHVlIDB4JTAyeClcbiIsCiAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNkNCwgdmFsKTsKICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgVkdBIHJlZ2lzdGVyOiAweCUwNHggKHZhbHVlIDB4JTAyeClcbiIsIHBvcnQsIHZhbCk7CiAgICB9Cn0KCkJZVEUgVkdBX2lvcG9ydF9pbiggV09SRCBwb3J0ICkKewogICAgQllURSByZXQ7CgogICAgc3dpdGNoIChwb3J0KSB7CiAgICAgICAgY2FzZSAweDNjMToKICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2MwOiAweCUwMnhcbiIsCiAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNjMCk7CiAgICAgICAgICAgcmV0dXJuIDB4ZmY7CiAgICAgICAgY2FzZSAweDNjNToKICAgICAgICAgICBzd2l0Y2godmdhX2luZGV4XzNjNCkgewogICAgICAgICAgICAgICBjYXNlIDB4MDQ6IC8qIFNlcXVlbmNlcjogTWVtb3J5IE1vZGUgUmVnaXN0ZXIgKi8KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKFZHQV9HZXRXaW5kb3dTdGFydCgpID09IC0xKSA/IDB4ZjcgOiAweGZmOwogICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgRklYTUUoIlVuc3VwcG9ydGVkIGluZGV4LCByZWdpc3RlciAweDNjNDogMHglMDJ4XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNjNCk7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gMHhmZjsKICAgICAgICAgICB9CiAgICAgICAgY2FzZSAweDNjZjoKICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2NlOiAweCUwMnhcbiIsCiAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNjZSk7CiAgICAgICAgICAgcmV0dXJuIDB4ZmY7CiAgICAgICAgY2FzZSAweDNkNToKICAgICAgICAgICBGSVhNRSgiVW5zdXBwb3J0ZWQgaW5kZXgsIHJlZ2lzdGVyIDB4M2Q0OiAweCUwMnhcbiIsCiAgICAgICAgICAgICAgICAgdmdhX2luZGV4XzNkNCk7CiAgICAgICAgICAgcmV0dXJuIDB4ZmY7CgogICAgICAgIGNhc2UgMHgzZGE6CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFJlYWQgZnJvbSB0aGlzIHJlZ2lzdGVyIHJlc2V0cyByZWdpc3RlciAweDNjMCBhZGRyZXNzIGZsaXAtZmxvcC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHZnYV9hZGRyZXNzXzNjMCA9IFRSVUU7CgogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBSZWFkIGZyb20gdGhpcyByZWdpc3RlciByZXR1cm5zIGZvbGxvd2luZyBiaXRzOgogICAgICAgICAgICAgKiAgIHh4eHgxeHh4ID0gVmVydGljYWwgcmV0cmFjZSBpbiBwcm9ncmVzcyBpZiBzZXQuCiAgICAgICAgICAgICAqICAgeHh4eHgxeHggPSBMaWdodCBwZW4gc3dpdGNoZWQgb24uCiAgICAgICAgICAgICAqICAgeHh4eHh4MXggPSBMaWdodCBwZW4gdHJpZ2dlciBzZXQuCiAgICAgICAgICAgICAqICAgeHh4eHh4eDEgPSBFaXRoZXIgdmVydGljYWwgb3IgaG9yaXpvbnRhbCByZXRyYWNlIAogICAgICAgICAgICAgKiAgICAgICAgICAgICAgaW4gcHJvZ3Jlc3MgaWYgc2V0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmV0ID0gMDsKICAgICAgICAgICAgaWYgKHZnYV9yZXRyYWNlX3ZlcnRpY2FsKQogICAgICAgICAgICAgICAgcmV0IHw9IDk7CiAgICAgICAgICAgIGlmICh2Z2FfcmV0cmFjZV9ob3Jpem9udGFsKQogICAgICAgICAgICAgICAgcmV0IHw9IDM7CiAgICAgICAgICAgIAogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBJZiBWR0EgbW9kZSBoYXMgYmVlbiBzZXQsIHZlcnRpY2FsIHJldHJhY2UgaXMKICAgICAgICAgICAgICogdHVybmVkIG9uIG9uY2UgYSBmcmFtZSBhbmQgY2xlYXJlZCBhZnRlciBlYWNoIHJlYWQuCiAgICAgICAgICAgICAqIFRoaXMgbWlnaHQgY2F1c2UgYXBwbGljYXRpb25zIHRoYXQgc3luY2hyb25pemUgd2l0aAogICAgICAgICAgICAgKiB2ZXJ0aWNhbCByZXRyYWNlIHRvIGFjdHVhbGx5IHNraXAgb25lIGZyYW1lIGJ1dCB0aGF0CiAgICAgICAgICAgICAqIGlzIHByb2JhYmx5IG5vdCBhIHByb2JsZW0uCiAgICAgICAgICAgICAqIAogICAgICAgICAgICAgKiBJZiBubyBWR0EgbW9kZSBoYXMgYmVlbiBzZXQsIHZlcnRpY2FsIHJldHJhY2UgaXMgZmFrZWQKICAgICAgICAgICAgICogYnkgdG9nZ2xpbmcgdGhlIHZhbHVlIGFmdGVyIGV2ZXJ5IHJlYWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZiAoVkdBX0lzVGltZXJSdW5uaW5nKCkpCiAgICAgICAgICAgICAgICB2Z2FfcmV0cmFjZV92ZXJ0aWNhbCA9IEZBTFNFOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICB2Z2FfcmV0cmFjZV92ZXJ0aWNhbCA9ICF2Z2FfcmV0cmFjZV92ZXJ0aWNhbDsKCiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIFRvZ2dsZSBob3Jpem9udGFsIHJldHJhY2UuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2Z2FfcmV0cmFjZV9ob3Jpem9udGFsID0gIXZnYV9yZXRyYWNlX2hvcml6b250YWw7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICByZXQ9MHhmZjsKICAgICAgICAgICAgRklYTUUoIlVuc3VwcG9ydGVkIFZHQSByZWdpc3RlcjogMHglMDR4XG4iLCBwb3J0KTsKICAgIH0KICAgIHJldHVybiByZXQ7Cn0KCnZvaWQgVkdBX0NsZWFuKHZvaWQpCnsKICAgIFZHQV9FeGl0KCk7CiAgICBWR0FfRGVpbnN0YWxsVGltZXIoKTsKfQo=