LyoKICoJT0xFMk5MUyBsaWJyYXJ5CiAqCiAqCUNvcHlyaWdodCAxOTk1CU1hcnRpbiB2b24gTG9ld2lzCiAqICAgICAgQ29weXJpZ2h0IDE5OTggIERhdmlkIExlZSBMYW1iZXJ0CiAqLwoKI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAiaGVhcC5oIgojaW5jbHVkZSAib2xlLmgiCiNpbmNsdWRlICJvcHRpb25zLmgiCiNpbmNsdWRlICJ3aW5ubHMuaCIKI2luY2x1ZGUgIndpbnJlZy5oIgojaW5jbHVkZSAid2luZXJyb3IuaCIKI2luY2x1ZGUgImRlYnVnLmgiCgovKiBMb2NhbGUgbmFtZSB0byBpZCBtYXAuIHVzZWQgYnkgRW51bVN5c3RlbUxvY2FsZXMsIEdldExvY2FsSW5mb0EgCiAqIE1VU1QgY29udGFpbiBhbGwgI2RlZmluZXMgZnJvbSB3aW5ubHMuaAogKiBsYXN0IGVudHJ5IGhhcyBOVUxMIG5hbWUsIDAgaWQuCiAqLyAKI2RlZmluZSBMT0NBTEVfRU5UUlkoeCkJeyN4LExPQ0FMRV8jI3h9CnN0YXRpYyBzdHJ1Y3QgdGFnTE9DQUxFX05BTUUySUQgewoJY2hhcgkqbmFtZTsKCURXT1JECWlkOwp9IGxvY2FsZV9uYW1lMmlkW109IHsKCUxPQ0FMRV9FTlRSWShJTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKFNMQU5HVUFHRSksCglMT0NBTEVfRU5UUlkoU0VOR0xBTkdVQUdFKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTEFOR05BTUUpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVMQU5HTkFNRSksCglMT0NBTEVfRU5UUlkoSUNPVU5UUlkpLAoJTE9DQUxFX0VOVFJZKFNDT1VOVFJZKSwKCUxPQ0FMRV9FTlRSWShTRU5HQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkNUUllOQU1FKSwKCUxPQ0FMRV9FTlRSWShTTkFUSVZFQ1RSWU5BTUUpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUTEFOR1VBR0UpLAoJTE9DQUxFX0VOVFJZKElERUZBVUxUQ09VTlRSWSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRDT0RFUEFHRSksCglMT0NBTEVfRU5UUlkoSURFRkFVTFRBTlNJQ09ERVBBR0UpLAoJTE9DQUxFX0VOVFJZKFNMSVNUKSwKCUxPQ0FMRV9FTlRSWShJTUVBU1VSRSksCglMT0NBTEVfRU5UUlkoU0RFQ0lNQUwpLAoJTE9DQUxFX0VOVFJZKFNUSE9VU0FORCksCglMT0NBTEVfRU5UUlkoU0dST1VQSU5HKSwKCUxPQ0FMRV9FTlRSWShJRElHSVRTKSwKCUxPQ0FMRV9FTlRSWShJTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElORUdOVU1CRVIpLAoJTE9DQUxFX0VOVFJZKFNOQVRJVkVESUdJVFMpLAoJTE9DQUxFX0VOVFJZKFNDVVJSRU5DWSksCglMT0NBTEVfRU5UUlkoU0lOVExTWU1CT0wpLAoJTE9DQUxFX0VOVFJZKFNNT05ERUNJTUFMU0VQKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhPVVNBTkRTRVApLAoJTE9DQUxFX0VOVFJZKFNNT05HUk9VUElORyksCglMT0NBTEVfRU5UUlkoSUNVUlJESUdJVFMpLAoJTE9DQUxFX0VOVFJZKElJTlRMQ1VSUkRJR0lUUyksCglMT0NBTEVfRU5UUlkoSUNVUlJFTkNZKSwKCUxPQ0FMRV9FTlRSWShJTkVHQ1VSUiksCglMT0NBTEVfRU5UUlkoU0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FKSwKCUxPQ0FMRV9FTlRSWShTU0hPUlREQVRFKSwKCUxPQ0FMRV9FTlRSWShTTE9OR0RBVEUpLAoJTE9DQUxFX0VOVFJZKFNUSU1FRk9STUFUKSwKCUxPQ0FMRV9FTlRSWShJREFURSksCglMT0NBTEVfRU5UUlkoSUxEQVRFKSwKCUxPQ0FMRV9FTlRSWShJVElNRSksCglMT0NBTEVfRU5UUlkoSVRJTUVNQVJLUE9TTiksCglMT0NBTEVfRU5UUlkoSUNFTlRVUlkpLAoJTE9DQUxFX0VOVFJZKElUTFpFUk8pLAoJTE9DQUxFX0VOVFJZKElEQVlMWkVSTyksCglMT0NBTEVfRU5UUlkoSU1PTkxaRVJPKSwKCUxPQ0FMRV9FTlRSWShTMTE1OSksCglMT0NBTEVfRU5UUlkoUzIzNTkpLAoJTE9DQUxFX0VOVFJZKElDQUxFTkRBUlRZUEUpLAoJTE9DQUxFX0VOVFJZKElPUFRJT05BTENBTEVOREFSKSwKCUxPQ0FMRV9FTlRSWShJRklSU1REQVlPRldFRUspLAoJTE9DQUxFX0VOVFJZKElGSVJTVFdFRUtPRllFQVIpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FMSksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUUyKSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNCksCglMT0NBTEVfRU5UUlkoU0RBWU5BTUU1KSwKCUxPQ0FMRV9FTlRSWShTREFZTkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNEQVlOQU1FNyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FMyksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWREFZTkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZEQVlOQU1FNiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVkRBWU5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTIpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUzKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNCksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTUpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU2KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FNyksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTgpLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUU5KSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTApLAoJTE9DQUxFX0VOVFJZKFNNT05USE5BTUUxMSksCglMT0NBTEVfRU5UUlkoU01PTlRITkFNRTEyKSwKCUxPQ0FMRV9FTlRSWShTTU9OVEhOQU1FMTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMiksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTMpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU0KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FNSksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTYpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUU3KSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FOCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTkpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMCksCglMT0NBTEVfRU5UUlkoU0FCQlJFVk1PTlRITkFNRTExKSwKCUxPQ0FMRV9FTlRSWShTQUJCUkVWTU9OVEhOQU1FMTIpLAoJTE9DQUxFX0VOVFJZKFNBQkJSRVZNT05USE5BTUUxMyksCglMT0NBTEVfRU5UUlkoU1BPU0lUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoU05FR0FUSVZFU0lHTiksCglMT0NBTEVfRU5UUlkoSVBPU1NJR05QT1NOKSwKCUxPQ0FMRV9FTlRSWShJTkVHU0lHTlBPU04pLAoJTE9DQUxFX0VOVFJZKElQT1NTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSVBPU1NFUEJZU1BBQ0UpLAoJTE9DQUxFX0VOVFJZKElORUdTWU1QUkVDRURFUyksCglMT0NBTEVfRU5UUlkoSU5FR1NFUEJZU1BBQ0UpLAovKglMT0NBTEVfRU5UUlkoRk9OVFNJR05BVFVSRSksKi8KCXtOVUxMLDB9LAp9OwoKY29uc3Qgc3RydWN0IG1hcF9sY2lkMnN0ciB7CglMQ0lECQlsYW5naWQ7Cgljb25zdCBjaGFyCSpsYW5nbmFtZTsKfSBsYW5ndWFnZXNbXT17Cgl7MHgwNDAxLCJBcmFiaXNjaCJ9LAoJezB4MDQwMiwiQnVsZ2FyaXNjaCJ9LAoJezB4MDQwMywiS2F0YWxhbmlzY2gifSwKCXsweDA0MDQsIlRyYWRpdGlvbmFsZXMgQ2hpbmVzaXNjaCJ9LAoJezB4MDQwNSwiVHNjaGVjaXNjaCJ9LAoJezB4MDQwNiwiRORuaXNjaCJ9LAoJezB4MDQwNywiRGV1dHNjaCJ9LAoJezB4MDQwOCwiR3JpZWNoaXNjaCJ9LAoJezB4MDQwOSwiQW1lcmlrYW5pc2NoZXMgRW5nbGlzY2gifSwKCXsweDA0MEEsIkthc3RpbGlzY2hlcyBTcGFuaXNjaCJ9LAoJezB4MDQwQiwiRmlubmlzY2gifSwKCXsweDA0MEMsIkZyYW56dnNpc2NoIn0sCgl7MHgwNDBELCJIZWJyZGlzY2gifSwKCXsweDA0MEUsIlVuZ2FyaXNjaCJ9LAoJezB4MDQwRiwiSXNsZG5kaXNjaCJ9LAoJezB4MDQxMCwiSXRhbGllbmlzY2gifSwKCXsweDA0MTEsIkphcGFuaXNjaCJ9LAoJezB4MDQxMiwiS29yZWFuaXNjaCJ9LAoJezB4MDQxMywiTmllZGVybGRuZGlzY2gifSwKCXsweDA0MTQsIk5vcndlZ2lzY2gtQm9rbWFsIn0sCgl7MHgwNDE1LCJQb2xuaXNjaCJ9LAoJezB4MDQxNiwiQnJhc2lsaWFuaXNjaGVzIFBvcnR1Z2llc2lzY2gifSwKCXsweDA0MTcsIlJkdG9yb21hbmlzY2gifSwKCXsweDA0MTgsIlJ1bWRuaXNjaCJ9LAoJezB4MDQxOSwiUnVzc2lzY2gifSwKCXsweDA0MUEsIktyb2F0b3NlcmJpc2NoIChsYXRlaW5pc2NoKSJ9LAoJezB4MDQxQiwiU2xvd2VuaXNjaCJ9LAoJezB4MDQxQywiQWxiYW5pc2NoIn0sCgl7MHgwNDFELCJTY2h3ZWRpc2NoIn0sCgl7MHgwNDFFLCJUaGFpIn0sCgl7MHgwNDFGLCJUfHJraXNjaCJ9LAoJezB4MDQyMCwiVXJkdSJ9LAoJezB4MDQyMSwiQmFoYXNhIn0sCgl7MHgwODA0LCJWZXJlaW5mYWNodGVzIENoaW5lc2lzY2gifSwKCXsweDA4MDcsIlNjaHdlaXplcmRldXRzY2gifSwKCXsweDA4MDksIkJyaXRpc2NoZXMgRW5nbGlzY2gifSwKCXsweDA4MEEsIk1leGlrYW5pc2NoZXMgU3BhbmlzY2gifSwKCXsweDA4MEMsIkJlbGdpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDA4MTAsIlNjaHdlaXplcmlzY2hlcyBJdGFsaWVuaXNjaCJ9LAoJezB4MDgxMywiQmVsZ2lzY2hlcyBOaWVkZXJsZG5kaXNjaCJ9LAoJezB4MDgxNCwiTm9yZ3dlZ2lzY2gtTnlub3JzayJ9LAoJezB4MDgxNiwiUG9ydHVnaWVzaXNjaCJ9LAoJezB4MDgxQSwiU2VyYm9rcmF0aXNjaCAoa3lyaWxsaXNjaCkifSwKCXsweDBDMUMsIkthbmFkaXNjaGVzIEZyYW56dnNpc2NoIn0sCgl7MHgxMDBDLCJTY2h3ZWl6ZXJpc2NoZXMgRnJhbnp2c2lzY2gifSwKCXsweDAwMDAsIlVuYmVrYW5udCJ9LAp9OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICBHZXRVc2VyRGVmYXVsdExDSUQgICAgICAgKE9MRTJOTFMuMSkKICovCkxDSUQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TENJRCgpCnsKLyogRGVmYXVsdCBzb3J0aW5nLCBuZXV0cmFsIHN1Ymxhbmd1YWdlICovCiAgICBzd2l0Y2goT3B0aW9ucy5sYW5ndWFnZSkKICAgIHsKIC8qIGNhc2UgTEFOR19CdTogcmV0dXJuIDB4MDI7ICovICAgICAgLyogQnVsZ2FyaWFuICovCiAvKiBjYXNlIExBTkdfQ2g6IHJldHVybiAweDA0OyAqLyAgICAgIC8qIENoaW5lc2UgKi8KICAgIGNhc2UgTEFOR19DejogcmV0dXJuIDB4MDU7ICAgICAgICAgLyogQ3plY2ggKi8KICAgIGNhc2UgTEFOR19EYTogcmV0dXJuIDB4MDY7ICAgICAgICAgLyogRGFuaXNoICovCiAgICBjYXNlIExBTkdfRGU6IHJldHVybiAweDA3OyAgICAgICAgIC8qIEdlcm1hbiAqLwogLyogY2FzZSBMQU5HX0dyOiByZXR1cm4gMHgwODsgKi8gICAgICAvKiBHcmVlayAqLwogICAgY2FzZSBMQU5HX0VuOiByZXR1cm4gMHgwOTsgICAgICAgICAvKiBFbmdsaXNoICovCiAgICBjYXNlIExBTkdfRXM6IHJldHVybiAweDBhOyAgICAgICAgIC8qIFNwYW5pc2ggKi8KICAgIGNhc2UgTEFOR19GaTogcmV0dXJuIDB4MGI7ICAgICAgICAgLyogRmlubmlzaCAqLwogICAgY2FzZSBMQU5HX0ZyOiByZXR1cm4gMHgwYzsgICAgICAgICAvKiBGcmVuY2ggKi8KICAgIGNhc2UgTEFOR19IdTogcmV0dXJuIDB4MGU7ICAgICAgICAgLyogSHVuZ2FyaWFuICovCiAvKiBjYXNlIExBTkdfSWM6IHJldHVybiAweDBmOyAqLyAgICAgIC8qIEljZWxhbmRpYyAqLwogICAgY2FzZSBMQU5HX0l0OiByZXR1cm4gMHgxMDsgICAgICAgICAvKiBJdGFsaWFuICovCiAvKiBjYXNlIExBTkdfSnA6IHJldHVybiAweDExOyAqLyAgICAgIC8qIEphcGFuZXNlICovCiAgICBjYXNlIExBTkdfS286IHJldHVybiAweDEyOyAgICAgICAgIC8qIEtvcmVhbiAqLwogLyogY2FzZSBMQU5HX0R1OiByZXR1cm4gMHgxMzsgKi8gICAgICAvKiBEdXRjaCAqLwogICAgY2FzZSBMQU5HX05vOiByZXR1cm4gMHgxNDsgICAgICAgICAvKiBOb3J3ZWdpYW4gKi8KICAgIGNhc2UgTEFOR19QbDogcmV0dXJuIDB4MTU7ICAgICAgICAgLyogUG9saXNoICovCiAgICBjYXNlIExBTkdfUG86IHJldHVybiAweDE2OyAgICAgICAgIC8qIFBvcnR1Z3Vlc2UgKi8KIC8qIGNhc2UgTEFOR19SbzogcmV0dXJuIDB4MTg7ICovICAgICAgLyogUm9tYW5pYW4gKi8KIC8qIGNhc2UgTEFOR19SdTogcmV0dXJuIDB4MTk7ICovICAgICAgLyogUnVzc2lhbiAqLwogLyogY2FzZSBMQU5HX0NyOiByZXR1cm4gMHgxYTsgKi8gICAgICAvKiBDcm9hdGlhbiAqLwogLyogY2FzZSBMQU5HX1NsOiByZXR1cm4gMHgxYjsgKi8gICAgICAvKiBTbG92YWsgKi8KICAgIGNhc2UgTEFOR19TdzogcmV0dXJuIDB4MWQ7ICAgICAgICAgLyogU3dlZGlzaCAqLwogLyogY2FzZSBMQU5HX1R1OiByZXR1cm4gMHgxZjsgKi8gICAgICAvKiBUdXJraXNoICovCiAvKiBjYXNlIExBTkdfU3Y6IHJldHVybiAweDI0OyAqLyAgICAgIC8qIFNsb3ZlbmlhbiAqLwogICAgY2FzZSBMQU5HX0VvOiByZXR1cm4gMHgyNTsgICAgICAgICAvKiBFc3BlcmFudG8gKG5vdCBvZmZpY2lhbCkgKi8KICAgIGNhc2UgTEFOR19DYTogcmV0dXJuIDB4MjY7ICAgICAgICAgLyogQ2F0YWxhbiAqLwoKICAgIGRlZmF1bHQ6CglyZXR1cm4gMHgwMDsgICAgICAgICAgICAgICAgICAgLyogTmV1dHJhbCBsYW5ndWFnZSAqLwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TENJRCAgICAgICAoT0xFMk5MUy4yKQogKi8KTENJRCBXSU5BUEkgR2V0U3lzdGVtRGVmYXVsdExDSUQoKQp7CglyZXR1cm4gR2V0VXNlckRlZmF1bHRMQ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldFVzZXJEZWZhdWx0TGFuZ0lEICAgICAgIChPTEUyTkxTLjMpCiAqLwpMQU5HSUQgV0lOQVBJIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIChXT1JEKUdldFVzZXJEZWZhdWx0TENJRCgpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEICAgICAoT0xFMk5MUy40KQogKi8KTEFOR0lEIFdJTkFQSSBHZXRTeXN0ZW1EZWZhdWx0TGFuZ0lEKCkKewoJcmV0dXJuIEdldFVzZXJEZWZhdWx0TGFuZ0lEKCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldExvY2FsZUluZm9BICAgICAgICAgICAgIChPTEUyTkxTLjUpCiAqIElzIHRoZSBsYXN0IHBhcmFtZXRlciByZWFsbHkgV09SRCBmb3IgV2luMTY/CiAqLwpJTlQxNiBXSU5BUEkgR2V0TG9jYWxlSW5mbzE2KExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQU1RSIGJ1ZixJTlQxNiBsZW4pCnsKCXJldHVybiBHZXRMb2NhbGVJbmZvMzJBKGxjaWQsTENUeXBlLGJ1ZixsZW4pOwp9CgpJTlQzMiBXSU5BUEkgR2V0TG9jYWxlSW5mbzMyQShMQ0lEIGxjaWQsTENUWVBFIExDVHlwZSxMUFNUUiBidWYsSU5UMzIgbGVuKQp7CgljaGFyCSpyZXRTdHJpbmc7CglpbnQJZm91bmQsaTsKCglUUkFDRShvbGUsIiglOGxYLCU4bFgsJXAsJTRYKVxuIiwKCQkJbGNpZCxMQ1R5cGUsYnVmLGxlbik7CgoJTENUeXBlICY9IH4oTE9DQUxFX05PVVNFUk9WRVJSSURFfExPQ0FMRV9VU0VfQ1BfQUNQKTsKCgkvKiBBcyBhbiBvcHRpb24sIHdlIGNvdWxkIG9idGFpbiB0aGUgdmFsdWUgZnJvbSB3aW4uaW5pLgoJICAgVGhpcyB3b3VsZCBub3QgbWF0Y2ggdGhlIFdpbmUgY29tcGlsZS10aW1lIG9wdGlvbi4KCSAgIEFsc28sIG5vdCBhbGwgaWRlbnRpZmllcnMgYXJlIGF2YWlsYWJsZSBmcm9tIHdpbi5pbmkgKi8KCXJldFN0cmluZz0wOwoJLyogSWYgd2UgYXJlIHRocm91Z2ggYWxsIG9mIHRoaXMsIHJldExlbiBzaG91bGQgbm90IGJlIHplcm8gYW55bW9yZS4KCSAgIElmIGl0IGlzLCB0aGUgdmFsdWUgaXMgbm90IHN1cHBvcnRlZCAqLwoJaT0wOwoJd2hpbGUgKGxvY2FsZV9uYW1lMmlkW2ldLm5hbWUhPU5VTEwpIHsKCQlpZiAoTENUeXBlID09IGxvY2FsZV9uYW1lMmlkW2ldLmlkKSB7CgkJCXJldFN0cmluZyA9IGxvY2FsZV9uYW1lMmlkW2ldLm5hbWU7CgkJCWJyZWFrOwoJCX0KCQlpKys7Cgl9CglpZiAoIXJldFN0cmluZykgewoJCVdBUk4ob2xlLCJVbmtvd24gTEMgdHlwZSAlbFhcbiIsTENUeXBlKTsKCQlyZXR1cm4gMDsKCX0KCiNkZWZpbmUgTE9DVkFMKHR5cGUsdmFsdWUpIGNhc2UgdHlwZTpyZXRTdHJpbmc9dmFsdWU7YnJlYWs7CgovKiBOb3csIHRoZSBsYW5ndWFnZSBzcGVjaWZpYyBkZWZpbml0aW9ucy4gVGhleSBkb24ndCBoYXZlIHRvIGJlCiAgIGNvbXBsZXRlICovCiAgICBmb3VuZD0xOwogICAgc3dpdGNoKE9wdGlvbnMubGFuZ3VhZ2UpCiAgICB7CiAgICBjYXNlIExBTkdfRGU6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKLyogVGhpcyBkZWZpbml0aW9ucyBhcHBseSB0byBHZXJtYW55IG9ubHkuIFVzZXJzIGluIEF1c3RyaWEgCiAgIG9yIFN3aXR6ZXJsYW5kIG1pZ2h0IHdhbnQgdG8gbW9kaWZ5IHRoZW0gKi8KTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKQpMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRGV1dHNjaCIpCkxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJHZXJtYW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZGV1IikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIkRldXRzY2giKQpMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCI0OSIpCkxPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIkRldXRzY2hsYW5kIikKTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiRGV1dHNjaGxhbmQiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiRGUiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiRGV1dHNjaGxhbmQiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjkiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiNDkiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsIjg1MSIpCi8qIER1bm5vCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpCiovCkxPQ1ZBTChMT0NBTEVfU0xJU1QsIjsiKQpMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCIwIikKTE9DVkFMKExPQ0FMRV9TREVDSU1BTCwiLCIpCkxPQ1ZBTChMT0NBTEVfU1RIT1VTQU5ELCIuIikKLyoKTE9DVkFMKExPQ0FMRV9TR1JPVVBJTkcpCiovCkxPQ1ZBTChMT0NBTEVfSURJR0lUUywiMiIpCkxPQ1ZBTChMT0NBTEVfSUxaRVJPLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JTkVHTlVNQkVSKQpJcyB0aGlzICIwMTIzNDU2Nzg5IiA/PwpMT0NWQUwoTE9DQUxFX1NOQVRJVkVESUdJVFMpCiovCkxPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCJETSIpCi8qCkxPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wpCkxPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVApCkxPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQKQpMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORykKKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywiMiIpCi8qCkxPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTKQoqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCIuIikKTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCkxPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwiZGQuTU0ueXl5eSIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJkZGQsIGQuIE1NTU0geXl5eSIpCi8qCkxPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpCiovCkxPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lMREFURSkKKi8KTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikKTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkKKi8KTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pCkxPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKQpMT0NWQUwoTE9DQUxFX1MxMTU5KQpMT0NWQUwoTE9DQUxFX1MyMzU5KQpMT0NWQUwoTE9DQUxFX0lDQUxFTkRBUlRZUEUpCkxPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIpCkxPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLKQpMT0NWQUwoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIpCiovCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCJNb250YWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMiwiRGllbnN0YWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywiTWl0dHdvY2giKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNCwiRG9ubmVyc3RhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCJGcmVpdGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsIlNvbm5hYmVuZCIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJTb25udGFnIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsIk1vIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIkRpIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIk1pIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIkRvIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsIkZyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsIlNhIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIlNvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiSmFudWFyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMiwiRmVicnVhciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsIk3kcnoiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJBcHJpbCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsIk1haSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsIkp1bmkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCJKdWxpIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiQXVndXN0IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwiU2VwdGVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTAsIk9rdG9iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwiTm92ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMiwiRGV6ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMywiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwiSmFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwiRmViIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywiTeRyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiQXByIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwiTWFpIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwiSnVuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywiSnVsIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwiQXVnIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwiU2VwIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIk9rdCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCJOb3YiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwiRGV6IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCi8qCkxPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTikKTE9DVkFMKExPQ0FMRV9TTkVHQVRJVkVTSUdOKQpMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTikKTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04pCkxPQ1ZBTChMT0NBTEVfSVBPU1NZTVBSRUNFREVTKQpMT0NWQUwoTE9DQUxFX0lQT1NTRVBCWVNQQUNFKQpMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUykKTE9DVkFMKExPQ0FMRV9JTkVHU0VQQllTUEFDRSkKKi8KCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoRGUpICovCgogICAgY2FzZSBMQU5HX0RhOgogICAgCXN3aXRjaCAoTENUeXBlKSB7CkxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI2IikKTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIkRhbnNrIikKTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkRhbmlzaCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJkYW4iKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiRGFuc2siKQpMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCI0NSIpCkxPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIkRhbm1hcmsiKQpMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJEZW5tYXJrIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkRLIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIkRhbm1hcmsiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjYiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiNDUiKQovKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCi8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkxPQ1ZBTChMT0NBTEVfU0xJU1QsIjsiKQpMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCIwIikKTE9DVkFMKExPQ0FMRV9TREVDSU1BTCwiLCIpCkxPQ1ZBTChMT0NBTEVfU1RIT1VTQU5ELCIuIikKLyogTE9DVkFMKExPQ0FMRV9TR1JPVVBJTkcpICovCkxPQ1ZBTChMT0NBTEVfSURJR0lUUywiMiIpCkxPQ1ZBTChMT0NBTEVfSUxaRVJPLCIxIikKLyogTE9DVkFMKExPQ0FMRV9JTkVHTlVNQkVSKSAqLwovKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVESUdJVFMpICovCkxPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCJrciIpCi8qIExPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wpICovCkxPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVAsIiwiKQpMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCwiLiIpCi8qIExPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HKSAqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRElHSVRTLCIyIikKLyogTE9DVkFMKExPQ0FMRV9JSU5UTENVUlJESUdJVFMpICovCkxPQ1ZBTChMT0NBTEVfSUNVUlJFTkNZLCIzIikKTE9DVkFMKExPQ0FMRV9JTkVHQ1VSUiwiOCIpCkxPQ1ZBTChMT0NBTEVfU0RBVEUsIi4iKQpMT0NWQUwoTE9DQUxFX1NUSU1FLCI6IikKTE9DVkFMKExPQ0FMRV9TU0hPUlREQVRFLCJkZC9NTS15eXl5IikKTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsImRkZCwgZC4gTU1NTSB5eXl5IikKLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwpMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwpMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQovKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCkxPQ1ZBTChMT0NBTEVfUzExNTksICIiKQpMT0NWQUwoTE9DQUxFX1MyMzU5LCAiIikKLyogTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykgKi8KLyogTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKSAqLwpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwiTWFuZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIlRpcnNkYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywiT25zZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIlRvcnNkYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwiRnJlZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsIkz4cmRhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJT+G5kYWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwiTWEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwiVGkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMywiT24iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwiVG8iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwiRnIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNiwiTPgiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywiU/giKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxLCJKYW51YXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJGZWJydWFyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywiTWFydHMiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJBcHJpbCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsIk1haiIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsIkp1bmkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCJKdWxpIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiQXVndXN0IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwiU2VwdGVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTAsIk9rdG9iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwiTm92ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMiwiRGVjZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMywiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwiSmFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwiRmViIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMywiTWFyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwiQXByIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwiTWFqIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwiSnVuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywiSnVsIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwiQXVnIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwiU2VwIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsIk9rdCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCJOb3YiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMiwiRGVjIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsIiIpCkxPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTiwgIiIpCkxPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTiwgIi0iKQpMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTiwgIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTiwgIjMiKQpMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUywgIjEiKQpMT0NWQUwoTE9DQUxFX0lQT1NTRVBCWVNQQUNFLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UsICIwIikKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgLyogTEFORyhEYSkgKi8KCiAgICBjYXNlIExBTkdfRW46CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsICIwNDA5IikKTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsICJFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSIpCkxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCAiRW5nbGlzaCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCAiRU5VIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsICJFbmdsaXNoIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwgIjEiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCAiVW5pdGVkIFN0YXRlcyIpCkxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksICJVbml0ZWQgU3RhdGVzIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsICJVU0EiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwgIlVuaXRlZCBTdGF0ZXMiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsICIwNDA5IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksICIxIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCAiNDM3IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgIjEyNTIiKQpMT0NWQUwoTE9DQUxFX1NMSVNULCAiLCIpCkxPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsICIxIikKTE9DVkFMKExPQ0FMRV9TREVDSU1BTCwgIi4iKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwgIiwiKQpMT0NWQUwoTE9DQUxFX1NHUk9VUElORywgIjM7MCIpCkxPQ1ZBTChMT0NBTEVfSURJR0lUUywgIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywgIjEiKQpMT0NWQUwoTE9DQUxFX0lORUdOVU1CRVIsICIxIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTLCAiMDEyMzQ1Njc4OSIpCkxPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCAiJCIpCkxPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wsICJVU0QiKQpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQLCAiLiIpCkxPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQLCAiLCIpCkxPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HLCAiMzswIikKTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywgIjIiKQpMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUywgIjIiKQpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCAiMCIpCkxPQ1ZBTChMT0NBTEVfU0RBVEUsICIvIikKTE9DVkFMKExPQ0FMRV9TVElNRSwgIjoiKQpMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsICJNL2QveXkiKQpMT0NWQUwoTE9DQUxFX1NMT05HREFURSwgImRkZGQsIE1NTU0gZGQsIHl5eXkiKQpMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFULCAiaDptbTpzcyB0dCIpCkxPQ1ZBTChMT0NBTEVfSURBVEUsICIwIikKTE9DVkFMKExPQ0FMRV9JTERBVEUsICIwIikKTE9DVkFMKExPQ0FMRV9JVElNRSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04sICIwIikKTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lUTFpFUk8sICIwIikKTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8sICIwIikKTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8sICIwIikKTE9DVkFMKExPQ0FMRV9TMTE1OSwgIkFNIikKTE9DVkFMKExPQ0FMRV9TMjM1OSwgIlBNIikKTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIsICIwIikKTE9DVkFMKExPQ0FMRV9JRklSU1REQVlPRldFRUssICI2IikKTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSLCAiMCIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCAiTW9uZGF5IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsICJUdWVzZGF5IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsICJXZWRuZXNkYXkiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNCwgIlRodXJzZGF5IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTUsICJGcmlkYXkiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwgIlNhdHVyZGF5IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsICJTdW5kYXkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwgIk1vbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCAiVHVlIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsICJXZWQiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwgIlRodSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCAiRnJpIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsICJTYXQiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywgIlN1biIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsICJKYW51YXJ5IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMiwgIkZlYnJ1YXJ5IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywgIk1hcmNoIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwgIkFwcmlsIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNSwgIk1heSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsICJKdW5lIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywgIkp1bHkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU4LCAiQXVndXN0IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwgIlNlcHRlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCAiT2N0b2JlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCAiTm92ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMiwgIkRlY2VtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsICIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCAiSmFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwgIkZlYiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsICJNYXIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCAiQXByIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwgIk1heSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsICJKdW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCAiSnVsIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwgIkF1ZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksICJTZXAiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwgIk9jdCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCAiTm92IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsICJEZWMiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywgIiIpCkxPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTiwgIiIpCkxPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTiwgIi0iKQpMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTiwgIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTiwgIjAiKQpMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUywgIjEiKQpMT0NWQUwoTE9DQUxFX0lQT1NTRVBCWVNQQUNFLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UsICIwIikKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgIC8qIExBTkcoRW4pICovCgogICAgY2FzZSBMQU5HX0VvOgogICAgCXN3aXRjaCAoTENUeXBlKSB7Ci8qIExPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCI5IikgSVNPIG51bWVyaWNhbCBJRCBmb3IgbGFuZ3VhZ2UgVE9ETyAqLwpMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiRXNwZXJhbnRvIikKTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkVzcGVyYW50byIpCi8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJkZXUiKSAqLwpMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiRXNwZXJhbnRvIikKLyogTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiNDkiKSBub3Qgb2ZmaWNpYWwgaW4gYW55IG9uZSBjb3VudHJ5ICovCi8qIExPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIkRldXRzY2hsYW5kIikgKi8KLyogTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiR2VybWFueSIpICovCi8qIExPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJEZSIpICovCi8qIExPQ1ZBTChMT0NBTEVfU05BVElWRUNUUllOQU1FLCJEZXV0c2NobGFuZCIpICovCi8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpIElTTyBJRCBvZiBsYW5nIFRPRE8gKi8KLyogTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ5IikgKi8KTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCIzIikgLyogaXMgdGhpcyByaWdodD8gVE9ETyAqLwpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFLCIzIikgLyogaXMgdGhpcyByaWdodD8gVE9ETyAqLwpMT0NWQUwoTE9DQUxFX1NMSVNULCI7IikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiLiIpCi8qIExPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKSAqLwpMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUikgKi8KLyogTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTKSAqLwpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwiTkxHIikgLyogYWNjb3VudGluZyBjdXJyZW5jeSBvZiBVRUEgKi8KLyogTE9DVkFMKExPQ0FMRV9TSU5UTFNZTUJPTCkgKi8KLyogTE9DVkFMKExPQ0FMRV9TTU9OREVDSU1BTFNFUCkgKi8KLyogTE9DVkFMKExPQ0FMRV9TTU9OVEhPVVNBTkRTRVApICovCi8qIExPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lDVVJSRElHSVRTLCIyIikgKi8KLyogTE9DVkFMKExPQ0FMRV9JSU5UTENVUlJESUdJVFMpICovCkxPQ1ZBTChMT0NBTEVfSUNVUlJFTkNZLCIzIikKTE9DVkFMKExPQ0FMRV9JTkVHQ1VSUiwiOCIpCkxPQ1ZBTChMT0NBTEVfU0RBVEUsIi4iKQpMT0NWQUwoTE9DQUxFX1NUSU1FLCI6IikKTE9DVkFMKExPQ0FMRV9TU0hPUlREQVRFLCJ5eXl5Lm1tLmRkIikKTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsImRkZCwgZC4gTU1NTSB5eXl5IikKLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwpMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwpMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQovKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCi8qIExPQ1ZBTChMT0NBTEVfUzExNTkpICovCi8qIExPQ1ZBTChMT0NBTEVfUzIzNTkpICovCi8qIExPQ1ZBTChMT0NBTEVfSUNBTEVOREFSVFlQRSkgKi8KLyogTE9DVkFMKExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUikgKi8KLyogTE9DVkFMKExPQ0FMRV9JRklSU1REQVlPRldFRUspICovCi8qIExPQ1ZBTChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUikgKi8KTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsImx1bmRvIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIm1hcmRvIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIm1lcmtyZWRvIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIrxh/WRvIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTUsInZlbmRyZWRvIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsInNhYmF0byIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJkaW1hbuZvIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsImx1IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIm1hIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIm1lIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIrxhIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsInZlIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsInNhIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsImRpIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiamFudWFybyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsImZlYnJ1YXJvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywibWFydG8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJhcHJpbG8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJtYWpvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwianVuaW8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCJqdWxpbyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsImH9Z3VzdG8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU5LCJzZXB0ZW1icm8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwib2t0b2JybyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCJub3ZlbWJybyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCJkZWNlbWJybyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCJqYW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCJmZWIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCJtYXIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCJhcHIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCJtYWoiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCJqdW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCJqdWwiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4LCJh/WciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCJzZXAiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwib2t0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsIm5vdiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJkZWMiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKLyogTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOKSAqLwovKiBMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04pICovCi8qIExPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTikgKi8KLyogTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMpICovCi8qIExPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UpICovCi8qIExPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKSAqLwoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhFbykgKi8KCiAgICBjYXNlIExBTkdfRmk6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjExIikKTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsIlN1b21pIikKTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkZpbm5pc2giKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwiZmluIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsInN1b21pIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiNDkiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJTdW9taSIpCkxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIkZpbmxhbmQiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiRmluIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIlN1b21pIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCIxMSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIzNTgiKQovKiAKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKQoqLwpMT0NWQUwoTE9DQUxFX1NMSVNULCI7IikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiLiIpCi8qCkxPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKQoqLwpMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUikKSXMgdGhpcyAiMDEyMzQ1Njc4OSIgPz8KTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTKQoqLwpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwibWsiKQovKgpMT0NWQUwoTE9DQUxFX1NJTlRMU1lNQk9MKQpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQKQpMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCkKTE9DVkFMKExPQ0FMRV9TTU9OR1JPVVBJTkcpCiovCkxPQ1ZBTChMT0NBTEVfSUNVUlJESUdJVFMsIjIiKQovKgpMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUykKKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkVOQ1ksIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCI4IikKTE9DVkFMKExPQ0FMRV9TREFURSwiLiIpCkxPQ1ZBTChMT0NBTEVfU1RJTUUsIjoiKQpMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsImRkLk1NLnl5eXkiKQpMT0NWQUwoTE9DQUxFX1NMT05HREFURSwiZGRkLCBkLiBNTU1NIHl5eXkiKQovKgpMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFUKQoqLwpMT0NWQUwoTE9DQUxFX0lEQVRFLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JTERBVEUpCiovCkxPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04pCkxPQ1ZBTChMT0NBTEVfSUNFTlRVUlkpCiovCkxPQ1ZBTChMT0NBTEVfSVRMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSURBWUxaRVJPKQpMT0NWQUwoTE9DQUxFX0lNT05MWkVSTykKKi8KTE9DVkFMKExPQ0FMRV9TMTE1OSwgIkFNIikKTE9DVkFMKExPQ0FMRV9TMjM1OSwgIlBNIikKLyoKTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKQpMT0NWQUwoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSKQpMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykKTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKQoqLwpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwibWFhbmFudGFpIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsInRpaXN0YWkiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywia2Vza2l2aWlra28iKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNCwidG9yc3RhaSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCJwZXJqYW50YWkiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwibGF1YW50YWkiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywic3VubnVudGFpIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsIk1hIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIlRpIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIktlIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIlRvIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsIlBlIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsIkxhIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIlN1IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwidGFtbWlrdXUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJoZWxtaWt1dSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsIm1hYWxpc2t1dSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTQsImh1aHRpa3V1IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNSwidG91a29rdXUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCJrZXPka3V1IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywiaGVpbuRrdXUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU4LCJlbG9rdXUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU5LCJzeXlza3V1IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTAsImxva2FrdXUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwibWFycmFza3V1IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsImpvdWx1a3V1IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsIiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEsInRhbW1pIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwiaGVsbWkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCJtYWFsaXMiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCJodWh0aSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsInRvdWtvIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNiwia2Vz5CIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcsImhlaW7kIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwiZWxvIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOSwic3l5cyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwLCJsb2thIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsIm1hcnJhcyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJqb3VsdSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKQpMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sICItIikKLyoKTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04pCkxPQ1ZBTChMT0NBTEVfSU5FR1NJR05QT1NOKQpMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUykKTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSkKTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMpCkxPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UpCiovCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7ICAvKiBMQU5HKEZpKSAqLwoKICAgIGNhc2UgTEFOR19JdDoKICAgIAlzd2l0Y2ggKExDVHlwZSkgewpMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpCkxPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJJdGFsaWFubyIpCkxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJJdGFsaWFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsIml0YSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJJdGFsaWFubyIpCkxPQ1ZBTChMT0NBTEVfSUNPVU5UUlksIjM5IikKTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwiSXRhbGlhIikKTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiSXRhbHkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiSXQiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiSXRhbGlhIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCI5IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjM5IikKLyogRHVubm8KTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFKQoqLwpMT0NWQUwoTE9DQUxFX1NMSVNULCI7IikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIiwiKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiLiIpCi8qCkxPQ1ZBTChMT0NBTEVfU0dST1VQSU5HKQoqLwpMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUikKSXMgdGhpcyAiMDEyMzQ1Njc4OSIgPz8KTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTKQoqLwpMT0NWQUwoTE9DQUxFX1NDVVJSRU5DWSwiTGl0LiIpCi8qCkxPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wpCkxPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVApCkxPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQKQpMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORykKKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywiMiIpCi8qCkxPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTKQoqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCIuIikKTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCkxPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwiZGQuTU0ueXl5eSIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJkZGQsIGQuIE1NTU0geXl5eSIpCi8qCkxPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpCiovCkxPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lMREFURSkKKi8KTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikKTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkKKi8KTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pCkxPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKQpMT0NWQUwoTE9DQUxFX1MxMTU5KQpMT0NWQUwoTE9DQUxFX1MyMzU5KQpMT0NWQUwoTE9DQUxFX0lDQUxFTkRBUlRZUEUpCkxPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIpCkxPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLKQpMT0NWQUwoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIpCiovCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCJMdW5lZGknIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIk1hcnRlZGknIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIk1lcmNvbGVkaSciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNCwiR2lvdmVkaSciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwiVmVuZXJkaSciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwiU2FiYXRvIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsIkRvbWVuaWNhIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsIkx1IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIk1hIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIk1lIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIkdpIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsIlZlIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsIlNhIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIkRvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiR2VubmFpbyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsIkZlYmJyYWlvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMywiTWFyem8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJBcHJpbGUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU1LCJNYWdnaW8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCJHaXVnbm8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCJMdWdsaW8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU4LCJBZ29zdG8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU5LCJTZXR0ZW1icmUiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwiT3R0b2JyZSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCJOb3ZlbWJyZSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCJEaWNlbWJyZSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCJHZW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCJGZWIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCJNYXIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCJBcHIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCJNYWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCJHaXUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCJMdWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4LCJBZ28iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCJTZXQiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwiT3R0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsIk5vdiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJEaWMiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKLyoKTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOKQpMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04pCkxPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOKQpMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTikKTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMpCkxPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UpCkxPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKQpMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKQoqLwoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhJdCkgKi8KCiAgICBjYXNlIDB4MDgwOToKICAgIAlzd2l0Y2ggKExDVHlwZSkgewpMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwgIjA4MDkiKQpMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwgIkVuZ2xpc2ggKFVuaXRlZCBLaW5nZG9tKSIpCkxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCAiRW5nbGlzaCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCAiRU5HIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsICJFbmdsaXNoIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwgIjQ0IikKTE9DVkFMKExPQ0FMRV9TQ09VTlRSWSwgIlVuaXRlZCBLaW5nZG9tIikKTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwgIlVuaXRlZCBLaW5nZG9tIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsICJHQlIiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwgIlVuaXRlZCBLaW5nZG9tIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCAiMDgwOSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCAiNDQiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UsICI4NTAiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFLCAiMTI1MiIpCkxPQ1ZBTChMT0NBTEVfU0xJU1QsICIsIikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwgIjAiKQpMT0NWQUwoTE9DQUxFX1NERUNJTUFMLCAiLiIpCkxPQ1ZBTChMT0NBTEVfU1RIT1VTQU5ELCAiLCIpCkxPQ1ZBTChMT0NBTEVfU0dST1VQSU5HLCAiMzswIikKTE9DVkFMKExPQ0FMRV9JRElHSVRTLCAiMiIpCkxPQ1ZBTChMT0NBTEVfSUxaRVJPLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUiwgIjEiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVESUdJVFMsICIwMTIzNDU2Nzg5IikKTE9DVkFMKExPQ0FMRV9TQ1VSUkVOQ1ksICKjIikKTE9DVkFMKExPQ0FMRV9TSU5UTFNZTUJPTCwgIkdCUCIpCkxPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVAsICIuIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhPVVNBTkRTRVAsICIsIikKTE9DVkFMKExPQ0FMRV9TTU9OR1JPVVBJTkcsICIzOzAiKQpMT0NWQUwoTE9DQUxFX0lDVVJSRElHSVRTLCAiMiIpCkxPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTLCAiMiIpCkxPQ1ZBTChMT0NBTEVfSUNVUlJFTkNZLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsICIxIikKTE9DVkFMKExPQ0FMRV9TREFURSwgIi8iKQpMT0NWQUwoTE9DQUxFX1NUSU1FLCAiOiIpCkxPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwgImRkL01NL3l5IikKTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsICJkZCBNTU1NIHl5eXkiKQpMT0NWQUwoTE9DQUxFX1NUSU1FRk9STUFULCAiSEg6bW06c3MiKQpMT0NWQUwoTE9DQUxFX0lEQVRFLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSUxEQVRFLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSVRJTUUsICIxIikKTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSUNFTlRVUlksICIwIikKTE9DVkFMKExPQ0FMRV9JVExaRVJPLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSURBWUxaRVJPLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPLCAiMSIpCkxPQ1ZBTChMT0NBTEVfUzExNTksICJBTSIpCkxPQ1ZBTChMT0NBTEVfUzIzNTksICJQTSIpCkxPQ1ZBTChMT0NBTEVfSUNBTEVOREFSVFlQRSwgIjEiKQpMT0NWQUwoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUiwgIjAiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwgIk1vbmRheSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCAiVHVlc2RheSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCAiV2VkbmVzZGF5IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsICJUaHVyc2RheSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCAiRnJpZGF5IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsICJTYXR1cmRheSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCAiU3VuZGF5IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsICJNb24iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMiwgIlR1ZSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCAiV2VkIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsICJUaHUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNSwgIkZyaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCAiU2F0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsICJTdW4iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxLCAiSmFudWFyeSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsICJGZWJydWFyeSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsICJNYXJjaCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTQsICJBcHJpbCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsICJNYXkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU2LCAiSnVuZSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsICJKdWx5IikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwgIkF1Z3VzdCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksICJTZXB0ZW1iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMCwgIk9jdG9iZXIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMSwgIk5vdmVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsICJEZWNlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCAiIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSwgIkphbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsICJGZWIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCAiTWFyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNCwgIkFwciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsICJNYXkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCAiSnVuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNywgIkp1bCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsICJBdWciKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCAiU2VwIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTAsICJPY3QiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwgIk5vdiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCAiRGVjIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTMsICIiKQpMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKQpMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sICItIikKTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04sICIzIikKTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04sICIzIikKTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMsICIxIikKTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUywgIjEiKQpMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFLCAiMCIpCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7IC8qIExBTkcoMHgwODA5KSAoVS5LLiBFbmdsaXNoKSAqLwoKICAgIGNhc2UgTEFOR19LbzogLyogc3RyaW5nIHVzaW5nIGNvZGVwYWdlIDk0OSAqLwogICAgICAgIHN3aXRjaCAoTENUeXBlKSB7CkxPQ1ZBTChMT0NBTEVfSUxBTkdVQUdFLCIxOCIpCkxPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJcMzA3XDMyMVwyNjFcMjcxXDI3NlwzNTYiKQpMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiS29yZWFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsIktPUiIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCJcMzA3XDMyMVwyNjFcMjcxXDI3NlwzNTYiKQpMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCI4MiIpCkxPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIlwyNjRcMzUzXDMwN1wzMjFcMjcxXDMxNlwyNjFcMjcxIikKTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwiS29yZWEgKFNvdXRoKSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJLT1IiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiXDI2NFwzNTNcMzA3XDMyMVwyNzFcMzE2XDI2MVwyNzEiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsIjE4IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjgyIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCI5NDkiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQU5TSUNPREVQQUdFLCI5NDkiKQpMT0NWQUwoTE9DQUxFX1NMSVNULCIsIikKTE9DVkFMKExPQ0FMRV9JTUVBU1VSRSwiMCIpCkxPQ1ZBTChMT0NBTEVfU0RFQ0lNQUwsIi4iKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwiLCIpCkxPQ1ZBTChMT0NBTEVfU0dST1VQSU5HLCIzOzAiKQpMT0NWQUwoTE9DQUxFX0lESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywiMCIpCkxPQ1ZBTChMT0NBTEVfSU5FR05VTUJFUiwiMSIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRURJR0lUUywiMDEyMzQ1Njc4OSIpCkxPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCJcXCIpCkxPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wsIldvbiIpCkxPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVAsIi4iKQpMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCwiLCIpCkxPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HLCIzOzAiKQpMT0NWQUwoTE9DQUxFX0lDVVJSRElHSVRTLCIyIikKTE9DVkFMKExPQ0FMRV9JSU5UTENVUlJESUdJVFMsIjIiKQpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCIvIikKTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCkxPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwieXl5eS9NTS9kZCIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJ5eXl5L01NL2RkIikKTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCwiaDptbTpzcyB0dCIpCkxPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKQpMT0NWQUwoTE9DQUxFX0lMREFURSwiMSIpCkxPQ1ZBTChMT0NBTEVfSVRJTUUsIjEiKQpMT0NWQUwoTE9DQUxFX0lUSU1FTUFSS1BPU04sIjAiKQpMT0NWQUwoTE9DQUxFX0lDRU5UVVJZLCIwIikKTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIwIikKTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8sIjAiKQpMT0NWQUwoTE9DQUxFX0lNT05MWkVSTywiMCIpCkxPQ1ZBTChMT0NBTEVfUzExNTksIlwyNzdcMzAwXDMwMFwzNzQiKQpMT0NWQUwoTE9DQUxFX1MyMzU5LCJcMjc3XDMwMFwzMTBcMzA0IikKTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFLCIxIikKLyogS29yZWFuIFRhbmd1biBFcmEgY2FsZW5kYXIgKi8KTE9DVkFMKExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUiwiNSIpCkxPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLLCI2IikKTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSLCIwIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsIlwyNzdcMzcxXDI3N1wzNDRcMzAwXDMxNyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUyLCJcMzEwXDI1NVwyNzdcMzQ0XDMwMFwzMTciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywiXDI3NFwzNjZcMjc3XDM0NFwzMDBcMzE3IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIlwyNzBcMzYxXDI3N1wzNDRcMzAwXDMxNyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCJcMjYxXDMzNVwyNzdcMzQ0XDMwMFwzMTciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwiXDMwNVwzNDRcMjc3XDM0NFwzMDBcMzE3IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsIlwzMDBcMzE3XDI3N1wzNDRcMzAwXDMxNyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJcMzEwXDI1NSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJcMjc0XDM2NiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJcMjcwXDM2MSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJcMjYxXDMzNSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJcMzA1XDM0NCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJcMzAwXDMxNyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIjFcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsIjJcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsIjNcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTQsIjRcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsIjVcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsIjZcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTcsIjdcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTgsIjhcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksIjlcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCIxMFwyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTEsIjExXDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMiwiMTJcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCIxXDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCIyXDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCIzXDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCI0XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCI1XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCI2XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCI3XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4LCI4XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCI5XDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwiMTBcMjc3XDM3MSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCIxMVwyNzdcMzcxIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsIjEyXDI3N1wzNzEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOLCIiKQpMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sIi0iKQpMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTiwiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR1NJR05QT1NOLCIwIikKTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMsIjMiKQpMT0NWQUwoTE9DQUxFX0lQT1NTRVBCWVNQQUNFLCIwIikKTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMsIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFLCIwIikKICAgICAgICBkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwogICAgICAgIH0KICAgIGJyZWFrOyAgLyogTEFORyhLbykgKi8KCiAgICBjYXNlIExBTkdfSHU6CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsIjkiKQpMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiTWFneWFyIikKTE9DVkFMKExPQ0FMRV9TRU5HTEFOR1VBR0UsIkh1bmdhcmlhbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkxBTkdOQU1FLCJodW4iKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiTWFneWFyIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiMzYiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJNYWd5YXJvcnN64WciKQpMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJIdW5nYXJ5IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWQ1RSWU5BTUUsIkh1IikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsIk1hZ3lhcm9yc3rhZyIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiOSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT1VOVFJZLCIzNiIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRDT0RFUEFHRSwiODUyIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwiODUyIikKTE9DVkFMKExPQ0FMRV9TTElTVCwiOyIpCkxPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsIjAiKQpMT0NWQUwoTE9DQUxFX1NERUNJTUFMLCIuIikKTE9DVkFMKExPQ0FMRV9TVEhPVVNBTkQsIiwiKQovKgpMT0NWQUwoTE9DQUxFX1NHUk9VUElORykKKi8KTE9DVkFMKExPQ0FMRV9JRElHSVRTLCIyIikKTE9DVkFMKExPQ0FMRV9JTFpFUk8sIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lORUdOVU1CRVIpCklzIHRoaXMgIjAxMjM0NTY3ODkiID8/CkxPQ1ZBTChMT0NBTEVfU05BVElWRURJR0lUUykKKi8KTE9DVkFMKExPQ0FMRV9TQ1VSUkVOQ1ksIkZ0IikKLyoKTE9DVkFMKExPQ0FMRV9TSU5UTFNZTUJPTCkKTE9DVkFMKExPQ0FMRV9TTU9OREVDSU1BTFNFUCkKTE9DVkFMKExPQ0FMRV9TTU9OVEhPVVNBTkRTRVApCkxPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HKQoqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRElHSVRTLCIwIikKLyoKTE9DVkFMKExPQ0FMRV9JSU5UTENVUlJESUdJVFMpCiovCkxPQ1ZBTChMT0NBTEVfSUNVUlJFTkNZLCIzIikKTE9DVkFMKExPQ0FMRV9JTkVHQ1VSUiwiOCIpCkxPQ1ZBTChMT0NBTEVfU0RBVEUsIi8iKQpMT0NWQUwoTE9DQUxFX1NUSU1FLCI6IikKTE9DVkFMKExPQ0FMRV9TU0hPUlREQVRFLCJ5eXl5Lk1NLmRkIikKTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsImRkZCwgeXl5eS4gTU1NTSBkIikKLyoKTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkKKi8KTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSUxEQVRFKQoqLwpMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKQpMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKQoqLwpMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykKTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pCkxPQ1ZBTChMT0NBTEVfUzExNTkpCkxPQ1ZBTChMT0NBTEVfUzIzNTkpCkxPQ1ZBTChMT0NBTEVfSUNBTEVOREFSVFlQRSkKTE9DVkFMKExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUikKTE9DVkFMKExPQ0FMRV9JRklSU1REQVlPRldFRUspCkxPQ1ZBTChMT0NBTEVfSUZJUlNUV0VFS09GWUVBUikKKi8KTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsIkjpdGb1IikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIktlZGQiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMywiU3plcmRhIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIkNz/HT2cnT2ayIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCJQ6W50ZWsiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwiU3pvbWJhdCIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU3LCJWYXPhcm5hcCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJI6SIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJLZSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJTZSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJDcyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJQ6SIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJTbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJWYSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIkphbnXhciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsIkZlYnJ14XIiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCJN4XJjaXVzIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNCwiwXByaWxpcyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsIk3hanVzIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwiSvpuaXVzIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywiSvpsaXVzIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiQXVndXN6dHVzIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOSwiU3plcHRlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCJPa3TzYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTEsIk5vdmVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsIkRlY2VtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsIiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEsIkphbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsIkZlYiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsIk3hciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQsIsFwciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsIk3haiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsIkr6biIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcsIkr6bCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIkF1ZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksIlN6ZSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwLCJPa3QiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwiTm92IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsIkRlYyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzLCIiKQovKgpMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04pCkxPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTikKTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04pCkxPQ1ZBTChMT0NBTEVfSU5FR1NJR05QT1NOKQpMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUykKTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSkKTE9DVkFMKExPQ0FMRV9JTkVHU1lNUFJFQ0VERVMpCkxPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UpCiovCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7ICAvKiBMQU5HKEVuKSAqLwoKICAgIGNhc2UgTEFOR19QbDoKICAgIAlzd2l0Y2ggKExDVHlwZSkgewpMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiOSIpCkxPQ1ZBTChMT0NBTEVfU0xBTkdVQUdFLCJQb2xza2kiKQpMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwiUG9saXNoIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsICJwb2wiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVMQU5HTkFNRSwiUG9sc2tpIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwiNDkiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCJQb2xza2EiKQpMT0NWQUwoTE9DQUxFX1NFTkdDT1VOVFJZLCJQb2xhbmQiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZDVFJZTkFNRSwiUGwiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiUG9sc2thIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVExBTkdVQUdFLCI5IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksIjQ5IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCIxMjUyIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwiMTI1MiIpCkxPQ1ZBTChMT0NBTEVfU0xJU1QsIjsiKQpMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCIwIikKTE9DVkFMKExPQ0FMRV9TREVDSU1BTCwiLCIpCkxPQ1ZBTChMT0NBTEVfU1RIT1VTQU5ELCIgIikKLyoKTE9DVkFMKExPQ0FMRV9TR1JPVVBJTkcpCiovCkxPQ1ZBTChMT0NBTEVfSURJR0lUUywiMiIpCkxPQ1ZBTChMT0NBTEVfSUxaRVJPLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JTkVHTlVNQkVSKQpJcyB0aGlzICIwMTIzNDU2Nzg5IiA/PwpMT0NWQUwoTE9DQUxFX1NOQVRJVkVESUdJVFMpCiovCkxPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCJ6XHhCMyIpCi8qCkxPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wpCkxPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVApCkxPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQKQpMT0NWQUwoTE9DQUxFX1NNT05HUk9VUElORykKKi8KTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywiMiIpCi8qCkxPQ1ZBTChMT0NBTEVfSUlOVExDVVJSRElHSVRTKQoqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwiMyIpCkxPQ1ZBTChMT0NBTEVfSU5FR0NVUlIsIjgiKQpMT0NWQUwoTE9DQUxFX1NEQVRFLCIuIikKTE9DVkFMKExPQ0FMRV9TVElNRSwiOiIpCkxPQ1ZBTChMT0NBTEVfU1NIT1JUREFURSwiZGQuTU0ueXl5eSIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCJkZGQsIGQuIE1NTU0geXl5eSIpCi8qCkxPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQpCiovCkxPQ1ZBTChMT0NBTEVfSURBVEUsIjEiKQovKgpMT0NWQUwoTE9DQUxFX0lMREFURSkKKi8KTE9DVkFMKExPQ0FMRV9JVElNRSwiMSIpCi8qCkxPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTikKTE9DVkFMKExPQ0FMRV9JQ0VOVFVSWSkKKi8KTE9DVkFMKExPQ0FMRV9JVExaRVJPLCIxIikKLyoKTE9DVkFMKExPQ0FMRV9JREFZTFpFUk8pCkxPQ1ZBTChMT0NBTEVfSU1PTkxaRVJPKQpMT0NWQUwoTE9DQUxFX1MxMTU5KQpMT0NWQUwoTE9DQUxFX1MyMzU5KQpMT0NWQUwoTE9DQUxFX0lDQUxFTkRBUlRZUEUpCkxPQ1ZBTChMT0NBTEVfSU9QVElPTkFMQ0FMRU5EQVIpCkxPQ1ZBTChMT0NBTEVfSUZJUlNUREFZT0ZXRUVLKQpMT0NWQUwoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIpCiovCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUxLCJQb25pZWR6aWFcMjYzZWsiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMiwiV3RvcmVrIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTMsIlNyb2RhIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsIkN6d2FydGVrIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTUsIlBpXHhCOXRlayIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU2LCJTb2JvdGEiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywiTmllZHppZWxhIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTEsIlBvIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTIsIld0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsIlNyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTQsIkN6IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTUsIlB0IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsIlNvIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTcsIk5pIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMSwiU3R5Y3plXHhGMSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTIsIkx1dHkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUzLCJNYXJ6ZWMiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJLd2llY2llXHhGMSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsIk1haiIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsIkN6ZXJ3aWVjIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywiTGlwaWVjIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiU2llcnBpZVx4RjEiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU5LCJXcnplc2llXHhGMSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCJQYVwyMzdkemllcm5payIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCJMaXN0YXBhZCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEyLCJHcnVkemllXHhGMSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCJTdHkiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUyLCJMdXQiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUzLCJNYXIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCJLd2kiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU1LCJNYWoiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU2LCJDemUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCJMaXAiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU4LCJTaWUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU5LCJXcnoiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwiUGFceDlGIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTEsIkxpcyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEyLCJHcnUiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywiIikKLyoKTE9DVkFMKExPQ0FMRV9TUE9TSVRJVkVTSUdOKQpMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04pCkxPQ1ZBTChMT0NBTEVfSVBPU1NJR05QT1NOKQpMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTikKTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMpCkxPQ1ZBTChMT0NBTEVfSVBPU1NFUEJZU1BBQ0UpCkxPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTKQpMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFKQoqLwoJZGVmYXVsdDogZm91bmQ9MDticmVhazsKCX0KICAgIGJyZWFrOyAgLyogTEFORyhQbCkgKi8KCiAgICBjYXNlIExBTkdfUG86CiAgICAJc3dpdGNoIChMQ1R5cGUpIHsKTE9DVkFMKExPQ0FMRV9JTEFOR1VBR0UsICIwNDE2IikKTE9DVkFMKExPQ0FMRV9TTEFOR1VBR0UsICJQb3J0dWd1XDM1MnMgKEJyYXNpbCkiKQpMT0NWQUwoTE9DQUxFX1NFTkdMQU5HVUFHRSwgIlByb3R1Z3Vlc2UiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZMQU5HTkFNRSwgIlBPUiIpCkxPQ1ZBTChMT0NBTEVfU05BVElWRUxBTkdOQU1FLCAiUG9ydHVndVwzNTJzIikKTE9DVkFMKExPQ0FMRV9JQ09VTlRSWSwgIjEiKQpMT0NWQUwoTE9DQUxFX1NDT1VOVFJZLCAiQnJhc2lsIikKTE9DVkFMKExPQ0FMRV9TRU5HQ09VTlRSWSwgIkJyYXppbCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCAiQlJBIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFQ1RSWU5BTUUsICJCcmFzaWwiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUTEFOR1VBR0UsICIwNDA5IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPVU5UUlksICIxIikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVENPREVQQUdFLCAiNDM3IikKTE9DVkFMKExPQ0FMRV9JREVGQVVMVEFOU0lDT0RFUEFHRSwgIjEyNTIiKQpMT0NWQUwoTE9DQUxFX1NMSVNULCAiOyIpCkxPQ1ZBTChMT0NBTEVfSU1FQVNVUkUsICIxIikKTE9DVkFMKExPQ0FMRV9TREVDSU1BTCwgIiwiKQpMT0NWQUwoTE9DQUxFX1NUSE9VU0FORCwgIi4iKQpMT0NWQUwoTE9DQUxFX1NHUk9VUElORywgIjM7MCIpCkxPQ1ZBTChMT0NBTEVfSURJR0lUUywgIjIiKQpMT0NWQUwoTE9DQUxFX0lMWkVSTywgIjEiKQpMT0NWQUwoTE9DQUxFX0lORUdOVU1CRVIsICIxIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFRElHSVRTLCAiMDEyMzQ1Njc4OSIpCkxPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCAiJCIpCkxPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wsICJVU0QiKQpMT0NWQUwoTE9DQUxFX1NNT05ERUNJTUFMU0VQLCAiLCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRIT1VTQU5EU0VQLCAiLiIpCkxPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HLCAiMzswIikKTE9DVkFMKExPQ0FMRV9JQ1VSUkRJR0lUUywgIjIiKQpMT0NWQUwoTE9DQUxFX0lJTlRMQ1VSUkRJR0lUUywgIjIiKQpMT0NWQUwoTE9DQUxFX0lDVVJSRU5DWSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lORUdDVVJSLCAiMCIpCkxPQ1ZBTChMT0NBTEVfU0RBVEUsICIvIikKTE9DVkFMKExPQ0FMRV9TVElNRSwgIjoiKQpMT0NWQUwoTE9DQUxFX1NTSE9SVERBVEUsICJkZC9NTS95eSIpCkxPQ1ZBTChMT0NBTEVfU0xPTkdEQVRFLCAiZGRkZCwgTU1NTSBkZCwgeXl5eSIpCkxPQ1ZBTChMT0NBTEVfU1RJTUVGT1JNQVQsICJoOm1tOnNzIHR0IikKTE9DVkFMKExPQ0FMRV9JREFURSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lMREFURSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lUSU1FLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSVRJTUVNQVJLUE9TTiwgIjAiKQpMT0NWQUwoTE9DQUxFX0lDRU5UVVJZLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSVRMWkVSTywgIjAiKQpMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTywgIjAiKQpMT0NWQUwoTE9DQUxFX0lNT05MWkVSTywgIjAiKQpMT0NWQUwoTE9DQUxFX1MxMTU5LCAiQU0iKQpMT0NWQUwoTE9DQUxFX1MyMzU5LCAiUE0iKQpMT0NWQUwoTE9DQUxFX0lDQUxFTkRBUlRZUEUsICIxIikKTE9DVkFMKExPQ0FMRV9JT1BUSU9OQUxDQUxFTkRBUiwgIjAiKQpMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSywgIjYiKQpMT0NWQUwoTE9DQUxFX0lGSVJTVFdFRUtPRllFQVIsICIwIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTEsICJTZWd1bmRhIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsICJUZXJcMzQ3YSIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCAiUXVhcnRhIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTQsICJRdWludGEiKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNSwgIlNleHRhIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTYsICJTXDM0MWJhZG8iKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNywgIkRvbWluZ28iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FMSwgIlNlZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCAiVGVyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTMsICJRdWEiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNCwgIlF1aSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCAiU2V4IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWREFZTkFNRTYsICJTXDM0MWIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZEQVlOQU1FNywgIkRvbSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsICJKYW5laXJvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMiwgIkZldmVyZWlybyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsICJNYXJcMzQ3byIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTQsICJBYnJpbCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsICJNYWlvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNiwgIkp1bmhvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FNywgIkp1bGhvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwgIkFnb3N0byIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksICJTZXRlbWJybyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCAiT3V0dWJybyIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTExLCAiTm92ZW1icm8iKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUxMiwgIkRlemVtYnJvIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsICIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxLCAiSmFuIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMiwgIkZldiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsICJNYXIiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU0LCAiQWJyIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FNSwgIk1haSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsICJKdW4iKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUU3LCAiSnVsIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FOCwgIkFnbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksICJTZXQiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMCwgIk91dCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTExLCAiTm92IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsICJEZXoiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMywgIiIpCkxPQ1ZBTChMT0NBTEVfU1BPU0lUSVZFU0lHTiwgIiIpCkxPQ1ZBTChMT0NBTEVfU05FR0FUSVZFU0lHTiwgIi0iKQpMT0NWQUwoTE9DQUxFX0lQT1NTSUdOUE9TTiwgIjMiKQpMT0NWQUwoTE9DQUxFX0lORUdTSUdOUE9TTiwgIjAiKQpMT0NWQUwoTE9DQUxFX0lQT1NTWU1QUkVDRURFUywgIjEiKQpMT0NWQUwoTE9DQUxFX0lQT1NTRVBCWVNQQUNFLCAiMCIpCkxPQ1ZBTChMT0NBTEVfSU5FR1NZTVBSRUNFREVTLCAiMSIpCkxPQ1ZBTChMT0NBTEVfSU5FR1NFUEJZU1BBQ0UsICIwIikKCWRlZmF1bHQ6IGZvdW5kPTA7YnJlYWs7Cgl9CiAgICBicmVhazsgLyogTEFORyhQbykgKi8KCmNhc2UgTEFOR19TdzoKICAgIAlzd2l0Y2ggKExDVHlwZSkgewpMT0NWQUwoTE9DQUxFX0lMQU5HVUFHRSwiMWQiKQpMT0NWQUwoTE9DQUxFX1NMQU5HVUFHRSwiU3ZlbnNrYSIpCkxPQ1ZBTChMT0NBTEVfU0VOR0xBTkdVQUdFLCJTd2VkaXNoIikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTEFOR05BTUUsIlNWIikKTE9DVkFMKExPQ0FMRV9TTkFUSVZFTEFOR05BTUUsIlN2ZW5za2EiKQpMT0NWQUwoTE9DQUxFX0lDT1VOVFJZLCI0NSIpCkxPQ1ZBTChMT0NBTEVfU0NPVU5UUlksIlNXRSIpCkxPQ1ZBTChMT0NBTEVfU0VOR0NPVU5UUlksIlN3ZWRlbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkNUUllOQU1FLCJTVkUiKQpMT0NWQUwoTE9DQUxFX1NOQVRJVkVDVFJZTkFNRSwiU3ZlcmlnZSIpCkxPQ1ZBTChMT0NBTEVfSURFRkFVTFRMQU5HVUFHRSwiMWQiKQpMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09VTlRSWSwiNDUiKQovKiBMT0NWQUwoTE9DQUxFX0lERUZBVUxUQ09ERVBBR0UpICovCi8qIExPQ1ZBTChMT0NBTEVfSURFRkFVTFRBTlNJQ09ERVBBR0UpICovCkxPQ1ZBTChMT0NBTEVfU0xJU1QsIjsiKQpMT0NWQUwoTE9DQUxFX0lNRUFTVVJFLCIwIikKTE9DVkFMKExPQ0FMRV9TREVDSU1BTCwiLCIpCkxPQ1ZBTChMT0NBTEVfU1RIT1VTQU5ELCIuIikKLyogTE9DVkFMKExPQ0FMRV9TR1JPVVBJTkcpICovCkxPQ1ZBTChMT0NBTEVfSURJR0lUUywiMiIpCkxPQ1ZBTChMT0NBTEVfSUxaRVJPLCIxIikKLyogTE9DVkFMKExPQ0FMRV9JTkVHTlVNQkVSKSAqLwovKiBMT0NWQUwoTE9DQUxFX1NOQVRJVkVESUdJVFMpICovCkxPQ1ZBTChMT0NBTEVfU0NVUlJFTkNZLCJrciIpCi8qIExPQ1ZBTChMT0NBTEVfU0lOVExTWU1CT0wpICovCkxPQ1ZBTChMT0NBTEVfU01PTkRFQ0lNQUxTRVAsIiwiKQpMT0NWQUwoTE9DQUxFX1NNT05USE9VU0FORFNFUCwiLiIpCi8qIExPQ1ZBTChMT0NBTEVfU01PTkdST1VQSU5HKSAqLwpMT0NWQUwoTE9DQUxFX0lDVVJSRElHSVRTLCIyIikKLyogTE9DVkFMKExPQ0FMRV9JSU5UTENVUlJESUdJVFMpICovCkxPQ1ZBTChMT0NBTEVfSUNVUlJFTkNZLCIzIikKTE9DVkFMKExPQ0FMRV9JTkVHQ1VSUiwiOCIpCkxPQ1ZBTChMT0NBTEVfU0RBVEUsIi4iKQpMT0NWQUwoTE9DQUxFX1NUSU1FLCI6IikKTE9DVkFMKExPQ0FMRV9TU0hPUlREQVRFLCJkZC9NTS15eXl5IikKTE9DVkFMKExPQ0FMRV9TTE9OR0RBVEUsImRkZCwgZC4gTU1NTSB5eXl5IikKLyogTE9DVkFMKExPQ0FMRV9TVElNRUZPUk1BVCkgKi8KTE9DVkFMKExPQ0FMRV9JREFURSwiMSIpCi8qIExPQ1ZBTChMT0NBTEVfSUxEQVRFKSAqLwpMT0NWQUwoTE9DQUxFX0lUSU1FLCIxIikKLyogTE9DVkFMKExPQ0FMRV9JVElNRU1BUktQT1NOKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lDRU5UVVJZKSAqLwpMT0NWQUwoTE9DQUxFX0lUTFpFUk8sIjEiKQovKiBMT0NWQUwoTE9DQUxFX0lEQVlMWkVSTykgKi8KLyogTE9DVkFMKExPQ0FMRV9JTU9OTFpFUk8pICovCkxPQ1ZBTChMT0NBTEVfUzExNTksICIiKQpMT0NWQUwoTE9DQUxFX1MyMzU5LCAiIikKLyogTE9DVkFMKExPQ0FMRV9JQ0FMRU5EQVJUWVBFKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lPUFRJT05BTENBTEVOREFSKSAqLwovKiBMT0NWQUwoTE9DQUxFX0lGSVJTVERBWU9GV0VFSykgKi8KLyogTE9DVkFMKExPQ0FMRV9JRklSU1RXRUVLT0ZZRUFSKSAqLwpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FMSwiTeVuZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTIsIlRpc2RhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUUzLCJPbnNkYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNCwiVG9yc2RhZyIpCkxPQ1ZBTChMT0NBTEVfU0RBWU5BTUU1LCJGcmVkYWciKQpMT0NWQUwoTE9DQUxFX1NEQVlOQU1FNiwiTPZyZGFnIikKTE9DVkFMKExPQ0FMRV9TREFZTkFNRTcsIlP2bmRhZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUxLCJN5SIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUyLCJUaSIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUUzLCJPbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU0LCJUbyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU1LCJGciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU2LCJM9iIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVkRBWU5BTUU3LCJT9iIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEsIkphbnVhcmkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUUyLCJGZWJydWFyaSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTMsIk1hcnMiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU0LCJBcHJpbCIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTUsIk1haiIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTYsIkp1bmkiKQpMT0NWQUwoTE9DQUxFX1NNT05USE5BTUU3LCJKdWxpIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FOCwiQXVndXN0aSIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTksIlNlcHRlbWJlciIpCkxPQ1ZBTChMT0NBTEVfU01PTlRITkFNRTEwLCJPa3RvYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTEsIk5vdmVtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTIsIkRlY2VtYmVyIikKTE9DVkFMKExPQ0FMRV9TTU9OVEhOQU1FMTMsIiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEsIkphbiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTIsIkZlYiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTMsIk1hciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTQsIkFwciIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTUsIk1haiIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTYsIkp1biIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTcsIkp1bCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTgsIkF1ZyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTksIlNlcCIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEwLCJPa3QiKQpMT0NWQUwoTE9DQUxFX1NBQkJSRVZNT05USE5BTUUxMSwiTm92IikKTE9DVkFMKExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMTIsIkRlYyIpCkxPQ1ZBTChMT0NBTEVfU0FCQlJFVk1PTlRITkFNRTEzLCIiKQpMT0NWQUwoTE9DQUxFX1NQT1NJVElWRVNJR04sICIiKQpMT0NWQUwoTE9DQUxFX1NORUdBVElWRVNJR04sICItIikKTE9DVkFMKExPQ0FMRV9JUE9TU0lHTlBPU04sICIzIikKTE9DVkFMKExPQ0FMRV9JTkVHU0lHTlBPU04sICIzIikKTE9DVkFMKExPQ0FMRV9JUE9TU1lNUFJFQ0VERVMsICIxIikKTE9DVkFMKExPQ0FMRV9JUE9TU0VQQllTUEFDRSwgIjAiKQpMT0NWQUwoTE9DQUxFX0lORUdTWU1QUkVDRURFUywgIjEiKQpMT0NWQUwoTE9DQUxFX0lORUdTRVBCWVNQQUNFLCAiMCIpCglkZWZhdWx0OiBmb3VuZD0wO2JyZWFrOwoJfQogICAgYnJlYWs7IC8qIExBTkcoU3cpICovCgovKkluc2VydCBvdGhlciBsYW5ndWFnZXMgaGVyZSovCgogICAgZGVmYXVsdDoKICAgIAlmb3VuZD0wOwoJYnJlYWs7CiAgICB9ICAvKiBzd2l0Y2ggKi8KCglpZighZm91bmQpIHsKCQlFUlIob2xlLCInJXMnIG5vdCBzdXBwb3J0ZWQgZm9yIHlvdXIgbGFuZ3VhZ2UuXG4iLAoJCQlyZXRTdHJpbmcpOwoJCXJldFN0cmluZyA9ICI8V0lORS1OTFMtdW5rbm93bj4iOwoJCS8qcmV0dXJuIDA7Ki8KCX0KCWlmIChidWYpCgkJbHN0cmNweW4zMkEoYnVmLHJldFN0cmluZyxsZW4pOwoJcmV0dXJuIHN0cmxlbihyZXRTdHJpbmcpKzE7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgIEdldExvY2FsZUluZm8zMlcgICAgICAgICAgICAgKEtFUk5FTDMyLjIzMCkKICogSXMgdGhlIGxhc3QgcGFyYW1ldGVyIHJlYWxseSBXT1JEIGZvciBXaW4xNj8KICovCklOVDMyIFdJTkFQSSBHZXRMb2NhbGVJbmZvMzJXKExDSUQgbGNpZCxMQ1RZUEUgTENUeXBlLExQV1NUUiB3YnVmLElOVDMyIGxlbikKewoJTFBTVFIgYWJ1ZiA9IChMUFNUUilIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwwLGxlbik7CgoJSU5UMzIgbiA9IEdldExvY2FsZUluZm8zMkEobGNpZCwgTENUeXBlLCBhYnVmLCBsZW4pOwoJaWYgKHdidWYpCgkJbHN0cmNweW5BdG9XKHdidWYsYWJ1ZixsZW4pOwoJSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwwLGFidWYpOwoJcmV0dXJuIG47Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ29tcGFyZVN0cmluZzE2ICAgICAgIChPTEUyTkxTLjgpCiAqLwpVSU5UMTYgV0lOQVBJIENvbXBhcmVTdHJpbmcxNihEV09SRCBsY2lkLERXT1JEIGZkd1N0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUENTVFIgczEsRFdPUkQgbDEsTFBDU1RSIHMyLERXT1JEIGwyKQp7CglyZXR1cm4gKFVJTlQxNilDb21wYXJlU3RyaW5nMzJBKGxjaWQsZmR3U3R5bGUsczEsbDEsczIsbDIpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIENvbXBhcmVTdHJpbmczMkEgICAoS0VSTkVMMzIuMjkpCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCiAqIEZJWE1FCiAqLwpVSU5UMzIgV0lOQVBJIENvbXBhcmVTdHJpbmczMkEoRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDU1RSIHMxLCBEV09SRCBsMSwgTFBDU1RSIHMyLERXT1JEIGwyKQp7CglpbnQgbGVuLHJldDsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVOT05TUEFDRSkKCQlGSVhNRShvbGUsICJJR05PUkVOT05TUEFDRSBub3Qgc3VwcG9ydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKG9sZSwgIklHTk9SRVNZTUJPTFMgbm90IHN1cHBvcnRlZFxuIik7CgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/c3RybGVuKHMxKTpsMTsKCWwyID0gKGwyPT0tMSk/c3RybGVuKHMyKTpsMjsKCWxlbiA9IGwxPGwyID8gbDE6bDI7CglyZXQgPSAoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRUNBU0UpID8KCQlsc3RybmNtcGkzMkEoczEsczIsbGVuKQk6IGxzdHJuY21wMzJBKHMxLHMyLGxlbik7CgkvKiBub3QgZXF1YWwsIHJldHVybiAxIG9yIDMgKi8KCWlmKHJldCE9MClyZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMilyZXR1cm4gMjsKCS8qIHRoZSBsb25nZXIgb25lIGlzIGxleGljYWxseSBncmVhdGVyICovCglyZXR1cm4gKGwxPGwyKT8gMSA6IDM7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgQ29tcGFyZVN0cmluZzMyVyAgICAgICAoS0VSTkVMMzIuMzApCiAqIFRoaXMgaW1wbGVtZW50YXRpb24gaWdub3JlcyB0aGUgbG9jYWxlCiAqIEZJWE1FCiAqLwpVSU5UMzIgV0lOQVBJIENvbXBhcmVTdHJpbmczMlcoRFdPUkQgbGNpZCwgRFdPUkQgZmR3U3R5bGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBDV1NUUiBzMSwgRFdPUkQgbDEsIExQQ1dTVFIgczIsRFdPUkQgbDIpCnsKCWludCBsZW4scmV0OwoJaWYoZmR3U3R5bGUgJiBOT1JNX0lHTk9SRU5PTlNQQUNFKQoJCUZJWE1FKG9sZSwiSUdOT1JFTk9OU1BBQ0Ugbm90IHN1cHBydGVkXG4iKTsKCWlmKGZkd1N0eWxlICYgTk9STV9JR05PUkVTWU1CT0xTKQoJCUZJWE1FKG9sZSwiSUdOT1JFU1lNQk9MUyBub3Qgc3VwcG9ydGVkXG4iKTsKCgkvKiBJcyBzdHJjbXAgZGVmYXVsdGluZyB0byBzdHJpbmcgc29ydCBvciB0byB3b3JkIHNvcnQ/PyAqLwoJLyogRklYTUU6IEhhbmRsZSBOT1JNX1NUUklOR1NPUlQgKi8KCWwxID0gKGwxPT0tMSk/bHN0cmxlbjMyVyhzMSk6bDE7CglsMiA9IChsMj09LTEpP2xzdHJsZW4zMlcoczIpOmwyOwoJbGVuID0gbDE8bDIgPyBsMTpsMjsKCXJldCA9IChmZHdTdHlsZSAmIE5PUk1fSUdOT1JFQ0FTRSkgPwoJCWxzdHJuY21waTMyVyhzMSxzMixsZW4pCTogbHN0cm5jbXAzMlcoczEsczIsbGVuKTsKCS8qIG5vdCBlcXVhbCwgcmV0dXJuIDEgb3IgMyAqLwoJaWYocmV0IT0wKSByZXR1cm4gcmV0KzI7CgkvKiBzYW1lIGxlbiwgcmV0dXJuIDIgKi8KCWlmKGwxPT1sMikgcmV0dXJuIDI7CgkvKiB0aGUgbG9uZ2VyIG9uZSBpcyBsZXhpY2FsbHkgZ3JlYXRlciAqLwoJcmV0dXJuIChsMTxsMik/IDEgOiAzOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgIFNldExvY2FsZUluZm9BICAgICAgIFtLRVJORUwzMi40OTldCiAqLwpCT09MMTYgV0lOQVBJIFNldExvY2FsZUluZm9BKERXT1JEIGxjaWQsIERXT1JEIGxjdHlwZSwgTFBDU1RSIGRhdGEpCnsKICAgIEZJWE1FKG9sZSwiKCVsZCwlbGQsJXMpOiBzdHViXG4iLGxjaWQsbGN0eXBlLGRhdGEpOwogICAgcmV0dXJuIFRSVUU7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgICAgSXNWYWxpZExvY2FsZSAgICAgICBbS0VSTkVMMzIuMzYxXQogKi8KQk9PTDMyIFdJTkFQSSBJc1ZhbGlkTG9jYWxlKExDSUQgbGNpZCxEV09SRCBmbGFncykKewoJLyogd2Ugc3VwcG9ydCBBTlkgbGFuZ3VhZ2UuIFdlbGwsIGF0IGxlYXN0IHNheSB0aGF0Li4uKi8KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEVudW1TeXN0ZW1Mb2NhbGVzMzJXICAgICAgICAgICAgICAgIFtLRVJORUwzMi45M10KICovCkJPT0wzMiBXSU5BUEkgRW51bVN5c3RlbUxvY2FsZXMzMlcoIExPQ0FMRV9FTlVNUFJPQzMyVyBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRFdPUkQgZmxhZ3MgKQp7CglpbnQJaTsKCUJPT0wzMglyZXQ7CglXQ0hBUglidWZmZXJbMjAwXTsKCUhLRVkJeGhrZXk7CgoJVFJBQ0Uod2luMzIsIiglcCwlMDhseClcbiIsbHBmbkxvY2FsZUVudW0sZmxhZ3MgKTsKCS8qIHNlZSBpZiB3ZSBjYW4gcmV1c2UgdGhlIFdpbjk1IHJlZ2lzdHJ5IGVudHJpZXMuLi4uICovCglpZiAoRVJST1JfU1VDQ0VTUz09UmVnT3BlbktleTMyQShIS0VZX0xPQ0FMX01BQ0hJTkUsIlxcU3lzdGVtXFxDdXJyZW50Q29udHJvbFNldFxcY29udHJvbFxcTmxzXFxMb2NhbGVcXCIsJnhoa2V5KSkgewoJCWk9MDsKCQl3aGlsZSAoMSkgewoJCQlpZiAoRVJST1JfU1VDQ0VTUyE9UmVnRW51bUtleTMyVyh4aGtleSxpLGJ1ZmZlcixzaXplb2YoYnVmZmVyKSkpCgkJCQlicmVhazsKICAgICAgICAgICAgCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCQlicmVhazsKCQkJaSsrOwoJCX0KCQlSZWdDbG9zZUtleSh4aGtleSk7CgkJcmV0dXJuIFRSVUU7Cgl9CgoJaT0wOwoJd2hpbGUgKGxhbmd1YWdlc1tpXS5sYW5nbmFtZSE9TlVMTCkKICAgICAgICB7CiAgICAgICAgICAgIExQV1NUUiBjcDsKCSAgICBjaGFyICAgeGJ1ZmZlclsxMF07CiAgCQoJICAgIHNwcmludGYoeGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCgkgICAgY3AgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIHhidWZmZXIgKTsKICAgICAgICAgICAgcmV0ID0gbHBmbkxvY2FsZUVudW0oY3ApOwogICAgICAgICAgICBIZWFwRnJlZSggR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY3AgKTsKICAgICAgICAgICAgaWYgKCFyZXQpIGJyZWFrOwogICAgICAgICAgICBpKys7Cgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBFbnVtU3lzdGVtTG9jYWxlczMyQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuOTJdCiAqLwpCT09MMzIgV0lOQVBJIEVudW1TeXN0ZW1Mb2NhbGVzMzJBKExPQ0FMRV9FTlVNUFJPQzMyQSBscGZuTG9jYWxlRW51bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV09SRCBmbGFncykKewoJaW50CWk7CglDSEFSCWJ1ZmZlclsyMDBdOwoJSEtFWQl4aGtleTsKCglUUkFDRSh3aW4zMiwiKCVwLCUwOGx4KVxuIiwKCQlscGZuTG9jYWxlRW51bSxmbGFncwoJKTsKCWlmIChFUlJPUl9TVUNDRVNTPT1SZWdPcGVuS2V5MzJBKEhLRVlfTE9DQUxfTUFDSElORSwiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcIiwmeGhrZXkpKSB7CgkJaT0wOwoJCXdoaWxlICgxKSB7CgkJCWlmIChFUlJPUl9TVUNDRVNTIT1SZWdFbnVtS2V5MzJBKHhoa2V5LGksYnVmZmVyLHNpemVvZihidWZmZXIpKSkKCQkJCWJyZWFrOwogICAgICAgICAgICAJCWlmICghbHBmbkxvY2FsZUVudW0oYnVmZmVyKSkKCQkJCWJyZWFrOwoJCQlpKys7CgkJfQoJCVJlZ0Nsb3NlS2V5KHhoa2V5KTsKCQlyZXR1cm4gVFJVRTsKCX0KCWk9MDsKCXdoaWxlIChsYW5ndWFnZXNbaV0ubGFuZ25hbWUhPU5VTEwpIHsKCQlzcHJpbnRmKGJ1ZmZlciwiJTA4bHgiLChEV09SRClsYW5ndWFnZXNbaV0ubGFuZ2lkKTsKCQlpZiAoIWxwZm5Mb2NhbGVFbnVtKGJ1ZmZlcikpCgkJCWJyZWFrOwoJCWkrKzsKCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICAgICAgICAgICAgIEdldFN0cmluZ1R5cGVBICAgICAgICAgICAgICAgIFtPTEUyTkxTLjddCiAqLwpCT09MMTYgV0lOQVBJIEdldFN0cmluZ1R5cGUxNihMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDE2IGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMkEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRTdHJpbmdUeXBlQSAgICAgICAgICAgICAgICBbS0VSTkVMMzIuMjc3XQogKi8KQk9PTDMyIFdJTkFQSSBHZXRTdHJpbmdUeXBlMzJBKExDSUQgbG9jYWxlLERXT1JEIGR3SW5mb1R5cGUsTFBDU1RSIHNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMkEobG9jYWxlLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXRTdHJpbmdUeXBlRXhBICAgICAgICAgICAgICAgIFtLRVJORUwzMi4yNzZdCiAqLwpCT09MMzIgV0lOQVBJIEdldFN0cmluZ1R5cGVFeDMyQShMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1NUUiBzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyIGNjaFNyYyxMUFdPUkQgY2hhcnR5cGUpCnsKCWludAlpOwoKCXN3aXRjaCAoZHdJbmZvVHlwZSkgewoJY2FzZSBDVF9DVFlQRTI6CgkJRklYTUUob2xlLCJDVF9DVFlQRTIgbm90IHN1cHBvcnRlZC5cbiIpOwoJCXJldHVybiBGQUxTRTsKCWNhc2UgQ1RfQ1RZUEUzOgoJCUZJWE1FKG9sZSwiQ1RfQ1RZUEUzIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CglkZWZhdWx0OmJyZWFrOwoJfQoJaWYgKGNjaFNyYz09LTEpCgkJY2NoU3JjPWxzdHJsZW4zMkEoc3JjKTsKCWZvciAoaT0wO2k8Y2NoU3JjO2krKykgewoJCWNoYXJ0eXBlW2ldID0gMDsKCQlpZiAoaXNkaWdpdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfRElHSVQ7CgkJaWYgKGlzYWxwaGEoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0FMUEhBOwoJCWlmIChpc2xvd2VyKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9MT1dFUjsKCQlpZiAoaXN1cHBlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfVVBQRVI7CgkJaWYgKGlzc3BhY2Uoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1NQQUNFOwoJCWlmIChpc3B1bmN0KHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9QVU5DVDsKCQlpZiAoaXNjbnRybChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQ05UUkw7Ci8qIEZJWE1FOiBpc2JsYW5rKCkgaXMgYSBHTlUgZXh0ZW5zaW9uICovCi8qCQlpZiAoaXNibGFuayhzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7ICovCiAgICAgICAgICAgICAgICBpZiAoKHNyY1tpXSA9PSAnICcpIHx8IChzcmNbaV0gPT0gJ1x0JykpIGNoYXJ0eXBlW2ldfD1DMV9CTEFOSzsKCQkvKiBDMV9YRElHSVQgKi8KCX0KCXJldHVybiBUUlVFOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBHZXRTdHJpbmdUeXBlVyBbS0VSTkVMMzIuMjc5XQogKgogKiBOT1RFUwogKiBZZXMsIHRoaXMgaXMgbWlzc2luZyBMQ0lEIGxvY2FsZS4gTVMgZmF1bHQuCiAqLwpCT09MMzIgV0lOQVBJIEdldFN0cmluZ1R5cGUzMlcoRFdPUkQgZHdJbmZvVHlwZSxMUENXU1RSIHNyYyxJTlQzMiBjY2hTcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMUFdPUkQgY2hhcnR5cGUpCnsKCXJldHVybiBHZXRTdHJpbmdUeXBlRXgzMlcoMC8qZGVmYXVsdGxvY2FsZSovLGR3SW5mb1R5cGUsc3JjLGNjaFNyYyxjaGFydHlwZSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogICBHZXRTdHJpbmdUeXBlVyAgIFtLRVJORUwzMi4yNzhdCiAqIEZJWE1FOiB1bmljb2RlIGNoYXJzIGFyZSBhc3N1bWVkIGNoYXJzCiAqLwpCT09MMzIgV0lOQVBJIEdldFN0cmluZ1R5cGVFeDMyVyhMQ0lEIGxvY2FsZSxEV09SRCBkd0luZm9UeXBlLExQQ1dTVFIgc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlQzMiBjY2hTcmMsTFBXT1JEIGNoYXJ0eXBlKQp7CglpbnQJaTsKCglzd2l0Y2ggKGR3SW5mb1R5cGUpIHsKCWNhc2UgQ1RfQ1RZUEUyOgoJCUZJWE1FKG9sZSwiQ1RfQ1RZUEUyIG5vdCBzdXBwb3J0ZWQuXG4iKTsKCQlyZXR1cm4gRkFMU0U7CgljYXNlIENUX0NUWVBFMzoKCQlGSVhNRShvbGUsIkNUX0NUWVBFMyBub3Qgc3VwcG9ydGVkLlxuIik7CgkJcmV0dXJuIEZBTFNFOwoJZGVmYXVsdDpicmVhazsKCX0KCWlmIChjY2hTcmM9PS0xKQoJCWNjaFNyYz1sc3RybGVuMzJXKHNyYyk7Cglmb3IgKGk9MDtpPGNjaFNyYztpKyspIHsKCQljaGFydHlwZVtpXSA9IDA7CgkJaWYgKGlzZGlnaXQoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0RJR0lUOwoJCWlmIChpc2FscGhhKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9BTFBIQTsKCQlpZiAoaXNsb3dlcihzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfTE9XRVI7CgkJaWYgKGlzdXBwZXIoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX1VQUEVSOwoJCWlmIChpc3NwYWNlKHNyY1tpXSkpIGNoYXJ0eXBlW2ldfD1DMV9TUEFDRTsKCQlpZiAoaXNwdW5jdChzcmNbaV0pKSBjaGFydHlwZVtpXXw9QzFfUFVOQ1Q7CgkJaWYgKGlzY250cmwoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0NOVFJMOwovKiBGSVhNRTogaXNibGFuaygpIGlzIGEgR05VIGV4dGVuc2lvbiAqLwovKgkJaWYgKGlzYmxhbmsoc3JjW2ldKSkgY2hhcnR5cGVbaV18PUMxX0JMQU5LOyAqLwogICAgICAgICAgICAgICAgaWYgKChzcmNbaV0gPT0gJyAnKSB8fCAoc3JjW2ldID09ICdcdCcpKSBjaGFydHlwZVtpXXw9QzFfQkxBTks7CgkJLyogQzFfWERJR0lUICovCgl9CglyZXR1cm4gVFJVRTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFZlckxhbmd1YWdlTmFtZTE2ICAgW1ZFUi4xMF0gCiAqLwpEV09SRCBXSU5BUEkgVmVyTGFuZ3VhZ2VOYW1lMTYoVUlOVDE2IGxhbmdpZCxMUFNUUiBsYW5nbmFtZSxVSU5UMTYgbGFuZ25hbWVsZW4pCnsKCWludAlpOwoJRFdPUkQJcmVzdWx0OwoJY2hhcglidWZmZXJbODBdOwoKCVRSQUNFKHZlciwiKCVkLCVwLCVkKVxuIixsYW5naWQsbGFuZ25hbWUsbGFuZ25hbWVsZW4pOwoJLyogRmlyc3QsIGNoZWNrIFxTeXN0ZW1cQ3VycmVudENvbnRyb2xTZXRcY29udHJvbFxObHNcTG9jYWxlXDxsYW5naWQ+CgkgKiBmcm9tIHRoZSByZWdpc3RyeS4gCgkgKi8KCXNwcmludGYoYnVmZmVyLAoJCSJcXFN5c3RlbVxcQ3VycmVudENvbnRyb2xTZXRcXGNvbnRyb2xcXE5sc1xcTG9jYWxlXFwlMDh4IiwKCQlsYW5naWQpOwoJcmVzdWx0ID0gUmVnUXVlcnlWYWx1ZTE2KEhLRVlfTE9DQUxfTUFDSElORSwgYnVmZmVyLCBsYW5nbmFtZSwKCQkJCShMUERXT1JEKSZsYW5nbmFtZWxlbik7CglpZiAocmVzdWx0ID09IEVSUk9SX1NVQ0NFU1MpIHsKCQlsYW5nbmFtZVtsYW5nbmFtZWxlbi0xXT0nXDAnOwoJCXJldHVybiBsYW5nbmFtZWxlbjsKCX0KCS8qIGlmIHRoYXQgZmFpbHMsIHVzZSB0aGUgaW50ZXJuYWwgdGFibGUgKi8KCWZvciAoaT0wO2xhbmd1YWdlc1tpXS5sYW5naWQhPTA7aSsrKQoJCWlmIChsYW5naWQ9PWxhbmd1YWdlc1tpXS5sYW5naWQpCgkJCWJyZWFrOwoJc3RybmNweShsYW5nbmFtZSxsYW5ndWFnZXNbaV0ubGFuZ25hbWUsbGFuZ25hbWVsZW4pOwoJbGFuZ25hbWVbbGFuZ25hbWVsZW4tMV09J1wwJzsKCXJldHVybiBzdHJsZW4obGFuZ3VhZ2VzW2ldLmxhbmduYW1lKTsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFZlckxhbmd1YWdlTmFtZTMyQQkJCQlbVkVSU0lPTi45XSAKICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWUzMkEoVUlOVDMyIGxhbmdpZCxMUFNUUiBsYW5nbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSU5UMzIgbGFuZ25hbWVsZW4pCnsKCXJldHVybiBWZXJMYW5ndWFnZU5hbWUxNihsYW5naWQsbGFuZ25hbWUsbGFuZ25hbWVsZW4pOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogVmVyTGFuZ3VhZ2VOYW1lMzJXCQkJCVtWRVJTSU9OLjEwXSAKICovCkRXT1JEIFdJTkFQSSBWZXJMYW5ndWFnZU5hbWUzMlcoVUlOVDMyIGxhbmdpZCxMUFdTVFIgbGFuZ25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUlOVDMyIGxhbmduYW1lbGVuKQp7CglpbnQJaTsKCUxQV1NUUglrZXluYW1lOwoJRFdPUkQJcmVzdWx0OwoJY2hhcglidWZmZXJbODBdOwoKCS8qIEZpcnN0LCBjaGVjayBcU3lzdGVtXEN1cnJlbnRDb250cm9sU2V0XGNvbnRyb2xcTmxzXExvY2FsZVw8bGFuZ2lkPgoJICogZnJvbSB0aGUgcmVnaXN0cnkuIAoJICovCglzcHJpbnRmKGJ1ZmZlciwKCQkiXFxTeXN0ZW1cXEN1cnJlbnRDb250cm9sU2V0XFxjb250cm9sXFxObHNcXExvY2FsZVxcJTA4eCIsCgkJbGFuZ2lkKTsKCWtleW5hbWUgPSBIRUFQX3N0cmR1cEF0b1coIEdldFByb2Nlc3NIZWFwKCksIDAsIGJ1ZmZlciApOwoJcmVzdWx0ID0gUmVnUXVlcnlWYWx1ZTMyVyhIS0VZX0xPQ0FMX01BQ0hJTkUsIGtleW5hbWUsIGxhbmduYW1lLAoJCQkJKExQRFdPUkQpJmxhbmduYW1lbGVuKTsKCUhlYXBGcmVlKCBHZXRQcm9jZXNzSGVhcCgpLCAwLCBrZXluYW1lICk7CglpZiAocmVzdWx0ICE9IEVSUk9SX1NVQ0NFU1MpIHsKCQkvKiBpZiB0aGF0IGZhaWxzLCB1c2UgdGhlIGludGVybmFsIHRhYmxlICovCgkJZm9yIChpPTA7bGFuZ3VhZ2VzW2ldLmxhbmdpZCE9MDtpKyspCgkJCWlmIChsYW5naWQ9PWxhbmd1YWdlc1tpXS5sYW5naWQpCgkJCQlicmVhazsKICAgICAgICAJbHN0cmNweUF0b1coIGxhbmduYW1lLCBsYW5ndWFnZXNbaV0ubGFuZ25hbWUgKTsKCQlsYW5nbmFtZWxlbiA9IHN0cmxlbihsYW5ndWFnZXNbaV0ubGFuZ25hbWUpOwoJIAkvKiBzYW1lIGFzIHN0cmxlblcobGFuZ25hbWUpOyAqLwoJfQoJcmV0dXJuIGxhbmduYW1lbGVuOwp9CiAKc3RhdGljIGludCBpc19wdW5jdHVhdGlvbih1bnNpZ25lZCBjaGFyIGMpCnsKICAvKiBwdW5jdHVhdGlvbiBjaGFyYWN0ZXJzIGFyZSA6CiAgICAgMzksIDQ1LCAxMjctMTI5LCAxNDEtMTQ0LCAxNTAtMTUxLCAxNTctMTU4LCAxNzMgKi8KICBpZiAoYz49MTQxKQogIHsKICAgIGlmIChjPD0xNTEpCiAgICAgIHJldHVybiAoYzw9MTQ0KSB8fCAoYz49MTUwKTsKICAgIGlmIChjPD0xNTgpCiAgICAgIHJldHVybiAoYz49MTU3KTsKICAgIHJldHVybiAoYz09MTczKTsKICB9CiAgaWYgKGM+PTEyNykKICAgIHJldHVybiAoYzw9MTI5KTsKICByZXR1cm4gKGM9PTM5KSB8fCAoYz09NDUpOwp9CgpzdGF0aWMgaW50IGlkZW50aXR5KGludCBjKQp7CiAgcmV0dXJuIGM7Cn0KCnN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIExDTV9Vbmljb2RlX0xVVFtdID0gewogIDcgICAgICAsICAgMiwgLyogICAtICAzMiAqLwogIDcgICAgICAsICAyOCwgLyogISAtICAzMyAqLwogIDcgICAgICAsICAyOSwgLyogIiAtICAzNCAqLyAvKiAiICovCiAgNyAgICAgICwgIDMxLCAvKiAjIC0gIDM1ICovCiAgNyAgICAgICwgIDMzLCAvKiAkIC0gIDM2ICovCiAgNyAgICAgICwgIDM1LCAvKiAlIC0gIDM3ICovCiAgNyAgICAgICwgIDM3LCAvKiAmIC0gIDM4ICovCiAgNiAgICAgICwgMTI4LCAvKiAnIC0gIDM5ICovCiAgNyAgICAgICwgIDM5LCAvKiAoIC0gIDQwICovCiAgNyAgICAgICwgIDQyLCAvKiApIC0gIDQxICovCiAgNyAgICAgICwgIDQ1LCAvKiAqIC0gIDQyICovCiAgOCAgICAgICwgICAzLCAvKiArIC0gIDQzICovCiAgNyAgICAgICwgIDQ3LCAvKiAsIC0gIDQ0ICovCiAgNiAgICAgICwgMTMwLCAvKiAtIC0gIDQ1ICovCiAgNyAgICAgICwgIDUxLCAvKiAuIC0gIDQ2ICovCiAgNyAgICAgICwgIDUzLCAvKiAvIC0gIDQ3ICovCiAxMiAgICAgICwgICAzLCAvKiAwIC0gIDQ4ICovCiAxMiAgICAgICwgIDMzLCAvKiAxIC0gIDQ5ICovCiAxMiAgICAgICwgIDUxLCAvKiAyIC0gIDUwICovCiAxMiAgICAgICwgIDcwLCAvKiAzIC0gIDUxICovCiAxMiAgICAgICwgIDg4LCAvKiA0IC0gIDUyICovCiAxMiAgICAgICwgMTA2LCAvKiA1IC0gIDUzICovCiAxMiAgICAgICwgMTI1LCAvKiA2IC0gIDU0ICovCiAxMiAgICAgICwgMTQ0LCAvKiA3IC0gIDU1ICovCiAxMiAgICAgICwgMTYyLCAvKiA4IC0gIDU2ICovCiAxMiAgICAgICwgMTgwLCAvKiA5IC0gIDU3ICovCiAgNyAgICAgICwgIDU1LCAvKiA6IC0gIDU4ICovCiAgNyAgICAgICwgIDU4LCAvKiA7IC0gIDU5ICovCiAgOCAgICAgICwgIDE0LCAvKiA8IC0gIDYwICovCiAgOCAgICAgICwgIDE4LCAvKiA9IC0gIDYxICovCiAgOCAgICAgICwgIDIwLCAvKiA+IC0gIDYyICovCiAgNyAgICAgICwgIDYwLCAvKiA/IC0gIDYzICovCiAgNyAgICAgICwgIDYyLCAvKiBAIC0gIDY0ICovCiAxNCAgICAgICwgICAyLCAvKiBBIC0gIDY1ICovCiAxNCAgICAgICwgICA5LCAvKiBCIC0gIDY2ICovCiAxNCAgICAgICwgIDEwLCAvKiBDIC0gIDY3ICovCiAxNCAgICAgICwgIDI2LCAvKiBEIC0gIDY4ICovCiAxNCAgICAgICwgIDMzLCAvKiBFIC0gIDY5ICovCiAxNCAgICAgICwgIDM1LCAvKiBGIC0gIDcwICovCiAxNCAgICAgICwgIDM3LCAvKiBHIC0gIDcxICovCiAxNCAgICAgICwgIDQ0LCAvKiBIIC0gIDcyICovCiAxNCAgICAgICwgIDUwLCAvKiBJIC0gIDczICovCiAxNCAgICAgICwgIDUzLCAvKiBKIC0gIDc0ICovCiAxNCAgICAgICwgIDU0LCAvKiBLIC0gIDc1ICovCiAxNCAgICAgICwgIDcyLCAvKiBMIC0gIDc2ICovCiAxNCAgICAgICwgIDgxLCAvKiBNIC0gIDc3ICovCiAxNCAgICAgICwgMTEyLCAvKiBOIC0gIDc4ICovCiAxNCAgICAgICwgMTI0LCAvKiBPIC0gIDc5ICovCiAxNCAgICAgICwgMTI2LCAvKiBQIC0gIDgwICovCiAxNCAgICAgICwgMTM3LCAvKiBRIC0gIDgxICovCiAxNCAgICAgICwgMTM4LCAvKiBSIC0gIDgyICovCiAxNCAgICAgICwgMTQ1LCAvKiBTIC0gIDgzICovCiAxNCAgICAgICwgMTUzLCAvKiBUIC0gIDg0ICovCiAxNCAgICAgICwgMTU5LCAvKiBVIC0gIDg1ICovCiAxNCAgICAgICwgMTYyLCAvKiBWIC0gIDg2ICovCiAxNCAgICAgICwgMTY0LCAvKiBXIC0gIDg3ICovCiAxNCAgICAgICwgMTY2LCAvKiBYIC0gIDg4ICovCiAxNCAgICAgICwgMTY3LCAvKiBZIC0gIDg5ICovCiAxNCAgICAgICwgMTY5LCAvKiBaIC0gIDkwICovCiAgNyAgICAgICwgIDYzLCAvKiBbIC0gIDkxICovCiAgNyAgICAgICwgIDY1LCAvKiBcIC0gIDkyICovCiAgNyAgICAgICwgIDY2LCAvKiBdIC0gIDkzICovCiAgNyAgICAgICwgIDY3LCAvKiBeIC0gIDk0ICovCiAgNyAgICAgICwgIDY4LCAvKiBfIC0gIDk1ICovCiAgNyAgICAgICwgIDcyLCAvKiBgIC0gIDk2ICovCiAxNCAgICAgICwgICAyLCAvKiBhIC0gIDk3ICovCiAxNCAgICAgICwgICA5LCAvKiBiIC0gIDk4ICovCiAxNCAgICAgICwgIDEwLCAvKiBjIC0gIDk5ICovCiAxNCAgICAgICwgIDI2LCAvKiBkIC0gMTAwICovCiAxNCAgICAgICwgIDMzLCAvKiBlIC0gMTAxICovCiAxNCAgICAgICwgIDM1LCAvKiBmIC0gMTAyICovCiAxNCAgICAgICwgIDM3LCAvKiBnIC0gMTAzICovCiAxNCAgICAgICwgIDQ0LCAvKiBoIC0gMTA0ICovCiAxNCAgICAgICwgIDUwLCAvKiBpIC0gMTA1ICovCiAxNCAgICAgICwgIDUzLCAvKiBqIC0gMTA2ICovCiAxNCAgICAgICwgIDU0LCAvKiBrIC0gMTA3ICovCiAxNCAgICAgICwgIDcyLCAvKiBsIC0gMTA4ICovCiAxNCAgICAgICwgIDgxLCAvKiBtIC0gMTA5ICovCiAxNCAgICAgICwgMTEyLCAvKiBuIC0gMTEwICovCiAxNCAgICAgICwgMTI0LCAvKiBvIC0gMTExICovCiAxNCAgICAgICwgMTI2LCAvKiBwIC0gMTEyICovCiAxNCAgICAgICwgMTM3LCAvKiBxIC0gMTEzICovCiAxNCAgICAgICwgMTM4LCAvKiByIC0gMTE0ICovCiAxNCAgICAgICwgMTQ1LCAvKiBzIC0gMTE1ICovCiAxNCAgICAgICwgMTUzLCAvKiB0IC0gMTE2ICovCiAxNCAgICAgICwgMTU5LCAvKiB1IC0gMTE3ICovCiAxNCAgICAgICwgMTYyLCAvKiB2IC0gMTE4ICovCiAxNCAgICAgICwgMTY0LCAvKiB3IC0gMTE5ICovCiAxNCAgICAgICwgMTY2LCAvKiB4IC0gMTIwICovCiAxNCAgICAgICwgMTY3LCAvKiB5IC0gMTIxICovCiAxNCAgICAgICwgMTY5LCAvKiB6IC0gMTIyICovCiAgNyAgICAgICwgIDc0LCAvKiB7IC0gMTIzICovCiAgNyAgICAgICwgIDc2LCAvKiB8IC0gMTI0ICovCiAgNyAgICAgICwgIDc4LCAvKiB9IC0gMTI1ICovCiAgNyAgICAgICwgIDgwLCAvKiB+IC0gMTI2ICovCiAgNiAgICAgICwgIDI5LCAvKiB/IC0gMTI3ICovCiAgNiAgICAgICwgIDMwLCAvKiCAIC0gMTI4ICovCiAgNiAgICAgICwgIDMxLCAvKiCBIC0gMTI5ICovCiAgNyAgICAgICwgMTIzLCAvKiCCIC0gMTMwICovCiAxNCAgICAgICwgIDM1LCAvKiCDIC0gMTMxICovCiAgNyAgICAgICwgMTI3LCAvKiCEIC0gMTMyICovCiAxMCAgICAgICwgIDIxLCAvKiCFIC0gMTMzICovCiAxMCAgICAgICwgIDE1LCAvKiCGIC0gMTM0ICovCiAxMCAgICAgICwgIDE2LCAvKiCHIC0gMTM1ICovCiAgNyAgICAgICwgIDY3LCAvKiCIIC0gMTM2ICovCiAxMCAgICAgICwgIDIyLCAvKiCJIC0gMTM3ICovCiAxNCAgICAgICwgMTQ1LCAvKiCKIC0gMTM4ICovCiAgNyAgICAgICwgMTM2LCAvKiCLIC0gMTM5ICovCiAxNCArIDE2ICwgMTI0LCAvKiCMIC0gMTQwICovCiAgNiAgICAgICwgIDQzLCAvKiCNIC0gMTQxICovCiAgNiAgICAgICwgIDQ0LCAvKiCOIC0gMTQyICovCiAgNiAgICAgICwgIDQ1LCAvKiCPIC0gMTQzICovCiAgNiAgICAgICwgIDQ2LCAvKiCQIC0gMTQ0ICovCiAgNyAgICAgICwgMTIxLCAvKiCRIC0gMTQ1ICovCiAgNyAgICAgICwgMTIyLCAvKiCSIC0gMTQ2ICovCiAgNyAgICAgICwgMTI1LCAvKiCTIC0gMTQ3ICovCiAgNyAgICAgICwgMTI2LCAvKiCUIC0gMTQ4ICovCiAxMCAgICAgICwgIDE3LCAvKiCVIC0gMTQ5ICovCiAgNiAgICAgICwgMTM3LCAvKiCWIC0gMTUwICovCiAgNiAgICAgICwgMTM5LCAvKiCXIC0gMTUxICovCiAgNyAgICAgICwgIDkzLCAvKiCYIC0gMTUyICovCiAxNCAgICAgICwgMTU2LCAvKiCZIC0gMTUzICovCiAxNCAgICAgICwgMTQ1LCAvKiCaIC0gMTU0ICovCiAgNyAgICAgICwgMTM3LCAvKiCbIC0gMTU1ICovCiAxNCArIDE2ICwgMTI0LCAvKiCcIC0gMTU2ICovCiAgNiAgICAgICwgIDU5LCAvKiCdIC0gMTU3ICovCiAgNiAgICAgICwgIDYwLCAvKiCeIC0gMTU4ICovCiAxNCAgICAgICwgMTY3LCAvKiCfIC0gMTU5ICovCiAgNyAgICAgICwgICA0LCAvKiCgIC0gMTYwICovCiAgNyAgICAgICwgIDgxLCAvKiChIC0gMTYxICovCiAxMCAgICAgICwgICAyLCAvKiCiIC0gMTYyICovCiAxMCAgICAgICwgICAzLCAvKiCjIC0gMTYzICovCiAxMCAgICAgICwgICA0LCAvKiCkIC0gMTY0ICovCiAxMCAgICAgICwgICA1LCAvKiClIC0gMTY1ICovCiAgNyAgICAgICwgIDgyLCAvKiCmIC0gMTY2ICovCiAxMCAgICAgICwgICA2LCAvKiCnIC0gMTY3ICovCiAgNyAgICAgICwgIDgzLCAvKiCoIC0gMTY4ICovCiAxMCAgICAgICwgICA3LCAvKiCpIC0gMTY5ICovCiAxNCAgICAgICwgICAyLCAvKiCqIC0gMTcwICovCiAgOCAgICAgICwgIDI0LCAvKiCrIC0gMTcxICovCiAxMCAgICAgICwgICA4LCAvKiCsIC0gMTcyICovCiAgNiAgICAgICwgMTMxLCAvKiCtIC0gMTczICovCiAxMCAgICAgICwgICA5LCAvKiCuIC0gMTc0ICovCiAgNyAgICAgICwgIDg0LCAvKiCvIC0gMTc1ICovCiAxMCAgICAgICwgIDEwLCAvKiCwIC0gMTc2ICovCiAgOCAgICAgICwgIDIzLCAvKiCxIC0gMTc3ICovCiAxMiAgICAgICwgIDUxLCAvKiCyIC0gMTc4ICovCiAxMiAgICAgICwgIDcwLCAvKiCzIC0gMTc5ICovCiAgNyAgICAgICwgIDg1LCAvKiC0IC0gMTgwICovCiAxMCAgICAgICwgIDExLCAvKiC1IC0gMTgxICovCiAxMCAgICAgICwgIDEyLCAvKiC2IC0gMTgyICovCiAxMCAgICAgICwgIDEzLCAvKiC3IC0gMTgzICovCiAgNyAgICAgICwgIDg2LCAvKiC4IC0gMTg0ICovCiAxMiAgICAgICwgIDMzLCAvKiC5IC0gMTg1ICovCiAxNCAgICAgICwgMTI0LCAvKiC6IC0gMTg2ICovCiAgOCAgICAgICwgIDI2LCAvKiC7IC0gMTg3ICovCiAxMiAgICAgICwgIDIxLCAvKiC8IC0gMTg4ICovCiAxMiAgICAgICwgIDI1LCAvKiC9IC0gMTg5ICovCiAxMiAgICAgICwgIDI5LCAvKiC+IC0gMTkwICovCiAgNyAgICAgICwgIDg3LCAvKiC/IC0gMTkxICovCiAxNCAgICAgICwgICAyLCAvKiDAIC0gMTkyICovCiAxNCAgICAgICwgICAyLCAvKiDBIC0gMTkzICovCiAxNCAgICAgICwgICAyLCAvKiDCIC0gMTk0ICovCiAxNCAgICAgICwgICAyLCAvKiDDIC0gMTk1ICovCiAxNCAgICAgICwgICAyLCAvKiDEIC0gMTk2ICovCiAxNCAgICAgICwgICAyLCAvKiDFIC0gMTk3ICovCiAxNCArIDE2ICwgICAyLCAvKiDGIC0gMTk4ICovCiAxNCAgICAgICwgIDEwLCAvKiDHIC0gMTk5ICovCiAxNCAgICAgICwgIDMzLCAvKiDIIC0gMjAwICovCiAxNCAgICAgICwgIDMzLCAvKiDJIC0gMjAxICovCiAxNCAgICAgICwgIDMzLCAvKiDKIC0gMjAyICovCiAxNCAgICAgICwgIDMzLCAvKiDLIC0gMjAzICovCiAxNCAgICAgICwgIDUwLCAvKiDMIC0gMjA0ICovCiAxNCAgICAgICwgIDUwLCAvKiDNIC0gMjA1ICovCiAxNCAgICAgICwgIDUwLCAvKiDOIC0gMjA2ICovCiAxNCAgICAgICwgIDUwLCAvKiDPIC0gMjA3ICovCiAxNCAgICAgICwgIDI2LCAvKiDQIC0gMjA4ICovCiAxNCAgICAgICwgMTEyLCAvKiDRIC0gMjA5ICovCiAxNCAgICAgICwgMTI0LCAvKiDSIC0gMjEwICovCiAxNCAgICAgICwgMTI0LCAvKiDTIC0gMjExICovCiAxNCAgICAgICwgMTI0LCAvKiDUIC0gMjEyICovCiAxNCAgICAgICwgMTI0LCAvKiDVIC0gMjEzICovCiAxNCAgICAgICwgMTI0LCAvKiDWIC0gMjE0ICovCiAgOCAgICAgICwgIDI4LCAvKiDXIC0gMjE1ICovCiAxNCAgICAgICwgMTI0LCAvKiDYIC0gMjE2ICovCiAxNCAgICAgICwgMTU5LCAvKiDZIC0gMjE3ICovCiAxNCAgICAgICwgMTU5LCAvKiDaIC0gMjE4ICovCiAxNCAgICAgICwgMTU5LCAvKiDbIC0gMjE5ICovCiAxNCAgICAgICwgMTU5LCAvKiDcIC0gMjIwICovCiAxNCAgICAgICwgMTY3LCAvKiDdIC0gMjIxICovCiAxNCArIDMyICwgMTUzLCAvKiDeIC0gMjIyICovCiAxNCArIDQ4ICwgMTQ1LCAvKiDfIC0gMjIzICovCiAxNCAgICAgICwgICAyLCAvKiDgIC0gMjI0ICovCiAxNCAgICAgICwgICAyLCAvKiDhIC0gMjI1ICovCiAxNCAgICAgICwgICAyLCAvKiDiIC0gMjI2ICovCiAxNCAgICAgICwgICAyLCAvKiDjIC0gMjI3ICovCiAxNCAgICAgICwgICAyLCAvKiDkIC0gMjI4ICovCiAxNCAgICAgICwgICAyLCAvKiDlIC0gMjI5ICovCiAxNCArIDE2ICwgICAyLCAvKiDmIC0gMjMwICovCiAxNCAgICAgICwgIDEwLCAvKiDnIC0gMjMxICovCiAxNCAgICAgICwgIDMzLCAvKiDoIC0gMjMyICovCiAxNCAgICAgICwgIDMzLCAvKiDpIC0gMjMzICovCiAxNCAgICAgICwgIDMzLCAvKiDqIC0gMjM0ICovCiAxNCAgICAgICwgIDMzLCAvKiDrIC0gMjM1ICovCiAxNCAgICAgICwgIDUwLCAvKiDsIC0gMjM2ICovCiAxNCAgICAgICwgIDUwLCAvKiDtIC0gMjM3ICovCiAxNCAgICAgICwgIDUwLCAvKiDuIC0gMjM4ICovCiAxNCAgICAgICwgIDUwLCAvKiDvIC0gMjM5ICovCiAxNCAgICAgICwgIDI2LCAvKiDwIC0gMjQwICovCiAxNCAgICAgICwgMTEyLCAvKiDxIC0gMjQxICovCiAxNCAgICAgICwgMTI0LCAvKiDyIC0gMjQyICovCiAxNCAgICAgICwgMTI0LCAvKiDzIC0gMjQzICovCiAxNCAgICAgICwgMTI0LCAvKiD0IC0gMjQ0ICovCiAxNCAgICAgICwgMTI0LCAvKiD1IC0gMjQ1ICovCiAxNCAgICAgICwgMTI0LCAvKiD2IC0gMjQ2ICovCiAgOCAgICAgICwgIDI5LCAvKiD3IC0gMjQ3ICovCiAxNCAgICAgICwgMTI0LCAvKiD4IC0gMjQ4ICovCiAxNCAgICAgICwgMTU5LCAvKiD5IC0gMjQ5ICovCiAxNCAgICAgICwgMTU5LCAvKiD6IC0gMjUwICovCiAxNCAgICAgICwgMTU5LCAvKiD7IC0gMjUxICovCiAxNCAgICAgICwgMTU5LCAvKiD8IC0gMjUyICovCiAxNCAgICAgICwgMTY3LCAvKiD9IC0gMjUzICovCiAxNCArIDMyICwgMTUzLCAvKiD+IC0gMjU0ICovCiAxNCAgICAgICwgMTY3ICAvKiD/IC0gMjU1ICovIH07CgpzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBMQ01fVW5pY29kZV9MVVRfMltdID0geyAzMywgNDQsIDE0NSB9OwoKI2RlZmluZSBMQ01fRGlhY3JpdGljX1N0YXJ0IDEzMQoKc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgTENNX0RpYWNyaXRpY19MVVRbXSA9IHsgCjEyMywgIC8qIIMgLSAxMzEgKi8KICAyLCAgLyoghCAtIDEzMiAqLwogIDIsICAvKiCFIC0gMTMzICovCiAgMiwgIC8qIIYgLSAxMzQgKi8KICAyLCAgLyoghyAtIDEzNSAqLwogIDMsICAvKiCIIC0gMTM2ICovCiAgMiwgIC8qIIkgLSAxMzcgKi8KIDIwLCAgLyogiiAtIDEzOCAqLwogIDIsICAvKiCLIC0gMTM5ICovCiAgMiwgIC8qIIwgLSAxNDAgKi8KICAyLCAgLyogjSAtIDE0MSAqLwogIDIsICAvKiCOIC0gMTQyICovCiAgMiwgIC8qII8gLSAxNDMgKi8KICAyLCAgLyogkCAtIDE0NCAqLwogIDIsICAvKiCRIC0gMTQ1ICovCiAgMiwgIC8qIJIgLSAxNDYgKi8KICAyLCAgLyogkyAtIDE0NyAqLwogIDIsICAvKiCUIC0gMTQ4ICovCiAgMiwgIC8qIJUgLSAxNDkgKi8KICAyLCAgLyogliAtIDE1MCAqLwogIDIsICAvKiCXIC0gMTUxICovCiAgMiwgIC8qIJggLSAxNTIgKi8KICAyLCAgLyogmSAtIDE1MyAqLwogMjAsICAvKiCaIC0gMTU0ICovCiAgMiwgIC8qIJsgLSAxNTUgKi8KICAyLCAgLyognCAtIDE1NiAqLwogIDIsICAvKiCdIC0gMTU3ICovCiAgMiwgIC8qIJ4gLSAxNTggKi8KIDE5LCAgLyognyAtIDE1OSAqLwogIDIsICAvKiCgIC0gMTYwICovCiAgMiwgIC8qIKEgLSAxNjEgKi8KICAyLCAgLyogoiAtIDE2MiAqLwogIDIsICAvKiCjIC0gMTYzICovCiAgMiwgIC8qIKQgLSAxNjQgKi8KICAyLCAgLyogpSAtIDE2NSAqLwogIDIsICAvKiCmIC0gMTY2ICovCiAgMiwgIC8qIKcgLSAxNjcgKi8KICAyLCAgLyogqCAtIDE2OCAqLwogIDIsICAvKiCpIC0gMTY5ICovCiAgMywgIC8qIKogLSAxNzAgKi8KICAyLCAgLyogqyAtIDE3MSAqLwogIDIsICAvKiCsIC0gMTcyICovCiAgMiwgIC8qIK0gLSAxNzMgKi8KICAyLCAgLyogriAtIDE3NCAqLwogIDIsICAvKiCvIC0gMTc1ICovCiAgMiwgIC8qILAgLSAxNzYgKi8KICAyLCAgLyogsSAtIDE3NyAqLwogIDIsICAvKiCyIC0gMTc4ICovCiAgMiwgIC8qILMgLSAxNzkgKi8KICAyLCAgLyogtCAtIDE4MCAqLwogIDIsICAvKiC1IC0gMTgxICovCiAgMiwgIC8qILYgLSAxODIgKi8KICAyLCAgLyogtyAtIDE4MyAqLwogIDIsICAvKiC4IC0gMTg0ICovCiAgMiwgIC8qILkgLSAxODUgKi8KICAzLCAgLyoguiAtIDE4NiAqLwogIDIsICAvKiC7IC0gMTg3ICovCiAgMiwgIC8qILwgLSAxODggKi8KICAyLCAgLyogvSAtIDE4OSAqLwogIDIsICAvKiC+IC0gMTkwICovCiAgMiwgIC8qIL8gLSAxOTEgKi8KIDE1LCAgLyogwCAtIDE5MiAqLwogMTQsICAvKiDBIC0gMTkzICovCiAxOCwgIC8qIMIgLSAxOTQgKi8KIDI1LCAgLyogwyAtIDE5NSAqLwogMTksICAvKiDEIC0gMTk2ICovCiAyNiwgIC8qIMUgLSAxOTcgKi8KICAyLCAgLyogxiAtIDE5OCAqLwogMjgsICAvKiDHIC0gMTk5ICovCiAxNSwgIC8qIMggLSAyMDAgKi8KIDE0LCAgLyogySAtIDIwMSAqLwogMTgsICAvKiDKIC0gMjAyICovCiAxOSwgIC8qIMsgLSAyMDMgKi8KIDE1LCAgLyogzCAtIDIwNCAqLwogMTQsICAvKiDNIC0gMjA1ICovCiAxOCwgIC8qIM4gLSAyMDYgKi8KIDE5LCAgLyogzyAtIDIwNyAqLwoxMDQsICAvKiDQIC0gMjA4ICovCiAyNSwgIC8qINEgLSAyMDkgKi8KIDE1LCAgLyog0iAtIDIxMCAqLwogMTQsICAvKiDTIC0gMjExICovCiAxOCwgIC8qINQgLSAyMTIgKi8KIDI1LCAgLyog1SAtIDIxMyAqLwogMTksICAvKiDWIC0gMjE0ICovCiAgMiwgIC8qINcgLSAyMTUgKi8KIDMzLCAgLyog2CAtIDIxNiAqLwogMTUsICAvKiDZIC0gMjE3ICovCiAxNCwgIC8qINogLSAyMTggKi8KIDE4LCAgLyog2yAtIDIxOSAqLwogMTksICAvKiDcIC0gMjIwICovCiAxNCwgIC8qIN0gLSAyMjEgKi8KICAyLCAgLyog3iAtIDIyMiAqLwogIDIsICAvKiDfIC0gMjIzICovCiAxNSwgIC8qIOAgLSAyMjQgKi8KIDE0LCAgLyog4SAtIDIyNSAqLwogMTgsICAvKiDiIC0gMjI2ICovCiAyNSwgIC8qIOMgLSAyMjcgKi8KIDE5LCAgLyog5CAtIDIyOCAqLwogMjYsICAvKiDlIC0gMjI5ICovCiAgMiwgIC8qIOYgLSAyMzAgKi8KIDI4LCAgLyog5yAtIDIzMSAqLwogMTUsICAvKiDoIC0gMjMyICovCiAxNCwgIC8qIOkgLSAyMzMgKi8KIDE4LCAgLyog6iAtIDIzNCAqLwogMTksICAvKiDrIC0gMjM1ICovCiAxNSwgIC8qIOwgLSAyMzYgKi8KIDE0LCAgLyog7SAtIDIzNyAqLwogMTgsICAvKiDuIC0gMjM4ICovCiAxOSwgIC8qIO8gLSAyMzkgKi8KMTA0LCAgLyog8CAtIDI0MCAqLwogMjUsICAvKiDxIC0gMjQxICovCiAxNSwgIC8qIPIgLSAyNDIgKi8KIDE0LCAgLyog8yAtIDI0MyAqLwogMTgsICAvKiD0IC0gMjQ0ICovCiAyNSwgIC8qIPUgLSAyNDUgKi8KIDE5LCAgLyog9iAtIDI0NiAqLwogIDIsICAvKiD3IC0gMjQ3ICovCiAzMywgIC8qIPggLSAyNDggKi8KIDE1LCAgLyog+SAtIDI0OSAqLwogMTQsICAvKiD6IC0gMjUwICovCiAxOCwgIC8qIPsgLSAyNTEgKi8KIDE5LCAgLyog/CAtIDI1MiAqLwogMTQsICAvKiD9IC0gMjUzICovCiAgMiwgIC8qIP4gLSAyNTQgKi8KIDE5LCAgLyog/yAtIDI1NSAqLwp9IDsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIENvbnZlcnQgYSBzdHJpbmcsIG9yIGdlbmVyYXRlIGEgc29ydCBrZXkgZnJvbSBpdC4KICoKICogSWYgKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSksIHRoZSBmdW5jdGlvbiB3aWxsIGdlbmVyYXRlCiAqIGEgc29ydCBrZXkgZm9yIHRoZSBzb3VyY2Ugc3RyaW5nLiAgRWxzZSwgaXQgd2lsbCBjb252ZXJ0IGl0CiAqIGFjY29yZGluZ2x5IHRvIHRoZSBmbGFncyBMQ01BUF9VUFBFUkNBU0UsIExDTUFQX0xPV0VSQ0FTRSwuLi4KICoKICogUkVUVVJOUwogKiAgICBFcnJvciA6IChkZXN0aW5hdGlvbiBidWZmZXIgdG9vIHNtYWxsKSAwLgogKiAgICBTdWNjZXNzIDogbGVuZ3RoIG9mIHRoZSByZXN1bHQgc3RyaW5nLgogKgogKiBSRU1BUktTCiAqICAgIElmIGNhbGxlZCB3aXRoIHNjcmxlbiA9IC0xLCB0aGUgZnVuY3Rpb24gd2lsbCBjb21wdXRlIHRoZSBsZW5ndGgKICogICAgICBvZiB0aGUgMC10ZXJtaW5hdGVkIHN0cmluZyBzdHJzcmMgYnkgaXRzZWxmLiAgICAgIAogKi8KIElOVDMyIFdJTkFQSSBMQ01hcFN0cmluZzMyQSgKCUxDSUQgbGNpZCAvKiBsb2NhbGUgaWRlbnRpZmllciBjcmVhdGVkIHdpdGggTUFLRUxDSUQ7IAoJCSAgICAgTE9DQUxFX1NZU1RFTV9ERUZBVUxUIGFuZCBMT0NBTEVfVVNFUl9ERUZBVUxUIGFyZSBwcmVkZWZpbmVkCgkJICAgICB2YWx1ZXMuICovLAoJRFdPUkQgbWFwZmxhZ3MgLyogZmxhZ3MgKi8sCglMUENTVFIgc3Jjc3RyICAvKiBzb3VyY2UgYnVmZmVyICovLAoJSU5UMzIgc3JjbGVuICAgLyogc291cmNlIGxlbmd0aCAqLywKCUxQU1RSIGRzdHN0ciAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciAqLywKCUlOVDMyIGRzdGxlbiAgIC8qIGRlc3RpbmF0aW9uIGJ1ZmZlciBsZW5ndGggKi8pIAp7CiAgaW50IGk7CiAKICBUUkFDRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXMsJWQsJXAsJWQpXG4iLAoJbGNpZCxtYXBmbGFncyxzcmNzdHIsc3JjbGVuLGRzdHN0cixkc3RsZW4pOwoKICBpZiAoKGRzdHN0cj09TlVMTCkgfHwgKHNyY3N0cj09TlVMTCkpCiAgICByZXR1cm4gMDsKICBpZiAoc3JjbGVuPT0tMSkgCiAgICBzcmNsZW4gPSBsc3RybGVuMzJBKHNyY3N0cik7CgogIGlmIChtYXBmbGFncyAmIH4gKCBMQ01BUF9VUFBFUkNBU0UgfCBMQ01BUF9MT1dFUkNBU0UgfCBMQ01BUF9TT1JUS0VZIHwKCQkgICAgIFNPUlRfU1RSSU5HU09SVCkgKQogIHsKICAgIEZJWE1FKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZCk6ICIKCSAgInVuaW1wbGVtZW50ZWQgZmxhZ3M6IDB4JTA4bHhcbiIsCgkgIGxjaWQsbWFwZmxhZ3Msc3Jjc3RyLHNyY2xlbixkc3RzdHIsZHN0bGVuLG1hcGZsYWdzKTsKICB9CiAgCiAgaWYgKCAhKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgKQogIHsKICAgIGludCAoKmYpKGludCk9aWRlbnRpdHk7IAoKICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiBzcmNsZW47ICAvKiBkc3RsZW49MCBtZWFucyAiZG8gbm90aGluZyBidXQgcmV0dXJuIHJlcXVpcmVkIGxlbmd0aCIgKi8KICAgIGlmIChkc3RsZW48c3JjbGVuKQogICAgICByZXR1cm4gMDsgICAgICAgLyogaXQncyBhbiBlcnJvciAqLwogICAgaWYgKG1hcGZsYWdzICYgTENNQVBfVVBQRVJDQVNFKQogICAgICBmID0gdG91cHBlcjsKICAgIGVsc2UgaWYgKG1hcGZsYWdzICYgTENNQVBfTE9XRVJDQVNFKQogICAgICBmID0gdG9sb3dlcjsKICAgIGZvciAoaT0wOyBpIDwgc3JjbGVuOyBpKyspCiAgICAgIGRzdHN0cltpXSA9IChDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KCiAgLyogZWxzZSAuLi4gKG1hcGZsYWdzICYgTENNQVBfU09SVEtFWSkgICovCiAgewogICAgaW50IHVuaWNvZGVfbGVuPTA7CiAgICBpbnQgY2FzZV9sZW49MDsKICAgIGludCBkaWFjcml0aWNfbGVuPTA7CiAgICBjaGFyICpjYXNlX2NvbXBvbmVudDsKICAgIGNoYXIgKmRpYWNyaXRpY19jb21wb25lbnQ7CiAgICBpbnQgcm9vbSxjb3VudDsKICAgIGludCBmbGFnX3N0cmluZ3NvcnQgPSBtYXBmbGFncyAmIFNPUlRfU1RSSU5HU09SVDsKCiAgICAvKiBjb21wdXRlIGhvdyBtdWNoIHJvb20gd2Ugd2lsbCBuZWVkICovCiAgICBmb3IgKGk9MDtpPHNyY2xlbjtpKyspCiAgICB7CiAgICAgIGludCBvZnM7CiAgICAgIGlmICgoc3Jjc3RyW2ldIT0nXDAnKSAmJiAoZmxhZ19zdHJpbmdzb3J0IHx8ICFpc19wdW5jdHVhdGlvbihzcmNzdHJbaV0pKSkKICAgICAgewoJdW5pY29kZV9sZW4rKzsKCWlmKCgodW5zaWduZWQgY2hhcilzcmNzdHJbaV0pPD0zMSkKCXsKCSAgRklYTUUoc3RyaW5nLCIgY29udHJvbCBjaGFyYWN0ZXJzIGluIGFyZ3VtZW50IHN0cmluZ1xuIik7CgkgIHJldHVybiAwOwoJfQoJaWYgKCBMQ01fVW5pY29kZV9MVVRbMiooKHVuc2lnbmVkIGNoYXIpc3Jjc3RyW2ldLTMyKV0gJiB+MTUgKQoJICB1bmljb2RlX2xlbisrOyAgICAgICAgICAgICAvKiBkb3VibGUgbGV0dGVyICovCiAgICAgIH0KCSAgCiAgICAgIGlmIChpc3VwcGVyKHNyY3N0cltpXSkpCgljYXNlX2xlbj11bmljb2RlX2xlbjsgCgogICAgICBvZnMgPSAodW5zaWduZWQgY2hhcilzcmNzdHJbaV0gLSBMQ01fRGlhY3JpdGljX1N0YXJ0OwogICAgICBpZiAoKG9mcz49MCkgJiYgKExDTV9EaWFjcml0aWNfTFVUW29mc10hPTIpKQoJZGlhY3JpdGljX2xlbj11bmljb2RlX2xlbjsKICAgIH0KCiAgICByb29tID0gIDIgKiB1bmljb2RlX2xlbiAgICAgICAgIC8qICJ1bmljb2RlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgZGlhY3JpdGljX2xlbiAgICAgICAgICAgLyogImRpYWNyaXRpYyIgY29tcG9uZW50ICovCiAgICAgICsgICAgIGNhc2VfbGVuICAgICAgICAgICAgICAgIC8qICJjYXNlIiBjb21wb25lbnQgKi8KICAgICAgKyAgICAgNCAgICAgICAgICAgICAgICAgICAgICAgLyogZm91ciAnXDEnIHNlcGFyYXRvcnMgKi8KICAgICAgKyAgICAgMSAgOyAgICAgICAgICAgICAgICAgICAgLyogdGVybWluYWwgJ1wwJyAqLwogICAgaWYgKGRzdGxlbj09MCkKICAgICAgcmV0dXJuIHJvb207ICAgICAgCiAgICBlbHNlIGlmIChkc3RsZW48cm9vbSkKICAgICAgcmV0dXJuIDA7ICAgCgogICAgLyogbG9jYXRlIGVhY2ggY29tcG9uZW50LCB3cml0ZSBzZXBhcmF0b3JzICovCiAgICBkaWFjcml0aWNfY29tcG9uZW50ID0gZHN0c3RyICsgMip1bmljb2RlX2xlbiA7CiAgICAqZGlhY3JpdGljX2NvbXBvbmVudCsrID0gJ1wxJzsgCgogICAgY2FzZV9jb21wb25lbnQgPSBkaWFjcml0aWNfY29tcG9uZW50ICsgZGlhY3JpdGljX2xlbiA7CiAgICAqY2FzZV9jb21wb25lbnQrKyA9ICdcMSc7IAoKICAgIC8qIHJlYWQgc291cmNlIHN0cmluZyBjaGFyIGJ5IGNoYXIsIHdyaXRlIAogICAgICAgY29ycmVzcG9uZGluZyB3ZWlnaHQgaW4gZWFjaCBjb21wb25lbnQuICovCiAgICBmb3IgKGk9MCxjb3VudD0wO2NvdW50PHVuaWNvZGVfbGVuO2krKykKICAgIHsKICAgICAgdW5zaWduZWQgY2hhciBjPXNyY3N0cltpXTsKICAgICAgaWYgKCAoYyE9J1wwJykgJiYgKGZsYWdfc3RyaW5nc29ydCB8fCAhaXNfcHVuY3R1YXRpb24oYykpICkKICAgICAgewoJaW50IHR5cGUsbG9uZ2NvZGU7CglpbnQgTFVUX29mZnNldCA9IDIqKGMtMzIpOwoJdHlwZSA9IExDTV9Vbmljb2RlX0xVVFtMVVRfb2Zmc2V0XTsKCWxvbmdjb2RlID0gdHlwZSA+PiA0OwoJdHlwZSAmPSAxNTsKCWRzdHN0clsyKmNvdW50XSA9IHR5cGU7Cglkc3RzdHJbMipjb3VudCsxXSA9IExDTV9Vbmljb2RlX0xVVFtMVVRfb2Zmc2V0KzFdOyAgCglpZiAobG9uZ2NvZGUpCgl7CgkgIGlmIChjb3VudDxjYXNlX2xlbikKCSAgICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc3Jjc3RyW2ldKSA/IDE4IDogMiApIDsKCSAgaWYgKGNvdW50PGRpYWNyaXRpY19sZW4pCgkgICAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAyOyAvKiBhc3N1bXB0aW9uOiBhIGRvdWJsZSBsZXR0ZXIKCQkJCQkgICAgICAgaXMgbmV2ZXIgYWNjZW50ZWQgKi8KCSAgY291bnQrKzsKCgkgIGRzdHN0clsyKmNvdW50XSA9IHR5cGU7CgkgIGRzdHN0clsyKmNvdW50KzFdID0gKihMQ01fVW5pY29kZV9MVVRfMiAtIDEgKyBsb25nY29kZSk7IAoJICAvKiAxNiBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIExDTV9Vbmljb2RlX0xVVCAgLS0+ICBsb25nY29kZSA9IDEgCgkgICAgIDMyIGluIHRoZSBmaXJzdCBjb2x1bW4gb2YgTENNX1VuaWNvZGVfTFVUICAtLT4gIGxvbmdjb2RlID0gMiAKCSAgICAgNDggaW4gdGhlIGZpcnN0IGNvbHVtbiBvZiBMQ01fVW5pY29kZV9MVVQgIC0tPiAgbG9uZ2NvZGUgPSAzICovCgl9CgoJaWYgKGNvdW50PGNhc2VfbGVuKQoJICBjYXNlX2NvbXBvbmVudFtjb3VudF0gPSAoIGlzdXBwZXIoc3Jjc3RyW2ldKSA/IDE4IDogMiApIDsKCWlmIChjb3VudDxkaWFjcml0aWNfbGVuKQoJewoJICBpbnQgb2ZzID0gKHVuc2lnbmVkIGNoYXIpc3Jjc3RyW2ldIC0gTENNX0RpYWNyaXRpY19TdGFydDsKCSAgZGlhY3JpdGljX2NvbXBvbmVudFtjb3VudF0gPSAob2ZzPj0wID8gTENNX0RpYWNyaXRpY19MVVRbb2ZzXSA6IDIpOwoJfQoJY291bnQrKzsKICAgICAgfQogICAgfQogICAgZHN0c3RyW3Jvb20tM10gPSBkc3RzdHJbcm9vbS0yXSA9ICdcMSc7CiAgICBkc3RzdHJbcm9vbS0xXSA9ICdcMCc7CiAgICByZXR1cm4gcm9vbTsKICB9Cn0KIApJTlQzMiBXSU5BUEkgTENNYXBTdHJpbmczMlcoCglMQ0lEIGxjaWQsRFdPUkQgbWFwZmxhZ3MsTFBDV1NUUiBzcmNzdHIsSU5UMzIgc3JjbGVuLExQV1NUUiBkc3RzdHIsCglJTlQzMiBkc3RsZW4pCnsKICBpbnQgaTsKIAogIFRSQUNFKHN0cmluZywiKDB4JTA0bHgsMHglMDhseCwlcCwlZCwlcCwlZClcbiIsCglsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbik7CgogIGlmICgoZHN0c3RyPT1OVUxMKSB8fCAoc3Jjc3RyPT1OVUxMKSkKICAgIHJldHVybiAwOwogIGlmIChzcmNsZW49PS0xKSAKICAgIHNyY2xlbiA9IGxzdHJsZW4zMlcoc3Jjc3RyKTsKICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9TT1JUS0VZKSAKICB7CiAgICBGSVhNRShzdHJpbmcsIigweCUwNGx4LDB4JTA4bHgsJXAsJWQsJXAsJWQpOiAiCgkgICJ1bmltcGxlbWVudGVkIGZsYWdzOiAweCUwOGx4XG4iLAoJICBsY2lkLG1hcGZsYWdzLHNyY3N0cixzcmNsZW4sZHN0c3RyLGRzdGxlbixtYXBmbGFncyk7CiAgICByZXR1cm4gMDsKICB9CiAgZWxzZQogIHsKICAgIGludCAoKmYpKGludCk9aWRlbnRpdHk7IAoKICAgIGlmIChkc3RsZW49PTApCiAgICAgIHJldHVybiBzcmNsZW47ICAKICAgIGlmIChkc3RsZW48c3JjbGVuKQogICAgICByZXR1cm4gMDsgICAgICAgCiAgICBpZiAobWFwZmxhZ3MgJiBMQ01BUF9VUFBFUkNBU0UpCiAgICAgIGYgPSB0b3VwcGVyOwogICAgZWxzZSBpZiAobWFwZmxhZ3MgJiBMQ01BUF9MT1dFUkNBU0UpCiAgICAgIGYgPSB0b2xvd2VyOwogICAgZm9yIChpPTA7IGkgPCBzcmNsZW47IGkrKykKICAgICAgZHN0c3RyW2ldID0gKFdDSEFSKSBmKHNyY3N0cltpXSk7CiAgICByZXR1cm4gc3JjbGVuOwogIH0KfQoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgT0xFX0dldEZvcm1hdEEoKSBbaW50ZXJuYWxdCgoKIFRoaXMgZnVuY3Rpb24gaW1wbGVtZW50cyBzdHVmZiBmb3IgR2V0RGF0ZUZvcm1hdCgpIGFuZCAKIEdldFRpbWVGb3JtYXQoKS4KCiAgZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAgTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICBNTSAgIHR3by1kaWdpdCBtb250aAogIE1NTSAgc2hvcnQgbW9udGggbmFtZQogIE1NTU0gZnVsbCBtb250aCBuYW1lCiAgeSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAgeXkgICB0d28tZGlnaXQgeWVhcgogIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAgZ2cgICBlcmEgc3RyaW5nCiAgaCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMTItaG91cikKICBoaCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgSCAgICBob3VycyB3aXRoIG5vIGxlYWRpbmcgemVybyAoMjQtaG91cikKICBISCAgIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgbSAgICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgbW0gICBtaW51dGVzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgcyAgICBzZWNvbmRzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAgc3MgICBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAgdCAgICB0aW1lIG1hcmtlciAoQSBvciBQKQogIHR0ICAgdGltZSBtYXJrZXIgKEFNLCBQTSkKICAnJyAgIHVzZWQgdG8gcXVvdGUgbGl0ZXJhbCBjaGFyYWN0ZXJzCiAgJycgICAod2l0aGluIGEgcXVvdGVkIHN0cmluZykgaW5kaWNhdGVzIGEgbGl0ZXJhbCAnCgogVGhlc2UgZnVuY3Rpb25zIFJFUVVJUkUgdmFsaWQgbG9jYWxlLCBkYXRlLCAgYW5kIGZvcm1hdC4gCgogKi8KCklOVDMyIFdJTkFQSSBPTEVfR2V0Rm9ybWF0QShMQ0lEIGxvY2FsZSwKCQkJICAgIERXT1JEIGZsYWdzLAoJCQkgICAgTFBTWVNURU1USU1FIHh0aW1lLAoJCQkgICAgTFBDU1RSIGZvcm1hdCwgCgkJCSAgICBMUFNUUiBkYXRlLCBJTlQzMiBkYXRlbGVuKQp7CiAgIElOVDMyIGlucG9zLCBvdXRwb3M7CiAgIGludCBjb3VudCwgdHlwZSwgaW5xdW90ZSwgT3ZlcmZsb3c7CiAgIGNoYXIgYnVmWzQwXTsKICAgaW50IGJ1ZmxlbjsKCiAgIGNvbnN0IGNoYXIgKiBfZGdmbXRbXSA9IHsgIiVkIiwgIiUwMmQiIH07CiAgIGNvbnN0IGNoYXIgKiogZGdmbXQgPSBfZGdmbXQgLSAxOyAKCiAgIC8qIHJlcG9ydCwgZm9yIGRlYnVnZ2luZyAqLwogICBUUkFDRShvbGUsICJmdW5jKCU4bHgsJThseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OlwnJXNcJyAoYXQgJXApLCAlcCAoJTlzKSwgbGVuPSVkKVxuIiwgbG9jYWxlLCBmbGFncywKCSB4dGltZS0+d0RheSwgeHRpbWUtPndIb3VyLCB4dGltZS0+d01pbnV0ZSwgeHRpbWUtPndTZWNvbmQsCgkgZm9ybWF0LCBmb3JtYXQsIGRhdGUsIGRhdGUsIGRhdGVsZW4pOwogIAogICAvKiBpbml0YWxpemUgc3RhdGUgdmFyaWFibGVzIGFuZCBvdXRwdXQgYnVmZmVyICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOyBpbnF1b3RlID0gMDsgT3ZlcmZsb3cgPSAwOwogICB0eXBlID0gJ1wwJzsKICAgZGF0ZVswXSA9IGJ1ZlswXSA9ICdcMCc7CiAgICAgIAogICBmb3IgKGlucG9zID0gMDs7IGlucG9zKyspIHsKICAgICAgLyogVFJBQ0Uob2xlLCAiU1RBVEUgaW5wb3M9JTJkIG91dHBvcz0lMmQgY291bnQ9JWQgaW5xdW90ZT0lZCB0eXBlPSVjIGJ1ZixkYXRlID0gJWMsJWNcbiIsIGlucG9zLCBvdXRwb3MsIGNvdW50LCBpbnF1b3RlLCB0eXBlLCBidWZbaW5wb3NdLCBkYXRlW291dHBvc10pOyAqLwogICAgICBpZiAoaW5xdW90ZSkgewoJIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcyArPSAxOwoJICAgICAgIGRhdGVbb3V0cG9zKytdID0gJ1wnJzsKCSAgICB9IGVsc2UgewoJICAgICAgIGlucXVvdGUgPSAwOwoJICAgICAgIGNvbnRpbnVlOyAvKiB3ZSBkaWQgbm90aGluZyB0byB0aGUgb3V0cHV0ICovCgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSAnXDAnOwoJICAgIGlmIChvdXRwb3MgPiBkYXRlbGVuKSBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7CgkgfSBlbHNlIHsKCSAgICBkYXRlW291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CgkgICAgaWYgKG91dHBvcyA+IGRhdGVsZW4pIHsKCSAgICAgICBPdmVyZmxvdyA9IDE7CgkgICAgICAgZGF0ZVtvdXRwb3MtMV0gPSAnXDAnOyAvKiB0aGlzIGlzIHRoZSBsYXN0IHBsYWNlIHdoZXJlCgkJCQkJIGl0J3Mgc2FmZSB0byB3cml0ZSAqLwoJICAgICAgIGJyZWFrOwoJICAgIH0KCSB9CiAgICAgIH0gZWxzZSBpZiAoICAoY291bnQgJiYgKGZvcm1hdFtpbnBvc10gIT0gdHlwZSkpCgkJICAgfHwgY291bnQgPT0gNAoJCSAgIHx8IChjb3VudCA9PSAyICYmIHN0cmNocigiZ2hIbXN0IiwgdHlwZSkpICkKICAgICAgIHsKCSAgICBpZiAgICAgICAgICh0eXBlID09ICdkJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU0RBWU5BTUUxCgkJCQkgICArIHh0aW1lLT53RGF5T2ZXZWVrIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gMykgewoJCQkgICBHZXRMb2NhbGVJbmZvMzJBKGxvY2FsZSwgCgkJCQkJICAgIExPQ0FMRV9TQUJCUkVWREFZTkFNRTEgCgkJCQkJICAgICsgeHRpbWUtPndEYXlPZldlZWsgLSAxLAoJCQkJCSAgICBidWYsIHNpemVvZihidWYpKTsKCQkgICAgICB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndEYXkpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ00nKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDMpIHsKCQkgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLCAKCQkJCSAgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMQoJCQkJICAgKyB4dGltZS0+d01vbnRoIC0gMSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0gZWxzZSBpZiAoY291bnQgPT0gNCkgewoJCSAgR2V0TG9jYWxlSW5mbzMyQShsb2NhbGUsCgkJCQkgICBMT0NBTEVfU01PTlRITkFNRTEKCQkJCSAgICsgeHRpbWUtPndNb250aCAtIDEsCgkJCQkgICBidWYsIHNpemVvZihidWYpKTsKCQkgfSBlbHNlIHsKCQkgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53TW9udGgpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3knKSB7CgkgICAgICAgaWYgKGNvdW50ID09IDQpIHsKCQkgICAgICBzcHJpbnRmKGJ1ZiwgIiVkIiwgeHRpbWUtPndZZWFyKTsKCSAgICAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCQkgIHN0cmNweShidWYsICJ5eXkiKTsKCQkgIFdBUk4ob2xlLAoJCQkgICAgICAidW5rbm93biBmb3JtYXQsXApjPSVjLCBuPSVkXG4iLCAgdHlwZSwgY291bnQpOwoJCSB9IGVsc2UgewoJCSAgc3ByaW50ZihidWYsIGRnZm10W2NvdW50XSwgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICAgICB9CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJCSAgRklYTUUob2xlLCAiTE9DQUxFX0lDQUxFTkRBUlRZUEUgdW5pbXAuXG4iKTsKCQkgIHN0cmNweShidWYsICJBRCIpOwoJICAgIH0gZWxzZSB7CgkJICBzdHJjcHkoYnVmLCAiZyIpOwoJCSAgV0FSTihvbGUsCgkJCSAgICAgICAidW5rbm93biBmb3JtYXQsIFwKYz0lYywgbj0lZFxuIiwgdHlwZSwgY291bnQpOwoJICAgICAgIH0KCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ2gnKSB7CgkgICAgICAgLyogZ2l2ZXMgdXMgaG91cnMgMTowMCAtLSAxMjowMCAqLwoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sICh4dGltZS0+d0hvdXItMSklMTIgKzEpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnSCcpIHsKCSAgICAgICAvKiAyNC1ob3VyIHRpbWUgKi8KCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d0hvdXIpOwoJICAgIH0gZWxzZSBpZiAodHlwZSA9PSAnbScpIHsKCSAgICAgICBzcHJpbnRmKGJ1ZiwgZGdmbXRbY291bnRdLCB4dGltZS0+d01pbnV0ZSk7CgkgICAgfSBlbHNlIGlmICh0eXBlID09ICdzJykgewoJICAgICAgIHNwcmludGYoYnVmLCBkZ2ZtdFtjb3VudF0sIHh0aW1lLT53U2Vjb25kKTsKCSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkJICBzcHJpbnRmKGJ1ZiwgIiVjIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICdBJyA6ICdQJyk7CgkgICAgICAgfSBlbHNlIGlmIChjb3VudCA9PSAyKSB7CgkJICAvKiBzcHJpbnRmKGJ1ZiwgIiVzIiwgKHh0aW1lLT53SG91ciA8IDEyKSA/ICJBTSIgOiAiUE0iKTsgKi8KCQkgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLAoJCQkJICAgKHh0aW1lLT53SG91cjwxMikgCgkJCQkgICA/IExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJCSAgIGJ1Ziwgc2l6ZW9mKGJ1ZikpOwoJICAgICAgIH0KCSAgICB9OwoKCSAgICAvKiB3ZSBuZWVkIHRvIGNoZWNrIHRoZSBuZXh0IGNoYXIgaW4gdGhlIGZvcm1hdCBzdHJpbmcgCgkgICAgICAgYWdhaW4sIG5vIG1hdHRlciB3aGF0IGhhcHBlbmVkICovCgkgICAgaW5wb3MtLTsKCSAgICAKCSAgICAvKiBhZGQgdGhlIGNvbnRlbnRzIG9mIGJ1ZiB0byB0aGUgb3V0cHV0ICovCgkgICAgYnVmbGVuID0gc3RybGVuKGJ1Zik7CgkgICAgaWYgKG91dHBvcyArIGJ1ZmxlbiA8IGRhdGVsZW4pIHsKCSAgICAgICBkYXRlW291dHBvc10gPSAnXDAnOyAvKiBmb3Igc3RyY2F0IHRvIGhvb2sgb250byAqLwoJCSBzdHJjYXQoZGF0ZSwgYnVmKTsKCSAgICAgICBvdXRwb3MgKz0gYnVmbGVuOwoJICAgIH0gZWxzZSB7CgkgICAgICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKCSAgICAgICBzdHJuY2F0KGRhdGUsIGJ1ZiwgZGF0ZWxlbiAtIG91dHBvcyk7CgkJIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKCQkgU2V0TGFzdEVycm9yKEVSUk9SX0lOU1VGRklDSUVOVF9CVUZGRVIpOwoJICAgICAgIFdBUk4ob2xlLCAiaW5zdWZmaWNpZW50IGJ1ZmZlclxuIik7CgkJIHJldHVybiAwOwoJICAgIH0KCgkgICAgLyogcmVzZXQgdGhlIHZhcmlhYmxlcyB3ZSB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhpcyBpdGVtICovCgkgICAgY291bnQgPSAwOwoJICAgIHR5cGUgPSAnXDAnOwoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAnXDAnKSB7CgkgICAgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGxvb3AtaGVhZCwgYmVjYXVzZQoJICAgICAgIHRoYXQgYnJlYWtzIHRoZSBwcmludGluZyBvZiB0aGUgbGFzdCBmb3JtYXQtaXRlbSAqLwoJICAgIGRhdGVbb3V0cG9zXSA9ICdcMCc7CgkgICAgYnJlYWs7CiAgICAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAgICAvKiBjb250aW51aW5nIGEgY29kZSBmb3IgYW4gaXRlbSAqLwoJICAgIGNvdW50ICs9MTsKCSAgICBjb250aW51ZTsKCSB9IGVsc2UgaWYgKHN0cmNocigiaEhtc3R5TWRnIiwgZm9ybWF0W2lucG9zXSkpIHsKCSAgICB0eXBlID0gZm9ybWF0W2lucG9zXTsKCSAgICBjb3VudCA9IDE7CgkgICAgY29udGludWU7CgkgfSBlbHNlIGlmIChmb3JtYXRbaW5wb3NdID09ICdcJycpIHsKCSAgICBpbnF1b3RlID0gMTsKCSAgICBjb250aW51ZTsKICAgICAgIH0gZWxzZSB7CgkgICAgZGF0ZVtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOwoJIH0KICAgICAgLyogbm93IGRlYWwgd2l0aCBhIHBvc3NpYmxlIGJ1ZmZlciBvdmVyZmxvdyAqLwogICAgICBpZiAob3V0cG9zID49IGRhdGVsZW4pIHsKICAgICAgIGRhdGVbZGF0ZWxlbiAtIDFdID0gJ1wwJzsKICAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgIHJldHVybiAwOwogICAgICB9CiAgIH0KICAgCiAgIGlmIChPdmVyZmxvdykgewogICAgICBTZXRMYXN0RXJyb3IoRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUik7CiAgIH07CgogICAvKiBmaW5pc2ggaXQgb2ZmIHdpdGggYSBzdHJpbmcgdGVybWluYXRvciAqLwogICBvdXRwb3MrKzsKICAgLyogc2FuaXR5IGNoZWNrICovCiAgIGlmIChvdXRwb3MgPiBkYXRlbGVuLTEpIG91dHBvcyA9IGRhdGVsZW4tMTsKICAgZGF0ZVtvdXRwb3NdID0gJ1wwJzsKICAgCiAgIFRSQUNFKG9sZSwgIk9MRV9HZXRGb3JtYXRBIHJldHVybnMgc3RyaW5nICclcycsIGxlbiAlZFxuIiwKCSAgICAgICBkYXRlLCBvdXRwb3MpOwogICByZXR1cm4gb3V0cG9zOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogT0xFX0dldEZvcm1hdFcgIFtpbnRlcm5hbF0gIAogKi8KSU5UMzIgV0lOQVBJIE9MRV9HZXRGb3JtYXRXKExDSUQgbG9jYWxlLCBEV09SRCBmbGFncywKCQkJICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgIExQQ1dTVFIgZm9ybWF0LAoJCQkgICAgTFBXU1RSIG91dHB1dCwgSU5UMzIgb3V0bGVuKQp7CiAgIElOVDMyICAgaW5wb3MsIG91dHBvczsKICAgaW50ICAgICBjb3VudCwgdHlwZT0wLCBpbnF1b3RlOwogICBpbnQgICAgIE92ZXJmbG93OyAvKiBsb29wIGNoZWNrICovCiAgIGludCB1c2VkYXRlLCB1c2V0aW1lOwogICBXQ0hBUiAgIGJ1Zls0MF07CiAgIGludCAgICAgYnVmbGVuPTA7CiAgIGNoYXIgICAgYWJ1Zls0MF07CiAgIFdDSEFSICAgYXJnMFtdID0gezB9LCBhcmcxW10gPSB7JyUnLCdkJywwfTsKICAgV0NIQVIgICBhcmcyW10gPSB7JyUnLCcwJywnMicsJ2QnLDB9OwogICBXQ0hBUiAgKmFyZ2FycltdID0ge2FyZzAsIGFyZzEsIGFyZzJ9OwogICBpbnQgICAgIGRhdGV2YXJzPTAsIHRpbWV2YXJzPTA7CgogICAvKiBtYWtlIGEgZGVidWcgcmVwb3J0ICovCiAgIGxzdHJjcHluV3RvQShhYnVmLCBmb3JtYXQsIHNpemVvZihmb3JtYXQpKTsKICAgVFJBQ0Uob2xlLCAiYXJnczogJThseCwgJThseCwgdGltZShkPSVkLGg9JWQsbT0lZCxzPSVkKSwgZm10OlwnJXNcJyAoYXQgJXApLCAlcCB3aXRoIG1heCBsZW4gJWRcbiIsCgkgbG9jYWxlLCBmbGFncywgCgkgeHRpbWUtPndEYXksIHh0aW1lLT53SG91ciwgeHRpbWUtPndNaW51dGUsIHh0aW1lLT53U2Vjb25kLAoJIGFidWYsIGZvcm1hdCwgb3V0cHV0LCBvdXRsZW4pOwogICAKCiAgIC8qIGluaXRpYWxpemUgc3RhdGUgdmFyaWFibGVzICovCiAgIGlucG9zID0gb3V0cG9zID0gMDsKICAgY291bnQgPSAwOwogICBpbnF1b3RlID0gT3ZlcmZsb3cgPSAwOwogICAvKiB0aGlzIGlzIHJlYWxseSBqdXN0IGEgc2FuaXR5IGNoZWNrICovCiAgIG91dHB1dFswXSA9IGJ1ZlswXSA9IDA7CiAgIGFidWZbMF0gPSAnXDAnOwogICAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9mZmljaWFsIFdpbmRvd3MgYmVoYXZpb3IgKi8KICAgdXNlZGF0ZSA9IGZsYWdzICYgREFURV9EQVRFVkFSU09OTFk7CiAgIHVzZXRpbWUgPSBmbGFncyAmIFRJTUVfVElNRVZBUlNPTkxZOwogICAKICAgLyogdGhpcyBsb29wIGlzIHRoZSBjb3JlIG9mIHRoZSBmdW5jdGlvbiAqLwogICBmb3IgKGlucG9zID0gMDsgLyogd2UgaGF2ZSBzZXZlcmFsIGJyZWFrIHBvaW50cyAqLyA7IGlucG9zKyspIHsKICAgICAgaWYgKGlucXVvdGUpIHsKCSBpZiAoZm9ybWF0W2lucG9zXSA9PSAoV0NIQVIpICdcJycpIHsKCSAgICBpZiAoZm9ybWF0W2lucG9zKzFdID09ICdcJycpIHsKCSAgICAgICBpbnBvcysrOwoJICAgICAgIG91dHB1dFtvdXRwb3MrK10gPSAnXCcnOwoJICAgIH0gZWxzZSB7CgkgICAgICAgaW5xdW90ZSA9IDA7CgkgICAgICAgY29udGludWU7CgkgICAgfQoJIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgICAgb3V0cHV0W291dHBvcysrXSA9IDA7CgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgT3ZlcmZsb3cgPSAxOwoJICAgIGJyZWFrOyAgLyogIG5vcm1hbCBleGl0ICh3aXRoaW4gYSBxdW90ZSkgKi8KCSB9IGVsc2UgewoJICAgIG91dHB1dFtvdXRwb3MrK10gPSBmb3JtYXRbaW5wb3NdOyAvKiBjb3B5IGlucHV0ICovCgkgICAgaWYgKG91dHBvcyA+IG91dGxlbikgewoJICAgICAgIE92ZXJmbG93ID0gMTsKCSAgICAgICBvdXRwdXRbb3V0cG9zLTFdID0gMDsgCgkgICAgICAgYnJlYWs7CgkgICAgfQoJIH0KICAgICAgfSBlbHNlIGlmICggIChjb3VudCAmJiAoZm9ybWF0W2lucG9zXSAhPSB0eXBlKSkKCQkgICB8fCAoIChjb3VudD09NCAmJiB0eXBlID09J3knKSB8fAoJCQkoY291bnQ9PTQgJiYgdHlwZSA9PSdNJykgfHwKCQkJKGNvdW50PT00ICYmIHR5cGUgPT0nZCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J2cnKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdoJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0nSCcpIHx8CgkJCShjb3VudD09MiAmJiB0eXBlID09J20nKSB8fAoJCQkoY291bnQ9PTIgJiYgdHlwZSA9PSdzJykgfHwKCQkJKGNvdW50PT0yICYmIHR5cGUgPT0ndCcpICkgICkgewoJIGlmICAgICAgICAodHlwZSA9PSAnZCcpIHsKCSAgICBpZiAgICAgICAgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwKCQkJICAgICBMT0NBTEVfU0RBWU5BTUUxICsgeHRpbWUtPndEYXlPZldlZWsgLTEsCgkJCSAgICAgYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIGlmIChjb3VudCA9PSAzKSB7CgkgICAgICAgR2V0TG9jYWxlSW5mbzMyVyhsb2NhbGUsCgkJCQlMT0NBTEVfU0FCQlJFVkRBWU5BTUUxICsKCQkJCXh0aW1lLT53RGF5T2ZXZWVrIC0xLAoJCQkJYnVmLCBzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d0RheSApOwoJICAgIH07CgkgfSBlbHNlIGlmICh0eXBlID09ICdNJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIEdldExvY2FsZUluZm8zMlcobG9jYWxlLCAgTE9DQUxFX1NNT05USE5BTUUxICsKCQkJCXh0aW1lLT53TW9udGggLTEsIGJ1ZiwKCQkJCXNpemVvZihidWYpL3NpemVvZihXQ0hBUikgKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgIExPQ0FMRV9TQUJCUkVWTU9OVEhOQU1FMSArCgkJCQl4dGltZS0+d01vbnRoIC0xLCBidWYsCgkJCQlzaXplb2YoYnVmKS9zaXplb2YoV0NIQVIpICk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA1LCBhcmdhcnJbY291bnRdLCB4dGltZS0+d01vbnRoKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICd5JykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gNCkgewoJICAgICAgIHdzbnByaW50ZjMyVyhidWYsIDYsIGFyZ2FyclsxXSAvKiAiJWQiICovLAoJCQkgeHRpbWUtPndZZWFyKTsKCSAgICB9IGVsc2UgaWYgKGNvdW50ID09IDMpIHsKCSAgICAgICBsc3RyY3B5bkF0b1coYnVmLCAieXl5IiwgNSk7CgkgICAgfSBlbHNlIHsKCSAgICAgICB3c25wcmludGYzMlcoYnVmLCA2LCBhcmdhcnJbY291bnRdLAoJCQkgICAgeHRpbWUtPndZZWFyICUgMTAwKTsKCSAgICB9CgkgfSBlbHNlIGlmICh0eXBlID09ICdnJykgewoJICAgIGlmICAgICAgICAoY291bnQgPT0gMikgewoJICAgICAgIEZJWE1FKG9sZSwgIkxPQ0FMRV9JQ0FMRU5EQVJUWVBFIHVuaW1wbGVtZW50ZWRcbiIpOwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJBRCIsIDUpOwoJICAgIH0gZWxzZSB7CgkgICAgICAgLyogV2luIEFQSSBzZXogd2UgY29weSBpdCB2ZXJiYXRpbSAqLwoJICAgICAgIGxzdHJjcHluQXRvVyhidWYsICJnIiwgNSk7CgkgICAgfQoJIH0gZWxzZSBpZiAodHlwZSA9PSAnaCcpIHsKCSAgICAvKiBob3VycyAxOjAwLTEyOjAwIC0tLSBpcyB0aGlzIHJpZ2h0PyAqLwoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgKHh0aW1lLT53SG91ci0xKSUxMiArMSk7CgkgfSBlbHNlIGlmICh0eXBlID09ICdIJykgewoJICAgIHdzbnByaW50ZjMyVyhidWYsIDUsIGFyZ2Fycltjb3VudF0sIAoJCQkgeHRpbWUtPndIb3VyKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ20nKSB7CgkgICAgd3NucHJpbnRmMzJXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwKCQkJIHh0aW1lLT53TWludXRlKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3MnKSB7CgkgICAgd3NucHJpbnRmMzJXKGJ1ZiwgNSwgYXJnYXJyW2NvdW50XSwKCQkJIHh0aW1lLT53U2Vjb25kKTsKCSB9IGVsc2UgaWYgKHR5cGUgPT0gJ3QnKSB7CgkgICAgR2V0TG9jYWxlSW5mbzMyVyhsb2NhbGUsICh4dGltZS0+d0hvdXIgPCAxMikgPwoJCQkgICAgIExPQ0FMRV9TMTE1OSA6IExPQ0FMRV9TMjM1OSwKCQkJICAgICBidWYsIHNpemVvZihidWYpICk7CgkgICAgaWYgICAgICAgIChjb3VudCA9PSAxKSB7CgkgICAgICAgYnVmWzFdID0gMDsKCSAgICB9Cn0KCgkgLyogbm8gbWF0dGVyIHdoYXQgaGFwcGVuZWQsICB3ZSBuZWVkIHRvIGNoZWNrIHRoaXMgbmV4dCAKCSAgICBjaGFyYWN0ZXIgdGhlIG5leHQgdGltZSB3ZSBsb29wIHRocm91Z2ggKi8KCSBpbnBvcy0tOwoKCSAvKiBjYXQgYnVmIG9udG8gdGhlIG91dHB1dCAqLwoJIG91dGxlbiA9IGxzdHJsZW4zMlcoYnVmKTsKCSBpZiAob3V0cG9zICsgYnVmbGVuIDwgb3V0bGVuKSB7CgkgICAgb3V0cHV0W291dHBvc10gPSAwOyAgLyogYSAiaG9vayIgZm9yIHN0cmNhdCAqLwoJICAgIGxzdHJjYXQzMlcob3V0cHV0LCBidWYpOwoJICAgIG91dHBvcyArPSBidWZsZW47CgkgfSBlbHNlIHsKCSAgICBvdXRwdXRbb3V0cG9zXSA9IDA7CgkgICAgbHN0cmNhdG4zMlcob3V0cHV0LCBidWYsIG91dGxlbiAtIG91dHBvcyk7CgkgICAgb3V0cHV0W291dGxlbiAtIDFdID0gMDsKCSAgICBPdmVyZmxvdyA9IDE7CgkgICAgYnJlYWs7IC8qIEFibm9ybWFsIGV4aXQgKi8KCSB9CgoJIC8qIHJlc2V0IHRoZSB2YXJpYWJsZXMgd2UgdXNlZCB0aGlzIHRpbWUgKi8KCSBjb3VudCA9IDA7CgkgdHlwZSA9ICdcMCc7CiAgICAgIH0gZWxzZSBpZiAoZm9ybWF0W2lucG9zXSA9PSAwKSB7CgkgLyogd2UgY2FuJ3QgY2hlY2sgZm9yIHRoaXMgYXQgdGhlIGJlZ2lubmluZywgIGJlY2F1c2UgdGhhdCAKCSB3b3VsZCBrZWVwIHVzIGZyb20gcHJpbnRpbmcgYSBmb3JtYXQgc3BlYyB0aGF0IGVuZGVkIHRoZSAKCSBzdHJpbmcgKi8KCSBvdXRwdXRbb3V0cG9zXSA9IDA7CgkgYnJlYWs7ICAvKiAgTk9STUFMIEVYSVQgICovCiAgICAgIH0gZWxzZSBpZiAoY291bnQpIHsKCSAvKiBob3cgd2Uga2VlcCB0cmFjayBvZiB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0IHNwZWMgKi8KCSBjb3VudCsrOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKCAoZGF0ZXZhcnMgJiYgKGZvcm1hdFtpbnBvc109PSdkJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J00nIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0neScgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdnJykgICkgfHwKCQkgICh0aW1ldmFycyAmJiAoZm9ybWF0W2lucG9zXT09J0gnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0naCcgfHwKCQkJCWZvcm1hdFtpbnBvc109PSdtJyB8fAoJCQkJZm9ybWF0W2lucG9zXT09J3MnIHx8CgkJCQlmb3JtYXRbaW5wb3NdPT0ndCcpICkgICAgKSB7CgkgdHlwZSA9IGZvcm1hdFtpbnBvc107CgkgY291bnQgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpbnBvc10gPT0gJ1wnJykgewoJIGlucXVvdGUgPSAxOwoJIGNvbnRpbnVlOwogICAgICB9IGVsc2UgewoJIC8qIHVucXVvdGVkIGxpdGVyYWxzICovCgkgb3V0cHV0W291dHBvcysrXSA9IGZvcm1hdFtpbnBvc107CiAgICAgIH0KICAgfQoKICAgaWYgKE92ZXJmbG93KSB7CiAgICAgIFNldExhc3RFcnJvcihFUlJPUl9JTlNVRkZJQ0lFTlRfQlVGRkVSKTsKICAgICAgV0FSTihvbGUsICIgYnVmZmVyIG92ZXJmbG93XG4iKTsKICAgfTsKCiAgIC8qIGZpbmFsIHN0cmluZyB0ZXJtaW5hdG9yIGFuZCBzYW5pdHkgY2hlY2sgKi8KICAgb3V0cG9zKys7CiAgIGlmIChvdXRwb3MgPiBvdXRsZW4tMSkgb3V0cG9zID0gb3V0bGVuLTE7CiAgIG91dHB1dFtvdXRwb3NdID0gJzAnOwoKICAgbHN0cmNweW5XdG9BKGFidWYsIG91dHB1dCwgc2l6ZW9mKGFidWYpICk7CiAgIFRSQUNFKG9sZSwgIiByZXR1cm5pbmcgc3RyaW5nIFwnJXNcJ1xuIiwgYWJ1Zik7CgkKICAgcmV0dXJuICghT3ZlcmZsb3cpID8gb3V0bGVuIDogMDsKICAgCn0KCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogIEdldERhdGVGb3JtYXQzMkEoKSBbS0VSTkVMMzIuMzEwXSBNYWtlcyBhbiBBU0NJSSBzdHJpbmcgb2YgdGhlIGRhdGUKICoKICogVGhpcyBmdW5jdGlvbiB1c2VzIGZvcm1hdCB0byBmb3JtYXQgdGhlIGRhdGUsICBvciwgIGlmIGZvcm1hdAogKiBpcyBOVUxMLCB1c2VzIHRoZSBkZWZhdWx0IGZvciB0aGUgbG9jYWxlLiAgZm9ybWF0IGlzIGEgc3RyaW5nCiAqIG9mIGxpdGVyYWwgZmllbGRzIGFuZCBjaGFyYWN0ZXJzIGFzIGZvbGxvd3M6CiAqCiAqIC0gZCAgICBzaW5nbGUtZGlnaXQgKG5vIGxlYWRpbmcgemVybykgZGF5IChvZiBtb250aCkKICogLSBkZCAgIHR3by1kaWdpdCBkYXkgKG9mIG1vbnRoKQogKiAtIGRkZCAgc2hvcnQgZGF5LW9mLXdlZWsgbmFtZQogKiAtIGRkZGQgbG9uZyBkYXktb2Ytd2VlayBuYW1lCiAqIC0gTSAgICBzaW5nbGUtZGlnaXQgbW9udGgKICogLSBNTSAgIHR3by1kaWdpdCBtb250aAogKiAtIE1NTSAgc2hvcnQgbW9udGggbmFtZQogKiAtIE1NTU0gZnVsbCBtb250aCBuYW1lCiAqIC0geSAgICB0d28tZGlnaXQgeWVhciwgbm8gbGVhZGluZyAwCiAqIC0geXkgICB0d28tZGlnaXQgeWVhcgogKiAtIHl5eXkgZm91ci1kaWdpdCB5ZWFyCiAqIC0gZ2cgICBlcmEgc3RyaW5nCiAqCiAqLwoKSU5UMzIgV0lOQVBJIEdldERhdGVGb3JtYXQzMkEoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDU1RSIGZvcm1hdCwgTFBTVFIgZGF0ZSxJTlQzMiBkYXRlbGVuKSAKewogICAKICBjaGFyIGZvcm1hdF9idWZbNDBdOwogIExQQ1NUUiB0aGlzZm9ybWF0OwogIFNZU1RFTVRJTUUgdDsKICBMUFNZU1RFTVRJTUUgdGhpc3RpbWU7CiAgTENJRCB0aGlzbG9jYWxlOwoKICBJTlQzMiByZXQ7CgogIFRSQUNFKG9sZSwiKDB4JTA0bHgsMHglMDhseCwlcCwlcywlcCwlZClcbiIsCgkgICAgICBsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LGRhdGUsZGF0ZWxlbik7CiAgCiAgaWYgKCFsb2NhbGUpIHsKICAgICBsb2NhbGUgPSBMT0NBTEVfU1lTVEVNX0RFRkFVTFQ7CiAgICAgfTsKICAKICBpZiAobG9jYWxlID09IExPQ0FMRV9TWVNURU1fREVGQVVMVCkgewogICAgIHRoaXNsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogIH0gZWxzZSBpZiAobG9jYWxlID09IExPQ0FMRV9VU0VSX0RFRkFVTFQpIHsKICAgICB0aGlzbG9jYWxlID0gR2V0VXNlckRlZmF1bHRMQ0lEKCk7CiAgfSBlbHNlIHsKICAgICB0aGlzbG9jYWxlID0gbG9jYWxlOwogICB9OwoKICBpZiAoeHRpbWUgPT0gTlVMTCkgewogICAgIEdldFN5c3RlbVRpbWUoJnQpOwogICAgIHRoaXN0aW1lID0gJnQ7CiAgfSBlbHNlIHsKICAgICB0aGlzdGltZSA9IHh0aW1lOwogIH07CgogIGlmIChmb3JtYXQgPT0gTlVMTCkgewogICAgIEdldExvY2FsZUluZm8zMkEodGhpc2xvY2FsZSwgKChmbGFncyZEQVRFX0xPTkdEQVRFKSAKCQkJCSAgID8gTE9DQUxFX1NMT05HREFURQoJCQkJICAgOiBMT0NBTEVfU1NIT1JUREFURSksCgkJICAgICAgZm9ybWF0X2J1Ziwgc2l6ZW9mKGZvcm1hdF9idWYpKTsKICAgICB0aGlzZm9ybWF0ID0gZm9ybWF0X2J1ZjsKICB9IGVsc2UgewogICAgIHRoaXNmb3JtYXQgPSBmb3JtYXQ7CiAgfTsKCiAgCiAgcmV0ID0gT0xFX0dldEZvcm1hdEEodGhpc2xvY2FsZSwgZmxhZ3MsIHRoaXN0aW1lLCB0aGlzZm9ybWF0LCAKCQkgICAgICAgZGF0ZSwgZGF0ZWxlbik7CiAgCgogICBUUkFDRShvbGUsIAoJICAgICAgICJHZXREYXRlRm9ybWF0MzJBKCkgcmV0dXJuaW5nICVkLCB3aXRoIGRhdGE9JXNcbiIsCgkgICAgICAgcmV0LCBkYXRlKTsKICByZXR1cm4gcmV0Owp9CgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIEdldERhdGVGb3JtYXQzMlcoKSBbS0VSTkVMMzIuMzExXSBNYWtlcyBhIFVuaWNvZGUgc3RyaW5nIG9mIHRoZSBkYXRlCiAqCiAqIEFjdHMgdGhlIHNhbWUgYXMgR2V0RGF0ZUZvcm1hdDMyQSgpLCAgZXhjZXB0IHRoYXQgaXQncyBVbmljb2RlLgogKiBBY2NlcHRzICYgcmV0dXJucyBzaXplcyBhcyBjb3VudHMgb2YgVW5pY29kZSBjaGFyYWN0ZXJzLgogKgogKi8KSU5UMzIgV0lOQVBJIEdldERhdGVGb3JtYXQzMlcoTENJRCBsb2NhbGUsRFdPUkQgZmxhZ3MsCgkJCSAgICAgIExQU1lTVEVNVElNRSB4dGltZSwKCQkJICAgICAgTFBDV1NUUiBmb3JtYXQsCgkJCSAgICAgIExQV1NUUiBkYXRlLCBJTlQzMiBkYXRlbGVuKQp7CiAgIHNob3J0IGRhdGVhcnJbXSA9IHsnMScsJzknLCc5JywnNCcsJy0nLCcxJywnLScsJzEnLDB9OwoKICAgRklYTUUob2xlLCAiU1RVQiAoc2hvdWxkIGNhbGwgT0xFX0dldEZvcm1hdFcpXG4iKTsgICAKICAgbHN0cmNweW4zMlcoZGF0ZSwgZGF0ZWFyciwgZGF0ZWxlbik7CiAgIHJldHVybiAoICBkYXRlbGVuIDwgOSkgPyBkYXRlbGVuIDogOTsKICAgCiAgIAp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICAgICAgICBHZXROdW1iZXJGb3JtYXQzMkEJKEtFUk5FTDMyLjM1NSkKICogTk9URTogdHlwZSBvZiBscEZvcm1hdCBzaG91bGQgYmUgQ09OU1QgTlVNQkVSRk9STUFUIAogKi8KSU5UMzIgV0lOQVBJIEdldE51bWJlckZvcm1hdDMyQShMQ0lEIGxvY2FsZSwgRFdPUkQgZHdmbGFncywKCQkJICAgICAgIExQQ1NUUiBscHZhbHVlLCAgY2hhciAqbHBGb3JtYXQsCgkJCSAgICAgICBMUFNUUiBscE51bWJlclN0ciwgaW50IGNjaE51bWJlcikKewogaW50IG47CgogRklYTUUoZmlsZSwiJXM6IHN0dWIsIG5vIHJlZm9ybWF0aW5nIGRvbmVcbiIsbHB2YWx1ZSk7CgogbiA9IHN0cmxlbihscHZhbHVlKTsKIGlmIChjY2hOdW1iZXIpIHsgCiAgIHN0cm5jcHkobHBOdW1iZXJTdHIsbHB2YWx1ZSxjY2hOdW1iZXIpOwogICBpZiAoY2NoTnVtYmVyIDw9IG4pIHsKICAgICBscE51bWJlclN0cltjY2hOdW1iZXItMV0gPSAwOwogICAgIG4gPSBjY2hOdW1iZXItMTsKICAgfQogfQogcmV0dXJuIG47Cn0KIAoKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBHZXRUaW1lRm9ybWF0MzJBKCkgW0tFUk5FTDMyLjQyMl0gTWFrZXMgYW4gQVNDSUkgc3RyaW5nIG9mIHRoZSB0aW1lCiAqCiAqIEZvcm1hdHMgZGF0ZSBhY2NvcmRpbmcgdG8gZm9ybWF0LCAgb3IgbG9jYWxlIGRlZmF1bHQgaWYgZm9ybWF0IGlzCiAqIE5VTEwuIFRoZSBmb3JtYXQgY29uc2lzdHMgb2YgbGl0ZXJhbCBjaGFyYWN0ZXJzIGFuZCBmaWVsZHMgYXMgZm9sbG93czoKICoKICogaCAgaG91cnMgd2l0aCBubyBsZWFkaW5nIHplcm8gKDEyLWhvdXIpCiAqIGhoIGhvdXJzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIEggIGhvdXJzIHdpdGggbm8gbGVhZGluZyB6ZXJvICgyNC1ob3VyKQogKiBISCBob3VycyB3aXRoIGZ1bGwgdHdvIGRpZ2l0cwogKiBtICBtaW51dGVzIHdpdGggbm8gbGVhZGluZyB6ZXJvCiAqIG1tIG1pbnV0ZXMgd2l0aCBmdWxsIHR3byBkaWdpdHMKICogcyAgc2Vjb25kcyB3aXRoIG5vIGxlYWRpbmcgemVybwogKiBzcyBzZWNvbmRzIHdpdGggZnVsbCB0d28gZGlnaXRzCiAqIHQgIHRpbWUgbWFya2VyIChBIG9yIFApCiAqIHR0IHRpbWUgbWFya2VyIChBTSwgUE0pCiAqCiAqLwoKSU5UMzIgV0lOQVBJIApHZXRUaW1lRm9ybWF0MzJBKExDSUQgbG9jYWxlLCAgICAgICAgLyogaW4gICovCgkJIERXT1JEIGZsYWdzLCAgICAgICAgLyogaW4gICovCgkJIExQU1lTVEVNVElNRSB4dGltZSwgLyogaW4gICovIAoJCSBMUENTVFIgZm9ybWF0LCAgICAgIC8qIGluICAqLwoJCSBMUFNUUiB0aW1lc3RyLCAgICAgIC8qIG91dCAqLwoJCSBJTlQzMiB0aW1lbGVuICAgICAgIC8qIGluICAqLykgCnsKICAgTFBDU1RSIHJlYWxmb3JtYXQ7CiAgIGNoYXIgZm10X2J1Zls0MF07CiAgIAogICBUUkFDRShvbGUsIkdldFRpbWVGb3JtYXQoMHglMDRseCwweCUwOGx4LCVwLCVzLCVwLCVkKVxuIiwKCSBsb2NhbGUsZmxhZ3MseHRpbWUsZm9ybWF0LHRpbWVzdHIsdGltZWxlbik7CiAgIAogICBpZiAoZm9ybWF0KSB7CiAgICAgIHJlYWxmb3JtYXQgPSBmb3JtYXQ7CiAgIH0gZWxzZSBpZiAobG9jYWxlKSB7CiAgICAgIEdldExvY2FsZUluZm8zMkEobG9jYWxlLCBMT0NBTEVfU1RJTUVGT1JNQVQsCgkJICAgICAgIGZtdF9idWYsICBzaXplb2YoZm10X2J1ZikpOwogICAgICByZWFsZm9ybWF0ID0gZm10X2J1ZjsKICAgfSBlbHNlIHsKICAgICAgV0FSTihvbGUsICJDYWxsZXIgZ2F2ZSBubyBsb2NhbGUgYW5kIG5vIGZvcm1hdFxuIik7CiAgICAgIHJlYWxmb3JtYXQgPSAiaGg6bW06c3MiOwogICB9OwogICBpZiAoIWxvY2FsZSkgewogICAgICBsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwogICB9CiAgIHJldHVybiBPTEVfR2V0Rm9ybWF0QShsb2NhbGUsIGZsYWdzLCB4dGltZSwgcmVhbGZvcm1hdCwgdGltZXN0ciwgdGltZWxlbik7Cn0KCgovKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICBHZXRUaW1lRm9ybWF0MzJXKCkgIFtLRVJORUwzMi40MjNdIE1ha2VzIGEgVW5pY29kZSBzdHJpbmcgb2YgdGhlIHRpbWUKICogCiAqCiAqLwoKSU5UMzIgV0lOQVBJIApHZXRUaW1lRm9ybWF0MzJXKExDSUQgbG9jYWxlLERXT1JEIGZsYWdzLAoJCQkgICAgICBMUFNZU1RFTVRJTUUgeHRpbWUsCgkJCSAgICAgIExQQ1dTVFIgZm9ybWF0LCAKCQkJICAgICAgTFBXU1RSIHRpbWVzdHIsSU5UMzIgdGltZWxlbikgCnsKICAgY2hhciBkZWJ1Z2J1Zls0MF07CiAgIFdDSEFSIGJ1ZlsyMF07CiAgIExQQ1dTVFIgcmVhbGZvcm1hdD0wOwogICBTWVNURU1USU1FIHQ7CiAgIExQU1lTVEVNVElNRSByZWFsdGltZTsKICAgV0NIQVIgKiBmbXRfYnVmID0gTlVMTDsKICAgaW50IGZtdF9idWZfc2l6ZSA9IDA7IC8qIHVuaXRzIG9mIFdDSEFScyAqLwogICBJTlQzMiByZXR2YWw7CiAgIAogICBsc3RyY3B5bld0b0EoZGVidWdidWYsIGZvcm1hdCwgKHNpemVvZihidWYpKS8yKTsKICAgVFJBQ0Uob2xlLCAiR2V0VGltZUZvcm1hdFcgbGVuICVkIGZsYWdzIDB4JWxYIGZvcm1hdCA+JXM8XG4iLAoJCXRpbWVsZW4sIGZsYWdzLCBkZWJ1Z2J1Zik7CgogICAvKiBFbmZvcmNlIHRoZSBXaW5kb3dzIGJlaGF2aW9yICovCiAgIGZsYWdzIHw9IH5MT0NBTEVfVElNRURBVEVCT1RIOwogICBmbGFncyB8PSBUSU1FX1RJTUVWQVJTT05MWTsKCiAgIC8qIHRha2UgY2FyZSBvZiB0aGUgZm9ybWF0IG9yIGxvY2FsZSBub3QgYmVpbmcgZ2l2ZW4gKi8KICAgaWYgKGZvcm1hdCkgewogICAgICByZWFsZm9ybWF0ID0gZm9ybWF0OwogICB9IGVsc2UgaWYgKGxvY2FsZSkgewogICAgICAvKiBhbGxvY2F0ZSBtZW1vcnkgKi8KICAgICAgcmV0dmFsID0gRVJST1JfSU5TVUZGSUNJRU5UX0JVRkZFUjsKICAgICAgZm10X2J1ZiA9IG1hbGxvYygoZm10X2J1Zl9zaXplKz03KSAqIHNpemVvZihXQ0hBUikpOwogICAgICBpZiAoIWZtdF9idWYpCglnb3RvIG91dF9ub21lbTsKCiAgICAgIHdoaWxlKCFHZXRMb2NhbGVJbmZvMzJXKGxvY2FsZSwgTE9DQUxFX1NUSU1FRk9STUFULAoJCQkgICAgICBmbXRfYnVmLCBmbXRfYnVmX3NpemUpKSB7CglyZXR2YWwgPSBFUlJPUl9PVVRPRk1FTU9SWTsKCWZtdF9idWYgPSByZWFsbG9jKGZtdF9idWYsIAoJCQkgICAoZm10X2J1Zl9zaXplICs9IDEwKSAqIHNpemVvZihXQ0hBUikpOwoJaWYgKCFmbXRfYnVmKQoJCWdvdG8gb3V0X25vbWVtOwogICAgICB9CiAgICAgIHJlYWxmb3JtYXQgPSBmbXRfYnVmOwogICB9IGVsc2UgewogICAgICBGSVhNRShvbGUsICAiY2FsbGVyIGdhdmUgbm8gbG9jYWxlLCAgbm8gZm9ybWF0OyAgd2hhdCBzaG91bGQgd2UgZG8/XG4iKTsKICAgICAgU2V0TGFzdEVycm9yKEVSUk9SX0JBRF9GT1JNQVQpOwogICB9CiAgIGlmICghbG9jYWxlKQogICAgICBsb2NhbGUgPSBHZXRTeXN0ZW1EZWZhdWx0TENJRCgpOwoKICAgcmVhbHRpbWUgPSB4dGltZTsKICAgaWYgKCFyZWFsdGltZSkgewogICAgICByZWFsdGltZSA9ICZ0OwogICAgICBHZXRTeXN0ZW1UaW1lKHJlYWx0aW1lKTsKICAgfQoKICAgcmV0dmFsID0gT0xFX0dldEZvcm1hdFcobG9jYWxlLCBmbGFncywgcmVhbHRpbWUsIHJlYWxmb3JtYXQsIHRpbWVzdHIsICB0aW1lbGVuKTsKICAgaWYgKGZtdF9idWYpCglmcmVlKGZtdF9idWYpOwogICByZXR1cm4gcmV0dmFsOwoKb3V0X25vbWVtOgoJU2V0TGFzdEVycm9yKHJldHZhbCk7CglXQVJOKG9sZSwgImNvdWxkIG5vdCBhbGxvY2F0ZSAlZCBjaGFycyBvZiBtZW1vcnlcbiIsIGZtdF9idWZfc2l6ZSk7IAoJcmV0dXJuIDA7Cn0K