LyoKICogQ29udGV4dCBhbmQgcmVuZGVyIHRhcmdldCBtYW5hZ2VtZW50IGluIHdpbmVkM2QKICoKICogQ29weXJpZ2h0IDIwMDcgU3RlZmFuIET2c2luZ2VyIGZvciBDb2RlV2VhdmVycwogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxLCBVU0EKICovCgojaW5jbHVkZSAiY29uZmlnLmgiCiNpbmNsdWRlIDxzdGRpby5oPgojaWZkZWYgSEFWRV9GTE9BVF9ICiMgaW5jbHVkZSA8ZmxvYXQuaD4KI2VuZGlmCiNpbmNsdWRlICJ3aW5lZDNkX3ByaXZhdGUuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZCk7CgojZGVmaW5lIEdMSU5GT19MT0NBVElPTiAoKElXaW5lRDNESW1wbCAqKShUaGlzLT53aW5lRDNEKSktPmdsX2luZm8KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDb250ZXh0X01hcmtTdGF0ZURpcnR5CiAqCiAqIE1hcmtzIGEgc3RhdGUgaW4gYSBjb250ZXh0IGRpcnR5LiBPbmx5IG9uZSBjb250ZXh0LCBvcHBvc2VkIHRvCiAqIElXaW5lRDNERGV2aWNlSW1wbF9NYXJrU3RhdGVEaXJ0eSwgd2hpY2ggbWFya3MgdGhlIHN0YXRlIGRpcnR5IGluIGFsbAogKiBjb250ZXh0cwogKgogKiBQYXJhbXM6CiAqICBjb250ZXh0OiBDb250ZXh0IHRvIG1hcmsgdGhlIHN0YXRlIGRpcnR5IGluCiAqICBzdGF0ZTogU3RhdGUgdG8gbWFyayBkaXJ0eQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIENvbnRleHRfTWFya1N0YXRlRGlydHkoV2luZUQzRENvbnRleHQgKmNvbnRleHQsIERXT1JEIHN0YXRlKSB7CiAgICBEV09SRCByZXAgPSBTdGF0ZVRhYmxlW3N0YXRlXS5yZXByZXNlbnRhdGl2ZTsKICAgIERXT1JEIGlkeDsKICAgIEJZVEUgc2hpZnQ7CgogICAgaWYoIXJlcCB8fCBpc1N0YXRlRGlydHkoY29udGV4dCwgcmVwKSkgcmV0dXJuOwoKICAgIGNvbnRleHQtPmRpcnR5QXJyYXlbY29udGV4dC0+bnVtRGlydHlFbnRyaWVzKytdID0gcmVwOwogICAgaWR4ID0gcmVwID4+IDU7CiAgICBzaGlmdCA9IHJlcCAmIDB4MWY7CiAgICBjb250ZXh0LT5pc1N0YXRlRGlydHlbaWR4XSB8PSAoMSA8PCBzaGlmdCk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBBZGRDb250ZXh0VG9BcnJheQogKgogKiBBZGRzIGEgY29udGV4dCB0byB0aGUgY29udGV4dCBhcnJheS4gSGVscGVyIGZ1bmN0aW9uIGZvciBDcmVhdGVDb250ZXh0CiAqCiAqIFRoaXMgbWV0aG9kIGlzIG5vdCBjYWxsZWQgaW4gcGVyZm9ybWFuY2UtY3JpdGljYWwgY29kZSBwYXRocywgb25seSB3aGVuIGEKICogbmV3IHJlbmRlciB0YXJnZXQgb3Igc3dhcGNoYWluIGlzIGNyZWF0ZWQuIFRodXMgcGVyZm9ybWFuY2UgaXMgbm90IGFuIGlzc3VlCiAqIGhlcmUuCiAqCiAqIFBhcmFtczoKICogIFRoaXM6IERldmljZSB0byBhZGQgdGhlIGNvbnRleHQgZm9yCiAqICBkaXNwbGF5OiBYIGRpc3BsYXkgdGhpcyBjb250ZXh0IHVzZXMKICogIGdsQ3R4OiBnbFggY29udGV4dCB0byBhZGQKICogIGRyYXdhYmxlOiBkcmF3YWJsZSB1c2VkIHdpdGggdGhpcyBjb250ZXh0LgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBXaW5lRDNEQ29udGV4dCAqQWRkQ29udGV4dFRvQXJyYXkoSVdpbmVEM0REZXZpY2VJbXBsICpUaGlzLCBEaXNwbGF5ICpkaXNwbGF5LCBHTFhDb250ZXh0IGdsQ3R4LCBEcmF3YWJsZSBkcmF3YWJsZSkgewogICAgV2luZUQzRENvbnRleHQgKipvbGRBcnJheSA9IFRoaXMtPmNvbnRleHRzOwogICAgRFdPUkQgc3RhdGU7CgogICAgVGhpcy0+Y29udGV4dHMgPSBIZWFwQWxsb2MoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgc2l6ZW9mKCpUaGlzLT5jb250ZXh0cykgKiAoVGhpcy0+bnVtQ29udGV4dHMgKyAxKSk7CiAgICBpZihUaGlzLT5jb250ZXh0cyA9PSBOVUxMKSB7CiAgICAgICAgRVJSKCJVbmFibGUgdG8gZ3JvdyB0aGUgY29udGV4dCBhcnJheVxuIik7CiAgICAgICAgVGhpcy0+Y29udGV4dHMgPSBvbGRBcnJheTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KICAgIGlmKG9sZEFycmF5KSB7CiAgICAgICAgbWVtY3B5KFRoaXMtPmNvbnRleHRzLCBvbGRBcnJheSwgc2l6ZW9mKCpUaGlzLT5jb250ZXh0cykgKiBUaGlzLT5udW1Db250ZXh0cyk7CiAgICB9CgogICAgVGhpcy0+Y29udGV4dHNbVGhpcy0+bnVtQ29udGV4dHNdID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihXaW5lRDNEQ29udGV4dCkpOwogICAgaWYoVGhpcy0+Y29udGV4dHNbVGhpcy0+bnVtQ29udGV4dHNdID09IE5VTEwpIHsKICAgICAgICBFUlIoIlVuYWJsZSB0byBhbGxvY2F0ZSBhIG5ldyBjb250ZXh0XG4iKTsKICAgICAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBUaGlzLT5jb250ZXh0cyk7CiAgICAgICAgVGhpcy0+Y29udGV4dHMgPSBvbGRBcnJheTsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBUaGlzLT5jb250ZXh0c1tUaGlzLT5udW1Db250ZXh0c10tPmRpc3BsYXkgPSBkaXNwbGF5OwogICAgVGhpcy0+Y29udGV4dHNbVGhpcy0+bnVtQ29udGV4dHNdLT5nbEN0eCA9IGdsQ3R4OwogICAgVGhpcy0+Y29udGV4dHNbVGhpcy0+bnVtQ29udGV4dHNdLT5kcmF3YWJsZSA9IGRyYXdhYmxlOwogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgb2xkQXJyYXkpOwoKICAgIC8qIE1hcmsgYWxsIHN0YXRlcyBkaXJ0eSB0byBmb3JjZSBhIHByb3BlciBpbml0aWFsaXphdGlvbiBvZiB0aGUgc3RhdGVzIG9uIHRoZSBmaXJzdCB1c2Ugb2YgdGhlIGNvbnRleHQKICAgICAqLwogICAgZm9yKHN0YXRlID0gMDsgc3RhdGUgPD0gU1RBVEVfSElHSEVTVDsgc3RhdGUrKykgewogICAgICAgIENvbnRleHRfTWFya1N0YXRlRGlydHkoVGhpcy0+Y29udGV4dHNbVGhpcy0+bnVtQ29udGV4dHNdLCBzdGF0ZSk7CiAgICB9CgogICAgVGhpcy0+bnVtQ29udGV4dHMrKzsKICAgIFRSQUNFKCJDcmVhdGVkIGNvbnRleHQgJXBcbiIsIFRoaXMtPmNvbnRleHRzW1RoaXMtPm51bUNvbnRleHRzIC0gMV0pOwogICAgcmV0dXJuIFRoaXMtPmNvbnRleHRzW1RoaXMtPm51bUNvbnRleHRzIC0gMV07Cn0KCi8qIFJldHVybnMgYW4gYXJyYXkgb2YgY29tcGF0aWJsZSBGQmNvbmZpZyhzKS4KICogVGhlIGFycmF5IG11c3QgYmUgZnJlZWQgd2l0aCBYRnJlZS4gUmVxdWlyZXMgRU5URVJfR0woKQogKi8Kc3RhdGljIEdMWEZCQ29uZmlnKiBwYnVmZmVyX2ZpbmRfZmJjb25maWdzKAogICAgSVdpbmVEM0REZXZpY2VJbXBsKiBUaGlzLAogICAgSVdpbmVEM0RTdXJmYWNlSW1wbCogUmVuZGVyU3VyZmFjZSwKICAgIERpc3BsYXkgKmRpc3BsYXkpIHsKCiAgICBHTFhGQkNvbmZpZyogY2ZncyA9IE5VTEw7CiAgICBpbnQgbkNmZ3MgPSAwOwogICAgaW50IGF0dHJpYnNbMjU2XTsKICAgIGludCBuQXR0cmlicyA9IDA7CgogICAgSVdpbmVEM0RTdXJmYWNlICpTdGVuY2lsU3VyZmFjZSA9IFRoaXMtPnN0ZW5jaWxCdWZmZXJUYXJnZXQ7CiAgICBXSU5FRDNERk9STUFUIEJhY2tCdWZmZXJGb3JtYXQgPSBSZW5kZXJTdXJmYWNlLT5yZXNvdXJjZS5mb3JtYXQ7CiAgICBXSU5FRDNERk9STUFUIFN0ZW5jaWxCdWZmZXJGb3JtYXQgPSAoTlVMTCAhPSBTdGVuY2lsU3VyZmFjZSkgPyAoKElXaW5lRDNEU3VyZmFjZUltcGwgKikgU3RlbmNpbFN1cmZhY2UpLT5yZXNvdXJjZS5mb3JtYXQgOiAwOwoKICAgIC8qIFRPRE86CiAgICAgKiAgaWYgU3RlbmNpbFN1cmZhY2UgPT0gTlVMTCAmJiB6QnVmZmVyVGFyZ2V0ICE9IE5VTEwgdGhlbiBzd2l0Y2ggdGhlIHpidWZmZXIgb2ZmLAogICAgICogIGl0IFN0ZW5jaWxTdXJmYWNlICE9IE5VTEwgJiYgekJ1ZmZlclRhcmdldCA9PSBOVUxMIHN3aXRjaCBpdCBvbgogICAgICovCgojZGVmaW5lIFBVU0gxKGF0dCkgICAgICAgIGF0dHJpYnNbbkF0dHJpYnMrK10gPSAoYXR0KTsKI2RlZmluZSBQVVNIMihhdHQsdmFsdWUpICBhdHRyaWJzW25BdHRyaWJzKytdID0gKGF0dCk7IGF0dHJpYnNbbkF0dHJpYnMrK10gPSAodmFsdWUpOwoKICAgIC8qIFBVU0gyKEdMWF9CSU5EX1RPX1RFWFRVUkVfUkdCQV9BVEksIFRydWUpOyBleGFtcGxlcyBvZiB0aGlzIGFyZSBmZXcgYW5kIGZhciBiZXR3ZWVuIChidXQgSSd2ZSBnb3QgYSBuaWNlIHdvcmtpbmcgb25lISkqLwoKICAgIFBVU0gyKEdMWF9EUkFXQUJMRV9UWVBFLCBHTFhfUEJVRkZFUl9CSVQpOwogICAgUFVTSDIoR0xYX1hfUkVOREVSQUJMRSwgIFRSVUUpOwogICAgUFVTSDIoR0xYX0RPVUJMRUJVRkZFUiwgIFRSVUUpOwogICAgVFJBQ0UoImNhbGxpbmcgbWFrZWdsY2ZnXG4iKTsKICAgIEQzREZtdE1ha2VHbENmZyhCYWNrQnVmZmVyRm9ybWF0LCBTdGVuY2lsQnVmZmVyRm9ybWF0LCBhdHRyaWJzLCAmbkF0dHJpYnMsIEZBTFNFIC8qIGFsdGVybmF0ZSAqLyk7CiAgICBQVVNIMShOb25lKTsKICAgIFRSQUNFKCJjYWxsaW5nIGNob29zZUZHQ29uZmlnXG4iKTsKICAgIGNmZ3MgPSBnbFhDaG9vc2VGQkNvbmZpZyhkaXNwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRTY3JlZW4oZGlzcGxheSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlicywgJm5DZmdzKTsKICAgIGlmIChjZmdzID09IE5VTEwpIHsKICAgICAgICAvKiBPSyB3ZSBkaWRuJ3QgZmluZCB0aGUgZXhhY3QgY29uZmlnLCBzbyB1c2UgYW55IHJlYXNvbmFibGUgbWF0Y2ggKi8KICAgICAgICAvKiBUT0RPOiBmaWxsIGluIHRoZSAncmVxdWVzdGVkJyBhbmQgJ2N1cnJlbnQnIGRlcHRocywgYW5kIG1ha2Ugc3VyZSB0aGF0J3MKICAgICAgICAgICB3aHkgd2UgZmFpbGVkLiAqLwogICAgICAgIHN0YXRpYyBCT09MIHNob3dfbWVzc2FnZSA9IFRSVUU7CiAgICAgICAgaWYgKHNob3dfbWVzc2FnZSkgewogICAgICAgICAgICBFUlIoIkZhaWxlZCB0byBmaW5kIGV4YWN0IG1hdGNoLCBmaW5kaW5nIGFsdGVybmF0aXZlIGJ1dCB5b3UgbWF5ICIKICAgICAgICAgICAgICAgICJzdWZmZXIgcGVyZm9ybWFuY2UgaXNzdWVzLCB0cnkgY2hhbmdpbmcgeGZyZWUncyBkZXB0aCB0byBtYXRjaCB0aGUgcmVxdWVzdGVkIGRlcHRoXG4iKTsKICAgICAgICAgICAgc2hvd19tZXNzYWdlID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIG5BdHRyaWJzID0gMDsKICAgICAgICBQVVNIMihHTFhfRFJBV0FCTEVfVFlQRSwgR0xYX1BCVUZGRVJfQklUIHwgR0xYX1dJTkRPV19CSVQpOwogICAgICAgIC8qIFBVU0gyKEdMWF9YX1JFTkRFUkFCTEUsICBUUlVFKTsgKi8KICAgICAgICBQVVNIMihHTFhfUkVOREVSX1RZUEUsICAgR0xYX1JHQkFfQklUKTsKICAgICAgICBQVVNIMihHTFhfRE9VQkxFQlVGRkVSLCBGQUxTRSk7CiAgICAgICAgVFJBQ0UoImNhbGxpbmcgbWFrZWdsY2ZnXG4iKTsKICAgICAgICBEM0RGbXRNYWtlR2xDZmcoQmFja0J1ZmZlckZvcm1hdCwgU3RlbmNpbEJ1ZmZlckZvcm1hdCwgYXR0cmlicywgJm5BdHRyaWJzLCBUUlVFIC8qIGFsdGVybmF0ZSAqLyk7CiAgICAgICAgUFVTSDEoTm9uZSk7CiAgICAgICAgY2ZncyA9IGdsWENob29zZUZCQ29uZmlnKGRpc3BsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRTY3JlZW4oZGlzcGxheSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnMsICZuQ2Zncyk7CiAgICB9CgogICAgaWYgKGNmZ3MgPT0gTlVMTCkgewogICAgICAgIEVSUigiQ291bGQgbm90IGdldCBhIHZhbGlkIEZCQ29uZmlnIGZvciAoJXUsJXMpLygldSwlcylcbiIsCiAgICAgICAgICAgIEJhY2tCdWZmZXJGb3JtYXQsIGRlYnVnX2QzZGZvcm1hdChCYWNrQnVmZmVyRm9ybWF0KSwKICAgICAgICAgICAgU3RlbmNpbEJ1ZmZlckZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KFN0ZW5jaWxCdWZmZXJGb3JtYXQpKTsKICAgIH0gZWxzZSB7CiNpZmRlZiBFWFRSQV9UUkFDRVMKICAgICAgICBpbnQgaTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbkNmZ3M7ICsraSkgewogICAgICAgICAgICBUUkFDRSgiZm9yICgldSwlcykvKCV1LCVzKSBmb3VuZCBjb25maWdbJWRdQCVwXG4iLCBCYWNrQnVmZmVyRm9ybWF0LAogICAgICAgICAgICBkZWJ1Z19kM2Rmb3JtYXQoQmFja0J1ZmZlckZvcm1hdCksIFN0ZW5jaWxCdWZmZXJGb3JtYXQsCiAgICAgICAgICAgIGRlYnVnX2QzZGZvcm1hdChTdGVuY2lsQnVmZmVyRm9ybWF0KSwgaSwgY2Znc1tpXSk7CiAgICAgICAgfQojZW5kaWYKICAgIH0KI3VuZGVmIFBVU0gxCiN1bmRlZiBQVVNIMgoKICAgcmV0dXJuIGNmZ3M7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBDcmVhdGVDb250ZXh0CiAqCiAqIENyZWF0ZXMgYSBuZXcgY29udGV4dCBmb3IgYSB3aW5kb3csIG9yIGEgcGJ1ZmZlciBjb250ZXh0LgogKgogKiAqIFBhcmFtczoKICogIFRoaXM6IERldmljZSB0byBhY3RpdmF0ZSB0aGUgY29udGV4dCBmb3IKICogIHRhcmdldDogU3VyZmFjZSB0aGlzIGNvbnRleHQgd2lsbCByZW5kZXIgdG8KICogIGRpc3BsYXk6IFgxMSBjb25uZWN0aW9uCiAqICB3aW46IFRhcmdldCB3aW5kb3cuIE5VTEwgZm9yIGEgcGJ1ZmZlcgogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCldpbmVEM0RDb250ZXh0ICpDcmVhdGVDb250ZXh0KElXaW5lRDNERGV2aWNlSW1wbCAqVGhpcywgSVdpbmVEM0RTdXJmYWNlSW1wbCAqdGFyZ2V0LCBEaXNwbGF5ICpkaXNwbGF5LCBXaW5kb3cgd2luKSB7CiAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IHdpbiwgb2xkRHJhd2FibGU7CiAgICBYVmlzdWFsSW5mbyAqdmlzaW5mbyA9IE5VTEw7CiAgICBHTFhGQkNvbmZpZyAqY2ZncyA9IE5VTEw7CiAgICBHTFhDb250ZXh0IGN0eCA9IE5VTEwsIG9sZEN0eDsKICAgIFdpbmVEM0RDb250ZXh0ICpyZXQgPSBOVUxMOwoKICAgIFRSQUNFKCIoJXApOiBDcmVhdGluZyBhICVzIGNvbnRleHQgZm9yIHJlbmRlciB0YXJnZXQgJXBcbiIsIFRoaXMsIHdpbiA/ICJvbnNjcmVlbiIgOiAib2Zmc2NyZWVuIiwgdGFyZ2V0KTsKCiAgICBpZighd2luKSB7CiAgICAgICAgaW50IGF0dHJpYnNbMjU2XTsKICAgICAgICBpbnQgbkF0dHJpYnMgPSAwOwoKICAgICAgICBUUkFDRSgiQ3JlYXRpbmcgYSBwQnVmZmVyIGRyYXdhYmxlIGZvciB0aGUgbmV3IGNvbnRleHRcbiIpOwoKICAgICAgICBjZmdzID0gcGJ1ZmZlcl9maW5kX2ZiY29uZmlncyhUaGlzLCB0YXJnZXQsIGRpc3BsYXkpOwogICAgICAgIGlmKCFjZmdzKSB7CiAgICAgICAgICAgIEVSUigiQ2Fubm90IGZpbmQgYSBmcmFtZSBidWZmZXIgY29uZmlndXJhdGlvbiBmb3IgdGhlIHBidWZmZXJcbiIpOwogICAgICAgICAgICBnb3RvIG91dDsKICAgICAgICB9CgogICAgICAgIGF0dHJpYnNbbkF0dHJpYnMrK10gPSBHTFhfUEJVRkZFUl9XSURUSDsKICAgICAgICBhdHRyaWJzW25BdHRyaWJzKytdID0gdGFyZ2V0LT5jdXJyZW50RGVzYy5XaWR0aDsKICAgICAgICBhdHRyaWJzW25BdHRyaWJzKytdID0gR0xYX1BCVUZGRVJfSEVJR0hUOwogICAgICAgIGF0dHJpYnNbbkF0dHJpYnMrK10gPSB0YXJnZXQtPmN1cnJlbnREZXNjLkhlaWdodDsKICAgICAgICBhdHRyaWJzW25BdHRyaWJzKytdID0gTm9uZTsKCiAgICAgICAgdmlzaW5mbyA9IGdsWEdldFZpc3VhbEZyb21GQkNvbmZpZyhkaXNwbGF5LCBjZmdzWzBdKTsKICAgICAgICBpZighdmlzaW5mbykgewogICAgICAgICAgICBFUlIoIkNhbm5vdCBmaW5kIGEgdmlzdWFsIGZvciB0aGUgcGJ1ZmZlclxuIik7CiAgICAgICAgICAgIGdvdG8gb3V0OwogICAgICAgIH0KCiAgICAgICAgZHJhd2FibGUgPSBnbFhDcmVhdGVQYnVmZmVyKGRpc3BsYXksIGNmZ3NbMF0sIGF0dHJpYnMpOwoKICAgICAgICBpZighZHJhd2FibGUpIHsKICAgICAgICAgICAgRVJSKCJDYW5ub3QgY3JlYXRlIGEgcGJ1ZmZlclxuIik7CiAgICAgICAgICAgIGdvdG8gb3V0OwogICAgICAgIH0KICAgICAgICBYRnJlZShjZmdzKTsKICAgICAgICBjZmdzID0gTlVMTDsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogQ3JlYXRlIGFuIG9uc2NyZWVuIHRhcmdldCAqLwogICAgICAgIFhWaXN1YWxJbmZvICAgICAgICAgICAgIHRlbXBsYXRlOwogICAgICAgIGludCAgICAgICAgICAgICAgICAgICAgIG51bTsKCiAgICAgICAgdGVtcGxhdGUudmlzdWFsaWQgPSAoVmlzdWFsSUQpR2V0UHJvcEEoR2V0RGVza3RvcFdpbmRvdygpLCAiX193aW5lX3gxMV92aXN1YWxfaWQiKTsKICAgICAgICAvKiBUT0RPOiBjaGFuZ2UgdGhpcyB0byBmaW5kIGEgc2ltaWxhciB2aXN1YWwsIGJ1dCBvbmUgd2l0aCBhIHN0ZW5jaWwvemJ1ZmZlciBidWZmZXIgdGhhdCBtYXRjaGVzIHRoZSByZXF1ZXN0CiAgICAgICAgKG9yIHRoZSBiZXN0IHBvc3NpYmxlIGlmIG5vbmUgaXMgcmVxdWVzdGVkKSAqLwogICAgICAgIFRSQUNFKCJGb3VuZCB4IHZpc3VhbCBJRCAgOiAlbGRcbiIsIHRlbXBsYXRlLnZpc3VhbGlkKTsKICAgICAgICB2aXNpbmZvICAgPSBYR2V0VmlzdWFsSW5mbyhkaXNwbGF5LCBWaXN1YWxJRE1hc2ssICZ0ZW1wbGF0ZSwgJm51bSk7CgogICAgICAgIGlmIChOVUxMID09IHZpc2luZm8pIHsKICAgICAgICAgICAgRVJSKCJjYW5ub3QgcmVhbGx5IGdldCBYVmlzdWFsXG4iKTsKICAgICAgICAgICAgZ290byBvdXQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaW50IG4sIHZhbHVlOwogICAgICAgICAgICAvKiBXcml0ZSBvdXQgc29tZSBkZWJ1ZyBpbmZvIGFib3V0IHRoZSB2aXN1YWwvcyAqLwogICAgICAgICAgICBUUkFDRSgiVXNpbmcgeCB2aXN1YWwgSUQgIDogJWxkXG4iLCB0ZW1wbGF0ZS52aXN1YWxpZCk7CiAgICAgICAgICAgIFRSQUNFKCIgICAgICAgIHZpc3VhbCBpbmZvOiAlcFxuIiwgdmlzaW5mbyk7CiAgICAgICAgICAgIFRSQUNFKCIgICAgICAgIG51bSBpdGVtcyAgOiAlZFxuIiwgbnVtKTsKICAgICAgICAgICAgZm9yIChuID0gMDtuIDwgbnVtOyBuKyspIHsKICAgICAgICAgICAgICAgIFRSQUNFKCI9PT09PWl0ZW09PT09PTogJWRcbiIsIG4gKyAxKTsKICAgICAgICAgICAgICAgIFRSQUNFKCIgICB2aXN1YWxpZCAgICAgIDogJWxkXG4iLCB2aXNpbmZvW25dLnZpc3VhbGlkKTsKICAgICAgICAgICAgICAgIFRSQUNFKCIgICBzY3JlZW4gICAgICAgIDogJWRcbiIsICB2aXNpbmZvW25dLnNjcmVlbik7CiAgICAgICAgICAgICAgICBUUkFDRSgiICAgZGVwdGggICAgICAgICA6ICV1XG4iLCAgdmlzaW5mb1tuXS5kZXB0aCk7CiAgICAgICAgICAgICAgICBUUkFDRSgiICAgY2xhc3MgICAgICAgICA6ICVkXG4iLCAgdmlzaW5mb1tuXS5jbGFzcyk7CiAgICAgICAgICAgICAgICBUUkFDRSgiICAgcmVkX21hc2sgICAgICA6ICVsZFxuIiwgdmlzaW5mb1tuXS5yZWRfbWFzayk7CiAgICAgICAgICAgICAgICBUUkFDRSgiICAgZ3JlZW5fbWFzayAgICA6ICVsZFxuIiwgdmlzaW5mb1tuXS5ncmVlbl9tYXNrKTsKICAgICAgICAgICAgICAgIFRSQUNFKCIgICBibHVlX21hc2sgICAgIDogJWxkXG4iLCB2aXNpbmZvW25dLmJsdWVfbWFzayk7CiAgICAgICAgICAgICAgICBUUkFDRSgiICAgY29sb3JtYXBfc2l6ZSA6ICVkXG4iLCAgdmlzaW5mb1tuXS5jb2xvcm1hcF9zaXplKTsKICAgICAgICAgICAgICAgIFRSQUNFKCIgICBiaXRzX3Blcl9yZ2IgIDogJWRcbiIsICB2aXNpbmZvW25dLmJpdHNfcGVyX3JnYik7CiAgICAgICAgICAgICAgICAvKiBsb2cgc29tZSBleHRyYSBnbHggaW5mbyAqLwogICAgICAgICAgICAgICAgZ2xYR2V0Q29uZmlnKGRpc3BsYXksIHZpc2luZm8sIEdMWF9BVVhfQlVGRkVSUywgJnZhbHVlKTsKICAgICAgICAgICAgICAgIFRSQUNFKCIgICBnbF9hdXhfYnVmZmVycyAgOiAlZFxuIiwgIHZhbHVlKTsKICAgICAgICAgICAgICAgIGdsWEdldENvbmZpZyhkaXNwbGF5LCB2aXNpbmZvLCBHTFhfQlVGRkVSX1NJWkUgLCZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBUUkFDRSgiICAgZ2xfYnVmZmVyX3NpemUgIDogJWRcbiIsICB2YWx1ZSk7CiAgICAgICAgICAgICAgICBnbFhHZXRDb25maWcoZGlzcGxheSwgdmlzaW5mbywgR0xYX1JFRF9TSVpFLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgVFJBQ0UoIiAgIGdsX3JlZF9zaXplICA6ICVkXG4iLCAgdmFsdWUpOwogICAgICAgICAgICAgICAgZ2xYR2V0Q29uZmlnKGRpc3BsYXksIHZpc2luZm8sIEdMWF9HUkVFTl9TSVpFLCAmdmFsdWUpOwogICAgICAgICAgICAgICAgVFJBQ0UoIiAgIGdsX2dyZWVuX3NpemUgIDogJWRcbiIsICB2YWx1ZSk7CiAgICAgICAgICAgICAgICBnbFhHZXRDb25maWcoZGlzcGxheSwgdmlzaW5mbywgR0xYX0JMVUVfU0laRSwgJnZhbHVlKTsKICAgICAgICAgICAgICAgIFRSQUNFKCIgICBnbF9ibHVlX3NpemUgIDogJWRcbiIsICB2YWx1ZSk7CiAgICAgICAgICAgICAgICBnbFhHZXRDb25maWcoZGlzcGxheSwgdmlzaW5mbywgR0xYX0FMUEhBX1NJWkUsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBUUkFDRSgiICAgZ2xfYWxwaGFfc2l6ZSAgOiAlZFxuIiwgIHZhbHVlKTsKICAgICAgICAgICAgICAgIGdsWEdldENvbmZpZyhkaXNwbGF5LCB2aXNpbmZvLCBHTFhfREVQVEhfU0laRSAsJnZhbHVlKTsKICAgICAgICAgICAgICAgIFRSQUNFKCIgICBnbF9kZXB0aF9zaXplICA6ICVkXG4iLCAgdmFsdWUpOwogICAgICAgICAgICAgICAgZ2xYR2V0Q29uZmlnKGRpc3BsYXksIHZpc2luZm8sIEdMWF9TVEVOQ0lMX1NJWkUsICZ2YWx1ZSk7CiAgICAgICAgICAgICAgICBUUkFDRSgiICAgZ2xfc3RlbmNpbF9zaXplIDogJWRcbiIsICB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogTm93IGNob29zZSBhIHNpbWlsYXIgdmlzdWFsIElEKi8KICAgICAgICB9CiAgICB9CgogICAgY3R4ID0gZ2xYQ3JlYXRlQ29udGV4dChkaXNwbGF5LCB2aXNpbmZvLAogICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5udW1Db250ZXh0cyA/IFRoaXMtPmNvbnRleHRzWzBdLT5nbEN0eCA6IE5VTEwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMX1RSVUUpOwogICAgaWYoIWN0eCkgewogICAgICAgIEVSUigiRmFpbGVkIHRvIGNyZWF0ZSBhIGdsWCBjb250ZXh0XG4iKTsKICAgICAgICBpZihkcmF3YWJsZSAhPSB3aW4pIGdsWERlc3Ryb3lQYnVmZmVyKGRpc3BsYXksIGRyYXdhYmxlKTsKICAgICAgICBnb3RvIG91dDsKICAgIH0KICAgIHJldCA9IEFkZENvbnRleHRUb0FycmF5KFRoaXMsIGRpc3BsYXksIGN0eCwgZHJhd2FibGUpOwogICAgaWYoIXJldCkgewogICAgICAgIEVSUigiRmFpbGVkIHRvIGFkZCB0aGUgbmV3bHkgY3JlYXRlZCBjb250ZXh0IHRvIHRoZSBjb250ZXh0IGxpc3RcbiIpOwogICAgICAgIGdsWERlc3Ryb3lDb250ZXh0KGRpc3BsYXksIGN0eCk7CiAgICAgICAgaWYoZHJhd2FibGUgIT0gd2luKSBnbFhEZXN0cm95UGJ1ZmZlcihkaXNwbGF5LCBkcmF3YWJsZSk7CiAgICAgICAgZ290byBvdXQ7CiAgICB9CiAgICByZXQtPnN1cmZhY2UgPSAoSVdpbmVEM0RTdXJmYWNlICopIHRhcmdldDsKICAgIHJldC0+aXNQQnVmZmVyID0gd2luID09IDA7CgogICAgVFJBQ0UoIlN1Y2Nlc3NmdWxseSBjcmVhdGVkIG5ldyBjb250ZXh0ICVwXG4iLCByZXQpOwoKICAgIC8qIFNldCB1cCB0aGUgY29udGV4dCBkZWZhdWx0cyAqLwogICAgb2xkQ3R4ICA9IGdsWEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICBvbGREcmF3YWJsZSA9IGdsWEdldEN1cnJlbnREcmF3YWJsZSgpOwogICAgaWYoZ2xYTWFrZUN1cnJlbnQoZGlzcGxheSwgZHJhd2FibGUsIGN0eCkgPT0gRkFMU0UpIHsKICAgICAgICBFUlIoIkNhbm5vdCBhY3RpdmF0ZSBjb250ZXh0IHRvIHNldCB1cCBkZWZhdWx0c1xuIik7CiAgICAgICAgZ290byBvdXQ7CiAgICB9CgogICAgVFJBQ0UoIlNldHRpbmcgdXAgdGhlIHNjcmVlblxuIik7CiAgICAvKiBDbGVhciB0aGUgc2NyZWVuICovCiAgICBnbENsZWFyQ29sb3IoMS4wLCAwLjAsIDAuMCwgMC4wKTsKICAgIGNoZWNrR0xjYWxsKCJnbENsZWFyQ29sb3IiKTsKICAgIGdsQ2xlYXJJbmRleCgwKTsKICAgIGdsQ2xlYXJEZXB0aCgxKTsKICAgIGdsQ2xlYXJTdGVuY2lsKDB4ZmZmZik7CgogICAgY2hlY2tHTGNhbGwoImdsQ2xlYXIiKTsKCiAgICBnbENvbG9yM2YoMS4wLCAxLjAsIDEuMCk7CiAgICBjaGVja0dMY2FsbCgiZ2xDb2xvcjNmIik7CgogICAgZ2xFbmFibGUoR0xfTElHSFRJTkcpOwogICAgY2hlY2tHTGNhbGwoImdsRW5hYmxlIik7CgogICAgZ2xMaWdodE1vZGVsaShHTF9MSUdIVF9NT0RFTF9MT0NBTF9WSUVXRVIsIEdMX1RSVUUpOwogICAgY2hlY2tHTGNhbGwoImdsTGlnaHRNb2RlbGkoR0xfTElHSFRfTU9ERUxfTE9DQUxfVklFV0VSLCBHTF9UUlVFKTsiKTsKCiAgICBnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0NPTUJJTkVfRVhUKTsKICAgIGNoZWNrR0xjYWxsKCJnbFRleEVudmYoR0xfVEVYVFVSRV9FTlYsIEdMX1RFWFRVUkVfRU5WX01PREUsIEdMX0NPTUJJTkVfRVhUKTsiKTsKCiAgICBnbExpZ2h0TW9kZWxpKEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0wsIEdMX1NFUEFSQVRFX1NQRUNVTEFSX0NPTE9SKTsKICAgIGNoZWNrR0xjYWxsKCJnbExpZ2h0TW9kZWxpKEdMX0xJR0hUX01PREVMX0NPTE9SX0NPTlRST0wsIEdMX1NFUEFSQVRFX1NQRUNVTEFSX0NPTE9SKTsiKTsKCiAgICBnbFBpeGVsU3RvcmVpKEdMX1BBQ0tfQUxJR05NRU5ULCBTVVJGQUNFX0FMSUdOTUVOVCk7CiAgICBjaGVja0dMY2FsbCgiZ2xQaXhlbFN0b3JlaShHTF9QQUNLX0FMSUdOTUVOVCwgU1VSRkFDRV9BTElHTk1FTlQpOyIpOwogICAgZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBTVVJGQUNFX0FMSUdOTUVOVCk7CiAgICBjaGVja0dMY2FsbCgiZ2xQaXhlbFN0b3JlaShHTF9VTlBBQ0tfQUxJR05NRU5ULCBTVVJGQUNFX0FMSUdOTUVOVCk7Iik7CgogICAgaWYoR0xfU1VQUE9SVChBUFBMRV9DTElFTlRfU1RPUkFHRSkpIHsKICAgICAgICAvKiBNb3N0IHRleHR1cmVzIHdpbGwgdXNlIGNsaWVudCBzdG9yYWdlIGlmIHN1cHBvcnRlZC4gRXhjZXB0aW9ucyBhcmUgbm9uLW5hdGl2ZSBwb3dlciBvZiAyIHRleHR1cmVzCiAgICAgICAgICogYW5kIHRleHR1cmVzIGluIERJQiBzZWN0aW9ucyhkdWUgdG8gdGhlIG1lbW9yeSBwcm90ZWN0aW9uKS4KICAgICAgICAgKi8KICAgICAgICBnbFBpeGVsU3RvcmVpKEdMX1VOUEFDS19DTElFTlRfU1RPUkFHRV9BUFBMRSwgR0xfVFJVRSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsUGl4ZWxTdG9yZWkoR0xfVU5QQUNLX0NMSUVOVF9TVE9SQUdFX0FQUExFLCBHTF9UUlVFKSIpOwogICAgfQogICAgaWYoR0xfU1VQUE9SVChBUkJfVkVSVEVYX0JMRU5EKSkgewogICAgICAgIC8qIERpcmVjdDNEIGFsd2F5cyB1c2VzIG4tMSB3ZWlnaHRzIGZvciBuIHdvcmxkIG1hdHJpY2VzIGFuZCB1c2VzIDEgLSBzdW0gZm9yIHRoZSBsYXN0IG9uZQogICAgICAgICAqIHRoaXMgaXMgZXF1YWwgdG8gR0xfV0VJR0hUX1NVTV9VTklUWV9BUkIuIEVuYWJsaW5nIGl0IGRvZXNuJ3QgZG8gYW55dGhpbmcgdW5sZXNzCiAgICAgICAgICogR0xfVkVSVEVYX0JMRU5EX0FSQiBpc24ndCBlbmFibGVkIHRvbwogICAgICAgICAqLwogICAgICAgIGdsRW5hYmxlKEdMX1dFSUdIVF9TVU1fVU5JVFlfQVJCKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfV0VJR0hUX1NVTV9VTklUWV9BUkIpIik7CiAgICB9CiAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikpIHsKICAgICAgICBpbnQgczsKCiAgICAgICAgZ2xFbmFibGUoR0xfVEVYVFVSRV9TSEFERVJfTlYpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbEVuYWJsZShHTF9URVhUVVJFX1NIQURFUl9OVikiKTsKCiAgICAgICAgLyogU2V0IHVwIHRoZSBwcmV2aW91cyB0ZXh0dXJlIGlucHV0IGZvciBhbGwgc2hhZGVyIHVuaXRzLiBUaGlzIGFwcGxpZXMgdG8gYnVtcCBtYXBwaW5nLCBhbmQgaW4gZDNkCiAgICAgICAgICogdGhlIHByZXZpb3VzIHRleHR1cmUgd2hlcmUgdG8gc291cmNlIHRoZSBvZmZzZXQgZnJvbSBpcyBhbHdheXMgdW5pdCAtIDEuCiAgICAgICAgICovCiAgICAgICAgZm9yKHMgPSAxOyBzIDwgR0xfTElNSVRTKHRleHR1cmVzKTsgcysrKSB7CiAgICAgICAgICAgIEdMX0VYVENBTEwoZ2xBY3RpdmVUZXh0dXJlQVJCKEdMX1RFWFRVUkUwX0FSQiArIHMpKTsKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfU0hBREVSX05WLCBHTF9QUkVWSU9VU19URVhUVVJFX0lOUFVUX05WLCBHTF9URVhUVVJFMF9BUkIgKyBzIC0gMSk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEVudmkoR0xfVEVYVFVSRV9TSEFERVJfTlYsIEdMX1BSRVZJT1VTX1RFWFRVUkVfSU5QVVRfTlYsIC4uLlxuIik7CiAgICAgICAgfQogICAgfQoKICAgIGlmKG9sZERyYXdhYmxlICYmIG9sZEN0eCkgewogICAgICAgIGdsWE1ha2VDdXJyZW50KGRpc3BsYXksIG9sZERyYXdhYmxlLCBvbGRDdHgpOwogICAgfQoKb3V0OgogICAgaWYodmlzaW5mbykgWEZyZWUodmlzaW5mbyk7CiAgICBpZihjZmdzKSBYRnJlZShjZmdzKTsKICAgIHJldHVybiByZXQ7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBSZW1vdmVDb250ZXh0RnJvbUFycmF5CiAqCiAqIFJlbW92ZXMgYSBjb250ZXh0IGZyb20gdGhlIGNvbnRleHQgbWFuYWdlci4gVGhlIG9wZW5nbCBjb250ZXh0IGlzIG5vdAogKiBkZXN0cm95ZWQgb3IgdW5zZXQuIGNvbnRleHQgaXMgbm90IGEgdmFsaWQgcG9pbnRlciBhZnRlciB0aGF0IGNhbGwuCiAqCiAqIFNpbWlsYXIgdG8gdGhlIGZvcm1lciBjYWxsIHRoaXMgaXNuJ3QgYSBwZXJmb3JtYW5jZSBjcml0aWNhbCBmdW5jdGlvbi4gQQogKiBoZWxwZXIgZnVuY3Rpb24gZm9yIERlc3Ryb3lDb250ZXh0LgogKgogKiBQYXJhbXM6CiAqICBUaGlzOiBEZXZpY2UgdG8gYWN0aXZhdGUgdGhlIGNvbnRleHQgZm9yCiAqICBjb250ZXh0OiBDb250ZXh0IHRvIHJlbW92ZQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyB2b2lkIFJlbW92ZUNvbnRleHRGcm9tQXJyYXkoSVdpbmVEM0REZXZpY2VJbXBsICpUaGlzLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewogICAgVUlOVCB0LCBzOwogICAgV2luZUQzRENvbnRleHQgKipvbGRBcnJheSA9IFRoaXMtPmNvbnRleHRzOwoKICAgIFRSQUNFKCJSZW1vdmluZyBjdHggJXBcbiIsIGNvbnRleHQpOwoKICAgIFRoaXMtPm51bUNvbnRleHRzLS07CgogICAgaWYoVGhpcy0+bnVtQ29udGV4dHMpIHsKICAgICAgICBUaGlzLT5jb250ZXh0cyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCAwLCBzaXplb2YoKlRoaXMtPmNvbnRleHRzKSAqIFRoaXMtPm51bUNvbnRleHRzKTsKICAgICAgICBpZighVGhpcy0+Y29udGV4dHMpIHsKICAgICAgICAgICAgRVJSKCJDYW5ub3QgYWxsb2NhdGUgYSBuZXcgY29udGV4dCBhcnJheSwgUEFOSUMhISFcbiIpOwogICAgICAgIH0KICAgICAgICB0ID0gMDsKICAgICAgICBmb3IocyA9IDA7IHMgPCBUaGlzLT5udW1Db250ZXh0czsgcysrKSB7CiAgICAgICAgICAgIGlmKG9sZEFycmF5W3NdID09IGNvbnRleHQpIGNvbnRpbnVlOwogICAgICAgICAgICBUaGlzLT5jb250ZXh0c1t0XSA9IG9sZEFycmF5W3NdOwogICAgICAgICAgICB0Kys7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICBUaGlzLT5jb250ZXh0cyA9IE5VTEw7CiAgICB9CgogICAgSGVhcEZyZWUoR2V0UHJvY2Vzc0hlYXAoKSwgMCwgY29udGV4dCk7CiAgICBIZWFwRnJlZShHZXRQcm9jZXNzSGVhcCgpLCAwLCBvbGRBcnJheSk7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiBEZXN0cm95Q29udGV4dAogKgogKiBEZXN0cm95cyBhIHdpbmVEM0RDb250ZXh0CiAqCiAqIFBhcmFtczoKICogIFRoaXM6IERldmljZSB0byBhY3RpdmF0ZSB0aGUgY29udGV4dCBmb3IKICogIGNvbnRleHQ6IENvbnRleHQgdG8gZGVzdHJveQogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgRGVzdHJveUNvbnRleHQoSVdpbmVEM0REZXZpY2VJbXBsICpUaGlzLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCkgewoKICAgIC8qIGNoZWNrIHRoYXQgd2UgYXJlIHRoZSBjdXJyZW50IGNvbnRleHQgZmlyc3QgKi8KICAgIFRSQUNFKCJEZXN0cm95aW5nIGN0eCAlcFxuIiwgY29udGV4dCk7CiAgICBpZihnbFhHZXRDdXJyZW50Q29udGV4dCgpID09IGNvbnRleHQtPmdsQ3R4KXsKICAgICAgICBnbFhNYWtlQ3VycmVudChjb250ZXh0LT5kaXNwbGF5LCBOb25lLCBOVUxMKTsKICAgIH0KCiAgICBnbFhEZXN0cm95Q29udGV4dChjb250ZXh0LT5kaXNwbGF5LCBjb250ZXh0LT5nbEN0eCk7CiAgICBpZihjb250ZXh0LT5pc1BCdWZmZXIpIHsKICAgICAgICBnbFhEZXN0cm95UGJ1ZmZlcihjb250ZXh0LT5kaXNwbGF5LCBjb250ZXh0LT5kcmF3YWJsZSk7CiAgICB9CiAgICBSZW1vdmVDb250ZXh0RnJvbUFycmF5KFRoaXMsIGNvbnRleHQpOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogU2V0dXBGb3JCbGl0CiAqCiAqIFNldHMgdXAgYSBjb250ZXh0IGZvciBEaXJlY3REcmF3IGJsaXR0aW5nLgogKiBBbGwgdGV4dHVyZSB1bml0cyBhcmUgZGlzYWJsZWQsIGV4Y2VwdCB1bml0IDAKICogVGV4dHVyZSB1bml0IDAgaXMgYWN0aXZ0ZWQgd2hlcmUgR0xfVEVYVFVSRV8yRCBpcyBhY3RpdmF0ZWQKICogZm9nLCBsaWdodGluZywgYmxlbmRpbmcsIGFscGhhIHRlc3QsIHogdGVzdCwgc2Npc3NvciB0ZXN0LCBjdWxsaW5nIGRpYWJsZWQKICogY29sb3Igd3JpdGluZyBlbmFibGVkIGZvciBhbGwgY2hhbm5lbHMKICogcmVnaXN0ZXIgY29tYmluZXJzIGRpc2FibGVkLCBzaGFkZXJzIGRpc2FibGVkCiAqIHdvcmxkIG1hdHJpcyBpcyBzZXQgdG8gaWRlbnRpdHksIHRleHR1cmUgbWF0cml4IDAgdG9vCiAqIHByb2plY3Rpb24gbWF0cml4IGlzIHNldHVwIGZvciBkcmF3aW5nIHNjcmVlbiBjb29yZGluYXRlcwogKgogKiBQYXJhbXM6CiAqICBUaGlzOiBEZXZpY2UgdG8gYWN0aXZhdGUgdGhlIGNvbnRleHQgZm9yCiAqICBjb250ZXh0OiBDb250ZXh0IHRvIHNldHVwCiAqICB3aWR0aDogcmVuZGVyIHRhcmdldCB3aWR0aAogKiAgaGVpZ2h0OiByZW5kZXIgdGFyZ2V0IGhlaWdodAogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnN0YXRpYyBpbmxpbmUgdm9pZCBTZXR1cEZvckJsaXQoSVdpbmVEM0REZXZpY2VJbXBsICpUaGlzLCBXaW5lRDNEQ29udGV4dCAqY29udGV4dCwgVUlOVCB3aWR0aCwgVUlOVCBoZWlnaHQpIHsKICAgIGludCBpOwoKICAgIFRSQUNFKCJTZXR0aW5nIHVwIGNvbnRleHQgJXAgZm9yIGJsaXR0aW5nXG4iLCBjb250ZXh0KTsKICAgIGlmKGNvbnRleHQtPmxhc3Rfd2FzX2JsaXQpIHsKICAgICAgICBUUkFDRSgiQ29udGV4dCBpcyBhbHJlYWR5IHNldCB1cCBmb3IgYmxpdHRpbmcsIG5vdGhpbmcgdG8gZG9cbiIpOwogICAgICAgIHJldHVybjsKICAgIH0KICAgIGNvbnRleHQtPmxhc3Rfd2FzX2JsaXQgPSBUUlVFOwoKICAgIC8qIFRPRE86IFVzZSBhIGRpc3BsYXkgbGlzdCAqLwoKICAgIC8qIERpc2FibGUgc2hhZGVycyAqLwogICAgVGhpcy0+c2hhZGVyX2JhY2tlbmQtPnNoYWRlcl9jbGVhbnVwKChJV2luZUQzRERldmljZSAqKSBUaGlzKTsKICAgIENvbnRleHRfTWFya1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVlNIQURFUik7CiAgICBDb250ZXh0X01hcmtTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1BJWEVMU0hBREVSKTsKCiAgICAvKiBEaXNhYmxlIGFsbCB0ZXh0dXJlcy4gVGhlIGNhbGxlciBjYW4gdGhlbiBiaW5kIGEgdGV4dHVyZSBpdCB3YW50cyB0byBibGl0CiAgICAgKiBmcm9tCiAgICAgKi8KICAgIGlmKEdMX1NVUFBPUlQoTlZfUkVHSVNURVJfQ09NQklORVJTKSkgewogICAgICAgIGdsRGlzYWJsZShHTF9SRUdJU1RFUl9DT01CSU5FUlNfTlYpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfUkVHSVNURVJfQ09NQklORVJTX05WKSIpOwogICAgfQogICAgaWYgKEdMX1NVUFBPUlQoQVJCX01VTFRJVEVYVFVSRSkpIHsKICAgICAgICAvKiBUaGUgYmxpdHRpbmcgY29kZSB1c2VzIChmb3Igbm93KSB0aGUgZml4ZWQgZnVuY3Rpb24gcGlwZWxpbmUsIHNvIG1ha2Ugc3VyZSB0byByZXNldCBhbGwgZml4ZWQKICAgICAgICAgKiBmdW5jdGlvbiB0ZXh0dXJlIHVuaXQuIE5vIG5lZWQgdG8gY2FyZSBmb3IgaGlnaGVyIHNhbXBsZXJzCiAgICAgICAgICovCiAgICAgICAgZm9yKGkgPSBHTF9MSU1JVFModGV4dHVyZXMpIC0gMTsgaSA+IDAgOyBpLS0pIHsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEFjdGl2ZVRleHR1cmVBUkIoR0xfVEVYVFVSRTBfQVJCICsgaSkpOwogICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xBY3RpdmVUZXh0dXJlQVJCIik7CgogICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0NVQkVfTUFQKSkgewogICAgICAgICAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfQ1VCRV9NQVBfQVJCKTsKICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8zRCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfVEVYVFVSRV8zRCIpOwogICAgICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV8yRCk7CiAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfVEVYVFVSRV8yRCIpOwoKICAgICAgICAgICAgZ2xUZXhFbnZpKEdMX1RFWFRVUkVfRU5WLCBHTF9URVhUVVJFX0VOVl9NT0RFLCBHTF9SRVBMQUNFKTsKICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7Iik7CgogICAgICAgICAgICBDb250ZXh0X01hcmtTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RFWFRVUkVTVEFHRShpLCBXSU5FRDNEVFNTX0NPTE9ST1ApKTsKICAgICAgICAgICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9TQU1QTEVSKGkpKTsKICAgICAgICB9CiAgICAgICAgR0xfRVhUQ0FMTChnbEFjdGl2ZVRleHR1cmVBUkIoR0xfVEVYVFVSRTBfQVJCKSk7CiAgICAgICAgY2hlY2tHTGNhbGwoImdsQWN0aXZlVGV4dHVyZUFSQiIpOwogICAgfQogICAgaWYoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9DVUJFX01BUCkpIHsKICAgICAgICBnbERpc2FibGUoR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIpOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfVEVYVFVSRV9DVUJFX01BUF9BUkIiKTsKICAgIH0KICAgIGdsRGlzYWJsZShHTF9URVhUVVJFXzNEKTsKICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfVEVYVFVSRV8zRCIpOwogICAgZ2xFbmFibGUoR0xfVEVYVFVSRV8yRCk7CiAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUgR0xfVEVYVFVSRV8yRCIpOwoKICAgIGdsVGV4RW52aShHTF9URVhUVVJFX0VOViwgR0xfVEVYVFVSRV9FTlZfTU9ERSwgR0xfUkVQTEFDRSk7CgogICAgZ2xNYXRyaXhNb2RlKEdMX1RFWFRVUkUpOwogICAgY2hlY2tHTGNhbGwoImdsTWF0cml4TW9kZShHTF9URVhUVVJFKSIpOwogICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgIGNoZWNrR0xjYWxsKCJnbExvYWRJZGVudGl0eSgpIik7CiAgICBDb250ZXh0X01hcmtTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1RSQU5TRk9STShXSU5FRDNEVFNfVEVYVFVSRTApKTsKCiAgICBpZiAoR0xfU1VQUE9SVChFWFRfVEVYVFVSRV9MT0RfQklBUykpIHsKICAgICAgICBnbFRleEVudmYoR0xfVEVYVFVSRV9GSUxURVJfQ09OVFJPTF9FWFQsCiAgICAgICAgICAgICAgICAgIEdMX1RFWFRVUkVfTE9EX0JJQVNfRVhULAogICAgICAgICAgICAgICAgICAwLjApOwogICAgICAgIGNoZWNrR0xjYWxsKCJnbFRleEVudmkgR0xfVEVYVFVSRV9MT0RfQklBU19FWFQgLi4uIik7CiAgICB9CiAgICBDb250ZXh0X01hcmtTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1NBTVBMRVIoMCkpOwogICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9URVhUVVJFU1RBR0UoMCwgV0lORUQzRFRTU19DT0xPUk9QKSk7CgogICAgLyogT3RoZXIgbWlzYyBzdGF0ZXMgKi8KICAgIGdsRGlzYWJsZShHTF9BTFBIQV9URVNUKTsKICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUoR0xfQUxQSEFfVEVTVCkiKTsKICAgIENvbnRleHRfTWFya1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19BTFBIQVRFU1RFTkFCTEUpKTsKICAgIGdsRGlzYWJsZShHTF9MSUdIVElORyk7CiAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlIEdMX0xJR0hUSU5HIik7CiAgICBDb250ZXh0X01hcmtTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfTElHSFRJTkcpKTsKICAgIGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKTsKICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfREVQVEhfVEVTVCIpOwogICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9SRU5ERVIoV0lORUQzRFJTX1pFTkFCTEUpKTsKICAgIGdsRGlzYWJsZShHTF9GT0cpOwogICAgY2hlY2tHTGNhbGwoImdsRGlzYWJsZSBHTF9GT0ciKTsKICAgIENvbnRleHRfTWFya1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19GT0dFTkFCTEUpKTsKICAgIGdsRGlzYWJsZShHTF9CTEVORCk7CiAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlIEdMX0JMRU5EIik7CiAgICBDb250ZXh0X01hcmtTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfQUxQSEFCTEVOREVOQUJMRSkpOwogICAgZ2xEaXNhYmxlKEdMX0NVTExfRkFDRSk7CiAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlIEdMX0NVTExfRkFDRSIpOwogICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NVTExNT0RFKSk7CiAgICBnbERpc2FibGUoR0xfU1RFTkNJTF9URVNUKTsKICAgIGNoZWNrR0xjYWxsKCJnbERpc2FibGUgR0xfU1RFTkNJTF9URVNUIik7CiAgICBDb250ZXh0X01hcmtTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfU1RFTkNJTEVOQUJMRSkpOwogICAgaWYoR0xfU1VQUE9SVChBUkJfUE9JTlRfU1BSSVRFKSkgewogICAgICAgIGdsRGlzYWJsZShHTF9QT0lOVF9TUFJJVEVfQVJCKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlIEdMX1BPSU5UX1NQUklURV9BUkIiKTsKICAgICAgICBDb250ZXh0X01hcmtTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1JFTkRFUihXSU5FRDNEUlNfUE9JTlRTUFJJVEVFTkFCTEUpKTsKICAgIH0KICAgIGdsQ29sb3JNYXNrKEdMX1RSVUUsIEdMX1RSVUUsR0xfVFJVRSxHTF9UUlVFKTsKICAgIGNoZWNrR0xjYWxsKCJnbENvbG9yTWFzayIpOwogICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9SRU5ERVIoV0lORUQzRFJTX0NMSVBQSU5HKSk7CgogICAgLyogU2V0dXAgdHJhbnNmb3JtcyAqLwogICAgZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVyk7CiAgICBjaGVja0dMY2FsbCgiZ2xNYXRyaXhNb2RlKEdMX01PREVMVklFVykiKTsKICAgIGdsTG9hZElkZW50aXR5KCk7CiAgICBjaGVja0dMY2FsbCgiZ2xMb2FkSWRlbnRpdHkoKSIpOwogICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1dPUkxETUFUUklYKDApKSk7CgogICAgZ2xNYXRyaXhNb2RlKEdMX1BST0pFQ1RJT04pOwogICAgY2hlY2tHTGNhbGwoImdsTWF0cml4TW9kZShHTF9QUk9KRUNUSU9OKSIpOwogICAgZ2xMb2FkSWRlbnRpdHkoKTsKICAgIGNoZWNrR0xjYWxsKCJnbExvYWRJZGVudGl0eSgpIik7CiAgICBnbE9ydGhvKDAsIHdpZHRoLCBoZWlnaHQsIDAsIDAuMCwgLTEuMCk7CiAgICBjaGVja0dMY2FsbCgiZ2xPcnRobyIpOwogICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9UUkFOU0ZPUk0oV0lORUQzRFRTX1BST0pFQ1RJT04pKTsKCiAgICBjb250ZXh0LT5sYXN0X3dhc19yaHcgPSBUUlVFOwogICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9WREVDTCk7IC8qIGJlY2F1c2Ugb2YgbGFzdF93YXNfcmh3ID0gVFJVRSAqLwoKICAgIGdsRGlzYWJsZShHTF9DTElQX1BMQU5FMCk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSAwKSIpOwogICAgZ2xEaXNhYmxlKEdMX0NMSVBfUExBTkUxKTsgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShjbGlwIHBsYW5lIDEpIik7CiAgICBnbERpc2FibGUoR0xfQ0xJUF9QTEFORTIpOyBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKGNsaXAgcGxhbmUgMikiKTsKICAgIGdsRGlzYWJsZShHTF9DTElQX1BMQU5FMyk7IGNoZWNrR0xjYWxsKCJnbERpc2FibGUoY2xpcCBwbGFuZSAzKSIpOwogICAgZ2xEaXNhYmxlKEdMX0NMSVBfUExBTkU0KTsgY2hlY2tHTGNhbGwoImdsRGlzYWJsZShjbGlwIHBsYW5lIDQpIik7CiAgICBnbERpc2FibGUoR0xfQ0xJUF9QTEFORTUpOyBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKGNsaXAgcGxhbmUgNSkiKTsKICAgIENvbnRleHRfTWFya1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfUkVOREVSKFdJTkVEM0RSU19DTElQUElORykpOwoKICAgIGdsVmlld3BvcnQoMCwgMCwgd2lkdGgsIGhlaWdodCk7CiAgICBjaGVja0dMY2FsbCgiZ2xWaWV3cG9ydCIpOwogICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9WSUVXUE9SVCk7CgogICAgaWYoR0xfU1VQUE9SVChOVl9URVhUVVJFX1NIQURFUjIpKSB7CiAgICAgICAgZ2xEaXNhYmxlKEdMX1RFWFRVUkVfU0hBREVSX05WKTsKICAgICAgICBjaGVja0dMY2FsbCgiZ2xEaXNhYmxlKEdMX1RFWFRVUkVfU0hBREVSX05WKSIpOwogICAgfQp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogQWN0aXZhdGVDb250ZXh0CiAqCiAqIEZpbmRzIGEgcmVuZGVyaW5nIGNvbnRleHQgYW5kIGRyYXdhYmxlIG1hdGNoaW5nIHRoZSBkZXZpY2UgYW5kIHJlbmRlcgogKiB0YXJnZXQgZm9yIHRoZSBjdXJyZW50IHRocmVhZCwgYWN0aXZhdGVzIHRoZW0gYW5kIHB1dHMgdGhlbSBpbnRvIHRoZQogKiByZXF1ZXN0ZWQgc3RhdGUuCiAqCiAqIFBhcmFtczoKICogIFRoaXM6IERldmljZSB0byBhY3RpdmF0ZSB0aGUgY29udGV4dCBmb3IKICogIHRhcmdldDogUmVxdWVzdGVkIHJlbmRlciB0YXJnZXQKICogIHVzYWdlOiBQcmVwYXJlcyB0aGUgY29udGV4dCBmb3IgYmxpdHRpbmcsIGRyYXdpbmcgb3Igb3RoZXIgYWN0aW9ucwogKgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCnZvaWQgQWN0aXZhdGVDb250ZXh0KElXaW5lRDNERGV2aWNlSW1wbCAqVGhpcywgSVdpbmVEM0RTdXJmYWNlICp0YXJnZXQsIENvbnRleHRVc2FnZSB1c2FnZSkgewogICAgRFdPUkQgdGlkID0gVGhpcy0+Y3JlYXRlUGFybXMuQmVoYXZpb3JGbGFncyAmIFdJTkVEM0RDUkVBVEVfTVVMVElUSFJFQURFRCA/IEdldEN1cnJlbnRUaHJlYWRJZCgpIDogMDsKICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgIGk7CiAgICBEV09SRCAgICAgICAgICAgICAgICAgICAgICAgICBkaXJ0eVN0YXRlLCBpZHg7CiAgICBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICBzaGlmdDsKICAgIFdpbmVEM0RDb250ZXh0ICAgICAgICAgICAgICAgICpjb250ZXh0ID0gVGhpcy0+YWN0aXZlQ29udGV4dDsKICAgIEJPT0wgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFJlbmRlck9mZnNjcmVlbiA9IFRoaXMtPnJlbmRlcl9vZmZzY3JlZW47CgogICAgVFJBQ0UoIiglcCk6IFNlbGVjdGluZyBjb250ZXh0IGZvciByZW5kZXIgdGFyZ2V0ICVwLCB0aHJlYWQgJWRcbiIsIFRoaXMsIHRhcmdldCwgdGlkKTsKCiAgICBpZihUaGlzLT5sYXN0QWN0aXZlUmVuZGVyVGFyZ2V0ICE9IHRhcmdldCkgewogICAgICAgIElXaW5lRDNEU3dhcENoYWluICpzd2FwY2hhaW4gPSBOVUxMOwogICAgICAgIEhSRVNVTFQgaHI7CiAgICAgICAgQk9PTCByZWFkVGV4dHVyZSA9IHdpbmVkM2Rfc2V0dGluZ3Mub2Zmc2NyZWVuX3JlbmRlcmluZ19tb2RlICE9IE9STV9GQk8gJiYgVGhpcy0+cmVuZGVyX29mZnNjcmVlbjsKCiAgICAgICAgaHIgPSBJV2luZUQzRFN1cmZhY2VfR2V0Q29udGFpbmVyKHRhcmdldCwgJklJRF9JV2luZUQzRFN3YXBDaGFpbiwgKHZvaWQgKiopICZzd2FwY2hhaW4pOwogICAgICAgIGlmKGhyID09IFdJTkVEM0RfT0sgJiYgc3dhcGNoYWluKSB7CiAgICAgICAgICAgIFRSQUNFKCJSZW5kZXJpbmcgb25zY3JlZW5cbiIpOwogICAgICAgICAgICBjb250ZXh0ID0gKChJV2luZUQzRFN3YXBDaGFpbkltcGwgKikgc3dhcGNoYWluKS0+Y29udGV4dFswXTsKICAgICAgICAgICAgVGhpcy0+cmVuZGVyX29mZnNjcmVlbiA9IEZBTFNFOwogICAgICAgICAgICAvKiBUaGUgY29udGV4dCAhPSBUaGlzLT5hY3RpdmVDb250ZXh0IHdpbGwgY2F0Y2ggYSBOT1AgY29udGV4dCBjaGFuZ2UuIFRoaXMgY2FuIG9jY3VyCiAgICAgICAgICAgICAqIGlmIHdlIGFyZSBzd2l0Y2hpbmcgYmFjayB0byBzd2FwY2hhaW4gcmVuZGVyaW5nIGluIGNhc2Ugb2YgRkJPIG9yIEJhY2sgQnVmZmVyIG9mZnNjcmVlbgogICAgICAgICAgICAgKiByZW5kZXJpbmcuIE5vIGNvbnRleHQgY2hhbmdlIGlzIG5lZWRlZCBpbiB0aGF0IGNhc2UKICAgICAgICAgICAgICovCgogICAgICAgICAgICBpZiAod2luZWQzZF9zZXR0aW5ncy5vZmZzY3JlZW5fcmVuZGVyaW5nX21vZGUgPT0gT1JNX0JBQ0tCVUZGRVIpIHsKICAgICAgICAgICAgICAgIGlmKCgoSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICopIHN3YXBjaGFpbiktPmJhY2tCdWZmZXIpIHsKICAgICAgICAgICAgICAgICAgICBnbERyYXdCdWZmZXIoR0xfQkFDSyk7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tHTGNhbGwoImdsRHJhd0J1ZmZlcihHTF9CQUNLKSIpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBnbERyYXdCdWZmZXIoR0xfRlJPTlQpOwogICAgICAgICAgICAgICAgICAgIGNoZWNrR0xjYWxsKCJnbERyYXdCdWZmZXIoR0xfRlJPTlQpIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgSVdpbmVEM0RTd2FwQ2hhaW5fUmVsZWFzZShzd2FwY2hhaW4pOwoKICAgICAgICAgICAgaWYob2xkUmVuZGVyT2Zmc2NyZWVuKSB7CiAgICAgICAgICAgICAgICBDb250ZXh0X01hcmtTdGF0ZURpcnR5KGNvbnRleHQsIFdJTkVEM0RSU19DVUxMTU9ERSk7CiAgICAgICAgICAgICAgICBDb250ZXh0X01hcmtTdGF0ZURpcnR5KGNvbnRleHQsIFdJTkVEM0RUU19QUk9KRUNUSU9OKTsKICAgICAgICAgICAgICAgIENvbnRleHRfTWFya1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVkRFQ0wpOwogICAgICAgICAgICAgICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBTVEFURV9WSUVXUE9SVCk7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBUUkFDRSgiUmVuZGVyaW5nIG9mZnNjcmVlblxuIik7CiAgICAgICAgICAgIFRoaXMtPnJlbmRlcl9vZmZzY3JlZW4gPSBUUlVFOwoKICAgICAgICAgICAgc3dpdGNoKHdpbmVkM2Rfc2V0dGluZ3Mub2Zmc2NyZWVuX3JlbmRlcmluZ19tb2RlKSB7CiAgICAgICAgICAgICAgICBjYXNlIE9STV9GQk86CiAgICAgICAgICAgICAgICAgICAgLyogRkJPcyBkbyBub3QgbmVlZCBhIGRpZmZlcmVudCBjb250ZXh0LiBTdGF5IHdpdGggd2hhdGV2ZXIgY29udGV4dCBpcyBhY3RpdmUgYXQgdGhlIG1vbWVudCAqLwogICAgICAgICAgICAgICAgICAgIGlmKFRoaXMtPmFjdGl2ZUNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IFRoaXMtPmFjdGl2ZUNvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBtYXkgaGFwcGVuIGlmIHRoZSBhcHAganVtcHMgc3RyZWlnaHQgaW50byBvZmZzY3JlZW4gcmVuZGVyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAqIFN0YXJ0IHVzaW5nIHRoZSBjb250ZXh0IG9mIHRoZSBwcmltYXJ5IHN3YXBjaGFpbgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9ICgoSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICopIFRoaXMtPnN3YXBjaGFpbnNbMF0pLT5jb250ZXh0WzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKCiAgICAgICAgICAgICAgICBjYXNlIE9STV9QQlVGRkVSOgogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZUltcGwgKnRhcmdldGltcGwgPSAoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSB0YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgaWYoVGhpcy0+cGJ1ZmZlckNvbnRleHQgPT0gTlVMTCB8fAogICAgICAgICAgICAgICAgICAgICAgIFRoaXMtPnBidWZmZXJXaWR0aCA8IHRhcmdldGltcGwtPmN1cnJlbnREZXNjLldpZHRoIHx8CiAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+cGJ1ZmZlckhlaWdodCA8IHRhcmdldGltcGwtPmN1cnJlbnREZXNjLkhlaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZihUaGlzLT5wYnVmZmVyQ29udGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzdHJveUNvbnRleHQoVGhpcywgVGhpcy0+cGJ1ZmZlckNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgZGlzcGxheSBpcyBpcnJlbGV2YW50IGhlcmUsIHRoZSB3aW5kb3cgaXMgMC4gQnV0IENyZWF0ZUNvbnRleHQgbmVlZHMgYSB2YWxpZCBYIGNvbm5lY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAqIENyZWF0ZSB0aGUgY29udGV4dCBvbiB0aGUgc2FtZSBzZXJ2ZXIgYXMgdGhlIHByaW1hcnkgc3dhcGNoYWluLiBUaGUgcHJpbWFyeSBzd2FwY2hhaW4gaXMgZXhpc3RzIGF0IHRoaXMgcG9pbnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5wYnVmZmVyQ29udGV4dCA9IENyZWF0ZUNvbnRleHQoVGhpcywgdGFyZ2V0aW1wbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICopIFRoaXMtPnN3YXBjaGFpbnNbMF0pLT5jb250ZXh0WzBdLT5kaXNwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBXaW5kb3cgKi8pOwogICAgICAgICAgICAgICAgICAgICAgICBUaGlzLT5wYnVmZmVyV2lkdGggPSB0YXJnZXRpbXBsLT5jdXJyZW50RGVzYy5XaWR0aDsKICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+cGJ1ZmZlckhlaWdodCA9IHRhcmdldGltcGwtPmN1cnJlbnREZXNjLkhlaWdodDsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmKFRoaXMtPnBidWZmZXJDb250ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQgPSBUaGlzLT5wYnVmZmVyQ29udGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgRVJSKCJGYWlsZWQgdG8gY3JlYXRlIGEgYnVmZmVyIGNvbnRleHQgYW5kIGRyYXdhYmxlLCBmYWxsaW5nIGJhY2sgdG8gYmFjayBidWZmZXIgb2Zmc2NyZWVuIHJlbmRlcmluZ1xuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmVkM2Rfc2V0dGluZ3Mub2Zmc2NyZWVuX3JlbmRlcmluZ19tb2RlID0gT1JNX0JBQ0tCVUZGRVI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGNhc2UgT1JNX0JBQ0tCVUZGRVI6CiAgICAgICAgICAgICAgICAgICAgLyogU3RheSB3aXRoIHRoZSBjdXJyZW50bHkgYWN0aXZlIGNvbnRleHQgZm9yIGJhY2sgYnVmZmVyIHJlbmRlcmluZyAqLwogICAgICAgICAgICAgICAgICAgIGlmKFRoaXMtPmFjdGl2ZUNvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IFRoaXMtPmFjdGl2ZUNvbnRleHQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBtYXkgaGFwcGVuIGlmIHRoZSBhcHAganVtcHMgc3RyZWlnaHQgaW50byBvZmZzY3JlZW4gcmVuZGVyaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAqIFN0YXJ0IHVzaW5nIHRoZSBjb250ZXh0IG9mIHRoZSBwcmltYXJ5IHN3YXBjaGFpbgogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9ICgoSVdpbmVEM0RTd2FwQ2hhaW5JbXBsICopIFRoaXMtPnN3YXBjaGFpbnNbMF0pLT5jb250ZXh0WzBdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBnbERyYXdCdWZmZXIoVGhpcy0+b2Zmc2NyZWVuQnVmZmVyKTsKICAgICAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xEcmF3QnVmZmVyKFRoaXMtPm9mZnNjcmVlbkJ1ZmZlcikiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKHdpbmVkM2Rfc2V0dGluZ3Mub2Zmc2NyZWVuX3JlbmRlcmluZ19tb2RlICE9IE9STV9GQk8pIHsKICAgICAgICAgICAgICAgIC8qIE1ha2Ugc3VyZSB3ZSBoYXZlIGEgT3BlbkdMIHRleHR1cmUgbmFtZSBzbyB0aGUgUHJlTG9hZCgpIHVzZWQgdG8gcmVhZCB0aGUgYnVmZmVyCiAgICAgICAgICAgICAgICAgKiBiYWNrIHdoZW4gd2UgYXJlIGRvbmUgd29uJ3QgbWFyayB1cyBkaXJ0eS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgSVdpbmVEM0RTdXJmYWNlX1ByZUxvYWQodGFyZ2V0KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYoIW9sZFJlbmRlck9mZnNjcmVlbikgewogICAgICAgICAgICAgICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBXSU5FRDNEUlNfQ1VMTE1PREUpOwogICAgICAgICAgICAgICAgQ29udGV4dF9NYXJrU3RhdGVEaXJ0eShjb250ZXh0LCBXSU5FRDNEVFNfUFJPSkVDVElPTik7CiAgICAgICAgICAgICAgICBDb250ZXh0X01hcmtTdGF0ZURpcnR5KGNvbnRleHQsIFNUQVRFX1ZERUNMKTsKICAgICAgICAgICAgICAgIENvbnRleHRfTWFya1N0YXRlRGlydHkoY29udGV4dCwgU1RBVEVfVklFV1BPUlQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChyZWFkVGV4dHVyZSkgewogICAgICAgICAgICBCT09MIG9sZEluRHJhdyA9IFRoaXMtPmlzSW5EcmF3OwoKICAgICAgICAgICAgLyogUHJlTG9hZCByZXF1aXJlcyBhIGNvbnRleHQgdG8gbG9hZCB0aGUgdGV4dHVyZSwgdGh1cyBpdCB3aWxsIGNhbGwgQWN0aXZhdGVDb250ZXh0LgogICAgICAgICAgICAgKiBTZXQgdGhlIGlzSW5EcmF3IHRvIHRydWUgdG8gc2lnbmFsIFByZUxvYWQgdGhhdCBpdCBoYXMgYSBjb250ZXh0LiBXaWxsIGJlIHRyaWNreQogICAgICAgICAgICAgKiB3aGVuIHVzaW5nIG9mZnNjcmVlbiByZW5kZXJpbmcgd2l0aCBtdWx0aXRocmVhZGluZwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgVGhpcy0+aXNJbkRyYXcgPSBUUlVFOwoKICAgICAgICAgICAgLyogRG8gdGhhdCBiZWZvcmUgc3dpdGNoaW5nIHRoZSBjb250ZXh0OgogICAgICAgICAgICAgKiBSZWFkIHRoZSBiYWNrIGJ1ZmZlciBvZiB0aGUgb2xkIGRyYXdhYmxlIGludG8gdGhlIGRlc3RpbmF0aW9uIHRleHR1cmUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIElXaW5lRDNEU3VyZmFjZV9QcmVMb2FkKFRoaXMtPmxhc3RBY3RpdmVSZW5kZXJUYXJnZXQpOwoKICAgICAgICAgICAgLyogQXNzdW1lIHRoYXQgdGhlIGRyYXdhYmxlIHdpbGwgYmUgbW9kaWZpZWQgYnkgc29tZSBvdGhlciB0aGluZ3Mgbm93ICovCiAgICAgICAgICAgICgoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKSBUaGlzLT5sYXN0QWN0aXZlUmVuZGVyVGFyZ2V0KS0+RmxhZ3MgJj0gflNGTEFHX0lORFJBV0FCTEU7CgogICAgICAgICAgICBUaGlzLT5pc0luRHJhdyA9IG9sZEluRHJhdzsKICAgICAgICB9CiAgICAgICAgVGhpcy0+bGFzdEFjdGl2ZVJlbmRlclRhcmdldCA9IHRhcmdldDsKICAgICAgICBpZihvbGRSZW5kZXJPZmZzY3JlZW4gIT0gVGhpcy0+cmVuZGVyX29mZnNjcmVlbiAmJiBUaGlzLT5kZXB0aF9jb3B5X3N0YXRlICE9IFdJTkVEM0RfRENTX05PX0NPUFkpIHsKICAgICAgICAgICAgVGhpcy0+ZGVwdGhfY29weV9zdGF0ZSA9IFdJTkVEM0RfRENTX0NPUFk7CiAgICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgICAvKiBTdGljayB0byB0aGUgb2xkIGNvbnRleHQgKi8KICAgICAgICBjb250ZXh0ID0gVGhpcy0+YWN0aXZlQ29udGV4dDsKICAgIH0KCiAgICAvKiBBY3RpdmF0ZSB0aGUgb3BlbmdsIGNvbnRleHQgKi8KICAgIGlmKGNvbnRleHQgIT0gVGhpcy0+YWN0aXZlQ29udGV4dCkgewogICAgICAgIEJvb2wgcmV0OwogICAgICAgIFRSQUNFKCJTd2l0Y2hpbmcgZ2wgY3R4IHRvICVwLCBkcmF3YWJsZT0lbGQsIGN0eD0lcFxuIiwgY29udGV4dCwgY29udGV4dC0+ZHJhd2FibGUsIGNvbnRleHQtPmdsQ3R4KTsKICAgICAgICByZXQgPSBnbFhNYWtlQ3VycmVudChjb250ZXh0LT5kaXNwbGF5LCBjb250ZXh0LT5kcmF3YWJsZSwgY29udGV4dC0+Z2xDdHgpOwogICAgICAgIGlmKHJldCA9PSBGQUxTRSkgewogICAgICAgICAgICBFUlIoIkZhaWxlZCB0byBhY3RpdmF0ZSB0aGUgbmV3IGNvbnRleHRcbiIpOwogICAgICAgIH0KICAgICAgICBUaGlzLT5hY3RpdmVDb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBzd2l0Y2godXNhZ2UpIHsKICAgICAgICBjYXNlIENUWFVTQUdFX1JFU09VUkNFTE9BRDoKICAgICAgICAgICAgLyogVGhpcyBkb2VzIG5vdCByZXF1aXJlIGFueSBzcGVjaWFsIHN0YXRlcyB0byBiZSBzZXQgdXAgKi8KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQ1RYVVNBR0VfRFJBV1BSSU06CiAgICAgICAgICAgIC8qIFRoaXMgbmVlZHMgYWxsIGRpcnR5IHN0YXRlcyBhcHBsaWVkICovCiAgICAgICAgICAgIGlmKGNvbnRleHQtPmxhc3Rfd2FzX2JsaXQgJiYgR0xfU1VQUE9SVChOVl9URVhUVVJFX1NIQURFUjIpKSB7CiAgICAgICAgICAgICAgICBnbEVuYWJsZShHTF9URVhUVVJFX1NIQURFUl9OVik7CiAgICAgICAgICAgICAgICBjaGVja0dMY2FsbCgiZ2xFbmFibGUoR0xfVEVYVFVSRV9TSEFERVJfTlYpIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yKGk9MDsgaSA8IGNvbnRleHQtPm51bURpcnR5RW50cmllczsgaSsrKSB7CiAgICAgICAgICAgICAgICBkaXJ0eVN0YXRlID0gY29udGV4dC0+ZGlydHlBcnJheVtpXTsKICAgICAgICAgICAgICAgIGlkeCA9IGRpcnR5U3RhdGUgPj4gNTsKICAgICAgICAgICAgICAgIHNoaWZ0ID0gZGlydHlTdGF0ZSAmIDB4MWY7CiAgICAgICAgICAgICAgICBjb250ZXh0LT5pc1N0YXRlRGlydHlbaWR4XSAmPSB+KDEgPDwgc2hpZnQpOwogICAgICAgICAgICAgICAgU3RhdGVUYWJsZVtkaXJ0eVN0YXRlXS5hcHBseShkaXJ0eVN0YXRlLCBUaGlzLT5zdGF0ZUJsb2NrLCBjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250ZXh0LT5udW1EaXJ0eUVudHJpZXMgPSAwOyAvKiBUaGlzIG1ha2VzIHRoZSB3aG9sZSBsaXN0IGNsZWFuICovCiAgICAgICAgICAgIGNvbnRleHQtPmxhc3Rfd2FzX2JsaXQgPSBGQUxTRTsKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgQ1RYVVNBR0VfQkxJVDoKICAgICAgICAgICAgU2V0dXBGb3JCbGl0KFRoaXMsIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAoKElXaW5lRDNEU3VyZmFjZUltcGwgKil0YXJnZXQpLT5jdXJyZW50RGVzYy5XaWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICgoSVdpbmVEM0RTdXJmYWNlSW1wbCAqKXRhcmdldCktPmN1cnJlbnREZXNjLkhlaWdodCk7CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBGSVhNRSgiVW5leHBlY3RlZCBjb250ZXh0IHVzYWdlIHJlcXVlc3RlZFxuIik7CiAgICB9Cn0K