LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxwcmVjb21wLmg+CiNpbmNsdWRlIDxzMl9sdWlkbC9jeF9pZGxjby5oeHg+CgoKLy8gTk9UIEZVTExZIERFQ0xBUkVEIFNFUlZJQ0VTCiNpbmNsdWRlIDxzMl9sdWlkbC9jeF9zdWIuaHh4PgojaW5jbHVkZSA8czJfZHNhcGkvY3hfZHNhcGkuaHh4PgojaW5jbHVkZSA8dG9vbHMvdGtwY2hhcnMuaHh4PgojaW5jbHVkZSA8dG9rZW5zL3RrcHN0YW0yLmh4eD4KI2luY2x1ZGUgPHMyX2x1aWRsL3RrX2lkZW50Lmh4eD4KI2luY2x1ZGUgPHMyX2x1aWRsL3RrX2tleXcuaHh4PgojaW5jbHVkZSA8czJfbHVpZGwvdGtfcHVuY3QuaHh4PgojaW5jbHVkZSA8czJfbHVpZGwvdG9rcmVjdi5oeHg+CiNpbmNsdWRlIDx4X3BhcnNlMi5oeHg+CgoKbmFtZXNwYWNlIGNzaQp7Cm5hbWVzcGFjZSB1aWRsCnsKCgpjb25zdCBpbnR0IENfbkNwcEluaXRpYWxOck9mU3RhdGkgPSA0MDA7CmNvbnN0IGludHQgQ19uU3RhdHVzU2l6ZSA9IDEyODsKCgoKY29uc3QgdWludHQgbkZfZmluX0Vycm9yID0gMTsKY29uc3QgdWludHQgbkZfZmluX0lnbm9yZSA9IDI7CmNvbnN0IHVpbnR0IG5GX2Zpbl9JZGVudGlmaWVyID0gMzsKY29uc3QgdWludHQgbkZfZmluX0tleXdvcmQgPSA0Owpjb25zdCB1aW50dCBuRl9maW5fUHVuY3R1YXRpb24gPSA1Owpjb25zdCB1aW50dCBuRl9maW5fRU9MID0gNjsKY29uc3QgdWludHQgbkZfZmluX0VPRiA9IDc7Cgpjb25zdCB1aW50dCBuRl9nb3RvX01MRG9jdSA9IDEwOwpjb25zdCB1aW50dCBuRl9nb3RvX1NMRG9jdSA9IDExOwpjb25zdCB1aW50dCBuRl9nb3RvX01MQ29tbWVudCA9IDEyOwpjb25zdCB1aW50dCBuRl9nb3RvX1NMQ29tbWVudCA9IDEzOwpjb25zdCB1aW50dCBuRl9nb3RvX1ByYWVwcm9jZXNzb3IgPSAxNDsKY29uc3QgdWludHQgbkZfZ290b19Bc3NpZ25tZW50ID0gMTU7CgoKCmNvbnN0IFVJTlQxNiBuVG9rX2J0eV9hbnkgPSAxMDAgKyBUb2tCdWlsdEluVHlwZTo6YnR5X2FueTsKY29uc3QgVUlOVDE2IG5Ub2tfYnR5X2Jvb2xlYW4gPSAxMDAgKyBUb2tCdWlsdEluVHlwZTo6YnR5X2Jvb2xlYW47CmNvbnN0IFVJTlQxNiBuVG9rX2J0eV9ieXRlID0gMTAwICsgVG9rQnVpbHRJblR5cGU6OmJ0eV9ieXRlOwpjb25zdCBVSU5UMTYgblRva19idHlfY2hhciA9IDEwMCArIFRva0J1aWx0SW5UeXBlOjpidHlfY2hhcjsKY29uc3QgVUlOVDE2IG5Ub2tfYnR5X2RvdWJsZSA9IDEwMCArIFRva0J1aWx0SW5UeXBlOjpidHlfZG91YmxlOwpjb25zdCBVSU5UMTYgblRva19idHlfaHlwZXIgPSAxMDAgKyBUb2tCdWlsdEluVHlwZTo6YnR5X2h5cGVyOwpjb25zdCBVSU5UMTYgblRva19idHlfbG9uZyA9IDEwMCArIFRva0J1aWx0SW5UeXBlOjpidHlfbG9uZzsKY29uc3QgVUlOVDE2IG5Ub2tfYnR5X3Nob3J0ID0gMTAwICsgVG9rQnVpbHRJblR5cGU6OmJ0eV9zaG9ydDsKY29uc3QgVUlOVDE2IG5Ub2tfYnR5X3N0cmluZyA9IDEwMCArIFRva0J1aWx0SW5UeXBlOjpidHlfc3RyaW5nOwpjb25zdCBVSU5UMTYgblRva19idHlfdm9pZCA9IDEwMCArIFRva0J1aWx0SW5UeXBlOjpidHlfdm9pZDsKY29uc3QgVUlOVDE2IG5Ub2tfYnR5X2VsbGlwc2UgPSAxMDAgKyBUb2tCdWlsdEluVHlwZTo6YnR5X2VsbGlwc2U7Cgpjb25zdCBVSU5UMTYgblRva190bW9kX3Vuc2lnbmVkID0gMjAwICsgVG9rVHlwZU1vZGlmaWVyOjp0bW9kX3Vuc2lnbmVkOwpjb25zdCBVSU5UMTYgblRva190bW9kX3NlcXVlbmNlID0gMjAwICsgVG9rVHlwZU1vZGlmaWVyOjp0bW9kX3NlcXVlbmNlOwoKY29uc3QgVUlOVDE2IG5Ub2tfcGhfaW4gPSAyNTAgKyBUb2tQYXJhbWV0ZXJIYW5kbGluZzo6cGhfaW47CmNvbnN0IFVJTlQxNiBuVG9rX3BoX291dCA9IDI1MCArIFRva1BhcmFtZXRlckhhbmRsaW5nOjpwaF9vdXQ7CmNvbnN0IFVJTlQxNiBuVG9rX3BoX2lub3V0ID0gMjUwICsgVG9rUGFyYW1ldGVySGFuZGxpbmc6OnBoX2lub3V0OwoKY29uc3QgVUlOVDE2IG5Ub2tfbXRfYXR0cmlidXRlID0gMzAwICsgVG9rTWV0YVR5cGU6Om10X2F0dHJpYnV0ZTsKY29uc3QgVUlOVDE2IG5Ub2tfbXRfY29uc3RhbnRzID0gMzAwICsgVG9rTWV0YVR5cGU6Om10X2NvbnN0YW50czsKY29uc3QgVUlOVDE2IG5Ub2tfbXRfZW51bSA9IDMwMCArIFRva01ldGFUeXBlOjptdF9lbnVtOwpjb25zdCBVSU5UMTYgblRva19tdF9leGNlcHRpb24gPSAzMDAgKyBUb2tNZXRhVHlwZTo6bXRfZXhjZXB0aW9uOwpjb25zdCBVSU5UMTYgblRva19tdF9pZGVudCA9IDMwMCArIFRva01ldGFUeXBlOjptdF9pZGVudDsKY29uc3QgVUlOVDE2IG5Ub2tfbXRfaW50ZXJmYWNlID0gMzAwICsgVG9rTWV0YVR5cGU6Om10X2ludGVyZmFjZTsKY29uc3QgVUlOVDE2IG5Ub2tfbXRfbW9kdWxlID0gMzAwICsgVG9rTWV0YVR5cGU6Om10X21vZHVsZTsKY29uc3QgVUlOVDE2IG5Ub2tfbXRfcHJvcGVydHkgPSAzMDAgKyBUb2tNZXRhVHlwZTo6bXRfcHJvcGVydHk7CmNvbnN0IFVJTlQxNiBuVG9rX210X3NlcnZpY2UgPSAzMDAgKyBUb2tNZXRhVHlwZTo6bXRfc2VydmljZTsKY29uc3QgVUlOVDE2IG5Ub2tfbXRfc2luZ2xldG9uID0gMzAwICsgVG9rTWV0YVR5cGU6Om10X3NpbmdsZXRvbjsKY29uc3QgVUlOVDE2IG5Ub2tfbXRfc3RydWN0ID0gMzAwICsgVG9rTWV0YVR5cGU6Om10X3N0cnVjdDsKY29uc3QgVUlOVDE2IG5Ub2tfbXRfdHlwZWRlZiA9IDMwMCArIFRva01ldGFUeXBlOjptdF90eXBlZGVmOwpjb25zdCBVSU5UMTYgblRva19tdF91aWsgPSAzMDAgKyBUb2tNZXRhVHlwZTo6bXRfdWlrOwoKY29uc3QgVUlOVDE2IG5Ub2tfc3RlX2JvdW5kID0gNDAwICsgVG9rU3RlcmVvdHlwZTo6c3RlX2JvdW5kOwpjb25zdCBVSU5UMTYgblRva19zdGVfY29uc3RyYWluZWQgPSA0MDAgKyBUb2tTdGVyZW90eXBlOjpzdGVfY29uc3RyYWluZWQ7CmNvbnN0IFVJTlQxNiBuVG9rX3N0ZV9jb25zdCA9IDQwMCArIFRva1N0ZXJlb3R5cGU6OnN0ZV9jb25zdDsKY29uc3QgVUlOVDE2IG5Ub2tfc3RlX21heWJlYW1iaWd1b3VzID0gNDAwICsgVG9rU3RlcmVvdHlwZTo6c3RlX21heWJlYW1iaWd1b3VzOwpjb25zdCBVSU5UMTYgblRva19zdGVfbWF5YmVkZWZhdWx0ID0gNDAwICsgVG9rU3RlcmVvdHlwZTo6c3RlX21heWJlZGVmYXVsdDsKY29uc3QgVUlOVDE2IG5Ub2tfc3RlX21heWJldm9pZCA9IDQwMCArIFRva1N0ZXJlb3R5cGU6OnN0ZV9tYXliZXZvaWQ7CmNvbnN0IFVJTlQxNiBuVG9rX3N0ZV9vbmV3YXkgPSA0MDAgKyBUb2tTdGVyZW90eXBlOjpzdGVfb25ld2F5Owpjb25zdCBVSU5UMTYgblRva19zdGVfb3B0aW9uYWwgPSA0MDAgKyBUb2tTdGVyZW90eXBlOjpzdGVfb3B0aW9uYWw7CmNvbnN0IFVJTlQxNiBuVG9rX3N0ZV9yZWFkb25seSA9IDQwMCArIFRva1N0ZXJlb3R5cGU6OnN0ZV9yZWFkb25seTsKY29uc3QgVUlOVDE2IG5Ub2tfc3RlX3JlbW92YWJsZSA9IDQwMCArIFRva1N0ZXJlb3R5cGU6OnN0ZV9yZW1vdmFibGU7CmNvbnN0IFVJTlQxNiBuVG9rX3N0ZV92aXJ0dWFsID0gNDAwICsgVG9rU3RlcmVvdHlwZTo6c3RlX3ZpcnR1YWw7CmNvbnN0IFVJTlQxNiBuVG9rX3N0ZV90cmFuc2llbnQgPSA0MDAgKyBUb2tTdGVyZW90eXBlOjpzdGVfdHJhbnNpZW50Owpjb25zdCBVSU5UMTYgblRva19zdGVfcHVibGlzaGVkID0gNDAwICsgVG9rU3RlcmVvdHlwZTo6c3RlX3B1Ymxpc2hlZDsKCmNvbnN0IFVJTlQxNiBuVG9rX3JhaXNlcyA9IDUwMTsKY29uc3QgVUlOVDE2IG5Ub2tfbmVlZHMgPSA1MDI7CmNvbnN0IFVJTlQxNiBuVG9rX29ic2VydmVzID0gNTAzOwoKY29uc3QgVUlOVDE2IG5Ub2tfYXNzaWdubWVudCA9IDU1MDsKCmNvbnN0IFVJTlQxNiBuVG9rX2lnbm9yZSA9IDYwMDsKY29uc3QgVUlOVDE2IG5Ub2tfbm9uZV9NTENvbW1lbnRCZWdpbiA9IDYwMTsKY29uc3QgVUlOVDE2IG5Ub2tfbm9uZV9TTENvbW1lbnRCZWdpbiA9IDYwMjsKY29uc3QgVUlOVDE2IG5Ub2tfbm9uZV9NTERvY3VCZWdpbiA9IDYwMzsKY29uc3QgVUlOVDE2IG5Ub2tfbm9uZV9TTERvY3VCZWdpbiA9IDYwNDsKY29uc3QgVUlOVDE2IG5Ub2tfbm9uZV9QcmFlcHJvY2Vzc29yQmVnaW4gPSA2MDU7CgoKY29uc3QgVUlOVDE2IG5Ub2tfcHVuY3RfQnJhY2tldE9wZW4gPSA3MDAgKyBUb2tQdW5jdHVhdGlvbjo6QnJhY2tldE9wZW47CmNvbnN0IFVJTlQxNiBuVG9rX3B1bmN0X0JyYWNrZXRDbG9zZSA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpCcmFja2V0Q2xvc2U7CmNvbnN0IFVJTlQxNiBuVG9rX3B1bmN0X0FycmF5QnJhY2tldE9wZW4gPSA3MDAgKyBUb2tQdW5jdHVhdGlvbjo6QXJyYXlCcmFja2V0T3BlbjsKY29uc3QgVUlOVDE2IG5Ub2tfcHVuY3RfQXJyYXlCcmFja2V0Q2xvc2UgPSA3MDAgKyBUb2tQdW5jdHVhdGlvbjo6QXJyYXlCcmFja2V0Q2xvc2U7CmNvbnN0IFVJTlQxNiBuVG9rX3B1bmN0X0N1cmxlZEJyYWNrZXRPcGVuID0gNzAwICsgVG9rUHVuY3R1YXRpb246OkN1cmxlZEJyYWNrZXRPcGVuOwpjb25zdCBVSU5UMTYgblRva19wdW5jdF9DdXJsZWRCcmFja2V0Q2xvc2UgPSA3MDAgKyBUb2tQdW5jdHVhdGlvbjo6Q3VybGVkQnJhY2tldENsb3NlOwpjb25zdCBVSU5UMTYgblRva19wdW5jdF9TZW1pY29sb24gPSA3MDAgKyBUb2tQdW5jdHVhdGlvbjo6U2VtaWNvbG9uOwpjb25zdCBVSU5UMTYgblRva19wdW5jdF9Db2xvbiA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpDb2xvbjsKY29uc3QgVUlOVDE2IG5Ub2tfcHVuY3RfRG91YmxlQ29sb24gPSA3MDAgKyBUb2tQdW5jdHVhdGlvbjo6RG91YmxlQ29sb247CmNvbnN0IFVJTlQxNiBuVG9rX3B1bmN0X0NvbW1hID0gNzAwICsgVG9rUHVuY3R1YXRpb246OkNvbW1hOwpjb25zdCBVSU5UMTYgblRva19wdW5jdF9NaW51cyA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpNaW51czsKY29uc3QgVUlOVDE2IG5Ub2tfcHVuY3RfRnVsbHN0b3AgPSA3MDAgKyBUb2tQdW5jdHVhdGlvbjo6RnVsbHN0b3A7CmNvbnN0IFVJTlQxNiBuVG9rX3B1bmN0X0xlc3NlciA9IDcwMCArIFRva1B1bmN0dWF0aW9uOjpMZXNzZXI7CmNvbnN0IFVJTlQxNiBuVG9rX3B1bmN0X0dyZWF0ZXIgPSA3MDAgKyBUb2tQdW5jdHVhdGlvbjo6R3JlYXRlcjsKCmNvbnN0IFVJTlQxNiBuVG9rX0VPTCA9IDgwMTsKY29uc3QgVUlOVDE2IG5Ub2tfRU9GID0gODAyOwoKCgpDb250ZXh0X1VpZGxDb2RlOjpDb250ZXh0X1VpZGxDb2RlKCBUb2tlbl9SZWNlaXZlciAmCSBvX3JSZWNlaXZlciwKCQkJCQkJCQkJRFlOIFRrcERvY3VDb250ZXh0ICYgbGV0X2RyQ29udGV4dF9Eb2N1ICkKCToJYVN0YXRlTWFjaGluZShDX25TdGF0dXNTaXplLENfbkNwcEluaXRpYWxOck9mU3RhdGkpLAoJCXBSZWNlaXZlcigmb19yUmVjZWl2ZXIpLAoJCXBEb2N1Q29udGV4dCgmbGV0X2RyQ29udGV4dF9Eb2N1KSwKCQlkcENvbnRleHRfTUxDb21tZW50KDApLAoJCWRwQ29udGV4dF9TTENvbW1lbnQoMCksCgkJZHBDb250ZXh0X1ByZXByb2Nlc3NvcigwKSwKCQlkcENvbnRleHRfQXNzaWdubWVudCgwKSwKCQlwTmV3VG9rZW4oMCksCgkJcEZvbGxvd1VwQ29udGV4dCgwKQp7CglkcENvbnRleHRfTUxDb21tZW50ID0gbmV3IENvbnRleHRfTUxDb21tZW50KG9fclJlY2VpdmVyLCp0aGlzKSwKCWRwQ29udGV4dF9TTENvbW1lbnQgPSBuZXcgQ29udGV4dF9TTENvbW1lbnQob19yUmVjZWl2ZXIsKnRoaXMpLAoJZHBDb250ZXh0X1ByZXByb2Nlc3NvciA9IG5ldyBDb250ZXh0X1ByYWVwcm9jZXNzb3Iob19yUmVjZWl2ZXIsKnRoaXMpLAoJZHBDb250ZXh0X0Fzc2lnbm1lbnQgPSBuZXcgQ29udGV4dF9Bc3NpZ25tZW50KG9fclJlY2VpdmVyLCp0aGlzKSwKCglwRG9jdUNvbnRleHQtPlNldFBhcmVudENvbnRleHQoKnRoaXMsIiovIik7CglTZXR1cFN0YXRlTWFjaGluZSgpOwp9CgpDb250ZXh0X1VpZGxDb2RlOjp+Q29udGV4dF9VaWRsQ29kZSgpCnsKfQoKdm9pZApDb250ZXh0X1VpZGxDb2RlOjpSZWFkQ2hhckNoYWluKCBDaGFyYWN0ZXJTb3VyY2UgJiBpb19yVGV4dCApCnsKCXBOZXdUb2tlbiA9IDA7CgoJVUlOVDE2IG5Ub2tlbklkID0gMDsKCVN0bUJvdW5kc1N0YXR1MiAmIHJCb3VuZCA9IGFTdGF0ZU1hY2hpbmUuR2V0Q2hhckNoYWluKG5Ub2tlbklkLCBpb19yVGV4dCk7CgoJLy8gISEhCgkvLyAJIFRoZSBvcmRlciBvZiB0aGUgbmV4dCB0d28gbGluZXMgaXMgZXNzZW50aWFsLCBiZWNhdXNlCgkvLyAgIHBGb2xsb3dVcENvbnRleHQgbWF5IGJlIGNoYW5nZWQgYnkgUGVyZm9ybVN0YXR1c0Z1bmN0aW9uKCkgYWxzbywKCS8vICAgd2hpY2ggdGhlbiBNVVNUIG92ZXJyaWRlIHRoZSBwcmV2aW91cyBhc3NpZ25tZW50LgoJcEZvbGxvd1VwQ29udGV4dCA9IHJCb3VuZC5Gb2xsb3dVcENvbnRleHQoKTsKCVBlcmZvcm1TdGF0dXNGdW5jdGlvbihyQm91bmQuU3RhdHVzRnVuY3Rpb25OcigpLCBuVG9rZW5JZCwgaW9fclRleHQpOwp9Cgpib29sCkNvbnRleHRfVWlkbENvZGU6OlBhc3NOZXdUb2tlbigpCnsKCWlmIChwTmV3VG9rZW4pCgl7CgkJcFJlY2VpdmVyLT5SZWNlaXZlKCpwTmV3VG9rZW4uUmVsZWFzZSgpKTsKCQlyZXR1cm4gdHJ1ZTsKCX0KCXJldHVybiBmYWxzZTsKfQoKVGtwQ29udGV4dCAmCkNvbnRleHRfVWlkbENvZGU6OkZvbGxvd1VwQ29udGV4dCgpCnsKCWNzdl9hc3NlcnQocEZvbGxvd1VwQ29udGV4dCAhPSAwKTsKCXJldHVybiAqcEZvbGxvd1VwQ29udGV4dDsKfQoKdm9pZApDb250ZXh0X1VpZGxDb2RlOjpQZXJmb3JtU3RhdHVzRnVuY3Rpb24oIHVpbnR0CQkJCWlfblN0YXR1c1NpZ25hbCwKCQkJCQkJCQkJCSBVSU5UMTYgCSAgICAgIAlpX25Ub2tlbklkLAoJCQkJCQkJCQkJIENoYXJhY3RlclNvdXJjZSAmCWlvX3JUZXh0ICkKewoJc3dpdGNoIChpX25TdGF0dXNTaWduYWwpCgl7CgkJY2FzZSBuRl9maW5fRXJyb3I6CgkJCS8vIEtPUlJfRlVUVVJFCgkJCXRocm93IFhfQXV0b2RvY1BhcnNlcihYX0F1dG9kb2NQYXJzZXI6OnhfSW52YWxpZENoYXIpOwoJCQkvLyBubyBicmVhaywgYmVjYXVzZSBvZiB0aHJvdwoJCWNhc2UgbkZfZmluX0lnbm9yZToKCQkJcE5ld1Rva2VuID0gMDsKCQkJaW9fclRleHQuQ3V0VG9rZW4oKTsKCQkJYnJlYWs7CgkJY2FzZSBuRl9maW5fSWRlbnRpZmllcjoKCQkJcE5ld1Rva2VuID0gbmV3IFRva0lkZW50aWZpZXIoaW9fclRleHQuQ3V0VG9rZW4oKSk7CgkJCWJyZWFrOwoJCWNhc2UgbkZfZmluX0tleXdvcmQ6CgkJCWlvX3JUZXh0LkN1dFRva2VuKCk7CgkJCXN3aXRjaCAoIGlfblRva2VuSWQgLyA1MCApCgkJCXsKCQkJCWNhc2UgMjoKCQkJCQlwTmV3VG9rZW4gPSBuZXcgVG9rQnVpbHRJblR5cGUoaV9uVG9rZW5JZCAtIDEwMCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDQ6CgkJCQkJcE5ld1Rva2VuID0gbmV3IFRva1R5cGVNb2RpZmllcihpX25Ub2tlbklkIC0gMjAwKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgNToKCQkJCQlwTmV3VG9rZW4gPSBuZXcgVG9rUGFyYW1ldGVySGFuZGxpbmcoaV9uVG9rZW5JZCAtIDI1MCk7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDY6CgkJCQkJcE5ld1Rva2VuID0gbmV3IFRva01ldGFUeXBlKGlfblRva2VuSWQgLSAzMDApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSA4OgoJCQkJCXBOZXdUb2tlbiA9IG5ldyBUb2tTdGVyZW90eXBlKGlfblRva2VuSWQgLSA0MDApOwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAxMDoKCQkJCQlzd2l0Y2ggKGlfblRva2VuSWQtNTAwKQoJCQkJCXsKCQkJCQkJY2FzZSAxOgoJCQkJCQkJcE5ld1Rva2VuID0gbmV3IFRva1JhaXNlczsKCQkJCQkJCWJyZWFrOwoJCQkJCQljYXNlIDI6CgkJCQkJCQlwTmV3VG9rZW4gPSBuZXcgVG9rTmVlZHM7CgkJCQkJCQlicmVhazsKCQkJCQkJY2FzZSAzOgoJCQkJCQkJcE5ld1Rva2VuID0gbmV3IFRva09ic2VydmVzOwoJCQkJCQkJYnJlYWs7CgkJCQkJCWRlZmF1bHQ6CgkJCQkJCQljc3ZfYXNzZXJ0KGZhbHNlKTsKCQkJCQl9CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCWNzdl9hc3NlcnQoZmFsc2UpOwoJCQl9CS8vIGVuZCBzd2l0Y2ggKCBpX25Ub2tlbklkIC8gNTAgKQoJCQlicmVhazsKCQljYXNlIG5GX2Zpbl9QdW5jdHVhdGlvbjoKCQkJaW9fclRleHQuQ3V0VG9rZW4oKTsKCQkJaWYgKGlfblRva2VuSWQgPT0gblRva19wdW5jdF9Eb3VibGVDb2xvbikKCQkJCXBOZXdUb2tlbiA9IG5ldyBUb2tOYW1lU2VwYXJhdG9yOwoJCQllbHNlCgkJCQlwTmV3VG9rZW4gPSBuZXcgVG9rUHVuY3R1YXRpb24oaV9uVG9rZW5JZCAtIDcwMCk7CgkJCWJyZWFrOwoJCWNhc2UgbkZfZmluX0VPTDoKCQkJaW9fclRleHQuQ3V0VG9rZW4oKTsKCQkJcE5ld1Rva2VuID0gbmV3IFRva19FT0w7CgkJCXBSZWNlaXZlci0+SW5jcmVtZW50X0N1ckxpbmUoKTsKCQkJYnJlYWs7CgkJY2FzZSBuRl9maW5fRU9GOgoJCQlwTmV3VG9rZW4gPSBuZXcgVG9rX0VPRjsKCQkJYnJlYWs7CgkJY2FzZSBuRl9nb3RvX01MRG9jdToKCQkJd2hpbGUgKCBpb19yVGV4dC5DdXJDaGFyKCkgPT0gJyonKQoJCQkJaW9fclRleHQuTW92ZU9uKCk7CgkJCWlvX3JUZXh0LkN1dFRva2VuKCk7CgkJCXBEb2N1Q29udGV4dC0+U2V0TW9kZV9Jc011bHRpTGluZSh0cnVlKTsKCQkJYnJlYWs7CgkJY2FzZSBuRl9nb3RvX1NMRG9jdToKCQkJaW9fclRleHQuQ3V0VG9rZW4oKTsKCQkJcERvY3VDb250ZXh0LT5TZXRNb2RlX0lzTXVsdGlMaW5lKGZhbHNlKTsKCQkJYnJlYWs7CgkJY2FzZSBuRl9nb3RvX01MQ29tbWVudDoKCQkJYnJlYWs7CgkJY2FzZSBuRl9nb3RvX1NMQ29tbWVudDoKCQkJYnJlYWs7CgkJY2FzZSBuRl9nb3RvX1ByYWVwcm9jZXNzb3I6CgkJCWJyZWFrOwoJCWNhc2UgbkZfZ290b19Bc3NpZ25tZW50OgoJCQlicmVhazsKCQlkZWZhdWx0OgoJCQljc3ZfYXNzZXJ0KGZhbHNlKTsKCX0JLy8gZW5kIHN3aXRjaCAoaV9uU3RhdHVzU2lnbmFsKQp9Cgp2b2lkCkNvbnRleHRfVWlkbENvZGU6OlNldHVwU3RhdGVNYWNoaW5lKCkKewoJLy8gQmVzb25kZXJlIEFycmF5LVN0YXRpIChrZWluIFRva2VuYWJzY2hsdXNzIG9kZXIgS29udGV4dHdlY2hzZWwpOgovLwljb25zdCBJTlQxNgl0b3AgPSAwOwkJLy8gVG9wLVN0YXR1cwoJY29uc3QgSU5UMTYJd2h0ID0gMTsJCS8vIFdoaXRlc3BhY2Ut/GJlcmxlc2UtU3RhdHVzCgljb25zdCBJTlQxNgliZXogPSAyOyAgICAgICAgLy8gQmV6ZWljaG5lci1sZXNlLVN0YXR1cwoKCS8vIFRva2VuZmluaXNoLVN0YXRpOgoJY29uc3QgSU5UMTYJZmluRXJyID0gMzsKCWNvbnN0IElOVDE2IGZpbklnbiA9IDQ7Cgljb25zdCBJTlQxNiBmaW5CZXogPSA1OwoJY29uc3QgSU5UMTYgZmluS2V5dyA9IDY7Cgljb25zdCBJTlQxNiBmaW5QdW5jdCA9IDc7Cgljb25zdCBJTlQxNiBmaW5FT0wgPSA4OwoJY29uc3QgSU5UMTYgZmluRU9GID0gOTsKCgkvLyBLb250ZXh0d2VjaHNlbC1TdGF0aToKCWNvbnN0IElOVDE2CWdvdG9NbGQgPSAxMDsKCWNvbnN0IElOVDE2CWdvdG9TbGQgPSAxMTsKCWNvbnN0IElOVDE2CWdvdG9NbGMgPSAxMjsKCWNvbnN0IElOVDE2CWdvdG9TbGMgPSAxMzsKCWNvbnN0IElOVDE2IGdvdG9QcnAgPSAxNDsKCWNvbnN0IElOVDE2CWdvdG9Bc2cgPSAxNTsKCgkvLyBLb25zdGFudGVuIHp1ciBCZW51dHp1bmcgaW4gZGVyIFRhYmVsbGU6Cgljb25zdCBJTlQxNiBlcnIgPSBmaW5FcnI7Cgljb25zdCBJTlQxNiBmYnogPSBmaW5CZXo7Cgljb25zdCBJTlQxNiBmaWcgPSBmaW5JZ247Cgljb25zdCBJTlQxNiBmb2YgPSBmaW5FT0Y7Ci8vCWNvbnN0IElOVDE2IGZrdyA9IGZpbktleXc7Ci8vCWNvbnN0IElOVDE2IGZwYyA9IGZpblB1bmN0OwoKCS8vLyBEaWUgJzAnZW4gd2VyZGVuIHNwYWV0ZXIgZHVyY2ggQWRkVG9rZW4oKSBlcnNldHp0LgoKCWNvbnN0IElOVDE2IEFfblRvcFN0YXR1c1tDX25TdGF0dXNTaXplXSA9CgkvLyAgMAkxCTIJMwk0CTUJNgk3CTgJOSAgMTAgIDExICAxMiAgMTMgIDE0ICAxNQoJe2ZvZixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLHdodCwgIDAsd2h0LHdodCwgIDAsZXJyLGVyciwKCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZm9mLGVycixlcnIsZXJyLGVycixlcnIsIC8vIDE2IC4uLgoJIHdodCxlcnIsd2h0LCAgMCxlcnIsZXJyLGVycixlcnIsICAwLCAgMCxlcnIsZXJyLCAgMCwgIDAsICAwLGVyciwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosZXJyLGVycixlcnIsZXJyLGVycixlcnIsIC8vIDQ4IC4uLgoJIGVycixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleiwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LCAgMCxlcnIsICAwLGVycixiZXosIC8vIDgwIC4uLgoJIGVycixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleiwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LCAgMCxlcnIsICAwLGVycixlcnIsIC8vIDExMiAuLi4KCX07CgoJY29uc3QgSU5UMTYgQV9uV2hpdGVzcGFjZVN0YXR1c1tDX25TdGF0dXNTaXplXSA9CgkvLyAJMAkxCTIJMwk0CTUJNgk3CTgJOSAgMTAgIDExICAxMiAgMTMgIDE0ICAxNQoJe2ZvZixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLHdodCxmaWcsd2h0LHdodCxmaWcsZXJyLGVyciwKCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZm9mLGVycixlcnIsZXJyLGVycixlcnIsIC8vIDE2IC4uLgoJIHdodCxmaWcsd2h0LGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZywKCSBmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsIC8vIDQ4IC4uLgoJIGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZywKCSBmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsIC8vIDgwIC4uLgoJIGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZywKCSBmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxlcnIgIC8vIDExMiAuLi4KCX07CgoJY29uc3QgSU5UMTYgQV9uQmV6ZWljaG5lclN0YXR1c1tDX25TdGF0dXNTaXplXSA9CgkvLyAJMAkxCTIJMwk0CTUJNgk3CTgJOSAgMTAgIDExICAxMiAgMTMgIDE0ICAxNQoJe2ZieixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGZieixmYnosZmJ6LGZieixmYnosZXJyLGVyciwKCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZmJ6LGVycixlcnIsZXJyLGVycixlcnIsIC8vIDE2IC4uLgoJIGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieiwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosZmJ6LGZieixmYnosZmJ6LGZieixmYnosIC8vIDQ4IC4uLgoJIGZieixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleiwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGZieixmYnosZmJ6LGZieixiZXosIC8vIDgwIC4uLgoJIGZieixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleiwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGZieixmYnosZmJ6LGZieixlcnIgIC8vIDExMiAuLi4KCX07CgoJY29uc3QgSU5UMTYgQV9uUHVuY3REZWZTdGF0dXNbQ19uU3RhdHVzU2l6ZV0gPQoJLy8gCTAJMQkyCTMJNAk1CTYJNwk4CTkgIDEwICAxMSAgMTIgIDEzICAxNCAgMTUKCXtlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsCgkgZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLCAvLyAxNiAuLi4KCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsCgkgZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLCAvLyA0OCAuLi4KCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsCgkgZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLCAvLyA4MCAuLi4KCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsCgkgZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyICAvLyAxMTIgLi4uCgl9OwoKCWNvbnN0IElOVDE2IEFfbktleXdvcmREZWZTdGF0dXNbQ19uU3RhdHVzU2l6ZV0gPQoJLy8gCTAJMQkyCTMJNAk1CTYJNwk4CTkgIDEwICAxMSAgMTIgIDEzICAxNCAgMTUKCXtmYnosZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixmYnosZmJ6LGZieixmYnosZmJ6LGVycixlcnIsCgkgZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGZieixlcnIsZXJyLGVycixlcnIsZXJyLCAvLyAxNiAuLi4KCSBmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosCgkgYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LCAvLyA0OCAuLi4KCSBmYnosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosCgkgYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixmYnosZmJ6LGZieixmYnosYmV6LCAvLyA4MCAuLi4KCSBmYnosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosCgkgYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixmYnosZmJ6LGZieixmYnosZXJyICAvLyAxMTIgLi4uCgl9OwoKCURZTiBTdG1BcnJheVN0YXR1MiAqIGRwU3RhdHVzVG9wCgkJCT0gbmV3IFN0bUFycmF5U3RhdHUyKCBDX25TdGF0dXNTaXplLCBBX25Ub3BTdGF0dXMsIDAsIHRydWUpOwoJRFlOIFN0bUFycmF5U3RhdHUyICogZHBTdGF0dXNXaGl0ZQoJCQk9IG5ldyBTdG1BcnJheVN0YXR1MiggQ19uU3RhdHVzU2l6ZSwgQV9uV2hpdGVzcGFjZVN0YXR1cywgMCwgdHJ1ZSk7CglEWU4gU3RtQXJyYXlTdGF0dTIgKiBkcFN0YXR1c0JlegoJCQk9IG5ldyBTdG1BcnJheVN0YXR1MiggQ19uU3RhdHVzU2l6ZSwgQV9uQmV6ZWljaG5lclN0YXR1cywgMCwgdHJ1ZSk7CgoJRFlOIFN0bUJvdW5kc1N0YXR1MiAqICAJZHBCc3RfZmluRXJyCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1MiggKnRoaXMsIFRrcENvbnRleHRfTnVsbDJfKCksIG5GX2Zpbl9FcnJvciwgdHJ1ZSApOwoJRFlOIFN0bUJvdW5kc1N0YXR1MiAqICAJZHBCc3RfZmluSWduCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1MiggKnRoaXMsICp0aGlzLCBuRl9maW5fSWdub3JlLCB0cnVlICk7CglEWU4gU3RtQm91bmRzU3RhdHUyICogIAlkcEJzdF9maW5CZXoKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHUyKCAqdGhpcywgKnRoaXMsIG5GX2Zpbl9JZGVudGlmaWVyLCB0cnVlICk7CglEWU4gU3RtQm91bmRzU3RhdHUyICogIAlkcEJzdF9maW5LZXl3CgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1MiggKnRoaXMsICp0aGlzLCBuRl9maW5fS2V5d29yZCwgZmFsc2UgKTsKCURZTiBTdG1Cb3VuZHNTdGF0dTIgKiAgCWRwQnN0X2ZpblB1bmN0CgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1MiggKnRoaXMsICp0aGlzLCBuRl9maW5fUHVuY3R1YXRpb24sIGZhbHNlICk7CglEWU4gU3RtQm91bmRzU3RhdHUyICogIAlkcEJzdF9maW5FT0wKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHUyKCAqdGhpcywgKnRoaXMsIG5GX2Zpbl9FT0wsIGZhbHNlICk7CglEWU4gU3RtQm91bmRzU3RhdHUyICogIAlkcEJzdF9maW5FT0YKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHUyKCAqdGhpcywgVGtwQ29udGV4dF9OdWxsMl8oKSwgbkZfZmluX0VPRiwgZmFsc2UgKTsKCglEWU4gU3RtQm91bmRzU3RhdHUyICogIAlkcEJzdF9nb3RvTWxkCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1MiggKnRoaXMsICpwRG9jdUNvbnRleHQsIG5GX2dvdG9fTUxEb2N1LCBmYWxzZSApOwoJRFlOIFN0bUJvdW5kc1N0YXR1MiAqICAJZHBCc3RfZ290b1NsZAoJCQk9IG5ldyBTdG1Cb3VuZHNTdGF0dTIoICp0aGlzLCAqcERvY3VDb250ZXh0LCBuRl9nb3RvX1NMRG9jdSwgZmFsc2UgKTsKCURZTiBTdG1Cb3VuZHNTdGF0dTIgKiAgCWRwQnN0X2dvdG9NbGMKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHUyKCAqdGhpcywgKmRwQ29udGV4dF9NTENvbW1lbnQsIG5GX2dvdG9fTUxDb21tZW50LCBmYWxzZSApOwoJRFlOIFN0bUJvdW5kc1N0YXR1MiAqICAJZHBCc3RfZ290b1NsYwoJCQk9IG5ldyBTdG1Cb3VuZHNTdGF0dTIoICp0aGlzLCAqZHBDb250ZXh0X1NMQ29tbWVudCwgbkZfZ290b19TTENvbW1lbnQsIGZhbHNlICk7CglEWU4gU3RtQm91bmRzU3RhdHUyICogIAlkcEJzdF9nb3RvUHJwCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1MiggKnRoaXMsICpkcENvbnRleHRfUHJlcHJvY2Vzc29yLCBuRl9nb3RvX1ByYWVwcm9jZXNzb3IsIGZhbHNlICk7CglEWU4gU3RtQm91bmRzU3RhdHUyICogIAlkcEJzdF9nb3RvQXNnCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1MiggKnRoaXMsICpkcENvbnRleHRfQXNzaWdubWVudCwgbkZfZ290b19Bc3NpZ25tZW50LCBmYWxzZSApOwoKCS8vIGRwTWFpbiBhdWZiYXVlbjoKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwU3RhdHVzVG9wKTsKCglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcFN0YXR1c1doaXRlKTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwU3RhdHVzQmV6KTsKCglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9maW5FcnIpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZmluSWduKTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2ZpbkJleik7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9maW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2ZpblB1bmN0KTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2ZpbkVPTCk7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9maW5FT0YpOwoKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2dvdG9NbGQpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZ290b1NsZCk7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9nb3RvTWxjKTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2dvdG9TbGMpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZ290b1BycCk7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9nb3RvQXNnKTsKCglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJhbnkiLAkJblRva19idHlfYW55LAkJCUFfbktleXdvcmREZWZTdGF0dXMsCWZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiYXR0cmlidXRlIiwgblRva19tdF9hdHRyaWJ1dGUsICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywJZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJib29sZWFuIiwgICBuVG9rX2J0eV9ib29sZWFuLCAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImJvdW5kIiwgICAgIG5Ub2tfc3RlX2JvdW5kLCAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiYnl0ZSIsICAgICAgblRva19idHlfYnl0ZSwgICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJjaGFyIiwgICAgICBuVG9rX2J0eV9jaGFyLCAgICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImNvbnN0IiwgICAgIG5Ub2tfc3RlX2NvbnN0LCAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiY29uc3RhbnRzIiwgblRva19tdF9jb25zdGFudHMsICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJjb25zdHJhaW5lZCIsCgkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuVG9rX3N0ZV9jb25zdHJhaW5lZCwgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImRvdWJsZSIsICAgIG5Ub2tfYnR5X2RvdWJsZSwgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiZW51bSIsICAgICAgblRva19tdF9lbnVtLCAgICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJleGNlcHRpb24iLCBuVG9rX210X2V4Y2VwdGlvbiwgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImh5cGVyIiwgICAgIG5Ub2tfYnR5X2h5cGVyLCAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiaWRlbnQiLCAgICAgblRva19tdF9pZGVudCwgICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJpbiIsICAgICAgICBuVG9rX3BoX2luLCAgICAgICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImlub3V0IiwgICAgIG5Ub2tfcGhfaW5vdXQsICAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiaW50ZXJmYWNlIiwgblRva19tdF9pbnRlcmZhY2UsICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJsb25nIiwgICAgICBuVG9rX2J0eV9sb25nLCAgICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIm1heWJlYW1iaWd1b3VzIiwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Ub2tfc3RlX21heWJlYW1iaWd1b3VzLEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigibWF5YmVkZWZhdWx0IiwKCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5Ub2tfc3RlX21heWJlZGVmYXVsdCwgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigibWF5YmV2b2lkIiwgblRva19zdGVfbWF5YmV2b2lkLCAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJtb2R1bGUiLCAgICBuVG9rX210X21vZHVsZSwgICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIm5lZWRzIiwgICAgIG5Ub2tfbmVlZHMsICAgICAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigib2JzZXJ2ZXMiLCAgblRva19vYnNlcnZlcywgICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJvbmV3YXkiLCAgICBuVG9rX3N0ZV9vbmV3YXksICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIm9wdGlvbmFsIiwgIG5Ub2tfc3RlX29wdGlvbmFsLCAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigib3V0IiwgICAgICAgblRva19waF9vdXQsICAgICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJwcm9wZXJ0eSIsICBuVG9rX210X3Byb3BlcnR5LCAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInB1Ymxpc2hlZCIsIG5Ub2tfc3RlX3B1Ymxpc2hlZCwgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigicmFpc2VzIiwgICAgblRva19yYWlzZXMsICAgICAgICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJyZWFkb25seSIsICBuVG9rX3N0ZV9yZWFkb25seSwgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInJlbW92YWJsZSIsIG5Ub2tfc3RlX3JlbW92YWJsZSwgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigic2VxdWVuY2UiLCAgblRva190bW9kX3NlcXVlbmNlLCAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJzZXJ2aWNlIiwgICBuVG9rX210X3NlcnZpY2UsICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInNob3J0IiwgICAgIG5Ub2tfYnR5X3Nob3J0LCAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigic2luZ2xldG9uIiwgblRva19tdF9zaW5nbGV0b24sICAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJzdHJpbmciLCAgICBuVG9rX2J0eV9zdHJpbmcsICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInN0cnVjdCIsICAgIG5Ub2tfbXRfc3RydWN0LCAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigidHJhbnNpZW50IiwgblRva19zdGVfdHJhbnNpZW50LCAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJ0eXBlZGVmIiwgICBuVG9rX210X3R5cGVkZWYsICAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInVpayIsICAgICAgIG5Ub2tfbXRfdWlrLCAgICAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigidW5zaWduZWQiLCAgblRva190bW9kX3Vuc2lnbmVkLCAgICAgQV9uS2V5d29yZERlZlN0YXR1cywgICAgZmluS2V5dyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJ2aXJ0dWFsIiwgICBuVG9rX3N0ZV92aXJ0dWFsLCAgICAgICBBX25LZXl3b3JkRGVmU3RhdHVzLCAgICBmaW5LZXl3KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInZvaWQiLCAgICAgIG5Ub2tfYnR5X3ZvaWQsICAgICAgICAgIEFfbktleXdvcmREZWZTdGF0dXMsICAgIGZpbktleXcpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiLi4uIiwgICAgICAgblRva19idHlfZWxsaXBzZSwgICAgICAgQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZmluS2V5dyk7CgoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiPSIsICAgICAgICAgblRva19hc3NpZ25tZW50LCAgICAgICAgQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZ290b0FzZyk7CgoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiKCIsICAgICAgICAgblRva19wdW5jdF9CcmFja2V0T3BlbiwgQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZmluUHVuY3QpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiKSIsICAgICAgICAgblRva19wdW5jdF9CcmFja2V0Q2xvc2UsQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZmluUHVuY3QpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiWyIsICAgICAgICAgblRva19wdW5jdF9BcnJheUJyYWNrZXRPcGVuLAoJCQkJCQkJCQkJCQkJCQkJQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZmluSWduKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIl0iLCAgICAgICAgIG5Ub2tfcHVuY3RfQXJyYXlCcmFja2V0Q2xvc2UsCgkJCQkJCQkJCQkJCQkJCQlBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5JZ24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigieyIsICAgICAgICAgblRva19wdW5jdF9DdXJsZWRCcmFja2V0T3BlbiwKCQkJCQkJCQkJCQkJCQkJCUFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpblB1bmN0KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIn0iLCAgICAgICAgIG5Ub2tfcHVuY3RfQ3VybGVkQnJhY2tldENsb3NlLAoJCQkJCQkJCQkJCQkJCQkJQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZmluUHVuY3QpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiPCIsICAgICAgICAgblRva19wdW5jdF9MZXNzZXIsCQlBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5QdW5jdCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI+IiwgICAgICAgICBuVG9rX3B1bmN0X0dyZWF0ZXIsICAgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5QdW5jdCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI7IiwgICAgICAgICBuVG9rX3B1bmN0X1NlbWljb2xvbiwgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5QdW5jdCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI6IiwgICAgICAgICBuVG9rX3B1bmN0X0NvbG9uLCAgICAgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5QdW5jdCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI6OiIsICAgICAgICBuVG9rX3B1bmN0X0RvdWJsZUNvbG9uLCBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5QdW5jdCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIsIiwgICAgICAgICBuVG9rX3B1bmN0X0NvbW1hLCAgICAgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5QdW5jdCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCItIiwgICAgICAgICBuVG9rX3B1bmN0X01pbnVzLCAgICAgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5QdW5jdCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIuIiwgICAgICAgICBuVG9rX3B1bmN0X0Z1bGxzdG9wLCAgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5QdW5jdCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIvKioiLCAgICAgICBuVG9rX25vbmVfTUxEb2N1QmVnaW4sICBBX25QdW5jdERlZlN0YXR1cywgICAgICBnb3RvTWxkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi8vLyIsCQluVG9rX25vbmVfU0xEb2N1QmVnaW4sICBBX25QdW5jdERlZlN0YXR1cywgICAgICBnb3RvU2xkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi8qIiwgICAgICAgIG5Ub2tfbm9uZV9NTENvbW1lbnRCZWdpbiwKCQkJCQkJCQkJCQkJCQkJCUFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGdvdG9NbGMpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiLy8iLCAgICAgICAgblRva19ub25lX1NMQ29tbWVudEJlZ2luLAoJCQkJCQkJCQkJCQkJCQkJQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZ290b1NsYyk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIvKiovIiwgICAgICBuVG9rX2lnbm9yZSwgICAgICAgICAgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5JZ24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiIyIsICAgICAgICAgblRva19ub25lX1ByYWVwcm9jZXNzb3JCZWdpbiwKCQkJCQkJCQkJCQkJCQkJCUFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGdvdG9QcnApOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiXHJcbiIsICAgICAgblRva19FT0wsICAgICAgICAgICAgICAgQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZmluRU9MKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIlxyIiwgICAgICAgIG5Ub2tfRU9MLCAgICAgICAgICAgICAgIEFfblB1bmN0RGVmU3RhdHVzLCAgICAgIGZpbkVPTCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJcbiIsICAgICAgICBuVG9rX0VPTCwgICAgICAgICAgICAgICBBX25QdW5jdERlZlN0YXR1cywgICAgICBmaW5FT0wpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiXG5cciIsICAgICAgblRva19FT0wsICAgICAgICAgICAgICAgQV9uUHVuY3REZWZTdGF0dXMsICAgICAgZmluRU9MKTsKfTsKCgp9ICAgLy8gbmFtZXNwYWNlIHVpZGwKfSAgIC8vIG5hbWVzcGFjZSBjc2kKCg==