LyoKICogSVdpbmVEM0QgaW1wbGVtZW50YXRpb24KICoKICogQ29weXJpZ2h0IDIwMDItMjAwNCBKYXNvbiBFZG1lYWRlcwogKiBDb3B5cmlnaHQgMjAwMy0yMDA0IFJhcGhhZWwgSnVucXVlaXJhCiAqIENvcHlyaWdodCAyMDA0IENocmlzdGlhbiBDb3N0YQogKiBDb3B5cmlnaHQgMjAwNSBPbGl2ZXIgU3RpZWJlcgogKiBDb3B5cmlnaHQgMjAwNy0yMDA4IFN0ZWZhbiBE9nNpbmdlciBmb3IgQ29kZVdlYXZlcnMKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1MSBGcmFua2xpbiBTdCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSwgVVNBCiAqLwoKLyogQ29tcGlsZSB0aW1lIGRpYWdub3N0aWNzOiAqLwoKI2lmbmRlZiBERUJVR19TSU5HTEVfTU9ERQovKiBTZXQgdG8gMSB0byBmb3JjZSBvbmx5IGEgc2luZ2xlIGRpc3BsYXkgbW9kZSB0byBiZSBleHBvc2VkOiAqLwojZGVmaW5lIERFQlVHX1NJTkdMRV9NT0RFIDAKI2VuZGlmCgoKI2luY2x1ZGUgImNvbmZpZy5oIgojaW5jbHVkZSA8YXNzZXJ0Lmg+CiNpbmNsdWRlICJ3aW5lZDNkX3ByaXZhdGUuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKGQzZCk7CldJTkVfREVDTEFSRV9ERUJVR19DSEFOTkVMKGQzZF9jYXBzKTsKCi8qIFRoZSBkM2QgZGV2aWNlIElEICovCnN0YXRpYyBjb25zdCBHVUlEIElJRF9EM0RERVZJQ0VfRDNEVUlEID0geyAweGFlYjJjZGQ0LCAweDZlNDEsIDB4NDNlYSwgeyAweDk0LDB4MWMsMHg4MywweDYxLDB4Y2MsMHg3NiwweDA3LDB4ODEgfSB9OwoKLyogRXh0ZW5zaW9uIGRldGVjdGlvbiAqLwpzdGF0aWMgY29uc3Qgc3RydWN0IHsKICAgIGNvbnN0IGNoYXIgKmV4dGVuc2lvbl9zdHJpbmc7CiAgICBHTF9TdXBwb3J0ZWRFeHQgZXh0ZW5zaW9uOwogICAgRFdPUkQgdmVyc2lvbjsKfSBFWFRFTlNJT05fTUFQW10gPSB7CiAgICAvKiBBUFBMRSAqLwogICAgeyJHTF9BUFBMRV9jbGllbnRfc3RvcmFnZSIsICAgICAgICAgICAgIEFQUExFX0NMSUVOVF9TVE9SQUdFLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FQUExFX2ZlbmNlIiwgICAgICAgICAgICAgICAgICAgICAgQVBQTEVfRkVOQ0UsICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVBQTEVfZmx1c2hfcmVuZGVyIiwgICAgICAgICAgICAgICBBUFBMRV9GTFVTSF9SRU5ERVIsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUFBMRV95Y2Jjcl80MjIiLCAgICAgICAgICAgICAgICAgIEFQUExFX1lDQkNSXzQyMiwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FQUExFX2Zsb2F0X3BpeGVscyIsICAgICAgICAgICAgICAgQVBQTEVfRkxPQVRfUElYRUxTLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAvKiBBVEkgKi8KICAgIHsiR0xfQVRJX3NlcGFyYXRlX3N0ZW5jaWwiLCAgICAgICAgICAgICBBVElfU0VQQVJBVEVfU1RFTkNJTCwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BVElfdGV4dHVyZV9lbnZfY29tYmluZTMiLCAgICAgICAgIEFUSV9URVhUVVJFX0VOVl9DT01CSU5FMywgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FUSV90ZXh0dXJlX21pcnJvcl9vbmNlIiwgICAgICAgICAgQVRJX1RFWFRVUkVfTUlSUk9SX09OQ0UsICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVRJX2Vudm1hcF9idW1wbWFwIiwgICAgICAgICAgICAgICBBVElfRU5WTUFQX0JVTVBNQVAsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BVElfZnJhZ21lbnRfc2hhZGVyIiwgICAgICAgICAgICAgIEFUSV9GUkFHTUVOVF9TSEFERVIsICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCgogICAgLyogQVJCICovCiAgICB7IkdMX0FSQl9kcmF3X2J1ZmZlcnMiLCAgICAgICAgICAgICAgICAgQVJCX0RSQVdfQlVGRkVSUywgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX2ZyYWdtZW50X3Byb2dyYW0iLCAgICAgICAgICAgICBBUkJfRlJBR01FTlRfUFJPR1JBTSwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfZnJhZ21lbnRfc2hhZGVyIiwgICAgICAgICAgICAgIEFSQl9GUkFHTUVOVF9TSEFERVIsICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl9oYWxmX2Zsb2F0X3BpeGVsIiwgICAgICAgICAgICAgQVJCX0hBTEZfRkxPQVRfUElYRUwsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX2ltYWdpbmciLCAgICAgICAgICAgICAgICAgICAgICBBUkJfSU1BR0lORywgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfbXVsdGlzYW1wbGUiLCAgICAgICAgICAgICAgICAgIEFSQl9NVUxUSVNBTVBMRSwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIC8qIG5lZWRzIEdMWF9BUkJfTVVMVElTQU1QTEUgYXMgd2VsbCAqLwogICAgeyJHTF9BUkJfbXVsdGl0ZXh0dXJlIiwgICAgICAgICAgICAgICAgIEFSQl9NVUxUSVRFWFRVUkUsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl9vY2NsdXNpb25fcXVlcnkiLCAgICAgICAgICAgICAgQVJCX09DQ0xVU0lPTl9RVUVSWSwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3BpeGVsX2J1ZmZlcl9vYmplY3QiLCAgICAgICAgICBBUkJfUElYRUxfQlVGRkVSX09CSkVDVCwgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfcG9pbnRfcGFyYW1ldGVycyIsICAgICAgICAgICAgIEFSQl9QT0lOVF9QQVJBTUVURVJTLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl9wb2ludF9zcHJpdGUiLCAgICAgICAgICAgICAgICAgQVJCX1BPSU5UX1NQUklURSwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3RleHR1cmVfYm9yZGVyX2NsYW1wIiwgICAgICAgICBBUkJfVEVYVFVSRV9CT1JERVJfQ0xBTVAsICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfdGV4dHVyZV9jb21wcmVzc2lvbiIsICAgICAgICAgIEFSQl9URVhUVVJFX0NPTVBSRVNTSU9OLCAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl90ZXh0dXJlX2N1YmVfbWFwIiwgICAgICAgICAgICAgQVJCX1RFWFRVUkVfQ1VCRV9NQVAsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3RleHR1cmVfZW52X2FkZCIsICAgICAgICAgICAgICBBUkJfVEVYVFVSRV9FTlZfQURELCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfdGV4dHVyZV9lbnZfY29tYmluZSIsICAgICAgICAgIEFSQl9URVhUVVJFX0VOVl9DT01CSU5FLCAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl90ZXh0dXJlX2Vudl9kb3QzIiwgICAgICAgICAgICAgQVJCX1RFWFRVUkVfRU5WX0RPVDMsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3RleHR1cmVfZmxvYXQiLCAgICAgICAgICAgICAgICBBUkJfVEVYVFVSRV9GTE9BVCwgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfdGV4dHVyZV9taXJyb3JlZF9yZXBlYXQiLCAgICAgIEFSQl9URVhUVVJFX01JUlJPUkVEX1JFUEVBVCwgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl90ZXh0dXJlX25vbl9wb3dlcl9vZl90d28iLCAgICAgQVJCX1RFWFRVUkVfTk9OX1BPV0VSX09GX1RXTywgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3RleHR1cmVfcmVjdGFuZ2xlIiwgICAgICAgICAgICBBUkJfVEVYVFVSRV9SRUNUQU5HTEUsICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfdmVydGV4X2JsZW5kIiwgICAgICAgICAgICAgICAgIEFSQl9WRVJURVhfQkxFTkQsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl92ZXJ0ZXhfYnVmZmVyX29iamVjdCIsICAgICAgICAgQVJCX1ZFUlRFWF9CVUZGRVJfT0JKRUNULCAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfQVJCX3ZlcnRleF9wcm9ncmFtIiwgICAgICAgICAgICAgICBBUkJfVkVSVEVYX1BST0dSQU0sICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9BUkJfdmVydGV4X3NoYWRlciIsICAgICAgICAgICAgICAgIEFSQl9WRVJURVhfU0hBREVSLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0FSQl9zaGFkZXJfb2JqZWN0cyIsICAgICAgICAgICAgICAgQVJCX1NIQURFUl9PQkpFQ1RTLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAvKiBFWFQgKi8KICAgIHsiR0xfRVhUX2JsZW5kX2NvbG9yIiwgICAgICAgICAgICAgICAgICBFWFRfQkxFTkRfQ09MT1IsICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfYmxlbmRfbWlubWF4IiwgICAgICAgICAgICAgICAgIEVYVF9CTEVORF9NSU5NQVgsICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF9ibGVuZF9lcXVhdGlvbl9zZXBhcmF0ZSIsICAgICAgRVhUX0JMRU5EX0VRVUFUSU9OX1NFUEFSQVRFLCAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX2JsZW5kX2Z1bmNfc2VwYXJhdGUiLCAgICAgICAgICBFWFRfQkxFTkRfRlVOQ19TRVBBUkFURSwgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfZm9nX2Nvb3JkIiwgICAgICAgICAgICAgICAgICAgIEVYVF9GT0dfQ09PUkQsICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF9mcmFtZWJ1ZmZlcl9ibGl0IiwgICAgICAgICAgICAgRVhUX0ZSQU1FQlVGRkVSX0JMSVQsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX2ZyYW1lYnVmZmVyX29iamVjdCIsICAgICAgICAgICBFWFRfRlJBTUVCVUZGRVJfT0JKRUNULCAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfcGFsZXR0ZWRfdGV4dHVyZSIsICAgICAgICAgICAgIEVYVF9QQUxFVFRFRF9URVhUVVJFLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF9wb2ludF9wYXJhbWV0ZXJzIiwgICAgICAgICAgICAgRVhUX1BPSU5UX1BBUkFNRVRFUlMsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX3NlY29uZGFyeV9jb2xvciIsICAgICAgICAgICAgICBFWFRfU0VDT05EQVJZX0NPTE9SLCAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfc3RlbmNpbF90d29fc2lkZSIsICAgICAgICAgICAgIEVYVF9TVEVOQ0lMX1RXT19TSURFLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF9zdGVuY2lsX3dyYXAiLCAgICAgICAgICAgICAgICAgRVhUX1NURU5DSUxfV1JBUCwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX3RleHR1cmUzRCIsICAgICAgICAgICAgICAgICAgICBFWFRfVEVYVFVSRTNELCAgICAgICAgICAgICAgICAgIE1BS0VEV09SRF9WRVJTSU9OKDEsIDIpICAgICB9LAogICAgeyJHTF9FWFRfdGV4dHVyZV9jb21wcmVzc2lvbl9zM3RjIiwgICAgIEVYVF9URVhUVVJFX0NPTVBSRVNTSU9OX1MzVEMsICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF90ZXh0dXJlX2Vudl9hZGQiLCAgICAgICAgICAgICAgRVhUX1RFWFRVUkVfRU5WX0FERCwgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX3RleHR1cmVfZW52X2NvbWJpbmUiLCAgICAgICAgICBFWFRfVEVYVFVSRV9FTlZfQ09NQklORSwgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfdGV4dHVyZV9lbnZfZG90MyIsICAgICAgICAgICAgIEVYVF9URVhUVVJFX0VOVl9ET1QzLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF90ZXh0dXJlX3NSR0IiLCAgICAgICAgICAgICAgICAgRVhUX1RFWFRVUkVfU1JHQiwgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljIiwgICBFWFRfVEVYVFVSRV9GSUxURVJfQU5JU09UUk9QSUMsIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfdGV4dHVyZV9sb2QiLCAgICAgICAgICAgICAgICAgIEVYVF9URVhUVVJFX0xPRCwgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF90ZXh0dXJlX2xvZF9iaWFzIiwgICAgICAgICAgICAgRVhUX1RFWFRVUkVfTE9EX0JJQVMsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfRVhUX3ZlcnRleF9zaGFkZXIiLCAgICAgICAgICAgICAgICBFWFRfVkVSVEVYX1NIQURFUiwgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9FWFRfdmVydGV4X3dlaWdodGluZyIsICAgICAgICAgICAgIEVYVF9WRVJURVhfV0VJR0hUSU5HLCAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX0VYVF9ncHVfcHJvZ3JhbV9wYXJhbWV0ZXJzIiwgICAgICAgRVhUX0dQVV9QUk9HUkFNX1BBUkFNRVRFUlMsICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKCiAgICAvKiBOViAqLwogICAgeyJHTF9OVl9oYWxmX2Zsb2F0IiwgICAgICAgICAgICAgICAgICAgIE5WX0hBTEZfRkxPQVQsICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX2ZlbmNlIiwgICAgICAgICAgICAgICAgICAgICAgICAgTlZfRkVOQ0UsICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfZm9nX2Rpc3RhbmNlIiwgICAgICAgICAgICAgICAgICBOVl9GT0dfRElTVEFOQ0UsICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl9mcmFnbWVudF9wcm9ncmFtIiwgICAgICAgICAgICAgIE5WX0ZSQUdNRU5UX1BST0dSQU0sICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX2ZyYWdtZW50X3Byb2dyYW0yIiwgICAgICAgICAgICAgTlZfRlJBR01FTlRfUFJPR1JBTTIsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfcmVnaXN0ZXJfY29tYmluZXJzIiwgICAgICAgICAgICBOVl9SRUdJU1RFUl9DT01CSU5FUlMsICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl9yZWdpc3Rlcl9jb21iaW5lcnMyIiwgICAgICAgICAgIE5WX1JFR0lTVEVSX0NPTUJJTkVSUzIsICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX3RleGdlbl9yZWZsZWN0aW9uIiwgICAgICAgICAgICAgTlZfVEVYR0VOX1JFRkxFQ1RJT04sICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfdGV4dHVyZV9lbnZfY29tYmluZTQiLCAgICAgICAgICBOVl9URVhUVVJFX0VOVl9DT01CSU5FNCwgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl90ZXh0dXJlX3NoYWRlciIsICAgICAgICAgICAgICAgIE5WX1RFWFRVUkVfU0hBREVSLCAgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX3RleHR1cmVfc2hhZGVyMiIsICAgICAgICAgICAgICAgTlZfVEVYVFVSRV9TSEFERVIyLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfdGV4dHVyZV9zaGFkZXIzIiwgICAgICAgICAgICAgICBOVl9URVhUVVJFX1NIQURFUjMsICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl9vY2NsdXNpb25fcXVlcnkiLCAgICAgICAgICAgICAgIE5WX09DQ0xVU0lPTl9RVUVSWSwgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX3ZlcnRleF9wcm9ncmFtIiwgICAgICAgICAgICAgICAgTlZfVkVSVEVYX1BST0dSQU0sICAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfdmVydGV4X3Byb2dyYW0xXzEiLCAgICAgICAgICAgICBOVl9WRVJURVhfUFJPR1JBTTFfMSwgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl92ZXJ0ZXhfcHJvZ3JhbTIiLCAgICAgICAgICAgICAgIE5WX1ZFUlRFWF9QUk9HUkFNMiwgICAgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICB7IkdMX05WX3ZlcnRleF9wcm9ncmFtMyIsICAgICAgICAgICAgICAgTlZfVkVSVEVYX1BST0dSQU0zLCAgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgIHsiR0xfTlZfZGVwdGhfY2xhbXAiLCAgICAgICAgICAgICAgICAgICBOVl9ERVBUSF9DTEFNUCwgICAgICAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgeyJHTF9OVl9saWdodF9tYXhfZXhwb25lbnQiLCAgICAgICAgICAgIE5WX0xJR0hUX01BWF9FWFBPTkVOVCwgICAgICAgICAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCgogICAgLyogU0dJICovCiAgICB7IkdMX1NHSVNfZ2VuZXJhdGVfbWlwbWFwIiwgICAgICAgICAgICAgU0dJU19HRU5FUkFURV9NSVBNQVAsICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKfTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIFV0aWxpdHkgZnVuY3Rpb25zIGZvbGxvdwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCi8qIEFkYXB0ZXJzICovCnN0YXRpYyBpbnQgbnVtQWRhcHRlcnMgPSAwOwpzdGF0aWMgc3RydWN0IFdpbmVEM0RBZGFwdGVyIEFkYXB0ZXJzWzFdOwoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNESW1wbF9DaGVja0RldmljZUZvcm1hdChJV2luZUQzRCAqaWZhY2UsIFVJTlQgQWRhcHRlciwgV0lORUQzRERFVlRZUEUgRGV2aWNlVHlwZSwgV0lORUQzREZPUk1BVCBBZGFwdGVyRm9ybWF0LCBEV09SRCBVc2FnZSwgV0lORUQzRFJFU09VUkNFVFlQRSBSVHlwZSwgV0lORUQzREZPUk1BVCBDaGVja0Zvcm1hdCk7CgovKiBsb29rdXAgdGFibGVzICovCmludCBtaW5Mb29rdXBbTUFYX0xPT0tVUFNdOwppbnQgbWF4TG9va3VwW01BWF9MT09LVVBTXTsKRFdPUkQgKnN0YXRlTG9va3VwW01BWF9MT09LVVBTXTsKCkRXT1JEIG1pbk1pcExvb2t1cFtXSU5FRDNEVEVYRl9BTklTT1RST1BJQyArIDFdW1dJTkVEM0RURVhGX0xJTkVBUiArIDFdOwpEV09SRCBtaW5NaXBMb29rdXBfbm9GaWx0ZXJbV0lORUQzRFRFWEZfQU5JU09UUk9QSUMgKyAxXVtXSU5FRDNEVEVYRl9MSU5FQVIgKyAxXSA9IHsKICAgIHtHTF9ORUFSRVNULCBHTF9ORUFSRVNULCBHTF9ORUFSRVNUfSwKICAgIHtHTF9ORUFSRVNULCBHTF9ORUFSRVNULCBHTF9ORUFSRVNUfSwKICAgIHtHTF9ORUFSRVNULCBHTF9ORUFSRVNULCBHTF9ORUFSRVNUfSwKICAgIHtHTF9ORUFSRVNULCBHTF9ORUFSRVNULCBHTF9ORUFSRVNUfSwKfTsKCkRXT1JEIG1hZ0xvb2t1cFtXSU5FRDNEVEVYRl9BTklTT1RST1BJQyArIDFdOwpEV09SRCBtYWdMb29rdXBfbm9GaWx0ZXJbV0lORUQzRFRFWEZfQU5JU09UUk9QSUMgKyAxXSA9IHsKICAgIEdMX05FQVJFU1QsIEdMX05FQVJFU1QsIEdMX05FQVJFU1QsIEdMX05FQVJFU1QKfTsKCi8qIGRyYXdTdHJpZGVkU2xvdyBhdHRyaWJ1dGVzICovCmdsQXR0cmliRnVuYyBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVU5VU0VEXTsKZ2xBdHRyaWJGdW5jIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VOVVNFRF07CmdsQXR0cmliRnVuYyBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVU5VU0VEXTsKZ2xBdHRyaWJGdW5jIG5vcm1hbF9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVU5VU0VEXTsKZ2xUZXhBdHRyaWJGdW5jIHRleGNvb3JkX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VTlVTRURdOwoKLyoqCiAqIE5vdGU6IEdMIHNlZW1zIHRvIHRyYXAgaWYgR2V0RGV2aWNlQ2FwcyBpcyBjYWxsZWQgYmVmb3JlIGFueSBIV05EJ3MgY3JlYXRlZCwKICogaS5lLiwgdGhlcmUgaXMgbm8gR0wgQ29udGV4dCAtIEdldCBhIGRlZmF1bHQgcmVuZGVyaW5nIGNvbnRleHQgdG8gZW5hYmxlIHRoZQogKiBmdW5jdGlvbiBxdWVyeSBzb21lIGluZm8gZnJvbSBHTC4KICovCgpzdGF0aWMgaW50ICAgICAgICAgICAgIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X3JlZiA9IDA7CnN0YXRpYyBCT09MICAgICAgICAgICAgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfZm9yZWlnbjsKc3RhdGljIEJPT0wgICAgICAgICAgICB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9hdmFpbGFibGUgPSBGQUxTRTsKc3RhdGljIEhEQyAgICAgICAgICAgICB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9oZGMgPSBOVUxMOwpzdGF0aWMgSFdORCAgICAgICAgICAgIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2h3bmQgPSBOVUxMOwoKc3RhdGljIENSSVRJQ0FMX1NFQ1RJT04gd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfY3M7CnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OX0RFQlVHIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2NzX2RlYnVnID0KewogICAgMCwgMCwgJndpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2NzLAogICAgeyAmd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfY3NfZGVidWcuUHJvY2Vzc0xvY2tzTGlzdCwKICAgICAgJndpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2NzX2RlYnVnLlByb2Nlc3NMb2Nrc0xpc3QgfSwKICAgIDAsIDAsIHsgKERXT1JEX1BUUikoX19GSUxFX18gIjogd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfY3MiKSB9Cn07CnN0YXRpYyBDUklUSUNBTF9TRUNUSU9OIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2NzID0geyAmd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfY3NfZGVidWcsIC0xLCAwLCAwLCAwLCAwIH07CgpzdGF0aWMgdm9pZCBXaW5lRDNEX1JlbGVhc2VGYWtlR0xDb250ZXh0KHZvaWQpIHsKICAgIEhHTFJDIGdsQ3R4OwoKICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZ3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9jcyk7CgogICAgaWYoIXdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2F2YWlsYWJsZSkgewogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoImNvbnRleHQgbm90IGF2YWlsYWJsZVxuIik7CiAgICAgICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJndpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2NzKTsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgZ2xDdHggPSBwd2dsR2V0Q3VycmVudENvbnRleHQoKTsKCiAgICBUUkFDRV8oZDNkX2NhcHMpKCJkZWNyZW1lbnRpbmcgcmVmIGZyb20gJWlcbiIsIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X3JlZik7CiAgICBpZiAoMCA9PSAoLS13aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9yZWYpICkgewogICAgICAgIGlmKCF3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9mb3JlaWduICYmIGdsQ3R4KSB7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoImRlc3Ryb3lpbmcgZmFrZSBHTCBjb250ZXh0XG4iKTsKICAgICAgICAgICAgcHdnbE1ha2VDdXJyZW50KE5VTEwsIE5VTEwpOwogICAgICAgICAgICBwd2dsRGVsZXRlQ29udGV4dChnbEN0eCk7CiAgICAgICAgfQogICAgICAgIGlmKHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2hkYykKICAgICAgICAgICAgUmVsZWFzZURDKHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2h3bmQsIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2hkYyk7CiAgICAgICAgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaGRjID0gTlVMTDsgLyogTWFrZSBzdXJlIHdlIGRvbid0IHRoaW5rIHRoYXQgaXQgaXMgc3RpbGwgYXJvdW5kICovCiAgICAgICAgaWYod2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaHduZCkKICAgICAgICAgICAgRGVzdHJveVdpbmRvdyh3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9od25kKTsKICAgICAgICB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9od25kID0gTlVMTDsKICAgICAgICB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9hdmFpbGFibGUgPSBGQUxTRTsKICAgIH0KICAgIGFzc2VydCh3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9yZWYgPj0gMCk7CgogICAgTGVhdmVDcml0aWNhbFNlY3Rpb24oJndpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2NzKTsKfQoKc3RhdGljIEJPT0wgV2luZUQzRF9DcmVhdGVGYWtlR0xDb250ZXh0KHZvaWQpIHsKICAgIEhHTFJDIGdsQ3R4ID0gTlVMTDsKCiAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfY3MpOwoKICAgIFRSQUNFKCJnZXR0aW5nIGNvbnRleHQuLi5cbiIpOwogICAgaWYod2luZWQzZF9mYWtlX2dsX2NvbnRleHRfcmVmID4gMCkgZ290byByZXQ7CiAgICBhc3NlcnQoMCA9PSB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9yZWYpOwoKICAgIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2ZvcmVpZ24gPSBUUlVFOwoKICAgIGdsQ3R4ID0gcHdnbEdldEN1cnJlbnRDb250ZXh0KCk7CiAgICBpZiAoIWdsQ3R4KSB7CiAgICAgICAgUElYRUxGT1JNQVRERVNDUklQVE9SIHBmZDsKICAgICAgICBpbnQgaVBpeGVsRm9ybWF0OwoKICAgICAgICB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9mb3JlaWduID0gRkFMU0U7CgogICAgICAgIC8qIFdlIG5lZWQgYSBmYWtlIHdpbmRvdyBhcyBhIGhkYyByZXRyaWV2ZWQgdXNpbmcgR2V0REMoMCkgY2FuJ3QgYmUgdXNlZCBmb3IgbXVjaCBHTCBwdXJwb3NlcyAqLwogICAgICAgIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2h3bmQgPSBDcmVhdGVXaW5kb3dBKCJXaW5lRDNEX09wZW5HTCIsICJXaW5lRDNEIGZha2Ugd2luZG93IiwgV1NfT1ZFUkxBUFBFRFdJTkRPVywgICAgICAgIDEwLCAxMCwgMTAsIDEwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMKTsKICAgICAgICBpZighd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaHduZCkgewogICAgICAgICAgICBFUlIoIkhXTkQgY3JlYXRpb24gZmFpbGVkIVxuIik7CiAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICB9CiAgICAgICAgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaGRjID0gR2V0REMod2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaHduZCk7CiAgICAgICAgaWYoIXdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2hkYykgewogICAgICAgICAgICBFUlIoIkdldERDIGZhaWxlZCFcbiIpOwogICAgICAgICAgICBnb3RvIGZhaWw7CiAgICAgICAgfQoKICAgICAgICAvKiBQaXhlbEZvcm1hdCBzZWxlY3Rpb24gKi8KICAgICAgICBaZXJvTWVtb3J5KCZwZmQsIHNpemVvZihwZmQpKTsKICAgICAgICBwZmQublNpemUgICAgICA9IHNpemVvZihwZmQpOwogICAgICAgIHBmZC5uVmVyc2lvbiAgID0gMTsKICAgICAgICBwZmQuZHdGbGFncyAgICA9IFBGRF9TVVBQT1JUX09QRU5HTCB8IFBGRF9ET1VCTEVCVUZGRVIgfCBQRkRfRFJBV19UT19XSU5ET1c7LypQRkRfR0VORVJJQ19BQ0NFTEVSQVRFRCovCiAgICAgICAgcGZkLmlQaXhlbFR5cGUgPSBQRkRfVFlQRV9SR0JBOwogICAgICAgIHBmZC5jQ29sb3JCaXRzID0gMzI7CiAgICAgICAgcGZkLmlMYXllclR5cGUgPSBQRkRfTUFJTl9QTEFORTsKCiAgICAgICAgaVBpeGVsRm9ybWF0ID0gQ2hvb3NlUGl4ZWxGb3JtYXQod2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaGRjLCAmcGZkKTsKICAgICAgICBpZighaVBpeGVsRm9ybWF0KSB7CiAgICAgICAgICAgIC8qIElmIHRoaXMgaGFwcGVucyBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZyBhcyBDaG9vc2VQaXhlbEZvcm1hdCBiYXJlbHkgZmFpbHMgKi8KICAgICAgICAgICAgRVJSKCJDYW4ndCBmaW5kIGEgc3VpdGFibGUgaVBpeGVsRm9ybWF0XG4iKTsKICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgIH0KICAgICAgICBEZXNjcmliZVBpeGVsRm9ybWF0KHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2hkYywgaVBpeGVsRm9ybWF0LCBzaXplb2YocGZkKSwgJnBmZCk7CiAgICAgICAgU2V0UGl4ZWxGb3JtYXQod2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaGRjLCBpUGl4ZWxGb3JtYXQsICZwZmQpOwoKICAgICAgICAvKiBDcmVhdGUgYSBHTCBjb250ZXh0ICovCiAgICAgICAgZ2xDdHggPSBwd2dsQ3JlYXRlQ29udGV4dCh3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9oZGMpOwogICAgICAgIGlmICghZ2xDdHgpIHsKICAgICAgICAgICAgV0FSTl8oZDNkX2NhcHMpKCJFcnJvciBjcmVhdGluZyBkZWZhdWx0IGNvbnRleHQgZm9yIGNhcGFiaWxpdGllcyBpbml0aWFsaXphdGlvblxuIik7CiAgICAgICAgICAgIGdvdG8gZmFpbDsKICAgICAgICB9CgogICAgICAgIC8qIE1ha2UgaXQgdGhlIGN1cnJlbnQgR0wgY29udGV4dCAqLwogICAgICAgIGlmICghcHdnbE1ha2VDdXJyZW50KHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2hkYywgZ2xDdHgpKSB7CiAgICAgICAgICAgIFdBUk5fKGQzZF9jYXBzKSgiRXJyb3Igc2V0dGluZyBkZWZhdWx0IGNvbnRleHQgYXMgY3VycmVudCBmb3IgY2FwYWJpbGl0aWVzIGluaXRpYWxpemF0aW9uXG4iKTsKICAgICAgICAgICAgZ290byBmYWlsOwogICAgICAgIH0KICAgIH0KCiAgcmV0OgogICAgVFJBQ0UoImluY3JlbWVudGluZyByZWYgZnJvbSAlaVxuIiwgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfcmVmKTsKICAgIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X3JlZisrOwogICAgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfYXZhaWxhYmxlID0gVFJVRTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZ3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9jcyk7CiAgICByZXR1cm4gVFJVRTsKICBmYWlsOgogICAgaWYod2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaGRjKQogICAgICAgIFJlbGVhc2VEQyh3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9od25kLCB3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9oZGMpOwogICAgd2luZWQzZF9mYWtlX2dsX2NvbnRleHRfaGRjID0gTlVMTDsKICAgIGlmKHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2h3bmQpCiAgICAgICAgRGVzdHJveVdpbmRvdyh3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9od25kKTsKICAgIHdpbmVkM2RfZmFrZV9nbF9jb250ZXh0X2h3bmQgPSBOVUxMOwogICAgaWYoZ2xDdHgpIHB3Z2xEZWxldGVDb250ZXh0KGdsQ3R4KTsKICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZ3aW5lZDNkX2Zha2VfZ2xfY29udGV4dF9jcyk7CiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qIEFkanVzdCB0aGUgYW1vdW50IG9mIHVzZWQgdGV4dHVyZSBtZW1vcnkgKi8KbG9uZyBXaW5lRDNEQWRhcHRlckNoYW5nZUdMUmFtKElXaW5lRDNERGV2aWNlSW1wbCAqRDNERGV2aWNlLCBsb25nIGdscmFtKXsKICAgIFVJTlQgQWRhcHRlciA9IEQzRERldmljZS0+YWRhcHRlck5vOwoKICAgIEFkYXB0ZXJzW0FkYXB0ZXJdLlVzZWRUZXh0dXJlUmFtICs9IGdscmFtOwogICAgVFJBQ0UoIkFkanVzdGVkIGdsIHJhbSBieSAlbGQgdG8gJWRcbiIsIGdscmFtLCBBZGFwdGVyc1tBZGFwdGVyXS5Vc2VkVGV4dHVyZVJhbSk7CiAgICByZXR1cm4gQWRhcHRlcnNbQWRhcHRlcl0uVXNlZFRleHR1cmVSYW07Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElVbmtub3duIHBhcnRzIGZvbGxvd3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX1F1ZXJ5SW50ZXJmYWNlKElXaW5lRDNEICppZmFjZSxSRUZJSUQgcmlpZCxMUFZPSUQgKnBwb2JqKQp7CiAgICBJV2luZUQzRERldmljZUltcGwgKlRoaXMgPSAoSVdpbmVEM0REZXZpY2VJbXBsICopaWZhY2U7CgogICAgVFJBQ0UoIiglcCktPiglcywlcClcbiIsVGhpcyxkZWJ1Z3N0cl9ndWlkKHJpaWQpLHBwb2JqKTsKICAgIGlmIChJc0VxdWFsR1VJRChyaWlkLCAmSUlEX0lVbmtub3duKQogICAgICAgIHx8IElzRXF1YWxHVUlEKHJpaWQsICZJSURfSVdpbmVEM0RCYXNlKQogICAgICAgIHx8IElzRXF1YWxHVUlEKHJpaWQsICZJSURfSVdpbmVEM0REZXZpY2UpKSB7CiAgICAgICAgSVVua25vd25fQWRkUmVmKGlmYWNlKTsKICAgICAgICAqcHBvYmogPSBUaGlzOwogICAgICAgIHJldHVybiBTX09LOwogICAgfQogICAgKnBwb2JqID0gTlVMTDsKICAgIHJldHVybiBFX05PSU5URVJGQUNFOwp9CgpzdGF0aWMgVUxPTkcgV0lOQVBJIElXaW5lRDNESW1wbF9BZGRSZWYoSVdpbmVEM0QgKmlmYWNlKSB7CiAgICBJV2luZUQzREltcGwgKlRoaXMgPSAoSVdpbmVEM0RJbXBsICopaWZhY2U7CiAgICBVTE9ORyByZWZDb3VudCA9IEludGVybG9ja2VkSW5jcmVtZW50KCZUaGlzLT5yZWYpOwoKICAgIFRSQUNFKCIoJXApIDogQWRkUmVmIGluY3JlYXNpbmcgZnJvbSAlZFxuIiwgVGhpcywgcmVmQ291bnQgLSAxKTsKICAgIHJldHVybiByZWZDb3VudDsKfQoKc3RhdGljIFVMT05HIFdJTkFQSSBJV2luZUQzREltcGxfUmVsZWFzZShJV2luZUQzRCAqaWZhY2UpIHsKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIFVMT05HIHJlZjsKICAgIFRSQUNFKCIoJXApIDogUmVsZWFzaW5nIGZyb20gJWRcbiIsIFRoaXMsIFRoaXMtPnJlZik7CiAgICByZWYgPSBJbnRlcmxvY2tlZERlY3JlbWVudCgmVGhpcy0+cmVmKTsKICAgIGlmIChyZWYgPT0gMCkgewogICAgICAgIEhlYXBGcmVlKEdldFByb2Nlc3NIZWFwKCksIDAsIFRoaXMpOwogICAgfQoKICAgIHJldHVybiByZWY7Cn0KCi8qIFNldCB0aGUgc2hhZGVyIHR5cGUgZm9yIHRoaXMgZGV2aWNlLCBkZXBlbmRpbmcgb24gdGhlIGdpdmVuIGNhcGFiaWxpdGllcywKICogdGhlIGRldmljZSB0eXBlLCBhbmQgdGhlIHVzZXIgcHJlZmVyZW5jZXMgaW4gd2luZWQzZF9zZXR0aW5ncyAqLwoKdm9pZCBzZWxlY3Rfc2hhZGVyX21vZGUoCiAgICBXaW5lRDNEX0dMX0luZm8gKmdsX2luZm8sCiAgICBXSU5FRDNEREVWVFlQRSBEZXZpY2VUeXBlLAogICAgaW50KiBwc19zZWxlY3RlZCwKICAgIGludCogdnNfc2VsZWN0ZWQpIHsKCiAgICBpZiAod2luZWQzZF9zZXR0aW5ncy52c19tb2RlID09IFZTX05PTkUpIHsKICAgICAgICAqdnNfc2VsZWN0ZWQgPSBTSEFERVJfTk9ORTsKICAgIH0gZWxzZSBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9WRVJURVhfU0hBREVSXSAmJiB3aW5lZDNkX3NldHRpbmdzLmdsc2xSZXF1ZXN0ZWQpIHsKICAgICAgICAvKiBHZWZvcmNlNCBjYXJkcyBzdXBwb3J0IEdMU0wgYnV0IGZvciB2ZXJ0ZXggc2hhZGVycyBvbmx5LiBGdXJ0aGVyIGl0cyByZXBvcnRlZCBHTFNMIGNhcHMgYXJlCiAgICAgICAgICogd3JvbmcuIFRoaXMgY29tYmluZWQgd2l0aCB0aGUgZmFjdCB0aGF0IGdsc2wgd29uJ3Qgb2ZmZXIgbW9yZSBmZWF0dXJlcyBvciBwZXJmb3JtYW5jZSwgdXNlIEFSQgogICAgICAgICAqIHNoYWRlcnMgb25seSBvbiB0aGlzIGNhcmQuICovCiAgICAgICAgaWYoZ2xfaW5mby0+dnNfbnZfdmVyc2lvbiAmJiBnbF9pbmZvLT52c19udl92ZXJzaW9uIDwgVlNfVkVSU0lPTl8yMCkKICAgICAgICAgICAgKnZzX3NlbGVjdGVkID0gU0hBREVSX0FSQjsKICAgICAgICBlbHNlCiAgICAgICAgICAgICp2c19zZWxlY3RlZCA9IFNIQURFUl9HTFNMOwogICAgfSBlbHNlIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1ZFUlRFWF9QUk9HUkFNXSkgewogICAgICAgICp2c19zZWxlY3RlZCA9IFNIQURFUl9BUkI7CiAgICB9IGVsc2UgewogICAgICAgICp2c19zZWxlY3RlZCA9IFNIQURFUl9OT05FOwogICAgfQoKICAgIGlmICh3aW5lZDNkX3NldHRpbmdzLnBzX21vZGUgPT0gUFNfTk9ORSkgewogICAgICAgICpwc19zZWxlY3RlZCA9IFNIQURFUl9OT05FOwogICAgfSBlbHNlIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX0ZSQUdNRU5UX1NIQURFUl0gJiYgd2luZWQzZF9zZXR0aW5ncy5nbHNsUmVxdWVzdGVkKSB7CiAgICAgICAgKnBzX3NlbGVjdGVkID0gU0hBREVSX0dMU0w7CiAgICB9IGVsc2UgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfRlJBR01FTlRfUFJPR1JBTV0pIHsKICAgICAgICAqcHNfc2VsZWN0ZWQgPSBTSEFERVJfQVJCOwogICAgfSBlbHNlIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVRJX0ZSQUdNRU5UX1NIQURFUl0pIHsKICAgICAgICAqcHNfc2VsZWN0ZWQgPSBTSEFERVJfQVRJOwogICAgfSBlbHNlIHsKICAgICAgICAqcHNfc2VsZWN0ZWQgPSBTSEFERVJfTk9ORTsKICAgIH0KfQoKLyoqIFNlbGVjdCB0aGUgbnVtYmVyIG9mIHJlcG9ydCBtYXhpbXVtIHNoYWRlciBjb25zdGFudHMgYmFzZWQgb24gdGhlIHNlbGVjdGVkIHNoYWRlciBtb2RlcyAqLwpzdGF0aWMgdm9pZCBzZWxlY3Rfc2hhZGVyX21heF9jb25zdGFudHMoCiAgICBpbnQgcHNfc2VsZWN0ZWRfbW9kZSwKICAgIGludCB2c19zZWxlY3RlZF9tb2RlLAogICAgV2luZUQzRF9HTF9JbmZvICpnbF9pbmZvKSB7CgogICAgc3dpdGNoICh2c19zZWxlY3RlZF9tb2RlKSB7CiAgICAgICAgY2FzZSBTSEFERVJfR0xTTDoKICAgICAgICAgICAgLyogU3VidHJhY3QgdGhlIG90aGVyIHBvdGVudGlhbCB1bmlmb3JtcyBmcm9tIHRoZSBtYXggYXZhaWxhYmxlIChib29scywgaW50cywgYW5kIDEgcm93IG9mIHByb2plY3Rpb24gbWF0cml4KSAqLwogICAgICAgICAgICBnbF9pbmZvLT5tYXhfdnNoYWRlcl9jb25zdGFudHNGID0gZ2xfaW5mby0+dnNfZ2xzbF9jb25zdGFudHNGIC0gKE1BWF9DT05TVF9CIC8gNCkgLSBNQVhfQ09OU1RfSSAtIDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU0hBREVSX0FSQjoKICAgICAgICAgICAgLyogV2UgaGF2ZSB0byBzdWJ0cmFjdCBhbnkgb3RoZXIgUEFSQU1zIHRoYXQgd2UgbWlnaHQgdXNlIGluIG91ciBzaGFkZXIgcHJvZ3JhbXMuCiAgICAgICAgICAgICAqIEFUSSBzZWVtcyB0byBjb3VudCAyIGltcGxpY2l0IFBBUkFNcyB3aGVuIHdlIHVzZSBmb2cgYW5kIE5WSURJQSBjb3VudHMgMSwKICAgICAgICAgICAgICogYW5kIHdlIHJlZmVyZW5jZSBvbmUgcm93IG9mIHRoZSBQUk9KRUNUSU9OIG1hdHJpeCB3aGljaCBjb3VudHMgYXMgMSBQQVJBTS4gKi8KICAgICAgICAgICAgZ2xfaW5mby0+bWF4X3ZzaGFkZXJfY29uc3RhbnRzRiA9IGdsX2luZm8tPnZzX2FyYl9jb25zdGFudHNGIC0gMzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgZ2xfaW5mby0+bWF4X3ZzaGFkZXJfY29uc3RhbnRzRiA9IDA7CiAgICAgICAgICAgIGJyZWFrOwogICAgfQoKICAgIHN3aXRjaCAocHNfc2VsZWN0ZWRfbW9kZSkgewogICAgICAgIGNhc2UgU0hBREVSX0dMU0w6CiAgICAgICAgICAgIC8qIFN1YnRyYWN0IHRoZSBvdGhlciBwb3RlbnRpYWwgdW5pZm9ybXMgZnJvbSB0aGUgbWF4IGF2YWlsYWJsZSAoYm9vbHMgJiBpbnRzKSwgYW5kIDIgc3RhdGVzIGZvciBmb2cuCiAgICAgICAgICAgICAqIEluIHRoZW9yeSB0aGUgdGV4YmVtIGluc3RydWN0aW9uIG1heSBuZWVkIG9uZSBtb3JlIHNoYWRlciBjb25zdGFudCB0b28uIEJ1dCBsZXRzIGFzc3VtZQogICAgICAgICAgICAgKiB0aGF0IGEgc20gPD0gMS4zIHNoYWRlciBkb2VzIG5vdCBuZWVkIGFsbCB0aGUgdW5pZm9ybXMgcHJvdmlkZWQgYnkgYSBnbHNsLWNhcGFibGUgY2FyZCwKICAgICAgICAgICAgICogYW5kIGxldHMgbm90IHRha2UgYXdheSBhIHVuaWZvcm0gbmVlZGxlc3NseSBmcm9tIGFsbCBvdGhlciBzaGFkZXJzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2xfaW5mby0+bWF4X3BzaGFkZXJfY29uc3RhbnRzRiA9IGdsX2luZm8tPnBzX2dsc2xfY29uc3RhbnRzRiAtIChNQVhfQ09OU1RfQiAvIDQpIC0gTUFYX0NPTlNUX0kgLSAyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNIQURFUl9BUkI6CiAgICAgICAgICAgIC8qIFRoZSBhcmIgc2hhZGVyIG9ubHkgbG9hZHMgdGhlIGJ1bXAgbWFwcGluZyBlbnZpcm9ubWVudCBtYXRyaXggaW50byB0aGUgc2hhZGVyIGlmIGl0IGZpbmRzCiAgICAgICAgICAgICAqIGEgZnJlZSBjb25zdGFudCB0byBkbyB0aGF0LCBzbyBvbmx5IHJlZHVjZSB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBjb25zdGFudHMgYnkgMiBmb3IgdGhlIGZvZyBzdGF0ZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnbF9pbmZvLT5tYXhfcHNoYWRlcl9jb25zdGFudHNGID0gZ2xfaW5mby0+cHNfYXJiX2NvbnN0YW50c0YgLSAyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBnbF9pbmZvLT5tYXhfcHNoYWRlcl9jb25zdGFudHNGID0gMDsKICAgICAgICAgICAgYnJlYWs7CiAgICB9Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElXaW5lRDNEIHBhcnRzIGZvbGxvd3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgojZGVmaW5lIEdMSU5GT19MT0NBVElPTiAoKmdsX2luZm8pCnN0YXRpYyBpbmxpbmUgQk9PTCB0ZXN0X2FyYl92c19vZmZzZXRfbGltaXQoV2luZUQzRF9HTF9JbmZvICpnbF9pbmZvKSB7CiAgICBHTHVpbnQgcHJvZzsKICAgIEJPT0wgcmV0ID0gRkFMU0U7CiAgICBjb25zdCBjaGFyICp0ZXN0Y29kZSA9CiAgICAgICAgIiEhQVJCdnAxLjBcbiIKICAgICAgICAiUEFSQU0gQ1s2Nl0gPSB7IHByb2dyYW0uZW52WzAuLjY1XSB9O1xuIgogICAgICAgICJBRERSRVNTIEEwOyIKICAgICAgICAiUEFSQU0gemVybyA9IHswLjAsIDAuMCwgMC4wLCAwLjB9O1xuIgogICAgICAgICJBUkwgQTAueCwgemVyby54O1xuIgogICAgICAgICJNT1YgcmVzdWx0LnBvc2l0aW9uLCBDW0EwLnggKyA2NV07XG4iCiAgICAgICAgIkVORFxuIjsKCiAgICB3aGlsZShnbEdldEVycm9yKCkpOwogICAgR0xfRVhUQ0FMTChnbEdlblByb2dyYW1zQVJCKDEsICZwcm9nKSk7CiAgICBpZighcHJvZykgewogICAgICAgIEVSUigiRmFpbGVkIHRvIGNyZWF0ZSBhbiBBUkIgb2Zmc2V0IGxpbWl0IHRlc3QgcHJvZ3JhbVxuIik7CiAgICB9CiAgICBHTF9FWFRDQUxMKGdsQmluZFByb2dyYW1BUkIoR0xfVkVSVEVYX1BST0dSQU1fQVJCLCBwcm9nKSk7CiAgICBHTF9FWFRDQUxMKGdsUHJvZ3JhbVN0cmluZ0FSQihHTF9WRVJURVhfUFJPR1JBTV9BUkIsIEdMX1BST0dSQU1fRk9STUFUX0FTQ0lJX0FSQiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmxlbih0ZXN0Y29kZSksIHRlc3Rjb2RlKSk7CiAgICBpZihnbEdldEVycm9yKCkgIT0gMCkgewogICAgICAgIFRSQUNFKCJPcGVuR0wgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgYWxsb3cgaW5kaXJlY3QgYWRkcmVzc2luZyBvZmZzZXRzID4gNjNcbiIpOwogICAgICAgIFRSQUNFKCJlcnJvcjogJXNcbiIsIGRlYnVnc3RyX2EoKGNvbnN0IGNoYXIgKilnbEdldFN0cmluZyhHTF9QUk9HUkFNX0VSUk9SX1NUUklOR19BUkIpKSk7CiAgICAgICAgcmV0ID0gVFJVRTsKICAgIH0gZWxzZSBUUkFDRSgiT3BlbkdMIGltcGxlbWVudGF0aW9uIGFsbG93cyBvZmZzZXRzID4gNjNcbiIpOwoKICAgIEdMX0VYVENBTEwoZ2xCaW5kUHJvZ3JhbUFSQihHTF9WRVJURVhfUFJPR1JBTV9BUkIsIDApKTsKICAgIEdMX0VYVENBTEwoZ2xEZWxldGVQcm9ncmFtc0FSQigxLCAmcHJvZykpOwogICAgY2hlY2tHTGNhbGwoIkFSQiB2cCBvZmZzZXQgbGltaXQgdGVzdCBjbGVhbnVwXG4iKTsKCiAgICByZXR1cm4gcmV0Owp9CgpzdGF0aWMgRFdPUkQgdmVyX2Zvcl9leHQoR0xfU3VwcG9ydGVkRXh0IGV4dCkKewogICAgdW5zaWduZWQgaW50IGk7CiAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZihFWFRFTlNJT05fTUFQKSAvIHNpemVvZigqRVhURU5TSU9OX01BUCkpOyArK2kpIHsKICAgICAgICBpZihFWFRFTlNJT05fTUFQW2ldLmV4dGVuc2lvbiA9PSBleHQpIHsKICAgICAgICAgICAgcmV0dXJuIEVYVEVOU0lPTl9NQVBbaV0udmVyc2lvbjsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gMDsKfQoKQk9PTCBJV2luZUQzREltcGxfRmlsbEdMQ2FwcyhXaW5lRDNEX0dMX0luZm8gKmdsX2luZm8pIHsKICAgIGNvbnN0IGNoYXIgKkdMX0V4dGVuc2lvbnMgICAgPSBOVUxMOwogICAgY29uc3QgY2hhciAqV0dMX0V4dGVuc2lvbnMgICA9IE5VTEw7CiAgICBjb25zdCBjaGFyICpnbF9zdHJpbmcgICAgICAgID0gTlVMTDsKICAgIGNvbnN0IGNoYXIgKmdsX3N0cmluZ19jdXJzb3IgPSBOVUxMOwogICAgR0xpbnQgICAgICAgZ2xfbWF4OwogICAgR0xmbG9hdCAgICAgZ2xfZmxvYXR2WzJdOwogICAgaW50ICAgICAgICAgbWFqb3IgPSAxLCBtaW5vciA9IDA7CiAgICBCT09MICAgICAgICByZXR1cm5fdmFsdWUgPSBUUlVFOwogICAgdW5zaWduZWQgICAgaTsKICAgIEhEQyAgICAgICAgIGhkYzsKICAgIHVuc2lnbmVkIGludCB2aWRtZW09MDsKCiAgICBUUkFDRV8oZDNkX2NhcHMpKCIoJXApXG4iLCBnbF9pbmZvKTsKCiAgICBFTlRFUl9HTCgpOwoKICAgIGdsX3N0cmluZyA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKEdMX1JFTkRFUkVSKTsKICAgIGlmIChOVUxMID09IGdsX3N0cmluZykKCWdsX3N0cmluZyA9ICJOb25lIjsKICAgIHN0cmNweShnbF9pbmZvLT5nbF9yZW5kZXJlciwgZ2xfc3RyaW5nKTsKCiAgICBnbF9zdHJpbmcgPSAoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhHTF9WRU5ET1IpOwogICAgVFJBQ0VfKGQzZF9jYXBzKSgiRmlsbGluZyB2ZW5kb3Igc3RyaW5nICVzXG4iLCBnbF9zdHJpbmcpOwogICAgaWYgKGdsX3N0cmluZyAhPSBOVUxMKSB7CiAgICAgICAgLyogRmlsbCBpbiB0aGUgR0wgdmVuZG9yICovCiAgICAgICAgaWYgKHN0cnN0cihnbF9zdHJpbmcsICJOVklESUEiKSkgewogICAgICAgICAgICBnbF9pbmZvLT5nbF92ZW5kb3IgPSBWRU5ET1JfTlZJRElBOwogICAgICAgIH0gZWxzZSBpZiAoc3Ryc3RyKGdsX3N0cmluZywgIkFUSSIpKSB7CiAgICAgICAgICAgIGdsX2luZm8tPmdsX3ZlbmRvciA9IFZFTkRPUl9BVEk7CiAgICAgICAgfSBlbHNlIGlmIChzdHJzdHIoZ2xfc3RyaW5nLCAiSW50ZWwoUikiKSB8fAogICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiSW50ZWwoUikiKSB8fAogICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX3N0cmluZywgIkludGVsIEluYy4iKSkgewogICAgICAgICAgICBnbF9pbmZvLT5nbF92ZW5kb3IgPSBWRU5ET1JfSU5URUw7CiAgICAgICAgfSBlbHNlIGlmIChzdHJzdHIoZ2xfc3RyaW5nLCAiTWVzYSIpKSB7CiAgICAgICAgICAgIGdsX2luZm8tPmdsX3ZlbmRvciA9IFZFTkRPUl9NRVNBOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGdsX2luZm8tPmdsX3ZlbmRvciA9IFZFTkRPUl9XSU5FOwogICAgICAgIH0KICAgIH0gZWxzZSB7CiAgICAgICAgZ2xfaW5mby0+Z2xfdmVuZG9yID0gVkVORE9SX1dJTkU7CiAgICB9CgoKICAgIFRSQUNFXyhkM2RfY2FwcykoImZvdW5kIEdMX1ZFTkRPUiAoJXMpLT4oMHglMDR4KVxuIiwgZGVidWdzdHJfYShnbF9zdHJpbmcpLCBnbF9pbmZvLT5nbF92ZW5kb3IpOwoKICAgIC8qIFBhcnNlIHRoZSBHTF9WRVJTSU9OIGZpZWxkIGludG8gbWFqb3IgYW5kIG1pbm9yIGluZm9ybWF0aW9uICovCiAgICBnbF9zdHJpbmcgPSAoY29uc3QgY2hhciAqKSBnbEdldFN0cmluZyhHTF9WRVJTSU9OKTsKICAgIGlmIChnbF9zdHJpbmcgIT0gTlVMTCkgewoKICAgICAgICAvKiBGaXJzdCwgcGFyc2UgdGhlIGdlbmVyaWMgb3BlbmdsIHZlcnNpb24uIFRoaXMgaXMgc3VwcG9zZWQgbm90IHRvIGJlIGNvbnZvbHV0ZWQgd2l0aAogICAgICAgICAqIGRyaXZlciBzcGVjaWZpYyBpbmZvcm1hdGlvbgogICAgICAgICAqLwogICAgICAgIGdsX3N0cmluZ19jdXJzb3IgPSBnbF9zdHJpbmc7CiAgICAgICAgbWFqb3IgPSBhdG9pKGdsX3N0cmluZ19jdXJzb3IpOwogICAgICAgIGlmKG1ham9yIDw9IDApIHsKICAgICAgICAgICAgRVJSKCJJbnZhbGlkIG9wZW5nbCBtYWpvciB2ZXJzaW9uOiAlZFxuIiwgbWFqb3IpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAoKmdsX3N0cmluZ19jdXJzb3IgPD0gJzknICYmICpnbF9zdHJpbmdfY3Vyc29yID49ICcwJykgewogICAgICAgICAgICArK2dsX3N0cmluZ19jdXJzb3I7CiAgICAgICAgfQogICAgICAgIGlmICgqZ2xfc3RyaW5nX2N1cnNvcisrICE9ICcuJykgewogICAgICAgICAgICBFUlJfKGQzZF9jYXBzKSgiSW52YWxpZCBvcGVuZ2wgdmVyc2lvbiBzdHJpbmc6ICVzXG4iLCBkZWJ1Z3N0cl9hKGdsX3N0cmluZykpOwogICAgICAgIH0KICAgICAgICBtaW5vciA9IGF0b2koZ2xfc3RyaW5nX2N1cnNvcik7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiRm91bmQgT3BlbkdMIHZlcnNpb246ICVkLiVkXG4iLCBtYWpvciwgbWlub3IpOwogICAgICAgIGdsX2luZm8tPmdsX3ZlcnNpb24gPSBNQUtFRFdPUkRfVkVSU0lPTihtYWpvciwgbWlub3IpOwoKICAgICAgICAvKiBOb3cgcGFyc2UgdGhlIGRyaXZlciBzcGVjaWZpYyBzdHJpbmcgd2hpY2ggd2UnbGwgcmVwb3J0IHRvIHRoZSBhcHAgKi8KICAgICAgICBzd2l0Y2ggKGdsX2luZm8tPmdsX3ZlbmRvcikgewogICAgICAgIGNhc2UgVkVORE9SX05WSURJQToKICAgICAgICAgICAgZ2xfc3RyaW5nX2N1cnNvciA9IHN0cnN0cihnbF9zdHJpbmcsICJOVklESUEiKTsKICAgICAgICAgICAgaWYgKCFnbF9zdHJpbmdfY3Vyc29yKSB7CiAgICAgICAgICAgICAgICBFUlJfKGQzZF9jYXBzKSgiSW52YWxpZCBuVmlkaWEgdmVyc2lvbiBzdHJpbmc6ICVzXG4iLCBkZWJ1Z3N0cl9hKGdsX3N0cmluZykpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGdsX3N0cmluZ19jdXJzb3IgPSBzdHJzdHIoZ2xfc3RyaW5nX2N1cnNvciwgIiAiKTsKICAgICAgICAgICAgaWYgKCFnbF9zdHJpbmdfY3Vyc29yKSB7CiAgICAgICAgICAgICAgICBFUlJfKGQzZF9jYXBzKSgiSW52YWxpZCBuVmlkaWEgdmVyc2lvbiBzdHJpbmc6ICVzXG4iLCBkZWJ1Z3N0cl9hKGdsX3N0cmluZykpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHdoaWxlICgqZ2xfc3RyaW5nX2N1cnNvciA9PSAnICcpIHsKICAgICAgICAgICAgICAgICsrZ2xfc3RyaW5nX2N1cnNvcjsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCEqZ2xfc3RyaW5nX2N1cnNvcikgewogICAgICAgICAgICAgICAgRVJSXyhkM2RfY2FwcykoIkludmFsaWQgblZpZGlhIHZlcnNpb24gc3RyaW5nOiAlc1xuIiwgZGVidWdzdHJfYShnbF9zdHJpbmcpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtYWpvciA9IGF0b2koZ2xfc3RyaW5nX2N1cnNvcik7CiAgICAgICAgICAgIHdoaWxlICgqZ2xfc3RyaW5nX2N1cnNvciA8PSAnOScgJiYgKmdsX3N0cmluZ19jdXJzb3IgPj0gJzAnKSB7CiAgICAgICAgICAgICAgICArK2dsX3N0cmluZ19jdXJzb3I7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICgqZ2xfc3RyaW5nX2N1cnNvcisrICE9ICcuJykgewogICAgICAgICAgICAgICAgRVJSXyhkM2RfY2FwcykoIkludmFsaWQgblZpZGlhIHZlcnNpb24gc3RyaW5nOiAlc1xuIiwgZGVidWdzdHJfYShnbF9zdHJpbmcpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBtaW5vciA9IGF0b2koZ2xfc3RyaW5nX2N1cnNvcik7CiAgICAgICAgICAgIG1pbm9yID0gbWFqb3IqMTAwK21pbm9yOwogICAgICAgICAgICBtYWpvciA9IDEwOwoKICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGNhc2UgVkVORE9SX0FUSToKICAgICAgICAgICAgbWFqb3IgPSBtaW5vciA9IDA7CiAgICAgICAgICAgIGdsX3N0cmluZ19jdXJzb3IgPSBzdHJjaHIoZ2xfc3RyaW5nLCAnLScpOwogICAgICAgICAgICBpZiAoZ2xfc3RyaW5nX2N1cnNvcikgewogICAgICAgICAgICAgICAgaW50IGVycm9yID0gMDsKICAgICAgICAgICAgICAgIGdsX3N0cmluZ19jdXJzb3IrKzsKCiAgICAgICAgICAgICAgICAvKiBDaGVjayBpZiB2ZXJzaW9uIG51bWJlciBpcyBvZiB0aGUgZm9ybSB4LnkueiAqLwogICAgICAgICAgICAgICAgaWYgKCpnbF9zdHJpbmdfY3Vyc29yID4gJzknICYmICpnbF9zdHJpbmdfY3Vyc29yIDwgJzAnKQogICAgICAgICAgICAgICAgICAgIGVycm9yID0gMTsKICAgICAgICAgICAgICAgIGlmICghZXJyb3IgJiYgKihnbF9zdHJpbmdfY3Vyc29yKzIpID4gJzknICYmICooZ2xfc3RyaW5nX2N1cnNvcisyKSA8ICcwJykKICAgICAgICAgICAgICAgICAgICBlcnJvciA9IDE7CiAgICAgICAgICAgICAgICBpZiAoIWVycm9yICYmICooZ2xfc3RyaW5nX2N1cnNvcis0KSA+ICc5JyAmJiAqKGdsX3N0cmluZ19jdXJzb3IrNCkgPCAnMCcpCiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAxOwogICAgICAgICAgICAgICAgaWYgKCFlcnJvciAmJiAqKGdsX3N0cmluZ19jdXJzb3IrMSkgIT0gJy4nICYmICooZ2xfc3RyaW5nX2N1cnNvciszKSAhPSAnLicpCiAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSAxOwoKICAgICAgICAgICAgICAgIC8qIE1hcmsgdmVyc2lvbiBudW1iZXIgYXMgbWFsZm9ybWVkICovCiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpCiAgICAgICAgICAgICAgICAgICAgZ2xfc3RyaW5nX2N1cnNvciA9IDA7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmICghZ2xfc3RyaW5nX2N1cnNvcikKICAgICAgICAgICAgICAgIFdBUk5fKGQzZF9jYXBzKSgibWFsZm9ybWVkIEdMX1ZFUlNJT04gKCVzKVxuIiwgZGVidWdzdHJfYShnbF9zdHJpbmcpKTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBtYWpvciA9ICpnbF9zdHJpbmdfY3Vyc29yIC0gJzAnOwogICAgICAgICAgICAgICAgbWlub3IgPSAoKihnbF9zdHJpbmdfY3Vyc29yKzIpIC0gJzAnKSAqIDI1NiArICgqKGdsX3N0cmluZ19jdXJzb3IrNCkgLSAnMCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICBjYXNlIFZFTkRPUl9JTlRFTDoKICAgICAgICAgICAgLyogQXBwbGUgYW5kIE1lc2EgdmVyc2lvbiBzdHJpbmdzIGxvb2sgZGlmZmVyZW50bHksIGJ1dCBib3RoIHByb3ZpZGUgaW50ZWwgZHJpdmVycyAqLwogICAgICAgICAgICBpZihzdHJzdHIoZ2xfc3RyaW5nLCAiQVBQTEUiKSkgewogICAgICAgICAgICAgICAgLyogWzAtOV0rLlswLTldKyBBUFBMRS1bMC05XSsuWzAuOV0rLlswLjldKwogICAgICAgICAgICAgICAgICogV2Ugb25seSBuZWVkIHRoZSBmaXJzdCBwYXJ0LCBhbmQgdXNlIHRoZSBBUFBMRSBhcyBpZGVudGlmaWNhdGlvbgogICAgICAgICAgICAgICAgICogIjEuMiBBUFBMRS0xLjQuNTYiCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGdsX3N0cmluZ19jdXJzb3IgPSBnbF9zdHJpbmc7CiAgICAgICAgICAgICAgICBtYWpvciA9IGF0b2koZ2xfc3RyaW5nX2N1cnNvcik7CiAgICAgICAgICAgICAgICB3aGlsZSAoKmdsX3N0cmluZ19jdXJzb3IgPD0gJzknICYmICpnbF9zdHJpbmdfY3Vyc29yID49ICcwJykgewogICAgICAgICAgICAgICAgICAgICsrZ2xfc3RyaW5nX2N1cnNvcjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoKmdsX3N0cmluZ19jdXJzb3IrKyAhPSAnLicpIHsKICAgICAgICAgICAgICAgICAgICBFUlJfKGQzZF9jYXBzKSgiSW52YWxpZCBNYWNPUy1JbnRlbCB2ZXJzaW9uIHN0cmluZzogJXNcbiIsIGRlYnVnc3RyX2EoZ2xfc3RyaW5nKSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbWlub3IgPSBhdG9pKGdsX3N0cmluZ19jdXJzb3IpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KCiAgICAgICAgY2FzZSBWRU5ET1JfTUVTQToKICAgICAgICAgICAgZ2xfc3RyaW5nX2N1cnNvciA9IHN0cnN0cihnbF9zdHJpbmcsICJNZXNhIik7CiAgICAgICAgICAgIGdsX3N0cmluZ19jdXJzb3IgPSBzdHJzdHIoZ2xfc3RyaW5nX2N1cnNvciwgIiAiKTsKICAgICAgICAgICAgd2hpbGUgKCpnbF9zdHJpbmdfY3Vyc29yICYmICcgJyA9PSAqZ2xfc3RyaW5nX2N1cnNvcikgKytnbF9zdHJpbmdfY3Vyc29yOwogICAgICAgICAgICBpZiAoKmdsX3N0cmluZ19jdXJzb3IpIHsKICAgICAgICAgICAgICAgIGNoYXIgdG1wWzE2XTsKICAgICAgICAgICAgICAgIGludCBjdXJzb3IgPSAwOwoKICAgICAgICAgICAgICAgIHdoaWxlICgqZ2xfc3RyaW5nX2N1cnNvciA8PSAnOScgJiYgKmdsX3N0cmluZ19jdXJzb3IgPj0gJzAnKSB7CiAgICAgICAgICAgICAgICAgICAgdG1wW2N1cnNvcisrXSA9ICpnbF9zdHJpbmdfY3Vyc29yOwogICAgICAgICAgICAgICAgICAgICsrZ2xfc3RyaW5nX2N1cnNvcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRtcFtjdXJzb3JdID0gMDsKICAgICAgICAgICAgICAgIG1ham9yID0gYXRvaSh0bXApOwoKICAgICAgICAgICAgICAgIGlmICgqZ2xfc3RyaW5nX2N1cnNvciAhPSAnLicpIFdBUk5fKGQzZF9jYXBzKSgibWFsZm9ybWVkIEdMX1ZFUlNJT04gKCVzKVxuIiwgZGVidWdzdHJfYShnbF9zdHJpbmcpKTsKICAgICAgICAgICAgICAgICsrZ2xfc3RyaW5nX2N1cnNvcjsKCiAgICAgICAgICAgICAgICBjdXJzb3IgPSAwOwogICAgICAgICAgICAgICAgd2hpbGUgKCpnbF9zdHJpbmdfY3Vyc29yIDw9ICc5JyAmJiAqZ2xfc3RyaW5nX2N1cnNvciA+PSAnMCcpIHsKICAgICAgICAgICAgICAgICAgICB0bXBbY3Vyc29yKytdID0gKmdsX3N0cmluZ19jdXJzb3I7CiAgICAgICAgICAgICAgICAgICAgKytnbF9zdHJpbmdfY3Vyc29yOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdG1wW2N1cnNvcl0gPSAwOwogICAgICAgICAgICAgICAgbWlub3IgPSBhdG9pKHRtcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG1ham9yID0gMDsKICAgICAgICAgICAgbWlub3IgPSA5OwogICAgICAgIH0KICAgICAgICBnbF9pbmZvLT5kcml2ZXJfdmVyc2lvbiA9IE1BS0VEV09SRF9WRVJTSU9OKG1ham9yLCBtaW5vcik7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiZm91bmQgZHJpdmVyIHZlcnNpb24gKCVzKS0+JWkuJWktPigweCUwOHgpXG4iLCBkZWJ1Z3N0cl9hKGdsX3N0cmluZyksIG1ham9yLCBtaW5vciwgZ2xfaW5mby0+ZHJpdmVyX3ZlcnNpb24pOwogICAgICAgIC8qIEN1cnJlbnQgV2luZG93cyBkcml2ZXJzIGhhdmUgdmVyc2lvbnMgbGlrZSA2LjE0Li4uLiAoc29tZSBvbGRlciBoYXZlIGFuIGVhcmxpZXIgdmVyc2lvbikgKi8KICAgICAgICBnbF9pbmZvLT5kcml2ZXJfdmVyc2lvbl9oaXBhcnQgPSBNQUtFRFdPUkRfVkVSU0lPTig2LCAxNCk7CiAgICB9IGVsc2UgewogICAgICAgIEZJWE1FKCJPcGVuR0wgZHJpdmVyIGRpZCBub3QgcmV0dXJuIHZlcnNpb24gaW5mb3JtYXRpb25cbiIpOwogICAgICAgIGdsX2luZm8tPmRyaXZlcl92ZXJzaW9uID0gTUFLRURXT1JEX1ZFUlNJT04oMCwgMCk7CiAgICAgICAgZ2xfaW5mby0+ZHJpdmVyX3ZlcnNpb25faGlwYXJ0ID0gTUFLRURXT1JEX1ZFUlNJT04oNiwgMTQpOwogICAgfQoKICAgIFRSQUNFXyhkM2RfY2FwcykoImZvdW5kIEdMX1JFTkRFUkVSICglcyktPigweCUwNHgpXG4iLCBkZWJ1Z3N0cl9hKGdsX2luZm8tPmdsX3JlbmRlcmVyKSwgZ2xfaW5mby0+Z2xfY2FyZCk7CgogICAgLyoKICAgICAqIEluaXRpYWxpemUgb3BlbkdMIGV4dGVuc2lvbiByZWxhdGVkIHZhcmlhYmxlcwogICAgICogIHdpdGggRGVmYXVsdCB2YWx1ZXMKICAgICAqLwogICAgbWVtc2V0KCZnbF9pbmZvLT5zdXBwb3J0ZWQsIDAsIHNpemVvZihnbF9pbmZvLT5zdXBwb3J0ZWQpKTsKICAgIGdsX2luZm8tPm1heF9idWZmZXJzICAgICAgICA9IDE7CiAgICBnbF9pbmZvLT5tYXhfdGV4dHVyZXMgICAgICAgPSAxOwogICAgZ2xfaW5mby0+bWF4X3RleHR1cmVfc3RhZ2VzID0gMTsKICAgIGdsX2luZm8tPm1heF9mcmFnbWVudF9zYW1wbGVycyA9IDE7CiAgICBnbF9pbmZvLT5tYXhfdmVydGV4X3NhbXBsZXJzID0gMDsKICAgIGdsX2luZm8tPm1heF9jb21iaW5lZF9zYW1wbGVycyA9IDA7CiAgICBnbF9pbmZvLT5tYXhfc2FtcGxlcl9zdGFnZXMgPSAxOwogICAgZ2xfaW5mby0+cHNfYXJiX3ZlcnNpb24gPSBQU19WRVJTSU9OX05PVF9TVVBQT1JURUQ7CiAgICBnbF9pbmZvLT5wc19hcmJfbWF4X3RlbXBzID0gMDsKICAgIGdsX2luZm8tPnBzX2FyYl9tYXhfaW5zdHJ1Y3Rpb25zID0gMDsKICAgIGdsX2luZm8tPnZzX2FyYl92ZXJzaW9uID0gVlNfVkVSU0lPTl9OT1RfU1VQUE9SVEVEOwogICAgZ2xfaW5mby0+dnNfYXJiX21heF90ZW1wcyA9IDA7CiAgICBnbF9pbmZvLT52c19hcmJfbWF4X2luc3RydWN0aW9ucyA9IDA7CiAgICBnbF9pbmZvLT52c19udl92ZXJzaW9uICA9IFZTX1ZFUlNJT05fTk9UX1NVUFBPUlRFRDsKICAgIGdsX2luZm8tPnZzX2F0aV92ZXJzaW9uID0gVlNfVkVSU0lPTl9OT1RfU1VQUE9SVEVEOwogICAgZ2xfaW5mby0+dnNfZ2xzbF9jb25zdGFudHNGID0gMDsKICAgIGdsX2luZm8tPnBzX2dsc2xfY29uc3RhbnRzRiA9IDA7CiAgICBnbF9pbmZvLT52c19hcmJfY29uc3RhbnRzRiA9IDA7CiAgICBnbF9pbmZvLT5wc19hcmJfY29uc3RhbnRzRiA9IDA7CgogICAgLyogUmV0cmlldmUgb3BlbmdsIGRlZmF1bHRzICovCiAgICBnbEdldEludGVnZXJ2KEdMX01BWF9DTElQX1BMQU5FUywgJmdsX21heCk7CiAgICBnbF9pbmZvLT5tYXhfY2xpcHBsYW5lcyA9IG1pbihXSU5FRDNETUFYVVNFUkNMSVBQTEFORVMsIGdsX21heCk7CiAgICBUUkFDRV8oZDNkX2NhcHMpKCJDbGlwUGxhbmVzIHN1cHBvcnQgLSBudW0gUGxhbmVzPSVkXG4iLCBnbF9tYXgpOwoKICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX0xJR0hUUywgJmdsX21heCk7CiAgICBnbF9pbmZvLT5tYXhfbGlnaHRzID0gZ2xfbWF4OwogICAgVFJBQ0VfKGQzZF9jYXBzKSgiTGlnaHRzIHN1cHBvcnQgLSBtYXggbGlnaHRzPSVkXG4iLCBnbF9tYXgpOwoKICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX1RFWFRVUkVfU0laRSwgJmdsX21heCk7CiAgICBnbF9pbmZvLT5tYXhfdGV4dHVyZV9zaXplID0gZ2xfbWF4OwogICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4aW11bSB0ZXh0dXJlIHNpemUgc3VwcG9ydCAtIG1heCB0ZXh0dXJlIHNpemU9JWRcbiIsIGdsX21heCk7CgogICAgZ2xHZXRGbG9hdHYoR0xfUE9JTlRfU0laRV9SQU5HRSwgZ2xfZmxvYXR2KTsKICAgIGdsX2luZm8tPm1heF9wb2ludHNpemVtaW4gPSBnbF9mbG9hdHZbMF07CiAgICBnbF9pbmZvLT5tYXhfcG9pbnRzaXplID0gZ2xfZmxvYXR2WzFdOwogICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4aW11bSBwb2ludCBzaXplIHN1cHBvcnQgLSBtYXggcG9pbnQgc2l6ZT0lZlxuIiwgZ2xfZmxvYXR2WzFdKTsKCiAgICAvKiBQYXJzZSB0aGUgZ2wgc3VwcG9ydGVkIGZlYXR1cmVzLCBpbiB0aGVvcnkgZW5hYmxpbmcgcGFydHMgb2Ygb3VyIGNvZGUgYXBwcm9wcmlhdGVseSAqLwogICAgR0xfRXh0ZW5zaW9ucyA9IChjb25zdCBjaGFyICopIGdsR2V0U3RyaW5nKEdMX0VYVEVOU0lPTlMpOwogICAgVFJBQ0VfKGQzZF9jYXBzKSgiR0xfRXh0ZW5zaW9ucyByZXBvcnRlZDpcbiIpOwoKICAgIGlmIChOVUxMID09IEdMX0V4dGVuc2lvbnMpIHsKICAgICAgICBFUlIoIiAgIEdMX0V4dGVuc2lvbnMgcmV0dXJucyBOVUxMXG4iKTsKICAgIH0gZWxzZSB7CiAgICAgICAgd2hpbGUgKCpHTF9FeHRlbnNpb25zICE9IDB4MDApIHsKICAgICAgICAgICAgY29uc3QgY2hhciAqU3RhcnQ7CiAgICAgICAgICAgIGNoYXIgICAgICAgIFRoaXNFeHRuWzI1Nl07CiAgICAgICAgICAgIHNpemVfdCAgICAgIGxlbjsKCiAgICAgICAgICAgIHdoaWxlIChpc3NwYWNlKCpHTF9FeHRlbnNpb25zKSkgR0xfRXh0ZW5zaW9ucysrOwogICAgICAgICAgICBTdGFydCA9IEdMX0V4dGVuc2lvbnM7CiAgICAgICAgICAgIHdoaWxlICghaXNzcGFjZSgqR0xfRXh0ZW5zaW9ucykgJiYgKkdMX0V4dGVuc2lvbnMgIT0gMHgwMCkgewogICAgICAgICAgICAgICAgR0xfRXh0ZW5zaW9ucysrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBsZW4gPSBHTF9FeHRlbnNpb25zIC0gU3RhcnQ7CiAgICAgICAgICAgIGlmIChsZW4gPT0gMCB8fCBsZW4gPj0gc2l6ZW9mKFRoaXNFeHRuKSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgbWVtY3B5KFRoaXNFeHRuLCBTdGFydCwgbGVuKTsKICAgICAgICAgICAgVGhpc0V4dG5bbGVuXSA9ICdcMCc7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIi0gJXNcbiIsIFRoaXNFeHRuKTsKCiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mKEVYVEVOU0lPTl9NQVApIC8gc2l6ZW9mKCpFWFRFTlNJT05fTUFQKSk7ICsraSkgewogICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoVGhpc0V4dG4sIEVYVEVOU0lPTl9NQVBbaV0uZXh0ZW5zaW9uX3N0cmluZykpIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCIgRk9VTkQ6ICVzIHN1cHBvcnRcbiIsIEVYVEVOU0lPTl9NQVBbaV0uZXh0ZW5zaW9uX3N0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0VYVEVOU0lPTl9NQVBbaV0uZXh0ZW5zaW9uXSA9IFRSVUU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyogTm93IHdvcmsgb3V0IHdoYXQgR0wgc3VwcG9ydCB0aGlzIGNhcmQgcmVhbGx5IGhhcyAqLwojZGVmaW5lIFVTRV9HTF9GVU5DKHR5cGUsIHBmbiwgZXh0LCByZXBsYWNlKSB7IFwKICAgICAgICAgICAgRFdPUkQgdmVyID0gdmVyX2Zvcl9leHQoZXh0KTsgXAogICAgICAgICAgICBpZihnbF9pbmZvLT5zdXBwb3J0ZWRbZXh0XSkgZ2xfaW5mby0+cGZuID0gKHR5cGUpIHB3Z2xHZXRQcm9jQWRkcmVzcygjcGZuKTsgXAogICAgICAgICAgICBlbHNlIGlmKHZlciAmJiB2ZXIgPD0gZ2xfaW5mby0+Z2xfdmVyc2lvbikgZ2xfaW5mby0+cGZuID0gKHR5cGUpIHB3Z2xHZXRQcm9jQWRkcmVzcygjcmVwbGFjZSk7IFwKICAgICAgICAgICAgZWxzZSBnbF9pbmZvLT5wZm4gPSBOVUxMOyBcCiAgICAgICAgfQogICAgICAgIEdMX0VYVF9GVU5DU19HRU47CiN1bmRlZiBVU0VfR0xfRlVOQwoKI2RlZmluZSBVU0VfR0xfRlVOQyh0eXBlLCBwZm4sIGV4dCwgcmVwbGFjZSkgZ2xfaW5mby0+cGZuID0gKHR5cGUpIHB3Z2xHZXRQcm9jQWRkcmVzcygjcGZuKTsKICAgICAgICBXR0xfRVhUX0ZVTkNTX0dFTjsKI3VuZGVmIFVTRV9HTF9GVU5DCgogICAgICAgIC8qIE5vdyBtYXJrIGFsbCB0aGUgZXh0ZW5zaW9ucyBzdXBwb3J0ZWQgd2hpY2ggYXJlIGluY2x1ZGVkIGluIHRoZSBvcGVuZ2wgY29yZSB2ZXJzaW9uLiBEbyB0aGlzICphZnRlcioKICAgICAgICAgKiBsb2FkaW5nIHRoZSBmdW5jdGlvbnMsIG90aGVyd2lzZSB0aGUgY29kZSBhYm92ZSB3aWxsIGxvYWQgdGhlIGV4dGVuc2lvbiBlbnRyeSBwb2ludHMgaW5zdGVhZCBvZiB0aGUKICAgICAgICAgKiBjb3JlIGZ1bmN0aW9ucywgd2hpY2ggbWF5IG5vdCB3b3JrCiAgICAgICAgICovCiAgICAgICAgZm9yIChpID0gMDsgaSA8IChzaXplb2YoRVhURU5TSU9OX01BUCkgLyBzaXplb2YoKkVYVEVOU0lPTl9NQVApKTsgKytpKSB7CiAgICAgICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbRVhURU5TSU9OX01BUFtpXS5leHRlbnNpb25dID09IEZBTFNFICYmCiAgICAgICAgICAgICAgICBFWFRFTlNJT05fTUFQW2ldLnZlcnNpb24gPD0gZ2xfaW5mby0+Z2xfdmVyc2lvbiAmJiBFWFRFTlNJT05fTUFQW2ldLnZlcnNpb24pIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIiBHTCBDT1JFOiAlcyBzdXBwb3J0XG4iLCBFWFRFTlNJT05fTUFQW2ldLmV4dGVuc2lvbl9zdHJpbmcpOwogICAgICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0VYVEVOU0lPTl9NQVBbaV0uZXh0ZW5zaW9uXSA9IFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVBQTEVfRkVOQ0VdKSB7CiAgICAgICAgICAgIC8qIEdMX05WX2ZlbmNlIGFuZCBHTF9BUFBMRV9mZW5jZSBwcm92aWRlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYmFzaWNhbGx5LgogICAgICAgICAgICAgKiBUaGUgYXBwbGUgZXh0ZW5zaW9uIGludGVyYWN0cyB3aXRoIHNvbWUgb3RoZXIgYXBwbGUgZXh0cy4gRGlzYWJsZSB0aGUgTlYKICAgICAgICAgICAgICogZXh0ZW5zaW9uIGlmIHRoZSBhcHBsZSBvbmUgaXMgc3VwcG9ydCB0byBwcmV2ZW50IGNvbmZ1c2lvbiBpbiBvdGhlciBwYXJ0cwogICAgICAgICAgICAgKiBvZiB0aGUgY29kZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW05WX0ZFTkNFXSA9IEZBTFNFOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0FQUExFX0ZMT0FUX1BJWEVMU10pIHsKICAgICAgICAgICAgLyogR0xfQVBQTEVfZmxvYXRfcGl4ZWxzID09IEdMX0FSQl90ZXh0dXJlX2Zsb2F0ICsgR0xfQVJCX2hhbGZfZmxvYXRfcGl4ZWwKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogVGhlIGVudW1zIGFyZSB0aGUgc2FtZToKICAgICAgICAgICAgICogR0xfUkdCQTE2Rl9BUkIgICAgID0gR0xfUkdCQV9GTE9BVDE2X0FQUExFID0gMHg4ODFBCiAgICAgICAgICAgICAqIEdMX1JHQjE2Rl9BUkIgICAgICA9IEdMX1JHQl9GTE9BVDE2X0FQUExFICA9IDB4ODgxQgogICAgICAgICAgICAgKiBHTF9SR0JBMzJGX0FSQiAgICAgPSBHTF9SR0JBX0ZMT0FUMzJfQVBQTEUgPSAweDg4MTQKICAgICAgICAgICAgICogR0xfUkdCMzJGX0FSQiAgICAgID0gR0xfUkdCX0ZMT0FUMzJfQVBQTEUgID0gMHg4ODE1CiAgICAgICAgICAgICAqIEdMX0hBTEZfRkxPQVRfQVJCICA9IEdMX0hBTEZfQVBQTEUgICAgICAgICA9ICAweDE0MEIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmKCFnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1RFWFRVUkVfRkxPQVRdKSB7CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCIgSU1QTElFRDogR0xfQVJCX3RleHR1cmVfZmxvYXQgc3VwcG9ydChmcm9tIEdMX0FQUExFX2Zsb2F0X3BpeGVsc1xuIik7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1RFWFRVUkVfRkxPQVRdID0gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZighZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9IQUxGX0ZMT0FUX1BJWEVMXSkgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiIElNUExJRUQ6IEdMX0FSQl9oYWxmX2Zsb2F0X3BpeGVsIHN1cHBvcnQoZnJvbSBHTF9BUFBMRV9mbG9hdF9waXhlbHNcbiIpOwogICAgICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9IQUxGX0ZMT0FUX1BJWEVMXSA9IFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfVEVYVFVSRV9DVUJFX01BUF0pIHsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiIElNUExJRUQ6IE5WSURJQSAoTlYpIFRleHR1cmUgR2VuIFJlZmxlY3Rpb24gc3VwcG9ydFxuIik7CiAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtOVl9URVhHRU5fUkVGTEVDVElPTl0gPSBUUlVFOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW05WX1RFWFRVUkVfU0hBREVSMl0pIHsKICAgICAgICAgICAgLyogR0xfQVRJX2Vudm1hcF9idW1wbWFwIHdvbid0IHBsYXkgbmljZSB3aXRoIHRleHR1cmUgc2hhZGVycywgc28gZGlzYWJsZSBpdAogICAgICAgICAgICAgKiBXb24ndCBvY2N1ciBpbiBhbnkgcmVhbCB3b3JsZCBzaXR1YXRpb24gdGhvdWdoCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbQVRJX0VOVk1BUF9CVU1QTUFQXSA9IEZBTFNFOwogICAgICAgICAgICBpZihnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfUkVHSVNURVJfQ09NQklORVJTXSkgewogICAgICAgICAgICAgICAgLyogQWxzbyBkaXNhYmxlIEFUSV9GUkFHTUVOVF9TSEFERVIgaWYgcmVnaXN0ZXIgY29tYmluZXJzIGFuZCB0ZXh0dXJlX3NoYWRlcjIKICAgICAgICAgICAgICAgICAqIGFyZSBzdXBwb3J0ZWQuIFRoZSBudiBleHRlbnNpb25zIHByb3ZpZGUgdGhlIHNhbWUgZnVuY3Rpb25hbGl0eSBhcyB0aGUKICAgICAgICAgICAgICAgICAqIEFUSSBvbmUsIGFuZCBhIGJpdCBtb3JlKHNpZ25lZCBwaXhlbGZvcm1hdHMpCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtBVElfRlJBR01FTlRfU0hBREVSXSA9IEZBTFNFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX0RSQVdfQlVGRkVSU10pIHsKICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfRFJBV19CVUZGRVJTX0FSQiwgJmdsX21heCk7CiAgICAgICAgICAgIGdsX2luZm8tPm1heF9idWZmZXJzID0gZ2xfbWF4OwogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXggZHJhdyBidWZmZXJzOiAldVxuIiwgZ2xfbWF4KTsKICAgICAgICB9CiAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfTVVMVElURVhUVVJFXSkgewogICAgICAgICAgICBnbEdldEludGVnZXJ2KEdMX01BWF9URVhUVVJFX1VOSVRTX0FSQiwgJmdsX21heCk7CiAgICAgICAgICAgIGdsX2luZm8tPm1heF90ZXh0dXJlcyA9IG1pbihNQVhfVEVYVFVSRVMsIGdsX21heCk7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCB0ZXh0dXJlczogJWRcbiIsIGdsX2luZm8tPm1heF90ZXh0dXJlcyk7CgogICAgICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW05WX1JFR0lTVEVSX0NPTUJJTkVSU10pIHsKICAgICAgICAgICAgICAgIEdMaW50IHRtcDsKICAgICAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX0dFTkVSQUxfQ09NQklORVJTX05WLCAmdG1wKTsKICAgICAgICAgICAgICAgIGdsX2luZm8tPm1heF90ZXh0dXJlX3N0YWdlcyA9IG1pbihNQVhfVEVYVFVSRVMsIHRtcCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5tYXhfdGV4dHVyZV9zdGFnZXMgPSBtaW4oTUFYX1RFWFRVUkVTLCBnbF9tYXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCB0ZXh0dXJlIHN0YWdlczogJWRcbiIsIGdsX2luZm8tPm1heF90ZXh0dXJlX3N0YWdlcyk7CgogICAgICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9GUkFHTUVOVF9QUk9HUkFNXSkgewogICAgICAgICAgICAgICAgR0xpbnQgdG1wOwogICAgICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9JTUFHRV9VTklUU19BUkIsICZ0bXApOwogICAgICAgICAgICAgICAgZ2xfaW5mby0+bWF4X2ZyYWdtZW50X3NhbXBsZXJzID0gbWluKE1BWF9GUkFHTUVOVF9TQU1QTEVSUywgdG1wKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdsX2luZm8tPm1heF9mcmFnbWVudF9zYW1wbGVycyA9IG1heChnbF9pbmZvLT5tYXhfZnJhZ21lbnRfc2FtcGxlcnMsIGdsX21heCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4IGZyYWdtZW50IHNhbXBsZXJzOiAlZFxuIiwgZ2xfaW5mby0+bWF4X2ZyYWdtZW50X3NhbXBsZXJzKTsKCiAgICAgICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1ZFUlRFWF9TSEFERVJdKSB7CiAgICAgICAgICAgICAgICBHTGludCB0bXA7CiAgICAgICAgICAgICAgICBnbEdldEludGVnZXJ2KEdMX01BWF9WRVJURVhfVEVYVFVSRV9JTUFHRV9VTklUU19BUkIsICZ0bXApOwogICAgICAgICAgICAgICAgZ2xfaW5mby0+bWF4X3ZlcnRleF9zYW1wbGVycyA9IHRtcDsKICAgICAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX0NPTUJJTkVEX1RFWFRVUkVfSU1BR0VfVU5JVFNfQVJCLCAmdG1wKTsKICAgICAgICAgICAgICAgIGdsX2luZm8tPm1heF9jb21iaW5lZF9zYW1wbGVycyA9IHRtcDsKCiAgICAgICAgICAgICAgICAvKiBMb2FkaW5nIEdMU0wgc2FtcGxlciB1bmlmb3JtcyBpcyBtdWNoIHNpbXBsZXIgaWYgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSBzYW1wbGVyIHNldHVwCiAgICAgICAgICAgICAgICAgKiBpcyBrbm93biBhdCBzaGFkZXIgbGluayB0aW1lLiBJbiBhIHZlcnRleCBzaGFkZXIgKyBwaXhlbCBzaGFkZXIgY29tYmluYXRpb24gdGhpcyBpc24ndAogICAgICAgICAgICAgICAgICogYW4gaXNzdWUgYmVjYXVzZSB0aGVuIHRoZSBzYW1wbGVyIHNldHVwIG9ubHkgZGVwZW5kcyBvbiB0aGUgdHdvIHNoYWRlcnMuIElmIGEgcGl4ZWwKICAgICAgICAgICAgICAgICAqIHNoYWRlciBpcyB1c2VkIHdpdGggZml4ZWQgZnVuY3Rpb24gdmVydGV4IHByb2Nlc3Npbmcgd2UncmUgZmluZSB0b28gYmVjYXVzZSBmaXhlZCBmdW5jdGlvbgogICAgICAgICAgICAgICAgICogdmVydGV4IHByb2Nlc3NpbmcgZG9lc24ndCB1c2UgYW55IHNhbXBsZXJzLiBJZiBmaXhlZCBmdW5jdGlvbiBmcmFnbWVudCBwcm9jZXNzaW5nIGlzCiAgICAgICAgICAgICAgICAgKiB1c2VkIHdlIGhhdmUgdG8gbWFrZSBzdXJlIHRoYXQgYWxsIHZlcnRleCBzYW1wbGVyIHNldHVwcyBhcmUgdmFsaWQgdG9nZXRoZXIgd2l0aCBhbGwKICAgICAgICAgICAgICAgICAqIHBvc3NpYmxlIGZpeGVkIGZ1bmN0aW9uIGZyYWdtZW50IHByb2Nlc3Npbmcgc2V0dXBzLiBUaGlzIGlzIHRydWUgaWYgdnNhbXBsZXJzICsgTUFYX1RFWFRVUkVTCiAgICAgICAgICAgICAgICAgKiA8PSBtYXhfc2FtcGxlcnMuIFRoaXMgaXMgdHJ1ZSBvbiBhbGwgZDNkOSBjYXJkcyB0aGF0IHN1cHBvcnQgdnRmKGdmIDYgYW5kIGdmNyBjYXJkcykuCiAgICAgICAgICAgICAgICAgKiBkeDkgcmFkZW9uIGNhcmRzIGRvIG5vdCBzdXBwb3J0IHZlcnRleCB0ZXh0dXJlIGZldGNoLiBEWDEwIGNhcmRzIGhhdmUgMTI4IHNhbXBsZXJzLCBhbmQKICAgICAgICAgICAgICAgICAqIGR4OSBpcyBsaW1pdGVkIHRvIDggZml4ZWQgZnVuY3Rpb24gdGV4dHVyZSBzdGFnZXMgYW5kIDQgdmVydGV4IHNhbXBsZXJzLiBEWDEwIGRvZXMgbm90IGhhdmUKICAgICAgICAgICAgICAgICAqIGEgZml4ZWQgZnVuY3Rpb24gcGlwZWxpbmUgYW55bW9yZS4KICAgICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgICAgKiBTbyB0aGlzIGlzIGp1c3QgYSBjaGVjayB0byBjaGVjayB0aGF0IG91ciBhc3N1bXB0aW9uIGhvbGRzIHRydWUuIElmIG5vdCwgd3JpdGUgYSB3YXJuaW5nCiAgICAgICAgICAgICAgICAgKiBhbmQgcmVkdWNlIHRoZSBudW1iZXIgb2YgdmVydGV4IHNhbXBsZXJzIG9yIHByb2JhYmx5IGRpc2FibGUgdmVydGV4IHRleHR1cmUgZmV0Y2guCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGlmKGdsX2luZm8tPm1heF92ZXJ0ZXhfc2FtcGxlcnMgJiYKICAgICAgICAgICAgICAgICAgIE1BWF9URVhUVVJFUyArIGdsX2luZm8tPm1heF92ZXJ0ZXhfc2FtcGxlcnMgPiBnbF9pbmZvLT5tYXhfY29tYmluZWRfc2FtcGxlcnMpIHsKICAgICAgICAgICAgICAgICAgICBGSVhNRSgiT3BlbkdMIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzICV1IHZlcnRleCBzYW1wbGVycyBhbmQgJXUgdG90YWwgc2FtcGxlcnNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+bWF4X3ZlcnRleF9zYW1wbGVycywgZ2xfaW5mby0+bWF4X2NvbWJpbmVkX3NhbXBsZXJzKTsKICAgICAgICAgICAgICAgICAgICBGSVhNRSgiRXhwZWN0ZWQgdmVydGV4IHNhbXBsZXJzICsgTUFYX1RFWFRVUkVTKD04KSA+IGNvbWJpbmVkX3NhbXBsZXJzXG4iKTsKICAgICAgICAgICAgICAgICAgICBpZiggZ2xfaW5mby0+bWF4X2NvbWJpbmVkX3NhbXBsZXJzID4gTUFYX1RFWFRVUkVTICkKICAgICAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+bWF4X3ZlcnRleF9zYW1wbGVycyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5tYXhfY29tYmluZWRfc2FtcGxlcnMgLSBNQVhfVEVYVFVSRVM7CiAgICAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5tYXhfdmVydGV4X3NhbXBsZXJzID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdsX2luZm8tPm1heF9jb21iaW5lZF9zYW1wbGVycyA9IGdsX2luZm8tPm1heF9mcmFnbWVudF9zYW1wbGVyczsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXggdmVydGV4IHNhbXBsZXJzOiAldVxuIiwgZ2xfaW5mby0+bWF4X3ZlcnRleF9zYW1wbGVycyk7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCBjb21iaW5lZCBzYW1wbGVyczogJXVcbiIsIGdsX2luZm8tPm1heF9jb21iaW5lZF9zYW1wbGVycyk7CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1ZFUlRFWF9CTEVORF0pIHsKICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVkVSVEVYX1VOSVRTX0FSQiwgJmdsX21heCk7CiAgICAgICAgICAgIGdsX2luZm8tPm1heF9ibGVuZHMgPSBnbF9tYXg7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCBibGVuZHM6ICV1XG4iLCBnbF9pbmZvLT5tYXhfYmxlbmRzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtFWFRfVEVYVFVSRTNEXSkgewogICAgICAgICAgICBnbEdldEludGVnZXJ2KEdMX01BWF8zRF9URVhUVVJFX1NJWkVfRVhULCAmZ2xfbWF4KTsKICAgICAgICAgICAgZ2xfaW5mby0+bWF4X3RleHR1cmUzZF9zaXplID0gZ2xfbWF4OwogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXggdGV4dHVyZTNEIHNpemU6ICVkXG4iLCBnbF9pbmZvLT5tYXhfdGV4dHVyZTNkX3NpemUpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0VYVF9URVhUVVJFX0ZJTFRFUl9BTklTT1RST1BJQ10pIHsKICAgICAgICAgICAgZ2xHZXRJbnRlZ2VydihHTF9NQVhfVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsICZnbF9tYXgpOwogICAgICAgICAgICBnbF9pbmZvLT5tYXhfYW5pc290cm9weSA9IGdsX21heDsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4IGFuaXNvdHJvcHk6ICVkXG4iLCBnbF9pbmZvLT5tYXhfYW5pc290cm9weSk7CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX0ZSQUdNRU5UX1BST0dSQU1dKSB7CiAgICAgICAgICAgIGdsX2luZm8tPnBzX2FyYl92ZXJzaW9uID0gUFNfVkVSU0lPTl8xMTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEdldFByb2dyYW1pdkFSQihHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQiwgR0xfTUFYX1BST0dSQU1fRU5WX1BBUkFNRVRFUlNfQVJCLCAmZ2xfbWF4KSk7CiAgICAgICAgICAgIGdsX2luZm8tPnBzX2FyYl9jb25zdGFudHNGID0gZ2xfbWF4OwogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXggQVJCX0ZSQUdNRU5UX1BST0dSQU0gZmxvYXQgY29uc3RhbnRzOiAlZFxuIiwgZ2xfaW5mby0+cHNfYXJiX2NvbnN0YW50c0YpOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsR2V0UHJvZ3JhbWl2QVJCKEdMX0ZSQUdNRU5UX1BST0dSQU1fQVJCLCBHTF9NQVhfUFJPR1JBTV9OQVRJVkVfVEVNUE9SQVJJRVNfQVJCLCAmZ2xfbWF4KSk7CiAgICAgICAgICAgIGdsX2luZm8tPnBzX2FyYl9tYXhfdGVtcHMgPSBnbF9tYXg7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCBBUkJfRlJBR01FTlRfUFJPR1JBTSBuYXRpdmUgdGVtcG9yYXJpZXM6ICVkXG4iLCBnbF9pbmZvLT5wc19hcmJfbWF4X3RlbXBzKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEdldFByb2dyYW1pdkFSQihHTF9GUkFHTUVOVF9QUk9HUkFNX0FSQiwgR0xfTUFYX1BST0dSQU1fTkFUSVZFX0lOU1RSVUNUSU9OU19BUkIsICZnbF9tYXgpKTsKICAgICAgICAgICAgZ2xfaW5mby0+cHNfYXJiX21heF9pbnN0cnVjdGlvbnMgPSBnbF9tYXg7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCBBUkJfRlJBR01FTlRfUFJPR1JBTSBuYXRpdmUgaW5zdHJ1Y3Rpb25zOiAlZFxuIiwgZ2xfaW5mby0+cHNfYXJiX21heF9pbnN0cnVjdGlvbnMpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9WRVJURVhfUFJPR1JBTV0pIHsKICAgICAgICAgICAgZ2xfaW5mby0+dnNfYXJiX3ZlcnNpb24gPSBWU19WRVJTSU9OXzExOwogICAgICAgICAgICBHTF9FWFRDQUxMKGdsR2V0UHJvZ3JhbWl2QVJCKEdMX1ZFUlRFWF9QUk9HUkFNX0FSQiwgR0xfTUFYX1BST0dSQU1fRU5WX1BBUkFNRVRFUlNfQVJCLCAmZ2xfbWF4KSk7CiAgICAgICAgICAgIGdsX2luZm8tPnZzX2FyYl9jb25zdGFudHNGID0gZ2xfbWF4OwogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXggQVJCX1ZFUlRFWF9QUk9HUkFNIGZsb2F0IGNvbnN0YW50czogJWRcbiIsIGdsX2luZm8tPnZzX2FyYl9jb25zdGFudHNGKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEdldFByb2dyYW1pdkFSQihHTF9WRVJURVhfUFJPR1JBTV9BUkIsIEdMX01BWF9QUk9HUkFNX05BVElWRV9URU1QT1JBUklFU19BUkIsICZnbF9tYXgpKTsKICAgICAgICAgICAgZ2xfaW5mby0+dnNfYXJiX21heF90ZW1wcyA9IGdsX21heDsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4IEFSQl9WRVJURVhfUFJPR1JBTSBuYXRpdmUgdGVtcG9yYXJpZXM6ICVkXG4iLCBnbF9pbmZvLT52c19hcmJfbWF4X3RlbXBzKTsKICAgICAgICAgICAgR0xfRVhUQ0FMTChnbEdldFByb2dyYW1pdkFSQihHTF9WRVJURVhfUFJPR1JBTV9BUkIsIEdMX01BWF9QUk9HUkFNX05BVElWRV9JTlNUUlVDVElPTlNfQVJCLCAmZ2xfbWF4KSk7CiAgICAgICAgICAgIGdsX2luZm8tPnZzX2FyYl9tYXhfaW5zdHJ1Y3Rpb25zID0gZ2xfbWF4OwogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXggQVJCX1ZFUlRFWF9QUk9HUkFNIG5hdGl2ZSBpbnN0cnVjdGlvbnM6ICVkXG4iLCBnbF9pbmZvLT52c19hcmJfbWF4X2luc3RydWN0aW9ucyk7CgogICAgICAgICAgICBnbF9pbmZvLT5hcmJfdnNfb2Zmc2V0X2xpbWl0ID0gdGVzdF9hcmJfdnNfb2Zmc2V0X2xpbWl0KGdsX2luZm8pOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9WRVJURVhfU0hBREVSXSkgewogICAgICAgICAgICBnbEdldEludGVnZXJ2KEdMX01BWF9WRVJURVhfVU5JRk9STV9DT01QT05FTlRTX0FSQiwgJmdsX21heCk7CiAgICAgICAgICAgIGdsX2luZm8tPnZzX2dsc2xfY29uc3RhbnRzRiA9IGdsX21heCAvIDQ7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk1heCBBUkJfVkVSVEVYX1NIQURFUiBmbG9hdCBjb25zdGFudHM6ICV1XG4iLCBnbF9pbmZvLT52c19nbHNsX2NvbnN0YW50c0YpOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9GUkFHTUVOVF9TSEFERVJdKSB7CiAgICAgICAgICAgIGdsR2V0SW50ZWdlcnYoR0xfTUFYX0ZSQUdNRU5UX1VOSUZPUk1fQ09NUE9ORU5UU19BUkIsICZnbF9tYXgpOwogICAgICAgICAgICBnbF9pbmZvLT5wc19nbHNsX2NvbnN0YW50c0YgPSBnbF9tYXggLyA0OwogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJNYXggQVJCX0ZSQUdNRU5UX1NIQURFUiBmbG9hdCBjb25zdGFudHM6ICV1XG4iLCBnbF9pbmZvLT5wc19nbHNsX2NvbnN0YW50c0YpOwogICAgICAgICAgICBnbEdldEludGVnZXJ2KEdMX01BWF9WQVJZSU5HX0ZMT0FUU19BUkIsICZnbF9tYXgpOwogICAgICAgICAgICBnbF9pbmZvLT5tYXhfZ2xzbF92YXJ5aW5ncyA9IGdsX21heDsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTWF4IEdMU0wgdmFyeWluZ3M6ICV1ICgldSA0IGNvbXBvbmVudCB2YXJ5aW5ncylcbiIsIGdsX21heCwgZ2xfbWF4IC8gNCk7CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbRVhUX1ZFUlRFWF9TSEFERVJdKSB7CiAgICAgICAgICAgIGdsX2luZm8tPnZzX2F0aV92ZXJzaW9uID0gVlNfVkVSU0lPTl8xMTsKICAgICAgICB9CiAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtOVl9WRVJURVhfUFJPR1JBTTNdKSB7CiAgICAgICAgICAgIGdsX2luZm8tPnZzX252X3ZlcnNpb24gPSBWU19WRVJTSU9OXzMwOwogICAgICAgIH0gZWxzZSBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW05WX1ZFUlRFWF9QUk9HUkFNMl0pIHsKICAgICAgICAgICAgZ2xfaW5mby0+dnNfbnZfdmVyc2lvbiA9IFZTX1ZFUlNJT05fMjA7CiAgICAgICAgfSBlbHNlIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfVkVSVEVYX1BST0dSQU0xXzFdKSB7CiAgICAgICAgICAgIGdsX2luZm8tPnZzX252X3ZlcnNpb24gPSBWU19WRVJTSU9OXzExOwogICAgICAgIH0gZWxzZSBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW05WX1ZFUlRFWF9QUk9HUkFNXSkgewogICAgICAgICAgICBnbF9pbmZvLT52c19udl92ZXJzaW9uID0gVlNfVkVSU0lPTl8xMDsKICAgICAgICB9CiAgICAgICAgaWYgKGdsX2luZm8tPnN1cHBvcnRlZFtOVl9GUkFHTUVOVF9QUk9HUkFNMl0pIHsKICAgICAgICAgICAgZ2xfaW5mby0+cHNfbnZfdmVyc2lvbiA9IFBTX1ZFUlNJT05fMzA7CiAgICAgICAgfSBlbHNlIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfRlJBR01FTlRfUFJPR1JBTV0pIHsKICAgICAgICAgICAgZ2xfaW5mby0+cHNfbnZfdmVyc2lvbiA9IFBTX1ZFUlNJT05fMjA7CiAgICAgICAgfQogICAgICAgIGlmIChnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfTElHSFRfTUFYX0VYUE9ORU5UXSkgewogICAgICAgICAgICBnbEdldEZsb2F0dihHTF9NQVhfU0hJTklORVNTX05WLCAmZ2xfaW5mby0+bWF4X3NoaW5pbmVzcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZ2xfaW5mby0+bWF4X3NoaW5pbmVzcyA9IDEyOC4wOwogICAgICAgIH0KICAgICAgICBpZiAoZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9URVhUVVJFX05PTl9QT1dFUl9PRl9UV09dKSB7CiAgICAgICAgICAgIC8qIElmIHdlIGhhdmUgZnVsbCBOUDIgdGV4dHVyZSBzdXBwb3J0LCBkaXNhYmxlIEdMX0FSQl90ZXh0dXJlX3JlY3RhbmdsZSBiZWNhdXNlIHdlIHdpbGwgbmV2ZXIgdXNlIGl0LgogICAgICAgICAgICAgKiBUaGlzIHNhdmVzIGEgZmV3IHJlZHVuZGFudCBnbERpc2FibGUgY2FsbHMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfVEVYVFVSRV9SRUNUQU5HTEVdID0gRkFMU0U7CiAgICAgICAgfQogICAgICAgIGlmKGdsX2luZm8tPnN1cHBvcnRlZFtBVElfRlJBR01FTlRfU0hBREVSXSkgewogICAgICAgICAgICAvKiBEaXNhYmxlIE5WX3JlZ2lzdGVyX2NvbWJpbmVycyBhbmQgZnJhZ21lbnQgc2hhZGVyIGlmIHRoaXMgaXMgc3VwcG9ydGVkLgogICAgICAgICAgICAgKiBnZW5lcmFsbHkgdGhlIE5WIGV4dGVuc2lvbnMgYXJlIHByZWZlcnJlZCBvdmVyIHRoZSBBVEkgb25lcywgYW5kIHRoaXMKICAgICAgICAgICAgICogZXh0ZW5zaW9uIGlzIGRpc2FibGVkIGlmIHJlZ2lzdGVyX2NvbWJpbmVycyBhbmQgdGV4dHVyZV9zaGFkZXIyIGFyZSBib3RoCiAgICAgICAgICAgICAqIHN1cHBvcnRlZC4gU28gd2UgcmVhY2ggdGhpcyBwbGFjZSBvbmx5IGlmIHdlIGhhdmUgaW5jb21wbGV0ZSBOViBkeGxldmVsIDgKICAgICAgICAgICAgICogZnJhZ21lbnQgcHJvY2Vzc2luZyBzdXBwb3J0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfUkVHSVNURVJfQ09NQklORVJTXSA9IEZBTFNFOwogICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfUkVHSVNURVJfQ09NQklORVJTMl0gPSBGQUxTRTsKICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW05WX1RFWFRVUkVfU0hBREVSXSA9IEZBTFNFOwogICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfVEVYVFVSRV9TSEFERVIyXSA9IEZBTFNFOwogICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbTlZfVEVYVFVSRV9TSEFERVIzXSA9IEZBTFNFOwogICAgICAgIH0KCiAgICB9CiAgICBjaGVja0dMY2FsbCgiZXh0ZW5zaW9uIGRldGVjdGlvblxuIik7CgogICAgLyogSW4gc29tZSBjYXNlcyB0aGUgbnVtYmVyIG9mIHRleHR1cmUgc3RhZ2VzIGNhbiBiZSBsYXJnZXIgdGhhbiB0aGUgbnVtYmVyCiAgICAgKiBvZiBzYW1wbGVycy4gVGhlIEdGNCBmb3IgZXhhbXBsZSBjYW4gdXNlIG9ubHkgMiBzYW1wbGVycyAobm8gZnJhZ21lbnQKICAgICAqIHNoYWRlcnMpLCBidXQgOCB0ZXh0dXJlIHN0YWdlcyAocmVnaXN0ZXIgY29tYmluZXJzKS4gKi8KICAgIGdsX2luZm8tPm1heF9zYW1wbGVyX3N0YWdlcyA9IG1heChnbF9pbmZvLT5tYXhfZnJhZ21lbnRfc2FtcGxlcnMsIGdsX2luZm8tPm1heF90ZXh0dXJlX3N0YWdlcyk7CgogICAgLyogV2UgY2FuIG9ubHkgdXNlIE9STV9GQk8gd2hlbiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgaXQuICovCiAgICBpZiAod2luZWQzZF9zZXR0aW5ncy5vZmZzY3JlZW5fcmVuZGVyaW5nX21vZGUgPT0gT1JNX0ZCTyAmJiAhZ2xfaW5mby0+c3VwcG9ydGVkW0VYVF9GUkFNRUJVRkZFUl9PQkpFQ1RdKSB7CiAgICAgICAgV0FSTl8oZDNkX2NhcHMpKCJHTF9FWFRfZnJhbWVidWZmZXJfb2JqZWN0IG5vdCBzdXBwb3J0ZWQsIGZhbGxpbmcgYmFjayB0byBQQnVmZmVyIG9mZnNjcmVlbiByZW5kZXJpbmcgbW9kZS5cbiIpOwogICAgICAgIHdpbmVkM2Rfc2V0dGluZ3Mub2Zmc2NyZWVuX3JlbmRlcmluZ19tb2RlID0gT1JNX1BCVUZGRVI7CiAgICB9CgogICAgLyogTVJUcyBhcmUgY3VycmVudGx5IG9ubHkgc3VwcG9ydGVkIHdoZW4gRkJPcyBhcmUgdXNlZC4gKi8KICAgIGlmICh3aW5lZDNkX3NldHRpbmdzLm9mZnNjcmVlbl9yZW5kZXJpbmdfbW9kZSAhPSBPUk1fRkJPKSB7CiAgICAgICAgZ2xfaW5mby0+bWF4X2J1ZmZlcnMgPSAxOwogICAgfQoKICAgIC8qIEJlbG93IGlzIGEgbGlzdCBvZiBOdmlkaWEgYW5kIEFUSSBHUFVzLiBCb3RoIHZlbmRvcnMgaGF2ZSBkb3plbnMgb2YgZGlmZmVyZW50IEdQVXMgd2l0aCByb3VnaGx5IHRoZSBzYW1lCiAgICAgKiBmZWF0dXJlcy4gSW4gbW9zdCBjYXNlcyBHUFVzIGZyb20gYSBjZXJ0YWluIGZhbWlseSBkaWZmZXIgaW4gY2xvY2tzcGVlZHMsIHRoZSBhbW91bnQgb2YgdmlkZW8gbWVtb3J5IGFuZAogICAgICogaW4gY2FzZSBvZiB0aGUgbGF0ZXN0IHZpZGVvY2FyZHMgaW4gdGhlIG51bWJlciBvZiBwaXhlbC92ZXJ0ZXggcGlwZWxpbmVzLgogICAgICoKICAgICAqIEEgRGlyZWN0M0QgZGV2aWNlIG9iamVjdCBjb250YWlucyB0aGUgUENJIGlkICh2ZW5kb3IgKyBkZXZpY2UpIG9mIHRoZSB2aWRlb2NhcmQgd2hpY2ggaXMgdXNlZCBmb3IKICAgICAqIHJlbmRlcmluZy4gVmFyaW91cyBnYW1lcyB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0byBnZXQgYSByb3VnaCBlc3RpbWF0aW9uIG9mIHRoZSBmZWF0dXJlcyBvZiB0aGUgY2FyZAogICAgICogYW5kIHNvbWUgbWlnaHQgdXNlIGl0IGZvciBlbmFibGluZyAzZCBlZmZlY3RzIG9ubHkgb24gY2VydGFpbiB0eXBlcyBvZiB2aWRlb2NhcmRzLiBJbiBzb21lIGNhc2VzCiAgICAgKiBnYW1lcyBtaWdodCBldmVuIHVzZSBpdCB0byB3b3JrIGFyb3VuZCBidWdzIHdoaWNoIGhhcHBlbiBvbiBjZXJ0YWluIHZpZGVvY2FyZHMvZHJpdmVyIGNvbWJpbmF0aW9ucy4KICAgICAqIFRoZSBwcm9ibGVtIGlzIHRoYXQgT3BlbkdMIG9ubHkgZXhwb3NlcyBhIHJlbmRlcmluZyBzdHJpbmcgY29udGFpbmluZyB0aGUgbmFtZSBvZiB0aGUgdmlkZW9jYXJkIGFuZAogICAgICogbm90IHRoZSBQQ0kgaWQuCiAgICAgKgogICAgICogVmFyaW91cyBnYW1lcyBkZXBlbmQgb24gdGhlIFBDSSBpZCwgc28gc29tZWhvdyB3ZSBuZWVkIHRvIHByb3ZpZGUgb25lLiBBIHNpbXBsZSBvcHRpb24gaXMgdG8gcGFyc2UKICAgICAqIHRoZSByZW5kZXJlciBzdHJpbmcgYW5kIHRyYW5zbGF0ZSB0aGlzIHRvIHRoZSByaWdodCBQQ0kgaWQuIFRoaXMgaXMgYSBsb3Qgb2Ygd29yayBiZWNhdXNlIHRoZXJlIGFyZSBtb3JlCiAgICAgKiB0aGFuIDIwMCBHUFVzIGp1c3QgZm9yIE52aWRpYS4gVmFyaW91cyBjYXJkcyBzaGFyZSB0aGUgc2FtZSByZW5kZXJlciBzdHJpbmcsIHNvIHRoZSBhbW91bnQgb2YgY29kZSBtaWdodAogICAgICogYmUgJ3NtYWxsJyBidXQgdGhlcmUgYXJlIHF1aXRlIGEgbnVtYmVyIG9mIGV4Y2VwdGlvbnMgd2hpY2ggd291bGQgbWFrZSB0aGlzIGEgcGFpbiB0byBtYWludGFpbi4KICAgICAqIEFub3RoZXIgd2F5IHdvdWxkIGJlIHRvIHF1ZXJ5IHRoZSBQQ0kgaWQgZnJvbSB0aGUgb3BlcmF0aW5nIHN5c3RlbSAoYXNzdW1pbmcgdGhpcyBpcyB0aGUgdmlkZW9jYXJkIHdoaWNoCiAgICAgKiBpcyB1c2VkIGZvciByZW5kZXJpbmcgd2hpY2ggaXMgbm90IGFsd2F5cyB0aGUgY2FzZSkuIFRoaXMgd291bGQgd29yayBidXQgaXQgaXMgbm90IHZlcnkgcG9ydGFibGUuIFNlY29uZAogICAgICogaXQgd291bGQgbm90IHdvcmsgd2VsbCBpbiwgbGV0J3Mgc2F5LCBhIHJlbW90ZSBYIHNpdHVhdGlvbiBpbiB3aGljaCB0aGUgYW1vdW50IG9mIDNkIGZlYXR1cmVzIHdoaWNoIGNhbiBiZSB1c2VkCiAgICAgKiBpcyBsaW1pdGVkLgogICAgICoKICAgICAqIEFzIHNhaWQgbW9zdCBnYW1lcyBvbmx5IHVzZSB0aGUgUENJIGlkIHRvIGdldCBhbiBpbmRpY2F0aW9uIG9mIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIGNhcmQuCiAgICAgKiBJdCBkb2Vzbid0IHJlYWxseSBtYXR0ZXIgaWYgdGhlIGdpdmVuIGlkIGlzIHRoZSBjb3JyZWN0IG9uZSBpZiB3ZSByZXR1cm4gdGhlIGlkIG9mIGEgY2FyZCB3aXRoCiAgICAgKiBzaW1pbGFyIDNkIGZlYXR1cmVzLgogICAgICoKICAgICAqIFRoZSBjb2RlIGJlbG93IGNoZWNrcyB0aGUgT3BlbkdMIGNhcGFiaWxpdGllcyBvZiBhIHZpZGVvY2FyZCBhbmQgbWF0Y2hlcyB0aGF0IHRvIGEgY2VydGFpbiBsZXZlbCBvZgogICAgICogRGlyZWN0M0QgZnVuY3Rpb25hbGl0eS4gT25jZSBhIGNhcmQgcGFzc2VzIHRoZSBEaXJlY3QzRDkgY2hlY2ssIHdlIGtub3cgdGhhdCB0aGUgY2FyZCAoaW4gY2FzZSBvZiBOdmlkaWEpCiAgICAgKiBpcyBhdCBsZWFzdCBhIEdlZm9yY2VGWC4gVG8gZ2l2ZSBhIGJldHRlciBlc3RpbWF0ZSB3ZSBkbyBhIGJhc2ljIGNoZWNrIG9uIHRoZSByZW5kZXJlciBzdHJpbmcgYnV0IGlmIHRoYXQKICAgICAqIHdvbid0IHBhc3Mgd2UgcmV0dXJuIGEgZGVmYXVsdCBjYXJkLiBUaGlzIHdheSBpcyBiZXR0ZXIgdGhhbiBtYWludGFpbmluZyBhIGZ1bGwgY2FyZCBkYXRhYmFzZSBhcyBldmVuCiAgICAgKiB3aXRob3V0IGEgZnVsbCBkYXRhYmFzZSB3ZSBjYW4gcmV0dXJuIGEgY2FyZCB3aXRoIHNpbWlsYXIgZmVhdHVyZXMuIFNlY29uZCB0aGUgc2l6ZSBvZiB0aGUgZGF0YWJhc2UKICAgICAqIGNhbiBiZSBtYWRlIHF1aXRlIHNtYWxsIGJlY2F1c2Ugd2hlbiB5b3Uga25vdyB3aGF0IHR5cGUgb2YgM2QgZnVuY3Rpb25hbGl0eSBhIGNhcmQgaGFzLCB5b3Uga25vdyB0byB3aGljaAogICAgICogR1BVIGZhbWlseSB0aGUgR1BVIG11c3QgYmVsb25nLiBCZWNhdXNlIG9mIHRoaXMgeW91IG9ubHkgaGF2ZSB0byBjaGVjayBhIHNtYWxsIHBhcnQgb2YgdGhlIHJlbmRlcmVyIHN0cmluZwogICAgICogdG8gZGlzdGluZ3Vpc2hlcyBiZXR3ZWVuIGRpZmZlcmVudCBtb2RlbHMgZnJvbSB0aGF0IGZhbWlseS4KICAgICAqCiAgICAgKiBUaGUgY29kZSBhbHNvIHNlbGVjdHMgYSBkZWZhdWx0IGFtb3VudCBvZiB2aWRlbyBtZW1vcnkgd2hpY2ggd2Ugd2lsbCB1c2UgZm9yIGFuIGVzdGltYXRpb24gb2YgdGhlIGFtb3VudAogICAgICogb2YgZnJlZSB0ZXh0dXJlIG1lbW9yeS4gSW4gY2FzZSBvZiByZWFsIEQzRCB0aGUgYW1vdW50IG9mIHRleHR1cmUgbWVtb3J5IGluY2x1ZGVzIHZpZGVvIG1lbW9yeSBhbmQgc3lzdGVtCiAgICAgKiBtZW1vcnkgKHRvIGJlIHNwZWNpZmljIEFHUCBtZW1vcnkgb3IgaW4gY2FzZSBvZiBQQ0lFIFR1cmJvQ2FjaGUvSHlwZXJNZW1vcnkpLiBXZSBkb24ndCBrbm93IGhvdyBtdWNoCiAgICAgKiBzeXN0ZW0gbWVtb3J5IGNhbiBiZSBhZGRyZXNzZWQgYnkgdGhlIHN5c3RlbSBidXQgd2UgY2FuIG1ha2UgYSByZWFzb25hYmxlIGVzdGltYXRpb24gYWJvdXQgdGhlIGFtb3VudCBvZgogICAgICogdmlkZW8gbWVtb3J5LiBJZiB0aGUgdmFsdWUgaXMgc2xpZ2h0bHkgd3JvbmcgaXQgZG9lc24ndCBtYXR0ZXIgYXMgd2UgZGlkbid0IGluY2x1ZGUgQUdQLWxpa2UgbWVtb3J5IHdoaWNoCiAgICAgKiBtYWtlcyB0aGUgYW1vdW50IG9mIGFkZHJlc3NhYmxlIG1lbW9yeSBoaWdoZXIgYW5kIHNlY29uZCBPcGVuR0wgaXNuJ3QgdGhhdCBjcml0aWNhbCBpdCBtb3ZlcyB0byBzeXN0ZW0KICAgICAqIG1lbW9yeSBiZWhpbmQgb3VyIGJhY2tzIGlmIHJlYWxseSBuZWVkZWQuCiAgICAgKiBOb3RlIHRoYXQgdGhlIGFtb3VudCBvZiB2aWRlbyBtZW1vcnkgY2FuIGJlIG92ZXJydWxlZCB1c2luZyBhIHJlZ2lzdHJ5IHNldHRpbmcuCiAgICAgKi8KICAgIHN3aXRjaCAoZ2xfaW5mby0+Z2xfdmVuZG9yKSB7CiAgICAgICAgY2FzZSBWRU5ET1JfTlZJRElBOgogICAgICAgICAgICAvKiBCb3RoIHRoZSBHZWZvcmNlRlgsIDZ4eHggYW5kIDd4eHggc2VyaWVzIHN1cHBvcnQgRDNEOS4gVGhlIGxhc3QgdHdvIHR5cGVzIGhhdmUgbW9yZQogICAgICAgICAgICAgKiBzaGFkZXIgY2FwYWJpbGl0aWVzLCBzbyB3ZSB1c2UgdGhlIHNoYWRlciBjYXBhYmlsaXRpZXMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBGWCBhbmQgNnh4eC83eHh4LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWYoV0lORV9EM0Q5X0NBUEFCTEUoZ2xfaW5mbykgJiYgKGdsX2luZm8tPnZzX252X3ZlcnNpb24gPT0gVlNfVkVSU0lPTl8zMCkpIHsKICAgICAgICAgICAgICAgIC8qIEdlZm9yY2U4IC0gaGlnaGVuZCAqLwogICAgICAgICAgICAgICAgaWYgKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjg4MDAiKSkgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFXzg4MDBHVFM7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gMzIwOyAvKiBUaGUgODgwMEdUUyB1c2VzIDMyME1CLCBhIDg4MDBHVFggY2FuIGhhdmUgNzY4TUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEdlZm9yY2U4IC0gbWlkZW5kIG1vYmlsZSAqLwogICAgICAgICAgICAgICAgZWxzZSBpZihzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI4NjAwIE0iKSkgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFXzg2MDBNR1Q7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gNTEyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogR2Vmb3JjZTggLSBtaWRlbmQgKi8KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiODYwMCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjg3MDAiKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRV84NjAwR1Q7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gMjU2OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogR2Vmb3JjZTggLSBsb3dlbmQgKi8KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiODMwMCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjg0MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI4NTAwIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0VfODMwMEdTOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDEyODsgLyogMTI4LTI1Nk1CIGZvciBhIDgzMDAsIDI1Ni01MTJNQiBmb3IgYSA4NDAwICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBHZWZvcmNlNyAtIGhpZ2hlbmQgKi8KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNzgwMCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjc5MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI3OTUwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiUXVhZHJvIEZYIDQiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJRdWFkcm8gRlggNSIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFXzc4MDBHVDsKICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAyNTY7IC8qIEEgNzgwMEdUIHVzZXMgMjU2TUIgd2hpbGUgaGlnaGVuZCA3OTAwIGNhcmRzIGNhbiB1c2UgNTEyTUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEdlZm9yY2U3IG1pZGVuZCAqLwogICAgICAgICAgICAgICAgZWxzZSBpZihzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI3NjAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNzcwMCIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0VfNzYwMDsKICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAyNTY7IC8qIFRoZSA3NjAwIHVzZXMgMjU2LTUxMk1CICovCiAgICAgICAgICAgICAgICAvKiBHZWZvcmNlNyBsb3dlciBtZWRpdW0gKi8KICAgICAgICAgICAgICAgIH0gZWxzZSBpZihzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI3NDAwIikpIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRV83NDAwOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDI1NjsgLyogVGhlIDc0MDAgdXNlcyAyNTYtNTEyTUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEdlZm9yY2U3IGxvd2VuZCAqLwogICAgICAgICAgICAgICAgZWxzZSBpZihzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI3MzAwIikpIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRV83MzAwOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDI1NjsgLyogTWFjIFByb3Mgd2l0aCB0aGlzIGNhcmQgaGF2ZSAyNTYgTUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEdlZm9yY2U2IGhpZ2hlbmQgKi8KICAgICAgICAgICAgICAgIGVsc2UgaWYoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNjgwMCIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFXzY4MDA7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gMTI4OyAvKiBUaGUgNjgwMCB1c2VzIDEyOC0yNTZNQiwgdGhlIDc2MDAgdXNlcyAyNTYtNTEyTUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEdlZm9yY2U2IC0gbWlkZW5kICovCiAgICAgICAgICAgICAgICBlbHNlIGlmKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjY2MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI2NjEwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNjcwMCIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFXzY2MDBHVDsKICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAxMjg7IC8qIEEgNjYwMEdUIGhhcyAxMjgtMjU2TUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEdlZm9yY2U2LzcgbG93ZW5kICovCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRV82MjAwOyAvKiBHZWZvcmNlIDYxMDAvNjE1MC82MjAwLzczMDAvNzQwMC83NTAwICovCiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gNjQ7IC8qICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZihXSU5FX0QzRDlfQ0FQQUJMRShnbF9pbmZvKSkgewogICAgICAgICAgICAgICAgLyogR2Vmb3JjZUZYIC0gaGlnaGVuZCAqLwogICAgICAgICAgICAgICAgaWYgKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjU4MDAiKSB8fAogICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjU5MDAiKSB8fAogICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjU5NTAiKSB8fAogICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIlF1YWRybyBGWCIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFRlhfNTgwMDsKICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSAyNTY7IC8qIDU4MDAtNTkwMCBjYXJkcyB1c2UgMjU2TUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIEdlZm9yY2VGWCAtIG1pZGVuZCAqLwogICAgICAgICAgICAgICAgZWxzZSBpZihzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI1NjAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiNTY1MCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjU3MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI1NzUwIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0VGWF81NjAwOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDEyODsgLyogQSA1NjAwIHVzZXMgMTI4LTI1Nk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBHZWZvcmNlRlggLSBsb3dlbmQgKi8KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFRlhfNTIwMDsgLyogR2Vmb3JjZUZYIDUxMDAvNTIwMC81MjUwLzUzMDAvNTUwMCAqLwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDY0OyAvKiBOb3JtYWwgRlg1MjAwIGNhcmRzIHVzZSA2NC0yNTZNQjsgbGFwdG9wIChub24tc3RhbmRhcmQpIGNhbiBoYXZlIGxlc3MgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmKFdJTkVfRDNEOF9DQVBBQkxFKGdsX2luZm8pKSB7CiAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiR2VGb3JjZTQgVGkiKSB8fCBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJRdWFkcm80IikpIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRTRfVEk0MjAwOyAvKiBHZWZvcmNlNCBUaTQyMDAvVGk0NDAwL1RpNDYwMC9UaTQ4MDAsIFF1YWRybzQgKi8KICAgICAgICAgICAgICAgICAgICB2aWRtZW0gPSA2NDsgLyogR2Vmb3JjZTQgVGkgY2FyZHMgaGF2ZSA2NC0xMjhNQiAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX0dFRk9SQ0UzOyAvKiBHZWZvcmNlMyBzdGFuZGFyZC9UaTIwMC9UaTUwMCwgUXVhZHJvIERDQyAqLwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDY0OyAvKiBHZWZvcmNlMyBjYXJkcyBoYXZlIDY0LTEyOE1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZihXSU5FX0QzRDdfQ0FQQUJMRShnbF9pbmZvKSkgewogICAgICAgICAgICAgICAgaWYgKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIkdlRm9yY2U0IE1YIikpIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRTRfTVg7IC8qIE1YNDIwL01YNDQwL01YNDYwL01YNDAwMCAqLwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDY0OyAvKiBNb3N0IEdlZm9yY2U0TVggR1BVcyBoYXZlIGF0IGxlYXN0IDY0TUIgb2YgbWVtb3J5LCBzb21lIGVhcmx5IG1vZGVscyBoYWQgMzJNQiBidXQgbW9zdCBoYXZlIDY0TUIgb3IgZXZlbiAxMjhNQiAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZihzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJHZUZvcmNlMiBNWCIpIHx8IHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIlF1YWRybzIgTVhSIikpIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRTJfTVg7IC8qIEdlZm9yY2UyIHN0YW5kYXJkL01YMTAwL01YMjAwL01YNDAwLCBRdWFkcm8yIE1YUiAqLwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDMyOyAvKiBHZWZvcmNlMk1YIEdQVXMgaGF2ZSAzMi02NE1CIG9mIHZpZGVvIG1lbW9yeSAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZihzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJHZUZvcmNlMiIpIHx8IHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIlF1YWRybzIiKSkgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFMjsgLyogR2Vmb3JjZTIgR1RTL1Byby9UaS9VbHRyYSwgUXVhZHJvMiAqLwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDMyOyAvKiBHZWZvcmNlMiBHUFVzIGhhdmUgMzItNjRNQiBvZiB2aWRlbyBtZW1vcnkgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9HRUZPUkNFOyAvKiBHZWZvcmNlIDI1Ni9ERFIsIFF1YWRybyAqLwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDMyOyAvKiBNb3N0IEdlZm9yY2UxIGNhcmRzIGhhdmUgMzJNQiwgdGhlcmUgYXJlIGFsc28gc29tZSByYXJlIDE2IGFuZCA2NE1CIChEZWxsKSBtb2RlbHMgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJUTlQyIikpIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfUklWQV9UTlQyOyAvKiBSaXZhIFROVDIgc3RhbmRhcmQvTTY0L1Byby9VbHRyYSAqLwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDMyOyAvKiBNb3N0IFROVDIgYm9hcmRzIGhhdmUgMzJNQiwgdGhvdWdoIHRoZXJlIGFyZSAxNk1CIGJvYXJkcyB0b28gKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9SSVZBX1ROVDsgLyogUml2YSBUTlQsIFZhbnRhICovCiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gMTY7IC8qIE1vc3QgVE5UIGJvYXJkcyBoYXZlIDE2TUIsIHNvbWUgcmFyZSBtb2RlbHMgaGF2ZSA4TUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFZFTkRPUl9BVEk6CiAgICAgICAgICAgIGlmKFdJTkVfRDNEOV9DQVBBQkxFKGdsX2luZm8pKSB7CiAgICAgICAgICAgICAgICAvKiBSYWRlb24gUjZ4eCBIRDI5MDAgLSBoaWdoZW5kICovCiAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiSEQgMjkwMCIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfQVRJX1JBREVPTl9IRDI5MDA7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gNTEyOyAvKiBIRDI5MDAgdXNlcyA1MTItMTAyNE1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBSYWRlb24gUjZ4eCBIRDI2MDAtIG1pZGVuZCAqLwogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiSEQgMjYwMCIpKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfQVRJX1JBREVPTl9IRDI2MDA7CiAgICAgICAgICAgICAgICAgICAgdmlkbWVtID0gMjU2OyAvKiBIRDI2MDAgdXNlcyAyNTYtNTEyTUIgKi8KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qIFJhZGVvbiBSNnh4IEhEMjMwMC9IRDI0MDAgLSBsb3dlbmQgKi8KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIkhEIDIzMDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiSEQgMjQwMCIpKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX0FUSV9SQURFT05fSEQyMzAwOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDEyODsgLyogSEQyMzAwIHVzZXMgYXQgbGVhc3QgMTI4TUIsIEhEMjQwMCB1c2VzIDI1Nk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBSYWRlb24gUjV4eCAqLwogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE2MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE2NTAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE4MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE5MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE5NTAiKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9BVElfUkFERU9OX1gxNjAwOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDEyODsgLyogWDE2MDAgdXNlcyAxMjgtMjU2TUIsID49WDE4MDAgdXNlcyAyNTZNQiAqLwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyogUmFkZW9uIFI0eHggKyBYMTMwMC9YMTQwMC9YMTQ1MC9YMTU1MC9YMjMwMCAobG93ZW5kIFI1eHgpICovCiAgICAgICAgICAgICAgICBlbHNlIGlmKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIlg3MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJYODAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDg1MCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIlgxMzAwIikgfHwKICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiWDE0MDAiKSB8fAogICAgICAgICAgICAgICAgICAgICAgICBzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICJYMTQ1MCIpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIlgxNTUwIikpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfQVRJX1JBREVPTl9YNzAwOwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDEyODsgLyogeDcwMC94OCowIHVzZSAxMjgtMjU2TUIsID49eDEzMDAgMTI4LTUxMk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiBSYWRlb24gUjN4eCAqLyAKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX0FUSV9SQURFT05fOTUwMDsgLyogUmFkZW9uIDk1MDAvOTU1MC85NjAwLzk3MDAvOTgwMC9YMzAwL1g1NTAvWDYwMCAqLwogICAgICAgICAgICAgICAgICAgIHZpZG1lbSA9IDY0OyAvKiBSYWRlb24gOTUwMCB1c2VzIDY0TUIsIGhpZ2hlciBtb2RlbHMgdXNlIHVwIHRvIDI1Nk1CICovCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSBpZihXSU5FX0QzRDhfQ0FQQUJMRShnbF9pbmZvKSkgewogICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfQVRJX1JBREVPTl84NTAwOyAvKiBSYWRlb24gODUwMC85MDAwLzkxMDAvOTIwMC85MzAwICovCiAgICAgICAgICAgICAgICB2aWRtZW0gPSA2NDsgLyogODUwMC85MDAwIGNhcmRzIHVzZSBtb3N0bHkgNjRNQiwgdGhvdWdoIHRoZXJlIGFyZSAzMk1CIGFuZCAxMjhNQiBtb2RlbHMgKi8KICAgICAgICAgICAgfSBlbHNlIGlmKFdJTkVfRDNEN19DQVBBQkxFKGdsX2luZm8pKSB7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9BVElfUkFERU9OXzcyMDA7IC8qIFJhZGVvbiA3MDAwLzcxMDAvNzIwMC83NTAwICovCiAgICAgICAgICAgICAgICB2aWRtZW0gPSAzMjsgLyogVGhlcmUgYXJlIG1vZGVscyB3aXRoIHVwIHRvIDY0TUIgKi8KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX0FUSV9SQUdFXzEyOFBSTzsKICAgICAgICAgICAgICAgIHZpZG1lbSA9IDE2OyAvKiBUaGVyZSBhcmUgMTYtMzJNQiBtb2RlbHMgKi8KICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFZFTkRPUl9JTlRFTDoKICAgICAgICAgICAgaWYgKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIkdNQSA5NTAiKSkgewogICAgICAgICAgICAgICAgLyogTWFjT1MgY2FsbHMgdGhlIGNhcmQgR01BIDk1MCwgYnV0IGV2ZXJ5d2hlcmUgZWxzZSB0aGUgUENJIElEIGlzIG5hbWVkIDk0NUdNICovCiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9JTlRFTF9JOTQ1R007CiAgICAgICAgICAgICAgICB2aWRtZW0gPSA2NDsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI5MTVHTSIpKSB7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9JTlRFTF9JOTE1R007CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiOTE1RyIpKSB7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9JTlRFTF9JOTE1RzsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJzdHIoZ2xfaW5mby0+Z2xfcmVuZGVyZXIsICI4NjVHIikpIHsKICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX0lOVEVMX0k4NjVHOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN0cnN0cihnbF9pbmZvLT5nbF9yZW5kZXJlciwgIjg1NUciKSkgewogICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfSU5URUxfSTg1NUc7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoc3Ryc3RyKGdsX2luZm8tPmdsX3JlbmRlcmVyLCAiODMwRyIpKSB7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9JTlRFTF9JODMwRzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX0lOVEVMX0k5MTVHOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgVkVORE9SX01FU0E6CiAgICAgICAgY2FzZSBWRU5ET1JfV0lORToKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAvKiBEZWZhdWx0IHRvIGdlbmVyaWMgTnZpZGlhIGhhcmR3YXJlIGJhc2VkIG9uIHRoZSBzdXBwb3J0ZWQgT3BlbkdMIGV4dGVuc2lvbnMuIFRoZSBjaG9pY2UgCiAgICAgICAgICAgICAqIGZvciBOdmlkaWEgd2FzIGJlY2F1c2UgdGhlIGhhcmR3YXJlIGFuZCBkcml2ZXJzIHRoZXkgbWFrZSBhcmUgb2YgZ29vZCBxdWFsaXR5LiBUaGlzIG1ha2VzCiAgICAgICAgICAgICAqIHRoZW0gYSBnb29kIGdlbmVyaWMgY2hvaWNlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2xfaW5mby0+Z2xfdmVuZG9yID0gVkVORE9SX05WSURJQTsKICAgICAgICAgICAgaWYoV0lORV9EM0Q5X0NBUEFCTEUoZ2xfaW5mbykpCiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRUZYXzU2MDA7CiAgICAgICAgICAgIGVsc2UgaWYoV0lORV9EM0Q4X0NBUEFCTEUoZ2xfaW5mbykpCiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRTM7CiAgICAgICAgICAgIGVsc2UgaWYoV0lORV9EM0Q3X0NBUEFCTEUoZ2xfaW5mbykpCiAgICAgICAgICAgICAgICBnbF9pbmZvLT5nbF9jYXJkID0gQ0FSRF9OVklESUFfR0VGT1JDRTsKICAgICAgICAgICAgZWxzZSBpZihXSU5FX0QzRDZfQ0FQQUJMRShnbF9pbmZvKSkKICAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPSBDQVJEX05WSURJQV9SSVZBX1ROVDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9IENBUkRfTlZJRElBX1JJVkFfMTI4OwogICAgfQogICAgVFJBQ0VfKGQzZF9jYXBzKSgiRk9VTkQgKGZha2UpIGNhcmQ6IDB4JXggKHZlbmRvciBpZCksIDB4JXggKGRldmljZSBpZClcbiIsIGdsX2luZm8tPmdsX3ZlbmRvciwgZ2xfaW5mby0+Z2xfY2FyZCk7CgogICAgLyogSWYgd2UgaGF2ZSBhbiBlc3RpbWF0ZSB1c2UgaXQsIGVsc2UgZGVmYXVsdCB0byA2NE1COyAgKi8KICAgIGlmKHZpZG1lbSkKICAgICAgICBnbF9pbmZvLT52aWRtZW0gPSB2aWRtZW0qMTAyNCoxMDI0OyAvKiBjb252ZXJ0IGZyb20gTUJzIHRvIGJ5dGVzICovCiAgICBlbHNlCiAgICAgICAgZ2xfaW5mby0+dmlkbWVtID0gV0lORV9ERUZBVUxUX1ZJRE1FTTsKCiAgICAvKiBMb2FkIGFsbCB0aGUgbG9va3VwIHRhYmxlcwogICAgVE9ETzogSXQgbWF5IGJlIGEgZ29vZCBpZGVhIHRvIG1ha2UgbWluTG9va3VwIGFuZCBtYXhMb29rdXAgY29uc3QgYW5kIHBvcHVsYXRlIHRoZW0gaW4gd2luZWQzZF9wcml2YXRlLmggd2hlcmUgdGhleSBhcmUgZGVjbGFyZWQgKi8KICAgIG1pbkxvb2t1cFtXSU5FTE9PS1VQX1dBUlBQQVJBTV0gPSBXSU5FRDNEVEFERFJFU1NfV1JBUDsKICAgIG1heExvb2t1cFtXSU5FTE9PS1VQX1dBUlBQQVJBTV0gPSBXSU5FRDNEVEFERFJFU1NfTUlSUk9ST05DRTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgTUFYX0xPT0tVUFM7IGkrKykgewogICAgICAgIHN0YXRlTG9va3VwW2ldID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIDAsIHNpemVvZigqc3RhdGVMb29rdXBbaV0pICogKDEgKyBtYXhMb29rdXBbaV0gLSBtaW5Mb29rdXBbaV0pICk7CiAgICB9CgogICAgc3RhdGVMb29rdXBbV0lORUxPT0tVUF9XQVJQUEFSQU1dW1dJTkVEM0RUQUREUkVTU19XUkFQICAgLSBtaW5Mb29rdXBbV0lORUxPT0tVUF9XQVJQUEFSQU1dXSA9IEdMX1JFUEVBVDsKICAgIHN0YXRlTG9va3VwW1dJTkVMT09LVVBfV0FSUFBBUkFNXVtXSU5FRDNEVEFERFJFU1NfQ0xBTVAgIC0gbWluTG9va3VwW1dJTkVMT09LVVBfV0FSUFBBUkFNXV0gPSBHTF9DTEFNUF9UT19FREdFOwogICAgc3RhdGVMb29rdXBbV0lORUxPT0tVUF9XQVJQUEFSQU1dW1dJTkVEM0RUQUREUkVTU19CT1JERVIgLSBtaW5Mb29rdXBbV0lORUxPT0tVUF9XQVJQUEFSQU1dXSA9CiAgICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1RFWFRVUkVfQk9SREVSX0NMQU1QXSA/IEdMX0NMQU1QX1RPX0JPUkRFUl9BUkIgOiBHTF9SRVBFQVQ7CiAgICBzdGF0ZUxvb2t1cFtXSU5FTE9PS1VQX1dBUlBQQVJBTV1bV0lORUQzRFRBRERSRVNTX0JPUkRFUiAtIG1pbkxvb2t1cFtXSU5FTE9PS1VQX1dBUlBQQVJBTV1dID0KICAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfVEVYVFVSRV9CT1JERVJfQ0xBTVBdID8gR0xfQ0xBTVBfVE9fQk9SREVSX0FSQiA6IEdMX1JFUEVBVDsKICAgIHN0YXRlTG9va3VwW1dJTkVMT09LVVBfV0FSUFBBUkFNXVtXSU5FRDNEVEFERFJFU1NfTUlSUk9SIC0gbWluTG9va3VwW1dJTkVMT09LVVBfV0FSUFBBUkFNXV0gPQogICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9URVhUVVJFX01JUlJPUkVEX1JFUEVBVF0gPyBHTF9NSVJST1JFRF9SRVBFQVRfQVJCIDogR0xfUkVQRUFUOwogICAgc3RhdGVMb29rdXBbV0lORUxPT0tVUF9XQVJQUEFSQU1dW1dJTkVEM0RUQUREUkVTU19NSVJST1JPTkNFIC0gbWluTG9va3VwW1dJTkVMT09LVVBfV0FSUFBBUkFNXV0gPQogICAgICAgICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FUSV9URVhUVVJFX01JUlJPUl9PTkNFXSA/IEdMX01JUlJPUl9DTEFNUF9UT19FREdFX0FUSSA6IEdMX1JFUEVBVDsKCiAgICBtYWdMb29rdXBbV0lORUQzRFRFWEZfTk9ORSAgICAgICAgLSBXSU5FRDNEVEVYRl9OT05FXSAgPSBHTF9ORUFSRVNUOwogICAgbWFnTG9va3VwW1dJTkVEM0RURVhGX1BPSU5UICAgICAgIC0gV0lORUQzRFRFWEZfTk9ORV0gPSBHTF9ORUFSRVNUOwogICAgbWFnTG9va3VwW1dJTkVEM0RURVhGX0xJTkVBUiAgICAgIC0gV0lORUQzRFRFWEZfTk9ORV0gPSBHTF9MSU5FQVI7CiAgICBtYWdMb29rdXBbV0lORUQzRFRFWEZfQU5JU09UUk9QSUMgLSBXSU5FRDNEVEVYRl9OT05FXSA9CiAgICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbRVhUX1RFWFRVUkVfRklMVEVSX0FOSVNPVFJPUElDXSA/IEdMX0xJTkVBUiA6IEdMX05FQVJFU1Q7CgoKICAgIG1pbk1pcExvb2t1cFtXSU5FRDNEVEVYRl9OT05FXVtXSU5FRDNEVEVYRl9OT05FXSAgICAgPSBHTF9MSU5FQVI7CiAgICBtaW5NaXBMb29rdXBbV0lORUQzRFRFWEZfTk9ORV1bV0lORUQzRFRFWEZfUE9JTlRdICAgID0gR0xfTElORUFSOwogICAgbWluTWlwTG9va3VwW1dJTkVEM0RURVhGX05PTkVdW1dJTkVEM0RURVhGX0xJTkVBUl0gICA9IEdMX0xJTkVBUjsKICAgIG1pbk1pcExvb2t1cFtXSU5FRDNEVEVYRl9QT0lOVF1bV0lORUQzRFRFWEZfTk9ORV0gICAgPSBHTF9ORUFSRVNUOwogICAgbWluTWlwTG9va3VwW1dJTkVEM0RURVhGX1BPSU5UXVtXSU5FRDNEVEVYRl9QT0lOVF0gICA9IEdMX05FQVJFU1RfTUlQTUFQX05FQVJFU1Q7CiAgICBtaW5NaXBMb29rdXBbV0lORUQzRFRFWEZfUE9JTlRdW1dJTkVEM0RURVhGX0xJTkVBUl0gID0gR0xfTkVBUkVTVF9NSVBNQVBfTElORUFSOwogICAgbWluTWlwTG9va3VwW1dJTkVEM0RURVhGX0xJTkVBUl1bV0lORUQzRFRFWEZfTk9ORV0gICA9IEdMX0xJTkVBUjsKICAgIG1pbk1pcExvb2t1cFtXSU5FRDNEVEVYRl9MSU5FQVJdW1dJTkVEM0RURVhGX1BPSU5UXSAgPSBHTF9MSU5FQVJfTUlQTUFQX05FQVJFU1Q7CiAgICBtaW5NaXBMb29rdXBbV0lORUQzRFRFWEZfTElORUFSXVtXSU5FRDNEVEVYRl9MSU5FQVJdID0gR0xfTElORUFSX01JUE1BUF9MSU5FQVI7CiAgICBtaW5NaXBMb29rdXBbV0lORUQzRFRFWEZfQU5JU09UUk9QSUNdW1dJTkVEM0RURVhGX05PTkVdICAgPSBnbF9pbmZvLT5zdXBwb3J0ZWRbRVhUX1RFWFRVUkVfRklMVEVSX0FOSVNPVFJPUElDXSA/CiAgICBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiA6IEdMX0xJTkVBUjsKICAgIG1pbk1pcExvb2t1cFtXSU5FRDNEVEVYRl9BTklTT1RST1BJQ11bV0lORUQzRFRFWEZfUE9JTlRdICA9IGdsX2luZm8tPnN1cHBvcnRlZFtFWFRfVEVYVFVSRV9GSUxURVJfQU5JU09UUk9QSUNdID8gR0xfTElORUFSX01JUE1BUF9ORUFSRVNUIDogR0xfTElORUFSOwogICAgbWluTWlwTG9va3VwW1dJTkVEM0RURVhGX0FOSVNPVFJPUElDXVtXSU5FRDNEVEVYRl9MSU5FQVJdID0gZ2xfaW5mby0+c3VwcG9ydGVkW0VYVF9URVhUVVJFX0ZJTFRFUl9BTklTT1RST1BJQ10gPyBHTF9MSU5FQVJfTUlQTUFQX0xJTkVBUiA6IEdMX0xJTkVBUjsKCi8qIFRPRE86IGNvbmZpZyBsb29rdXBzICovCgogICAgLyogTWFrZSBzdXJlIHRoZXJlJ3MgYW4gYWN0aXZlIEhEQyBlbHNlIHRoZSBXR0wgZXh0ZW5zaW9ucyB3aWxsIGZhaWwgKi8KICAgIGhkYyA9IHB3Z2xHZXRDdXJyZW50REMoKTsKICAgIGlmIChoZGMpIHsKICAgICAgICBXR0xfRXh0ZW5zaW9ucyA9IEdMX0VYVENBTEwod2dsR2V0RXh0ZW5zaW9uc1N0cmluZ0FSQihoZGMpKTsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJXR0xfRXh0ZW5zaW9ucyByZXBvcnRlZDpcbiIpOwoKICAgICAgICBpZiAoTlVMTCA9PSBXR0xfRXh0ZW5zaW9ucykgewogICAgICAgICAgICBFUlIoIiAgIFdHTF9FeHRlbnNpb25zIHJldHVybnMgTlVMTFxuIik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgd2hpbGUgKCpXR0xfRXh0ZW5zaW9ucyAhPSAweDAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTdGFydDsKICAgICAgICAgICAgICAgIGNoYXIgVGhpc0V4dG5bMjU2XTsKICAgICAgICAgICAgICAgIHNpemVfdCBsZW47CgogICAgICAgICAgICAgICAgd2hpbGUgKGlzc3BhY2UoKldHTF9FeHRlbnNpb25zKSkgV0dMX0V4dGVuc2lvbnMrKzsKICAgICAgICAgICAgICAgIFN0YXJ0ID0gV0dMX0V4dGVuc2lvbnM7CiAgICAgICAgICAgICAgICB3aGlsZSAoIWlzc3BhY2UoKldHTF9FeHRlbnNpb25zKSAmJiAqV0dMX0V4dGVuc2lvbnMgIT0gMHgwMCkgewogICAgICAgICAgICAgICAgICAgIFdHTF9FeHRlbnNpb25zKys7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgbGVuID0gV0dMX0V4dGVuc2lvbnMgLSBTdGFydDsKICAgICAgICAgICAgICAgIGlmIChsZW4gPT0gMCB8fCBsZW4gPj0gc2l6ZW9mKFRoaXNFeHRuKSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgICAgICBtZW1jcHkoVGhpc0V4dG4sIFN0YXJ0LCBsZW4pOwogICAgICAgICAgICAgICAgVGhpc0V4dG5bbGVuXSA9ICdcMCc7CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCItICVzXG4iLCBUaGlzRXh0bik7CgogICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoVGhpc0V4dG4sICJXR0xfQVJCX3BidWZmZXIiKSkgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtXR0xfQVJCX1BCVUZGRVJdID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJGT1VORDogV0dMX0FSQl9wYnVmZmVyIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoVGhpc0V4dG4sICJXR0xfV0lORV9waXhlbF9mb3JtYXRfcGFzc3Rocm91Z2giKSkgewogICAgICAgICAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtXR0xfV0lORV9QSVhFTF9GT1JNQVRfUEFTU1RIUk9VR0hdID0gVFJVRTsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJGT1VORDogV0dMX1dJTkVfcGl4ZWxfZm9ybWF0X3Bhc3N0aHJvdWdoIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTEVBVkVfR0woKTsKCiAgICByZXR1cm4gcmV0dXJuX3ZhbHVlOwp9CiN1bmRlZiBHTElORk9fTE9DQVRJT04KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIElXaW5lRDNEIGltcGxlbWVudGF0aW9uIGZvbGxvd3MKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpzdGF0aWMgVUlOVCAgICAgV0lOQVBJIElXaW5lRDNESW1wbF9HZXRBZGFwdGVyQ291bnQgKElXaW5lRDNEICppZmFjZSkgewogICAgSVdpbmVEM0RJbXBsICpUaGlzID0gKElXaW5lRDNESW1wbCAqKWlmYWNlOwoKICAgIFRSQUNFXyhkM2RfY2FwcykoIiglcCk6IFJlcG9ydGluZyAlZCBhZGFwdGVyc1xuIiwgVGhpcywgbnVtQWRhcHRlcnMpOwogICAgcmV0dXJuIG51bUFkYXB0ZXJzOwp9CgpzdGF0aWMgSFJFU1VMVCAgV0lOQVBJIElXaW5lRDNESW1wbF9SZWdpc3RlclNvZnR3YXJlRGV2aWNlKElXaW5lRDNEICppZmFjZSwgdm9pZCogcEluaXRpYWxpemVGdW5jdGlvbikgewogICAgSVdpbmVEM0RJbXBsICpUaGlzID0gKElXaW5lRDNESW1wbCAqKWlmYWNlOwogICAgRklYTUUoIiglcCktPiglcCk6IHN0dWJcbiIsIFRoaXMsIHBJbml0aWFsaXplRnVuY3Rpb24pOwogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCnN0YXRpYyBITU9OSVRPUiBXSU5BUEkgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJNb25pdG9yKElXaW5lRDNEICppZmFjZSwgVUlOVCBBZGFwdGVyKSB7CiAgICBJV2luZUQzREltcGwgKlRoaXMgPSAoSVdpbmVEM0RJbXBsICopaWZhY2U7CgogICAgaWYgKEFkYXB0ZXIgPj0gSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJDb3VudChpZmFjZSkpIHsKICAgICAgICByZXR1cm4gTlVMTDsKICAgIH0KCiAgICBUUkFDRV8oZDNkX2NhcHMpKCIoJXApLT4oJWQpXG4iLCBUaGlzLCBBZGFwdGVyKTsKICAgIHJldHVybiBNb25pdG9yRnJvbVBvaW50KEFkYXB0ZXJzW0FkYXB0ZXJdLm1vbml0b3JQb2ludCwgTU9OSVRPUl9ERUZBVUxUVE9QUklNQVJZKTsKfQoKLyogRklYTUU6IEdldEFkYXB0ZXJNb2RlQ291bnQgYW5kIEVudW1BZGFwdGVyTW9kZXMgY3VycmVudGx5IG9ubHkgcmV0dXJucyBtb2RlcwogICAgIG9mIHRoZSBzYW1lIGJwcCBidXQgZGlmZmVyZW50IHJlc29sdXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCgovKiBOb3RlOiBkeDkgc3VwcGxpZXMgYSBmb3JtYXQuIENhbGxzIGZyb20gZDNkOCBzdXBwbHkgV0lORUQzREZNVF9VTktOT1dOICovCnN0YXRpYyBVSU5UICAgICBXSU5BUEkgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJNb2RlQ291bnQoSVdpbmVEM0QgKmlmYWNlLCBVSU5UIEFkYXB0ZXIsIFdJTkVEM0RGT1JNQVQgRm9ybWF0KSB7CiAgICBJV2luZUQzREltcGwgKlRoaXMgPSAoSVdpbmVEM0RJbXBsICopaWZhY2U7CiAgICBUUkFDRV8oZDNkX2NhcHMpKCIoJXB9LT4oQWRhcHRlcjogJWQsIEZvcm1hdDogJXMpXG4iLCBUaGlzLCBBZGFwdGVyLCBkZWJ1Z19kM2Rmb3JtYXQoRm9ybWF0KSk7CgogICAgaWYgKEFkYXB0ZXIgPj0gSVdpbmVEM0RfR2V0QWRhcHRlckNvdW50KGlmYWNlKSkgewogICAgICAgIHJldHVybiAwOwogICAgfQoKICAgIC8qIFRPRE86IFN0b3JlIG1vZGVzIHBlciBhZGFwdGVyIGFuZCByZWFkIGl0IGZyb20gdGhlIGFkYXB0ZXIgc3RydWN0dXJlICovCiAgICBpZiAoQWRhcHRlciA9PSAwKSB7IC8qIERpc3BsYXkgKi8KICAgICAgICBpbnQgaSA9IDA7CiAgICAgICAgaW50IGogPSAwOwoKICAgICAgICBpZiAoIURFQlVHX1NJTkdMRV9NT0RFKSB7CiAgICAgICAgICAgIERFVk1PREVXIERldk1vZGVXOwoKICAgICAgICAgICAgWmVyb01lbW9yeSgmRGV2TW9kZVcsIHNpemVvZihEZXZNb2RlVykpOwogICAgICAgICAgICBEZXZNb2RlVy5kbVNpemUgPSBzaXplb2YoRGV2TW9kZVcpOwogICAgICAgICAgICB3aGlsZSAoRW51bURpc3BsYXlTZXR0aW5nc0V4VyhOVUxMLCBqLCAmRGV2TW9kZVcsIDApKSB7CiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKEZvcm1hdCkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVU5LTk9XTjoKICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhpcyBpcyBmb3IgRDNEOCwgZG8gbm90IGVudW1lcmF0ZSBQOCBoZXJlICovCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZXZNb2RlVy5kbUJpdHNQZXJQZWwgPT0gMzIgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldk1vZGVXLmRtQml0c1BlclBlbCA9PSAxNikgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDhSOEc4Qjg6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZXZNb2RlVy5kbUJpdHNQZXJQZWwgPT0gMzIpIGkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX1I1RzZCNToKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERldk1vZGVXLmRtQml0c1BlclBlbCA9PSAxNikgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUDg6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChEZXZNb2RlVy5kbUJpdHNQZXJQZWwgPT0gOCkgaSsrOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAvKiBTa2lwIG90aGVyIG1vZGVzIGFzIHRoZXkgZG8gbm90IG1hdGNoIHRoZSByZXF1ZXN0ZWQgZm9ybWF0ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaSA9IDE7CiAgICAgICAgICAgIGogPSAxOwogICAgICAgIH0KCiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiKCVwfS0+KEFkYXB0ZXI6ICVkKSA9PiAlZCAob3V0IG9mICVkKVxuIiwgVGhpcywgQWRhcHRlciwgaSwgaik7CiAgICAgICAgcmV0dXJuIGk7CiAgICB9IGVsc2UgewogICAgICAgIEZJWE1FXyhkM2RfY2FwcykoIkFkYXB0ZXIgbm90IHByaW1hcnkgZGlzcGxheVxuIik7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKLyogTm90ZTogZHg5IHN1cHBsaWVzIGEgZm9ybWF0LiBDYWxscyBmcm9tIGQzZDggc3VwcGx5IFdJTkVEM0RGTVRfVU5LTk9XTiAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0VudW1BZGFwdGVyTW9kZXMoSVdpbmVEM0QgKmlmYWNlLCBVSU5UIEFkYXB0ZXIsIFdJTkVEM0RGT1JNQVQgRm9ybWF0LCBVSU5UIE1vZGUsIFdJTkVEM0RESVNQTEFZTU9ERSogcE1vZGUpIHsKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIFRSQUNFXyhkM2RfY2FwcykoIiglcH0tPihBZGFwdGVyOiVkLCBtb2RlOiVkLCBwTW9kZTolcCwgZm9ybWF0OiVzKVxuIiwgVGhpcywgQWRhcHRlciwgTW9kZSwgcE1vZGUsIGRlYnVnX2QzZGZvcm1hdChGb3JtYXQpKTsKCiAgICAvKiBWYWxpZGF0ZSB0aGUgcGFyYW1ldGVycyBhcyBtdWNoIGFzIHBvc3NpYmxlICovCiAgICBpZiAoTlVMTCA9PSBwTW9kZSB8fAogICAgICAgIEFkYXB0ZXIgPj0gSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJDb3VudChpZmFjZSkgfHwKICAgICAgICBNb2RlICAgID49IElXaW5lRDNESW1wbF9HZXRBZGFwdGVyTW9kZUNvdW50KGlmYWNlLCBBZGFwdGVyLCBGb3JtYXQpKSB7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgLyogVE9ETzogU3RvcmUgbW9kZXMgcGVyIGFkYXB0ZXIgYW5kIHJlYWQgaXQgZnJvbSB0aGUgYWRhcHRlciBzdHJ1Y3R1cmUgKi8KICAgIGlmIChBZGFwdGVyID09IDAgJiYgIURFQlVHX1NJTkdMRV9NT0RFKSB7IC8qIERpc3BsYXkgKi8KICAgICAgICBERVZNT0RFVyBEZXZNb2RlVzsKICAgICAgICBpbnQgTW9kZUlkeCA9IDA7CiAgICAgICAgaW50IGkgPSAwOwogICAgICAgIGludCBqID0gMDsKCiAgICAgICAgWmVyb01lbW9yeSgmRGV2TW9kZVcsIHNpemVvZihEZXZNb2RlVykpOwogICAgICAgIERldk1vZGVXLmRtU2l6ZSA9IHNpemVvZihEZXZNb2RlVyk7CgogICAgICAgIC8qIElmIHdlIGFyZSBmaWx0ZXJpbmcgdG8gYSBzcGVjaWZpYyBmb3JtYXQgKEQzRDkpLCB0aGVuIG5lZWQgdG8gc2tpcAogICAgICAgICAgIGFsbCB1bnJlbGF0ZWQgbW9kZXMsIGJ1dCBpZiBtb2RlIGlzIGlycmVsZXZhbnQgKEQzRDgpLCB0aGVuIHdlIGNhbgogICAgICAgICAgIGp1c3QgY291bnQgdGhyb3VnaCB0aGUgb25lcyB3aXRoIHZhbGlkIGJpdCBkZXB0aHMgKi8KICAgICAgICB3aGlsZSAoKGk8PU1vZGUpICYmIEVudW1EaXNwbGF5U2V0dGluZ3NFeFcoTlVMTCwgaisrLCAmRGV2TW9kZVcsIDApKSB7CiAgICAgICAgICAgIHN3aXRjaCAoRm9ybWF0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVU5LTk9XTjoKICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGlzIEQzRDguIERvIG5vdCBlbnVtZXJhdGUgUDggaGVyZSAqLwogICAgICAgICAgICAgICAgICAgIGlmIChEZXZNb2RlVy5kbUJpdHNQZXJQZWwgPT0gMzIgfHwKICAgICAgICAgICAgICAgICAgICAgICAgRGV2TW9kZVcuZG1CaXRzUGVyUGVsID09IDE2KSBpKys7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDhSOEc4Qjg6CiAgICAgICAgICAgICAgICAgICAgaWYgKERldk1vZGVXLmRtQml0c1BlclBlbCA9PSAzMikgaSsrOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX1I1RzZCNToKICAgICAgICAgICAgICAgICAgICBpZiAoRGV2TW9kZVcuZG1CaXRzUGVyUGVsID09IDE2KSBpKys7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUDg6CiAgICAgICAgICAgICAgICAgICAgaWYgKERldk1vZGVXLmRtQml0c1BlclBlbCA9PSA4KSBpKys7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIC8qIE1vZGVzIHRoYXQgZG9uJ3QgbWF0Y2ggd2hhdCB3ZSBzdXBwb3J0IGNhbiBnZXQgYW4gZWFybHktb3V0ICovCiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiU2VhcmNoaW5nIGZvciAlcywgcmV0dXJuaW5nIEQzREVSUl9JTlZBTElEQ0FMTFxuIiwgZGVidWdfZDNkZm9ybWF0KEZvcm1hdCkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX0lOVkFMSURDQUxMOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoaSA9PSAwKSB7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk5vIG1vZGVzIGZvdW5kIGZvciBmb3JtYXQgKCV4IC0gJXMpXG4iLCBGb3JtYXQsIGRlYnVnX2QzZGZvcm1hdChGb3JtYXQpKTsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICAgICAgfQogICAgICAgIE1vZGVJZHggPSBqIC0gMTsKCiAgICAgICAgLyogTm93IGdldCB0aGUgZGlzcGxheSBtb2RlIHZpYSB0aGUgY2FsY3VsYXRlZCBpbmRleCAqLwogICAgICAgIGlmIChFbnVtRGlzcGxheVNldHRpbmdzRXhXKE5VTEwsIE1vZGVJZHgsICZEZXZNb2RlVywgMCkpIHsKICAgICAgICAgICAgcE1vZGUtPldpZHRoICAgICAgICA9IERldk1vZGVXLmRtUGVsc1dpZHRoOwogICAgICAgICAgICBwTW9kZS0+SGVpZ2h0ICAgICAgID0gRGV2TW9kZVcuZG1QZWxzSGVpZ2h0OwogICAgICAgICAgICBwTW9kZS0+UmVmcmVzaFJhdGUgID0gV0lORUQzREFEQVBURVJfREVGQVVMVDsKICAgICAgICAgICAgaWYgKERldk1vZGVXLmRtRmllbGRzICYgRE1fRElTUExBWUZSRVFVRU5DWSkKICAgICAgICAgICAgICAgIHBNb2RlLT5SZWZyZXNoUmF0ZSA9IERldk1vZGVXLmRtRGlzcGxheUZyZXF1ZW5jeTsKCiAgICAgICAgICAgIGlmIChGb3JtYXQgPT0gV0lORUQzREZNVF9VTktOT1dOKSB7CiAgICAgICAgICAgICAgICBwTW9kZS0+Rm9ybWF0ID0gcGl4ZWxmb3JtYXRfZm9yX2RlcHRoKERldk1vZGVXLmRtQml0c1BlclBlbCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBwTW9kZS0+Rm9ybWF0ID0gRm9ybWF0OwogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiUmVxdWVzdGVkIG1vZGUgb3V0IG9mIHJhbmdlICVkXG4iLCBNb2RlKTsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICAgICAgfQoKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJXICVkIEggJWQgcnIgJWQgZm10ICgleCAtICVzKSBicHAgJXVcbiIsIHBNb2RlLT5XaWR0aCwgcE1vZGUtPkhlaWdodCwKICAgICAgICAgICAgICAgIHBNb2RlLT5SZWZyZXNoUmF0ZSwgcE1vZGUtPkZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KHBNb2RlLT5Gb3JtYXQpLAogICAgICAgICAgICAgICAgRGV2TW9kZVcuZG1CaXRzUGVyUGVsKTsKCiAgICB9IGVsc2UgaWYgKERFQlVHX1NJTkdMRV9NT0RFKSB7CiAgICAgICAgLyogUmV0dXJuIG9uZSBzZXR0aW5nIG9mIHRoZSBmb3JtYXQgcmVxdWVzdGVkICovCiAgICAgICAgaWYgKE1vZGUgPiAwKSByZXR1cm4gV0lORUQzREVSUl9JTlZBTElEQ0FMTDsKICAgICAgICBwTW9kZS0+V2lkdGggICAgICAgID0gODAwOwogICAgICAgIHBNb2RlLT5IZWlnaHQgICAgICAgPSA2MDA7CiAgICAgICAgcE1vZGUtPlJlZnJlc2hSYXRlICA9IDYwOwogICAgICAgIHBNb2RlLT5Gb3JtYXQgICAgICAgPSAoRm9ybWF0ID09IFdJTkVEM0RGTVRfVU5LTk9XTikgPyBXSU5FRDNERk1UX1g4UjhHOEI4IDogRm9ybWF0OwogICAgfSBlbHNlIHsKICAgICAgICBGSVhNRV8oZDNkX2NhcHMpKCJBZGFwdGVyIG5vdCBwcmltYXJ5IGRpc3BsYXlcbiIpOwogICAgfQoKICAgIHJldHVybiBXSU5FRDNEX09LOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJEaXNwbGF5TW9kZShJV2luZUQzRCAqaWZhY2UsIFVJTlQgQWRhcHRlciwgV0lORUQzRERJU1BMQVlNT0RFKiBwTW9kZSkgewogICAgSVdpbmVEM0RJbXBsICpUaGlzID0gKElXaW5lRDNESW1wbCAqKWlmYWNlOwogICAgVFJBQ0VfKGQzZF9jYXBzKSgiKCVwfS0+KEFkYXB0ZXI6ICVkLCBwTW9kZTogJXApXG4iLCBUaGlzLCBBZGFwdGVyLCBwTW9kZSk7CgogICAgaWYgKE5VTEwgPT0gcE1vZGUgfHwKICAgICAgICBBZGFwdGVyID49IElXaW5lRDNEX0dldEFkYXB0ZXJDb3VudChpZmFjZSkpIHsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9JTlZBTElEQ0FMTDsKICAgIH0KCiAgICBpZiAoQWRhcHRlciA9PSAwKSB7IC8qIERpc3BsYXkgKi8KICAgICAgICBpbnQgYnBwID0gMDsKICAgICAgICBERVZNT0RFVyBEZXZNb2RlVzsKCiAgICAgICAgWmVyb01lbW9yeSgmRGV2TW9kZVcsIHNpemVvZihEZXZNb2RlVykpOwogICAgICAgIERldk1vZGVXLmRtU2l6ZSA9IHNpemVvZihEZXZNb2RlVyk7CgogICAgICAgIEVudW1EaXNwbGF5U2V0dGluZ3NFeFcoTlVMTCwgRU5VTV9DVVJSRU5UX1NFVFRJTkdTLCAmRGV2TW9kZVcsIDApOwogICAgICAgIHBNb2RlLT5XaWR0aCAgICAgICAgPSBEZXZNb2RlVy5kbVBlbHNXaWR0aDsKICAgICAgICBwTW9kZS0+SGVpZ2h0ICAgICAgID0gRGV2TW9kZVcuZG1QZWxzSGVpZ2h0OwogICAgICAgIGJwcCAgICAgICAgICAgICAgICAgPSBEZXZNb2RlVy5kbUJpdHNQZXJQZWw7CiAgICAgICAgcE1vZGUtPlJlZnJlc2hSYXRlICA9IFdJTkVEM0RBREFQVEVSX0RFRkFVTFQ7CiAgICAgICAgaWYgKERldk1vZGVXLmRtRmllbGRzJkRNX0RJU1BMQVlGUkVRVUVOQ1kpCiAgICAgICAgewogICAgICAgICAgICBwTW9kZS0+UmVmcmVzaFJhdGUgPSBEZXZNb2RlVy5kbURpc3BsYXlGcmVxdWVuY3k7CiAgICAgICAgfQoKICAgICAgICBwTW9kZS0+Rm9ybWF0ID0gcGl4ZWxmb3JtYXRfZm9yX2RlcHRoKGJwcCk7CiAgICB9IGVsc2UgewogICAgICAgIEZJWE1FXyhkM2RfY2FwcykoIkFkYXB0ZXIgbm90IHByaW1hcnkgZGlzcGxheVxuIik7CiAgICB9CgogICAgVFJBQ0VfKGQzZF9jYXBzKSgicmV0dXJuaW5nIHc6JWQsIGg6JWQsIHJlZjolZCwgZm10OiVzXG4iLCBwTW9kZS0+V2lkdGgsCiAgICAgICAgICBwTW9kZS0+SGVpZ2h0LCBwTW9kZS0+UmVmcmVzaFJhdGUsIGRlYnVnX2QzZGZvcm1hdChwTW9kZS0+Rm9ybWF0KSk7CiAgICByZXR1cm4gV0lORUQzRF9PSzsKfQoKLyogTk9URTogZHVlIHRvIHN0cnVjdHVyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGR4OCBhbmQgZHg5IEQzREFEQVBURVJfSURFTlRJRklFUiwKICAgYW5kIGZpZWxkcyBiZWluZyBpbnNlcnRlZCBpbiB0aGUgbWlkZGxlLCBhIG5ldyBzdHJ1Y3R1cmUgaXMgdXNlZCBpbiBwbGFjZSAgICAqLwpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJJZGVudGlmaWVyKElXaW5lRDNEICppZmFjZSwgVUlOVCBBZGFwdGVyLCBEV09SRCBGbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREFEQVBURVJfSURFTlRJRklFUiogcElkZW50aWZpZXIpIHsKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKCiAgICBUUkFDRV8oZDNkX2NhcHMpKCIoJXB9LT4oQWRhcHRlcjogJWQsIEZsYWdzOiAleCwgcElkPSVwKVxuIiwgVGhpcywgQWRhcHRlciwgRmxhZ3MsIHBJZGVudGlmaWVyKTsKCiAgICBpZiAoQWRhcHRlciA+PSBJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpKSB7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgLyogUmV0dXJuIHRoZSBpbmZvcm1hdGlvbiByZXF1ZXN0ZWQgKi8KICAgIFRSQUNFXyhkM2RfY2FwcykoImRldmljZS9WZW5kb3IgTmFtZSBhbmQgVmVyc2lvbiBkZXRlY3Rpb24gdXNpbmcgRmlsbEdMQ2Fwc1xuIik7CiAgICBzdHJjcHkocElkZW50aWZpZXItPkRyaXZlciwgQWRhcHRlcnNbQWRhcHRlcl0uZHJpdmVyKTsKICAgIHN0cmNweShwSWRlbnRpZmllci0+RGVzY3JpcHRpb24sIEFkYXB0ZXJzW0FkYXB0ZXJdLmRlc2NyaXB0aW9uKTsKCiAgICAvKiBOb3RlIGR4OCBkb2Vzbid0IHN1cHBseSBhIERldmljZU5hbWUgKi8KICAgIGlmIChOVUxMICE9IHBJZGVudGlmaWVyLT5EZXZpY2VOYW1lKSBzdHJjcHkocElkZW50aWZpZXItPkRldmljZU5hbWUsICJcXFxcLlxcRElTUExBWSIpOyAvKiBGSVhNRTogTWF5IGRlcGVuZCBvbiBkZXNrdG9wPyAqLwogICAgcElkZW50aWZpZXItPkRyaXZlclZlcnNpb24tPnUuSGlnaFBhcnQgPSBBZGFwdGVyc1tBZGFwdGVyXS5nbF9pbmZvLmRyaXZlcl92ZXJzaW9uX2hpcGFydDsKICAgIHBJZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLT51Lkxvd1BhcnQgPSBBZGFwdGVyc1tBZGFwdGVyXS5nbF9pbmZvLmRyaXZlcl92ZXJzaW9uOwogICAgKihwSWRlbnRpZmllci0+VmVuZG9ySWQpID0gQWRhcHRlcnNbQWRhcHRlcl0uZ2xfaW5mby5nbF92ZW5kb3I7CiAgICAqKHBJZGVudGlmaWVyLT5EZXZpY2VJZCkgPSBBZGFwdGVyc1tBZGFwdGVyXS5nbF9pbmZvLmdsX2NhcmQ7CiAgICAqKHBJZGVudGlmaWVyLT5TdWJTeXNJZCkgPSAwOwogICAgKihwSWRlbnRpZmllci0+UmV2aXNpb24pID0gMDsKICAgICpwSWRlbnRpZmllci0+RGV2aWNlSWRlbnRpZmllciA9IElJRF9EM0RERVZJQ0VfRDNEVUlEOwoKICAgIGlmIChGbGFncyAmIFdJTkVEM0RFTlVNX05PX1dIUUxfTEVWRUwpIHsKICAgICAgICAqKHBJZGVudGlmaWVyLT5XSFFMTGV2ZWwpID0gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgKihwSWRlbnRpZmllci0+V0hRTExldmVsKSA9IDE7CiAgICB9CgogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KCnN0YXRpYyBCT09MIElXaW5lRDNESW1wbF9Jc1BpeGVsRm9ybWF0Q29tcGF0aWJsZVdpdGhSZW5kZXJGbXQoY29uc3QgV2luZUQzRF9QaXhlbEZvcm1hdCAqY2ZnLCBXSU5FRDNERk9STUFUIEZvcm1hdCkgewogICAgc2hvcnQgcmVkU2l6ZSwgZ3JlZW5TaXplLCBibHVlU2l6ZSwgYWxwaGFTaXplLCBjb2xvckJpdHM7CgogICAgaWYoIWNmZykKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgaWYoY2ZnLT5pUGl4ZWxUeXBlID09IFdHTF9UWVBFX1JHQkFfQVJCKSB7IC8qIEludGVnZXIgUkdCQSBmb3JtYXRzICovCiAgICAgICAgaWYoIWdldENvbG9yQml0cyhGb3JtYXQsICZyZWRTaXplLCAmZ3JlZW5TaXplLCAmYmx1ZVNpemUsICZhbHBoYVNpemUsICZjb2xvckJpdHMpKSB7CiAgICAgICAgICAgIEVSUigiVW5hYmxlIHRvIGNoZWNrIGNvbXBhdGliaWxpdHkgZm9yIEZvcm1hdD0lc1xuIiwgZGVidWdfZDNkZm9ybWF0KEZvcm1hdCkpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQoKICAgICAgICBpZihjZmctPnJlZFNpemUgPCByZWRTaXplKQogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGlmKGNmZy0+Z3JlZW5TaXplIDwgZ3JlZW5TaXplKQogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGlmKGNmZy0+Ymx1ZVNpemUgPCBibHVlU2l6ZSkKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgICBpZihjZmctPmFscGhhU2l6ZSA8IGFscGhhU2l6ZSkKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgICByZXR1cm4gVFJVRTsKICAgIH0gZWxzZSBpZihjZmctPmlQaXhlbFR5cGUgPT0gV0dMX1RZUEVfUkdCQV9GTE9BVF9BUkIpIHsgLyogRmxvYXQgUkdCQSBmb3JtYXRzOyBUT0RPOiBXR0xfTlZfZmxvYXRfYnVmZmVyICovCiAgICAgICAgaWYoRm9ybWF0ID09IFdJTkVEM0RGTVRfUjE2RikKICAgICAgICAgICAgcmV0dXJuIChjZmctPnJlZFNpemUgPT0gMTYgJiYgY2ZnLT5ncmVlblNpemUgPT0gMCAmJiBjZmctPmJsdWVTaXplID09IDAgJiYgY2ZnLT5hbHBoYVNpemUgPT0gMCk7CiAgICAgICAgaWYoRm9ybWF0ID09IFdJTkVEM0RGTVRfRzE2UjE2RikKICAgICAgICAgICAgcmV0dXJuIChjZmctPnJlZFNpemUgPT0gMTYgJiYgY2ZnLT5ncmVlblNpemUgPT0gMTYgJiYgY2ZnLT5ibHVlU2l6ZSA9PSAwICYmIGNmZy0+YWxwaGFTaXplID09IDApOwogICAgICAgIGlmKEZvcm1hdCA9PSBXSU5FRDNERk1UX0ExNkIxNkcxNlIxNkYpCiAgICAgICAgICAgIHJldHVybiAoY2ZnLT5yZWRTaXplID09IDE2ICYmIGNmZy0+Z3JlZW5TaXplID09IDE2ICYmIGNmZy0+Ymx1ZVNpemUgPT0gMTYgJiYgY2ZnLT5hbHBoYVNpemUgPT0gMTYpOwogICAgICAgIGlmKEZvcm1hdCA9PSBXSU5FRDNERk1UX1IzMkYpCiAgICAgICAgICAgIHJldHVybiAoY2ZnLT5yZWRTaXplID09IDMyICYmIGNmZy0+Z3JlZW5TaXplID09IDAgJiYgY2ZnLT5ibHVlU2l6ZSA9PSAwICYmIGNmZy0+YWxwaGFTaXplID09IDApOwogICAgICAgIGlmKEZvcm1hdCA9PSBXSU5FRDNERk1UX0czMlIzMkYpCiAgICAgICAgICAgIHJldHVybiAoY2ZnLT5yZWRTaXplID09IDMyICYmIGNmZy0+Z3JlZW5TaXplID09IDMyICYmIGNmZy0+Ymx1ZVNpemUgPT0gMCAmJiBjZmctPmFscGhhU2l6ZSA9PSAwKTsKICAgICAgICBpZihGb3JtYXQgPT0gV0lORUQzREZNVF9BMzJCMzJHMzJSMzJGKQogICAgICAgICAgICByZXR1cm4gKGNmZy0+cmVkU2l6ZSA9PSAzMiAmJiBjZmctPmdyZWVuU2l6ZSA9PSAzMiAmJiBjZmctPmJsdWVTaXplID09IDMyICYmIGNmZy0+YWxwaGFTaXplID09IDMyKTsKICAgIH0gZWxzZSB7CiAgICAgICAgLyogUHJvYmFibHkgYSBjb2xvciBpbmRleCBtb2RlICovCiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIHJldHVybiBGQUxTRTsKfQoKc3RhdGljIEJPT0wgSVdpbmVEM0RJbXBsX0lzUGl4ZWxGb3JtYXRDb21wYXRpYmxlV2l0aERlcHRoRm10KGNvbnN0IFdpbmVEM0RfUGl4ZWxGb3JtYXQgKmNmZywgV0lORUQzREZPUk1BVCBGb3JtYXQpIHsKICAgIHNob3J0IGRlcHRoU2l6ZSwgc3RlbmNpbFNpemU7CiAgICBCT09MIGxvY2thYmxlID0gRkFMU0U7CgogICAgaWYoIWNmZykKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgaWYoIWdldERlcHRoU3RlbmNpbEJpdHMoRm9ybWF0LCAmZGVwdGhTaXplLCAmc3RlbmNpbFNpemUpKSB7CiAgICAgICAgRVJSKCJVbmFibGUgdG8gY2hlY2sgY29tcGF0aWJpbGl0eSBmb3IgRm9ybWF0PSVzXG4iLCBkZWJ1Z19kM2Rmb3JtYXQoRm9ybWF0KSk7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQoKICAgIGlmKChGb3JtYXQgPT0gV0lORUQzREZNVF9EMTZfTE9DS0FCTEUpIHx8IChGb3JtYXQgPT0gV0lORUQzREZNVF9EMzJGX0xPQ0tBQkxFKSkKICAgICAgICBsb2NrYWJsZSA9IFRSVUU7CgogICAgLyogT24gc29tZSBtb2Rlcm4gY2FyZHMgbGlrZSB0aGUgR2Vmb3JjZTgvOSBHTFggZG9lc24ndCBvZmZlciBzb21lIGRlcGh0aHN0ZW5jaWwgZm9ybWF0cyB3aGljaCBEM0Q5IHJlcG9ydHMuCiAgICAgKiBXZSBjYW4gc2FmZWx5IHJlcG9ydCAnY29tcGF0aWJsZScgZm9ybWF0cyAoZS5nLiBEMjQgY2FuIGJlIHVzZWQgZm9yIEQxNikgYXMgbG9uZyBhcyB3ZSBhcmVuJ3QgZGVhbGluZyB3aXRoCiAgICAgKiBhIGxvY2thYmxlIGZvcm1hdC4gVGhpcyBhbHNvIGhlbHBzIEQzRCA8PSA3IGFzIHRoZXkgZXhwZWN0IEQxNiB3aGljaCBpc24ndCBvZmZlcmVkIHdpdGhvdXQgdGhpcyBvbiBHZWZvcmNlOCBjYXJkcy4gKi8KICAgIGlmKCEoY2ZnLT5kZXB0aFNpemUgPT0gZGVwdGhTaXplIHx8ICghbG9ja2FibGUgJiYgY2ZnLT5kZXB0aFNpemUgPiBkZXB0aFNpemUpKSkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgaWYoY2ZnLT5zdGVuY2lsU2l6ZSAhPSBzdGVuY2lsU2l6ZSkKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgcmV0dXJuIFRSVUU7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJV2luZUQzREltcGxfQ2hlY2tEZXB0aFN0ZW5jaWxNYXRjaChJV2luZUQzRCAqaWZhY2UsIFVJTlQgQWRhcHRlciwgV0lORUQzRERFVlRZUEUgRGV2aWNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZPUk1BVCBBZGFwdGVyRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk9STUFUIFJlbmRlclRhcmdldEZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZPUk1BVCBEZXB0aFN0ZW5jaWxGb3JtYXQpIHsKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIGludCBuQ2ZnczsKICAgIFdpbmVEM0RfUGl4ZWxGb3JtYXQgKmNmZ3M7CiAgICBpbnQgaXQ7CgogICAgV0FSTl8oZDNkX2NhcHMpKCIoJXApLT4gKFNUVUIpIChBZHB0cjolZCwgRGV2VHlwZTooJXgsJXMpLCBBZHB0Rm10OigleCwlcyksIFJlbmRyVGd0Rm10OigleCwlcyksIERlcHRoU3RlbmNpbEZtdDooJXgsJXMpKVxuIiwKICAgICAgICAgICBUaGlzLCBBZGFwdGVyLAogICAgICAgICAgIERldmljZVR5cGUsIGRlYnVnX2QzZGRldmljZXR5cGUoRGV2aWNlVHlwZSksCiAgICAgICAgICAgQWRhcHRlckZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KEFkYXB0ZXJGb3JtYXQpLAogICAgICAgICAgIFJlbmRlclRhcmdldEZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KFJlbmRlclRhcmdldEZvcm1hdCksCiAgICAgICAgICAgRGVwdGhTdGVuY2lsRm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoRGVwdGhTdGVuY2lsRm9ybWF0KSk7CgogICAgaWYgKEFkYXB0ZXIgPj0gSVdpbmVEM0RfR2V0QWRhcHRlckNvdW50KGlmYWNlKSkgewogICAgICAgIFRSQUNFKCIoJXApIEZhaWxlZDogQXRhcHRlciAoJXUpIGhpZ2hlciB0aGFuIHN1cHBvcnRlZCBhZGFwdGVycyAoJXUpIHJldHVybmluZyBXSU5FRDNERVJSX0lOVkFMSURDQUxMXG4iLCBUaGlzLCBBZGFwdGVyLCBJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9JTlZBTElEQ0FMTDsKICAgIH0KCiAgICBjZmdzID0gQWRhcHRlcnNbQWRhcHRlcl0uY2ZnczsKICAgIG5DZmdzID0gQWRhcHRlcnNbQWRhcHRlcl0ubkNmZ3M7CiAgICBmb3IgKGl0ID0gMDsgaXQgPCBuQ2ZnczsgKytpdCkgewogICAgICAgIGlmIChJV2luZUQzREltcGxfSXNQaXhlbEZvcm1hdENvbXBhdGlibGVXaXRoUmVuZGVyRm10KCZjZmdzW2l0XSwgUmVuZGVyVGFyZ2V0Rm9ybWF0KSkgewogICAgICAgICAgICBpZiAoSVdpbmVEM0RJbXBsX0lzUGl4ZWxGb3JtYXRDb21wYXRpYmxlV2l0aERlcHRoRm10KCZjZmdzW2l0XSwgRGVwdGhTdGVuY2lsRm9ybWF0KSkgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiKCVwKSA6IEZvcm1hdHMgbWF0Y2hlZFxuIiwgVGhpcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzRF9PSzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFdBUk5fKGQzZF9jYXBzKSgidW5zdXBwb3J0ZWQgZm9ybWF0IHBhaXI6ICVzIGFuZCAlc1xuIiwgZGVidWdfZDNkZm9ybWF0KFJlbmRlclRhcmdldEZvcm1hdCksIGRlYnVnX2QzZGZvcm1hdChEZXB0aFN0ZW5jaWxGb3JtYXQpKTsKCiAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7Cn0KCnN0YXRpYyBIUkVTVUxUIFdJTkFQSSBJV2luZUQzREltcGxfQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUoSVdpbmVEM0QgKmlmYWNlLCBVSU5UIEFkYXB0ZXIsIFdJTkVEM0RERVZUWVBFIERldmljZVR5cGUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZPUk1BVCBTdXJmYWNlRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBXaW5kb3dlZCwgV0lORUQzRE1VTFRJU0FNUExFX1RZUEUgTXVsdGlTYW1wbGVUeXBlLCBEV09SRCogICBwUXVhbGl0eUxldmVscykgewoKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIGNvbnN0IEdsUGl4ZWxGb3JtYXREZXNjICpnbERlc2M7CiAgICBjb25zdCBTdGF0aWNQaXhlbEZvcm1hdERlc2MgKmRlc2M7CgogICAgVFJBQ0VfKGQzZF9jYXBzKSgiKCVwKS0+IChBZHB0cjolZCwgRGV2VHlwZTooJXgsJXMpLCBTdXJmRm10OigleCwlcyksIFdpbj8lZCwgTXVsdGlTYW1wOiV4LCBwUXVhbDolcClcbiIsCiAgICAgICAgICBUaGlzLAogICAgICAgICAgQWRhcHRlciwKICAgICAgICAgIERldmljZVR5cGUsIGRlYnVnX2QzZGRldmljZXR5cGUoRGV2aWNlVHlwZSksCiAgICAgICAgICBTdXJmYWNlRm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoU3VyZmFjZUZvcm1hdCksCiAgICAgICAgICBXaW5kb3dlZCwKICAgICAgICAgIE11bHRpU2FtcGxlVHlwZSwKICAgICAgICAgIHBRdWFsaXR5TGV2ZWxzKTsKCiAgICBpZiAoQWRhcHRlciA+PSBJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpKSB7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgLyogVE9ETzogaGFuZGxlIFdpbmRvd2VkLCBhZGQgbW9yZSBxdWFsaXR5IGxldmVscyAqLwoKICAgIGlmIChXSU5FRDNETVVMVElTQU1QTEVfTk9ORSA9PSBNdWx0aVNhbXBsZVR5cGUpIHJldHVybiBXSU5FRDNEX09LOwoKICAgIGRlc2MgPSBnZXRGb3JtYXREZXNjRW50cnkoU3VyZmFjZUZvcm1hdCwgJkFkYXB0ZXJzW0FkYXB0ZXJdLmdsX2luZm8sICZnbERlc2MpOwogICAgaWYoIWRlc2MgfHwgIWdsRGVzYykgewogICAgICAgIHJldHVybiBXSU5FRDNERVJSX0lOVkFMSURDQUxMOwogICAgfQoKICAgIGlmKGdsRGVzYy0+RmxhZ3MgJiAoV0lORUQzREZNVF9GTEFHX0RFUFRIIHwgV0lORUQzREZNVF9GTEFHX1NURU5DSUwpKSB7CiAgICAgICAgaW50IGksIG5DZmdzOwogICAgICAgIFdpbmVEM0RfUGl4ZWxGb3JtYXQgKmNmZ3M7CgogICAgICAgIGNmZ3MgPSBBZGFwdGVyc1tBZGFwdGVyXS5jZmdzOwogICAgICAgIG5DZmdzID0gQWRhcHRlcnNbQWRhcHRlcl0ubkNmZ3M7CiAgICAgICAgZm9yKGk9MDsgaTxuQ2ZnczsgaSsrKSB7CiAgICAgICAgICAgIGlmKGNmZ3NbaV0ubnVtU2FtcGxlcyAhPSBNdWx0aVNhbXBsZVR5cGUpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIGlmKCFJV2luZUQzREltcGxfSXNQaXhlbEZvcm1hdENvbXBhdGlibGVXaXRoRGVwdGhGbXQoJmNmZ3NbaV0sIFN1cmZhY2VGb3JtYXQpKQogICAgICAgICAgICAgICAgY29udGludWU7CgogICAgICAgICAgICBUUkFDRSgiRm91bmQgaVBpeGVsRm9ybWF0PSVkIHRvIHN1cHBvcnQgTXVsdGlTYW1wbGVUeXBlPSVkIGZvciBmb3JtYXQgJXNcbiIsIGNmZ3NbaV0uaVBpeGVsRm9ybWF0LCBNdWx0aVNhbXBsZVR5cGUsIGRlYnVnX2QzZGZvcm1hdChTdXJmYWNlRm9ybWF0KSk7CgogICAgICAgICAgICBpZihwUXVhbGl0eUxldmVscykKICAgICAgICAgICAgICAgICpwUXVhbGl0eUxldmVscyA9IDE7IC8qIEd1ZXNzIGF0IGEgdmFsdWUhICovCiAgICAgICAgICAgIHJldHVybiBXSU5FRDNEX09LOwogICAgICAgIH0KICAgIH0KICAgIGVsc2UgaWYoZ2xEZXNjLT5GbGFncyAmIFdJTkVEM0RGTVRfRkxBR19SRU5ERVJUQVJHRVQpIHsKICAgICAgICBzaG9ydCByZWRTaXplLCBncmVlblNpemUsIGJsdWVTaXplLCBhbHBoYVNpemUsIGNvbG9yQml0czsKICAgICAgICBpbnQgaSwgbkNmZ3M7CiAgICAgICAgV2luZUQzRF9QaXhlbEZvcm1hdCAqY2ZnczsKCiAgICAgICAgaWYoIWdldENvbG9yQml0cyhTdXJmYWNlRm9ybWF0LCAmcmVkU2l6ZSwgJmdyZWVuU2l6ZSwgJmJsdWVTaXplLCAmYWxwaGFTaXplLCAmY29sb3JCaXRzKSkgewogICAgICAgICAgICBFUlIoIlVuYWJsZSB0byBjb2xvciBiaXRzIGZvciBmb3JtYXQgJSN4LCBjYW4ndCBjaGVjayBtdWx0aXNhbXBsaW5nIGNhcGFiaWxpdHkhXG4iLCBTdXJmYWNlRm9ybWF0KTsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgIH0KCiAgICAgICAgY2ZncyA9IEFkYXB0ZXJzW0FkYXB0ZXJdLmNmZ3M7CiAgICAgICAgbkNmZ3MgPSBBZGFwdGVyc1tBZGFwdGVyXS5uQ2ZnczsKICAgICAgICBmb3IoaT0wOyBpPG5DZmdzOyBpKyspIHsKICAgICAgICAgICAgaWYoY2Znc1tpXS5udW1TYW1wbGVzICE9IE11bHRpU2FtcGxlVHlwZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBpZihjZmdzW2ldLnJlZFNpemUgIT0gcmVkU2l6ZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBpZihjZmdzW2ldLmdyZWVuU2l6ZSAhPSBncmVlblNpemUpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgaWYoY2Znc1tpXS5ibHVlU2l6ZSAhPSBibHVlU2l6ZSkKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICBpZihjZmdzW2ldLmFscGhhU2l6ZSAhPSBhbHBoYVNpemUpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKCiAgICAgICAgICAgIFRSQUNFKCJGb3VuZCBpUGl4ZWxGb3JtYXQ9JWQgdG8gc3VwcG9ydCBNdWx0aVNhbXBsZVR5cGU9JWQgZm9yIGZvcm1hdCAlc1xuIiwgY2Znc1tpXS5pUGl4ZWxGb3JtYXQsIE11bHRpU2FtcGxlVHlwZSwgZGVidWdfZDNkZm9ybWF0KFN1cmZhY2VGb3JtYXQpKTsKCiAgICAgICAgICAgIGlmKHBRdWFsaXR5TGV2ZWxzKQogICAgICAgICAgICAgICAgKnBRdWFsaXR5TGV2ZWxzID0gMTsgLyogR3Vlc3MgYXQgYSB2YWx1ZSEgKi8KICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RfT0s7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0NoZWNrRGV2aWNlVHlwZShJV2luZUQzRCAqaWZhY2UsIFVJTlQgQWRhcHRlciwgV0lORUQzRERFVlRZUEUgRGV2aWNlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERk9STUFUIERpc3BsYXlGb3JtYXQsIFdJTkVEM0RGT1JNQVQgQmFja0J1ZmZlckZvcm1hdCwgQk9PTCBXaW5kb3dlZCkgewoKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIEhSRVNVTFQgaHIgPSBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgIFVJTlQgbm1vZGVzOwoKICAgIFRSQUNFXyhkM2RfY2FwcykoIiglcCktPiAoU1RVQikgKEFkcHRyOiVkLCBDaGVja1R5cGU6KCV4LCVzKSwgRGlzcEZtdDooJXgsJXMpLCBCYWNrQnVmOigleCwlcyksIFdpbj8lZCk6IHN0dWJcbiIsCiAgICAgICAgICBUaGlzLAogICAgICAgICAgQWRhcHRlciwKICAgICAgICAgIERldmljZVR5cGUsIGRlYnVnX2QzZGRldmljZXR5cGUoRGV2aWNlVHlwZSksCiAgICAgICAgICBEaXNwbGF5Rm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoRGlzcGxheUZvcm1hdCksCiAgICAgICAgICBCYWNrQnVmZmVyRm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoQmFja0J1ZmZlckZvcm1hdCksCiAgICAgICAgICBXaW5kb3dlZCk7CgogICAgaWYgKEFkYXB0ZXIgPj0gSVdpbmVEM0RfR2V0QWRhcHRlckNvdW50KGlmYWNlKSkgewogICAgICAgIFdBUk5fKGQzZF9jYXBzKSgiQWRhcHRlciA+PSBJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpLCByZXR1cm5pbmcgV0lORUQzREVSUl9JTlZBTElEQ0FMTFxuIik7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgLyogVGhlIHRhc2sgb2YgdGhpcyBmdW5jdGlvbiBpcyB0byBjaGVjayB3aGV0aGVyIGEgY2VydGFpbiBkaXNwbGF5IC8gYmFja2J1ZmZlciBmb3JtYXQKICAgICAqIGNvbWJpbmF0aW9uIGlzIGF2YWlsYWJsZSBvbiB0aGUgZ2l2ZW4gYWRhcHRlci4gSW4gZnVsbHNjcmVlbiBtb2RlIG1pY3Jvc29mdCBzcGVjaWZpZWQKICAgICAqIHRoYXQgdGhlIGRpc3BsYXkgZm9ybWF0IHNob3VsZG4ndCBwcm92aWRlIGFscGhhIGFuZCB0aGF0IGlnbm9yaW5nIGFscGhhIHRoZSBiYWNrYnVmZmVyCiAgICAgKiBhbmQgZGlzcGxheSBmb3JtYXQgc2hvdWxkIG1hdGNoIGV4YWN0bHkuCiAgICAgKiBJbiB3aW5kb3dlZCBtb2RlIGZvcm1hdCBjb252ZXJzaW9uIGNhbiBvY2N1ciBhbmQgdGhpcyBkZXBlbmRzIG9uIHRoZSBkcml2ZXIuIFdoZW4gZm9ybWF0CiAgICAgKiBjb252ZXJzaW9uIGlzIGRvbmUsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIG5ldmVydGhlbGVzcyBmYWlsIGFuZCBhcHBsaWNhdGlvbnMgbmVlZCB0byB1c2UKICAgICAqIENoZWNrRGV2aWNlRm9ybWF0Q29udmVyc2lvbi4KICAgICAqIEF0IHRoZSBtb21lbnQgd2UgYXNzdW1lIHRoYXQgZnVsbHNjcmVlbiBhbmQgd2luZG93ZWQgaGF2ZSB0aGUgc2FtZSBjYXBhYmlsaXRpZXMgKi8KCiAgICAvKiBUaGVyZSBhcmUgb25seSA0IGRpc3BsYXkgZm9ybWF0cyAqLwogICAgaWYoISgoRGlzcGxheUZvcm1hdCA9PSBXSU5FRDNERk1UX1I1RzZCNSkgfHwKICAgICAgICAgKERpc3BsYXlGb3JtYXQgPT0gV0lORUQzREZNVF9YMVI1RzVCNSkgfHwKICAgICAgICAgKERpc3BsYXlGb3JtYXQgPT0gV0lORUQzREZNVF9YOFI4RzhCOCkgfHwKICAgICAgICAgKERpc3BsYXlGb3JtYXQgPT0gV0lORUQzREZNVF9BMlIxMEcxMEIxMCkpKQogICAgewogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIkZvcm1hdCAlcyB1bnN1cHBvcnRlZCBhcyBkaXNwbGF5IGZvcm1hdFxuIiwgZGVidWdfZDNkZm9ybWF0KERpc3BsYXlGb3JtYXQpKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICB9CgogICAgLyogSWYgdGhlIHJlcXVlc3RlZCBEaXNwbGF5Rm9ybWF0IGlzIG5vdCBhdmFpbGFibGUsIGRvbid0IGNvbnRpbnVlICovCiAgICBubW9kZXMgPSBJV2luZUQzREltcGxfR2V0QWRhcHRlck1vZGVDb3VudChpZmFjZSwgQWRhcHRlciwgRGlzcGxheUZvcm1hdCk7CiAgICBpZighbm1vZGVzKSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiTm8gYXZhaWxhYmxlIG1vZGVzIGZvciBkaXNwbGF5IGZvcm1hdCAlc1xuIiwgZGVidWdfZDNkZm9ybWF0KERpc3BsYXlGb3JtYXQpKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICB9CgogICAgLyogV2luZG93ZWQgbW9kZSBhbGxvd3MgeW91IHRvIHNwZWNpZnkgV0lORUQzREZNVF9VTktOT1dOIGZvciB0aGUgYmFja2J1ZmZlcmZvcm1hdCwgaXQgbWVhbnMgJ3JldXNlJyB0aGUgZGlzcGxheSBmb3JtYXQgZm9yIHRoZSBiYWNrYnVmZmVyICovCiAgICBpZighV2luZG93ZWQgJiYgQmFja0J1ZmZlckZvcm1hdCA9PSBXSU5FRDNERk1UX1VOS05PV04pIHsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJCYWNrQnVmZmVyRm9ybWF0IFdJTkVEM0ZNVF9VTktOT1dOIG5vdCBhdmFpbGFibGUgaW4gV2luZG93ZWQgbW9kZVxuIik7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgfQoKICAgIC8qIEluIEZVTExTQ1JFRU4gbW9kZSBSNUc2QjUgY2FuIG9ubHkgYmUgbWl4ZWQgd2l0aCBiYWNrYnVmZmVyIGZvcm1hdCBSNUc2QjUgKi8KICAgIGlmKCAoRGlzcGxheUZvcm1hdCA9PSBXSU5FRDNERk1UX1I1RzZCNSkgJiYgKEJhY2tCdWZmZXJGb3JtYXQgIT0gV0lORUQzREZNVF9SNUc2QjUpICkgewogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIlVuc3VwcG9ydGVkIGRpc3BsYXkvYmFja2J1ZmZlciBmb3JtYXQgY29tYmluYXRpb24gJXMvJXNcbiIsIGRlYnVnX2QzZGZvcm1hdChEaXNwbGF5Rm9ybWF0KSwgZGVidWdfZDNkZm9ybWF0KEJhY2tCdWZmZXJGb3JtYXQpKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICB9CgogICAgLyogSW4gRlVMTFNDUkVFTiBtb2RlIFgxUjVHNUI1IGNhbiBvbmx5IGJlIG1peGVkIHdpdGggYmFja2J1ZmZlciBmb3JtYXQgKjFSNUc1QjUgKi8KICAgIGlmKCAoRGlzcGxheUZvcm1hdCA9PSBXSU5FRDNERk1UX1gxUjVHNUI1KSAmJiAhKChCYWNrQnVmZmVyRm9ybWF0ID09IFdJTkVEM0RGTVRfWDFSNUc1QjUpIHx8IChCYWNrQnVmZmVyRm9ybWF0ID09IFdJTkVEM0RGTVRfQTFSNUc1QjUpKSApIHsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJVbnN1cHBvcnRlZCBkaXNwbGF5L2JhY2tidWZmZXIgZm9ybWF0IGNvbWJpbmF0aW9uICVzLyVzXG4iLCBkZWJ1Z19kM2Rmb3JtYXQoRGlzcGxheUZvcm1hdCksIGRlYnVnX2QzZGZvcm1hdChCYWNrQnVmZmVyRm9ybWF0KSk7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgfQoKICAgIC8qIEluIEZVTExTQ1JFRU4gbW9kZSBYOFI4RzhCOCBjYW4gb25seSBiZSBtaXhlZCB3aXRoIGJhY2tidWZmZXIgZm9ybWF0ICo4UjhHOEI4ICovCiAgICBpZiggKERpc3BsYXlGb3JtYXQgPT0gV0lORUQzREZNVF9YOFI4RzhCOCkgJiYgISgoQmFja0J1ZmZlckZvcm1hdCA9PSBXSU5FRDNERk1UX1g4UjhHOEI4KSB8fCAoQmFja0J1ZmZlckZvcm1hdCA9PSBXSU5FRDNERk1UX0E4UjhHOEI4KSkgKSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiVW5zdXBwb3J0ZWQgZGlzcGxheS9iYWNrYnVmZmVyIGZvcm1hdCBjb21iaW5hdGlvbiAlcy8lc1xuIiwgZGVidWdfZDNkZm9ybWF0KERpc3BsYXlGb3JtYXQpLCBkZWJ1Z19kM2Rmb3JtYXQoQmFja0J1ZmZlckZvcm1hdCkpOwogICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgIH0KCiAgICAvKiBBMlIxMEcxMEIxMCBpcyBvbmx5IGFsbG93ZWQgaW4gZnVsbHNjcmVlbiBtb2RlIGFuZCBpdCBjYW4gb25seSBiZSBtaXhlZCB3aXRoIGJhY2tidWZmZXIgZm9ybWF0IEEyUjEwRzEwQjEwICovCiAgICBpZiggKERpc3BsYXlGb3JtYXQgPT0gV0lORUQzREZNVF9BMlIxMEcxMEIxMCkgJiYgKChCYWNrQnVmZmVyRm9ybWF0ICE9IFdJTkVEM0RGTVRfQTJSMTBHMTBCMTApIHx8IFdpbmRvd2VkKSkgewogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIlVuc3VwcG9ydGVkIGRpc3BsYXkvYmFja2J1ZmZlciBmb3JtYXQgY29tYmluYXRpb24gJXMvJXNcbiIsIGRlYnVnX2QzZGZvcm1hdChEaXNwbGF5Rm9ybWF0KSwgZGVidWdfZDNkZm9ybWF0KEJhY2tCdWZmZXJGb3JtYXQpKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICB9CgogICAgLyogVXNlIENoZWNrRGV2aWNlRm9ybWF0IHRvIHNlZSBpZiB0aGUgQmFja0J1ZmZlckZvcm1hdCBpcyB1c2FibGUgd2l0aCB0aGUgZ2l2ZW4gRGlzcGxheUZvcm1hdCAqLwogICAgaHIgPSBJV2luZUQzREltcGxfQ2hlY2tEZXZpY2VGb3JtYXQoaWZhY2UsIEFkYXB0ZXIsIERldmljZVR5cGUsIERpc3BsYXlGb3JtYXQsIFdJTkVEM0RVU0FHRV9SRU5ERVJUQVJHRVQsIFdJTkVEM0RSVFlQRV9TVVJGQUNFLCBCYWNrQnVmZmVyRm9ybWF0KTsKICAgIGlmKEZBSUxFRChocikpCiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiVW5zdXBwb3J0ZWQgZGlzcGxheS9iYWNrYnVmZmVyIGZvcm1hdCBjb21iaW5hdGlvbiAlcy8lc1xuIiwgZGVidWdfZDNkZm9ybWF0KERpc3BsYXlGb3JtYXQpLCBkZWJ1Z19kM2Rmb3JtYXQoQmFja0J1ZmZlckZvcm1hdCkpOwoKICAgIHJldHVybiBocjsKfQoKCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OIEFkYXB0ZXJzW0FkYXB0ZXJdLmdsX2luZm8KLyogQ2hlY2sgaWYgd2Ugc3VwcG9ydCBidW1wbWFwcGluZyBmb3IgYSBmb3JtYXQgKi8Kc3RhdGljIEJPT0wgQ2hlY2tCdW1wTWFwQ2FwYWJpbGl0eShVSU5UIEFkYXB0ZXIsIFdJTkVEM0RGT1JNQVQgQ2hlY2tGb3JtYXQpCnsKICAgIGlmKEdMX1NVUFBPUlQoTlZfUkVHSVNURVJfQ09NQklORVJTKSAmJiBHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSMikpIHsKICAgICAgICBzd2l0Y2ggKENoZWNrRm9ybWF0KSB7CiAgICAgICAgICAgIGNhc2UgV0lORUQzREZNVF9WOFU4OgogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW09LXVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgLyogVE9ETzogT3RoZXIgYnVtcCBtYXAgZm9ybWF0cyAqLwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgICAgIH0KICAgIH0KICAgIGlmKEdMX1NVUFBPUlQoQVRJX0VOVk1BUF9CVU1QTUFQKSB8fCBHTF9TVVBQT1JUKEFUSV9GUkFHTUVOVF9TSEFERVIpKSB7CiAgICAgICAgc3dpdGNoIChDaGVja0Zvcm1hdCkgewogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVjhVODoKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltPS11cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQogICAgfQogICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgcmV0dXJuIEZBTFNFOwp9CgovKiBDaGVjayBpZiB0aGUgZ2l2ZW4gRGlzcGxheUZvcm1hdCArIERlcHRoU3RlbmNpbEZvcm1hdCBjb21iaW5hdGlvbiBpcyB2YWxpZCBmb3IgdGhlIEFkYXB0ZXIgKi8Kc3RhdGljIEJPT0wgQ2hlY2tEZXB0aFN0ZW5jaWxDYXBhYmlsaXR5KFVJTlQgQWRhcHRlciwgV0lORUQzREZPUk1BVCBEaXNwbGF5Rm9ybWF0LCBXSU5FRDNERk9STUFUIERlcHRoU3RlbmNpbEZvcm1hdCkKewogICAgaW50IGl0PTA7CiAgICBXaW5lRDNEX1BpeGVsRm9ybWF0ICpjZmdzID0gQWRhcHRlcnNbQWRhcHRlcl0uY2ZnczsKICAgIGNvbnN0IEdsUGl4ZWxGb3JtYXREZXNjICpnbERlc2M7CiAgICBjb25zdCBTdGF0aWNQaXhlbEZvcm1hdERlc2MgKmRlc2MgPSBnZXRGb3JtYXREZXNjRW50cnkoRGVwdGhTdGVuY2lsRm9ybWF0LCAmR0xJTkZPX0xPQ0FUSU9OLCAmZ2xEZXNjKTsKCiAgICAvKiBGYWlsIGlmIHdlIHdlcmVuJ3QgYWJsZSB0byBnZXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0ICovCiAgICBpZighZGVzYyB8fCAhZ2xEZXNjKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAvKiBPbmx5IGFsbG93IGRlcHRoL3N0ZW5jaWwgZm9ybWF0cyAqLwogICAgaWYoIShnbERlc2MtPkZsYWdzICYgKFdJTkVEM0RGTVRfRkxBR19ERVBUSCB8IFdJTkVEM0RGTVRfRkxBR19TVEVOQ0lMKSkpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIC8qIFdhbGsgdGhyb3VnaCBhbGwgV0dMIHBpeGVsIGZvcm1hdHMgdG8gZmluZCBhIG1hdGNoICovCiAgICBjZmdzID0gQWRhcHRlcnNbQWRhcHRlcl0uY2ZnczsKICAgIGZvciAoaXQgPSAwOyBpdCA8IEFkYXB0ZXJzW0FkYXB0ZXJdLm5DZmdzOyArK2l0KSB7CiAgICAgICAgaWYgKElXaW5lRDNESW1wbF9Jc1BpeGVsRm9ybWF0Q29tcGF0aWJsZVdpdGhSZW5kZXJGbXQoJmNmZ3NbaXRdLCBEaXNwbGF5Rm9ybWF0KSkgewogICAgICAgICAgICBpZiAoSVdpbmVEM0RJbXBsX0lzUGl4ZWxGb3JtYXRDb21wYXRpYmxlV2l0aERlcHRoRm10KCZjZmdzW2l0XSwgRGVwdGhTdGVuY2lsRm9ybWF0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBDaGVja0ZpbHRlckNhcGFiaWxpdHkoVUlOVCBBZGFwdGVyLCBXSU5FRDNERk9STUFUIENoZWNrRm9ybWF0KQp7CiAgICBjb25zdCBHbFBpeGVsRm9ybWF0RGVzYyAqZ2xEZXNjOwogICAgY29uc3QgU3RhdGljUGl4ZWxGb3JtYXREZXNjICpkZXNjID0gZ2V0Rm9ybWF0RGVzY0VudHJ5KENoZWNrRm9ybWF0LCAmR0xJTkZPX0xPQ0FUSU9OLCAmZ2xEZXNjKTsKCiAgICAvKiBGYWlsIGlmIHdlIHdlcmVuJ3QgYWJsZSB0byBnZXQgYSBkZXNjcmlwdGlvbiBvZiB0aGUgZm9ybWF0ICovCiAgICBpZighZGVzYyB8fCAhZ2xEZXNjKQogICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAvKiBUaGUgZmxhZ3MgZW50cnkgb2YgYSBmb3JtYXQgY29udGFpbnMgdGhlIGZpbHRlcmluZyBjYXBhYmlsaXR5ICovCiAgICBpZihnbERlc2MtPkZsYWdzICYgV0lORUQzREZNVF9GTEFHX0ZJTFRFUklORykKICAgICAgICByZXR1cm4gVFJVRTsKCiAgICByZXR1cm4gRkFMU0U7Cn0KCi8qIENoZWNrIHRoZSByZW5kZXIgdGFyZ2V0IGNhcGFiaWxpdGllcyBvZiBhIGZvcm1hdCAqLwpzdGF0aWMgQk9PTCBDaGVja1JlbmRlclRhcmdldENhcGFiaWxpdHkoV0lORUQzREZPUk1BVCBBZGFwdGVyRm9ybWF0LCBXSU5FRDNERk9STUFUIENoZWNrRm9ybWF0KQp7CiAgICBVSU5UIEFkYXB0ZXIgPSAwOwogICAgY29uc3QgR2xQaXhlbEZvcm1hdERlc2MgKmdsRGVzYzsKICAgIGNvbnN0IFN0YXRpY1BpeGVsRm9ybWF0RGVzYyAqZGVzYyA9IGdldEZvcm1hdERlc2NFbnRyeShDaGVja0Zvcm1hdCwgJkdMSU5GT19MT0NBVElPTiwgJmdsRGVzYyk7CgogICAgLyogRmFpbCBpZiB3ZSB3ZXJlbid0IGFibGUgdG8gZ2V0IGEgZGVzY3JpcHRpb24gb2YgdGhlIGZvcm1hdCAqLwogICAgaWYoIWRlc2MgfHwgIWdsRGVzYykKICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgLyogRmlsdGVyIG91dCBub24tUlQgZm9ybWF0cyAqLwogICAgaWYoIShnbERlc2MtPkZsYWdzICYgV0lORUQzREZNVF9GTEFHX1JFTkRFUlRBUkdFVCkpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIGlmKHdpbmVkM2Rfc2V0dGluZ3Mub2Zmc2NyZWVuX3JlbmRlcmluZ19tb2RlID09IE9STV9CQUNLQlVGRkVSKSB7CiAgICAgICAgV2luZUQzRF9QaXhlbEZvcm1hdCAqY2ZncyA9IEFkYXB0ZXJzW0FkYXB0ZXJdLmNmZ3M7CiAgICAgICAgaW50IGl0OwogICAgICAgIHNob3J0IEFkYXB0ZXJSZWQsIEFkYXB0ZXJHcmVlbiwgQWRhcHRlckJsdWUsIEFkYXB0ZXJBbHBoYSwgQWRhcHRlclRvdGFsU2l6ZTsKICAgICAgICBzaG9ydCBDaGVja1JlZCwgQ2hlY2tHcmVlbiwgQ2hlY2tCbHVlLCBDaGVja0FscGhhLCBDaGVja1RvdGFsU2l6ZTsKCiAgICAgICAgZ2V0Q29sb3JCaXRzKEFkYXB0ZXJGb3JtYXQsICZBZGFwdGVyUmVkLCAmQWRhcHRlckdyZWVuLCAmQWRhcHRlckJsdWUsICZBZGFwdGVyQWxwaGEsICZBZGFwdGVyVG90YWxTaXplKTsKICAgICAgICBnZXRDb2xvckJpdHMoQ2hlY2tGb3JtYXQsICZDaGVja1JlZCwgJkNoZWNrR3JlZW4sICZDaGVja0JsdWUsICZDaGVja0FscGhhLCAmQ2hlY2tUb3RhbFNpemUpOwoKICAgICAgICAvKiBJbiBiYWNrYnVmZmVyIG1vZGUgdGhlIGZyb250IGFuZCBiYWNrYnVmZmVyIHNoYXJlIHRoZSBzYW1lIFdHTCBwaXhlbGZvcm1hdC4KICAgICAgICAgKiBUaGUgZm9ybWF0IG11c3QgbWF0Y2ggaW4gUkdCLCBhbHBoYSBpcyBhbGxvd2VkIHRvIGJlIGRpZmZlcmVudC4gKE9ubHkgdGhlIGJhY2tidWZmZXIgY2FuIGhhdmUgYWxwaGEpICovCiAgICAgICAgaWYoISgoQWRhcHRlclJlZCA9PSBDaGVja1JlZCkgJiYgKEFkYXB0ZXJHcmVlbiA9PSBDaGVja0dyZWVuKSAmJiAoQWRhcHRlckJsdWUgPT0gQ2hlY2tCbHVlKSkpIHsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CiAgICAgICAgfQoKICAgICAgICAvKiBDaGVjayBpZiB0aGVyZSBpcyBhIFdHTCBwaXhlbCBmb3JtYXQgbWF0Y2hpbmcgdGhlIHJlcXVpcmVtZW50cywgdGhlIGZvcm1hdCBzaG91bGQgYWxzbyBiZSB3aW5kb3cKICAgICAgICAgKiBkcmF3YWJsZSAobm90IG9mZnNjcmVlbjsgZS5nLiBOdmlkaWEgb2ZmZXJzIFI1RzZCNSBmb3IgcGJ1ZmZlcnMgZXZlbiB3aGVuIFggaXMgcnVubmluZyBhdCAyNGJpdCkgKi8KICAgICAgICBmb3IgKGl0ID0gMDsgaXQgPCBBZGFwdGVyc1tBZGFwdGVyXS5uQ2ZnczsgKytpdCkgewogICAgICAgICAgICBpZiAoY2Znc1tpdF0ud2luZG93RHJhd2FibGUgJiYgSVdpbmVEM0RJbXBsX0lzUGl4ZWxGb3JtYXRDb21wYXRpYmxlV2l0aFJlbmRlckZtdCgmY2Znc1tpdF0sIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiaVBpeGVsRm9ybWF0PSVkIGlzIGNvbXBhdGlibGUgd2l0aCBDaGVja0Zvcm1hdD0lc1xuIiwgY2Znc1tpdF0uaVBpeGVsRm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoQ2hlY2tGb3JtYXQpKTsKICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmKHdpbmVkM2Rfc2V0dGluZ3Mub2Zmc2NyZWVuX3JlbmRlcmluZ19tb2RlID09IE9STV9QQlVGRkVSKSB7CiAgICAgICAgLyogV2UgY2FuIHByb2JhYmx5IHVzZSB0aGlzIGZ1bmN0aW9uIGluIEZCTyBtb2RlIHRvbyBvbiBzb21lIGRyaXZlcnMgdG8gZ2V0IHNvbWUgYmFzaWMgaW5kaWNhdGlvbiBvZiB0aGUgY2FwYWJpbGl0aWVzLiAqLwogICAgICAgIFdpbmVEM0RfUGl4ZWxGb3JtYXQgKmNmZ3MgPSBBZGFwdGVyc1tBZGFwdGVyXS5jZmdzOwogICAgICAgIGludCBpdDsKCiAgICAgICAgLyogQ2hlY2sgaWYgdGhlcmUgaXMgYSBXR0wgcGl4ZWwgZm9ybWF0IG1hdGNoaW5nIHRoZSByZXF1aXJlbWVudHMsIHRoZSBwaXhlbCBmb3JtYXQgc2hvdWxkIGFsc28gYmUgdXNhYmxlIHdpdGggcGJ1ZmZlcnMgKi8KICAgICAgICBmb3IgKGl0ID0gMDsgaXQgPCBBZGFwdGVyc1tBZGFwdGVyXS5uQ2ZnczsgKytpdCkgewogICAgICAgICAgICBpZiAoY2Znc1tpdF0ucGJ1ZmZlckRyYXdhYmxlICYmIElXaW5lRDNESW1wbF9Jc1BpeGVsRm9ybWF0Q29tcGF0aWJsZVdpdGhSZW5kZXJGbXQoJmNmZ3NbaXRdLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoImlQaXhlbEZvcm1hdD0lZCBpcyBjb21wYXRpYmxlIHdpdGggQ2hlY2tGb3JtYXQ9JXNcbiIsIGNmZ3NbaXRdLmlQaXhlbEZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KENoZWNrRm9ybWF0KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0gZWxzZSBpZih3aW5lZDNkX3NldHRpbmdzLm9mZnNjcmVlbl9yZW5kZXJpbmdfbW9kZSA9PSBPUk1fRkJPKXsKICAgICAgICAvKiBGb3Igbm93IHJldHVybiBUUlVFIGZvciBGQk9zIHVudGlsIHdlIGhhdmUgc29tZSBwcm9wZXIgY2hlY2tzLgogICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHdpbGwgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgZm9ybWF0IGlzIGFyb3VuZCBmb3IgdGV4dHVyaW5nLiAqLwogICAgICAgIHJldHVybiBUUlVFOwogICAgfQogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBDaGVja1NyZ2JSZWFkQ2FwYWJpbGl0eShVSU5UIEFkYXB0ZXIsIFdJTkVEM0RGT1JNQVQgQ2hlY2tGb3JtYXQpCnsKICAgIC8qIENoZWNrIGZvciBzdXBwb3J0ZWQgc1JHQiBmb3JtYXRzIChUZXh0dXJlIGxvYWRpbmcgYW5kIGZyYW1lYnVmZmVyKSAqLwogICAgaWYoIUdMX1NVUFBPUlQoRVhUX1RFWFRVUkVfU1JHQikpIHsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSBHTF9FWFRfdGV4dHVyZV9zUkdCIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBzd2l0Y2ggKENoZWNrRm9ybWF0KSB7CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4UjhHOEI4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YOFI4RzhCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTRSNEc0QjQ6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0w4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BOEw4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQxOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQyOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQzOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQ0OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQ1OgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbT0tdXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIEdhbW1hIHRleHR1cmUgZm9ybWF0ICVzIG5vdCBzdXBwb3J0ZWQuXG4iLCBkZWJ1Z19kM2Rmb3JtYXQoQ2hlY2tGb3JtYXQpKTsKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBDaGVja1NyZ2JXcml0ZUNhcGFiaWxpdHkoVUlOVCBBZGFwdGVyLCBXSU5FRDNEREVWVFlQRSBEZXZpY2VUeXBlLCBXSU5FRDNERk9STUFUIENoZWNrRm9ybWF0KQp7CiAgICAvKiBPbmx5IG9mZmVyIFNSR0Igd3JpdGluZyBvbiBYOFI4RzhCOC9BOFI4RzhCOCB3aGVuIHdlIHVzZSBBUkIgb3IgR0xTTCBzaGFkZXJzIGFzIHdlIGFyZQogICAgICogZG9pbmcgdGhlIGNvbG9yIGZpeHVwIGluIHNoYWRlcnMuCiAgICAgKiBOb3RlIFdpbmRvd3MgZHJpdmVycyAoYXQgbGVhc3Qgb24gdGhlIEdlZm9yY2UgODgwMCkgYWxzbyBvZmZlciB0aGlzIG9uIFI1RzZCNS4gKi8KICAgIGlmKChDaGVja0Zvcm1hdCA9PSBXSU5FRDNERk1UX1g4UjhHOEI4KSB8fCAoQ2hlY2tGb3JtYXQgPT0gV0lORUQzREZNVF9BOFI4RzhCOCkpIHsKICAgICAgICBpbnQgdnNfc2VsZWN0ZWRfbW9kZTsKICAgICAgICBpbnQgcHNfc2VsZWN0ZWRfbW9kZTsKICAgICAgICBzZWxlY3Rfc2hhZGVyX21vZGUoJkdMSU5GT19MT0NBVElPTiwgRGV2aWNlVHlwZSwgJnBzX3NlbGVjdGVkX21vZGUsICZ2c19zZWxlY3RlZF9tb2RlKTsKCiAgICAgICAgaWYoKHBzX3NlbGVjdGVkX21vZGUgPT0gU0hBREVSX0FSQikgfHwgKHBzX3NlbGVjdGVkX21vZGUgPT0gU0hBREVSX0dMU0wpKSB7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltPS11cbiIpOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICB9CiAgICB9CgogICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBubyBTUkdCIHdyaXRpbmcgc3VwcG9ydCBvbiBmb3JtYXQ9JXNcbiIsIGRlYnVnX2QzZGZvcm1hdChDaGVja0Zvcm1hdCkpOwogICAgcmV0dXJuIEZBTFNFOwp9CgovKiBDaGVjayBpZiBhIGZvcm1hdCBzdXBwb3J0IGJsZW5kaW5nIGluIGNvbWJpbmF0aW9uIHdpdGggcGl4ZWwgc2hhZGVycyAqLwpzdGF0aWMgQk9PTCBDaGVja1Bvc3RQaXhlbFNoYWRlckJsZW5kaW5nQ2FwYWJpbGl0eShVSU5UIEFkYXB0ZXIsIFdJTkVEM0RGT1JNQVQgQ2hlY2tGb3JtYXQpCnsKICAgIGNvbnN0IEdsUGl4ZWxGb3JtYXREZXNjICpnbERlc2M7CiAgICBjb25zdCBTdGF0aWNQaXhlbEZvcm1hdERlc2MgKmRlc2MgPSBnZXRGb3JtYXREZXNjRW50cnkoQ2hlY2tGb3JtYXQsICZHTElORk9fTE9DQVRJT04sICZnbERlc2MpOwoKICAgIC8qIEZhaWwgaWYgd2Ugd2VyZW4ndCBhYmxlIHRvIGdldCBhIGRlc2NyaXB0aW9uIG9mIHRoZSBmb3JtYXQgKi8KICAgIGlmKCFkZXNjIHx8ICFnbERlc2MpCiAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgIC8qIFRoZSBmbGFncyBlbnRyeSBvZiBhIGZvcm1hdCBjb250YWlucyB0aGUgcG9zdCBwaXhlbCBzaGFkZXIgYmxlbmRpbmcgY2FwYWJpbGl0eSAqLwogICAgaWYoZ2xEZXNjLT5GbGFncyAmIFdJTkVEM0RGTVRfRkxBR19QT1NUUElYRUxTSEFERVJfQkxFTkRJTkcpCiAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgQk9PTCBDaGVja1dyYXBBbmRNaXBDYXBhYmlsaXR5KFVJTlQgQWRhcHRlciwgV0lORUQzREZPUk1BVCBDaGVja0Zvcm1hdCkgewogICAgLyogT3BlbkdMIHN1cHBvcnRzIG1pcG1hcHBpbmcgb24gYWxsIGZvcm1hdHMgYmFzaWNhbGx5LiBXcmFwcGluZyBpcyB1bnN1cHBvcnRlZCwKICAgICAqIGJ1dCB3ZSBoYXZlIHRvIHJlcG9ydCBtaXBtYXBwaW5nIHNvIHdlIGNhbm5vdCByZWplY3QgdGhpcyBmbGFnLiBUZXN0cyBzaG93IHRoYXQKICAgICAqIHdpbmRvd3MgcmVwb3J0cyBXUkFQQU5ETUlQIG9uIHVuZmlsdGVyYWJsZSBzdXJmYWNlcyBhcyB3ZWxsLCBhcHBhcmVudGx5IHRvIHNob3cKICAgICAqIHRoYXQgd3JhcHBpbmcgaXMgc3VwcG9ydGVkLiBUaGUgbGFjayBvZiBmaWx0ZXJpbmcgd2lsbCBzb3J0IG91dCB0aGUgbWlwbWFwcGluZwogICAgICogY2FwYWJpbGl0eSBhbnl3YXkuCiAgICAgKgogICAgICogRm9yIG5vdyBsZXRzIHJlcG9ydCB0aGlzIG9uIGFsbCBmb3JtYXRzLCBidXQgaW4gdGhlIGZ1dHVyZSB3ZSBtYXkgd2FudCB0bwogICAgICogcmVzdHJpY3QgaXQgdG8gc29tZSBzaG91bGQgZ2FtZXMgbmVlZCB0aGF0CiAgICAgKi8KICAgIHJldHVybiBUUlVFOwp9CgovKiBDaGVjayBpZiBhIHRleHR1cmUgZm9ybWF0IGlzIHN1cHBvcnRlZCBvbiB0aGUgZ2l2ZW4gYWRhcHRlciAqLwpzdGF0aWMgQk9PTCBDaGVja1RleHR1cmVDYXBhYmlsaXR5KFVJTlQgQWRhcHRlciwgV0lORUQzREZPUk1BVCBDaGVja0Zvcm1hdCkKewogICAgc3dpdGNoIChDaGVja0Zvcm1hdCkgewoKICAgICAgICAvKioqKioKICAgICAgICAgKiAgc3VwcG9ydGVkOiBSR0IoQSkgZm9ybWF0cwogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9SOEc4Qjg6IC8qIEVuYWJsZSBmb3IgZHg3LCBibGFja2xpc3RlZCBmb3IgOCBhbmQgOSBhYm92ZSAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9BOFI4RzhCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDhSOEc4Qjg6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1I1RzZCNToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDFSNUc1QjU6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0ExUjVHNUI1OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BNFI0RzRCNDoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjNHM0IyOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDRSNEc0QjQ6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4QjhHOFI4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YOEI4RzhSODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTJSMTBHMTBCMTA6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0EyQjEwRzEwUjEwOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9HMTZSMTY6CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltPS11cbiIpOwogICAgICAgICAgICByZXR1cm4gVFJVRTsKCiAgICAgICAgLyoqKioqCiAgICAgICAgICogIHN1cHBvcnRlZDogUGFsZXR0aXplZAogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9QODoKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW09LXVxuIik7CiAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgIC8qIE5vIFdpbmRvd3MgZHJpdmVyIG9mZmVycyBBOFA4LCBzbyBkb24ndCBvZmZlciBpdCBlaXRoZXIgKi8KICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQThQODoKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgICAvKioqKioKICAgICAgICAgKiAgU3VwcG9ydGVkOiAoQWxwaGEpLUx1bWluYW5jZQogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9MODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQThMODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTRMNDoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTDE2OgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbT0tdXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgICAgIC8qIERlcHRoL3N0ZW5jaWwgaXMgaGFuZGxlZCB1c2luZyBjaGVja0RlcHRoU3RlbmNpbENhcGFiaWxpdHksIHJldHVybiBGQUxTRSBoZXJlICovCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QxNl9MT0NLQUJMRToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDE2OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMTVTMToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDI0WDg6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QyNFg0UzQ6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QyNFM4OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EMjRGUzg6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0QzMjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRDMyRl9MT0NLQUJMRToKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgICAvKioqKioKICAgICAgICAgKiAgTm90IHN1cHBvcnRlZCBldmVyeXdoZXJlKGRlcGVuZHMgb24gR0xfQVRJX2Vudm1hcF9idW1wbWFwIG9yCiAgICAgICAgICogIEdMX05WX3RleHR1cmVfc2hhZGVyKSwgYnV0IGFkdmVydGl6ZWQgdG8gbWFrZSBhcHBzIGhhcHB5LgogICAgICAgICAqICBFbmFibGUgc29tZSBiZWNhdXNlIGdhbWVzIG9mdGVuIGZhaWwgd2hlbiB0aGV5IGFyZSBub3QgYXZhaWxhYmxlCiAgICAgICAgICogIGFuZCBhcmUgc3RpbGwgcGxheWFibGUgZXZlbiB3aXRob3V0IGJ1bXAgbWFwcGluZwogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9WOFU4OgogICAgICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSKSB8fCBHTF9TVVBQT1JUKEFUSV9FTlZNQVBfQlVNUE1BUCkgfHwKICAgICAgICAgICAgICAgR0xfU1VQUE9SVChBVElfRlJBR01FTlRfU0hBREVSKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfRlJBR01FTlRfU0hBREVSKSB8fCBHTF9TVVBQT1JUKEFSQl9GUkFHTUVOVF9QUk9HUkFNKSkgewogICAgICAgICAgICAgICAgLyogU2hhZGVyIGVtdWxhdGVkICovCiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGNvbnZlcnRlZCBmb3JtYXRzIG9uIHZvbHVtZXNcbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9YOEw4VjhVODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTDZWNVU1OgogICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9GUkFHTUVOVF9TSEFERVIpIHx8IEdMX1NVUFBPUlQoQVJCX0ZSQUdNRU5UX1BST0dSQU0pKSB7CiAgICAgICAgICAgICAgICAvKiBTaGFkZXIgZW11bGF0ZWQgKi8KICAgICAgICAgICAgICAgIHJldHVybiBUUlVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFdBUk5fKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9ROFc4VjhVODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVjE2VTE2OgogICAgICAgICAgICBpZihHTF9TVVBQT1JUKE5WX1RFWFRVUkVfU0hBREVSKSkgewogICAgICAgICAgICAgICAgV0FSTl8oZDNkX2NhcHMpKCJbTm90IHN1cHBvcnRlZCwgYnV0IHByZXRlbmRlZCB0byBkb11cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfRlJBR01FTlRfU0hBREVSKSB8fCBHTF9TVVBQT1JUKEFSQl9GUkFHTUVOVF9QUk9HUkFNKSkgewogICAgICAgICAgICAgICAgLyogU2hhZGVyIGVtdWxhdGVkICovCiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGNvbnZlcnRlZCBmb3JtYXRzIG9uIHZvbHVtZXNcbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIC8qIFRob3NlIGFyZSBub3QgYWR2ZXJ0aXplZCBieSB0aGUgbnZpZGlhIHdpbmRvd3MgZHJpdmVyLCBhbmQgbm90CiAgICAgICAgICogc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IEdMX05WX3RleHR1cmVfc2hhZGVyIG9yIEdMX0FUSV9lbnZtYXBfYnVtcG1hcC4KICAgICAgICAgKiBXSU5FRDNERk1UX0EyVzEwVjEwVTEwIGNvdWxkIGJlIGxvYWRlZCBpbnRvIHNoYWRlcnMgdXNpbmcgdGhlIHVuc2lnbmVkCiAgICAgICAgICogQVJHQiBmb3JtYXQgaWYgbmVlZGVkCiAgICAgICAgICovCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1cxMVYxMVUxMDoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTJXMTBWMTBVMTA6CiAgICAgICAgICAgIFdBUk5fKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQxOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQyOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQzOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQ0OgogICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQ1OgogICAgICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfVEVYVFVSRV9DT01QUkVTU0lPTl9TM1RDKSkgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW09LXVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCgogICAgICAgIC8qKioqKgogICAgICAgICAqICBPZGQgZm9ybWF0cyAtIG5vdCBzdXBwb3J0ZWQKICAgICAgICAgKi8KICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVkVSVEVYREFUQToKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfSU5ERVgxNjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfSU5ERVgzMjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUTE2VzE2VjE2VTE2OgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7IC8qIEVuYWJsZSB3aGVuIGltcGxlbWVudGVkICovCiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgLyoqKioqCiAgICAgICAgICogIFdJTkVEM0RGTVRfQ3hWOFU4OiBOb3Qgc3VwcG9ydGVkIHJpZ2h0IG5vdwogICAgICAgICAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9DeFY4VTg6CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdXG4iKTsgLyogRW5hYmxlIHdoZW4gaW1wbGVtZW50ZWQgKi8KICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgICAvKiBZVVYgZm9ybWF0cywgbm90IHN1cHBvcnRlZCBmb3Igbm93ICovCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1VZVlk6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1lVWTI6CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdXG4iKTsgLyogRW5hYmxlIHdoZW4gaW1wbGVtZW50ZWQgKi8KICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwoKICAgICAgICAgICAgLyogTm90IHN1cHBvcnRlZCAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9BMTZCMTZHMTZSMTY6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0E4UjNHM0IyOgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7IC8qIEVuYWJsZSB3aGVuIGltcGxlbWVudGVkICovCiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IGZvcm1hdHMgKi8KICAgICAgICBjYXNlIFdJTkVEM0RGTVRfUjE2RjoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTE2QjE2RzE2UjE2RjoKICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChBUkJfSEFMRl9GTE9BVF9QSVhFTCkpIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltPS11cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9SMzJGOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9BMzJCMzJHMzJSMzJGOgogICAgICAgICAgICBpZiAoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9GTE9BVCkpIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltPS11cbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgICAgICByZXR1cm4gRkFMU0U7CgogICAgICAgIGNhc2UgV0lORUQzREZNVF9HMTZSMTZGOgogICAgICAgIGNhc2UgV0lORUQzREZNVF9HMzJSMzJGOgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgLyogQVRJIGluc3RhbmNpbmcgaGFjazogQWx0aG91Z2ggQVRJIGNhcmRzIGRvIG5vdCBzdXBwb3J0IFNoYWRlciBNb2RlbCAzLjAsIHRoZXkgc3VwcG9ydAogICAgICAgICAqIGluc3RhbmNpbmcuIFRvIHF1ZXJ5IGlmIHRoZSBjYXJkIHN1cHBvcnRzIGluc3RhbmNpbmcgQ2hlY2tEZXZpY2VGb3JtYXQgd2l0aCB0aGUgc3BlY2lhbCBmb3JtYXQKICAgICAgICAgKiBNQUtFRk9VUkNDKCdJJywnTicsJ1MnLCdUJykgaXMgdXNlZC4gU2hvdWxkIGEgKGJyb2tlbikgYXBwIGNoZWNrIGZvciB0aGlzIHByb3ZpZGUgYSBwcm9wZXIgcmV0dXJuIHZhbHVlLgogICAgICAgICAqIFdlIGNhbiBkbyBpbnN0YW5jaW5nIHdpdGggYWxsIHNoYWRlciB2ZXJzaW9ucywgYnV0IHdlIG5lZWQgdmVydGV4IHNoYWRlcnMuCiAgICAgICAgICoKICAgICAgICAgKiBBZGRpdGlvbmFsbHkgYXBwbGljYXRpb25zIGhhdmUgdG8gc2V0IHRoZSBEM0RSU19QT0lOVFNJWkUgcmVuZGVyIHN0YXRlIHRvIE1BS0VGT1VSQ0MoJ0knLCdOJywnUycsJ1QnKSBvbmNlCiAgICAgICAgICogdG8gZW5hYmxlIGluc3RhbmNpbmcuIFdpbmVEM0QgZG9lc24ndCBuZWVkIHRoYXQgYW5kIGp1c3QgaWdub3JlcyBpdC4KICAgICAgICAgKgogICAgICAgICAqIFdpdGggU2hhZGVyIE1vZGVsIDMuMCBjYXBhYmxlIGNhcmRzIEluc3RhbmNpbmcgJ2p1c3Qgd29ya3MnIGluIFdpbmRvd3MuCiAgICAgICAgICovCiAgICAgICAgY2FzZSBXSU5FTUFLRUZPVVJDQygnSScsJ04nLCdTJywnVCcpOgogICAgICAgICAgICBUUkFDRSgiQVRJIEluc3RhbmNpbmcgY2hlY2sgaGFja1xuIik7CiAgICAgICAgICAgIGlmKEdMX1NVUFBPUlQoQVJCX1ZFUlRFWF9QUk9HUkFNKSB8fCBHTF9TVVBQT1JUKEFSQl9WRVJURVhfU0hBREVSKSkgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW09LXVxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgLyogU29tZSB3ZWlyZCBGT1VSQ0MgZm9ybWF0cyAqLwogICAgICAgIGNhc2UgV0lORUQzREZNVF9SOEc4X0I4Rzg6CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0c4UjhfRzhCODoKICAgICAgICBjYXNlIFdJTkVEM0RGTVRfTVVMVEkyX0FSR0I4OgogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXVxuIik7CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgY2FzZSBXSU5FRDNERk1UX1VOS05PV046CiAgICAgICAgICAgIHJldHVybiBGQUxTRTsKCiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgRVJSKCJVbmhhbmRsZWQgZm9ybWF0PSVzXG4iLCBkZWJ1Z19kM2Rmb3JtYXQoQ2hlY2tGb3JtYXQpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICB9CiAgICByZXR1cm4gRkFMU0U7Cn0KCnN0YXRpYyBCT09MIENoZWNrVmVydGV4VGV4dHVyZUNhcGFiaWxpdHkoVUlOVCBBZGFwdGVyLCBXSU5FRDNERk9STUFUIENoZWNrRm9ybWF0KQp7CiAgICBpZiAoIUdMX0xJTUlUUyh2ZXJ0ZXhfc2FtcGxlcnMpKSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF1cbiIpOwogICAgICAgIHJldHVybiBGQUxTRTsKICAgIH0KCiAgICBzd2l0Y2ggKENoZWNrRm9ybWF0KSB7CiAgICAgICAgY2FzZSBXSU5FRDNERk1UX0EzMkIzMkczMlIzMkY6CiAgICAgICAgICAgIGlmICghR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9GTE9BVCkpIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdXG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKICAgICAgICAgICAgfQogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbT0tdXG4iKTsKICAgICAgICAgICAgcmV0dXJuIFRSVUU7CgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdXG4iKTsKICAgICAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQogICAgcmV0dXJuIEZBTFNFOwp9CgpzdGF0aWMgSFJFU1VMVCBXSU5BUEkgSVdpbmVEM0RJbXBsX0NoZWNrRGV2aWNlRm9ybWF0KElXaW5lRDNEICppZmFjZSwgVUlOVCBBZGFwdGVyLCBXSU5FRDNEREVWVFlQRSBEZXZpY2VUeXBlLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RGT1JNQVQgQWRhcHRlckZvcm1hdCwgRFdPUkQgVXNhZ2UsIFdJTkVEM0RSRVNPVVJDRVRZUEUgUlR5cGUsIFdJTkVEM0RGT1JNQVQgQ2hlY2tGb3JtYXQpIHsKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIERXT1JEIFVzYWdlQ2FwcyA9IDA7CgogICAgVFJBQ0VfKGQzZF9jYXBzKSgiKCVwKS0+IChTVFVCKSAoQWRwdHI6JWQsIERldlR5cGU6KCV1LCVzKSwgQWRwdEZtdDooJXUsJXMpLCBVc2U6KCV1LCVzLCVzKSwgUmVzVHlwOigleCwlcyksIENoZWNrRm10OigldSwlcykpXG4iLAogICAgICAgICAgVGhpcywKICAgICAgICAgIEFkYXB0ZXIsCiAgICAgICAgICBEZXZpY2VUeXBlLCBkZWJ1Z19kM2RkZXZpY2V0eXBlKERldmljZVR5cGUpLAogICAgICAgICAgQWRhcHRlckZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KEFkYXB0ZXJGb3JtYXQpLAogICAgICAgICAgVXNhZ2UsIGRlYnVnX2QzZHVzYWdlKFVzYWdlKSwgZGVidWdfZDNkdXNhZ2VxdWVyeShVc2FnZSksCiAgICAgICAgICBSVHlwZSwgZGVidWdfZDNkcmVzb3VyY2V0eXBlKFJUeXBlKSwKICAgICAgICAgIENoZWNrRm9ybWF0LCBkZWJ1Z19kM2Rmb3JtYXQoQ2hlY2tGb3JtYXQpKTsKCiAgICBpZiAoQWRhcHRlciA+PSBJV2luZUQzRF9HZXRBZGFwdGVyQ291bnQoaWZhY2UpKSB7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfSU5WQUxJRENBTEw7CiAgICB9CgogICAgaWYoUlR5cGUgPT0gV0lORUQzRFJUWVBFX0NVQkVURVhUVVJFKSB7CiAgICAgICAgLyogQ3ViZXRleHR1cmUgYWxsb3dzOgogICAgICAgICAqICAgICAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX0FVVE9HRU5NSVBNQVAKICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9ERVBUSFNURU5DSUwKICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9EWU5BTUlDCiAgICAgICAgICogICAgICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfTk9OU0VDVVJFIChkM2Q5ZXgpCiAgICAgICAgICogICAgICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfUkVOREVSVEFSR0VUCiAgICAgICAgICogICAgICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfU09GVFdBUkVQUk9DRVNTSU5HCiAgICAgICAgICogICAgICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfUVVFUllfV1JBUEFORE1JUAogICAgICAgICAqLwogICAgICAgIGlmKEdMX1NVUFBPUlQoQVJCX1RFWFRVUkVfQ1VCRV9NQVApKSB7CiAgICAgICAgICAgIC8qIENoZWNrIGlmIHRoZSB0ZXh0dXJlIGZvcm1hdCBpcyBhcm91bmQgKi8KICAgICAgICAgICAgaWYoQ2hlY2tUZXh0dXJlQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX0FVVE9HRU5NSVBNQVApIHsKICAgICAgICAgICAgICAgICAgICAvKiBDaGVjayBmb3IgYXV0b21hdGljIG1pcG1hcCBnZW5lcmF0aW9uIHN1cHBvcnQgKi8KICAgICAgICAgICAgICAgICAgICBpZihHTF9TVVBQT1JUKFNHSVNfR0VORVJBVEVfTUlQTUFQKSkgewogICAgICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX0FVVE9HRU5NSVBNQVA7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogV2hlbiBhdXRvZ2VubWlwbWFwIGlzbid0IGFyb3VuZCBjb250aW51ZSBhbmQgcmV0dXJuIFdJTkVEM0RPS19OT0FVVE9HRU4gaW5zdGVhZCBvZiBEM0RfT0sgKi8KICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBhdXRvZ2VubWlwbWFwIHN1cHBvcnQsIGJ1dCBjb250aW51aW5nXG4iKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQWx3YXlzIHJlcG9ydCBkeW5hbWljIGxvY2tpbmcgKi8KICAgICAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX0RZTkFNSUMpCiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9EWU5BTUlDOwoKICAgICAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1JFTkRFUlRBUkdFVCkgewogICAgICAgICAgICAgICAgICAgIGlmKENoZWNrUmVuZGVyVGFyZ2V0Q2FwYWJpbGl0eShBZGFwdGVyRm9ybWF0LCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9SRU5ERVJUQVJHRVQ7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyByZW5kZXJ0YXJnZXQgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQWx3YXlzIHJlcG9ydCBzb2Z0d2FyZSBwcm9jZXNzaW5nICovCiAgICAgICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9TT0ZUV0FSRVBST0NFU1NJTkcpCiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9TT0ZUV0FSRVBST0NFU1NJTkc7CgogICAgICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfRklMVEVSIHN1cHBvcnQgKi8KICAgICAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX0ZJTFRFUikgewogICAgICAgICAgICAgICAgICAgIGlmKENoZWNrRmlsdGVyQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9GSUxURVI7CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSBmaWx0ZXIgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHN1cHBvcnQgKi8KICAgICAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1BPU1RQSVhFTFNIQURFUl9CTEVORElORykgewogICAgICAgICAgICAgICAgICAgIGlmKENoZWNrUG9zdFBpeGVsU2hhZGVyQmxlbmRpbmdDYXBhYmlsaXR5KEFkYXB0ZXIsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX1FVRVJZX1BPU1RQSVhFTFNIQURFUl9CTEVORElORzsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHBvc3QgcGl4ZWxzaGFkZXIgYmxlbmRpbmcgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfU1JHQlJFQUQgc3VwcG9ydCAqLwogICAgICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfU1JHQlJFQUQpIHsKICAgICAgICAgICAgICAgICAgICBpZihDaGVja1NyZ2JSZWFkQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9TUkdCUkVBRDsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHNyZ2JyZWFkIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIENoZWNrIFFVRVJZX1NSR0JXUklURSBzdXBwb3J0ICovCiAgICAgICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9TUkdCV1JJVEUpIHsKICAgICAgICAgICAgICAgICAgICBpZihDaGVja1NyZ2JXcml0ZUNhcGFiaWxpdHkoQWRhcHRlciwgRGV2aWNlVHlwZSwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfU1JHQldSSVRFOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gcXVlcnkgc3JnYndyaXRlIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8qIENoZWNrIFFVRVJZX1ZFUlRFWFRFWFRVUkUgc3VwcG9ydCAqLwogICAgICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfVkVSVEVYVEVYVFVSRSkgewogICAgICAgICAgICAgICAgICAgIGlmKENoZWNrVmVydGV4VGV4dHVyZUNhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfVkVSVEVYVEVYVFVSRTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHZlcnRleHRleHR1cmUgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfV1JBUEFORE1JUCBzdXBwb3J0ICovCiAgICAgICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9XUkFQQU5ETUlQKSB7CiAgICAgICAgICAgICAgICAgICAgaWYoQ2hlY2tXcmFwQW5kTWlwQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9XUkFQQU5ETUlQOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gd3JhcHBpbmcgYW5kIG1pcG1hcHBpbmcgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIEN1YmUgdGV4dHVyZSBmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGN1YmUgdGV4dHVyZSBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgIH0KICAgIH0gZWxzZSBpZihSVHlwZSA9PSBXSU5FRDNEUlRZUEVfU1VSRkFDRSkgewogICAgICAgIC8qIFN1cmZhY2UgYWxsb3dzOgogICAgICAgICAqICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfREVQVEhTVEVOQ0lMCiAgICAgICAgICogICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9OT05TRUNVUkUgKGQzZDlleCkKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX1JFTkRFUlRBUkdFVAogICAgICAgICAqLwoKICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9ERVBUSFNURU5DSUwpIHsKICAgICAgICAgICAgaWYoQ2hlY2tEZXB0aFN0ZW5jaWxDYXBhYmlsaXR5KEFkYXB0ZXIsIEFkYXB0ZXJGb3JtYXQsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9ERVBUSFNURU5DSUw7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGRlcHRoc3RlbmNpbCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUkVOREVSVEFSR0VUKSB7CiAgICAgICAgICAgIGlmKENoZWNrUmVuZGVyVGFyZ2V0Q2FwYWJpbGl0eShBZGFwdGVyRm9ybWF0LCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUkVOREVSVEFSR0VUOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyByZW5kZXJ0YXJnZXQgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKiBDaGVjayBRVUVSWV9QT1NUUElYRUxTSEFERVJfQkxFTkRJTkcgc3VwcG9ydCAqLwogICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1BPU1RQSVhFTFNIQURFUl9CTEVORElORykgewogICAgICAgICAgICBpZihDaGVja1Bvc3RQaXhlbFNoYWRlckJsZW5kaW5nQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSBwb3N0IHBpeGVsc2hhZGVyIGJsZW5kaW5nIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfSBlbHNlIGlmKFJUeXBlID09IFdJTkVEM0RSVFlQRV9URVhUVVJFKSB7CiAgICAgICAgLyogVGV4dHVyZSBhbGxvd3M6CiAgICAgICAgICogICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9BVVRPR0VOTUlQTUFQCiAgICAgICAgICogICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9ERVBUSFNURU5DSUwKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX0RNQVAKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX0RZTkFNSUMKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX05PTlNFQ1VSRSAoZDNkOWV4KQogICAgICAgICAqICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfUkVOREVSVEFSR0VUCiAgICAgICAgICogICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9TT0ZUV0FSRVBST0NFU1NJTkcKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX1RFWFRBUEkgKGQzZDlleCkKICAgICAgICAgKiAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX1FVRVJZX1dSQVBBTkRNSVAKICAgICAgICAgKi8KCiAgICAgICAgLyogQ2hlY2sgaWYgdGhlIHRleHR1cmUgZm9ybWF0IGlzIGFyb3VuZCAqLwogICAgICAgIGlmKENoZWNrVGV4dHVyZUNhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX0FVVE9HRU5NSVBNQVApIHsKICAgICAgICAgICAgICAgIC8qIENoZWNrIGZvciBhdXRvbWF0aWMgbWlwbWFwIGdlbmVyYXRpb24gc3VwcG9ydCAqLwogICAgICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChTR0lTX0dFTkVSQVRFX01JUE1BUCkpIHsKICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX0FVVE9HRU5NSVBNQVA7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qIFdoZW4gYXV0b2dlbm1pcG1hcCBpc24ndCBhcm91bmQgY29udGludWUgYW5kIHJldHVybiBXSU5FRDNET0tfTk9BVVRPR0VOIGluc3RlYWQgb2YgRDNEX09LICovCiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBhdXRvZ2VubWlwbWFwIHN1cHBvcnQsIGJ1dCBjb250aW51aW5nXG4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQWx3YXlzIHJlcG9ydCBkeW5hbWljIGxvY2tpbmcgKi8KICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfRFlOQU1JQykKICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfRFlOQU1JQzsKCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1JFTkRFUlRBUkdFVCkgewogICAgICAgICAgICAgICAgaWYoQ2hlY2tSZW5kZXJUYXJnZXRDYXBhYmlsaXR5KEFkYXB0ZXJGb3JtYXQsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUkVOREVSVEFSR0VUOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHJlbmRlcnRhcmdldCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQWx3YXlzIHJlcG9ydCBzb2Z0d2FyZSBwcm9jZXNzaW5nICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1NPRlRXQVJFUFJPQ0VTU0lORykKICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfU09GVFdBUkVQUk9DRVNTSU5HOwoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfRklMVEVSIHN1cHBvcnQgKi8KICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfRklMVEVSKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja0ZpbHRlckNhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9GSUxURVI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gcXVlcnkgZmlsdGVyIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfTEVHQUNZQlVNUE1BUCBzdXBwb3J0ICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX0xFR0FDWUJVTVBNQVApIHsKICAgICAgICAgICAgICAgIGlmKENoZWNrQnVtcE1hcENhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9MRUdBQ1lCVU1QTUFQOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGxlZ2FjeSBidW1wbWFwIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HIHN1cHBvcnQgKi8KICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja1Bvc3RQaXhlbFNoYWRlckJsZW5kaW5nQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX1FVRVJZX1BPU1RQSVhFTFNIQURFUl9CTEVORElORzsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSBwb3N0IHBpeGVsc2hhZGVyIGJsZW5kaW5nIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfU1JHQlJFQUQgc3VwcG9ydCAqLwogICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9TUkdCUkVBRCkgewogICAgICAgICAgICAgICAgaWYoQ2hlY2tTcmdiUmVhZENhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9TUkdCUkVBRDsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSBzcmdicmVhZCBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIENoZWNrIFFVRVJZX1NSR0JXUklURSBzdXBwb3J0ICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1NSR0JXUklURSkgewogICAgICAgICAgICAgICAgaWYoQ2hlY2tTcmdiV3JpdGVDYXBhYmlsaXR5KEFkYXB0ZXIsIERldmljZVR5cGUsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfU1JHQldSSVRFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHNyZ2J3cml0ZSBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIENoZWNrIFFVRVJZX1ZFUlRFWFRFWFRVUkUgc3VwcG9ydCAqLwogICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9WRVJURVhURVhUVVJFKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja1ZlcnRleFRleHR1cmVDYXBhYmlsaXR5KEFkYXB0ZXIsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfVkVSVEVYVEVYVFVSRTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSB2ZXJ0ZXh0ZXh0dXJlIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfV1JBUEFORE1JUCBzdXBwb3J0ICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1dSQVBBTkRNSVApIHsKICAgICAgICAgICAgICAgIGlmKENoZWNrV3JhcEFuZE1pcENhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9XUkFQQU5ETUlQOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHdyYXBwaW5nIGFuZCBtaXBtYXBwaW5nIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZihDaGVja0RlcHRoU3RlbmNpbENhcGFiaWxpdHkoQWRhcHRlciwgQWRhcHRlckZvcm1hdCwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX0RFUFRIU1RFTkNJTCkKICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfREVQVEhTVEVOQ0lMOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gVGV4dHVyZSBmb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICB9CiAgICB9IGVsc2UgaWYoKFJUeXBlID09IFdJTkVEM0RSVFlQRV9WT0xVTUUpIHx8IChSVHlwZSA9PSBXSU5FRDNEUlRZUEVfVk9MVU1FVEVYVFVSRSkpIHsKICAgICAgICAvKiBWb2x1bWUgaXMgdG8gVm9sdW1lVGV4dHVyZSB3aGF0IFN1cmZhY2UgaXMgdG8gVGV4dHVyZSBidXQgaXRzIHVzYWdlIGNhcHMgYXJlIG5vdCBkb2N1bWVudGVkLgogICAgICAgICAqIE1vc3QgZHJpdmVyIHNlZW0gdG8gb2ZmZXIgKG5lYXJseSkgdGhlIHNhbWUgb24gVm9sdW1lIGFuZCBWb2x1bWVUZXh0dXJlLCBzbyBkbyB0aGF0IHRvby4KICAgICAgICAgKgogICAgICAgICAqIFZvbHVtZXRleHR1cmUgYWxsb3dzOgogICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfRFlOQU1JQwogICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgIC0gRDNEVVNBR0VfTk9OU0VDVVJFIChkM2Q5ZXgpCiAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgLSBEM0RVU0FHRV9TT0ZUV0FSRVBST0NFU1NJTkcKICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAtIEQzRFVTQUdFX1FVRVJZX1dSQVBBTkRNSVAKICAgICAgICAgKi8KCiAgICAgICAgLyogQ2hlY2sgdm9sdW1lIHRleHR1cmUgYW5kIHZvbHVtZSB1c2FnZSBjYXBzICovCiAgICAgICAgaWYoR0xfU1VQUE9SVChFWFRfVEVYVFVSRTNEKSkgewogICAgICAgICAgICBpZihDaGVja1RleHR1cmVDYXBhYmlsaXR5KEFkYXB0ZXIsIENoZWNrRm9ybWF0KSA9PSBGQUxTRSkgewogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBGb3JtYXQgbm90IHN1cHBvcnRlZFxuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8qIEFsd2F5cyByZXBvcnQgZHluYW1pYyBsb2NraW5nICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX0RZTkFNSUMpCiAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX0RZTkFNSUM7CgogICAgICAgICAgICAvKiBBbHdheXMgcmVwb3J0IHNvZnR3YXJlIHByb2Nlc3NpbmcgKi8KICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfU09GVFdBUkVQUk9DRVNTSU5HKQogICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9TT0ZUV0FSRVBST0NFU1NJTkc7CgogICAgICAgICAgICAvKiBDaGVjayBRVUVSWV9GSUxURVIgc3VwcG9ydCAqLwogICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9GSUxURVIpIHsKICAgICAgICAgICAgICAgIGlmKENoZWNrRmlsdGVyQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX1FVRVJZX0ZJTFRFUjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyBxdWVyeSBmaWx0ZXIgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBDaGVjayBRVUVSWV9QT1NUUElYRUxTSEFERVJfQkxFTkRJTkcgc3VwcG9ydCAqLwogICAgICAgICAgICBpZihVc2FnZSAmIFdJTkVEM0RVU0FHRV9RVUVSWV9QT1NUUElYRUxTSEFERVJfQkxFTkRJTkcpIHsKICAgICAgICAgICAgICAgIGlmKENoZWNrUG9zdFBpeGVsU2hhZGVyQmxlbmRpbmdDYXBhYmlsaXR5KEFkYXB0ZXIsIENoZWNrRm9ybWF0KSkgewogICAgICAgICAgICAgICAgICAgIFVzYWdlQ2FwcyB8PSBXSU5FRDNEVVNBR0VfUVVFUllfUE9TVFBJWEVMU0hBREVSX0JMRU5ESU5HOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHBvc3QgcGl4ZWxzaGFkZXIgYmxlbmRpbmcgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBDaGVjayBRVUVSWV9TUkdCUkVBRCBzdXBwb3J0ICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1NSR0JSRUFEKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja1NyZ2JSZWFkQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX1FVRVJZX1NSR0JSRUFEOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHNyZ2JyZWFkIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfU1JHQldSSVRFIHN1cHBvcnQgKi8KICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfU1JHQldSSVRFKSB7CiAgICAgICAgICAgICAgICBpZihDaGVja1NyZ2JXcml0ZUNhcGFiaWxpdHkoQWRhcHRlciwgRGV2aWNlVHlwZSwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9TUkdCV1JJVEU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gcXVlcnkgc3JnYndyaXRlIHN1cHBvcnRcbiIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgLyogQ2hlY2sgUVVFUllfVkVSVEVYVEVYVFVSRSBzdXBwb3J0ICovCiAgICAgICAgICAgIGlmKFVzYWdlICYgV0lORUQzRFVTQUdFX1FVRVJZX1ZFUlRFWFRFWFRVUkUpIHsKICAgICAgICAgICAgICAgIGlmKENoZWNrVmVydGV4VGV4dHVyZUNhcGFiaWxpdHkoQWRhcHRlciwgQ2hlY2tGb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgVXNhZ2VDYXBzIHw9IFdJTkVEM0RVU0FHRV9RVUVSWV9WRVJURVhURVhUVVJFOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIHF1ZXJ5IHZlcnRleHRleHR1cmUgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvKiBDaGVjayBRVUVSWV9XUkFQQU5ETUlQIHN1cHBvcnQgKi8KICAgICAgICAgICAgaWYoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfUVVFUllfV1JBUEFORE1JUCkgewogICAgICAgICAgICAgICAgaWYoQ2hlY2tXcmFwQW5kTWlwQ2FwYWJpbGl0eShBZGFwdGVyLCBDaGVja0Zvcm1hdCkpIHsKICAgICAgICAgICAgICAgICAgICBVc2FnZUNhcHMgfD0gV0lORUQzRFVTQUdFX1FVRVJZX1dSQVBBTkRNSVA7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gd3JhcHBpbmcgYW5kIG1pcG1hcHBpbmcgc3VwcG9ydFxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBObyB2b2x1bWUgdGV4dHVyZSBzdXBwb3J0XG4iKTsKICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwogICAgICAgIH0KCiAgICAgICAgLyogRmlsdGVyIGZvcm1hdHMgdGhhdCBuZWVkIGNvbnZlcnNpb247IEZvciBvbmUgcGFydCwgdGhpcyBjb252ZXJzaW9uIGlzIHVuaW1wbGVtZW50ZWQsCiAgICAgICAgICogYW5kIHZvbHVtZSB0ZXh0dXJlcyBhcmUgaHVnZSwgc28gaXQgd291bGQgYmUgYSBiaWcgcGVyZm9ybWFuY2UgaGl0LiBVbmxlc3Mgd2UgaGl0IGFuCiAgICAgICAgICogYXBwIG5lZWRpbmcgb25lIG9mIHRob3NlIGZvcm1hdHMsIGRvbid0IGFkdmVydGl6ZSB0aGVtIHRvIGF2b2lkIGxlYWRpbmcgYXBwcyBpbnRvCiAgICAgICAgICogdGVtcHRhdGlvbi4gVGhlIHdpbmRvd3MgZHJpdmVycyBkb24ndCBzdXBwb3J0IG1vc3Qgb2YgdGhvc2UgZm9ybWF0cyBvbiB2b2x1bWVzIGFueXdheSwKICAgICAgICAgKiBleGNlcHQgb2YgUjMyRi4KICAgICAgICAgKi8KICAgICAgICBzd2l0Y2goQ2hlY2tGb3JtYXQpIHsKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX1A4OgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfQTRMNDoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX1IzMkY6CiAgICAgICAgICAgIGNhc2UgV0lORUQzREZNVF9SMTZGOgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfWDhMOFY4VTg6CiAgICAgICAgICAgIGNhc2UgV0lORUQzREZNVF9MNlY1VTU6CiAgICAgICAgICAgIGNhc2UgV0lORUQzREZNVF9HMTZSMTY6CiAgICAgICAgICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIE5vIGNvbnZlcnRlZCBmb3JtYXRzIG9uIHZvbHVtZXNcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX1E4VzhWOFU4OgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVjE2VTE2OgogICAgICAgICAgICBpZighR0xfU1VQUE9SVChOVl9URVhUVVJFX1NIQURFUikpIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gY29udmVydGVkIGZvcm1hdHMgb24gdm9sdW1lc1xuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfVjhVODoKICAgICAgICAgICAgaWYoIUdMX1NVUFBPUlQoTlZfVEVYVFVSRV9TSEFERVIpIHx8ICFHTF9TVVBQT1JUKEFUSV9FTlZNQVBfQlVNUE1BUCkpIHsKICAgICAgICAgICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdIC0gTm8gY29udmVydGVkIGZvcm1hdHMgb24gdm9sdW1lc1xuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUMToKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDI6CiAgICAgICAgICAgIGNhc2UgV0lORUQzREZNVF9EWFQzOgogICAgICAgICAgICBjYXNlIFdJTkVEM0RGTVRfRFhUNDoKICAgICAgICAgICAgY2FzZSBXSU5FRDNERk1UX0RYVDU6CiAgICAgICAgICAgICAgICAvKiBUaGUgR0xfRVhUX3RleHR1cmVfY29tcHJlc3Npb25fczN0YyBzcGVjIHJlcXVpcmVzIHRoYXQgbG9hZGluZyBhbiBzM3RjCiAgICAgICAgICAgICAgICAgKiBjb21wcmVzc2VkIHRleHR1cmUgcmVzdWx0cyBpbiBhbiBlcnJvci4gV2hpbGUgdGhlIEQzRCByZWZyYXN0IGRvZXMKICAgICAgICAgICAgICAgICAqIHN1cHBvcnQgczN0YyB2b2x1bWVzLCBhdCBsZWFzdCB0aGUgbnZpZGlhIHdpbmRvd3MgZHJpdmVyIGRvZXMgbm90LCBzbwogICAgICAgICAgICAgICAgICogd2UncmUgZnJlZSBub3QgdG8gc3VwcG9ydCB0aGlzIGZvcm1hdC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiW0ZBSUxFRF0gLSBEWFRuIGRvZXMgbm90IHN1cHBvcnQgM0QgdGV4dHVyZXNcbiIpOwogICAgICAgICAgICAgICAgcmV0dXJuIFdJTkVEM0RFUlJfTk9UQVZBSUxBQkxFOwoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIC8qIERvIG5vdGhpbmcsIGNvbnRpbnVlIHdpdGggY2hlY2tpbmcgdGhlIGZvcm1hdCBiZWxvdyAqLwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfSBlbHNlIGlmKChSVHlwZSA9PSBXSU5FRDNEUlRZUEVfSU5ERVhCVUZGRVIpIHx8IChSVHlwZSA9PSBXSU5FRDNEUlRZUEVfVkVSVEVYQlVGRkVSKSl7CiAgICAgICAgLyogRm9yIGluc3RhbmNlIHZlcnRleGJ1ZmZlci9pbmRleGJ1ZmZlciBhcmVuJ3Qgc3VwcG9ydGVkIHlldCBiZWNhdXNlIG5vIFdpbmRvd3MgZHJpdmVycyBzZWVtIHRvIG9mZmVyIGl0ICovCiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiVW5oYW5kbGVkIHJlc291cmNlIHR5cGUgRDNEUlRZUEVfSU5ERVhCVUZGRVIgLyBEM0RSVFlQRV9WRVJURVhCVUZGRVJcbiIpOwogICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgICB9CgogICAgLyogVGhpcyBmb3JtYXQgaXMgbm90aGluZyBzcGVjaWFsIGFuZCBpdCBpcyBzdXBwb3J0ZWQgcGVyZmVjdGx5LgogICAgICogSG93ZXZlciwgYXRpIGFuZCBudmlkaWEgZHJpdmVyIG9uIHdpbmRvd3MgZG8gbm90IG1hcmsgdGhpcyBmb3JtYXQgYXMKICAgICAqIHN1cHBvcnRlZCAodGVzdGVkIHdpdGggdGhlIGR4Q2Fwc1ZpZXdlcikgYW5kIHByZXRlbmRpbmcgdG8KICAgICAqIHN1cHBvcnQgdGhpcyBmb3JtYXQgdW5jb3ZlcnMgYSBidWcgaW4gQmF0dGxlZmllbGQgMTk0MiAoZm9udHMgYXJlIG1pc3NpbmcpCiAgICAgKiBTbyBkbyB0aGUgc2FtZSBhcyBXaW5kb3dzIGRyaXZlcnMgYW5kIHByZXRlbmQgbm90IHRvIHN1cHBvcnQgaXQgb24gZHg4IGFuZCA5CiAgICAgKiBFbmFibGUgaXQgb24gZHg3LiBJdCB3aWxsIG5lZWQgYWRkaXRpb25hbCBjaGVja2luZyBvbiBkeDEwIHdoZW4gd2Ugc3VwcG9ydCBpdC4KICAgICAqLwogICAgaWYoVGhpcy0+ZHhWZXJzaW9uID4gNyAmJiBDaGVja0Zvcm1hdCA9PSBXSU5FRDNERk1UX1I4RzhCOCkgewogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIltGQUlMRURdXG4iKTsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9OT1RBVkFJTEFCTEU7CiAgICB9CgogICAgLyogV2hlbiB0aGUgVXNhZ2VDYXBzIGV4YWN0bHkgbWF0Y2hlcyBVc2FnZSByZXR1cm4gV0lORUQzRF9PSyBleGNlcHQgZm9yIHRoZSBzaXR1YXRpb24gaW4gd2hpY2gKICAgICAqIFdJTkVEM0RVU0FHRV9BVVRPR0VOTUlQTUFQIGlzbid0IGFyb3VuZCwgdGhlbiBXSU5FRDNET0tfTk9BVVRPR0VOIGlzIHJldHVybmVkIGlmIGFsbCB0aGUgb3RoZXIKICAgICAqIHVzYWdlIGZsYWdzIG1hdGNoLiAqLwogICAgaWYoVXNhZ2VDYXBzID09IFVzYWdlKSB7CiAgICAgICAgcmV0dXJuIFdJTkVEM0RfT0s7CiAgICB9IGVsc2UgaWYoKFVzYWdlQ2FwcyA9PSAoVXNhZ2UgJiB+V0lORUQzRFVTQUdFX0FVVE9HRU5NSVBNQVApKSAmJiAoVXNhZ2UgJiBXSU5FRDNEVVNBR0VfQVVUT0dFTk1JUE1BUCkpewogICAgICAgIHJldHVybiBXSU5FRDNET0tfTk9BVVRPR0VOOwogICAgfSBlbHNlIHsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJbRkFJTEVEXSAtIFVzYWdlPSUjMDh4IHJlcXVlc3RlZCBmb3IgQ2hlY2tGb3JtYXQ9JXMgYW5kIFJUeXBlPSVkIGJ1dCBvbmx5ICUjMDh4IGlzIGF2YWlsYWJsZVxuIiwgVXNhZ2UsIGRlYnVnX2QzZGZvcm1hdChDaGVja0Zvcm1hdCksIFJUeXBlLCBVc2FnZUNhcHMpOwogICAgICAgIHJldHVybiBXSU5FRDNERVJSX05PVEFWQUlMQUJMRTsKICAgIH0KfQoKc3RhdGljIEhSRVNVTFQgIFdJTkFQSSBJV2luZUQzREltcGxfQ2hlY2tEZXZpY2VGb3JtYXRDb252ZXJzaW9uKElXaW5lRDNEICppZmFjZSwgVUlOVCBBZGFwdGVyLCBXSU5FRDNEREVWVFlQRSBEZXZpY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzREZPUk1BVCBTb3VyY2VGb3JtYXQsIFdJTkVEM0RGT1JNQVQgVGFyZ2V0Rm9ybWF0KSB7CiAgICBJV2luZUQzREltcGwgKlRoaXMgPSAoSVdpbmVEM0RJbXBsICopaWZhY2U7CgogICAgRklYTUVfKGQzZF9jYXBzKSgiKCVwKS0+IChTVFVCKSAoQWRwdHI6JWQsIERldlR5cGU6KCV1LCVzKSwgU3JjRm10OigldSwlcyksIFRndEZtdDooJXUsJXMpKVxuIiwKICAgICAgICAgIFRoaXMsCiAgICAgICAgICBBZGFwdGVyLAogICAgICAgICAgRGV2aWNlVHlwZSwgZGVidWdfZDNkZGV2aWNldHlwZShEZXZpY2VUeXBlKSwKICAgICAgICAgIFNvdXJjZUZvcm1hdCwgZGVidWdfZDNkZm9ybWF0KFNvdXJjZUZvcm1hdCksCiAgICAgICAgICBUYXJnZXRGb3JtYXQsIGRlYnVnX2QzZGZvcm1hdChUYXJnZXRGb3JtYXQpKTsKICAgIHJldHVybiBXSU5FRDNEX09LOwp9CgpzdGF0aWMgY29uc3Qgc2hhZGVyX2JhY2tlbmRfdCAqc2VsZWN0X3NoYWRlcl9iYWNrZW5kKFVJTlQgQWRhcHRlciwgV0lORUQzRERFVlRZUEUgRGV2aWNlVHlwZSkgewogICAgY29uc3Qgc2hhZGVyX2JhY2tlbmRfdCAqcmV0OwogICAgaW50IHZzX3NlbGVjdGVkX21vZGU7CiAgICBpbnQgcHNfc2VsZWN0ZWRfbW9kZTsKCiAgICBzZWxlY3Rfc2hhZGVyX21vZGUoJkdMSU5GT19MT0NBVElPTiwgRGV2aWNlVHlwZSwgJnBzX3NlbGVjdGVkX21vZGUsICZ2c19zZWxlY3RlZF9tb2RlKTsKICAgIGlmICh2c19zZWxlY3RlZF9tb2RlID09IFNIQURFUl9HTFNMIHx8IHBzX3NlbGVjdGVkX21vZGUgPT0gU0hBREVSX0dMU0wpIHsKICAgICAgICByZXQgPSAmZ2xzbF9zaGFkZXJfYmFja2VuZDsKICAgIH0gZWxzZSBpZiAodnNfc2VsZWN0ZWRfbW9kZSA9PSBTSEFERVJfQVJCICYmIHBzX3NlbGVjdGVkX21vZGUgIT0gU0hBREVSX05PTkUgJiYKICAgICAgICAgICAgICAhR0xfU1VQUE9SVChBUkJfRlJBR01FTlRfUFJPR1JBTSkpIHsKICAgICAgICByZXQgPSAmYXRpZnNfc2hhZGVyX2JhY2tlbmQ7CiAgICB9IGVsc2UgaWYgKHZzX3NlbGVjdGVkX21vZGUgPT0gU0hBREVSX0FSQiB8fCBwc19zZWxlY3RlZF9tb2RlID09IFNIQURFUl9BUkIpIHsKICAgICAgICByZXQgPSAmYXJiX3Byb2dyYW1fc2hhZGVyX2JhY2tlbmQ7CiAgICB9IGVsc2UgewogICAgICAgIHJldCA9ICZub25lX3NoYWRlcl9iYWNrZW5kOwogICAgfQogICAgcmV0dXJuIHJldDsKfQoKLyogTm90ZTogZDNkOCBwYXNzZXMgaW4gYSBwb2ludGVyIHRvIGEgRDNEQ0FQUzggc3RydWN0dXJlLCB3aGljaCBpcyBhIHRydWUKICAgICAgc3Vic2V0IG9mIGEgRDNEQ0FQUzkgc3RydWN0dXJlLiBIb3dldmVyLCBpdCBoYXMgdG8gY29tZSB2aWEgYSB2b2lkICoKICAgICAgYXMgdGhlIGQzZDggaW50ZXJmYWNlIGNhbm5vdCBpbXBvcnQgdGhlIGQzZDkgaGVhZGVyICAgICAgICAgICAgICAgICAgKi8Kc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNESW1wbF9HZXREZXZpY2VDYXBzKElXaW5lRDNEICppZmFjZSwgVUlOVCBBZGFwdGVyLCBXSU5FRDNEREVWVFlQRSBEZXZpY2VUeXBlLCBXSU5FRDNEQ0FQUyogcENhcHMpIHsKCiAgICBJV2luZUQzREltcGwgICAgKlRoaXMgPSAoSVdpbmVEM0RJbXBsICopaWZhY2U7CiAgICBpbnQgdnNfc2VsZWN0ZWRfbW9kZTsKICAgIGludCBwc19zZWxlY3RlZF9tb2RlOwogICAgc3RydWN0IHNoYWRlcl9jYXBzIHNoYWRlcl9jYXBzOwogICAgY29uc3Qgc2hhZGVyX2JhY2tlbmRfdCAqc2hhZGVyX2JhY2tlbmQ7CgogICAgVFJBQ0VfKGQzZF9jYXBzKSgiKCVwKS0+KEFkcHRyOiVkLCBEZXZUeXBlOiAleCwgcENhcHM6ICVwKVxuIiwgVGhpcywgQWRhcHRlciwgRGV2aWNlVHlwZSwgcENhcHMpOwoKICAgIGlmIChBZGFwdGVyID49IElXaW5lRDNEX0dldEFkYXB0ZXJDb3VudChpZmFjZSkpIHsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9JTlZBTElEQ0FMTDsKICAgIH0KCiAgICBzZWxlY3Rfc2hhZGVyX21vZGUoJkFkYXB0ZXJzW0FkYXB0ZXJdLmdsX2luZm8sIERldmljZVR5cGUsICZwc19zZWxlY3RlZF9tb2RlLCAmdnNfc2VsZWN0ZWRfbW9kZSk7CgogICAgLyogVGhpcyBmdW5jdGlvbiBzaG91bGQgKm5vdCogYmUgbW9kaWZ5aW5nIEdMIGNhcHMKICAgICAqIFRPRE86IG1vdmUgdGhlIGZ1bmN0aW9uYWxpdHkgd2hlcmUgaXQgYmVsb25ncyAqLwogICAgc2VsZWN0X3NoYWRlcl9tYXhfY29uc3RhbnRzKHBzX3NlbGVjdGVkX21vZGUsIHZzX3NlbGVjdGVkX21vZGUsICZBZGFwdGVyc1tBZGFwdGVyXS5nbF9pbmZvKTsKCiAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgIFRoZSBmb2xsb3dpbmcgZmllbGRzIGFwcGx5IHRvIGJvdGggZDNkOCBhbmQgZDNkOQogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCiAgICBwQ2Fwcy0+RGV2aWNlVHlwZSAgICAgICAgICAgICAgPSAoRGV2aWNlVHlwZSA9PSBXSU5FRDNEREVWVFlQRV9IQUwpID8gV0lORUQzRERFVlRZUEVfSEFMIDogV0lORUQzRERFVlRZUEVfUkVGOyAgLyogTm90IHF1aXRlIHRydWUsIGJ1dCB1c2UgaC93IHN1cHBvcnRlZCBieSBvcGVuZ2wgSSBzdXBwb3NlICovCiAgICBwQ2Fwcy0+QWRhcHRlck9yZGluYWwgICAgICAgICAgPSBBZGFwdGVyOwoKICAgIHBDYXBzLT5DYXBzICAgICAgICAgICAgICAgICAgICA9IDA7CiAgICBwQ2Fwcy0+Q2FwczIgICAgICAgICAgICAgICAgICAgPSBXSU5FRDNEQ0FQUzJfQ0FOUkVOREVSV0lORE9XRUQgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRENBUFMyX0ZVTExTQ1JFRU5HQU1NQSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEQ0FQUzJfRFlOQU1JQ1RFWFRVUkVTOwogICAgaWYoR0xfU1VQUE9SVChTR0lTX0dFTkVSQVRFX01JUE1BUCkpIHsKICAgICAgICBwQ2Fwcy0+Q2FwczIgfD0gV0lORUQzRENBUFMyX0NBTkFVVE9HRU5NSVBNQVA7CiAgICB9CiAgICBwQ2Fwcy0+Q2FwczMgICAgICAgICAgICAgICAgICAgPSBXSU5FRDNEQ0FQUzNfQUxQSEFfRlVMTFNDUkVFTl9GTElQX09SX0RJU0NBUkQ7CiAgICBwQ2Fwcy0+UHJlc2VudGF0aW9uSW50ZXJ2YWxzICAgPSBXSU5FRDNEUFJFU0VOVF9JTlRFUlZBTF9JTU1FRElBVEUgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQUkVTRU5UX0lOVEVSVkFMX09ORTsKCiAgICBwQ2Fwcy0+Q3Vyc29yQ2FwcyAgICAgICAgICAgICAgPSBXSU5FRDNEQ1VSU09SQ0FQU19DT0xPUiAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RDVVJTT1JDQVBTX0xPV1JFUzsKCiAgICBwQ2Fwcy0+RGV2Q2FwcyAgICAgICAgICAgICAgICAgPSBXSU5FRDNEREVWQ0FQU19GTE9BVFRMVkVSVEVYICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RERVZDQVBTX0VYRUNVVEVTWVNURU1NRU1PUlkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERFVkNBUFNfVExWRVJURVhTWVNURU1NRU1PUll8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEREVWQ0FQU19UTFZFUlRFWFZJREVPTUVNT1JZIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RERVZDQVBTX0RSQVdQUklNVExWRVJURVggICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERFVkNBUFNfSFdUUkFOU0ZPUk1BTkRMSUdIVCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEREVWQ0FQU19FWEVDVVRFVklERU9NRU1PUlkgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RERVZDQVBTX1BVUkVERVZJQ0UgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERFVkNBUFNfSFdSQVNURVJJWkFUSU9OICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEREVWQ0FQU19URVhUVVJFVklERU9NRU1PUlkgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RERVZDQVBTX1RFWFRVUkVTWVNURU1NRU1PUlkgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERFVkNBUFNfQ0FOUkVOREVSQUZURVJGTElQICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEREVWQ0FQU19EUkFXUFJJTUlUSVZFUzIgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RERVZDQVBTX0RSQVdQUklNSVRJVkVTMkVYICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERFVkNBUFNfUlRQQVRDSEVTOwoKICAgIHBDYXBzLT5QcmltaXRpdmVNaXNjQ2FwcyAgICAgICA9IFdJTkVEM0RQTUlTQ0NBUFNfQ1VMTE5PTkUgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQTUlTQ0NBUFNfQ1VMTENDVyAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQTUlTQ0NBUFNfQ1VMTENXICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQTUlTQ0NBUFNfQ09MT1JXUklURUVOQUJMRSAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQTUlTQ0NBUFNfQ0xJUFRMVkVSVFMgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQTUlTQ0NBUFNfQ0xJUFBMQU5FU0NBTEVEUE9JTlRTIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQTUlTQ0NBUFNfTUFTS1ogICAgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQTUlTQ0NBUFNfQkxFTkRPUDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVE9ETzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQTUlTQ0NBUFNfTlVMTFJFRkVSRU5DRQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBNSVNDQ0FQU19JTkRFUEVOREVOVFdSSVRFTUFTS1MKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQTUlTQ0NBUFNfRk9HQU5EU1BFQ1VMQVJBTFBIQQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBNSVNDQ0FQU19NUlRJTkRFUEVOREVOVEJJVERFUFRIUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBNSVNDQ0FQU19NUlRQT1NUUElYRUxTSEFERVJCTEVORElORwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBNSVNDQ0FQU19GT0dWRVJURVhDTEFNUEVEICovCgogICAgaWYoR0xfU1VQUE9SVChFWFRfQkxFTkRfRVFVQVRJT05fU0VQQVJBVEUpICYmIEdMX1NVUFBPUlQoRVhUX0JMRU5EX0ZVTkNfU0VQQVJBVEUpKQogICAgICAgIHBDYXBzLT5QcmltaXRpdmVNaXNjQ2FwcyB8PSBXSU5FRDNEUE1JU0NDQVBTX1NFUEFSQVRFQUxQSEFCTEVORDsKCiAgICBwQ2Fwcy0+UmFzdGVyQ2FwcyAgICAgICAgICAgICAgPSBXSU5FRDNEUFJBU1RFUkNBUFNfRElUSEVSICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQUkFTVEVSQ0FQU19QQVQgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBSQVNURVJDQVBTX1dGT0cgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFJBU1RFUkNBUFNfWkZPRyAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQUkFTVEVSQ0FQU19GT0dWRVJURVggfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBSQVNURVJDQVBTX0ZPR1RBQkxFICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFJBU1RFUkNBUFNfU1RJUFBMRSAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQUkFTVEVSQ0FQU19TVUJQSVhFTCAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBSQVNURVJDQVBTX1pURVNUICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFJBU1RFUkNBUFNfU0NJU1NPUlRFU1QgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFJBU1RFUkNBUFNfU0xPUEVTQ0FMRURFUFRIQklBUyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFJBU1RFUkNBUFNfREVQVEhCSUFTOwoKICAgIGlmIChHTF9TVVBQT1JUKEVYVF9URVhUVVJFX0ZJTFRFUl9BTklTT1RST1BJQykpIHsKICAgICAgICBwQ2Fwcy0+UmFzdGVyQ2FwcyB8PSBXSU5FRDNEUFJBU1RFUkNBUFNfQU5JU09UUk9QWSAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBSQVNURVJDQVBTX1pCSUFTICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQUkFTVEVSQ0FQU19NSVBNQVBMT0RCSUFTOwogICAgfQogICAgaWYoR0xfU1VQUE9SVChOVl9GT0dfRElTVEFOQ0UpKSB7CiAgICAgICAgcENhcHMtPlJhc3RlckNhcHMgICAgICAgICB8PSBXSU5FRDNEUFJBU1RFUkNBUFNfRk9HUkFOR0U7CiAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FIEFkZDoKCQkJICAgV0lORUQzRFBSQVNURVJDQVBTX0NPTE9SUEVSU1BFQ1RJVkUKCQkJICAgV0lORUQzRFBSQVNURVJDQVBTX1NUUkVUQ0hCTFRNVUxUSVNBTVBMRQoJCQkgICBXSU5FRDNEUFJBU1RFUkNBUFNfQU5USUFMSUFTRURHRVMKCQkJICAgV0lORUQzRFBSQVNURVJDQVBTX1pCVUZGRVJMRVNTSFNSCgkJCSAgIFdJTkVEM0RQUkFTVEVSQ0FQU19XQlVGRkVSICovCgogICAgcENhcHMtPlpDbXBDYXBzID0gV0lORUQzRFBDTVBDQVBTX0FMV0FZUyAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfRVFVQUwgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19HUkVBVEVSICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBDTVBDQVBTX0dSRUFURVJFUVVBTCB8CiAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfTEVTUyAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQQ01QQ0FQU19MRVNTRVFVQUwgICAgfAogICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBDTVBDQVBTX05FVkVSICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfTk9URVFVQUw7CgogICAgcENhcHMtPlNyY0JsZW5kQ2FwcyAgPSBXSU5FRDNEUEJMRU5EQ0FQU19CT1RISU5WU1JDQUxQSEEgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19CT1RIU1JDQUxQSEEgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19ERVNUQUxQSEEgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19JTlZERVNUQUxQSEEgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19JTlZERVNUQ09MT1IgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19JTlZTUkNBTFBIQSAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19JTlZTUkNDT0xPUiAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19PTkUgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19TUkNBTFBIQSAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19TUkNBTFBIQVNBVCAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19TUkNDT0xPUiAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUEJMRU5EQ0FQU19aRVJPOwoKICAgIHBDYXBzLT5EZXN0QmxlbmRDYXBzID0gV0lORUQzRFBCTEVORENBUFNfREVTVEFMUEhBICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBCTEVORENBUFNfREVTVENPTE9SICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBCTEVORENBUFNfSU5WREVTVEFMUEhBICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBCTEVORENBUFNfSU5WREVTVENPTE9SICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBCTEVORENBUFNfSU5WU1JDQUxQSEEgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBCTEVORENBUFNfSU5WU1JDQ09MT1IgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBCTEVORENBUFNfT05FICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBCTEVORENBUFNfU1JDQUxQSEEgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBCTEVORENBUFNfU1JDQ09MT1IgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBCTEVORENBUFNfWkVSTzsKICAgIC8qIE5PVEU6IFdJTkVEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBU0FUIGlzIG5vdCBzdXBwb3J0ZWQgYXMgZGVzdCBibGVuZCBmYWN0b3IsCiAgICAgKiBhY2NvcmRpbmcgdG8gdGhlIGdsQmxlbmRGdW5jIG1hbnBhZ2UKICAgICAqCiAgICAgKiBXSU5FRDNEUEJMRU5EQ0FQU19CT1RISU5WU1JDQUxQSEEgYW5kIFdJTkVEM0RQQkxFTkRDQVBTX0JPVEhTUkNBTFBIQSBhcmUKICAgICAqIGxlZ2FjeSBzZXR0aW5ncyBmb3Igc3JjYmxlbmQgb25seQogICAgICovCgogICAgaWYoIEdMX1NVUFBPUlQoRVhUX0JMRU5EX0NPTE9SKSkgewogICAgICAgIHBDYXBzLT5TcmNCbGVuZENhcHMgfD0gV0lORUQzRFBCTEVORENBUFNfQkxFTkRGQUNUT1I7CiAgICAgICAgcENhcHMtPkRlc3RCbGVuZENhcHMgfD0gV0lORUQzRFBCTEVORENBUFNfQkxFTkRGQUNUT1I7CiAgICB9CgoKICAgIHBDYXBzLT5BbHBoYUNtcENhcHMgPSBXSU5FRDNEUENNUENBUFNfQUxXQVlTICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfRVFVQUwgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfR1JFQVRFUiAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfR1JFQVRFUkVRVUFMIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfTEVTUyAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfTEVTU0VRVUFMICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfTkVWRVIgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUENNUENBUFNfTk9URVFVQUw7CgogICAgcENhcHMtPlNoYWRlQ2FwcyAgICAgPSBXSU5FRDNEUFNIQURFQ0FQU19TUEVDVUxBUkdPVVJBVURSR0IgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFNIQURFQ0FQU19DT0xPUkdPVVJBVURSR0IgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFNIQURFQ0FQU19BTFBIQUZMQVRCTEVORCAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFNIQURFQ0FQU19BTFBIQUdPVVJBVURCTEVORCAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFNIQURFQ0FQU19DT0xPUkZMQVRSR0IgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFNIQURFQ0FQU19GT0dGTEFUICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFNIQURFQ0FQU19GT0dHT1VSQVVEICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFNIQURFQ0FQU19TUEVDVUxBUkZMQVRSR0I7CgogICAgcENhcHMtPlRleHR1cmVDYXBzID0gIFdJTkVEM0RQVEVYVFVSRUNBUFNfQUxQSEEgICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRFWFRVUkVDQVBTX0FMUEhBUEFMRVRURSAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURVhUVVJFQ0FQU19CT1JERVIgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEVYVFVSRUNBUFNfTUlQTUFQICAgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRFWFRVUkVDQVBTX1BST0pFQ1RFRCAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRTsKCiAgICBpZiggIUdMX1NVUFBPUlQoQVJCX1RFWFRVUkVfTk9OX1BPV0VSX09GX1RXTykpIHsKICAgICAgICBwQ2Fwcy0+VGV4dHVyZUNhcHMgfD0gV0lORUQzRFBURVhUVVJFQ0FQU19QT1cyIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURVhUVVJFQ0FQU19OT05QT1cyQ09ORElUSU9OQUw7CiAgICB9CgogICAgaWYoIEdMX1NVUFBPUlQoRVhUX1RFWFRVUkUzRCkpIHsKICAgICAgICBwQ2Fwcy0+VGV4dHVyZUNhcHMgfD0gIFdJTkVEM0RQVEVYVFVSRUNBUFNfVk9MVU1FTUFQICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURVhUVVJFQ0FQU19NSVBWT0xVTUVNQVAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRFWFRVUkVDQVBTX1ZPTFVNRU1BUF9QT1cyOwogICAgfQoKICAgIGlmIChHTF9TVVBQT1JUKEFSQl9URVhUVVJFX0NVQkVfTUFQKSkgewogICAgICAgIHBDYXBzLT5UZXh0dXJlQ2FwcyB8PSBXSU5FRDNEUFRFWFRVUkVDQVBTX0NVQkVNQVAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURVhUVVJFQ0FQU19NSVBDVUJFTUFQICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURVhUVVJFQ0FQU19DVUJFTUFQX1BPVzI7CgogICAgfQoKICAgIHBDYXBzLT5UZXh0dXJlRmlsdGVyQ2FwcyA9IFdJTkVEM0RQVEZJTFRFUkNBUFNfTUFHRkxJTkVBUiAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUlORlBPSU5UICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVIgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTElORUFSICAgICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX0xJTkVBUk1JUExJTkVBUiAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19MSU5FQVJNSVBORUFSRVNUIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUlQTElORUFSICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JUE5FQVJFU1QgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19ORUFSRVNUOwoKICAgIGlmIChHTF9TVVBQT1JUKEVYVF9URVhUVVJFX0ZJTFRFUl9BTklTT1RST1BJQykpIHsKICAgICAgICBwQ2Fwcy0+VGV4dHVyZUZpbHRlckNhcHMgfD0gV0lORUQzRFBURklMVEVSQ0FQU19NQUdGQU5JU09UUk9QSUMgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQzsKICAgIH0KCiAgICBpZiAoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9DVUJFX01BUCkpIHsKICAgICAgICBwQ2Fwcy0+Q3ViZVRleHR1cmVGaWx0ZXJDYXBzID0gV0lORUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSVBGTElORUFSICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19MSU5FQVIgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19MSU5FQVJNSVBMSU5FQVIgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19MSU5FQVJNSVBORUFSRVNUIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSVBMSU5FQVIgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSVBORUFSRVNUICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19ORUFSRVNUOwoKICAgICAgICBpZiAoR0xfU1VQUE9SVChFWFRfVEVYVFVSRV9GSUxURVJfQU5JU09UUk9QSUMpKSB7CiAgICAgICAgICAgIHBDYXBzLT5DdWJlVGV4dHVyZUZpbHRlckNhcHMgfD0gV0lORUQzRFBURklMVEVSQ0FQU19NQUdGQU5JU09UUk9QSUMgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDOwogICAgICAgIH0KICAgIH0gZWxzZQogICAgICAgIHBDYXBzLT5DdWJlVGV4dHVyZUZpbHRlckNhcHMgPSAwOwoKICAgIGlmIChHTF9TVVBQT1JUKEVYVF9URVhUVVJFM0QpKSB7CiAgICAgICAgcENhcHMtPlZvbHVtZVRleHR1cmVGaWx0ZXJDYXBzID0gV0lORUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVIgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTUlQRlBPSU5UICAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19MSU5FQVIgICAgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX0xJTkVBUk1JUExJTkVBUiAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTElORUFSTUlQTkVBUkVTVCB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSVBMSU5FQVIgICAgICAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEUFRGSUxURVJDQVBTX01JUE5FQVJFU1QgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEZJTFRFUkNBUFNfTkVBUkVTVDsKICAgIH0gZWxzZQogICAgICAgIHBDYXBzLT5Wb2x1bWVUZXh0dXJlRmlsdGVyQ2FwcyA9IDA7CgogICAgcENhcHMtPlRleHR1cmVBZGRyZXNzQ2FwcyA9ICBXSU5FRDNEUFRBRERSRVNTQ0FQU19JTkRFUEVOREVOVFVWIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBUQUREUkVTU0NBUFNfQ0xBTVAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBUQUREUkVTU0NBUFNfV1JBUDsKCiAgICBpZiAoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9CT1JERVJfQ0xBTVApKSB7CiAgICAgICAgcENhcHMtPlRleHR1cmVBZGRyZXNzQ2FwcyB8PSBXSU5FRDNEUFRBRERSRVNTQ0FQU19CT1JERVI7CiAgICB9CiAgICBpZiAoR0xfU1VQUE9SVChBUkJfVEVYVFVSRV9NSVJST1JFRF9SRVBFQVQpKSB7CiAgICAgICAgcENhcHMtPlRleHR1cmVBZGRyZXNzQ2FwcyB8PSBXSU5FRDNEUFRBRERSRVNTQ0FQU19NSVJST1I7CiAgICB9CiAgICBpZiAoR0xfU1VQUE9SVChBVElfVEVYVFVSRV9NSVJST1JfT05DRSkpIHsKICAgICAgICBwQ2Fwcy0+VGV4dHVyZUFkZHJlc3NDYXBzIHw9IFdJTkVEM0RQVEFERFJFU1NDQVBTX01JUlJPUk9OQ0U7CiAgICB9CgogICAgaWYgKEdMX1NVUFBPUlQoRVhUX1RFWFRVUkUzRCkpIHsKICAgICAgICBwQ2Fwcy0+Vm9sdW1lVGV4dHVyZUFkZHJlc3NDYXBzID0gIFdJTkVEM0RQVEFERFJFU1NDQVBTX0lOREVQRU5ERU5UVVYgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBUQUREUkVTU0NBUFNfQ0xBTVAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RQVEFERFJFU1NDQVBTX1dSQVA7CiAgICAgICAgaWYgKEdMX1NVUFBPUlQoQVJCX1RFWFRVUkVfQk9SREVSX0NMQU1QKSkgewogICAgICAgICAgICBwQ2Fwcy0+Vm9sdW1lVGV4dHVyZUFkZHJlc3NDYXBzIHw9IFdJTkVEM0RQVEFERFJFU1NDQVBTX0JPUkRFUjsKICAgICAgICB9CiAgICAgICAgaWYgKEdMX1NVUFBPUlQoQVJCX1RFWFRVUkVfTUlSUk9SRURfUkVQRUFUKSkgewogICAgICAgICAgICBwQ2Fwcy0+Vm9sdW1lVGV4dHVyZUFkZHJlc3NDYXBzIHw9IFdJTkVEM0RQVEFERFJFU1NDQVBTX01JUlJPUjsKICAgICAgICB9CiAgICAgICAgaWYgKEdMX1NVUFBPUlQoQVRJX1RFWFRVUkVfTUlSUk9SX09OQ0UpKSB7CiAgICAgICAgICAgIHBDYXBzLT5Wb2x1bWVUZXh0dXJlQWRkcmVzc0NhcHMgfD0gV0lORUQzRFBUQUREUkVTU0NBUFNfTUlSUk9ST05DRTsKICAgICAgICB9CiAgICB9IGVsc2UKICAgICAgICBwQ2Fwcy0+Vm9sdW1lVGV4dHVyZUFkZHJlc3NDYXBzID0gMDsKCiAgICBwQ2Fwcy0+TGluZUNhcHMgPSBXSU5FRDNETElORUNBUFNfVEVYVFVSRSB8CiAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNETElORUNBUFNfWlRFU1Q7CiAgICAgICAgICAgICAgICAgICAgICAvKiBGSVhNRTogQWRkCiAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RMSU5FQ0FQU19CTEVORAogICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNETElORUNBUFNfQUxQSEFDTVAKICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRExJTkVDQVBTX0ZPRyAqLwoKICAgIHBDYXBzLT5NYXhUZXh0dXJlV2lkdGggID0gR0xfTElNSVRTKHRleHR1cmVfc2l6ZSk7CiAgICBwQ2Fwcy0+TWF4VGV4dHVyZUhlaWdodCA9IEdMX0xJTUlUUyh0ZXh0dXJlX3NpemUpOwoKICAgIGlmKEdMX1NVUFBPUlQoRVhUX1RFWFRVUkUzRCkpCiAgICAgICAgcENhcHMtPk1heFZvbHVtZUV4dGVudCA9IEdMX0xJTUlUUyh0ZXh0dXJlM2Rfc2l6ZSk7CiAgICBlbHNlCiAgICAgICAgcENhcHMtPk1heFZvbHVtZUV4dGVudCA9IDA7CgogICAgcENhcHMtPk1heFRleHR1cmVSZXBlYXQgPSAzMjc2ODsKICAgIHBDYXBzLT5NYXhUZXh0dXJlQXNwZWN0UmF0aW8gPSBHTF9MSU1JVFModGV4dHVyZV9zaXplKTsKICAgIHBDYXBzLT5NYXhWZXJ0ZXhXID0gMS4wOwoKICAgIHBDYXBzLT5HdWFyZEJhbmRMZWZ0ID0gMDsKICAgIHBDYXBzLT5HdWFyZEJhbmRUb3AgPSAwOwogICAgcENhcHMtPkd1YXJkQmFuZFJpZ2h0ID0gMDsKICAgIHBDYXBzLT5HdWFyZEJhbmRCb3R0b20gPSAwOwoKICAgIHBDYXBzLT5FeHRlbnRzQWRqdXN0ID0gMDsKCiAgICBwQ2Fwcy0+U3RlbmNpbENhcHMgPSAgV0lORUQzRFNURU5DSUxDQVBTX0RFQ1JTQVQgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RTVEVOQ0lMQ0FQU19JTkNSU0FUIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEU1RFTkNJTENBUFNfSU5WRVJUICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFNURU5DSUxDQVBTX0tFRVAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RTVEVOQ0lMQ0FQU19SRVBMQUNFIHwKICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEU1RFTkNJTENBUFNfWkVSTzsKICAgIGlmIChHTF9TVVBQT1JUKEVYVF9TVEVOQ0lMX1dSQVApKSB7CiAgICAgICAgcENhcHMtPlN0ZW5jaWxDYXBzIHw9IFdJTkVEM0RTVEVOQ0lMQ0FQU19ERUNSICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RTVEVOQ0lMQ0FQU19JTkNSOwogICAgfQogICAgaWYgKCBUaGlzLT5keFZlcnNpb24gPiA4ICYmCiAgICAgICAgKCBHTF9TVVBQT1JUKEVYVF9TVEVOQ0lMX1RXT19TSURFKSB8fAogICAgICAgICAgICBHTF9TVVBQT1JUKEFUSV9TRVBBUkFURV9TVEVOQ0lMKSApICkgewogICAgICAgIHBDYXBzLT5TdGVuY2lsQ2FwcyB8PSBXSU5FRDNEU1RFTkNJTENBUFNfVFdPU0lERUQ7CiAgICB9CgogICAgcENhcHMtPkZWRkNhcHMgPSBXSU5FRDNERlZGQ0FQU19QU0laRSB8IDB4MDAwODsgLyogOCB0ZXh0dXJlIGNvb3JkcyAqLwoKICAgIHBDYXBzLT5NYXhVc2VyQ2xpcFBsYW5lcyAgICAgICA9IEdMX0xJTUlUUyhjbGlwcGxhbmVzKTsKICAgIHBDYXBzLT5NYXhBY3RpdmVMaWdodHMgICAgICAgICA9IEdMX0xJTUlUUyhsaWdodHMpOwoKICAgIHBDYXBzLT5NYXhWZXJ0ZXhCbGVuZE1hdHJpY2VzICAgICAgPSBHTF9MSU1JVFMoYmxlbmRzKTsKICAgIHBDYXBzLT5NYXhWZXJ0ZXhCbGVuZE1hdHJpeEluZGV4ICAgPSAwOwoKICAgIHBDYXBzLT5NYXhBbmlzb3Ryb3B5ICAgPSBHTF9MSU1JVFMoYW5pc290cm9weSk7CiAgICBwQ2Fwcy0+TWF4UG9pbnRTaXplICAgID0gR0xfTElNSVRTKHBvaW50c2l6ZSk7CgoKICAgIHBDYXBzLT5WZXJ0ZXhQcm9jZXNzaW5nQ2FwcyA9IFdJTkVEM0RWVFhQQ0FQU19ESVJFQ1RJT05BTExJR0hUUyB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVlRYUENBUFNfTUFURVJJQUxTT1VSQ0U3ICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFZUWFBDQVBTX1BPU0lUSU9OQUxMSUdIVFMgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0RWVFhQQ0FQU19MT0NBTFZJRVdFUiAgICAgICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNEVlRYUENBUFNfVkVSVEVYRk9HICAgICAgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFZUWFBDQVBTX1RFWEdFTjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZJWE1FOiBBZGQgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEM0RWVFhQQ0FQU19UV0VFTklORywgRDNEVlRYUENBUFNfVEVYR0VOX1NQSEVSRU1BUCAqLwoKICAgIHBDYXBzLT5NYXhQcmltaXRpdmVDb3VudCAgID0gMHhGRkZGRjsgLyogRm9yIG5vdyBzZXQgMl4yMC0xIHdoaWNoIGlzIHVzZWQgYnkgbW9zdCA+PUdlZm9yY2UzL1JhZGVvbjg1MDAgY2FyZHMgKi8KICAgIHBDYXBzLT5NYXhWZXJ0ZXhJbmRleCAgICAgID0gMHhGRkZGRjsKICAgIHBDYXBzLT5NYXhTdHJlYW1zICAgICAgICAgID0gTUFYX1NUUkVBTVM7CiAgICBwQ2Fwcy0+TWF4U3RyZWFtU3RyaWRlICAgICA9IDEwMjQ7CgogICAgLyogZDNkOS5kbGwgc2V0cyBEM0RERVZDQVBTMl9DQU5fU1RSRVRDSFJFQ1RfRlJPTV9URVhUVVJFUyBoZXJlIGJlY2F1c2UgU3RyZXRjaFJlY3RzIGlzIGltcGxlbWVudGVkIGluIGQzZDkgKi8KICAgIHBDYXBzLT5EZXZDYXBzMiAgICAgICAgICAgICAgICAgICAgICAgICAgPSBXSU5FRDNEREVWQ0FQUzJfU1RSRUFNT0ZGU0VUOwogICAgLyogVE9ETzogVlMzLjAgbmVlZHMgYXQgbGVhc3QgRDNEREVWQ0FQUzJfVkVSVEVYRUxFTUVOVFNDQU5TSEFSRVNUUkVBTU9GRlNFVCAqLwogICAgcENhcHMtPk1heE5wYXRjaFRlc3NlbGxhdGlvbkxldmVsICAgICAgICA9IDA7CiAgICBwQ2Fwcy0+TWFzdGVyQWRhcHRlck9yZGluYWwgICAgICAgICAgICAgID0gMDsKICAgIHBDYXBzLT5BZGFwdGVyT3JkaW5hbEluR3JvdXAgICAgICAgICAgICAgPSAwOwogICAgcENhcHMtPk51bWJlck9mQWRhcHRlcnNJbkdyb3VwICAgICAgICAgICA9IDE7CgogICAgcENhcHMtPk51bVNpbXVsdGFuZW91c1JUcyA9IEdMX0xJTUlUUyhidWZmZXJzKTsKCiAgICBwQ2Fwcy0+U3RyZXRjaFJlY3RGaWx0ZXJDYXBzICAgICAgICAgICAgID0gV0lORUQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSOwogICAgcENhcHMtPlZlcnRleFRleHR1cmVGaWx0ZXJDYXBzICAgICAgICAgICA9IDA7CgogICAgbWVtc2V0KCZzaGFkZXJfY2FwcywgMCwgc2l6ZW9mKHNoYWRlcl9jYXBzKSk7CiAgICBzaGFkZXJfYmFja2VuZCA9IHNlbGVjdF9zaGFkZXJfYmFja2VuZChBZGFwdGVyLCBEZXZpY2VUeXBlKTsKICAgIHNoYWRlcl9iYWNrZW5kLT5zaGFkZXJfZ2V0X2NhcHMoRGV2aWNlVHlwZSwgJkdMSU5GT19MT0NBVElPTiwgJnNoYWRlcl9jYXBzKTsKCiAgICAvKiBBZGQgc2hhZGVyIG1pc2MgY2Fwcy4gT25seSBzb21lIG9mIHRoZW0gYmVsb25nIHRvIHRoZSBzaGFkZXIgcGFydHMgb2YgdGhlIHBpcGVsaW5lICovCiAgICBwQ2Fwcy0+UHJpbWl0aXZlTWlzY0NhcHMgfD0gc2hhZGVyX2NhcHMuUHJpbWl0aXZlTWlzY0NhcHM7CgogICAgLyogVGhpcyB0YWtlcyBjYXJlIGZvciBkaXNhYmxpbmcgdmVydGV4IHNoYWRlciBvciBwaXhlbCBzaGFkZXIgY2FwcyB3aGlsZSBsZWF2aW5nIHRoZSBvdGhlciBvbmUgZW5hYmxlZC4KICAgICAqIElnbm9yZSBzaGFkZXIgbW9kZWwgY2FwYWJpbGl0aWVzIGlmIGRpc2FibGVkIGluIGNvbmZpZwogICAgICovCiAgICBpZih2c19zZWxlY3RlZF9tb2RlID09IFNIQURFUl9OT05FKSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiVmVydGV4IHNoYWRlciBkaXNhYmxlZCBpbiBjb25maWcsIHJlcG9ydGluZyB2ZXJzaW9uIDAuMFxuIik7CiAgICAgICAgcENhcHMtPlZlcnRleFNoYWRlclZlcnNpb24gICAgICAgICAgPSBXSU5FRDNEVlNfVkVSU0lPTigwLDApOwogICAgICAgIHBDYXBzLT5NYXhWZXJ0ZXhTaGFkZXJDb25zdCAgICAgICAgID0gMDsKICAgIH0gZWxzZSB7CiAgICAgICAgcENhcHMtPlZlcnRleFNoYWRlclZlcnNpb24gICAgICAgICAgPSBzaGFkZXJfY2Fwcy5WZXJ0ZXhTaGFkZXJWZXJzaW9uOwogICAgICAgIHBDYXBzLT5NYXhWZXJ0ZXhTaGFkZXJDb25zdCAgICAgICAgID0gc2hhZGVyX2NhcHMuTWF4VmVydGV4U2hhZGVyQ29uc3Q7CiAgICB9CgogICAgaWYocHNfc2VsZWN0ZWRfbW9kZSA9PSBTSEFERVJfTk9ORSkgewogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIlBpeGVsIHNoYWRlciBkaXNhYmxlZCBpbiBjb25maWcsIHJlcG9ydGluZyB2ZXJzaW9uIDAuMFxuIik7CiAgICAgICAgcENhcHMtPlBpeGVsU2hhZGVyVmVyc2lvbiAgICAgICAgICAgPSBXSU5FRDNEUFNfVkVSU0lPTigwLDApOwogICAgICAgIHBDYXBzLT5QaXhlbFNoYWRlcjF4TWF4VmFsdWUgICAgICAgID0gMC4wOwogICAgfSBlbHNlIHsKICAgICAgICBwQ2Fwcy0+UGl4ZWxTaGFkZXJWZXJzaW9uICAgICAgICAgICA9IHNoYWRlcl9jYXBzLlBpeGVsU2hhZGVyVmVyc2lvbjsKICAgICAgICBwQ2Fwcy0+UGl4ZWxTaGFkZXIxeE1heFZhbHVlICAgICAgICA9IHNoYWRlcl9jYXBzLlBpeGVsU2hhZGVyMXhNYXhWYWx1ZTsKICAgIH0KCiAgICBwQ2Fwcy0+VGV4dHVyZU9wQ2FwcyAgICAgICAgICAgICAgICAgICAgPSBzaGFkZXJfY2Fwcy5UZXh0dXJlT3BDYXBzOwogICAgcENhcHMtPk1heFRleHR1cmVCbGVuZFN0YWdlcyAgICAgICAgICAgID0gc2hhZGVyX2NhcHMuTWF4VGV4dHVyZUJsZW5kU3RhZ2VzOwogICAgcENhcHMtPk1heFNpbXVsdGFuZW91c1RleHR1cmVzICAgICAgICAgID0gc2hhZGVyX2NhcHMuTWF4U2ltdWx0YW5lb3VzVGV4dHVyZXM7CiAgICBwQ2Fwcy0+VlMyMENhcHMgICAgICAgICAgICAgICAgICAgICAgICAgPSBzaGFkZXJfY2Fwcy5WUzIwQ2FwczsKICAgIHBDYXBzLT5NYXhWU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgICA9IHNoYWRlcl9jYXBzLk1heFZTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZDsKICAgIHBDYXBzLT5NYXhWZXJ0ZXhTaGFkZXIzMEluc3RydWN0aW9uU2xvdHM9IHNoYWRlcl9jYXBzLk1heFZlcnRleFNoYWRlcjMwSW5zdHJ1Y3Rpb25TbG90czsKICAgIHBDYXBzLT5QUzIwQ2FwcyAgICAgICAgICAgICAgICAgICAgICAgICA9IHNoYWRlcl9jYXBzLlBTMjBDYXBzOwogICAgcENhcHMtPk1heFBTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCAgID0gc2hhZGVyX2NhcHMuTWF4UFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkOwogICAgcENhcHMtPk1heFBpeGVsU2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzID0gc2hhZGVyX2NhcHMuTWF4UGl4ZWxTaGFkZXIzMEluc3RydWN0aW9uU2xvdHM7CgogICAgLyogVGhlIGZvbGxvd2luZyBjYXBzIGFyZSBzaGFkZXIgc3BlY2lmaWMsIGJ1dCB0aGV5IGFyZSB0aGluZ3Mgd2UgY2Fubm90IGRldGVjdCwgb3Igd2hpY2gKICAgICAqIGFyZSB0aGUgc2FtZSBhbW9uZyBhbGwgc2hhZGVyIG1vZGVscy4gU28gdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbiBzZXQgdGhlIHNoYWRlciB2ZXJzaW9uCiAgICAgKiBzcGVjaWZpYywgYnV0IG90aGVyd2lzZSBjb25zdGFudCBjYXBzIGhlcmUKICAgICAqLwogICAgaWYocENhcHMtPlZlcnRleFNoYWRlclZlcnNpb24gPT0gV0lORUQzRFZTX1ZFUlNJT04oMywwKSkgewogICAgICAgIC8qIFdoZXJlIHBvc3NpYmxlIHNldCB0aGUgY2FwcyBiYXNlZCBvbiBPcGVuR0wgZXh0ZW5zaW9ucyBhbmQgaWYgdGhleSBhcmVuJ3Qgc2V0IChpbiBjYXNlIG9mIHNvZnR3YXJlIHJlbmRlcmluZykKICAgICAgICB1c2UgdGhlIFZTIDMuMCBmcm9tIE1TRE4gb3IgZWxzZSBpZiB0aGVyZSdzIE9wZW5HTCBzcGVjIHVzZSBhIGhhcmRjb2RlZCB2YWx1ZSBtaW5pbXVtIFZTMy4wIHZhbHVlLiAqLwogICAgICAgIHBDYXBzLT5WUzIwQ2Fwcy5DYXBzICAgICAgICAgICAgICAgICAgICAgPSBXSU5FRDNEVlMyMENBUFNfUFJFRElDQVRJT047CiAgICAgICAgcENhcHMtPlZTMjBDYXBzLkR5bmFtaWNGbG93Q29udHJvbERlcHRoICA9IFdJTkVEM0RWUzIwX01BWF9EWU5BTUlDRkxPV0NPTlRST0xERVBUSDsgLyogVlMgMy4wIHJlcXVpcmVzIE1BWF9EWU5BTUlDRkxPV0NPTlRST0xERVBUSCAoMjQpICovCiAgICAgICAgcENhcHMtPlZTMjBDYXBzLk51bVRlbXBzICAgICAgICAgICAgICAgICA9IG1heCgzMiwgR0xJTkZPX0xPQ0FUSU9OLnZzX2FyYl9tYXhfdGVtcHMpOwogICAgICAgIHBDYXBzLT5WUzIwQ2Fwcy5TdGF0aWNGbG93Q29udHJvbERlcHRoICAgPSBXSU5FRDNEVlMyMF9NQVhfU1RBVElDRkxPV0NPTlRST0xERVBUSCA7IC8qIGxldmVsIG9mIG5lc3RpbmcgaW4gbG9vcHMgLyBpZi1zdGF0ZW1lbnRzOyBWUyAzLjAgcmVxdWlyZXMgTUFYICg0KSAqLwoKICAgICAgICBwQ2Fwcy0+TWF4VlNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkICAgID0gNjU1MzU7IC8qIFZTIDMuMCBuZWVkcyBhdCBsZWFzdCA2NTUzNSwgc29tZSBjYXJkcyBldmVuIHVzZSAyXjMyLTEgKi8KICAgICAgICBwQ2Fwcy0+TWF4VmVydGV4U2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzID0gbWF4KDUxMiwgR0xJTkZPX0xPQ0FUSU9OLnZzX2FyYl9tYXhfaW5zdHJ1Y3Rpb25zKTsKICAgIH0gZWxzZSBpZihwQ2Fwcy0+VmVydGV4U2hhZGVyVmVyc2lvbiA9PSBXSU5FRDNEVlNfVkVSU0lPTigyLDApKSB7CiAgICAgICAgcENhcHMtPlZTMjBDYXBzLkNhcHMgICAgICAgICAgICAgICAgICAgICA9IDA7CiAgICAgICAgcENhcHMtPlZTMjBDYXBzLkR5bmFtaWNGbG93Q29udHJvbERlcHRoICA9IFdJTkVEM0RWUzIwX01JTl9EWU5BTUlDRkxPV0NPTlRST0xERVBUSDsKICAgICAgICBwQ2Fwcy0+VlMyMENhcHMuTnVtVGVtcHMgICAgICAgICAgICAgICAgID0gbWF4KDEyLCBHTElORk9fTE9DQVRJT04udnNfYXJiX21heF90ZW1wcyk7CiAgICAgICAgcENhcHMtPlZTMjBDYXBzLlN0YXRpY0Zsb3dDb250cm9sRGVwdGggICA9IDE7CgogICAgICAgIHBDYXBzLT5NYXhWU2hhZGVySW5zdHJ1Y3Rpb25zRXhlY3V0ZWQgICAgPSA2NTUzNTsKICAgICAgICBwQ2Fwcy0+TWF4VmVydGV4U2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzID0gMDsKICAgIH0gZWxzZSB7IC8qIFZTIDEueCAqLwogICAgICAgIHBDYXBzLT5WUzIwQ2Fwcy5DYXBzICAgICAgICAgICAgICAgICAgICAgPSAwOwogICAgICAgIHBDYXBzLT5WUzIwQ2Fwcy5EeW5hbWljRmxvd0NvbnRyb2xEZXB0aCAgPSAwOwogICAgICAgIHBDYXBzLT5WUzIwQ2Fwcy5OdW1UZW1wcyAgICAgICAgICAgICAgICAgPSAwOwogICAgICAgIHBDYXBzLT5WUzIwQ2Fwcy5TdGF0aWNGbG93Q29udHJvbERlcHRoICAgPSAwOwoKICAgICAgICBwQ2Fwcy0+TWF4VlNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkICAgID0gMDsKICAgICAgICBwQ2Fwcy0+TWF4VmVydGV4U2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzID0gMDsKICAgIH0KCiAgICBpZihwQ2Fwcy0+UGl4ZWxTaGFkZXJWZXJzaW9uID09IFdJTkVEM0RQU19WRVJTSU9OKDMsMCkpIHsKICAgICAgICAvKiBXaGVyZSBwb3NzaWJsZSBzZXQgdGhlIGNhcHMgYmFzZWQgb24gT3BlbkdMIGV4dGVuc2lvbnMgYW5kIGlmIHRoZXkgYXJlbid0IHNldCAoaW4gY2FzZSBvZiBzb2Z0d2FyZSByZW5kZXJpbmcpCiAgICAgICAgdXNlIHRoZSBQUyAzLjAgZnJvbSBNU0ROIG9yIGVsc2UgaWYgdGhlcmUncyBPcGVuR0wgc3BlYyB1c2UgYSBoYXJkY29kZWQgdmFsdWUgbWluaW11bSBQUyAzLjAgdmFsdWUuICovCgogICAgICAgIC8qIENhcHMgaXMgbW9yZSBvciBsZXNzIHVuZG9jdW1lbnRlZCBvbiBNU0ROIGJ1dCBpdCBhcHBlYXJzIHRvIGJlIHVzZWQgZm9yIFBTMjBDYXBzIGJhc2VkIG9uIHJlc3VsdHMgZnJvbSBSOTYwMC9GWDU5MDAvR2Vmb3JjZTY4MDAgY2FyZHMgZnJvbSBXaW5kb3dzICovCiAgICAgICAgcENhcHMtPlBTMjBDYXBzLkNhcHMgICAgICAgICAgICAgICAgICAgICA9IFdJTkVEM0RQUzIwQ0FQU19BUkJJVFJBUllTV0laWkxFICAgICB8CiAgICAgICAgICAgICAgICBXSU5FRDNEUFMyMENBUFNfR1JBRElFTlRJTlNUUlVDVElPTlMgfAogICAgICAgICAgICAgICAgV0lORUQzRFBTMjBDQVBTX1BSRURJQ0FUSU9OICAgICAgICAgIHwKICAgICAgICAgICAgICAgIFdJTkVEM0RQUzIwQ0FQU19OT0RFUEVOREVOVFJFQURMSU1JVCB8CiAgICAgICAgICAgICAgICBXSU5FRDNEUFMyMENBUFNfTk9URVhJTlNUUlVDVElPTkxJTUlUOwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5EeW5hbWljRmxvd0NvbnRyb2xEZXB0aCAgPSBXSU5FRDNEUFMyMF9NQVhfRFlOQU1JQ0ZMT1dDT05UUk9MREVQVEg7IC8qIFBTIDMuMCByZXF1aXJlcyBNQVhfRFlOQU1JQ0ZMT1dDT05UUk9MREVQVEggKDI0KSAqLwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5OdW1UZW1wcyAgICAgICAgICAgICAgICAgPSBtYXgoMzIsIEdMSU5GT19MT0NBVElPTi5wc19hcmJfbWF4X3RlbXBzKTsKICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuU3RhdGljRmxvd0NvbnRyb2xEZXB0aCAgID0gV0lORUQzRFBTMjBfTUFYX1NUQVRJQ0ZMT1dDT05UUk9MREVQVEg7IC8qIFBTIDMuMCByZXF1aXJlcyBNQVhfU1RBVElDRkxPV0NPTlRST0xERVBUSCAoNCkgKi8KICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuTnVtSW5zdHJ1Y3Rpb25TbG90cyAgICAgID0gV0lORUQzRFBTMjBfTUFYX05VTUlOU1RSVUNUSU9OU0xPVFM7IC8qIFBTIDMuMCByZXF1aXJlcyBNQVhfTlVNSU5TVFJVQ1RJT05TTE9UUyAoNTEyKSAqLwoKICAgICAgICBwQ2Fwcy0+TWF4UFNoYWRlckluc3RydWN0aW9uc0V4ZWN1dGVkICAgID0gNjU1MzU7CiAgICAgICAgcENhcHMtPk1heFBpeGVsU2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzICA9IG1heChXSU5FRDNETUlOMzBTSEFERVJJTlNUUlVDVElPTlMsIEdMSU5GT19MT0NBVElPTi5wc19hcmJfbWF4X2luc3RydWN0aW9ucyk7CiAgICB9IGVsc2UgaWYocENhcHMtPlBpeGVsU2hhZGVyVmVyc2lvbiA9PSBXSU5FRDNEUFNfVkVSU0lPTigyLDApKSB7CiAgICAgICAgLyogQmVsb3cgd2UgYXNzdW1lIFBTMi4wIHNwZWNzLCBub3QgZXh0ZW5kZWQgMi4wYShHZWZvcmNlRlgpLzIuMGIoUmFkZW9uIFIzeHgpIG9uZXMgKi8KICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuQ2FwcyAgICAgICAgICAgICAgICAgICAgID0gMDsKICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuRHluYW1pY0Zsb3dDb250cm9sRGVwdGggID0gMDsgLyogV0lORUQzRFZTMjBfTUlOX0RZTkFNSUNGTE9XQ09OVFJPTERFUFRIID0gMCAqLwogICAgICAgIHBDYXBzLT5QUzIwQ2Fwcy5OdW1UZW1wcyAgICAgICAgICAgICAgICAgPSBtYXgoMTIsIEdMSU5GT19MT0NBVElPTi5wc19hcmJfbWF4X3RlbXBzKTsKICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuU3RhdGljRmxvd0NvbnRyb2xEZXB0aCAgID0gV0lORUQzRFBTMjBfTUlOX1NUQVRJQ0ZMT1dDT05UUk9MREVQVEg7IC8qIE1pbmltdW06IDEgKi8KICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuTnVtSW5zdHJ1Y3Rpb25TbG90cyAgICAgID0gV0lORUQzRFBTMjBfTUlOX05VTUlOU1RSVUNUSU9OU0xPVFM7IC8qIE1pbmltdW0gbnVtYmVyICg2NCBBTFUgKyAzMiBUZXh0dXJlKSwgYSBHZWZvcmNlRlggdXNlcyA1MTIgKi8KCiAgICAgICAgcENhcHMtPk1heFBTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCAgICA9IDUxMjsgLyogTWluaW11bSB2YWx1ZSwgYSBHZWZvcmNlRlggdXNlcyAxMDI0ICovCiAgICAgICAgcENhcHMtPk1heFBpeGVsU2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzICA9IDA7CiAgICB9IGVsc2UgeyAvKiBQUyAxLnggKi8KICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuQ2FwcyAgICAgICAgICAgICAgICAgICAgID0gMDsKICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuRHluYW1pY0Zsb3dDb250cm9sRGVwdGggID0gMDsKICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuTnVtVGVtcHMgICAgICAgICAgICAgICAgID0gMDsKICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuU3RhdGljRmxvd0NvbnRyb2xEZXB0aCAgID0gMDsKICAgICAgICBwQ2Fwcy0+UFMyMENhcHMuTnVtSW5zdHJ1Y3Rpb25TbG90cyAgICAgID0gMDsKCiAgICAgICAgcENhcHMtPk1heFBTaGFkZXJJbnN0cnVjdGlvbnNFeGVjdXRlZCAgICA9IDA7CiAgICAgICAgcENhcHMtPk1heFBpeGVsU2hhZGVyMzBJbnN0cnVjdGlvblNsb3RzICA9IDA7CiAgICB9CgogICAgaWYocENhcHMtPlZlcnRleFNoYWRlclZlcnNpb24gPj0gV0lORUQzRFZTX1ZFUlNJT04oMiwwKSkgewogICAgICAgIC8qIE9wZW5HTCBzdXBwb3J0cyBhbGwgdGhlIGZvcm1hdHMgYmVsb3csIHBlcmhhcHMgbm90IGFsd2F5cwogICAgICAgICAqIHdpdGhvdXQgY29udmVyc2lvbiwgYnV0IGl0IHN1cHBvcnRzIHRoZW0uCiAgICAgICAgICogRnVydGhlciBHTFNMIGRvZXNuJ3Qgc2VlbSB0byBoYXZlIGFuIG9mZmljaWFsIHVuc2lnbmVkIHR5cGUgc28KICAgICAgICAgKiBkb24ndCBhZHZlcnRpc2UgaXQgeWV0IGFzIEknbSBub3Qgc3VyZSBob3cgd2UgaGFuZGxlIGl0LgogICAgICAgICAqIFdlIG1pZ2h0IG5lZWQgdG8gYWRkIHNvbWUgY2xhbXBpbmcgaW4gdGhlIHNoYWRlciBlbmdpbmUgdG8KICAgICAgICAgKiBzdXBwb3J0IGl0LgogICAgICAgICAqIFRPRE86IFdJTkVEM0REVENBUFNfVVNIT1JUMk4sIFdJTkVEM0REVENBUFNfVVNIT1JUNE4sIFdJTkVEM0REVENBUFNfVURFQzMsIFdJTkVEM0REVENBUFNfREVDM04gKi8KICAgICAgICBwQ2Fwcy0+RGVjbFR5cGVzID0gV0lORUQzRERUQ0FQU19VQllURTQgICAgfAogICAgICAgICAgICAgICAgICAgICAgICAgICBXSU5FRDNERFRDQVBTX1VCWVRFNE4gICB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0REVENBUFNfU0hPUlQyTiAgIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgV0lORUQzRERUQ0FQU19TSE9SVDROOwogICAgICAgIGlmIChHTF9TVVBQT1JUKE5WX0hBTEZfRkxPQVQpKSB7CiAgICAgICAgICAgIHBDYXBzLT5EZWNsVHlwZXMgfD0gV0lORUQzRERUQ0FQU19GTE9BVDE2XzIgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdJTkVEM0REVENBUFNfRkxPQVQxNl80OwogICAgICAgIH0KICAgIH0gZWxzZQogICAgICAgIHBDYXBzLT5EZWNsVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgPSAwOwoKICAgIHJldHVybiBXSU5FRDNEX09LOwp9CgovKiBOb3RlIGR1ZSB0byBzdHJ1Y3R1cmUgZGlmZmVyZW5jZXMgYmV0d2VlbiBkeDggYW5kIGR4OSBEM0RQUkVTRU5UX1BBUkFNRVRFUlMsCiAgIGFuZCBmaWVsZHMgYmVpbmcgaW5zZXJ0ZWQgaW4gdGhlIG1pZGRsZSwgYSBuZXcgc3RydWN0dXJlIGlzIHVzZWQgaW4gcGxhY2UgICAgKi8Kc3RhdGljIEhSRVNVTFQgIFdJTkFQSSBJV2luZUQzREltcGxfQ3JlYXRlRGV2aWNlKElXaW5lRDNEICppZmFjZSwgVUlOVCBBZGFwdGVyLCBXSU5FRDNEREVWVFlQRSBEZXZpY2VUeXBlLCBIV05EIGhGb2N1c1dpbmRvdywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERXT1JEIEJlaGF2aW91ckZsYWdzLCBJV2luZUQzRERldmljZSoqIHBwUmV0dXJuZWREZXZpY2VJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVW5rbm93biAqcGFyZW50KSB7CgogICAgSVdpbmVEM0REZXZpY2VJbXBsICpvYmplY3QgID0gTlVMTDsKICAgIElXaW5lRDNESW1wbCAgICAgICAqVGhpcyAgICA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIFdJTkVEM0RESVNQTEFZTU9ERSAgbW9kZTsKICAgIGludCBpOwoKICAgIC8qIFZhbGlkYXRlIHRoZSBhZGFwdGVyIG51bWJlci4gSWYgbm8gYWRhcHRlcnMgYXJlIGF2YWlsYWJsZShubyBHTCksIGlnbm9yZSB0aGUgYWRhcHRlcgogICAgICogbnVtYmVyIGFuZCBjcmVhdGUgYSBkZXZpY2Ugd2l0aG91dCBhIDNEIGFkYXB0ZXIgZm9yIDJEIG9ubHkgb3BlcmF0aW9uLgogICAgICovCiAgICBpZiAoSVdpbmVEM0RfR2V0QWRhcHRlckNvdW50KGlmYWNlKSAmJiBBZGFwdGVyID49IElXaW5lRDNEX0dldEFkYXB0ZXJDb3VudChpZmFjZSkpIHsKICAgICAgICByZXR1cm4gV0lORUQzREVSUl9JTlZBTElEQ0FMTDsKICAgIH0KCiAgICAvKiBDcmVhdGUgYSBXaW5lRDNERGV2aWNlIG9iamVjdCAqLwogICAgb2JqZWN0ID0gSGVhcEFsbG9jKEdldFByb2Nlc3NIZWFwKCksIEhFQVBfWkVST19NRU1PUlksIHNpemVvZihJV2luZUQzRERldmljZUltcGwpKTsKICAgICpwcFJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gKElXaW5lRDNERGV2aWNlICopb2JqZWN0OwogICAgVFJBQ0UoIkNyZWF0ZWQgV2luZUQzRERldmljZSBvYmplY3QgQCAlcFxuIiwgb2JqZWN0KTsKICAgIGlmIChOVUxMID09IG9iamVjdCkgewogICAgICByZXR1cm4gV0lORUQzREVSUl9PVVRPRlZJREVPTUVNT1JZOwogICAgfQoKICAgIC8qIFNldCB1cCBpbml0aWFsIENPTSBpbmZvcm1hdGlvbiAqLwogICAgb2JqZWN0LT5scFZ0YmwgID0gJklXaW5lRDNERGV2aWNlX1Z0Ymw7CiAgICBvYmplY3QtPnJlZiAgICAgPSAxOwogICAgb2JqZWN0LT53aW5lRDNEID0gaWZhY2U7CiAgICBvYmplY3QtPmFkYXB0ZXIgPSBudW1BZGFwdGVycyA/ICZBZGFwdGVyc1tBZGFwdGVyXSA6IE5VTEw7CiAgICBJV2luZUQzRF9BZGRSZWYob2JqZWN0LT53aW5lRDNEKTsKICAgIG9iamVjdC0+cGFyZW50ICA9IHBhcmVudDsKICAgIGxpc3RfaW5pdCgmb2JqZWN0LT5yZXNvdXJjZXMpOwogICAgbGlzdF9pbml0KCZvYmplY3QtPnNoYWRlcnMpOwoKICAgIGlmKFRoaXMtPmR4VmVyc2lvbiA9PSA3KSB7CiAgICAgICAgb2JqZWN0LT5zdXJmYWNlX2FsaWdubWVudCA9IDg7CiAgICB9IGVsc2UgewogICAgICAgIG9iamVjdC0+c3VyZmFjZV9hbGlnbm1lbnQgPSA0OwogICAgfQogICAgb2JqZWN0LT5wb3NGaXh1cFswXSA9IDEuMDsgLyogVGhpcyBpcyBuZWVkZWQgdG8gZ2V0IHRoZSB4IGNvb3JkIHVubW9kaWZpZWQgdGhyb3VnaCBhIE1BRCAqLwoKICAgIC8qIFNldCB0aGUgc3RhdGUgdXAgYXMgaW52YWxpZCB1bnRpbCB0aGUgZGV2aWNlIGlzIGZ1bGx5IGNyZWF0ZWQgKi8KICAgIG9iamVjdC0+c3RhdGUgICA9IFdJTkVEM0RFUlJfRFJJVkVSSU5URVJOQUxFUlJPUjsKCiAgICBUUkFDRSgiKCVwKS0+KEFkcHRyOiVkLCBEZXZUeXBlOiAleCwgRm9jdXNId25kOiAlcCwgQmVoRmxhZ3M6ICV4LCBSZXREZXZJbnQ6ICVwKVxuIiwgVGhpcywgQWRhcHRlciwgRGV2aWNlVHlwZSwKICAgICAgICAgIGhGb2N1c1dpbmRvdywgQmVoYXZpb3VyRmxhZ3MsIHBwUmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOwoKICAgIC8qIFNhdmUgdGhlIGNyZWF0aW9uIHBhcmFtZXRlcnMgKi8KICAgIG9iamVjdC0+Y3JlYXRlUGFybXMuQWRhcHRlck9yZGluYWwgPSBBZGFwdGVyOwogICAgb2JqZWN0LT5jcmVhdGVQYXJtcy5EZXZpY2VUeXBlICAgICA9IERldmljZVR5cGU7CiAgICBvYmplY3QtPmNyZWF0ZVBhcm1zLmhGb2N1c1dpbmRvdyAgID0gaEZvY3VzV2luZG93OwogICAgb2JqZWN0LT5jcmVhdGVQYXJtcy5CZWhhdmlvckZsYWdzICA9IEJlaGF2aW91ckZsYWdzOwoKICAgIC8qIEluaXRpYWxpemUgb3RoZXIgdXNlZnVsIHZhbHVlcyAqLwogICAgb2JqZWN0LT5hZGFwdGVyTm8gICAgICAgICAgICAgICAgICAgID0gQWRhcHRlcjsKICAgIG9iamVjdC0+ZGV2VHlwZSAgICAgICAgICAgICAgICAgICAgICA9IERldmljZVR5cGU7CgogICAgc2VsZWN0X3NoYWRlcl9tb2RlKCZHTElORk9fTE9DQVRJT04sIERldmljZVR5cGUsICZvYmplY3QtPnBzX3NlbGVjdGVkX21vZGUsICZvYmplY3QtPnZzX3NlbGVjdGVkX21vZGUpOwogICAgb2JqZWN0LT5zaGFkZXJfYmFja2VuZCA9IHNlbGVjdF9zaGFkZXJfYmFja2VuZChBZGFwdGVyLCBEZXZpY2VUeXBlKTsKCiAgICAvKiBQcmVmZXIgdGhlIHZ0YWJsZSB3aXRoIGZ1bmN0aW9ucyBvcHRpbWl6ZWQgZm9yIHNpbmdsZSBkaXJ0aWZ5YWJsZSBvYmplY3RzIGlmIHRoZSBzaGFkZXIKICAgICAqIG1vZGVsIGNhbiBkZWFsIHdpdGggdGhhdC4gSXQgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUsIGp1c3Qgd2l0aCBhZGp1c3RlZAogICAgICogU2V0KlNoYWRlckNvbnN0YW50RiBpbXBsZW1lbnRhdGlvbnMKICAgICAqLwogICAgaWYob2JqZWN0LT5zaGFkZXJfYmFja2VuZC0+c2hhZGVyX2RpcnRpZnlhYmxlX2NvbnN0YW50cygoSVdpbmVEM0REZXZpY2UgKikgb2JqZWN0KSkgewogICAgICAgIG9iamVjdC0+bHBWdGJsICA9ICZJV2luZUQzRERldmljZV9EaXJ0eUNvbnN0X1Z0Ymw7CiAgICB9CgogICAgLyogc2V0IHRoZSBzdGF0ZSBvZiB0aGUgZGV2aWNlIHRvIHZhbGlkICovCiAgICBvYmplY3QtPnN0YXRlID0gV0lORUQzRF9PSzsKCiAgICAvKiBHZXQgdGhlIGluaXRpYWwgc2NyZWVuIHNldHVwIGZvciBkZHJhdyAqLwogICAgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJEaXNwbGF5TW9kZShpZmFjZSwgQWRhcHRlciwgJm1vZGUpOwoKICAgIG9iamVjdC0+ZGRyYXdfd2lkdGggPSBtb2RlLldpZHRoOwogICAgb2JqZWN0LT5kZHJhd19oZWlnaHQgPSBtb2RlLkhlaWdodDsKICAgIG9iamVjdC0+ZGRyYXdfZm9ybWF0ID0gbW9kZS5Gb3JtYXQ7CgogICAgZm9yKGkgPSAwOyBpIDwgUEFUQ0hNQVBfU0laRTsgaSsrKSB7CiAgICAgICAgbGlzdF9pbml0KCZvYmplY3QtPnBhdGNoZXNbaV0pOwogICAgfQogICAgcmV0dXJuIFdJTkVEM0RfT0s7Cn0KI3VuZGVmIEdMSU5GT19MT0NBVElPTgoKc3RhdGljIEhSRVNVTFQgV0lOQVBJIElXaW5lRDNESW1wbF9HZXRQYXJlbnQoSVdpbmVEM0QgKmlmYWNlLCBJVW5rbm93biAqKnBQYXJlbnQpIHsKICAgIElXaW5lRDNESW1wbCAqVGhpcyA9IChJV2luZUQzREltcGwgKilpZmFjZTsKICAgIElVbmtub3duX0FkZFJlZihUaGlzLT5wYXJlbnQpOwogICAgKnBQYXJlbnQgPSBUaGlzLT5wYXJlbnQ7CiAgICByZXR1cm4gV0lORUQzRF9PSzsKfQoKVUxPTkcgV0lOQVBJIEQzRENCX0RlZmF1bHREZXN0cm95U3VyZmFjZShJV2luZUQzRFN1cmZhY2UgKnBTdXJmYWNlKSB7CiAgICBJVW5rbm93biogc3VyZmFjZVBhcmVudDsKICAgIFRSQUNFKCIoJXApIGNhbGwgYmFja1xuIiwgcFN1cmZhY2UpOwoKICAgIC8qIE5vdywgcmVsZWFzZSB0aGUgcGFyZW50LCB3aGljaCB3aWxsIHRha2UgY2FyZSBvZiBjbGVhbmluZyB1cCB0aGUgc3VyZmFjZSBmb3IgdXMgKi8KICAgIElXaW5lRDNEU3VyZmFjZV9HZXRQYXJlbnQocFN1cmZhY2UsICZzdXJmYWNlUGFyZW50KTsKICAgIElVbmtub3duX1JlbGVhc2Uoc3VyZmFjZVBhcmVudCk7CiAgICByZXR1cm4gSVVua25vd25fUmVsZWFzZShzdXJmYWNlUGFyZW50KTsKfQoKVUxPTkcgV0lOQVBJIEQzRENCX0RlZmF1bHREZXN0cm95Vm9sdW1lKElXaW5lRDNEVm9sdW1lICpwVm9sdW1lKSB7CiAgICBJVW5rbm93biogdm9sdW1lUGFyZW50OwogICAgVFJBQ0UoIiglcCkgY2FsbCBiYWNrXG4iLCBwVm9sdW1lKTsKCiAgICAvKiBOb3csIHJlbGVhc2UgdGhlIHBhcmVudCwgd2hpY2ggd2lsbCB0YWtlIGNhcmUgb2YgY2xlYW5pbmcgdXAgdGhlIHZvbHVtZSBmb3IgdXMgKi8KICAgIElXaW5lRDNEVm9sdW1lX0dldFBhcmVudChwVm9sdW1lLCAmdm9sdW1lUGFyZW50KTsKICAgIElVbmtub3duX1JlbGVhc2Uodm9sdW1lUGFyZW50KTsKICAgIHJldHVybiBJVW5rbm93bl9SZWxlYXNlKHZvbHVtZVBhcmVudCk7Cn0KCnN0YXRpYyBCT09MIGltcGxlbWVudGF0aW9uX2lzX2FwcGxlKFdpbmVEM0RfR0xfSW5mbyAqZ2xfaW5mbykgewogICAgLyogTWFjT1MgaGFzIHZhcmlvdXMgc3BlY2lhbGl0aWVzIGluIHRoZSBleHRlbnNpb25zIGl0IGFkdmVydGlzZXMuIFNvbWUgaGF2ZSB0byBiZSBsb2FkZWQgZnJvbQogICAgICogdGhlIG9wZW5nbCAxLjIrIGNvcmUsIHdoaWxlIG90aGVyIGV4dGVuc2lvbnMgYXJlIGFkdmVydGlzZWQsIGJ1dCBzb2Z0d2FyZSBlbXVsYXRlZC4gU28gdHJ5IHRvCiAgICAgKiBkZXRlY3QgdGhlIEFwcGxlIE9wZW5HTCBpbXBsZW1lbnRhdGlvbiB0byBhcHBseSBzb21lIGV4dGVuc2lvbiBmaXh1cHMgYWZ0ZXJ3YXJkcy4KICAgICAqCiAgICAgKiBEZXRlY3RpbmcgdGhpcyBpc24ndCByZWFsbHkgZWFzeS4gVGhlIHZlbmRvciBzdHJpbmcgZG9lc24ndCBtZW50aW9uIEFwcGxlLiBDb21waWxlLXRpbWUgY2hlY2tzCiAgICAgKiBhcmVuJ3Qgc3VmZmljaWVudCBlaXRoZXIgYmVjYXVzZSBhIExpbnV4IGJpbmFyeSBtYXkgZGlzcGxheSBvbiBhIG1hY29zIFggc2VydmVyIHZpYSByZW1vdGUgWDExLgogICAgICogU28gdHJ5IHRvIGRldGVjdCB0aGUgR0wgaW1wbGVtZW50YXRpb24gYnkgbG9va2luZyBhdCBjZXJ0YWluIEFwcGxlIGV4dGVuc2lvbnMuIFNvbWUgZXh0ZW5zaW9ucwogICAgICogbGlrZSBjbGllbnQgc3RvcmFnZSBtaWdodCBiZSBzdXBwb3J0ZWQgb24gb3RoZXIgaW1wbGVtZW50YXRpb25zIHRvbywgYnV0IEdMX0FQUExFX2ZsdXNoX3JlbmRlcgogICAgICogaXMgc3BlY2lmaWMgdG8gdGhlIE1hYyBPUyBYIHdpbmRvdyBtYW5hZ2VtZW50LCBhbmQgR0xfQVBQTEVfeWNiY3JfNDIyIGlzIFF1aWNrVGltZSBzcGVjaWZpYy4gU28KICAgICAqIHRoZSBjaGFuY2UgdGhhdCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgc3VwcG9ydCB0aGVtIGlzIHJhdGhlciBzbWFsbCBzaW5jZSBXaW4zMiBRdWlja1RpbWUgdXNlcwogICAgICogRGlyZWN0RHJhdywgbm90IE9wZW5HTC4KICAgICAqLwogICAgaWYoZ2xfaW5mby0+c3VwcG9ydGVkW0FQUExFX0ZFTkNFXSAmJgogICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FQUExFX0NMSUVOVF9TVE9SQUdFXSAmJgogICAgICAgZ2xfaW5mby0+c3VwcG9ydGVkW0FQUExFX0ZMVVNIX1JFTkRFUl0gJiYKICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtBUFBMRV9ZQ0JDUl80MjJdKSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiR0xfQVBQTEVfZmVuY2UsIEdMX0FQUExFX2NsaWVudF9zdG9yYWdlLCBHTF9BUFBMRV9mbHVzaF9yZW5kZXIgYW5kIEdMX3ljYmNyXzQyMiBhcmUgc3VwcG9ydGVkXG4iKTsKICAgICAgICBUUkFDRV8oZDNkX2NhcHMpKCJBY3RpdmF0aW5nIE1hY09TIGZpeHVwc1xuIik7CiAgICAgICAgcmV0dXJuIFRSVUU7CiAgICB9IGVsc2UgewogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIkFwcGxlIGV4dGVuc2lvbnMgYXJlIG5vdCBzdXBwb3J0ZWRcbiIpOwogICAgICAgIFRSQUNFXyhkM2RfY2FwcykoIk5vdCBhY3RpdmF0aW5nIE1hY09TIGZpeHVwc1xuIik7CiAgICAgICAgcmV0dXJuIEZBTFNFOwogICAgfQp9CgojZGVmaW5lIEdMSU5GT19MT0NBVElPTiAoKmdsX2luZm8pCnN0YXRpYyB2b2lkIHRlc3RfcGJvX2Z1bmN0aW9uYWxpdHkoV2luZUQzRF9HTF9JbmZvICpnbF9pbmZvKSB7CiAgICAvKiBTb21lIE9wZW5HTCBpbXBsZW1lbnRhdGlvbnMsIG5hbWVseSBBcHBsZSdzIEdlZm9yY2UgOCBkcml2ZXIsIGFkdmVydGlzZXMgUEJPcywKICAgICAqIGJ1dCBnbFRleFN1YkltYWdlIGZyb20gYSBQQk8gZmFpbHMgbWlzZXJhYmx5LCB3aXRoIHRoZSBmaXJzdCBsaW5lIHJlcGVhdGVkIG92ZXIKICAgICAqIGFsbCB0aGUgdGV4dHVyZS4gVGhpcyBmdW5jdGlvbiBkZXRlY3RzIHRoaXMgYnVnIGJ5IGl0cyBzeW1wdG9tIGFuZCBkaXNhYmxlcyBQQk9zCiAgICAgKiBpZiB0aGUgdGVzdCBmYWlscy4KICAgICAqCiAgICAgKiBUaGUgdGVzdCB1cGxvYWRzIGEgNHg0IHRleHR1cmUgdmlhIHRoZSBQQk8gaW4gdGhlICJuYXRpdmUiIGZvcm1hdCBHTF9CR1JBLAogICAgICogR0xfVU5TSUdORURfSU5UXzhfOF84XzhfUkVWLiBUaGlzIGZvcm1hdCB0cmlnZ2VycyB0aGUgYnVnLCBhbmQgaXQgaXMgd2hhdCB3ZSB1c2UKICAgICAqIGZvciBEM0RGTVRfQThSOEc4QjguIFRoZW4gdGhlIHRleHR1cmUgaXMgcmVhZCBiYWNrIHdpdGhvdXQgYW55IFBCTyBhbmQgdGhlIGRhdGEKICAgICAqIHJlYWQgYmFjayBpcyBjb21wYXJlZCB0byB0aGUgb3JpZ2luYWwuIElmIHRoZXkgYXJlIGVxdWFsIFBCT3MgYXJlIGFzc3VtZWQgdG8gd29yaywKICAgICAqIG90aGVyd2lzZSB0aGUgUEJPIGV4dGVuc2lvbiBpcyBkaXNhYmxlZC4KICAgICAqLwogICAgR0x1aW50IHRleHR1cmUsIHBibzsKICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgcGF0dGVybltdID0gewogICAgICAgIDB4MDAwMDAwMDAsIDB4MDAwMDAwZmYsIDB4MDAwMGZmMDAsIDB4NDBmZjAwMDAsCiAgICAgICAgMHg4MGZmZmZmZiwgMHg0MGZmZmYwMCwgMHgwMGZmMDBmZiwgMHgwMDAwZmZmZiwKICAgICAgICAweDAwZmZmZjAwLCAweDAwZmYwMGZmLCAweDAwMDBmZmZmLCAweDAwMDAwMGZmLAogICAgICAgIDB4ODBmZjAwZmYsIDB4MDAwMGZmZmYsIDB4MDBmZjAwZmYsIDB4NDBmZjAwZmYKICAgIH07CiAgICB1bnNpZ25lZCBpbnQgY2hlY2tbc2l6ZW9mKHBhdHRlcm4pIC8gc2l6ZW9mKHBhdHRlcm5bMF0pXTsKCiAgICBpZighZ2xfaW5mby0+c3VwcG9ydGVkW0FSQl9QSVhFTF9CVUZGRVJfT0JKRUNUXSkgewogICAgICAgIC8qIE5vIFBCTyAtPiBObyBwb2ludCBpbiB0ZXN0aW5nIHRoZW0gKi8KICAgICAgICByZXR1cm47CiAgICB9CgogICAgd2hpbGUoZ2xHZXRFcnJvcigpKTsKICAgIGdsR2VuVGV4dHVyZXMoMSwgJnRleHR1cmUpOwogICAgZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlKTsKICAgIGdsVGV4SW1hZ2UyRChHTF9URVhUVVJFXzJELCAwLCBHTF9SR0JBLCA0LCA0LCAwLCBHTF9CR1JBLCBHTF9VTlNJR05FRF9JTlRfOF84XzhfOF9SRVYsIDApOwogICAgY2hlY2tHTGNhbGwoIlNwZWNpZnlpbmcgdGhlIFBCTyB0ZXN0IHRleHR1cmVcbiIpOwoKICAgIEdMX0VYVENBTEwoZ2xHZW5CdWZmZXJzQVJCKDEsICZwYm8pKTsKICAgIEdMX0VYVENBTEwoZ2xCaW5kQnVmZmVyQVJCKEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQVJCLCBwYm8pKTsKICAgIEdMX0VYVENBTEwoZ2xCdWZmZXJEYXRhQVJCKEdMX1BJWEVMX1VOUEFDS19CVUZGRVJfQVJCLCBzaXplb2YocGF0dGVybiksIHBhdHRlcm4sIEdMX1NUUkVBTV9EUkFXX0FSQikpOwogICAgY2hlY2tHTGNhbGwoIlNwZWNpZnlpbmcgdGhlIFBCTyB0ZXN0IHBib1xuIik7CgogICAgZ2xUZXhTdWJJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIDAsIDAsIDQsIDQsIEdMX0JHUkEsIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViwgTlVMTCk7CiAgICBjaGVja0dMY2FsbCgiTG9hZGluZyB0aGUgUEJPIHRlc3QgdGV4dHVyZVxuIik7CgogICAgR0xfRVhUQ0FMTChnbEJpbmRCdWZmZXJBUkIoR0xfUElYRUxfVU5QQUNLX0JVRkZFUl9BUkIsIDApKTsKICAgIGdsRmluaXNoKCk7IC8qIGp1c3QgdG8gYmUgc3VyZSAqLwoKICAgIG1lbXNldChjaGVjaywgMCwgc2l6ZW9mKGNoZWNrKSk7CiAgICBnbEdldFRleEltYWdlKEdMX1RFWFRVUkVfMkQsIDAsIEdMX0JHUkEsIEdMX1VOU0lHTkVEX0lOVF84XzhfOF84X1JFViwgY2hlY2spOwogICAgY2hlY2tHTGNhbGwoIlJlYWRpbmcgYmFjayB0aGUgUEJPIHRlc3QgdGV4dHVyZVxuIik7CgogICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZSk7CiAgICBHTF9FWFRDQUxMKGdsRGVsZXRlQnVmZmVyc0FSQigxLCAmcGJvKSk7CiAgICBjaGVja0dMY2FsbCgiUEJPIHRlc3QgY2xlYW51cFxuIik7CgogICAgaWYobWVtY21wKGNoZWNrLCBwYXR0ZXJuLCBzaXplb2YoY2hlY2spKSAhPSAwKSB7CiAgICAgICAgV0FSTl8oZDNkX2NhcHMpKCJQQk8gdGVzdCBmYWlsZWQsIHJlYWQgYmFjayBkYXRhIGRvZXNuJ3QgbWF0Y2ggb3JpZ2luYWxcbiIpOwogICAgICAgIFdBUk5fKGQzZF9jYXBzKSgiRGlzYWJsaW5nIFBCT3MuIFRoaXMgbWF5IHJlc3VsdCBpbiBzbG93ZXIgcGVyZm9ybWFuY2VcbiIpOwogICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfUElYRUxfQlVGRkVSX09CSkVDVF0gPSBGQUxTRTsKICAgIH0gZWxzZSB7CiAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiUEJPIHRlc3Qgc3VjY2Vzc2Z1bFxuIik7CiAgICB9Cn0KI3VuZGVmIEdMSU5GT19MT0NBVElPTgoKLyogQ2VydGFpbiBhcHBsaWNhdGlvbnMoU3RlYW0pIGNvbXBsYWluIGlmIHdlIHJlcG9ydCBhbiBvdXRkYXRlZCBkcml2ZXIgdmVyc2lvbi4gSW4gZ2VuZXJhbCwKICogcmVwb3J0aW5nIGEgZHJpdmVyIHZlcnNpb24gaXMgbW9vdCBiZWNhdXNlIHdlIGFyZSBub3QgdGhlIFdpbmRvd3MgZHJpdmVyLCBhbmQgd2UgaGF2ZSBkaWZmZXJlbnQKICogYnVncywgZmVhdHVyZXMsIGV0Yy4KICoKICogSWYgYSBjYXJkIGlzIG5vdCBmb3VuZCBpbiB0aGlzIHRhYmxlLCB0aGUgZ2wgZHJpdmVyIHZlcnNpb24gaXMgcmVwb3J0ZWQKICovCnN0cnVjdCBkcml2ZXJfdmVyc2lvbl9pbmZvcm1hdGlvbiB7CiAgICBXT1JEIHZlbmRvcjsgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXBvcnRlZCBQQ0kgY2FyZCB2ZW5kb3IgSUQgICovCiAgICBXT1JEIGNhcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiByZXBvcnRlZCBQQ0kgY2FyZCBkZXZpY2UgSUQgICovCiAgICBXT1JEIGhpcGFydF9oaSwgaGlwYXJ0X2xvOyAgICAgICAgICAvKiBkcml2ZXIgaGl3b3JkIHRvIHJlcG9ydCAgICAgICovCiAgICBXT1JEIGxvcGFydF9oaSwgbG9wYXJ0X2xvOyAgICAgICAgICAvKiBkcml2ZXIgbG93b3JkIHRvIHJlcG9ydCAgICAgICovCn07CgpzdGF0aWMgY29uc3Qgc3RydWN0IGRyaXZlcl92ZXJzaW9uX2luZm9ybWF0aW9uIGRyaXZlcl92ZXJzaW9uX3RhYmxlW10gPSB7CiAgICAvKiBOdmlkaWEgZHJpdmVycy4gR2Vmb3JjZSBGWCBhbmQgbmV3ZXIgY2FyZHMgYXJlIHN1cHBvcnRlZCBieSB0aGUgY3VycmVudCBkcml2ZXIgKi8KICAgIHtWRU5ET1JfTlZJRElBLCAgICAgQ0FSRF9OVklESUFfR0VGT1JDRUZYXzUyMDAsICAgICA3LCAgMTUsIDEwLCAxNjkyMSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VGWF81NjAwLCAgICAgNywgIDE1LCAxMCwgMTY5MjEgICB9LAogICAge1ZFTkRPUl9OVklESUEsICAgICBDQVJEX05WSURJQV9HRUZPUkNFRlhfNTgwMCwgICAgIDcsICAxNSwgMTAsIDE2OTIxICAgfSwKICAgIHtWRU5ET1JfTlZJRElBLCAgICAgQ0FSRF9OVklESUFfR0VGT1JDRV82MjAwLCAgICAgICA3LCAgMTUsIDEwLCAxNjkyMSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfNjYwMEdULCAgICAgNywgIDE1LCAxMCwgMTY5MjEgICB9LAogICAge1ZFTkRPUl9OVklESUEsICAgICBDQVJEX05WSURJQV9HRUZPUkNFXzY4MDAsICAgICAgIDcsICAxNSwgMTAsIDE2OTIxICAgfSwKICAgIHtWRU5ET1JfTlZJRElBLCAgICAgQ0FSRF9OVklESUFfR0VGT1JDRV83NDAwLCAgICAgICA3LCAgMTUsIDEwLCAxNjkyMSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfNzMwMCwgICAgICAgNywgIDE1LCAxMCwgMTY5MjEgICB9LAogICAge1ZFTkRPUl9OVklESUEsICAgICBDQVJEX05WSURJQV9HRUZPUkNFXzc2MDAsICAgICAgIDcsICAxNSwgMTAsIDE2OTIxICAgfSwKICAgIHtWRU5ET1JfTlZJRElBLCAgICAgQ0FSRF9OVklESUFfR0VGT1JDRV83ODAwR1QsICAgICA3LCAgMTUsIDEwLCAxNjkyMSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfODMwMEdTLCAgICAgNywgIDE1LCAxMCwgMTY5MjEgICB9LAogICAge1ZFTkRPUl9OVklESUEsICAgICBDQVJEX05WSURJQV9HRUZPUkNFXzg2MDBHVCwgICAgIDcsICAxNSwgMTAsIDE2OTIxICAgfSwKICAgIHtWRU5ET1JfTlZJRElBLCAgICAgQ0FSRF9OVklESUFfR0VGT1JDRV84NjAwTUdULCAgICA3LCAgMTUsIDEwLCAxNjkyMSAgIH0sCiAgICB7VkVORE9SX05WSURJQSwgICAgIENBUkRfTlZJRElBX0dFRk9SQ0VfODgwMEdUUywgICAgNywgIDE1LCAxMCwgMTY5MjEgICB9LAoKICAgIC8qIEFUSSBjYXJkcy4gVGhlIGRyaXZlciB2ZXJzaW9ucyBhcmUgc29tZXdoYXQgc2ltaWxhciwgYnV0IG5vdCBxdWl0ZSB0aGUgc2FtZS4gTGV0J3MgaGFyZGNvZGUgKi8KICAgIHtWRU5ET1JfQVRJLCAgICAgICAgQ0FSRF9BVElfUkFERU9OXzk1MDAsICAgICAgICAgICA2LCAgMTQsIDEwLCA2NzY0ICAgIH0sCiAgICB7VkVORE9SX0FUSSwgICAgICAgIENBUkRfQVRJX1JBREVPTl9YNzAwLCAgICAgICAgICAgNiwgIDE0LCAxMCwgNjc2NCAgICB9LAogICAge1ZFTkRPUl9BVEksICAgICAgICBDQVJEX0FUSV9SQURFT05fWDE2MDAsICAgICAgICAgIDYsICAxNCwgMTAsIDY3NjQgICAgfSwKICAgIHtWRU5ET1JfQVRJLCAgICAgICAgQ0FSRF9BVElfUkFERU9OX0hEMjMwMCwgICAgICAgICA2LCAgMTQsIDEwLCA2NzY0ICAgIH0sCiAgICB7VkVORE9SX0FUSSwgICAgICAgIENBUkRfQVRJX1JBREVPTl9IRDI2MDAsICAgICAgICAgNiwgIDE0LCAxMCwgNjc2NCAgICB9LAogICAge1ZFTkRPUl9BVEksICAgICAgICBDQVJEX0FUSV9SQURFT05fSEQyOTAwLCAgICAgICAgIDYsICAxNCwgMTAsIDY3NjQgICAgfSwKCiAgICAvKiBUT0RPOiBBZGQgaW5mb3JtYXRpb24gYWJvdXQgbGVnYWN5IG52aWRpYSBhbmQgQVRJIGhhcmR3YXJlLCBJbnRlbCBhbmQgb3RoZXIgY2FyZHMgKi8KfTsKCnN0YXRpYyB2b2lkIGZpeHVwX2V4dGVuc2lvbnMoV2luZUQzRF9HTF9JbmZvICpnbF9pbmZvKSB7CiAgICB1bnNpZ25lZCBpbnQgaTsKICAgIEJPT0wgYXBwbGUgPSBpbXBsZW1lbnRhdGlvbl9pc19hcHBsZShnbF9pbmZvKTsKCiAgICBpZihhcHBsZSkgewogICAgICAgIC8qIE1hY09TIGFkdmVydGlzZXMgbW9yZSBHTFNMIHZlcnRleCBzaGFkZXIgdW5pZm9ybXMgdGhhbiBzdXBwb3J0ZWQgYnkgdGhlIGhhcmR3YXJlLCBhbmQgaWYgbW9yZSBhcmUKICAgICAgICAgKiB1c2VkIGl0IGZhbGxzIGJhY2sgdG8gc29mdHdhcmUuIFdoaWxlIHRoZSBjb21waWxlciBjYW4gZGV0ZWN0IGlmIHRoZSBzaGFkZXIgdXNlcyBhbGwgZGVjbGFyZWQKICAgICAgICAgKiB1bmlmb3JtcywgdGhlIG9wdGltaXphdGlvbiBmYWlscyBpZiB0aGUgc2hhZGVyIHVzZXMgcmVsYXRpdmUgYWRkcmVzc2luZy4gU28gYW55IEdMU0wgc2hhZGVyCiAgICAgICAgICogdXNpbmcgcmVsYXRpdmUgYWRkcmVzc2luZyBmYWxscyBiYWNrIHRvIHNvZnR3YXJlLgogICAgICAgICAqCiAgICAgICAgICogQVJCIHZwIGdpdmVzIHRoZSBjb3JyZWN0IGFtb3VudCBvZiB1bmlmb3Jtcywgc28gdXNlIGl0IGluc3RlYWQgb2YgR0xTTAogICAgICAgICAqLwogICAgICAgIGlmKGdsX2luZm8tPnZzX2dsc2xfY29uc3RhbnRzRiA8PSBnbF9pbmZvLT52c19hcmJfY29uc3RhbnRzRikgewogICAgICAgICAgICBGSVhNRSgiR0xTTCBkb2Vzbid0IGFkdmVydGlzZSBtb3JlIHZlcnRleCBzaGFkZXIgdW5pZm9ybXMgdGhhbiBBUkIuIERyaXZlciBmaXh1cCBvdXRkYXRlZD9cbiIpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIFRSQUNFKCJEcml2ZXIgY2xhaW1zICV1IEdMU0wgdnMgdW5pZm9ybXMsIHJlcGxhY2luZyB3aXRoICV1IEFSQiB2cCB1bmlmb3Jtc1xuIiwKICAgICAgICAgICAgICAgICAgZ2xfaW5mby0+dnNfZ2xzbF9jb25zdGFudHNGLCBnbF9pbmZvLT52c19hcmJfY29uc3RhbnRzRik7CiAgICAgICAgICAgIGdsX2luZm8tPnZzX2dsc2xfY29uc3RhbnRzRiA9IGdsX2luZm8tPnZzX2FyYl9jb25zdGFudHNGOwogICAgICAgIH0KCiAgICAgICAgLyogTWFjT1MgYWR2ZXJ0aXNlcyBHTF9BUkJfdGV4dHVyZV9ub25fcG93ZXJfb2ZfdHdvIG9uIEFUSSByNTAwIGFuZCBlYXJsaWVyIGNhcmRzLCBhbHRob3VnaAogICAgICAgICAqIHRoZXNlIGNhcmRzIG9ubHkgc3VwcG9ydCBHTF9BUkJfdGV4dHVyZV9yZWN0YW5nbGUoRDNEUFRFWFRVUkVDQVBTX05PTlBPVzJDT05ESVRJT05BTCkuCiAgICAgICAgICogSWYgcmVhbCBOUDIgdGV4dHVyZXMgYXJlIHVzZWQsIHRoZSBkcml2ZXIgZmFsbHMgYmFjayB0byBzb2Z0d2FyZS4gU28gcmVtb3ZlIHRoZSBzdXBwb3J0ZWQKICAgICAgICAgKiBmbGFnIGZvciB0aGlzIGV4dGVuc2lvbgogICAgICAgICAqLwogICAgICAgIGlmKGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfVEVYVFVSRV9OT05fUE9XRVJfT0ZfVFdPXSAmJiBnbF9pbmZvLT5nbF92ZW5kb3IgPT0gVkVORE9SX0FUSSkgewogICAgICAgICAgICBpZihnbF9pbmZvLT5nbF9jYXJkID09IENBUkRfQVRJX1JBREVPTl9YNzAwIHx8IGdsX2luZm8tPmdsX2NhcmQgPT0gQ0FSRF9BVElfUkFERU9OX1gxNjAwIHx8CiAgICAgICAgICAgICAgIGdsX2luZm8tPmdsX2NhcmQgPT0gQ0FSRF9BVElfUkFERU9OXzk1MDAgfHwgZ2xfaW5mby0+Z2xfY2FyZCA9PSBDQVJEX0FUSV9SQURFT05fODUwMCAgfHwKICAgICAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCA9PSBDQVJEX0FUSV9SQURFT05fNzIwMCB8fCBnbF9pbmZvLT5nbF9jYXJkID09IENBUkRfQVRJX1JBR0VfMTI4UFJPKSB7CiAgICAgICAgICAgICAgICBUUkFDRSgiR0xfQVJCX3RleHR1cmVfbm9uX3Bvd2VyX29mX3R3byBhZHZlcnRpc2VkIG9uIFI1MDAgb3IgZWFybGllciBjYXJkLCByZW1vdmluZ1xuIik7CiAgICAgICAgICAgICAgICBnbF9pbmZvLT5zdXBwb3J0ZWRbQVJCX1RFWFRVUkVfTk9OX1BPV0VSX09GX1RXT10gPSBGQUxTRTsKICAgICAgICAgICAgICAgIGdsX2luZm8tPnN1cHBvcnRlZFtBUkJfVEVYVFVSRV9SRUNUQU5HTEVdID0gVFJVRTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyogVGhlIEludGVsIEdQVXMgb24gTWFjT1Mgc2V0IHRoZSAudyByZWdpc3RlciBvZiB0ZXhjb29yZHMgdG8gMC4wIGJ5IGRlZmF1bHQsIHdoaWNoIGNhdXNlcyBwcm9ibGVtcwogICAgICAgICAqIHdpdGggZml4ZWQgZnVuY3Rpb24gZnJhZ21lbnQgcHJvY2Vzc2luZy4gSWRlYWxseSB0aGlzIGZsYWcgc2hvdWxkIGJlIGRldGVjdGVkIHdpdGggYSB0ZXN0IHNoYWRlcgogICAgICAgICAqIGFuZCBPcGVuR0wgZmVlZGJhY2sgbW9kZSwgYnV0IHNvbWUgR0wgaW1wbGVtZW50YXRpb25zIChNYWNPUyBBVEkgYXQgbGVhc3QsIHByb2JhYmx5IGFsbCBNYWNPUyBvbmVzKQogICAgICAgICAqIGRvIG5vdCBsaWtlIHZlcnRleCBzaGFkZXJzIGluIGZlZWRiYWNrIG1vZGUgYW5kIHJldHVybiBhbiBlcnJvciwgZXZlbiB0aG91Z2ggaXQgc2hvdWxkIGJlIHZhbGlkCiAgICAgICAgICogYWNjb3JkaW5nIHRvIHRoZSBzcGVjLgogICAgICAgICAqCiAgICAgICAgICogV2UgZG9uJ3Qgd2FudCB0byBlbmFibGUgdGhpcyBvbiBhbGwgY2FyZHMsIGFzIGl0IGFkZHMgYW4gZXh0cmEgaW5zdHJ1Y3Rpb24gcGVyIHRleGNvb3JkIHVzZWQuIFRoaXMKICAgICAgICAgKiBtYWtlcyB0aGUgc2hhZGVyIHNsb3dlciBhbmQgZWF0cyBpbnN0cnVjdGlvbiBzbG90cyB3aGljaCBzaG91bGQgYmUgYXZhaWxhYmxlIHRvIHRoZSBkM2QgYXBwLgogICAgICAgICAqCiAgICAgICAgICogQVRJIFJhZGVvbiBIRCAyeHh4IGNhcmRzIG9uIE1hY09TIGhhdmUgdGhlIGlzc3VlLiBJbnN0ZWFkIG9mIGNoZWNraW5nIGZvciB0aGUgYnVnZ3kgY2FyZHMsIGJsYWNrbGlzdAogICAgICAgICAqIGFsbCByYWRlb24gY2FyZHMgb24gTWFjcyBhbmQgd2hpdGVsaXN0IHRoZSBnb29kIG9uZXMuIFRoYXQgd2F5IHdlJ3JlIHByZXBhcmVkIGZvciB0aGUgZnV0dXJlLiBJZgogICAgICAgICAqIHRoaXMgd29ya2Fyb3VuZCBpcyBhY3RpdmF0ZWQgb24gY2FyZHMgdGhhdCBkbyBub3QgbmVlZCBpdCwgaXQgd29uJ3QgYnJlYWsgdGhpbmdzLCBqdXN0IGFmZmVjdAogICAgICAgICAqIHBlcmZvcm1hbmNlIG5lZ2F0aXZlbHkuCiAgICAgICAgICovCiAgICAgICAgaWYoZ2xfaW5mby0+Z2xfdmVuZG9yID09IFZFTkRPUl9JTlRFTCB8fAogICAgICAgICAgIChnbF9pbmZvLT5nbF92ZW5kb3IgPT0gVkVORE9SX0FUSSAmJiBnbF9pbmZvLT5nbF9jYXJkICE9IENBUkRfQVRJX1JBREVPTl9YMTYwMCkpIHsKICAgICAgICAgICAgVFJBQ0UoIkVuYWJsaW5nIHZlcnRleCB0ZXh0dXJlIGNvb3JkIGZpeGVzIGluIHZlcnRleCBzaGFkZXJzXG4iKTsKICAgICAgICAgICAgZ2xfaW5mby0+c2V0X3RleGNvb3JkX3cgPSBUUlVFOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBGaW5kIG91dCBpZiBQQk9zIHdvcmsgYXMgdGhleSBhcmUgc3VwcG9zZWQgdG8gKi8KICAgIHRlc3RfcGJvX2Z1bmN0aW9uYWxpdHkoZ2xfaW5mbyk7CgogICAgLyogRml4dXAgdGhlIGRyaXZlciB2ZXJzaW9uICovCiAgICBmb3IoaSA9IDA7IGkgPCAoc2l6ZW9mKGRyaXZlcl92ZXJzaW9uX3RhYmxlKSAvIHNpemVvZihkcml2ZXJfdmVyc2lvbl90YWJsZVswXSkpOyBpKyspIHsKICAgICAgICBpZihnbF9pbmZvLT5nbF92ZW5kb3IgPT0gZHJpdmVyX3ZlcnNpb25fdGFibGVbaV0udmVuZG9yICYmCiAgICAgICAgICAgZ2xfaW5mby0+Z2xfY2FyZCAgID09IGRyaXZlcl92ZXJzaW9uX3RhYmxlW2ldLmNhcmQpIHsKICAgICAgICAgICAgVFJBQ0VfKGQzZF9jYXBzKSgiRm91bmQgY2FyZCAweCUwNHgsIDB4JTA0eCBpbiBkcml2ZXIgdmVyc2lvbiBEQlxuIiwgZ2xfaW5mby0+Z2xfdmVuZG9yLCBnbF9pbmZvLT5nbF9jYXJkKTsKCiAgICAgICAgICAgIGdsX2luZm8tPmRyaXZlcl92ZXJzaW9uICAgICAgICA9IE1BS0VEV09SRF9WRVJTSU9OKGRyaXZlcl92ZXJzaW9uX3RhYmxlW2ldLmxvcGFydF9oaSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJpdmVyX3ZlcnNpb25fdGFibGVbaV0ubG9wYXJ0X2xvKTsKICAgICAgICAgICAgZ2xfaW5mby0+ZHJpdmVyX3ZlcnNpb25faGlwYXJ0ID0gTUFLRURXT1JEX1ZFUlNJT04oZHJpdmVyX3ZlcnNpb25fdGFibGVbaV0uaGlwYXJ0X2hpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcml2ZXJfdmVyc2lvbl90YWJsZVtpXS5oaXBhcnRfbG8pOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICB9Cn0KCnZvaWQgaW52YWxpZF9mdW5jKHZvaWQgKmRhdGEpIHsKICAgIEVSUigiSW52YWxpZCB2ZXJ0ZXggYXR0cmlidXRlIGZ1bmN0aW9uIGNhbGxlZFxuIik7CiAgICBEZWJ1Z0JyZWFrKCk7Cn0KCiNkZWZpbmUgR0xJTkZPX0xPQ0FUSU9OIChBZGFwdGVyc1swXS5nbF9pbmZvKQoKLyogSGVscGVyIGZ1bmN0aW9ucyBmb3IgcHJvdmlkaW5nIHZlcnRleCBkYXRhIHRvIG9wZW5nbC4gVGhlIGFycmF5cyBhcmUgaW5pdGlhbGl6ZWQgYmFzZWQgb24KICogdGhlIGV4dGVuc2lvbiBkZXRlY3Rpb24gYW5kIGFyZSB1c2VkIGluIGRyYXdTdHJpZGVkU2xvdwogKi8Kc3RhdGljIHZvaWQgcG9zaXRpb25fZDNkY29sb3Iodm9pZCAqZGF0YSkgewogICAgRFdPUkQgcG9zID0gKigoRFdPUkQgKikgZGF0YSk7CgogICAgRklYTUUoIkFkZCBhIHRlc3QgZm9yIGZpeGVkIGZ1bmN0aW9uIHBvc2l0aW9uIGZyb20gZDNkY29sb3IgdHlwZVxuIik7CiAgICBnbFZlcnRleDRzKEQzRENPTE9SX0JfUihwb3MpLAogICAgICAgICAgICAgICBEM0RDT0xPUl9CX0cocG9zKSwKICAgICAgICAgICAgICAgRDNEQ09MT1JfQl9CKHBvcyksCiAgICAgICAgICAgICAgIEQzRENPTE9SX0JfQShwb3MpKTsKfQpzdGF0aWMgdm9pZCBwb3NpdGlvbl9mbG9hdDQodm9pZCAqZGF0YSkgewogICAgR0xmbG9hdCAqcG9zID0gKGZsb2F0ICopIGRhdGE7CgogICAgaWYgKHBvc1szXSA8IGVwcyAmJiBwb3NbM10gPiAtZXBzKQogICAgICAgIGdsVmVydGV4M2Z2KHBvcyk7CiAgICBlbHNlIHsKICAgICAgICBmbG9hdCB3ID0gMS4wIC8gcG9zWzNdOwoKICAgICAgICBnbFZlcnRleDRmKHBvc1swXSAqIHcsIHBvc1sxXSAqIHcsIHBvc1syXSAqIHcsIHcpOwogICAgfQp9CgpzdGF0aWMgdm9pZCBkaWZmdXNlX2QzZGNvbG9yKHZvaWQgKmRhdGEpIHsKICAgIERXT1JEIGRpZmZ1c2VDb2xvciA9ICooKERXT1JEICopIGRhdGEpOwoKICAgIGdsQ29sb3I0dWIoRDNEQ09MT1JfQl9SKGRpZmZ1c2VDb2xvciksCiAgICAgICAgICAgICAgIEQzRENPTE9SX0JfRyhkaWZmdXNlQ29sb3IpLAogICAgICAgICAgICAgICBEM0RDT0xPUl9CX0IoZGlmZnVzZUNvbG9yKSwKICAgICAgICAgICAgICAgRDNEQ09MT1JfQl9BKGRpZmZ1c2VDb2xvcikpOwp9CgpzdGF0aWMgdm9pZCBzcGVjdWxhcl9kM2Rjb2xvcih2b2lkICpkYXRhKSB7CiAgICBEV09SRCBzcGVjdWxhckNvbG9yID0gKigoRFdPUkQgKikgZGF0YSk7CgogICAgR0xfRVhUQ0FMTChnbFNlY29uZGFyeUNvbG9yM3ViRVhUKShEM0RDT0xPUl9CX1Ioc3BlY3VsYXJDb2xvciksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEQzRENPTE9SX0JfRyhzcGVjdWxhckNvbG9yKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRDNEQ09MT1JfQl9CKHNwZWN1bGFyQ29sb3IpKTsKfQpzdGF0aWMgdm9pZCB3YXJuX25vX3NwZWN1bGFyX2Z1bmModm9pZCAqZGF0YSkgewogICAgV0FSTigiR0xfRVhUX3NlY29uZGFyeV9jb2xvciBub3Qgc3VwcG9ydGVkXG4iKTsKfQoKdm9pZCBmaWxsR0xBdHRyaWJGdW5jcyhXaW5lRDNEX0dMX0luZm8gKmdsX2luZm8pIHsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDFdICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQyXSAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgcG9zaXRpb25fZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUM10gICAgICA9ICh2b2lkICopIGdsVmVydGV4M2Z2OwogICAgcG9zaXRpb25fZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUNF0gICAgICA9ICh2b2lkICopIHBvc2l0aW9uX2Zsb2F0NDsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9EM0RDT0xPUl0gICAgPSAodm9pZCAqKSBwb3NpdGlvbl9kM2Rjb2xvcjsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VQllURTRdICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfU0hPUlQyXSAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgcG9zaXRpb25fZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUNF0gICAgICA9ICh2b2lkICopIGdsVmVydGV4MnN2OwogICAgcG9zaXRpb25fZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VCWVRFNE5dICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9TSE9SVDJOXSAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfU0hPUlQ0Tl0gICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgcG9zaXRpb25fZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VTSE9SVDJOXSAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VU0hPUlQ0Tl0gICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVURFQzNdICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgcG9zaXRpb25fZnVuY3NbV0lORUQzRERFQ0xUWVBFX0RFQzNOXSAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHBvc2l0aW9uX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDE2XzJdICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBwb3NpdGlvbl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQxNl80XSAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwoKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUMV0gICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBkaWZmdXNlX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDJdICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgZGlmZnVzZV9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQzXSAgICAgICA9ICh2b2lkICopIGdsQ29sb3IzZnY7CiAgICBkaWZmdXNlX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDRdICAgICAgID0gKHZvaWQgKikgZ2xDb2xvcjRmdjsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0QzRENPTE9SXSAgICAgPSAodm9pZCAqKSBkaWZmdXNlX2QzZGNvbG9yOwogICAgZGlmZnVzZV9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVUJZVEU0XSAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUMl0gICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBkaWZmdXNlX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9TSE9SVDRdICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgZGlmZnVzZV9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVUJZVEU0Tl0gICAgICA9ICh2b2lkICopIGdsQ29sb3I0dWJ2OwogICAgZGlmZnVzZV9mdW5jc1tXSU5FRDNEREVDTFRZUEVfU0hPUlQyTl0gICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUNE5dICAgICAgPSAodm9pZCAqKSBnbENvbG9yNHN2OwogICAgZGlmZnVzZV9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVVNIT1JUMk5dICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VTSE9SVDROXSAgICAgPSAodm9pZCAqKSBnbENvbG9yNHVzdjsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VERUMzXSAgICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBkaWZmdXNlX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9ERUMzTl0gICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgZGlmZnVzZV9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQxNl8yXSAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIGRpZmZ1c2VfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUMTZfNF0gICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CgogICAgLyogTm8gNCBjb21wb25lbnQgZW50cnkgcG9pbnRzIGhlcmUgKi8KICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDFdICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQyXSAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgaWYoR0xfU1VQUE9SVChFWFRfU0VDT05EQVJZX0NPTE9SKSkgewogICAgICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDNdICAgICAgPSAodm9pZCAqKSBHTF9FWFRDQUxMKGdsU2Vjb25kYXJ5Q29sb3IzZnZFWFQpOwogICAgfSBlbHNlIHsKICAgICAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQzXSAgICAgID0gKHZvaWQgKikgd2Fybl9ub19zcGVjdWxhcl9mdW5jOwogICAgfQogICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUNF0gICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIGlmKEdMX1NVUFBPUlQoRVhUX1NFQ09OREFSWV9DT0xPUikpIHsKICAgICAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRDNEQ09MT1JdICAgID0gKHZvaWQgKikgc3BlY3VsYXJfZDNkY29sb3I7CiAgICB9IGVsc2UgewogICAgICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9EM0RDT0xPUl0gICAgICA9ICh2b2lkICopIHdhcm5fbm9fc3BlY3VsYXJfZnVuYzsKICAgIH0KICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VQllURTRdICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfU0hPUlQyXSAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUNF0gICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VQllURTROXSAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfU0hPUlQyTl0gICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUNE5dICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VU0hPUlQyTl0gICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVVNIT1JUNE5dICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VERUMzXSAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIHNwZWN1bGFyX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9ERUMzTl0gICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBzcGVjdWxhcl9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQxNl8yXSAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgc3BlY3VsYXJfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUMTZfNF0gICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKCiAgICAvKiBPbmx5IDMgY29tcG9uZW50IGVudHJ5IHBvaW50cyBoZXJlLiBUZXN0IGhvdyBvdGhlcnMgYmVoYXZlLiBGbG9hdDQgbm9ybWFscyBhcmUgdXNlZAogICAgICogYnkgb25lIG9mIG91ciB0ZXN0cywgdHJ5aW5nIHRvIHBhc3MgaXQgdG8gdGhlIHBpeGVsIHNoYWRlciwgd2hpY2ggZmFpbHMgb24gV2luZG93cy4KICAgICAqLwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDFdICAgICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUMl0gICAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIG5vcm1hbF9mdW5jc1tXSU5FRDNEREVDTFRZUEVfRkxPQVQzXSAgICAgICAgID0gKHZvaWQgKikgZ2xOb3JtYWwzZnY7CiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUNF0gICAgICAgICA9ICh2b2lkICopIGdsTm9ybWFsM2Z2OyAvKiBKdXN0IGlnbm9yZSB0aGUgNHRoIHZhbHVlICovCiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0QzRENPTE9SXSAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIG5vcm1hbF9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVUJZVEU0XSAgICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9TSE9SVDJdICAgICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUNF0gICAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIG5vcm1hbF9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVUJZVEU0Tl0gICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9TSE9SVDJOXSAgICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1NIT1JUNE5dICAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIG5vcm1hbF9mdW5jc1tXSU5FRDNEREVDTFRZUEVfVVNIT1JUMk5dICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9VU0hPUlQ0Tl0gICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX1VERUMzXSAgICAgICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKICAgIG5vcm1hbF9mdW5jc1tXSU5FRDNEREVDTFRZUEVfREVDM05dICAgICAgICAgID0gKHZvaWQgKikgaW52YWxpZF9mdW5jOwogICAgbm9ybWFsX2Z1bmNzW1dJTkVEM0RERUNMVFlQRV9GTE9BVDE2XzJdICAgICAgPSAodm9pZCAqKSBpbnZhbGlkX2Z1bmM7CiAgICBub3JtYWxfZnVuY3NbV0lORUQzRERFQ0xUWVBFX0ZMT0FUMTZfNF0gICAgICA9ICh2b2lkICopIGludmFsaWRfZnVuYzsKfQoKI2RlZmluZSBQVVNIMShhdHQpICAgICAgICBhdHRyaWJzW25BdHRyaWJzKytdID0gKGF0dCk7CkJPT0wgSW5pdEFkYXB0ZXJzKHZvaWQpIHsKICAgIHN0YXRpYyBITU9EVUxFIG1vZF9nbDsKICAgIEJPT0wgcmV0OwogICAgaW50IHBzX3NlbGVjdGVkX21vZGUsIHZzX3NlbGVjdGVkX21vZGU7CgogICAgLyogTm8gbmVlZCB0byBob2xkIGFueSBsb2NrLiBUaGUgY2FsbGluZyBsaWJyYXJ5IG1ha2VzIHN1cmUgb25seSBvbmUgdGhyZWFkIGNhbGxzCiAgICAgKiB3aW5lZDNkIHNpbXVsdGFuZW91c2x5CiAgICAgKi8KICAgIGlmKG51bUFkYXB0ZXJzID4gMCkgcmV0dXJuIEFkYXB0ZXJzWzBdLm9wZW5nbDsKCiAgICBUUkFDRSgiSW5pdGlhbGl6aW5nIGFkYXB0ZXJzXG4iKTsKCiAgICBpZighbW9kX2dsKSB7CiNpZmRlZiBVU0VfV0lOMzJfT1BFTkdMCiNkZWZpbmUgVVNFX0dMX0ZVTkMocGZuKSBwZm4gPSAodm9pZCopR2V0UHJvY0FkZHJlc3MobW9kX2dsLCAjcGZuKTsKICAgICAgICBtb2RfZ2wgPSBMb2FkTGlicmFyeUEoIm9wZW5nbDMyLmRsbCIpOwogICAgICAgIGlmKCFtb2RfZ2wpIHsKICAgICAgICAgICAgRVJSKCJDYW4ndCBsb2FkIG9wZW5nbDMyLmRsbCFcbiIpOwogICAgICAgICAgICBnb3RvIG5vZ2xfYWRhcHRlcjsKICAgICAgICB9CiNlbHNlCiNkZWZpbmUgVVNFX0dMX0ZVTkMocGZuKSBwZm4gPSAodm9pZCopcHdnbEdldFByb2NBZGRyZXNzKCNwZm4pOwogICAgICAgIC8qIFRvIGJ5cGFzcyB0aGUgb3BlbmdsMzIgdGh1bmtzIGxvYWQgd2dsR2V0UHJvY0FkZHJlc3MgZnJvbSBnZGkzMiAoZ2xYR2V0UHJvY0FkZHJlc3Mgd3JhcHBlcikgaW5zdGVhZCBvZiBvcGVuZ2wzMidzICovCiAgICAgICAgbW9kX2dsID0gR2V0TW9kdWxlSGFuZGxlQSgiZ2RpMzIuZGxsIik7CiNlbmRpZgogICAgfQoKLyogTG9hZCBXR0wgY29yZSBmdW5jdGlvbnMgZnJvbSBvcGVuZ2wzMi5kbGwgKi8KI2RlZmluZSBVU0VfV0dMX0ZVTkMocGZuKSBwIyNwZm4gPSAodm9pZCopR2V0UHJvY0FkZHJlc3MobW9kX2dsLCAjcGZuKTsKICAgIFdHTF9GVU5DU19HRU47CiN1bmRlZiBVU0VfV0dMX0ZVTkMKCiAgICBpZighcHdnbEdldFByb2NBZGRyZXNzKSB7CiAgICAgICAgRVJSKCJVbmFibGUgdG8gbG9hZCB3Z2xHZXRQcm9jQWRkcmVzcyFcbiIpOwogICAgICAgIGdvdG8gbm9nbF9hZGFwdGVyOwogICAgfQoKLyogRHluYW1pY2FsbHkgbG9hZCBhbGwgR0wgY29yZSBmdW5jdGlvbnMgKi8KICAgIEdMX0ZVTkNTX0dFTjsKI3VuZGVmIFVTRV9HTF9GVU5DCgogICAgLyogRm9yIG5vdyBvbmx5IG9uZSBkZWZhdWx0IGFkYXB0ZXIgKi8KICAgIHsKICAgICAgICBpbnQgaVBpeGVsRm9ybWF0OwogICAgICAgIGludCBhdHRyaWJzWzEwXTsKICAgICAgICBpbnQgdmFsdWVzWzEwXTsKICAgICAgICBpbnQgbkF0dHJpYnMgPSAwOwogICAgICAgIGludCByZXM7CiAgICAgICAgV2luZUQzRF9QaXhlbEZvcm1hdCAqY2ZnczsKICAgICAgICBpbnQgYXR0cmlidXRlOwogICAgICAgIERJU1BMQVlfREVWSUNFVyBEaXNwbGF5RGV2aWNlOwogICAgICAgIEhEQyBoZGM7CgogICAgICAgIFRSQUNFKCJJbml0aWFsaXppbmcgZGVmYXVsdCBhZGFwdGVyXG4iKTsKICAgICAgICBBZGFwdGVyc1swXS5udW0gPSAwOwogICAgICAgIEFkYXB0ZXJzWzBdLm1vbml0b3JQb2ludC54ID0gLTE7CiAgICAgICAgQWRhcHRlcnNbMF0ubW9uaXRvclBvaW50LnkgPSAtMTsKCiAgICAgICAgaWYgKCFXaW5lRDNEX0NyZWF0ZUZha2VHTENvbnRleHQoKSkgewogICAgICAgICAgICBFUlIoIkZhaWxlZCB0byBnZXQgYSBnbCBjb250ZXh0IGZvciBkZWZhdWx0IGFkYXB0ZXJcbiIpOwogICAgICAgICAgICBXaW5lRDNEX1JlbGVhc2VGYWtlR0xDb250ZXh0KCk7CiAgICAgICAgICAgIGdvdG8gbm9nbF9hZGFwdGVyOwogICAgICAgIH0KCiAgICAgICAgcmV0ID0gSVdpbmVEM0RJbXBsX0ZpbGxHTENhcHMoJkFkYXB0ZXJzWzBdLmdsX2luZm8pOwogICAgICAgIGlmKCFyZXQpIHsKICAgICAgICAgICAgRVJSKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBnbCBjYXBzIGZvciBkZWZhdWx0IGFkYXB0ZXJcbiIpOwogICAgICAgICAgICBXaW5lRDNEX1JlbGVhc2VGYWtlR0xDb250ZXh0KCk7CiAgICAgICAgICAgIGdvdG8gbm9nbF9hZGFwdGVyOwogICAgICAgIH0KICAgICAgICByZXQgPSBpbml0UGl4ZWxGb3JtYXRzKCZBZGFwdGVyc1swXS5nbF9pbmZvKTsKICAgICAgICBpZighcmV0KSB7CiAgICAgICAgICAgIEVSUigiRmFpbGVkIHRvIGluaXQgZ2wgZm9ybWF0c1xuIik7CiAgICAgICAgICAgIFdpbmVEM0RfUmVsZWFzZUZha2VHTENvbnRleHQoKTsKICAgICAgICAgICAgZ290byBub2dsX2FkYXB0ZXI7CiAgICAgICAgfQoKICAgICAgICBoZGMgPSBwd2dsR2V0Q3VycmVudERDKCk7CiAgICAgICAgaWYoIWhkYykgewogICAgICAgICAgICBFUlIoIkZhaWxlZCB0byBnZXQgZ2wgSERDXG4iKTsKICAgICAgICAgICAgV2luZUQzRF9SZWxlYXNlRmFrZUdMQ29udGV4dCgpOwogICAgICAgICAgICBnb3RvIG5vZ2xfYWRhcHRlcjsKICAgICAgICB9CgogICAgICAgIEFkYXB0ZXJzWzBdLmRyaXZlciA9ICJEaXNwbGF5IjsKICAgICAgICBBZGFwdGVyc1swXS5kZXNjcmlwdGlvbiA9ICJEaXJlY3QzRCBIQUwiOwoKICAgICAgICAvKiBVc2UgdGhlIFZpZGVvUmFtU2l6ZSByZWdpc3RyeSBzZXR0aW5nIHdoZW4gc2V0ICovCiAgICAgICAgaWYod2luZWQzZF9zZXR0aW5ncy5lbXVsYXRlZF90ZXh0dXJlcmFtKQogICAgICAgICAgICBBZGFwdGVyc1swXS5UZXh0dXJlUmFtID0gd2luZWQzZF9zZXR0aW5ncy5lbXVsYXRlZF90ZXh0dXJlcmFtOwogICAgICAgIGVsc2UKICAgICAgICAgICAgQWRhcHRlcnNbMF0uVGV4dHVyZVJhbSA9IEFkYXB0ZXJzWzBdLmdsX2luZm8udmlkbWVtOwogICAgICAgIEFkYXB0ZXJzWzBdLlVzZWRUZXh0dXJlUmFtID0gMDsKICAgICAgICBUUkFDRSgiRW11bGF0aW5nICVkTUIgb2YgdGV4dHVyZSByYW1cbiIsIEFkYXB0ZXJzWzBdLlRleHR1cmVSYW0vKDEwMjQqMTAyNCkpOwoKICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBBZGFwdGVyJ3MgRGV2aWNlTmFtZSB3aGljaCBpcyByZXF1aXJlZCBmb3IgQ2hhbmdlRGlzcGxheVNldHRpbmdzIGFuZCBmcmllbmRzICovCiAgICAgICAgRGlzcGxheURldmljZS5jYiA9IHNpemVvZihEaXNwbGF5RGV2aWNlKTsKICAgICAgICBFbnVtRGlzcGxheURldmljZXNXKE5VTEwsIDAgLyogQWRhcHRlciAwID0gaURldk51bSAwICovLCAmRGlzcGxheURldmljZSwgMCk7CiAgICAgICAgVFJBQ0UoIkRldmljZU5hbWU6ICVzXG4iLCBkZWJ1Z3N0cl93KERpc3BsYXlEZXZpY2UuRGV2aWNlTmFtZSkpOwogICAgICAgIHN0cmNweVcoQWRhcHRlcnNbMF0uRGV2aWNlTmFtZSwgRGlzcGxheURldmljZS5EZXZpY2VOYW1lKTsKCiAgICAgICAgYXR0cmlidXRlID0gV0dMX05VTUJFUl9QSVhFTF9GT1JNQVRTX0FSQjsKICAgICAgICBHTF9FWFRDQUxMKHdnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIoaGRjLCAwLCAwLCAxLCAmYXR0cmlidXRlLCAmQWRhcHRlcnNbMF0ubkNmZ3MpKTsKCiAgICAgICAgQWRhcHRlcnNbMF0uY2ZncyA9IEhlYXBBbGxvYyhHZXRQcm9jZXNzSGVhcCgpLCBIRUFQX1pFUk9fTUVNT1JZLCBBZGFwdGVyc1swXS5uQ2ZncyAqc2l6ZW9mKFdpbmVEM0RfUGl4ZWxGb3JtYXQpKTsKICAgICAgICBjZmdzID0gQWRhcHRlcnNbMF0uY2ZnczsKICAgICAgICBQVVNIMShXR0xfUkVEX0JJVFNfQVJCKQogICAgICAgIFBVU0gxKFdHTF9HUkVFTl9CSVRTX0FSQikKICAgICAgICBQVVNIMShXR0xfQkxVRV9CSVRTX0FSQikKICAgICAgICBQVVNIMShXR0xfQUxQSEFfQklUU19BUkIpCiAgICAgICAgUFVTSDEoV0dMX0RFUFRIX0JJVFNfQVJCKQogICAgICAgIFBVU0gxKFdHTF9TVEVOQ0lMX0JJVFNfQVJCKQogICAgICAgIFBVU0gxKFdHTF9EUkFXX1RPX1dJTkRPV19BUkIpCiAgICAgICAgUFVTSDEoV0dMX1BJWEVMX1RZUEVfQVJCKQogICAgICAgIFBVU0gxKFdHTF9ET1VCTEVfQlVGRkVSX0FSQikKICAgICAgICBQVVNIMShXR0xfQVVYX0JVRkZFUlNfQVJCKQoKICAgICAgICBmb3IoaVBpeGVsRm9ybWF0PTE7IGlQaXhlbEZvcm1hdDw9QWRhcHRlcnNbMF0ubkNmZ3M7IGlQaXhlbEZvcm1hdCsrKSB7CiAgICAgICAgICAgIHJlcyA9IEdMX0VYVENBTEwod2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQihoZGMsIGlQaXhlbEZvcm1hdCwgMCwgbkF0dHJpYnMsIGF0dHJpYnMsIHZhbHVlcykpOwoKICAgICAgICAgICAgaWYoIXJlcykKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwoKICAgICAgICAgICAgLyogQ2FjaGUgdGhlIHBpeGVsIGZvcm1hdCAqLwogICAgICAgICAgICBjZmdzLT5pUGl4ZWxGb3JtYXQgPSBpUGl4ZWxGb3JtYXQ7CiAgICAgICAgICAgIGNmZ3MtPnJlZFNpemUgPSB2YWx1ZXNbMF07CiAgICAgICAgICAgIGNmZ3MtPmdyZWVuU2l6ZSA9IHZhbHVlc1sxXTsKICAgICAgICAgICAgY2Zncy0+Ymx1ZVNpemUgPSB2YWx1ZXNbMl07CiAgICAgICAgICAgIGNmZ3MtPmFscGhhU2l6ZSA9IHZhbHVlc1szXTsKICAgICAgICAgICAgY2Zncy0+ZGVwdGhTaXplID0gdmFsdWVzWzRdOwogICAgICAgICAgICBjZmdzLT5zdGVuY2lsU2l6ZSA9IHZhbHVlc1s1XTsKICAgICAgICAgICAgY2Zncy0+d2luZG93RHJhd2FibGUgPSB2YWx1ZXNbNl07CiAgICAgICAgICAgIGNmZ3MtPmlQaXhlbFR5cGUgPSB2YWx1ZXNbN107CiAgICAgICAgICAgIGNmZ3MtPmRvdWJsZUJ1ZmZlciA9IHZhbHVlc1s4XTsKICAgICAgICAgICAgY2Zncy0+YXV4QnVmZmVycyA9IHZhbHVlc1s5XTsKCiAgICAgICAgICAgIGNmZ3MtPnBidWZmZXJEcmF3YWJsZSA9IEZBTFNFOwogICAgICAgICAgICAvKiBDaGVjayBmb3IgcGJ1ZmZlciBzdXBwb3J0IHdoZW4gaXQgaXMgYXJvdW5kIGFzIHdnbEdldFBpeGVsRm9ybWF0QXR0cmliaXYgZmFpbHMgZm9yIHVua25vd24gYXR0cmlidXRlcy4gKi8KICAgICAgICAgICAgaWYoR0xfU1VQUE9SVChXR0xfQVJCX1BCVUZGRVIpKSB7CiAgICAgICAgICAgICAgICBpbnQgYXR0cmliID0gV0dMX0RSQVdfVE9fUEJVRkZFUl9BUkI7CiAgICAgICAgICAgICAgICBpbnQgdmFsdWU7CiAgICAgICAgICAgICAgICBpZihHTF9FWFRDQUxMKHdnbEdldFBpeGVsRm9ybWF0QXR0cmliaXZBUkIoaGRjLCBpUGl4ZWxGb3JtYXQsIDAsIDEsICZhdHRyaWIsICZ2YWx1ZSkpKQogICAgICAgICAgICAgICAgICAgIGNmZ3MtPnBidWZmZXJEcmF3YWJsZSA9IHZhbHVlOwogICAgICAgICAgICB9CgogICAgICAgICAgICBjZmdzLT5udW1TYW1wbGVzID0gMDsKICAgICAgICAgICAgLyogQ2hlY2sgbXVsdGlzYW1wbGUgc3VwcG9ydCAqLwogICAgICAgICAgICBpZihHTF9TVVBQT1JUKEFSQl9NVUxUSVNBTVBMRSkpIHsKICAgICAgICAgICAgICAgIGludCBhdHRyaWJbMl0gPSB7V0dMX1NBTVBMRV9CVUZGRVJTX0FSQiwgV0dMX1NBTVBMRVNfQVJCfTsKICAgICAgICAgICAgICAgIGludCB2YWx1ZVsyXTsKICAgICAgICAgICAgICAgIGlmKEdMX0VYVENBTEwod2dsR2V0UGl4ZWxGb3JtYXRBdHRyaWJpdkFSQihoZGMsIGlQaXhlbEZvcm1hdCwgMCwgMiwgYXR0cmliLCB2YWx1ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgLyogdmFsdWVbMF0gPSBXR0xfU0FNUExFX0JVRkZFUlNfQVJCIHdoaWNoIHRlbGxzIHdoZXRoZXIgbXVsdGlzYW1wbGluZyBpcyBzdXBwb3J0ZWQuCiAgICAgICAgICAgICAgICAgICAgICogdmFsdWVbMV0gPSBudW1iZXIgb2YgbXVsdGkgc2FtcGxlIGJ1ZmZlcnMqLwogICAgICAgICAgICAgICAgICAgIGlmKHZhbHVlWzBdKQogICAgICAgICAgICAgICAgICAgICAgICBjZmdzLT5udW1TYW1wbGVzID0gdmFsdWVbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIFRSQUNFKCJpUGl4ZWxGb3JtYXQ9JWQsIGlQaXhlbFR5cGU9JSN4LCBkb3VibGVCdWZmZXI9JWQsIFJHQkE9JWQvJWQvJWQvJWQsIGRlcHRoPSVkLCBzdGVuY2lsPSVkLCB3aW5kb3dEcmF3YWJsZT0lZCwgcGJ1ZmZlckRyYXdhYmxlPSVkXG4iLCBjZmdzLT5pUGl4ZWxGb3JtYXQsIGNmZ3MtPmlQaXhlbFR5cGUsIGNmZ3MtPmRvdWJsZUJ1ZmZlciwgY2Zncy0+cmVkU2l6ZSwgY2Zncy0+Z3JlZW5TaXplLCBjZmdzLT5ibHVlU2l6ZSwgY2Zncy0+YWxwaGFTaXplLCBjZmdzLT5kZXB0aFNpemUsIGNmZ3MtPnN0ZW5jaWxTaXplLCBjZmdzLT53aW5kb3dEcmF3YWJsZSwgY2Zncy0+cGJ1ZmZlckRyYXdhYmxlKTsKICAgICAgICAgICAgY2ZncysrOwogICAgICAgIH0KCiAgICAgICAgZml4dXBfZXh0ZW5zaW9ucygmQWRhcHRlcnNbMF0uZ2xfaW5mbyk7CgogICAgICAgIFdpbmVEM0RfUmVsZWFzZUZha2VHTENvbnRleHQoKTsKCiAgICAgICAgc2VsZWN0X3NoYWRlcl9tb2RlKCZBZGFwdGVyc1swXS5nbF9pbmZvLCBXSU5FRDNEREVWVFlQRV9IQUwsICZwc19zZWxlY3RlZF9tb2RlLCAmdnNfc2VsZWN0ZWRfbW9kZSk7CiAgICAgICAgc2VsZWN0X3NoYWRlcl9tYXhfY29uc3RhbnRzKHBzX3NlbGVjdGVkX21vZGUsIHZzX3NlbGVjdGVkX21vZGUsICZBZGFwdGVyc1swXS5nbF9pbmZvKTsKICAgICAgICBmaWxsR0xBdHRyaWJGdW5jcygmQWRhcHRlcnNbMF0uZ2xfaW5mbyk7CiAgICAgICAgaW5pdF90eXBlX2xvb2t1cCgmQWRhcHRlcnNbMF0uZ2xfaW5mbyk7CiAgICAgICAgQWRhcHRlcnNbMF0ub3BlbmdsID0gVFJVRTsKICAgIH0KICAgIG51bUFkYXB0ZXJzID0gMTsKICAgIFRSQUNFKCIlZCBhZGFwdGVycyBzdWNjZXNzZnVsbHkgaW5pdGlhbGl6ZWRcbiIsIG51bUFkYXB0ZXJzKTsKCiAgICByZXR1cm4gVFJVRTsKCm5vZ2xfYWRhcHRlcjoKICAgIC8qIEluaXRpYWxpemUgYW4gYWRhcHRlciBmb3IgZGRyYXctb25seSBtZW1vcnkgY291bnRpbmcgKi8KICAgIG1lbXNldChBZGFwdGVycywgMCwgc2l6ZW9mKEFkYXB0ZXJzKSk7CiAgICBBZGFwdGVyc1swXS5udW0gPSAwOwogICAgQWRhcHRlcnNbMF0ub3BlbmdsID0gRkFMU0U7CiAgICBBZGFwdGVyc1swXS5tb25pdG9yUG9pbnQueCA9IC0xOwogICAgQWRhcHRlcnNbMF0ubW9uaXRvclBvaW50LnkgPSAtMTsKCiAgICBBZGFwdGVyc1swXS5kcml2ZXIgPSAiRGlzcGxheSI7CiAgICBBZGFwdGVyc1swXS5kZXNjcmlwdGlvbiA9ICJXaW5lRDNEIERpcmVjdERyYXcgRW11bGF0aW9uIjsKICAgIGlmKHdpbmVkM2Rfc2V0dGluZ3MuZW11bGF0ZWRfdGV4dHVyZXJhbSkgewogICAgICAgIEFkYXB0ZXJzWzBdLlRleHR1cmVSYW0gPSB3aW5lZDNkX3NldHRpbmdzLmVtdWxhdGVkX3RleHR1cmVyYW07CiAgICB9IGVsc2UgewogICAgICAgIEFkYXB0ZXJzWzBdLlRleHR1cmVSYW0gPSA4ICogMTAyNCAqIDEwMjQ7IC8qIFRoaXMgaXMgcGxlbnR5IGZvciBhIEREcmF3LW9ubHkgY2FyZCAqLwogICAgfQoKICAgIG51bUFkYXB0ZXJzID0gMTsKICAgIHJldHVybiBGQUxTRTsKfQojdW5kZWYgUFVTSDEKI3VuZGVmIEdMSU5GT19MT0NBVElPTgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICogSVdpbmVEM0QgVlRibCBmb2xsb3dzCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKY29uc3QgSVdpbmVEM0RWdGJsIElXaW5lRDNEX1Z0YmwgPQp7CiAgICAvKiBJVW5rbm93biAqLwogICAgSVdpbmVEM0RJbXBsX1F1ZXJ5SW50ZXJmYWNlLAogICAgSVdpbmVEM0RJbXBsX0FkZFJlZiwKICAgIElXaW5lRDNESW1wbF9SZWxlYXNlLAogICAgLyogSVdpbmVEM0QgKi8KICAgIElXaW5lRDNESW1wbF9HZXRQYXJlbnQsCiAgICBJV2luZUQzREltcGxfR2V0QWRhcHRlckNvdW50LAogICAgSVdpbmVEM0RJbXBsX1JlZ2lzdGVyU29mdHdhcmVEZXZpY2UsCiAgICBJV2luZUQzREltcGxfR2V0QWRhcHRlck1vbml0b3IsCiAgICBJV2luZUQzREltcGxfR2V0QWRhcHRlck1vZGVDb3VudCwKICAgIElXaW5lRDNESW1wbF9FbnVtQWRhcHRlck1vZGVzLAogICAgSVdpbmVEM0RJbXBsX0dldEFkYXB0ZXJEaXNwbGF5TW9kZSwKICAgIElXaW5lRDNESW1wbF9HZXRBZGFwdGVySWRlbnRpZmllciwKICAgIElXaW5lRDNESW1wbF9DaGVja0RldmljZU11bHRpU2FtcGxlVHlwZSwKICAgIElXaW5lRDNESW1wbF9DaGVja0RlcHRoU3RlbmNpbE1hdGNoLAogICAgSVdpbmVEM0RJbXBsX0NoZWNrRGV2aWNlVHlwZSwKICAgIElXaW5lRDNESW1wbF9DaGVja0RldmljZUZvcm1hdCwKICAgIElXaW5lRDNESW1wbF9DaGVja0RldmljZUZvcm1hdENvbnZlcnNpb24sCiAgICBJV2luZUQzREltcGxfR2V0RGV2aWNlQ2FwcywKICAgIElXaW5lRDNESW1wbF9DcmVhdGVEZXZpY2UKfTsK