LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqLwoKLyoJQXQgdGhlIG1vbWVudCwgdGhlc2UgYXJlIG9ubHkgZW1wdHkgc3R1YnMuCiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAib2xlLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgInN0ZGRlYnVnLmgiCiNpbmNsdWRlICJkZWJ1Zy5oIgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRVc2VyRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMSkKICovCkRXT1JEIFdJTkFQSSBHZXRVc2VyRGVmYXVsdExDSUQoKQp7Ci8qIERlZmF1bHQgc29ydGluZywgbmV1dHJhbCBzdWJsYW5ndWFnZSAqLwojaWYgI0xBTkcoRW4pCglyZXR1cm4gOTsKI2VsaWYgI0xBTkcoRGUpCglyZXR1cm4gNzsKI2VsaWYgI0xBTkcoRXMpCglyZXR1cm4gNzsgLyogSnVzdCBhIEd1ZXNzIDotKSAqLwojZWxpZiAjTEFORyhObykKCXJldHVybiAweDE0OwojZWxzZQoJLyogTmV1dHJhbCBsYW5ndWFnZSAqLwoJcmV0dXJuIDA7CiNlbmRpZgp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TENJRCAgICAgICAoT0xFMk5MUy4yKQogKi8KRFdPUkQgV0lOQVBJIEdldFN5c3RlbURlZmF1bHRMQ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRVc2VyRGVmYXVsdExhbmdJRCAgICAgICAoT0xFMk5MUy4zKQogKi8KV09SRCBXSU5BUEkgR2V0VXNlckRlZmF1bHRMYW5nSUQoKQp7CglyZXR1cm4gKFdPUkQpR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFN5c3RlbURlZmF1bHRMYW5nSUQgICAgIChPTEUyTkxTLjQpCiAqLwpXT1JEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldExvY2FsZUluZm9BICAgICAgICAgICAgIChPTEUyTkxTLjUpCiAqIElzIHRoZSBsYXN0IHBhcmFtZXRlciByZWFsbHkgV09SRCBmb3IgV2luMTY/CiAqLwppbnQgV0lOQVBJIEdldExvY2FsZUluZm9BKERXT1JEIGxjaWQsRFdPUkQgTENUeXBlLExQU1RSIGJ1ZixXT1JEIGxlbikKewoJY2hhciAqcmV0U3RyaW5nOwogICAgaW50IHJldExlbjsKICAgIGRwcmludGZfb2xlKHN0ZGRlYiwiR2V0TG9jYWxlSW5mb0EoJThsWCwlOGxYLCVwLCU0WClcbiIsCgkJCWxjaWQsTENUeXBlLGJ1ZixsZW4pOwoJLyogV2luZSBpcyBzdXBwb3J0aW5nIG9ubHkgdGhlIGRlZmF1bHQgbG9jYWxlICovCglpZihsY2lkIT1HZXRVc2VyRGVmYXVsdExDSUQoKSkKCXsKCQlkcHJpbnRmX29sZShzdGRuaW1wLCJHZXRMb2NhbGVJbmZvQTogVW5rbm93biBsb2NhbGVcbiIpOwoJCXJldHVybiAwOwoJfQoJLyogQXMgYW4gb3B0aW9uLCB3ZSBjb3VsZCBvYnRhaW4gdGhlIHZhbHVlIGZyb20gd2luLmluaS4KCSAgIFRoaXMgd291bGQgbm90IG1hdGNoIHRoZSBXaW5lIGNvbXBpbGUtdGltZSBvcHRpb24uCgkgICBBbHNvLCBub3QgYWxsIGlkZW50aWZpZXJzIGFyZSBhdmFpbGFibGUgZnJvbSB3aW4uaW5pICovCglyZXRTdHJpbmc9MDsKCXJldExlbj0wOwoJLyogSWYgd2UgYXJlIHRocm91Z2ggYWxsIG9mIHRoaXMsIHJldExlbiBzaG91bGQgbm90IGJlIHplcm8gYW55bW9yZS4KCSAgIElmIGl0IGlzLCB0aGUgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCAqLwojZGVmaW5lIExPQ1ZBTCh0eXBlLHZhbHVlKQlpZih0eXBlPT1MQ1R5cGUpCQkJXAoJCQkJCQkJCXtyZXRMZW49c3RybGVuKHZhbHVlKSsxO1wKCQkJCQkJCQkgcmV0U3RyaW5nPXZhbHVlOyAgICAgICBcCgkJCQkJCQkJfQojZGVmaW5lIFVOU1VQUE9SVEVEKHR5cGUpICAgaWYodHlwZT09bGNpZClyZXRTdHJpbmc9I3R5cGU7CgovKiBJIHJlYWxseSB3aXNoIEkgd291bGQga25vdyBhIGJldHRlciB3YXkgdG8gZG8gdGhpcyAqLwpVTlNVUFBPUlRFRChMT0NBTEVfSUxBTkdVQUdFKQpVTlNVUFBPUlRFRChMT0NBTEVfU0xBTkdVQUdFKQpVTlNVUFBPUlRFRChMT0NBTEVfU0VOR0xBTkdVQUdFKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FKQpVTlNVUFBPUlRFRChMT0NBTEVfU05BVElWRUxBTkdOQU1FKQpVTlNVUFBPUlRFRChMT0NBTEVfSUNPVU5UUlkpClVOU1VQUE9SVEVEKExPQ0FMRV9TQ09VTlRSWSkKVU5TVVBQT1JURUQoTE9DQUxFX1NFTkdDT1VOVFJZKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVkNUUllOQU1FKQpVTlNVUFBPUlRFRChMT0NBTEVfU05BVElWRUNUUllOQU1FKQpVTlNVUFBPUlRFRChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSkKVU5TVVBQT1JURUQoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSkKVU5TVVBQT1JURUQoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpClVOU1VQUE9SVEVEKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NMSVNUKQpVTlNVUFBPUlRFRChMT0NBTEVfSU1FQVNVUkUpClVOU1VQUE9SVEVEKExPQ0FMRV9TREVDSU1BTCkKVU5TVVBQT1JURUQoTE9DQUxFX1NUSE9VU0FORCkKVU5TVVBQT1JURUQoTE9DQUxFX1NHUk9VUElORykKVU5TVVBQT1JURUQoTE9DQUxFX0lESUdJVFMpClVOU1VQUE9SVEVEKExPQ0FMRV9JTFpFUk8pClVOU1VQUE9SVEVEKExPQ0FMRV9JTkVHTlVNQkVSKQpVTlNVUFBPUlRFRChMT0NBTEVfU05BVElWRURJR0lUUykKVU5TVVBQT1JURUQoTE9DQUxFX1NDVVJSRU5DWSkKVU5TVVBQT1JURUQoTE9DQUxFX1NJTlRMU1lNQk9MKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTkRFQ0lNQUxTRVApClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhPVVNBTkRTRVApClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OR1JPVVBJTkcpClVOU1VQUE9SVEVEKExPQ0FMRV9JQ1VSUkRJR0lUUykKVU5TVVBQT1JURUQoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUykKVU5TVVBQT1JURUQoTE9DQUxFX0lDVVJSRU5DWSkKVU5TVVBQT1JURUQoTE9DQUxFX0lORUdDVVJSKQpVTlNVUFBPUlRFRChMT0NBTEVfU0RBVEUpClVOU1VQUE9SVEVEKExPQ0FMRV9TVElNRSkKVU5TVVBQT1JURUQoTE9DQUxFX1NTSE9SVERBVEUpClVOU1VQUE9SVEVEKExPQ0FMRV9TTE9OR0RBVEUpClVOU1VQUE9SVEVEKExPQ0FMRV9TVElNRUZPUk1BVCkKVU5TVVBQT1JURUQoTE9DQUxFX0lEQVRFKQpVTlNVUFBPUlRFRChMT0NBTEVfSUxEQVRFKQpVTlNVUFBPUlRFRChMT0NBTEVfSVRJTUUpClVOU1VQUE9SVEVEKExPQ0FMRV9JVElNRU1BUktQT1NOKQpVTlNVUFBPUlRFRChMT0NBTEVfSUNFTlRVUlkpClVOU1VQUE9SVEVEKExPQ0FMRV9JVExaRVJPKQpVTlNVUFBPUlRFRChMT0NBTEVfSURBWUxaRVJPKQpVTlNVUFBPUlRFRChMT0NBTEVfSU1PTkxaRVJPKQpVTlNVUFBPUlRFRChMT0NBTEVfUzExNTkpClVOU1VQUE9SVEVEKExPQ0FMRV9TMjM1OSkKVU5TVVBQT1JURUQoTE9DQUxFX0lDQUxFTkRBUlRZUEUpClVOU1VQUE9SVEVEKExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUikKVU5TVVBQT1JURUQoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykKVU5TVVBQT1JURUQoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIpClVOU1VQUE9SVEVEKExPQ0FMRV9TREFZTkFNRTEpClVOU1VQUE9SVEVEKExPQ0FMRV9TREFZTkFNRTIpClVOU1VQUE9SVEVEKExPQ0FMRV9TREFZTkFNRTMpClVOU1VQUE9SVEVEKExPQ0FMRV9TREFZTkFNRTQpClVOU1VQUE9SVEVEKExPQ0FMRV9TREFZTkFNRTUpClVOU1VQUE9SVEVEKExPQ0FMRV9TREFZTkFNRTYpClVOU1VQUE9SVEVEKExPQ0FMRV9TREFZTkFNRTcpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FMSkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUUyKQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTMpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FNCkKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUU1KQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTYpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FNykKVU5TVVBQT1JURUQoTE9DQUxFX1NNT05USE5BTUU4KQpVTlNVUFBPUlRFRChMT0NBTEVfU01PTlRITkFNRTkpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FMTApClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FMTEpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FMTIpClVOU1VQUE9SVEVEKExPQ0FMRV9TTU9OVEhOQU1FMTMpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyKQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCkKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNykKVU5TVVBQT1JURUQoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4KQpVTlNVUFBPUlRFRChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTkpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTApClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIpClVOU1VQUE9SVEVEKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMpClVOU1VQUE9SVEVEKExPQ0FMRV9TUE9TSVRJVkVTSUdOKQpVTlNVUFBPUlRFRChMT0NBTEVfU05FR0FUSVZFU0lHTikKVU5TVVBQT1JURUQoTE9DQUxFX0lQT1NTSUdOUE9TTikKVU5TVVBQT1JURUQoTE9DQUxFX0lORUdTSUdOUE9TTikKVU5TVVBQT1JURUQoTE9DQUxFX0lQT1NTWU1QUkVDRURFUykKVU5TVVBQT1JURUQoTE9DQUxFX0lQT1NTRVBCWVNQQUNFKQpVTlNVUFBPUlRFRChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKQpVTlNVUFBPUlRFRChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UpCgovKiBOb3csIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBkZWZpbml0aW9ucy4gVGhleSBkb24ndCBoYXZlIHRvIGJlCiAgIGNvbXBsZXRlICovCiNpZiAjTEFORyhEZSkKLyogVGhpcyBkZWZpbml0aW9ucyBhcHBseSB0byBHZXJtYW55IG9ubHkuIFVzZXJzIGluIEF1c3RyaWEgCiAgIG9yIFN3aXR6ZXJsYW5kIG1pZ2h0IHdhbnQgdG8gbW9kaWZ5IHRoZW0gKi8KTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKQpMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRGV1dHNjaCIpCkxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJHZXJtYW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZGV1IikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIkRldXRzY2giKQpMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCI0OSIpCkxPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIkRldXRzY2hsYW5kIikKTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiRGV1dHNjaGxhbmQiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiRGUiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiRGV1dHNjaGxhbmQiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjkiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiNDkiKQovKiBEdW5ubwpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpCiovCkxPQ1ZBTChMT0NBTEVfU0xJU1QsIjsiKQpMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCIwIikKTE9DVkFMKExPQ0FMRV9TREVDSU1BTCwiLCIpCkxPQ1ZBTChMT0NBTEVfU1RIT1VTQU5ELCIuIikKLyoKTE9DVkFMKExPQ0FMRV9TR1JPVVBJTkcpCiovCkxPQ1ZBTChMT0NBTEVfSURJR0lUUywiMiIpCkxPQ1ZBTChMT0NBTEVfSUxaRVJPLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JTkVHTlVNQkVSKQpJcyB0aGlzICIwMTIzNDU2Nzg5IiA/PwpMT0NWQUwoTE9DQUxFX1NOQVRJVkVESUdJVFMpCiovCkxPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCJETSIpCi8qCkxPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wpCkxPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVApCkxPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQKQpMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORykKKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywiMiIpCi8qCkxPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTKQoqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCIuIikKTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCkxPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwiZGQuTU0ueXl5eSIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJkZGQsIGQuIE1NTU0geXl5eSIpCi8qCkxPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpCiovCkxPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lMREFURSkKKi8KTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikKTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkKKi8KTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pCkxPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKQpMT0NWQUwoTE9DQUxFX1MxMTU5KQpMT0NWQUwoTE9DQUxFX1MyMzU5KQpMT0NWQUwoTE9DQUxFX0lDQUxFTkRBUlRZUEUpCkxPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIpCkxPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLKQpMT0NWQUwoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIpCiovCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCJNb250YWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMiwiRGllbnN0YWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywiTWl0dHdvY2giKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNCwiRG9ubmVyc3RhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCJGcmVpdGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsIlNvbm5hYmVuZCIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJTb25udGFnIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsIk1vIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIkRpIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIk1pIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIkRvIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsIkZyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsIlNhIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIlNvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiSmFudWFyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMiwiRmVicnVhciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsIk3kcnoiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJBcHJpbCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsIk1haSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsIkp1bmkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCJKdWxpIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiQXVndXN0IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwiU2VwdGVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTAsIk9rdG9iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwiTm92ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMiwiRGV6ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMywiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwiSmFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwiRmViIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywiTeRyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiQXByIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwiTWFpIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwiSnVuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywiSnVsIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwiQXVnIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwiU2VwIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIk9rdCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCJOb3YiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwiRGV6IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCi8qCkxPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTikKTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOKQpMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTikKTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04pCkxPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTKQpMT0NWQUwoTE9DQUxFX0lQT1NTRVBCWVNQQUNFKQpMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUykKTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSkKKi8KI2VuZGlmIC8qIExBTkcoRGUpICovCgovKkluc2VydCBvdGhlciBsYW5ndWFnZXMgaGVyZSovCgoKCglpZighcmV0TGVuKQoJewoJCWlmKCFyZXRTdHJpbmcpZnByaW50ZihzdGRlcnIsIlVua293biBMQyB0eXBlICVsWFxuIixMQ1R5cGUpOwoJCWVsc2UgZnByaW50ZihzdGRlcnIsIiclcycgbm90IHN1cHBvcnRlZCBmb3IgeW91ciBsYW5ndWFnZS5cbiIsCgkJCXJldFN0cmluZyk7CgkJcmV0dXJuIDA7Cgl9CgoJaWYocmV0TGVuPmxlbilyZXRMZW49bGVuOwoJc3RybmNweShidWYscmV0U3RyaW5nLGxlbik7CglyZXR1cm4gcmV0TGVuOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBDb21wYXJlU3RyaW5nQSAgICAgICAoT0xFMk5MUy44KQogKiBUaGlzIGltcGxlbWVudGF0aW9uIGlnbm9yZXMgdGhlIGxvY2FsZSwgYW5kIHRydXN0cyBpbiBsaWJjCiAqLwppbnQgQ29tcGFyZVN0cmluZ0EoRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAoJY2hhciAqczEsIGludCBsMSwgY2hhciAqczIsaW50IGwyKQp7CglpbnQgbGVuLHJldDsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVOT05TUEFDRSkKCXsKCQlmcHJpbnRmKHN0ZG5pbXAsICJDb21wYXJlU3RyaW5nQTogSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKCX0KCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCWZwcmludGYoc3RkbmltcCwgIkNvbXBhcmVTdHJpbmdBOiBJR05PUkVTWU1CT0xTIG5vdCBzdXBwb3J0ZWRcbiIpOwoJLyogSXMgc3RyY21wIGRlZmF1bHRpbmcgdG8gc3RyaW5nIHNvcnQgb3IgdG8gd29yZCBzb3J0Pz8gKi8KCS8qIEZJWE1FOiBIYW5kbGUgTk9STV9TVFJJTkdTT1JUICovCglsMSA9IChsMT09LTEpP3N0cmxlbihzMSk6bDE7CglsMiA9IChsMj09LTEpP3N0cmxlbihzMik6bDI7CglsZW4gPSBsMTxsMiA/IGwxOmwyOwoJcmV0ID0gKGZkd1N0eWxlICYgTk9STV9JR05PUkVDQVNFKSA/CgkJc3RybmNhc2VjbXAoczEsczIsbGVuKQk6CgkJc3RybmNtcChzMSxzMixsZW4pOwoJLyogbm90IGVxdWFsLCByZXR1cm4gMSBvciAzICovCglpZihyZXQhPTApcmV0dXJuIHJldCsyOwoJLyogc2FtZSBsZW4sIHJldHVybiAyICovCglpZihsMT09bDIpcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9Cgo=