LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlIDxwcmVjb21wLmg+CiNpbmNsdWRlICJjeF9jX3N0ZC5oeHgiCgoKLy8gTk9UIEZVTExZIERFQ0xBUkVEIFNFUlZJQ0VTCiNpbmNsdWRlICJhbGxfdG9rcy5oeHgiCiNpbmNsdWRlICJjeF9jX3BwLmh4eCIKI2luY2x1ZGUgImN4X2Nfc3ViLmh4eCIKI2luY2x1ZGUgPHRvb2xzL3RrcGNoYXJzLmh4eD4KI2luY2x1ZGUgPHRva2Vucy90a3BzdGFtYS5oeHg+CiNpbmNsdWRlIDx4X3BhcnNlLmh4eD4KI2luY2x1ZGUgImNfZGVhbGVyLmh4eCIKCgpuYW1lc3BhY2UgY3BwIHsKCgpjb25zdCBpbnR0IENfbkNwcEluaXRpYWxOck9mU3RhdGkgPSA2MDA7CmNvbnN0IGludHQgQ19uU3RhdHVzU2l6ZSA9IDEyODsKCgoKY29uc3QgdWludHQgbkZfZmluX0Vycm9yID0gMTsKY29uc3QgdWludHQgbkZfZmluX0NyZWF0ZVdpdGhvdXRUZXh0ID0gMjsKY29uc3QgdWludHQgbkZfZmluX0NyZWF0ZVdpdGhUZXh0ID0gMzsKY29uc3QgdWludHQgbkZfZmluX0lnbm9yZSA9IDQ7CmNvbnN0IHVpbnR0IG5GX2Zpbl9FT0wgPSA1Owpjb25zdCB1aW50dCBuRl9maW5fRU9GID0gNjsKY29uc3QgdWludHQgbkZfZmluX0JlemVpY2huZXIgPSA3OwoKY29uc3QgdWludHQgbkZfZ290b19QcmVwcm9jZXNzb3IgPSAxMDsKY29uc3QgdWludHQgbkZfZ290b19Db21tZW50ID0gMTE7CmNvbnN0IHVpbnR0IG5GX2dvdG9fRG9jdSA9IDEyOwpjb25zdCB1aW50dCBuRl9nb3RvX0NvbnN0ID0gMTM7CmNvbnN0IHVpbnR0IG5GX2dvdG9fVW5ibG9ja01hY3JvID0gMTQ7CgovLyBUb2tlbiBjcmVhdGUgZnVuY3Rpb25zIGZvciB0aGUgc3RhdGUgbWFjaGluZToKRFlOIFRleHRUb2tlbiAqIFRDRl9JZGVudGlmaWVyKGNvbnN0IGNoYXIgKiB0ZXh0KSB7IHJldHVybiBuZXcgVG9rX0lkZW50aWZpZXIodGV4dCk7IH0KCkRZTiBUZXh0VG9rZW4gKiBUQ0Zfb3BlcmF0b3IoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX29wZXJhdG9yOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfY2xhc3MoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX2NsYXNzOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0Zfc3RydWN0KGNvbnN0IGNoYXIgKikgeyByZXR1cm4gbmV3IFRva19zdHJ1Y3Q7IH0KRFlOIFRleHRUb2tlbiAqIFRDRl91bmlvbihjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfdW5pb247IH0KRFlOIFRleHRUb2tlbiAqIFRDRl9lbnVtKGNvbnN0IGNoYXIgKikgeyByZXR1cm4gbmV3IFRva19lbnVtOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfdHlwZWRlZihjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfdHlwZWRlZjsgfQpEWU4gVGV4dFRva2VuICogVENGX3B1YmxpYyhjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfcHVibGljOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfcHJvdGVjdGVkKGNvbnN0IGNoYXIgKikgeyByZXR1cm4gbmV3IFRva19wcm90ZWN0ZWQ7IH0KRFlOIFRleHRUb2tlbiAqIFRDRl9wcml2YXRlKGNvbnN0IGNoYXIgKikgeyByZXR1cm4gbmV3IFRva19wcml2YXRlOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfdGVtcGxhdGUoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX3RlbXBsYXRlOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfdmlydHVhbChjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfdmlydHVhbDsgfQpEWU4gVGV4dFRva2VuICogVENGX2ZyaWVuZChjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfZnJpZW5kOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfVGlsZGUoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX1RpbGRlOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfY29uc3QoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX2NvbnN0OyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0Zfdm9sYXRpbGUoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX3ZvbGF0aWxlOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfZXh0ZXJuKGNvbnN0IGNoYXIgKikgeyByZXR1cm4gbmV3IFRva19leHRlcm47IH0KRFlOIFRleHRUb2tlbiAqIFRDRl9zdGF0aWMoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX3N0YXRpYzsgfQpEWU4gVGV4dFRva2VuICogVENGX211dGFibGUoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX211dGFibGU7IH0KRFlOIFRleHRUb2tlbiAqIFRDRl9yZWdpc3Rlcihjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfcmVnaXN0ZXI7IH0KRFlOIFRleHRUb2tlbiAqIFRDRl9pbmxpbmUoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX2lubGluZTsgfQpEWU4gVGV4dFRva2VuICogVENGX2V4cGxpY2l0KGNvbnN0IGNoYXIgKikgeyByZXR1cm4gbmV3IFRva19leHBsaWNpdDsgfQpEWU4gVGV4dFRva2VuICogVENGX25hbWVzcGFjZShjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfbmFtZXNwYWNlOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfdXNpbmcoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX3VzaW5nOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfdGhyb3coY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX3Rocm93OyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfU3dCcmFja2V0T3Blbihjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfU3dCcmFja2V0X0xlZnQ7IH0KRFlOIFRleHRUb2tlbiAqIFRDRl9Td0JyYWNrZXRDbG9zZShjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfU3dCcmFja2V0X1JpZ2h0OyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfQXJCcmFja2V0T3Blbihjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfQXJyYXlCcmFja2V0X0xlZnQ7IH0KRFlOIFRleHRUb2tlbiAqIFRDRl9BckJyYWNrZXRDbG9zZShjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfQXJyYXlCcmFja2V0X1JpZ2h0OyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfQnJhY2tldE9wZW4oY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX0JyYWNrZXRfTGVmdDsgfQpEWU4gVGV4dFRva2VuICogVENGX0JyYWNrZXRDbG9zZShjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfQnJhY2tldF9SaWdodDsgfQpEWU4gVGV4dFRva2VuICogVENGX0RibENvbG9uKGNvbnN0IGNoYXIgKikgeyByZXR1cm4gbmV3IFRva19Eb3VibGVDb2xvbjsgfQpEWU4gVGV4dFRva2VuICogVENGX1NlbWlrb2xvbihjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfU2VtaWNvbG9uOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfS29tbWEoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX0NvbW1hOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfQ29sb24oY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX0NvbG9uOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfWnV3ZWlzdW5nKGNvbnN0IGNoYXIgKikgeyByZXR1cm4gbmV3IFRva19Bc3NpZ247IH0KRFlOIFRleHRUb2tlbiAqIFRDRl9TbWFsbGVyKGNvbnN0IGNoYXIgKikgeyByZXR1cm4gbmV3IFRva19MZXNzOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfQmlnZ2VyKGNvbnN0IGNoYXIgKikgeyByZXR1cm4gbmV3IFRva19HcmVhdGVyOyB9CkRZTiBUZXh0VG9rZW4gKiBUQ0ZfU3Rlcm4oY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX0FzdGVyaXg7IH0KRFlOIFRleHRUb2tlbiAqIFRDRl9BbXBlcnNhbmQoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX0FtcGVyc0FuZDsgfQpEWU4gVGV4dFRva2VuICogVENGX0VsbGlwc2UoY29uc3QgY2hhciAqKSB7IHJldHVybiBuZXcgVG9rX0VsbGlwc2U7IH0KRFlOIFRleHRUb2tlbiAqIFRDRl90eXBlbmFtZShjb25zdCBjaGFyICopIHsgcmV0dXJuIG5ldyBUb2tfdHlwZW5hbWU7IH0KCgkvLyBPcGVyYXRvcnMKRFlOIFRleHRUb2tlbiAqIFRDRl9PcGVyYXRvcihjb25zdCBjaGFyICogdGV4dCkgeyByZXR1cm4gbmV3IFRva19PcGVyYXRvcih0ZXh0KTsgfQoKRFlOIFRleHRUb2tlbiAqIFRDRl9CdWlsdEluVHlwZShjb25zdCBjaGFyICogdGV4dCkgeyByZXR1cm4gbmV3IFRva19CdWlsdEluVHlwZSh0ZXh0KTsgfQpEWU4gVGV4dFRva2VuICogVENGX1R5cGVNb2RpZmllcihjb25zdCBjaGFyICogdGV4dCkgeyByZXR1cm4gbmV3IFRva19UeXBlU3BlY2lhbGl6ZXIodGV4dCk7IH0KCkRZTiBUZXh0VG9rZW4gKiBUQ0ZfRW9mKGNvbnN0IGNoYXIgKikgeyByZXR1cm4gbmV3IFRva19Fb2Y7IH0KCgoKQ29udGV4dF9DcHBTdGQ6OkNvbnRleHRfQ3BwU3RkKCBEWU4gYXV0b2RvYzo6VGtwRG9jdUNvbnRleHQgJiBsZXRfZHJDb250ZXh0X0RvY3UgKQoJOiAgIEN4X0Jhc2UoMCksCiAgICAgICAgYVN0YXRlTWFjaGluZShDX25TdGF0dXNTaXplLENfbkNwcEluaXRpYWxOck9mU3RhdGkpLAoJCXBEb2N1Q29udGV4dCgmbGV0X2RyQ29udGV4dF9Eb2N1KSwKCQlwQ29udGV4dF9Db21tZW50KDApLAoJCXBDb250ZXh0X1ByZXByb2Nlc3NvcigwKSwKCQlwQ29udGV4dF9Db25zdFN0cmluZygwKSwKCQlwQ29udGV4dF9Db25zdENoYXIoMCksCgkJcENvbnRleHRfQ29uc3ROdW1lcmljKDApLAoJCXBDb250ZXh0X1VuYmxvY2tNYWNybygwKQp7CglwRG9jdUNvbnRleHQtPlNldFBhcmVudENvbnRleHQoKnRoaXMsIiovIik7CgogICAgcENvbnRleHRfQ29tbWVudCA9IG5ldyBDb250ZXh0X0NvbW1lbnQoKnRoaXMpOwoJcENvbnRleHRfUHJlcHJvY2Vzc29yID0gbmV3IENvbnRleHRfUHJlcHJvY2Vzc29yKCp0aGlzKTsKCXBDb250ZXh0X0NvbnN0U3RyaW5nID0gbmV3IENvbnRleHRfQ29uc3RTdHJpbmcoKnRoaXMpOwoJcENvbnRleHRfQ29uc3RDaGFyID0gbmV3IENvbnRleHRfQ29uc3RDaGFyKCp0aGlzKTsKCXBDb250ZXh0X0NvbnN0TnVtZXJpYyA9IG5ldyBDb250ZXh0X0NvbnN0TnVtZXJpYygqdGhpcyk7CglwQ29udGV4dF9VbmJsb2NrTWFjcm8gPSBuZXcgQ29udGV4dF9VbmJsb2NrTWFjcm8oKnRoaXMpOwoKCVNldHVwU3RhdGVNYWNoaW5lKCk7Cn0KCkNvbnRleHRfQ3BwU3RkOjp+Q29udGV4dF9DcHBTdGQoKQp7Cn0KCnZvaWQKQ29udGV4dF9DcHBTdGQ6OlJlYWRDaGFyQ2hhaW4oIENoYXJhY3RlclNvdXJjZSAmIGlvX3JUZXh0ICkKewoJU2V0TmV3VG9rZW4oMCk7CgoJVGV4dFRva2VuOjpGX0NSVE9LIGZUb2tlbkNyZWF0ZUZ1bmN0aW9uID0gMDsKCVN0bUJvdW5kc1N0YXR1cyAmIHJCb3VuZCA9IGFTdGF0ZU1hY2hpbmUuR2V0Q2hhckNoYWluKGZUb2tlbkNyZWF0ZUZ1bmN0aW9uLCBpb19yVGV4dCk7CgoJLy8gISEhCgkvLyAJIFRoZSBvcmRlciBvZiB0aGUgbmV4dCB0d28gbGluZXMgaXMgZXNzZW50aWFsLCBiZWNhdXNlCgkvLyAgIHBGb2xsb3dVcENvbnRleHQgbWF5IGJlIGNoYW5nZWQgYnkgUGVyZm9ybVN0YXR1c0Z1bmN0aW9uKCkgYWxzbywKCS8vICAgd2hpY2ggdGhlbiBNVVNUIG92ZXJyaWRlIHRoZSBwcmV2aW91cyBhc3NpZ25tZW50LgoJU2V0Rm9sbG93VXBDb250ZXh0KHJCb3VuZC5Gb2xsb3dVcENvbnRleHQoKSk7CglQZXJmb3JtU3RhdHVzRnVuY3Rpb24ockJvdW5kLlN0YXR1c0Z1bmN0aW9uTnIoKSwgZlRva2VuQ3JlYXRlRnVuY3Rpb24sIGlvX3JUZXh0KTsKfQoKdm9pZApDb250ZXh0X0NwcFN0ZDo6QXNzaWduRGVhbGVyKCBEaXN0cmlidXRvciAmIG9fckRlYWxlciApCnsKICAgIEN4X0Jhc2U6OkFzc2lnbkRlYWxlcihvX3JEZWFsZXIpOwoKICAgIHBEb2N1Q29udGV4dC0+QXNzaWduRGVhbGVyKG9fckRlYWxlcik7CiAgICBwQ29udGV4dF9Db21tZW50LT5Bc3NpZ25EZWFsZXIob19yRGVhbGVyKTsKICAgIHBDb250ZXh0X1ByZXByb2Nlc3Nvci0+QXNzaWduRGVhbGVyKG9fckRlYWxlcik7CiAgICBwQ29udGV4dF9Db25zdFN0cmluZy0+QXNzaWduRGVhbGVyKG9fckRlYWxlcik7CiAgICBwQ29udGV4dF9Db25zdENoYXItPkFzc2lnbkRlYWxlcihvX3JEZWFsZXIpOwogICAgcENvbnRleHRfQ29uc3ROdW1lcmljLT5Bc3NpZ25EZWFsZXIob19yRGVhbGVyKTsKICAgIHBDb250ZXh0X1VuYmxvY2tNYWNyby0+QXNzaWduRGVhbGVyKG9fckRlYWxlcik7Cn0KCnZvaWQKQ29udGV4dF9DcHBTdGQ6OlBlcmZvcm1TdGF0dXNGdW5jdGlvbiggdWludHQJCQkJCWlfblN0YXR1c1NpZ25hbCwKCQkJCQkJCQkJICAgRl9DUlRPSyAJICAgICAgICAgICAgICAgIGlfZlRva2VuQ3JlYXRlRnVuY3Rpb24sCgkJCQkJCQkJCSAgIENoYXJhY3RlclNvdXJjZSAmCSAgICBpb19yVGV4dCApCnsKCXN3aXRjaCAoaV9uU3RhdHVzU2lnbmFsKQoJewoJCWNhc2UgbkZfZmluX0NyZWF0ZVdpdGhvdXRUZXh0OgoJCQlpb19yVGV4dC5DdXRUb2tlbigpOwoJCQljc3ZfYXNzZXJ0KGlfZlRva2VuQ3JlYXRlRnVuY3Rpb24gIT0gMCk7CgkJCVNldE5ld1Rva2VuKCAoKmlfZlRva2VuQ3JlYXRlRnVuY3Rpb24pKDApICk7CgkJCWJyZWFrOwoJCWNhc2UgbkZfZmluX0NyZWF0ZVdpdGhUZXh0OgoJCQljc3ZfYXNzZXJ0KGlfZlRva2VuQ3JlYXRlRnVuY3Rpb24gIT0gMCk7CgkJCVNldE5ld1Rva2VuKCAoKmlfZlRva2VuQ3JlYXRlRnVuY3Rpb24pKGlvX3JUZXh0LkN1dFRva2VuKCkpICk7CgkJCWJyZWFrOwoJCWNhc2UgbkZfZmluX0lnbm9yZToKCQkJaW9fclRleHQuQ3V0VG9rZW4oKTsKCQkJU2V0TmV3VG9rZW4oMCk7CgkJCWJyZWFrOwoJCWNhc2UgbkZfZmluX0VPTDoKCQkJaW9fclRleHQuQ3V0VG9rZW4oKTsKCQkJU2V0TmV3VG9rZW4oMCk7CgkJCURlYWxlcigpLkRlYWxfRW9sKCk7CgkJCWJyZWFrOwoJCWNhc2UgbkZfZmluX0VPRjoKCQkJaW9fclRleHQuQ3V0VG9rZW4oKTsKCQkJU2V0TmV3VG9rZW4oIFRDRl9Fb2YoMCkgKTsKCQkJYnJlYWs7CgkJY2FzZSBuRl9maW5fQmV6ZWljaG5lcjoKCQkJU2V0TmV3VG9rZW4oIFRDRl9JZGVudGlmaWVyKGlvX3JUZXh0LkN1dFRva2VuKCkpICk7CgkJCWJyZWFrOwoKCQljYXNlIG5GX2dvdG9fUHJlcHJvY2Vzc29yOgoJCQlpb19yVGV4dC5DdXRUb2tlbigpOwoJCQlTZXROZXdUb2tlbigwKTsKCQkJYnJlYWs7CgkJY2FzZSBuRl9nb3RvX0NvbW1lbnQ6CgkJCVNldE5ld1Rva2VuKDApOwoJCQlwQ29udGV4dF9Db21tZW50LT5TZXRNb2RlX0lzTXVsdGlMaW5lKCBpb19yVGV4dC5DdXRUb2tlbigpWzFdID09ICcqJyApOwoJCQlicmVhazsKCQljYXNlIG5GX2dvdG9fRG9jdToKCQkJU2V0TmV3VG9rZW4oMCk7CgkJCXBEb2N1Q29udGV4dC0+U2V0TW9kZV9Jc011bHRpTGluZSggaW9fclRleHQuQ3V0VG9rZW4oKVsxXSA9PSAnKicgKTsKCQkJYnJlYWs7CgkJY2FzZSBuRl9nb3RvX0NvbnN0OgoJCQlTZXROZXdUb2tlbigwKTsKCQkJYnJlYWs7CiAgICAgICAgY2FzZSBuRl9nb3RvX1VuYmxvY2tNYWNybzoKCQkJU2V0TmV3VG9rZW4oMCk7CgkJCWJyZWFrOwoKCQljYXNlIG5GX2Zpbl9FcnJvcjoKCQlkZWZhdWx0OgogICAgICAgIHsKICAgICAgICAgICAgY2hhciBjQ0MgPSBpb19yVGV4dC5DdXJDaGFyKCk7CiAgICAgICAgICAgIFN0cmluZyAgc0N1ckNoYXIoICZjQ0MsIDEgKTsKCQkJdGhyb3cgWF9QYXJzZXIoIFhfUGFyc2VyOjp4X0ludmFsaWRDaGFyLCBzQ3VyQ2hhciwgU3RyaW5nOjpOdWxsXygpLCAwICk7CiAgICAgICAgfQoJfQkvLyBlbmQgc3dpdGNoIChpX25TdGF0dXNTaWduYWwpCn0KCnZvaWQKQ29udGV4dF9DcHBTdGQ6OlNldHVwU3RhdGVNYWNoaW5lKCkKewoJLy8gQmVzb25kZXJlIEFycmF5LVN0YXRpIChrZWluIFRva2VuYWJzY2hsdXNzIG9kZXIgS29udGV4dHdlY2hzZWwpOgovLwljb25zdCBJTlQxNgl0b3AgPSAwOwkJLy8gVG9wLVN0YXR1cwoJY29uc3QgSU5UMTYJd2h0ID0gMTsJCS8vIFdoaXRlc3BhY2Ut/GJlcmxlc2UtU3RhdHVzCgljb25zdCBJTlQxNgliZXogPSAyOyAgICAgICAgLy8gQmV6ZWljaG5lci1sZXNlLVN0YXR1cwoKCS8vIFRva2VuZmluaXNoLVN0YXRpOgoJY29uc3QgSU5UMTYJZmluRXJyb3IgPSAzOwoJY29uc3QgSU5UMTYgZmluSWdub3JlID0gNDsKCWNvbnN0IElOVDE2IGZpbkJlemVpY2huZXIgPSA1OwoJY29uc3QgSU5UMTYgZmluS2V5d29yZCA9IDY7Cgljb25zdCBJTlQxNiBmaW5QdW5jdHVhdGlvbiA9IDc7Cgljb25zdCBJTlQxNiBmaW5CaVR5cGUgPSA4OwoJY29uc3QgSU5UMTYgZmluVHlwZU1vZGlmaWVyID0gOTsKCWNvbnN0IElOVDE2IGZpbkVPTCA9IDEwOwoJY29uc3QgSU5UMTYgZmluRU9GID0gMTE7CgoJLy8gS29udGV4dHdlY2hzZWwtU3RhdGk6Cgljb25zdCBJTlQxNglnb3RvQ29tbWVudCA9IDEyOwoJY29uc3QgSU5UMTYJZ290b0RvY3UgPSAxMzsKCWNvbnN0IElOVDE2IGdvdG9QcmVwcm9jZXNzb3IgPSAxNDsKCWNvbnN0IElOVDE2CWdvdG9Db25zdFN0cmluZyA9IDE1OwoJY29uc3QgSU5UMTYJZ290b0NvbnN0Q2hhciA9IDE2OwoJY29uc3QgSU5UMTYJZ290b0NvbnN0TnVtZXJpYyA9IDE3OwoJY29uc3QgSU5UMTYgZ290b1VuYmxvY2tNYWNybyA9IDE4OwoKCS8vIEFiYnJldmlhdGlvbnMgdG8gYmUgdXNlZCBpbiBzdGF0dXMgdGFibGVzOgoJY29uc3QgSU5UMTYgZXJyID0gZmluRXJyb3I7Cgljb25zdCBJTlQxNiBmaWcgPSBmaW5JZ25vcmU7Cgljb25zdCBJTlQxNiBmYnogPSBmaW5CZXplaWNobmVyOwoJY29uc3QgSU5UMTYgZm9mID0gZmluRU9GOwoJY29uc3QgSU5UMTYgY3N0ID0gZ290b0NvbnN0U3RyaW5nOwoJY29uc3QgSU5UMTYgY2NoID0gZ290b0NvbnN0Q2hhcjsKCWNvbnN0IElOVDE2IGNuciA9IGdvdG9Db25zdE51bWVyaWM7CgoKCS8vLyBaZXJvcyAtICcwJyAtIHdpbGwgYmUgcmVwbGFjZWQgYnkgQWRkVG9rZW4oKS4KCgljb25zdCBJTlQxNiBBX25Ub3BTdGF0dXNbQ19uU3RhdHVzU2l6ZV0gPQoJLy8gIDAJMQkyCTMJNAk1CTYJNwk4CTkgIDEwICAxMSAgMTIgIDEzICAxNCAgMTUKCXtmb2YsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycix3aHQsICAwLHdodCx3aHQsICAwLGVycixlcnIsCgkgZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGZvZixlcnIsZXJyLGVycixlcnIsZXJyLCAvLyAxNiAuLi4KCSB3aHQsICAwLGNzdCwgIDAsZXJyLCAgMCwgIDAsY2NoLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAgMCwgIDAsCgkgY25yLGNucixjbnIsY25yLGNucixjbnIsY25yLGNucixjbnIsY25yLCAgMCwgIDAsICAwLCAgMCwgIDAsICAwLCAvLyA0OCAuLi4KCSAgIDAsYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosCgkgYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleiwgIDAsICAwLCAgMCwgIDAsYmV6LCAvLyA4MCAuLi4KCSAgIDAsYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosCgkgYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleiwgIDAsICAwLCAgMCwgIDAsZXJyLCAvLyA4MCAuLi4KCX07CgoJY29uc3QgSU5UMTYgQV9uV2hpdGVzcGFjZVN0YXR1c1tDX25TdGF0dXNTaXplXSA9CgkvLyAJMAkxCTIJMwk0CTUJNgk3CTgJOSAgMTAgIDExICAxMiAgMTMgIDE0ICAxNQoJe2ZvZixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLHdodCxmaWcsd2h0LHdodCxmaWcsZXJyLGVyciwKCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZm9mLGVycixlcnIsZXJyLGVycixlcnIsIC8vIDE2IC4uLgoJIHdodCxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZywKCSBmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsIC8vIDQ4IC4uLgoJIGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZywKCSBmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsIC8vIDgwIC4uLgoJIGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZywKCSBmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxmaWcsZmlnLGZpZyxlcnIKCX07CgoJY29uc3QgSU5UMTYgQV9uQmV6ZWljaG5lclN0YXR1c1tDX25TdGF0dXNTaXplXSA9CgkvLyAJMAkxCTIJMwk0CTUJNgk3CTgJOSAgMTAgIDExICAxMiAgMTMgIDE0ICAxNQoJe2ZieixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGZieixmYnosZmJ6LGZieixmYnosZXJyLGVyciwKCSBlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZmJ6LGVycixlcnIsZXJyLGVycixlcnIsIC8vIDE2IC4uLgoJIGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieiwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosZmJ6LGZieixmYnosZmJ6LGZieixmYnosIC8vIDQ4IC4uLgoJIGZieixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleiwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGZieixmYnosZmJ6LGZieixiZXosIC8vIDgwIC4uLgoJIGZieixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleiwKCSBiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGZieixmYnosZmJ6LGZieixlcnIKCX07CgoKCWNvbnN0IElOVDE2IEFfbk9wZXJhdG9yRGVmU3RhdHVzW0NfblN0YXR1c1NpemVdID0KCS8vIAkwCTEJMgkzCTQJNQk2CTcJOAk5ICAxMCAgMTEgIDEyICAxMyAgMTQgIDE1Cgl7ZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLAoJIGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVyciwgLy8gMTYgLi4uCgkgZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLAoJIGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVyciwgLy8gNDggLi4uCgkgZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLAoJIGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVyciwgLy8gODAgLi4uCgkgZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLAoJIGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycgoJfTsKCgljb25zdCBJTlQxNiBBX25CZXpEZWZTdGF0dXNbQ19uU3RhdHVzU2l6ZV0gPQoJLy8gCTAJMQkyCTMJNAk1CTYJNwk4CTkgIDEwICAxMSAgMTIgIDEzICAxNCAgMTUKCXtmYnosZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixmYnosZmJ6LGZieixmYnosZmJ6LGVycixlcnIsCgkgZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGVycixlcnIsZXJyLGZieixlcnIsZXJyLGVycixlcnIsZXJyLCAvLyAxNiAuLi4KCSBmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LGZieixmYnosCgkgYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGZieixmYnosZmJ6LGZieixmYnosZmJ6LCAvLyA0OCAuLi4KCSBmYnosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosCgkgYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixmYnosZmJ6LGZieixmYnosYmV6LCAvLyA4MCAuLi4KCSBmYnosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosCgkgYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixiZXosYmV6LGJleixmYnosZmJ6LGZieixmYnosZXJyCgl9OwoKCURZTiBTdG1BcnJheVN0YXR1cyAqIGRwU3RhdHVzVG9wCgkJCT0gbmV3IFN0bUFycmF5U3RhdHVzKCBDX25TdGF0dXNTaXplLCBBX25Ub3BTdGF0dXMsIDAsIHRydWUpOwoJRFlOIFN0bUFycmF5U3RhdHVzICogZHBTdGF0dXNXaGl0ZQoJCQk9IG5ldyBTdG1BcnJheVN0YXR1cyggQ19uU3RhdHVzU2l6ZSwgQV9uV2hpdGVzcGFjZVN0YXR1cywgMCwgdHJ1ZSk7CglEWU4gU3RtQXJyYXlTdGF0dXMgKiBkcFN0YXR1c0JlegoJCQk9IG5ldyBTdG1BcnJheVN0YXR1cyggQ19uU3RhdHVzU2l6ZSwgQV9uQmV6ZWljaG5lclN0YXR1cywgVENGX0lkZW50aWZpZXIsIHRydWUpOwoKCURZTiBTdG1Cb3VuZHNTdGF0dXMgKiAgCWRwQnN0X2ZpbkVycm9yCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1cyggKnRoaXMsIFRrcENvbnRleHQ6Ok51bGxfKCksIG5GX2Zpbl9FcnJvciwgdHJ1ZSApOwoJRFlOIFN0bUJvdW5kc1N0YXR1cyAqICAJZHBCc3RfZmluSWdub3JlCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1cyggKnRoaXMsICp0aGlzLCBuRl9maW5fSWdub3JlLCB0cnVlICk7CglEWU4gU3RtQm91bmRzU3RhdHVzICogIAlkcEJzdF9maW5CZXplaWNobmVyCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1cyggKnRoaXMsICp0aGlzLCBuRl9maW5fQmV6ZWljaG5lciwgdHJ1ZSApOwoJRFlOIFN0bUJvdW5kc1N0YXR1cyAqICAJZHBCc3RfZmluS2V5d29yZAoJCQk9IG5ldyBTdG1Cb3VuZHNTdGF0dXMoICp0aGlzLCAqdGhpcywgbkZfZmluX0NyZWF0ZVdpdGhvdXRUZXh0LCBmYWxzZSApOwoJRFlOIFN0bUJvdW5kc1N0YXR1cyAqICAJZHBCc3RfZmluUHVuY3R1YXRpb24KCQkJPSBuZXcgU3RtQm91bmRzU3RhdHVzKCAqdGhpcywgKnRoaXMsIG5GX2Zpbl9DcmVhdGVXaXRoVGV4dCwgZmFsc2UgKTsKCURZTiBTdG1Cb3VuZHNTdGF0dXMgKiAgCWRwQnN0X2ZpbkJpVHlwZQoJCQk9IG5ldyBTdG1Cb3VuZHNTdGF0dXMoICp0aGlzLCAqdGhpcywgbkZfZmluX0NyZWF0ZVdpdGhUZXh0LCBmYWxzZSApOwoJRFlOIFN0bUJvdW5kc1N0YXR1cyAqICAJZHBCc3RfZmluVHlwZU1vZGlmaWVyCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1cyggKnRoaXMsICp0aGlzLCBuRl9maW5fQ3JlYXRlV2l0aFRleHQsIGZhbHNlICk7CglEWU4gU3RtQm91bmRzU3RhdHVzICogIAlkcEJzdF9maW5FT0wKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHVzKCAqdGhpcywgKnRoaXMsIG5GX2Zpbl9FT0wsIGZhbHNlICk7CglEWU4gU3RtQm91bmRzU3RhdHVzICogIAlkcEJzdF9maW5FT0YKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHVzKCAqdGhpcywgVGtwQ29udGV4dDo6TnVsbF8oKSwgbkZfZmluX0VPRiwgZmFsc2UgKTsKCglEWU4gU3RtQm91bmRzU3RhdHVzICogIAlkcEJzdF9nb3RvQ29tbWVudAoJCQk9IG5ldyBTdG1Cb3VuZHNTdGF0dXMoICp0aGlzLCAqcENvbnRleHRfQ29tbWVudCwgbkZfZ290b19Db21tZW50LCBmYWxzZSApOwoJRFlOIFN0bUJvdW5kc1N0YXR1cyAqICAJZHBCc3RfZ290b0RvY3UKCQkJPSBuZXcgU3RtQm91bmRzU3RhdHVzKCAqdGhpcywgKnBEb2N1Q29udGV4dCwgbkZfZ290b19Eb2N1LCBmYWxzZSApOwoJRFlOIFN0bUJvdW5kc1N0YXR1cyAqICAJZHBCc3RfZ290b1ByZXByb2Nlc3NvcgoJCQk9IG5ldyBTdG1Cb3VuZHNTdGF0dXMoICp0aGlzLCAqcENvbnRleHRfUHJlcHJvY2Vzc29yLCBuRl9nb3RvX1ByZXByb2Nlc3NvciwgZmFsc2UgKTsKCURZTiBTdG1Cb3VuZHNTdGF0dXMgKiAgCWRwQnN0X2dvdG9Db25zdFN0cmluZwoJCQk9IG5ldyBTdG1Cb3VuZHNTdGF0dXMoICp0aGlzLCAqcENvbnRleHRfQ29uc3RTdHJpbmcsIG5GX2dvdG9fQ29uc3QsIGZhbHNlICk7CglEWU4gU3RtQm91bmRzU3RhdHVzICogIAlkcEJzdF9nb3RvQ29uc3RDaGFyCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1cyggKnRoaXMsICpwQ29udGV4dF9Db25zdENoYXIsIG5GX2dvdG9fQ29uc3QsIGZhbHNlICk7CglEWU4gU3RtQm91bmRzU3RhdHVzICogIAlkcEJzdF9nb3RvQ29uc3ROdW1lcmljCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1cyggKnRoaXMsICpwQ29udGV4dF9Db25zdE51bWVyaWMsIG5GX2dvdG9fQ29uc3QsIGZhbHNlICk7CglEWU4gU3RtQm91bmRzU3RhdHVzICogIAlkcEJzdF9nb3RvVW5ibG9ja01hY3JvCgkJCT0gbmV3IFN0bUJvdW5kc1N0YXR1cyggKnRoaXMsICpwQ29udGV4dF9VbmJsb2NrTWFjcm8sIG5GX2dvdG9fVW5ibG9ja01hY3JvLCBmYWxzZSApOwoKCS8vIGRwTWFpbiBhdWZiYXVlbjoKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwU3RhdHVzVG9wKTsKCglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcFN0YXR1c1doaXRlKTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwU3RhdHVzQmV6KTsKCglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9maW5FcnJvcik7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9maW5JZ25vcmUpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZmluQmV6ZWljaG5lcik7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9maW5LZXl3b3JkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2ZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2ZpbkJpVHlwZSk7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9maW5UeXBlTW9kaWZpZXIpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZmluRU9MKTsKCWFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2ZpbkVPRik7CgoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZ290b0NvbW1lbnQpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZ290b0RvY3UpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZ290b1ByZXByb2Nlc3Nvcik7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9nb3RvQ29uc3RTdHJpbmcpOwoJYVN0YXRlTWFjaGluZS5BZGRTdGF0dXMoZHBCc3RfZ290b0NvbnN0Q2hhcik7CglhU3RhdGVNYWNoaW5lLkFkZFN0YXR1cyhkcEJzdF9nb3RvQ29uc3ROdW1lcmljKTsKICAgIGFTdGF0ZU1hY2hpbmUuQWRkU3RhdHVzKGRwQnN0X2dvdG9VbmJsb2NrTWFjcm8pOwoKCS8vIElkZW50aWZpZXIKCgkvLyBLZXl3b3JkcyBhbmQgb3RoZXIgdW5pcXVlIFRva2VucwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigib3BlcmF0b3IiLFRDRl9vcGVyYXRvcixBX25CZXpEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJjbGFzcyIsVENGX2NsYXNzLEFfbkJlekRlZlN0YXR1cyxmaW5LZXl3b3JkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInN0cnVjdCIsVENGX3N0cnVjdCxBX25CZXpEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJ1bmlvbiIsVENGX3VuaW9uLEFfbkJlekRlZlN0YXR1cyxmaW5LZXl3b3JkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImVudW0iLFRDRl9lbnVtLEFfbkJlekRlZlN0YXR1cyxmaW5LZXl3b3JkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInR5cGVkZWYiLFRDRl90eXBlZGVmLEFfbkJlekRlZlN0YXR1cyxmaW5LZXl3b3JkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInB1YmxpYyIsVENGX3B1YmxpYyxBX25CZXpEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJwcm90ZWN0ZWQiLFRDRl9wcm90ZWN0ZWQsQV9uQmV6RGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigicHJpdmF0ZSIsVENGX3ByaXZhdGUsQV9uQmV6RGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigidGVtcGxhdGUiLFRDRl90ZW1wbGF0ZSxBX25CZXpEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJ2aXJ0dWFsIixUQ0ZfdmlydHVhbCxBX25CZXpEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJmcmllbmQiLFRDRl9mcmllbmQsQV9uQmV6RGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigifiIsVENGX1RpbGRlLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiY29uc3QiLFRDRl9jb25zdCxBX25CZXpEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJ2b2xhdGlsZSIsVENGX3ZvbGF0aWxlLEFfbkJlekRlZlN0YXR1cyxmaW5LZXl3b3JkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImV4dGVybiIsVENGX2V4dGVybixBX25CZXpEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJzdGF0aWMiLFRDRl9zdGF0aWMsQV9uQmV6RGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigibXV0YWJsZSIsVENGX211dGFibGUsQV9uQmV6RGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigicmVnaXN0ZXIiLFRDRl9yZWdpc3RlcixBX25CZXpEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJpbmxpbmUiLFRDRl9pbmxpbmUsQV9uQmV6RGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiZXhwbGljaXQiLFRDRl9leHBsaWNpdCxBX25CZXpEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJuYW1lc3BhY2UiLFRDRl9uYW1lc3BhY2UsQV9uQmV6RGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigidXNpbmciLFRDRl91c2luZyxBX25CZXpEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJ0aHJvdyIsVENGX3Rocm93LEFfbkJlekRlZlN0YXR1cyxmaW5LZXl3b3JkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInsiLFRDRl9Td0JyYWNrZXRPcGVuLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigifSIsVENGX1N3QnJhY2tldENsb3NlLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiWyIsVENGX0FyQnJhY2tldE9wZW4sQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJdIixUQ0ZfQXJCcmFja2V0Q2xvc2UsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIoIixUQ0ZfQnJhY2tldE9wZW4sQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIpIixUQ0ZfQnJhY2tldENsb3NlLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiOjoiLFRDRl9EYmxDb2xvbixBX25PcGVyYXRvckRlZlN0YXR1cyxmaW5LZXl3b3JkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIjsiLFRDRl9TZW1pa29sb24sQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIsIixUQ0ZfS29tbWEsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI6IixUQ0ZfQ29sb24sQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI9IixUQ0ZfWnV3ZWlzdW5nLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiPCIsVENGX1NtYWxsZXIsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI+IixUQ0ZfQmlnZ2VyLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiKiIsVENGX1N0ZXJuLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpbktleXdvcmQpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiJiIsVENGX0FtcGVyc2FuZCxBX25PcGVyYXRvckRlZlN0YXR1cyxmaW5LZXl3b3JkKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi4uLiIsVENGX0VsbGlwc2UsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluS2V5d29yZCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJ0eXBlbmFtZSIsVENGX3R5cGVuYW1lLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpbktleXdvcmQpOwoKCS8vIE9wZXJhdG9ycwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiPT0iLFRDRl9PcGVyYXRvcixBX25PcGVyYXRvckRlZlN0YXR1cyxmaW5QdW5jdHVhdGlvbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIhPSIsVENGX09wZXJhdG9yLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIjw9IixUQ0ZfT3BlcmF0b3IsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluUHVuY3R1YXRpb24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiPj0iLFRDRl9PcGVyYXRvcixBX25PcGVyYXRvckRlZlN0YXR1cyxmaW5QdW5jdHVhdGlvbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCImJiIsVENGX09wZXJhdG9yLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInx8IixUQ0ZfT3BlcmF0b3IsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluUHVuY3R1YXRpb24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiISIsVENGX09wZXJhdG9yLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIm5ldyIsVENGX09wZXJhdG9yLEFfbkJlekRlZlN0YXR1cyxmaW5QdW5jdHVhdGlvbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJkZWxldGUiLFRDRl9PcGVyYXRvcixBX25CZXpEZWZTdGF0dXMsZmluUHVuY3R1YXRpb24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigic2l6ZW9mIixUQ0ZfT3BlcmF0b3IsQV9uQmV6RGVmU3RhdHVzLGZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInR5cGVpZCIsVENGX09wZXJhdG9yLEFfbkJlekRlZlN0YXR1cyxmaW5QdW5jdHVhdGlvbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIrIixUQ0ZfT3BlcmF0b3IsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluUHVuY3R1YXRpb24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiLSIsVENGX09wZXJhdG9yLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi8iLFRDRl9PcGVyYXRvcixBX25PcGVyYXRvckRlZlN0YXR1cyxmaW5QdW5jdHVhdGlvbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIlIixUQ0ZfT3BlcmF0b3IsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluUHVuY3R1YXRpb24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiXiIsVENGX09wZXJhdG9yLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInwiLFRDRl9PcGVyYXRvcixBX25PcGVyYXRvckRlZlN0YXR1cyxmaW5QdW5jdHVhdGlvbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI8PCIsVENGX09wZXJhdG9yLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIj4+IixUQ0ZfT3BlcmF0b3IsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluUHVuY3R1YXRpb24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiLiIsVENGX09wZXJhdG9yLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi0+IixUQ0ZfT3BlcmF0b3IsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluUHVuY3R1YXRpb24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiPyIsVENGX09wZXJhdG9yLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIis9IixUQ0ZfT3BlcmF0b3IsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluUHVuY3R1YXRpb24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiLT0iLFRDRl9PcGVyYXRvcixBX25PcGVyYXRvckRlZlN0YXR1cyxmaW5QdW5jdHVhdGlvbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIqPSIsVENGX09wZXJhdG9yLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi89IixUQ0ZfT3BlcmF0b3IsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluUHVuY3R1YXRpb24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiJT0iLFRDRl9PcGVyYXRvcixBX25PcGVyYXRvckRlZlN0YXR1cyxmaW5QdW5jdHVhdGlvbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCImPSIsVENGX09wZXJhdG9yLEFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpblB1bmN0dWF0aW9uKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInw9IixUQ0ZfT3BlcmF0b3IsQV9uT3BlcmF0b3JEZWZTdGF0dXMsZmluUHVuY3R1YXRpb24pOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiXj0iLFRDRl9PcGVyYXRvcixBX25PcGVyYXRvckRlZlN0YXR1cyxmaW5QdW5jdHVhdGlvbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI8PD0iLFRDRl9PcGVyYXRvcixBX25PcGVyYXRvckRlZlN0YXR1cyxmaW5QdW5jdHVhdGlvbik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCI+Pj0iLFRDRl9PcGVyYXRvcixBX25PcGVyYXRvckRlZlN0YXR1cyxmaW5QdW5jdHVhdGlvbik7CgoJLy8gQnVpbHRpbiB0eXBlcwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiY2hhciIsCVRDRl9CdWlsdEluVHlwZSwJQV9uQmV6RGVmU3RhdHVzLAlmaW5CaVR5cGUpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigic2hvcnQiLAlUQ0ZfQnVpbHRJblR5cGUsCUFfbkJlekRlZlN0YXR1cywJZmluQmlUeXBlKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImludCIsCVRDRl9CdWlsdEluVHlwZSwJQV9uQmV6RGVmU3RhdHVzLAlmaW5CaVR5cGUpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigibG9uZyIsCVRDRl9CdWlsdEluVHlwZSwJQV9uQmV6RGVmU3RhdHVzLAlmaW5CaVR5cGUpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiZmxvYXQiLAlUQ0ZfQnVpbHRJblR5cGUsCUFfbkJlekRlZlN0YXR1cywJZmluQmlUeXBlKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oImRvdWJsZSIsVENGX0J1aWx0SW5UeXBlLAlBX25CZXpEZWZTdGF0dXMsCWZpbkJpVHlwZSk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJ3Y2hhcl90IixUQ0ZfQnVpbHRJblR5cGUsCUFfbkJlekRlZlN0YXR1cywgICAgZmluQmlUeXBlKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInNpemVfdCIsVENGX0J1aWx0SW5UeXBlLAlBX25CZXpEZWZTdGF0dXMsICAgIGZpbkJpVHlwZSk7CgoJLy8gVHlwZSBtb2RpZmllcnMKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInNpZ25lZCIsCVRDRl9UeXBlTW9kaWZpZXIsCUFfbkJlekRlZlN0YXR1cywJZmluVHlwZU1vZGlmaWVyKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oInVuc2lnbmVkIiwJVENGX1R5cGVNb2RpZmllciwJQV9uQmV6RGVmU3RhdHVzLAlmaW5UeXBlTW9kaWZpZXIpOwoKCS8vIFRvIGlnbm9yZQoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiYXV0byIsCQkwLAlBX25CZXpEZWZTdGF0dXMsICAJZmluSWdub3JlKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIl9jZGVjbCIsCTAsCUFfbkJlekRlZlN0YXR1cywJZmluSWdub3JlKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIl9fY2RlY2wiLAkwLAlBX25CZXpEZWZTdGF0dXMsCWZpbklnbm9yZSk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJfX3N0ZGNhbGwiLCAwLAlBX25CZXpEZWZTdGF0dXMsCWZpbklnbm9yZSk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJfX2Zhc3RjYWxsIiwwLAlBX25CZXpEZWZTdGF0dXMsCWZpbklnbm9yZSk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIvKiovIiwJICAgIDAsCUFfbk9wZXJhdG9yRGVmU3RhdHVzLGZpbklnbm9yZSk7CgoJLy8gQ29udGV4dCBjaGFuZ2VycwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiIyIsCQkwLAlBX25PcGVyYXRvckRlZlN0YXR1cywgICBnb3RvUHJlcHJvY2Vzc29yKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIiN1bmRlZiIsMCwJQV9uT3BlcmF0b3JEZWZTdGF0dXMsICAgZ290b1ByZXByb2Nlc3Nvcik7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCIjdW5ibG9jay0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAlBX25PcGVyYXRvckRlZlN0YXR1cywgICBnb3RvVW5ibG9ja01hY3JvKTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi8qIiwJMCwJQV9uT3BlcmF0b3JEZWZTdGF0dXMsCWdvdG9Db21tZW50KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi8vIiwJMCwJQV9uT3BlcmF0b3JEZWZTdGF0dXMsCWdvdG9Db21tZW50KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi8qKiIsICAgMCwJQV9uT3BlcmF0b3JEZWZTdGF0dXMsCWdvdG9Eb2N1KTsKCWFTdGF0ZU1hY2hpbmUuQWRkVG9rZW4oIi8vLyIsICAgMCwJQV9uT3BlcmF0b3JEZWZTdGF0dXMsCWdvdG9Eb2N1KTsKCgkvLyBMaW5lIGVuZHMKCQkvLwlyZWd1bGFyCglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJcclxuIiwJMCwJQV9uT3BlcmF0b3JEZWZTdGF0dXMsCWZpbkVPTCk7CglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJcbiIsCTAsCUFfbk9wZXJhdG9yRGVmU3RhdHVzLAlmaW5FT0wpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiXHIiLCAgICAwLAlBX25PcGVyYXRvckRlZlN0YXR1cywJZmluRU9MKTsKCQkvLwlUbyBpZ25vcmUgaW4gc29tZSBjYXNlcyhtYXkgYmUgb25seSBhdCBwcmVwcm9jZXNzb3I/KSwgYnV0CgkJLy8JCWxpbmVjb3VudCBoYXMgdG8gYmUgaW5jcmVtZW50ZWQuCglhU3RhdGVNYWNoaW5lLkFkZFRva2VuKCJcXFxyXG4iLDAsCUFfbk9wZXJhdG9yRGVmU3RhdHVzLAlmaW5FT0wpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiXFxcbiIsCTAsCUFfbk9wZXJhdG9yRGVmU3RhdHVzLAlmaW5FT0wpOwoJYVN0YXRlTWFjaGluZS5BZGRUb2tlbigiXFxcciIsCTAsCUFfbk9wZXJhdG9yRGVmU3RhdHVzLAlmaW5FT0wpOwp9OwoKCn0gICAvLyBuYW1lc3BhY2UgY3BwCgo=