LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgQ29weXJpZ2h0IChDKSBNYXJ2ZWxsIEludGVybmF0aW9uYWwgTHRkLiBhbmQgaXRzIGFmZmlsaWF0ZXMKCiAgIFRoaXMgc29mdHdhcmUgZmlsZSAodGhlICJGaWxlIikgaXMgb3duZWQgYW5kIGRpc3RyaWJ1dGVkIGJ5IE1hcnZlbGwKICAgSW50ZXJuYXRpb25hbCBMdGQuIGFuZC9vciBpdHMgYWZmaWxpYXRlcyAoIk1hcnZlbGwiKSB1bmRlciB0aGUgZm9sbG93aW5nCiAgIGFsdGVybmF0aXZlIGxpY2Vuc2luZyB0ZXJtcy4gIE9uY2UgeW91IGhhdmUgbWFkZSBhbiBlbGVjdGlvbiB0byBkaXN0cmlidXRlIHRoZQogICBGaWxlIHVuZGVyIG9uZSBvZiB0aGUgZm9sbG93aW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCBwbGVhc2UgKGkpIGRlbGV0ZSB0aGlzCiAgIGludHJvZHVjdG9yeSBzdGF0ZW1lbnQgcmVnYXJkaW5nIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzLCAoaWkpIGRlbGV0ZSB0aGUgdHdvCiAgIGxpY2Vuc2UgYWx0ZXJuYXRpdmVzIHRoYXQgeW91IGhhdmUgbm90IGVsZWN0ZWQgdG8gdXNlIGFuZCAoaWlpKSBwcmVzZXJ2ZSB0aGUKICAgTWFydmVsbCBjb3B5cmlnaHQgbm90aWNlIGFib3ZlLgoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgTWFydmVsbCBDb21tZXJjaWFsIExpY2Vuc2UgT3B0aW9uCgogICBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCBhbmQgeW91IGhhdmUgZW50ZXJlZCBpbnRvIGEgY29tbWVyY2lhbAogICBsaWNlbnNlIGFncmVlbWVudCAoYSAiQ29tbWVyY2lhbCBMaWNlbnNlIikgd2l0aCBNYXJ2ZWxsLCB0aGUgRmlsZSBpcyBsaWNlbnNlZAogICB0byB5b3UgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBhcHBsaWNhYmxlIENvbW1lcmNpYWwgTGljZW5zZS4KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgIE1hcnZlbGwgR1BMIExpY2Vuc2UgT3B0aW9uCgogICBJZiB5b3UgcmVjZWl2ZWQgdGhpcyBGaWxlIGZyb20gTWFydmVsbCwgeW91IG1heSBvcHQgdG8gdXNlLCByZWRpc3RyaWJ1dGUgYW5kL29yCiAgIG1vZGlmeSB0aGlzIEZpbGUgaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR2VuZXJhbAogICBQdWJsaWMgTGljZW5zZSBWZXJzaW9uIDIsIEp1bmUgMTk5MSAodGhlICJHUEwgTGljZW5zZSIpLCBhIGNvcHkgb2Ygd2hpY2ggaXMKICAgYXZhaWxhYmxlIGFsb25nIHdpdGggdGhlIEZpbGUgaW4gdGhlIGxpY2Vuc2UudHh0IGZpbGUgb3IgYnkgd3JpdGluZyB0byB0aGUgRnJlZQogICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAwMjExMS0xMzA3IG9yCiAgIG9uIHRoZSB3b3JsZHdpZGUgd2ViIGF0IGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy9ncGwudHh0LgoKICAgVEhFIEZJTEUgSVMgRElTVFJJQlVURUQgQVMtSVMsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEFORCBUSEUgSU1QTElFRAogICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBPUiBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRVhQUkVTU0xZCiAgIERJU0NMQUlNRUQuICBUaGUgR1BMIExpY2Vuc2UgcHJvdmlkZXMgYWRkaXRpb25hbCBkZXRhaWxzIGFib3V0IHRoaXMgd2FycmFudHkKICAgZGlzY2xhaW1lci4KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgTWFydmVsbCBCU0QgTGljZW5zZSBPcHRpb24KCiAgIElmIHlvdSByZWNlaXZlZCB0aGlzIEZpbGUgZnJvbSBNYXJ2ZWxsLCB5b3UgbWF5IG9wdCB0byB1c2UsIHJlZGlzdHJpYnV0ZSBhbmQvb3IKICAgbW9kaWZ5IHRoaXMgRmlsZSB1bmRlciB0aGUgZm9sbG93aW5nIGxpY2Vuc2luZyB0ZXJtcy4KICAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0IG1vZGlmaWNhdGlvbiwKICAgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgoKKiAgIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwKICAgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgoKKiAgIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAgICAgICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogICAgICAgIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZSBkaXN0cmlidXRpb24uCgoqICAgTmVpdGhlciB0aGUgbmFtZSBvZiBNYXJ2ZWxsIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgICAgICB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0CiAgICAgICAgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgoKICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiIEFORAogICBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAogICBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCiAgIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IKICAgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTCiAgIChJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsKICAgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OCiAgIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCiAgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRiBUSElTCiAgIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwojaW5jbHVkZSAiY29uZmlnX21hcnZlbGwuaCIgICAgIC8qIFJlcXVpcmVkIHRvIGlkZW50aWZ5IFNPQyBhbmQgQm9hcmQgKi8KI2luY2x1ZGUgIm12SGlnaFNwZWVkRW52U3BlYy5oIgojaW5jbHVkZSAibXZIaWdoU3BlZWRUb3BvbG9neVNwZWMuaCIKI2luY2x1ZGUgIm12U3lzRW52TGliLmgiCiNpbmNsdWRlICJtdkN0cmxQZXguaCIKI2luY2x1ZGUgInByaW50Zi5oIgoKI2lmIGRlZmluZWQgKE1WODhGNjhYWCkKI2VsaWYgZGVmaW5lZCAoTVY4OEY2OVhYKQojZWxzZQojZXJyb3IgIk5vIGRldmljZSBpcyBkZWZpbmVkIgojZW5kaWYKCiNkZWZpbmUgU0xPV0RPV04gIG12T3NVRGVsYXkoNTApOwoKI2lmZGVmIFJFR0lTVEVSX1RSQUNFX0RFQlVHCnN0YXRpYyBNVl9VMzIgX01WX1JFR19SRUFEKE1WX1UzMiByZWdBZGRyKQp7CglwdXRzdHJpbmcoIlxuID4+PiAgICAgICBNVl9SRUdfUkVBRC4gIHJlZ0FkZHI9MHgiKTsKCXB1dGRhdGEoSU5URVJfUkVHU19CQVNFIHwgKHJlZ0FkZHIpLCA4KTsKCXB1dHN0cmluZygiIHJlZ0RhdGE9MHgiKTsKCU1WX1UzMiByZWdEYXRhID0gTVZfTUVNSU9fTEUzMl9SRUFEKChJTlRFUl9SRUdTX0JBU0UgfCAocmVnQWRkcikpKTsKCXB1dGRhdGEocmVnRGF0YSwgOCk7CgoJcmV0dXJuIHJlZ0RhdGE7Cn0KCnN0YXRpYyBNVl9WT0lEIF9NVl9SRUdfV1JJVEUoTVZfVTMyIHJlZ0FkZHIsIE1WX1UzMiByZWdEYXRhKQp7CglwdXRzdHJpbmcoIlxuID4+PiAgICAgICBNVl9SRUdfV1JJVEUuIHJlZ0FkZHI9MHgiKTsKCXB1dGRhdGEoSU5URVJfUkVHU19CQVNFIHwgKHJlZ0FkZHIpLCA4KTsKCXB1dHN0cmluZygiIHJlZ0RhdGE9MHgiKTsKCXB1dGRhdGEocmVnRGF0YSwgOCk7CglNVl9NRU1JT19MRTMyX1dSSVRFKChJTlRFUl9SRUdTX0JBU0UgfCAocmVnQWRkcikpLCAocmVnRGF0YSkpOwp9CgojdW5kZWYgTVZfUkVHX1dSSVRFCiN1bmRlZiBNVl9SRUdfUkVBRAoKI2RlZmluZSBNVl9SRUdfV1JJVEUgICAgX01WX1JFR19XUklURQojZGVmaW5lIE1WX1JFR19SRUFEICAgICBfTVZfUkVHX1JFQUQKI2VuZGlmIC8qUkVHSVNURVJfVFJBQ0VfREVCVUcqLwoKI2RlZmluZQlTRVJERVNfVkVSSU9OCSIyLjAiCiNkZWZpbmUgRU5ERURfT0sgIkhpZ2ggc3BlZWQgUEhZIC0gRW5kZWQgU3VjY2Vzc2Z1bGx5XG4iCgojZGVmaW5lIExJTktfV0FJVF9DTlRSICAxMDAKI2RlZmluZSBMSU5LX1dBSVRfU0xFRVAgMTAwCgojZGVmaW5lIE1BWF9VTklUX05VTUIgICAgIDQKI2RlZmluZSBUT1BPTE9HWV9URVNUX09LICAgICAgICAgICAwCiNkZWZpbmUgV1JPTkdfTlVNQkVSX09GX1VOSVRTICAgICAgMQojZGVmaW5lIFNFUkRFU19BTFJFQURZX0lOX1VTRSAgICAgIDIKI2RlZmluZSBVTklUX05VTUJFUl9WSU9MQVRJT04gICAgICAzCgovKiBTZXJkZXNMYW5lSW5Vc2VDb3VudCBjb250YWlucyB0aGUgZXhhY3QgYW1vdW50IG9mIHNlcmRlcyBsYW5lcyBuZWVkZWQgcGVyIHR5cGUgKi8KTVZfVTggU2VyZGVzTGFuZUluVXNlQ291bnRbTUFYX1VOSVRTX0lEXVtNQVhfVU5JVF9OVU1CXSA9CnsKCS8qIDAgIDEgIDIgIDMgICAgKi8KCXsgIDEsIDEsIDEsIDEgfSwgIC8qIFBFWCAgICAgKi8KCXsgIDEsIDEsIDEsIDEgfSwgIC8qIEVUSF9HSUcgKi8KCXsgIDEsIDEsIDAsIDAgfSwgIC8qIFVTQjNIICAgKi8KCXsgIDEsIDEsIDEsIDAgfSwgIC8qIFVTQjNEICAgKi8KCXsgIDEsIDEsIDEsIDEgfSwgIC8qIFNBVEEgICAgKi8KCXsgIDEsIDAsIDAsIDAgfSwgIC8qIFFTR01JSSAgKi8KCXsgIDQsIDAsIDAsIDAgfSwgIC8qIFhBVUkgICAgKi8KCXsgIDIsIDAsIDAsIDAgfSAgIC8qIFJYQVVJICAgKi8KfTsKCi8qIHNlcmRlc1VuaXRDb3VudCBjb3VudCB1bml0IG51bWJlci4gKGkuZSBhIHNpbmdsZSBYQVVJIGlzIGNvdW50ZWQgYXMgMSB1bml0KSAqLwpNVl9VOCBzZXJkZXNVbml0Q291bnRbTUFYX1VOSVRTX0lEXSA9IHswfTsKCi8qIFNlbGVjdG9yIG1hcHBpbmcgZm9yIEEzODAtQTAgYW5kIEEzOTAtWjEgKi8KTVZfVTggY29tbW9uUGh5c1NlbGVjdG9yc1NlcmRlc1JldjJNYXBbTEFTVF9TRVJERVNfVFlQRV1bTUFYX1NFUkRFU19MQU5FU10gPQp7CgkvKiAwICAgICAgMSAgICAgIDIgICAgICAgMyAgICAgICA0ICAgICAgIDUgICAgICAgNiAqLwoJeyAweDEsICAgMHgxLCAgICBOQSwJIE5BLAkgTkEsCSBOQSwgICAgIE5BICAgfSwgIC8qIFBFWDAgKi8KCXsgTkEsICAgIE5BLCAgICAgMHgxLAkgTkEsCSAweDEsCSBOQSwgICAgIDB4MSAgfSwgIC8qIFBFWDEgKi8KCXsgTkEsICAgIE5BLCAgICAgTkEsCSBOQSwJIDB4NywJIDB4MSwgICAgTkEJICB9LCAgLyogUEVYMiAqLwoJeyBOQSwgICAgTkEsICAgICBOQSwJIDB4MSwJIE5BLAkgTkEsICAgICBOQQkgIH0sICAvKiBQRVgzICovCgl7IDB4MiwgICAweDMsICAgIE5BLAkgTkEsCSBOQSwJIE5BLCAgICAgTkEJICB9LCAgLyogU0FUQTAgKi8KCXsgTkEsICAgIE5BLCAgICAgMHgzLAkgTkEsCSBOQSwJIE5BLCAgICAgTkEJICB9LCAgLyogU0FUQTEgKi8KCXsgTkEsICAgIE5BLCAgICAgTkEsCSBOQSwJIDB4NiwJIDB4MiwgICAgTkEJICB9LCAgLyogU0FUQTIgKi8KCXsgTkEsCSBOQSwgICAgIE5BLAkgMHgzLAkgTkEsCSBOQSwgICAgIE5BCSAgfSwgIC8qIFNBVEEzICovCgl7IDB4MywgICAweDQsICAgIE5BLCAgICAgTkEsCSBOQSwJIE5BLCAgICAgTkEJICB9LCAgLyogU0dNSUkwICovCgl7IE5BLCAgICAweDUsICAgIDB4NCwgICAgTkEsCSAweDMsCSBOQSwgICAgIE5BCSAgfSwgIC8qIFNHTUlJMSAqLwoJeyBOQSwgICAgTkEsICAgICBOQSwJIDB4NCwJIE5BLAkgMHgzLCAgICBOQQkgIH0sICAvKiBTR01JSTIgKi8KCXsgTkEsICAgIDB4NywgICAgTkEsCSBOQSwJIE5BLAkgTkEsICAgICBOQQkgIH0sICAvKiBRU0dNSUkgKi8KCXsgTkEsICAgIDB4NiwgICAgTkEsCSBOQSwJIDB4NCwJIE5BLCAgICAgTkEJICB9LCAgLyogVVNCM19IT1NUMCAqLwoJeyBOQSwgICAgTkEsICAgICBOQSwJIDB4NSwJIE5BLAkgMHg0LCAgICBOQQkgIH0sICAvKiBVU0IzX0hPU1QxICovCgl7IE5BLCAgICBOQSwgICAgIE5BLAkgMHg2LAkgMHg1LAkgMHg1LCAgICBOQQkgIH0sICAvKiBVU0IzX0RFVklDRSAqLwojaWZkZWYgTVY4OEY2OVhYCgl7IE5BLCAgICBOQSwgICAgIDB4NSwJIE5BLAkgMHg4LAkgTkEsICAgICAweDIgIH0sICAvKiBTR01JSTMgKi8KCXsgTkEsICAgIE5BLCAgICAgTkEsCSAweDgsCSAweDksCSAweDgsICAgIDB4NCAgfSwgIC8qIFhBVUkgKi8KCXsgTkEsICAgIE5BLCAgICAgTkEsCSBOQSwJIE5BLAkgMHg4LCAgICAweDQgIH0sICAvKiBSWEFVSSAqLwojZW5kaWYKCXsgMHgwLCAgIDB4MCwgICAgMHgwLAkgMHgwLAkgMHgwLAkgMHgwLCAgICBOQQkgIH0gICAvKiBERUZBVUxUX1NFUkRFUyAqLwp9OwoKLyogU2VsZWN0b3IgbWFwcGluZyBmb3IgUEVYIGJ5IDQgY29uZml1cmF0aW9uICovCk1WX1U4IGNvbW1vblBoeXNTZWxlY3RvcnNQZXhCeTRMYW5lc1tdID0geyAweDEsIDB4MiwgMHgyLCAweDIgfTsKCnN0YXRpYyBjb25zdCBjaGFyICpzZXJkZXNUeXBlVG9TdHJpbmdbXSA9IHsKCSJQQ0llMCIsCgkiUENJZTEiLAoJIlBDSWUyIiwKCSJQQ0llMyIsCgkiU0FUQTAiLAoJIlNBVEExIiwKCSJTQVRBMiIsCgkiU0FUQTMiLAoJIlNHTUlJMCIsCgkiU0dNSUkxIiwKCSJTR01JSTIiLAoJIlFTR01JSSIsCgkiVVNCMyBIT1NUMCIsCgkiVVNCMyBIT1NUMSIsCgkiVVNCMyBERVZJQ0UiLAogICAgIlNHTUlJMyIsCiAgICAiWEFVSSIsCiAgICAiUlhBVUkiLAoJIkRFRkFVTFQgU0VSREVTIiwKCSJMQVNUX1NFUkRFU19UWVBFIgp9OwoKCnR5cGVkZWYgc3RydWN0IHNlcmRlc1VuaXREYXRhIHsKCU1WX1U4IHNlcmRlc1VuaXRJZDsKCU1WX1U4IHNlcmRlc1VuaXROdW07Cn0gTVZfU0VSREVTX1VOSVRfUDsKCnN0YXRpYyBNVl9TRVJERVNfVU5JVF9QIHNlcmRlc1R5cGVUb1VuaXRJbmZvW10gPSB7Cgl7CVBFWF9VTklUX0lEICwJMCwJfSwKCXsJUEVYX1VOSVRfSUQgLAkxLAl9LAoJewlQRVhfVU5JVF9JRCAsCTIsCX0sCgl7CVBFWF9VTklUX0lEICwJMywJfSwKCXsJU0FUQV9VTklUX0lELAkwLAl9LAoJewlTQVRBX1VOSVRfSUQsCTEsCX0sCgl7CVNBVEFfVU5JVF9JRCwJMiwJfSwKCXsJU0FUQV9VTklUX0lELAkzLAl9LAoJewlFVEhfR0lHX1VOSVRfSUQsMCwJfSwKCXsJRVRIX0dJR19VTklUX0lELDEsCX0sCgl7CUVUSF9HSUdfVU5JVF9JRCwyLAl9LAoJewlRU0dNSUlfVU5JVF9JRCwJMCwJfSwKCXsJVVNCM0hfVU5JVF9JRCwJMCwJfSwKCXsJVVNCM0hfVU5JVF9JRCwJMSwJfSwKCXsJVVNCM0RfVU5JVF9JRCwJMCwJfSwKICAgIHsJRVRIX0dJR19VTklUX0lELDMsCX0sCiAgICB7CVhBVUlfVU5JVF9JRCwJMCwJfSwKICAgIHsJUlhBVUlfVU5JVF9JRCwJMCwJfSwKfTsKCgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogU2VxdWVuY2VzIERCICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKLyoqKioqKioqKioqKioqKioqKi8KLyogU0FUQSBhbmQgU0dNSUkgKi8KLyoqKioqKioqKioqKioqKioqKi8KCk1WX09QX1BBUkFNUyBzYXRhUG9ydDBQb3dlclVwUGFyYW1zW10gPQp7CiAgICAvKiB1bml0dW5pdEJhc2VSZWcgICAgICAgICAgICAgIHVuaXRPZmZzZXQgICAgICBtYXNrICAgICAgICAgICAgIFNBVEEgZGF0YSAgICAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KICAgIHsgU0FUQV9WRU5ET1JfUE9SVF8wX1JFR19BRERSLCAgMHgzODAwMCwgICAgICAgIDB4RkZGRkZGRkYsICAgICB7IDB4NDgsICAgIH0sICAgICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBBY2Nlc3MgdG8gcmVnIDB4NDgoT09CIHBhcmFtIDEpICovCiAgICB7IFNBVEFfVkVORE9SX1BPUlRfMF9SRUdfREFUQSwgIDB4MzgwMDAsICAgICAgICAweEYwM0YsICAgICAgICAgeyAweDYwMTgsICB9LCAgICAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogT09CIENvbVdha2UgYW5kIENvbVJlc2V0IHNwYWNpbmcgdXBwZXIgbGltaXQgZGF0YSAqLwogICAgeyBTQVRBX1ZFTkRPUl9QT1JUXzBfUkVHX0FERFIsICAweDM4MDAwLCAgICAgICAgMHhGRkZGRkZGRiwgICAgIHsgMHhBLCAgICAgfSwgICAgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEFjY2VzcyB0byByZWcgMHhBKFBIWSBDb250cm9sKSAqLwogICAgeyBTQVRBX1ZFTkRPUl9QT1JUXzBfUkVHX0RBVEEsICAweDM4MDAwLCAgICAgICAgMHgzMDAwLCAgICAgICAgIHsgMHgwLCAgICAgfSwgICAgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIFJ4IGNsayBhbmQgVHggY2xrIHNlbGVjdCBub24taW52ZXJ0ZWQgbW9kZSAqLwogICAgeyBTQVRBX0NUUkxfUkVHX0lORF9BRERSLCAgICAgICAweDM4MDAwLCAgICAgICAgMHhGRkZGRkZGRiwgICAgIHsgMHgwLCAgICAgfSwgICAgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIFBvd2VyIERvd24gU2F0YSBhZGRyICovCiAgICB7IFNBVEFfQ1RSTF9SRUdfSU5EX0RBVEEsICAgICAgIDB4MzgwMDAsICAgICAgICAweEZGRkYwMEZGLCAgICAgeyAweEM0MDA0MCx9LCAgICAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogUG93ZXIgRG93biBTYXRhIFBvcnQgMCAqLwp9OwoKTVZfT1BfUEFSQU1TIHNhdGFQb3J0MVBvd2VyVXBQYXJhbXNbXSA9CnsKICAgIC8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICAgICAgdW5pdE9mZnNldCAgICAgIG1hc2sgICAgICAgICAgICAgIFNBVEEgZGF0YSAgICAgICAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KICAgIHsgU0FUQV9WRU5ET1JfUE9SVF8xX1JFR19BRERSLCAgMHgzODAwMCwgICAgICAgIDB4RkZGRkZGRkYsICAgICB7IDB4NDgsICAgICB9LCAgICAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogQWNjZXNzIHRvIHJlZyAweDQ4KE9PQiBwYXJhbSAxKSAqLwogICAgeyBTQVRBX1ZFTkRPUl9QT1JUXzFfUkVHX0RBVEEsICAweDM4MDAwLCAgICAgICAgMHhGMDNGLCAgICAgICAgIHsgMHg2MDE4LCAgIH0sICAgICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBPT0IgQ29tV2FrZSBhbmQgQ29tUmVzZXQgc3BhY2luZyB1cHBlciBsaW1pdCBkYXRhICovCiAgICB7IFNBVEFfVkVORE9SX1BPUlRfMV9SRUdfQUREUiwgIDB4MzgwMDAsICAgICAgICAweEZGRkZGRkZGLCAgICAgeyAweEEsICAgICAgfSwgICAgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEFjY2VzcyB0byByZWcgMHhBKFBIWSBDb250cm9sKSAqLwogICAgeyBTQVRBX1ZFTkRPUl9QT1JUXzFfUkVHX0RBVEEsICAweDM4MDAwLCAgICAgICAgMHgzMDAwLCAgICAgICAgIHsgMHgwLCAgICAgIH0sICAgICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBSeCBjbGsgYW5kIFR4IGNsayBzZWxlY3Qgbm9uLWludmVydGVkIG1vZGUgKi8KICAgIHsgU0FUQV9DVFJMX1JFR19JTkRfQUREUiwgICAgICAgMHgzODAwMCwgICAgICAgIDB4RkZGRkZGRkYsICAgICB7IDB4MCwgICAgICB9LCAgICAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogUG93ZXIgRG93biBTYXRhIGFkZHIgKi8KICAgIHsgU0FUQV9DVFJMX1JFR19JTkRfREFUQSwgICAgICAgMHgzODAwMCwgICAgICAgIDB4RkZGRkZGMDAsICAgICB7IDB4QzQ0MDAwLCB9LCAgICAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogUG93ZXIgRG93biBTYXRhIFBvcnQgMSAqLwp9OwoKLyogU0FUQSBhbmQgU0dNSUkgLSBwb3dlciB1cCBzZXEgKi8KTVZfT1BfUEFSQU1TIHNhdGFBbmRTZ21paVBvd2VyVXBQYXJhbXNbXSA9CnsKCS8qIHVuaXRCYXNlUmVnICAgICAgICAgICAgICAgICAgICAgIHVuaXRPZmZzZXQgICAJbWFzayAgICAgICAgIFNBVEEgZGF0YSAgICAgIFNHTUlJIGRhdGEgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsICAgICAgICAgICAweDkwMDA2LAl7IDB4ODAwMDIsCQkweDgwMDAyIH0sIAkJMCwgICAgICAgICAgMCAgICAgICB9LCAgLyogUG93ZXIgVXAgKi8KCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsCQkgICAgMHg3ODAwLAkJeyAweDYwMDAsCQkweDYwMDAgIH0sIAkJMCwJCSAgICAwICAgICAgIH0sICAvKiBVbnJlc2V0ICovCgl7IFBPV0VSX0FORF9QTExfQ1RSTF9SRUcsCSAJICAgIDB4ODAwLAkJICAgIDB4MEUwLAkJeyAweDAsCQkJMHg4MCAgICB9LCAJCTAsCQkgICAgMCAgICAgICB9LCAgLyogUGh5IFNlbGVjdG9yICovCiAgICB7IE1JU0NfUkVHLAkJCSAJCSAgICAgICAgMHg4MDAsCQkgICAgMHg0NDAsCQl7IDB4NDQwLAkgICAgMHg0MDAJfSwgICAgICAwLAkgICAgICAgIDAJICAgIH0gICAvKiBSZWYgY2xvY2sgc291cmNlIHNlbGVjdCAqLyAKfTsKCi8qIFNBVEEgYW5kIFNHTUlJIC0gc3BlZWQgY29uZmlnIHNlcSAqLwpNVl9PUF9QQVJBTVMgc2F0YUFuZFNnbWlpU3BlZWRDb25maWdQYXJhbXNbXSA9CnsKCS8qIHVuaXRCYXNlUmVnICAJCQkJICAgIHVuaXRPZmZzZXQgIG1hc2sgICAgIAkgU0FUQSBkYXRhICAgICAgU0dNSUkgKDEuMjVHKSAgU0dNSUkgKDMuMTI1Rykgd2FpdFRpbWUgIG51bU9mTG9vcHMgKi8KICAgIHsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsIAkweDI4LAkJMHgzRkMwMDAwMCwJeyAweDg4MDAwMDAsIAkweDE5ODAwMDAwLAkJMHgyMjAwMDAwMCB9LCAJMCwJCSAgIDAgfSwgLyogQmF1ZCBSYXRlICovCgl7IElOVEVSRkFDRV9SRUcsIAkJCQkJMHg4MDAsCSAgICAweEMwMCwJIAl7IDB4ODAwLAkgIAlOT19EQVRBLCAgICAgICAgTk9fREFUQSAgICB9LCAJMCwJICAgICAgIDAgfSwgLyogU2VsZWN0IEJhdWQgUmF0ZSBmb3IgU0FUQSBvbmx5Ki8KCXsgSVNPTEFURV9SRUcsCSAJCQkJCTB4ODAwLAkgICAgMHhGRiwJIAl7IE5PX0RBVEEsIAkJMHg2NiwgICAgICAgICAgIDB4NjYgICAgICAgfSwgCTAsCSAgICAgICAwIH0sIC8qIFBoeSBHZW4gUlggYW5kIFRYICovCgl7IExPT1BCQUNLX1JFRywJIAkJCQkJMHg4MDAsCSAgICAweEUsCSAgICB7IDB4NCwJICAJCTB4MiwgICAJCQkweDIgICAgICAgIH0sIAkwLAkgICAgICAgMCB9ICAvKiBCdXMgV2lkdGggKi8KfTsKCi8qIFNBVEEgYW5kIFNHTUlJIC0gVFggY29uZmlnIHNlcSAqLwpNVl9PUF9QQVJBTVMgc2F0YUFuZFNnbWlpVHhDb25maWdQYXJhbXMxW10gPQp7CgkvKiB1bml0dW5pdEJhc2VSZWcgICAgICAgICAgICAgICAgICB1bml0T2Zmc2V0ICBtYXNrICAgICAgICBTQVRBIGRhdGEgICAgICAgU0dNSUkgZGF0YSAgICAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KCXsgR0xVRV9SRUcsICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwLAkJMHgxODAwLCAgICAgeyBOT19EQVRBLCAgICAgIDB4ODAwICAgfSwgICAgICAwLCAgICAgICAgICAgICAgMAkJfSwKCXsgUkVTRVRfREZFX1JFRywJCSAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4NDAxLAkJeyAweDQwMSwgICAgICAgIDB4NDAxICAgfSwgICAgICAwLCAgICAgICAgICAgICAgMAkJfSwgIC8qIFNmdCBSZXNldCBwdWxzZSAqLwoJeyBSRVNFVF9ERkVfUkVHLAkJICAgICAgICAgICAgMHg4MDAsCQkweDQwMSwJCXsgMHgwLCAgICAgICAgICAweDAgICAgIH0sICAgICAgMCwJICAgICAgICAgICAgMAkJfSwgIC8qIFNmdCBSZXNldCBwdWxzZSAqLwoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgICAgMHgyOCwJCTB4RjAwMDAsCXsgMHg3MDAwMCwgICAgICAweDcwMDAwCX0sICAgICAgMCwJICAgICAgICAgICAgMAkJfSAgIC8qIFBvd2VyIHVwIFBMTCwgUlggYW5kIFRYICovCn07CgpNVl9PUF9QQVJBTVMgc2F0YVBvcnQwVHhDb25maWdQYXJhbXNbXSA9CnsKCS8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICB1bml0T2Zmc2V0ICBtYXNrICAgICAgICAgICAgU0FUQSBkYXRhICAgICAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KCXsgU0FUQV9DVFJMX1JFR19JTkRfQUREUiwgICAweDM4MDAwLAkweEZGRkZGRkZGLCAgICAgeyAweDAgICAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sICAvKiBQb3dlciBEb3duIFNhdGEgYWRkciovCgl7IFNBVEFfQ1RSTF9SRUdfSU5EX0RBVEEsICAgMHgzODAwMCwJMHhGRkZGMDBGRiwgICAgIHsgMHhDNDAwMDAgIH0sICAgICAgMCwgICAgICAgICAgMAkJfSwgIC8qIFBvd2VyIERvd24gU2F0YSAgUG9ydCAwICovCgl7IFNBVEFfQ1RSTF9SRUdfSU5EX0FERFIsICAgMHgzODAwMCwJMHhGRkZGRkZGRiwgICAgIHsgMHg0ICAgICAgIH0sICAgICAgMCwgICAgICAgICAgMAkJfSwgIC8qIFJlZ3JldCBiaXQgYWRkciovCgl7IFNBVEFfQ1RSTF9SRUdfSU5EX0RBVEEsICAgMHgzODAwMCwJMHhGRkZGRkZGRiwgICAgIHsgMHg4MCAgICAgIH0sICAgICAgMCwgICAgICAgICAgMAkJfSAgIC8qIFJlZ3JldCBiaXQgZGF0YSAqLwp9OwoKTVZfT1BfUEFSQU1TIHNhdGFQb3J0MVR4Q29uZmlnUGFyYW1zW10gPQp7CgkvKiB1bml0dW5pdEJhc2VSZWcgICAgICAgICAgdW5pdE9mZnNldCAgbWFzayAgICAgICAgICAgIFNBVEEgZGF0YSAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwoJeyBTQVRBX0NUUkxfUkVHX0lORF9BRERSLCAgIDB4MzgwMDAsCTB4RkZGRkZGRkYsICAgICB7IDB4MCAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAgLyogUG93ZXIgRG93biBTYXRhIGFkZHIqLwoJeyBTQVRBX0NUUkxfUkVHX0lORF9EQVRBLCAgIDB4MzgwMDAsCTB4RkZGRkZGMDAsICAgICB7IDB4QzQwMDAwIH0sICAgICAgMCwgICAgICAgICAgMAkJfSwgIC8qIFBvd2VyIERvd24gU2F0YSBQb3J0IDEgKi8KCXsgU0FUQV9DVFJMX1JFR19JTkRfQUREUiwgICAweDM4MDAwLAkweEZGRkZGRkZGLCAgICAgeyAweDQgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAJCX0sICAvKiBSZWdyZXQgYml0IGFkZHIqLwoJeyBTQVRBX0NUUkxfUkVHX0lORF9EQVRBLCAgIDB4MzgwMDAsCTB4RkZGRkZGRkYsICAgICB7IDB4ODAgICAgIH0sICAgICAgMCwgICAgICAgICAgMAkJfSAgIC8qIFJlZ3JldCBiaXQgZGF0YSAqLwp9OwoKTVZfT1BfUEFSQU1TIHNhdGFBbmRTZ21paVR4Q29uZmlnU2VyZGVzUmV2MVBhcmFtczJbXSA9CnsKCS8qIHVuaXR1bml0QmFzZVJlZwkJCQl1bml0T2Zmc2V0CQkgbWFzayAgICAgICAgIFNBVEEgZGF0YSAgICBTR01JSSBkYXRhICAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwoJeyBDT01NT05fUEhZX1NUQVRVUzFfUkVHLAkJCTB4MjgsCSAgICAgMHhDLAkJCXsgMHhDLAkJCTB4QwkgICAgICAgfSwgICAxMCwJICAgICAgICAxMDAwCSAgICB9LCAgLyogV2FpdCBmb3IgUEhZIHBvd2VyIHVwIHNlcXVlbmNlIHRvIGZpbmlzaCAqLwoJeyBDT01NT05fUEhZX1NUQVRVUzFfUkVHLAkJCTB4MjgsCSAgICAgMHgxLAkJCXsgMHgxLAkJCTB4MQkgICAgICAgfSwgICAxLAkgICAgICAgIDEwMDAJICAgIH0gICAvKiBXYWl0IGZvciBQSFkgcG93ZXIgdXAgc2VxdWVuY2UgdG8gZmluaXNoICovCn07CgpNVl9PUF9QQVJBTVMgc2F0YUFuZFNnbWlpVHhDb25maWdTZXJkZXNSZXYyUGFyYW1zMltdID0KewogICAgLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgICAgICB1bml0T2Zmc2V0ICAgICAgIG1hc2sgICAgICAgICBTQVRBIGRhdGEgICAgU0dNSUkgZGF0YSAgICAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KICAgIHsgQ09NTU9OX1BIWV9TVEFUVVMxX1JFRywgICAgICAgICAgIDB4MjgsICAgICAgICAweEMsICAgICAgICAgICB7IDB4QywgICAgICAgICAgMHhDICAgICAgICB9LCAgMTAsICAgICAgICAgMTAwMCAgICAgICAgfSwgIC8qIFdhaXQgZm9yIFBIWSBwb3dlciB1cCBzZXF1ZW5jZSB0byBmaW5pc2ggKi8KICAgIHsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsICAgICAgICAweDQwMDAwMDAwLCAgICB7IE5BLCAgICAgICAgICAgMHg0MDAwMDAwMCB9LCAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgIC8qIEFzc2VydCBSeCBJbml0IGZvciBTR01JSSAqLwogICAgeyBJU09MQVRFX1JFRywgICAgICAgICAgICAgICAgICAgICAgMHg4MDAsICAgICAgIDB4NDAwLCAgICAgICAgIHsgMHg0MDAsICAgICAgICBOQSAgICAgICAgIH0sICAwLCAgICAgICAgICAwICAgICAgICAgICB9LCAgLyogQXNzZXJ0IFJ4IEluaXQgZm9yIFNBVEEgKi8KICAgIHsgQ09NTU9OX1BIWV9TVEFUVVMxX1JFRywgICAgICAgICAgIDB4MjgsICAgICAgICAweDEsICAgICAgICAgICB7IDB4MSwgICAgICAgICAgMHgxICAgICAgICB9LCAgMSwgICAgICAgICAgMTAwMCAgICAgICAgfSwgIC8qIFdhaXQgZm9yIFBIWSBwb3dlciB1cCBzZXF1ZW5jZSB0byBmaW5pc2ggKi8KICAgIHsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsICAgICAgICAweDQwMDAwMDAwLCAgICB7IE5BLCAgICAgICAgICAgMHgwICAgICAgICB9LCAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgIC8qIERlLWFzc2VydCBSeCBJbml0IGZvciBTR01JSSAqLwogICAgeyBJU09MQVRFX1JFRywgICAgICAgICAgICAgICAgICAgICAgMHg4MDAsICAgICAgIDB4NDAwLCAgICAgICAgIHsgMHgwLCAgICAgICAgICBOQSAgICAgICAgIH0sICAwLCAgICAgICAgICAwICAgICAgICAgICB9LCAgLyogRGUtYXNzZXJ0IFJ4IEluaXQgZm9yIFNBVEEgKi8KICAgIHsgUlhfUkVHMywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4RkYsICAgICAgICAgICB7IDB4REUsICAgICAgICAgTk9fREFUQSAgICB9LCAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgIC8qIG9zX3BoX29mZnNldF9mb3JjZSAoYWxpZ24gOTApICovCiAgICB7IFJYX1JFRzMsICAgICAgICAgICAgICAgICAgICAgICAgICAweDgwMCwgICAgICAweDEwMCwgICAgICAgICAgeyAweDEwMCwgICAgICAgIE5PX0RBVEEgICAgfSwgIDAsICAgICAgICAgIDAgICAgICAgICAgIH0sICAvKiBTZXQgb3NfcGhfdmFsaWQgKi8KICAgIHsgUlhfUkVHMywgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4MTAwLCAgICAgICAgICB7IDB4MCwgICAgICAgICAgTk9fREFUQSAgICB9LCAgMCwgICAgICAgICAgMCAgICAgICAgICAgfSwgIC8qIFVuc2V0IG9zX3BoX3ZhbGlkICovCn07CgpNVl9PUF9QQVJBTVMgc2F0YUVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYxUGFyYW1zW10gPQp7CgkvKiB1bml0dW5pdEJhc2VSZWcJCQkJCXVuaXRPZmZzZXQJIG1hc2sJCVNBVEEgZGF0YQkJd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT040X1JFRywJMHgyOCwJICAgIDB4NDAwMDA4LAl7IDB4NDAwMDAwLAl9LCAgIAkwLAkJCTAJCX0sICAvKiBlbmFibGUgU1NDIGFuZCBERkUgdXBkYXRlIGVuYWJsZSAqLwoJeyBWVEhJTVBDQUxfQ1RSTF9SRUcsCQkJCTB4ODAwLAkgICAgMHhGRjAwLAkJeyAweDQwMDAsCX0sICAgCTAsCQkJMAkJfSwgIC8qIHR4aW1wY2FsX3RoIGFuZCByeGltcGNhbF90aCAqLwoJeyBTUVVFTENIX0ZGRV9TRVRUSU5HX1JFRywJCQkweDgwMCwJICAgIDB4RkZGLAkJeyAweDZDRiwJfSwgICAJMCwJCQkwCQl9LCAgLyogU1FfVEhSRVNIIGFuZCBGRkUgU2V0dGluZyAqLwoJeyBHMV9TRVRUSU5HU18wX1JFRywJCQkJMHg4MDAsCSAgICAweEZGRkYsCQl7IDB4OEEzMiwJfSwgICAJMCwJCQkwCQl9LCAgLyogRzFfVFggU0xFVywgRU1QSDEgYW5kIEFNUCAqLwoJeyBHMV9TRVRUSU5HU18xX1JFRywJCQkJMHg4MDAsCSAgICAweDNGRiwJCXsgMHgzQzksCX0sICAgCTAsCQkJMAkJfSwgIC8qIEcxX1JYIFNFTE1VRkYsIFNFTE1VRkksIFNFTE1VUEYgYW5kIFNFTE1VUEkgKi8KCXsgRzJfU0VUVElOR1NfMF9SRUcsCQkJCTB4ODAwLAkgICAgMHhGRkZGLAkJeyAweDhCNUMsCX0sICAgCTAsCQkJMAkJfSwgIC8qIEcyX1RYIFNMRVcsIEVNUEgxIGFuZCBBTVAgKi8KCXsgRzJfU0VUVElOR1NfMV9SRUcsCQkJCTB4ODAwLAkgICAgMHgzRkYsCQl7IDB4M0QyLAl9LCAgIAkwLAkJCTAJCX0sICAvKiBHMl9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCgl7IEczX1NFVFRJTkdTXzBfUkVHLAkJCQkweDgwMCwJICAgIDB4RkZGRiwJCXsgMHhFNkUsCX0sICAgCTAsCQkJMAkJfSwgIC8qIEczX1RYIFNMRVcsIEVNUEgxIGFuZCBBTVAgKi8KCXsgRzNfU0VUVElOR1NfMV9SRUcsCQkJCTB4ODAwLAkgICAgMHgzRkYsCQl7IDB4M0QyLAl9LCAgIAkwLAkJCTAJCX0sICAvKiBHM19SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCgl7IENBTF9SRUc2LAkJCQkJCQkweDgwMCwJICAgIDB4RkYwMCwJCXsgMHhERDAwLAl9LCAgIAkwLAkJCTAJCX0sICAvKiBDYWwgcnhjbGthbGlnbjkwIGV4dCBlbmFibGUgYW5kIENhbCBvcyBwaCBleHQgKi8KCXsgUlhfUkVHMiwJCQkJCQkJMHg4MDAsCSAgICAweEYwLAkJeyAweDcwLAkJfSwgICAJMCwJCQkwCQl9LCAgLyogRHRsIENsYW1waW5nIGRpc2FibGUgYW5kIER0bCBjbGFtcGluZyBTZWwoNjAwMHBwbSkgKi8KfTsKCgpNVl9PUF9QQVJBTVMgc2F0YUVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zW10gPQp7Ci8qIHVuaXR1bml0QmFzZVJlZwkJCSAgICB1bml0T2Zmc2V0CSAgbWFzawkJU0FUQSBkYXRhCSAgICB3YWl0VGltZSBudW1PZkxvb3BzICovCiAgICB7IFNRVUVMQ0hfRkZFX1NFVFRJTkdfUkVHLAkJCTB4ODAwLCAgICAweEYwMCwJeyAweDYwMAkJfSwgCTAsCSAgICAwCX0sICAvKiBTUV9USFJFU0ggYW5kIEZGRSBTZXR0aW5nICovCiAgICB7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjRfUkVHLAkJMHgyOCwJICAweDQwMDAwOCwJeyAweDQwMDAwMAl9LCAJMCwJICAgIDAJfSwgIC8qIGVuYWJsZSBTU0MgYW5kIERGRSB1cGRhdGUgZW5hYmxlICovCiAgICB7IEcxX1NFVFRJTkdTXzBfUkVHLAkJCTB4ODAwLAkgIDB4RkZGRiwJeyAweDhBMzIJfSwJMCwJICAgIDAJfSwgIC8qIEcxX1RYIFNMRVcsIEVNUEgxIGFuZCBBTVAgKi8KICAgIHsgRzFfU0VUVElOR1NfMV9SRUcsCQkJMHg4MDAsCSAgMHgzRkYsCXsgMHgzQzkJCX0sCTAsCSAgICAwCX0sICAvKiBHMV9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCiAgICB7IEcyX1NFVFRJTkdTXzBfUkVHLAkJCTB4ODAwLAkgIDB4RkZGRiwJeyAweDhCNUMJfSwJMCwJICAgIDAJfSwgIC8qIEcyX1RYIFNMRVcsIEVNUEgxIGFuZCBBTVAgKi8KICAgIHsgRzJfU0VUVElOR1NfMV9SRUcsCQkJMHg4MDAsCSAgMHgzRkYsCXsgMHgzRDIJCX0sCTAsCSAgICAwCX0sICAvKiBHMl9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCiAgICB7IEczX1NFVFRJTkdTXzBfUkVHLAkJCTB4ODAwLAkgIDB4RkZGRiwJeyAweEU2RQkJfSwJMCwJICAgIDAJfSwgIC8qIEczX1RYIFNMRVcsIEVNUEgxIGFuZCBBTVAgKi8KICAgIHsgRzNfU0VUVElOR1NfMV9SRUcsCQkJMHg4MDAsCSAgMHg0N0ZGLAl7IDB4N0QyCQl9LAkwLAkgICAgMAl9LCAgLyogRzNfUlggU0VMTVVGRiwgU0VMTVVGSSwgU0VMTVVQRiBhbmQgU0VMTVVQSSAmIERGRV9FbiBHZW4zLCBEQyB3YW5kZXIgY2FsaWJyYXRpb24gZGlzICovCiAgICB7IFBDSUVfUkVHMCwgICAgICAgIAkJCTB4ODAwLCAgICAweDEwMDAsCXsgMHgwCQl9LAkwLAkgICAgMCAgIH0sICAvKiBCaXRbMTJdPTB4MCCWIGlkbGVfc3luY19lbiAqLwogICAgeyBSWF9SRUcyLCAgICAgICAgICAJCQkweDgwMCwgICAgMHhGMCwJCXsgMHg3MCwJCX0sCTAsCSAgICAwICAgfSwgIC8qIER0bCBDbGFtcGluZyBkaXNhYmxlIGFuZCBEdGwgY2xhbXBpbmcgU2VsKDYwMDBwcG0pICovCiAgICB7IFZUSElNUENBTF9DVFJMX1JFRywJCQkweDgwMCwJICAweEZGMDAsCXsgMHgzMDAwCX0sCTAsCSAgICAwCX0sIC8qIHR4aW1wY2FsX3RoIGFuZCByeGltcGNhbF90aCAqLwogICAgeyBERkVfUkVHMCwgICAgICAgICAJCQkweDgwMCwgICAgMHhBMDBGLAl7IDB4ODAwQQl9LAkwLAkgICAgMCAgIH0sIC8qIERGRV9TVEVQX0ZJTkVfRlhbMzowXSA9MHhBICovCiAgICB7IERGRV9SRUczLCAgICAgICAgICAJCQkweDgwMCwJICAweEMwMDAsCXsgMHgwCQl9LAkwLAkgICAgMCAgIH0sIC8qIERGRV9FTiBhbmQgRGlzIFVwZGF0ZSBjb250cm9sIGZyb20gcGluIGRpc2FibGUgKi8KICAgIHsgRzFfU0VUVElOR1NfM19SRUcsCQkJMHg4MDAsCSAgMHhGRiwJCXsgMHhDRgkJfSwJMCwJICAgIDAJfSwgLyogRkZFIEZvcmNlIEZGRV9SRXMgYW5kIGNhcCBzZXR0aW5ncyBmb3IgR2VuMSAqLwogICAgeyBHMl9TRVRUSU5HU18zX1JFRywJCQkweDgwMCwJICAweEZGLAkJeyAweEJGCQl9LAkwLAkgICAgMAl9LCAvKiBGRkUgRm9yY2UgRkZFX1JFcyBhbmQgY2FwIHNldHRpbmdzIGZvciBHZW4yICovCiAgICB7IEczX1NFVFRJTkdTXzNfUkVHLAkJCTB4ODAwLAkgIDB4RkYsCQl7IDB4Q0YJCX0sCTAsCSAgICAwCX0sIC8qIEZFIEZvcmNlIEZGRV9SRXM9NCBhbmQgY2FwIHNldHRpbmdzIGZvciBHZW4zbiAqLwogICAgeyBHM19TRVRUSU5HU180X1JFRywJCQkweDgwMCwJICAweDMwMCwJeyAweDMwMAkJfSwJMCwJICAgIDAJfSwgLyogU2V0IERGRSBHZW4gMyBSZXNvbHV0aW9uIHRvIDMgKi8KCn07CgpNVl9PUF9QQVJBTVMgc2dtaWlFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MVBhcmFtc1tdID0KewogICAgLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgIHVuaXRPZmZzZXQgICBtYXNrICAgICAgIFNHTUlJICgxLjI1RykgIFNHTUlJICgzLjEyNUcpICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwogICAgeyBHMV9TRVRUSU5HU18xX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4M0ZGLCAgICAgIHsgMHgzQzksICAgICAgICAweDNDOSAgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogRzFfUlggU0VMTVVGRiwgU0VMTVVGSSwgU0VMTVVQRiBhbmQgU0VMTVVQSSAqLwogICAgeyBTUVVFTENIX0ZGRV9TRVRUSU5HX1JFRywgIDB4ODAwLCAgICAgIDB4RkZGLCAgICAgIHsgMHg4RiwgICAgICAgICAweEJGICAgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogU1FfVEhSRVNIIGFuZCBGRkUgU2V0dGluZyAqLwogICAgeyBWVEhJTVBDQUxfQ1RSTF9SRUcsICAgICAgIDB4ODAwLCAgICAgIDB4RkYwMCwgICAgIHsgMHg0MDAwLCAgICAgICAweDQwMDAgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogdHhpbXBjYWxfdGggYW5kIHJ4aW1wY2FsX3RoICovCn07CgpNVl9PUF9QQVJBTVMgc2dtaWlFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MlBhcmFtc1tdID0KewogICAgLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgIHVuaXRPZmZzZXQgICBtYXNrICAgICAgIFNHTUlJICgxLjI1RykgIFNHTUlJICgzLjEyNUcpICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwogICAgeyBHMV9TRVRUSU5HU18wX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4RkZGRiwgICAgIHsgMHg4RkEsICAgICAgICAweDhGQSAgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogU2V0IFNsZXdSYXRlLCBFbXBoIGFuZCBBbXAgKi8KICAgIHsgRzFfU0VUVElOR1NfMV9SRUcsICAgICAgICAweDgwMCwgICAgICAweDNGRiwgICAgICB7IDB4M0M5LCAgICAgICAgMHgzQzkgICAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEcxX1JYIFNFTE1VRkYsIFNFTE1VRkksIFNFTE1VUEYgYW5kIFNFTE1VUEkgKi8KICAgIHsgUlhfUkVHMiwgICAgICAgICAgICAgICAgICAweDgwMCwgICAgICAweDQsICAgICAgICB7IDB4MCwgICAgICAgICAgMHgwICAgICAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIERUTF9GTE9PUF9FTiAqLwogICAgeyBHMV9TRVRUSU5HU18zX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4RkYsICAgICAgIHsgMHg4RiwgICAgICAgICAweEJGICAgICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogRzEgRkZFIFNldHRpbmcgRm9yY2UsIFJFUyBhbmQgQ0FQICovCiAgICB7IFZUSElNUENBTF9DVFJMX1JFRywgICAgICAgMHg4MDAsICAgICAgMHhGRjAwLCAgICAgeyAweDMwMDAsICAgICAgIDB4MzAwMCAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiB0eGltcGNhbF90aCBhbmQgcnhpbXBjYWxfdGggKi8KfTsKCi8qKioqKioqKioqKioqKioqLwovKiBQRVggYW5kIFVTQjMgKi8KLyoqKioqKioqKioqKioqKiovCgovKiBQRVggYW5kIFVTQjMgLSBwb3dlciB1cCBzZXEgZm9yIFNlcmRlcyBSZXYgMS4yICovCk1WX09QX1BBUkFNUyBwZXhBbmRVc2IzUG93ZXJVcFNlcmRlc1JldjFQYXJhbXNbXSA9CnsKCS8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICAgICAgICAgIHVuaXRPZmZzZXQgICAgICBtYXNrICAgICAgICAgICAgUEVYIGRhdGEgICAgICAgIFVTQjMgZGF0YSAgICAgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgICAweDI4LAkJCTB4M0ZDN0Y4MDYsICAgICB7IDB4NDQ3MTgwNCwgICAgMHg0NDc5ODA0ICAgfSwgICAgICAwLCAgICAgICAgICAwCSAgICB9LAoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04yX1JFRywgICAgMHgyOCwJCQkweDVDLAkJICAgIHsgMHg1OCwJCSAgICAweDU4ICAgICAgICB9LAkgICAgMCwgICAgICAgICAgMAkgICAgfSwKCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9ONF9SRUcsICAgIDB4MjgsCQkJMHgzLAkJCXsgMHgxLAkJICAgIDB4MSAgICAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgICAgMHgyOCwJCQkweDc4MDAsCQkJeyAweDYwMDAsCSAgICAweEUwMDAgICAgICB9LAkJMCwgICAgICAgICAgMAkgICAgfSwKCXsgR0xPQkFMX0NMS19DVFJMLAkJCQkgICAgMHg4MDAsCQkJMHhELAkJCXsgMHg1LAkJICAgIDB4MSAgICAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAoJeyBNSVNDX1JFRywJICAgCQkJCQkgICAgMHg4MDAsICAgICAgICAgIDB4NEMwLAkgICAgIAl7IDB4ODAsICAgICAgICAgMHg0QzAgCSAgICB9LCAJICAgIDAsCSAgICAgICAgMCAgICAgICB9ICAvKiBSZWYgY2xvY2sgc291cmNlIHNlbGVjdCAqLyAKfTsKCi8qIFBFWCBhbmQgVVNCMyAtIHBvd2VyIHVwIHNlcSBmb3IgU2VyZGVzIFJldiAyLjEgKi8KTVZfT1BfUEFSQU1TIHBleEFuZFVzYjNQb3dlclVwU2VyZGVzUmV2MlBhcmFtc1tdID0KewoJLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgICAgICAgICAgdW5pdE9mZnNldCAgICAgIG1hc2sgICAgICAgICAgICBQRVggZGF0YSAgICAgICAgVVNCMyBkYXRhICAgICAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsICAgIDB4MjgsCQkgICAgMHgzRkM3RjgwNiwgICAgIHsgMHg0NDcxODA0LCAgICAweDQ0Nzk4MDQgICB9LCAgICAgIDAsICAgICAgICAgIDAJICAgIH0sCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjJfUkVHLCAgICAweDI4LAkJCTB4NUMsCQkgICAgeyAweDU4LAkJICAgIDB4NTggICAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT040X1JFRywgICAgMHgyOCwJCQkweDMsCQkJeyAweDEsCQkgICAgMHgxICAgICAgICAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgICAweDI4LAkJCTB4NzgwMCwJCQl7IDB4NjAwMCwJICAgIDB4RTAwMCAgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAoJeyBHTE9CQUxfQ0xLX0NUUkwsCQkJCSAgICAweDgwMCwJCQkweEQsCQkJeyAweDUsCQkgICAgMHgxICAgICAgICAgfSwJCTAsICAgICAgICAgIDAJICAgIH0sCgl7IEdMT0JBTF9NSVNDX0NUUkwsCQkJCSAgICAweDgwMCwJCQkweEMwLAkJCXsgMHgwLAkJICAgIE5PX0RBVEEgICAgIH0sCQkwLCAgICAgICAgICAwCSAgICB9LAoJeyBNSVNDX1JFRywJICAgCQkJCQkgICAgMHg4MDAsCSAgICAJMHg0QzAsCSAgICAgCXsgMHg4MCwgICAgICAgICAweDRDMCAJICAgIH0sIAkgICAgMCwJICAgICAgICAwCQl9ICAvKiBSZWYgY2xvY2sgc291cmNlIHNlbGVjdCAqLyAKfTsKCi8qIFBFWCBhbmQgVVNCMyAtIHNwZWVkIGNvbmZpZyBzZXEgKi8KTVZfT1BfUEFSQU1TIHBleEFuZFVzYjNTcGVlZENvbmZpZ1BhcmFtc1tdID0KewoJLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgdW5pdE9mZnNldCAgIG1hc2sgICAgICAgICAgICBQRVggZGF0YSAgICAgICAgICAgICAgICAgICAgVVNCMyBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcwoJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNSAgICAgICAgIDUgICAgICAgICAgICAgICBIT1NUICAgICAgICAgICAgREVWSUNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwoJeyBJTlRFUkZBQ0VfUkVHLCAweDgwMCwJICAgMHhDMDAsCSAgeyAweDQwMCwgMHg0MDAsICAgMHg0MDAsICAgMHg0MDAsICAgMHg0MDAgICB9LCAwLAkJICAwCQkgIH0sIC8qIE1heGltYWwgUEhZIEdlbmVyYXRpb24gU2V0dGluZyAqLwp9OwoKTVZfT1BfUEFSQU1TIHVzYjNFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MVBhcmFtc1tdID0KewoJeyBMQU5FX0NGRzRfUkVHLAkJCTB4ODAwLAkJMHg4MCwJCXsgMHg4MCAgICAgIH0sCQkwLAkJCTAJIAl9LCAvKiBTcHJlYWQgU3BlY3RydW0gQ2xvY2sgRW5hYmxlICovCgl7IEcyX1NFVFRJTkdTXzJfUkVHLAkJMHg4MDAsCQkweEZFNDAsCQl7IDB4NDQ0MCAgICB9LAkJMCwgICAgICAgICAgMAkgCX0sIC8qIEcyX1RYX1NTQ19BTVBbNjowXT00LjVrUFBNIGFuZCBUWCBlbXBoYXNpcyBtb2RlPW1WICovCgl7IFZUSElNUENBTF9DVFJMX1JFRywJCTB4ODAwLAkJMHhGRjAwLAkJeyAweDQwMDAgICAgfSwJCTAsICAgICAgICAgIDAJIAl9LCAvKiB0eGltcGNhbF90aCBhbmQgcnhpbXBjYWxfdGggKi8KCXsgRzJfU0VUVElOR1NfMV9SRUcsCQkweDgwMCwJCTB4M0ZGLAkJeyAweDNEMiAgICAgfSwJCTAsICAgICAgICAgIDAJIAl9LCAvKiBHMl9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCgl7IFNRVUVMQ0hfRkZFX1NFVFRJTkdfUkVHLAkweDgwMCwJCTB4RkYsCQl7IDB4RUYgICAgICB9LAkJMCwgICAgICAgICAgMAkgCX0sIC8qIEZGRSBTZXR0aW5nIEZvcmNlLCBSRVMgYW5kIENBUCAqLwoJeyBSWF9SRUcyLAkJCQkgCTB4ODAwLAkJMHhGMCwJCXsgMHg3MCAgICAgIH0sCQkwLCAgICAgICAgICAwCSAJfSwgLyogRHRsIENsYW1waW5nIGRpc2FibGUgYW5kIER0bC1jbGFtcGluZy1TZWwoNjAwMHBwbSkgKi8KCXsgQ0FMX1JFRzYsCQkgCQkJMHg4MDAsCQkweEZGMDAsCQl7IDB4RDUwMCAgICB9LAkJMCwgICAgICAgICAgMAkgCX0sIC8qIGNhbF9yeGNsa2FsaWduOTBfZXh0X2VuIGFuZCBjYWxfb3NfcGhfZXh0ICovCgl7IFJFRl9SRUcwLAkJIAkJCTB4ODAwLAkJMHgzOCwJCXsgMHgyMCAgICAgIH0sCQkwLCAgICAgICAgICAwCSAJfSwgLyogdmNvX2NhbF92dGhfc2VsICovCn07CgpNVl9PUF9QQVJBTVMgdXNiM0VsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zW10gPQp7Cgl7IExBTkVfQ0ZHNF9SRUcsCQkJMHg4MDAsCQkweDgwLAkJeyAweDgwICAgICAgfSwJCTAsCQkJMAkgCX0sIC8qIFNwcmVhZCBTcGVjdHJ1bSBDbG9jayBFbmFibGUgKi8KCXsgRzJfU0VUVElOR1NfMl9SRUcsCQkweDgwMCwJCTB4RkU0MCwJCXsgMHg0NDQwICAgIH0sCQkwLCAgICAgICAgICAwCSAJfSwgLyogRzJfVFhfU1NDX0FNUFs2OjBdPTQuNWtQUE0gYW5kIFRYIGVtcGhhc2lzIG1vZGU9bVYgKi8KCXsgRzJfU0VUVElOR1NfMV9SRUcsCQkweDgwMCwJCTB4M0ZGLAkJeyAweDNEMiAgICAgfSwJCTAsICAgICAgICAgIDAJIAl9LCAvKiBHMl9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCgl7IFJYX1JFRzIsCQkJCSAJMHg4MDAsCQkweEYwLAkJeyAweDcwICAgICAgfSwJCTAsICAgICAgICAgIDAJIAl9LCAvKiBEdGwgQ2xhbXBpbmcgZGlzYWJsZSBhbmQgRHRsLWNsYW1waW5nLVNlbCg2MDAwcHBtKSAqLwoJeyBSRUZfUkVHMCwJCSAJCQkweDgwMCwJCTB4MzgsCQl7IDB4MjAgICAgICB9LAkJMCwgICAgICAgICAgMAkgCX0sIC8qIHZjb19jYWxfdnRoX3NlbCAqLwogICAgeyBMQU5FX0NGRzVfUkVHLAkJCTB4ODAwLAkJMHg0LAkJeyAweDQgICAgICAgfSwJCTAsCQkJMAkgCX0sIC8qIFNwcmVhZCBTcGVjdHJ1bSBDbG9jayBFbmFibGUgKi8KfTsKCi8qIFBFWCBhbmQgVVNCMyAtIFRYIGNvbmZpZyBzZXEgKi8KCi8qIEZvciBQRVh4MTogdGhlIHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczEvMi8zIGNvbmZpZ3VyYXRpb25zIHNob3VsZCBydW4KCQkJICBvbmUgYnkgb25lIG9uIHRoZSBsYW5lLgogICBGb3IgUEVYeDQ6IHRoZSBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMxLzIvMyBjb25maWd1cmF0aW9ucyBzaG91bGQgcnVuCgkJCSAgYnkgc2V0dGluZyBlYWNoIHNlcXVlbmNlIGZvciBhbGwgNCBsYW5lcy4gKi8KTVZfT1BfUEFSQU1TIHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczFbXSA9CnsKICAgIC8qIHVuaXRCYXNlUmVnICAgIHVuaXRPZmZzZXQgICAgbWFzayAgICAgICAgUEVYIGRhdGEgICAgVVNCMyBkYXRhICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwogICAgeyBHTE9CQUxfQ0xLX0NUUkwsICAweDgwMCwgICAgICAweDEsICAgICAgICB7IDB4MCwgICAgICAweDAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LAogICAgeyAweDAsICAgICAgICAgICAgICAweDAsICAgICAgICAweDAsICAgICAgICB7IDB4MCwgICAgICAweDAgICAgIH0sICAgICAgMTAsICAgICAgICAgMCAgICAgICB9LCAvKiAxMG1zIGRlbGF5ICovCiAgICB7IFJYX1JFRzMsICAgICAgICAgIDB4ODAwLCAgICAgIDB4RkYsICAgICAgIHsgMHhEQywgICAgIE5PX0RBVEEgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIG9zX3BoX29mZnNldF9mb3JjZSAoYWxpZ24gOTApICovCiAgICB7IFJYX1JFRzMsICAgICAgICAgIDB4ODAwLCAgICAgIDB4MTAwLCAgICAgIHsgMHgxMDAsICAgIE5PX0RBVEEgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIFNldCBvc19waF92YWxpZCAqLwogICAgeyBSWF9SRUczLCAgICAgICAgICAweDgwMCwgICAgICAweDEwMCwgICAgICB7IDB4MCwgICAgICBOT19EQVRBIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBVbnNldCBvc19waF92YWxpZCAqLwp9OwoKTVZfT1BfUEFSQU1TIHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczJbXSA9CnsKCS8qIHVuaXRCYXNlUmVnICAgIHVuaXRPZmZzZXQgICAJbWFzayAgICAgICAgUEVYIGRhdGEgICAgVVNCMyBkYXRhICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwoJeyBSRVNFVF9ERkVfUkVHLCAgIAkweDgwMCwJICAgIDB4NDAxLCAgICAgIHsgMHg0MDEsICAgIDB4NDAxICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIFNmdCBSZXNldCBwdWxzZSAqLwp9OwoKTVZfT1BfUEFSQU1TIHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczNbXSA9CnsKCS8qIHVuaXRCYXNlUmVnICAgIHVuaXRPZmZzZXQgICAJbWFzayAgICAgICAgUEVYIGRhdGEgICAgVVNCMyBkYXRhICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwoJeyBSRVNFVF9ERkVfUkVHLCAgIAkweDgwMCwJCTB4NDAxLCAgICAgIHsgMHgwLCAgICAgIDB4MCAgICAgfSwgCSAgICAwLCAgICAgICAgICAwCQl9LCAvKiBTZnQgUmVzZXQgcHVsc2UgKi8KCXsgMHgwLAkJICAgCQkweDAsCQkweDAsCSAgICB7IDB4MCwgICAgICAweDAgICAgIH0sIAkgICAgMTAsCSAgICAgICAgMAkJfSAgLyogMTBtcyBkZWxheSAqLwp9OwoKLyogUEVYIGJ5IDQgY29uZmlnIHNlcSAqLwpNVl9PUF9QQVJBTVMgcGV4Qnk0Q29uZmlnUGFyYW1zW10gPQp7CgkvKiB1bml0dW5pdEJhc2VSZWcgICAgICB1bml0T2Zmc2V0ICAgbWFzayAgICAgICAgICAgZGF0YSAgICAgICAgICAgICAgICAJCQl3YWl0VGltZSAgIG51bU9mTG9vcHMgKi8KCXsgR0xPQkFMX0NMS19TUkNfSEksCTB4ODAwLCAgICAgICAweDcsICAgICAgeyAweDUsIDB4MCwgMHgwLCAweDIgCQkJfSwgICAgIAkwLCAgICAgICAgICAwICAgICAgIH0sCiAgICB7IExBTkVfQUxJR05fUkVHMCwgICAgICAweDgwMCwgICAgICAgMHgxMDAwLCAgIHsgMHgwLCAweDAsIDB4MCwgMHgwIAkJCX0sICAgICAJMCwJICAgICAgICAwICAgICAgIH0sIC8qIExhbmUgQWxpZ25lbWVudCBlbmFibGUgKi8KCXsgQ0FMSUJSQVRJT05fQ1RSTF9SRUcsCTB4ODAwLCAgICAgICAweDEwMDAsICAgeyAweDEwMDAsIDB4MTAwMCwgMHgxMDAwLCAweDEwMDAgfSwJCTAsCSAgICAgICAgMCAgICAgICB9LCAvKiBNYXggUExMIHBoeSBjb25maWcgKi8KCXsgTEFORV9DRkcxX1JFRywJCTB4ODAwLCAgICAgICAweDYwMCwgICAgeyAweDYwMCwgMHg2MDAsIDB4NjAwLCAweDYwMCAJfSwJCTAsCSAgICAgICAgMCAgICAgICB9LCAvKiBNYXggUExMIHBpcGUgY29uZmlnICovCn07CgovKiBVU0IzIGRldmljZSBkb25maWcgc2VxICovCk1WX09QX1BBUkFNUyB1c2IzRGV2aWNlQ29uZmlnUGFyYW1zW10gPQp7CgkvKiB1bml0dW5pdEJhc2VSZWcgIHVuaXRPZmZzZXQgIG1hc2sgICAgZGF0YSAgICAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwoJeyBMQU5FX0NGRzRfUkVHLCAgICAweDgwMCwgICAgICAweDIwMCwgIHsgMHgyMDAgfSwgIAkwLCAgICAgICAgICAwICAgICAgIH0KfTsKCi8qIFBFWCAtIGVsZWN0cmljYWwgY29uZmlndXJhdGlvbiBzZXEgUmV2IDEuMiAqLwpNVl9PUF9QQVJBTVMgcGV4RWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjFQYXJhbXNbXSA9CnsKICAgIC8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICB1bml0T2Zmc2V0ICBtYXNrICAgICAgICBQRVggZGF0YSAgICAgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCiAgICB7IEcxX1NFVFRJTkdTXzBfUkVHLCAgICAgICAgMHg4MDAsICAgICAgMHhGMDAwLCAgICAgeyAweEIwMDAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEcxX1RYX1NMRVdfQ1RSTF9FTiBhbmQgRzFfVFhfU0xFV19SQVRFICovCiAgICB7IEcxX1NFVFRJTkdTXzFfUkVHLCAgICAgICAgMHg4MDAsICAgICAgMHgzRkYsICAgICAgeyAweDNDOSAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEcxX1JYIFNFTE1VRkYsIFNFTE1VRkksIFNFTE1VUEYgYW5kIFNFTE1VUEkgKi8KICAgIHsgRzJfU0VUVElOR1NfMV9SRUcsICAgICAgICAweDgwMCwgICAgICAweDNGRiwgICAgICB7IDB4M0M5ICAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogRzJfUlggU0VMTVVGRiwgU0VMTVVGSSwgU0VMTVVQRiBhbmQgU0VMTVVQSSAqLwogICAgeyBMQU5FX0NGRzRfUkVHLCAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4OCwgICAgICAgIHsgMHg4ICAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBDRkdfREZFX0VOX1NFTCAqLwogICAgeyBTUVVFTENIX0ZGRV9TRVRUSU5HX1JFRywgIDB4ODAwLCAgICAgIDB4RkYsICAgICAgIHsgMHhBRiAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBGRkUgU2V0dGluZyBGb3JjZSwgUkVTIGFuZCBDQVAgKi8KICAgIHsgVlRISU1QQ0FMX0NUUkxfUkVHLCAgICAgICAweDgwMCwgICAgICAweEZGMDAsICAgICB7IDB4MzAwMCAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogdHhpbXBjYWxfdGggYW5kIHJ4aW1wY2FsX3RoICovCiAgICB7IENBTF9SRUc2LCAgICAgICAgICAgICAgICAgMHg4MDAsICAgICAgMHhGRjAwLCAgICAgeyAweERDMDAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIGNhbF9yeGNsa2FsaWduOTBfZXh0X2VuIGFuZCBjYWxfb3NfcGhfZXh0ICovCn07CgovKiBQRVggLSBlbGVjdHJpY2FsIGNvbmZpZ3VyYXRpb24gc2VxIFJldiAyLjEgKi8KTVZfT1BfUEFSQU1TIHBleEVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zW10gPQp7CiAgICAvKiB1bml0dW5pdEJhc2VSZWcgICAgICAgICAgdW5pdE9mZnNldCAgbWFzayAgICAgICAgUEVYIGRhdGEgICAgICAgd2FpdFRpbWUgICAgbnVtT2ZMb29wcyAqLwogICAgeyBHMV9TRVRUSU5HU18wX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4RjAwMCwgICAgIHsgMHhCMDAwICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBHMV9UWF9TTEVXX0NUUkxfRU4gYW5kIEcxX1RYX1NMRVdfUkFURSAqLwogICAgeyBHMV9TRVRUSU5HU18xX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4M0ZGLCAgICAgIHsgMHgzQzkgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBHMV9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCiAgICB7IEcxX1NFVFRJTkdTXzNfUkVHLCAgICAgICAgMHg4MDAsICAgICAgMHhGRiwgICAgICAgeyAweENGICAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEcxIEZGRSBTZXR0aW5nIEZvcmNlLCBSRVMgYW5kIENBUCAqLwogICAgeyBHMl9TRVRUSU5HU18xX1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4M0ZGLCAgICAgIHsgMHgzQzkgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBHMl9SWCBTRUxNVUZGLCBTRUxNVUZJLCBTRUxNVVBGIGFuZCBTRUxNVVBJICovCiAgICB7IEcyX1NFVFRJTkdTXzNfUkVHLCAgICAgICAgMHg4MDAsICAgICAgMHhGRiwgICAgICAgeyAweEFGICAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEcyIEZGRSBTZXR0aW5nIEZvcmNlLCBSRVMgYW5kIENBUCAqLwogICAgeyBHMl9TRVRUSU5HU180X1JFRywgICAgICAgIDB4ODAwLCAgICAgIDB4MzAwLCAgICAgIHsgMHgzMDAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBHMiBERkUgcmVzb2x1dGlvbiB2YWx1ZSAqLwogICAgeyBERkVfUkVHMCwgICAgICAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4ODAwMCwgICAgIHsgMHg4MDAwICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBERkUgcmVzb2x1dGlvbiBmb3JjZSAqLwogICAgeyBQQ0lFX1JFRzEsICAgICAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4RjgwLCAgICAgIHsgMHhEMDAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBUeCBhbXBsaXR1ZGUgZm9yIFR4IE1hcmdpbiAwICovCiAgICB7IFBDSUVfUkVHMywgICAgICAgICAgICAgICAgMHg4MDAsICAgICAgMHhGRjAwLCAgICAgeyAweEFGMDAgICAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIFR4X0VtcGggdmFsdWUgZm9yIC0zLjVkQiBhbmQgLTZkQiAqLwogICAgeyBMQU5FX0NGRzRfUkVHLCAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4OCwgICAgICAgIHsgMHg4ICAgICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBDRkdfREZFX0VOX1NFTCAqLwogICAgeyBWVEhJTVBDQUxfQ1RSTF9SRUcsICAgICAgIDB4ODAwLCAgICAgIDB4RkYwMCwgICAgIHsgMHgzMDAwICAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiB0eGltcGNhbF90aCBhbmQgcnhpbXBjYWxfdGggKi8KfTsKCi8qIFBFWCAtIGNvbmZpZ3VyYXRpb24gc2VxIGZvciBSRUZfQ0xPQ0tfMjVNSHogKi8KTVZfT1BfUEFSQU1TIHBleENvbmZpZ1JlZkNsb2NrMjVNSHpbXSA9CnsKICAgIC8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICB1bml0T2Zmc2V0ICBtYXNrICAgICAgICBQRVggZGF0YSAgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCiAgICB7IFBPV0VSX0FORF9QTExfQ1RSTF9SRUcsICAgMHg4MDAsICAgICAgMHgxRiwgICAgICAgeyAweDIgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogQml0c1s0OjBdPTB4MiAtIFJFRl9GUkVGX1NFTCAqLwogICAgeyBNSVNDX1JFRywgICAgICAgICAgICAgICAgIDB4ODAwLCAgICAgIDB4NDAwLCAgICAgIHsgMHg0MDAgfSwgICAgICAwLCAgICAgICAgICAwICAgICAgIH0sIC8qIEJpdFsxMF09MHgxICAgLSBSRUZDTEtfU0VMICovCiAgICB7IEdMT0JBTF9QTV9DVFJMLCAgICAgICAgICAgMHg4MDAsICAgICAgMHhGRiwgICAgICAgeyAweDcgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogQml0c1s3OjBdPTB4NyAtIENGR19QTV9SWERMT1pfV0FJVCAqLwp9OwoKLyogUEVYIC0gY29uZmlndXJhdGlvbiBzZXEgZm9yIFJFRl9DTE9DS180ME1IeiAqLwpNVl9PUF9QQVJBTVMgcGV4Q29uZmlnUmVmQ2xvY2s0ME1IeltdID0KewogICAgLyogdW5pdHVuaXRCYXNlUmVnICAgICAgICAgIHVuaXRPZmZzZXQgIG1hc2sgICAgICAgIFBFWCBkYXRhICAgIHdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KICAgIHsgUE9XRVJfQU5EX1BMTF9DVFJMX1JFRywgICAweDgwMCwgICAgICAweDFGLCAgICAgICB7IDB4MyAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBCaXRzWzQ6MF09MHgzIC0gUkVGX0ZSRUZfU0VMICovCiAgICB7IE1JU0NfUkVHLCAgICAgICAgICAgICAgICAgMHg4MDAsICAgICAgMHg0MDAsICAgICAgeyAweDQwMCB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogQml0c1sxMF09MHgxICAtIFJFRkNMS19TRUwgKi8KICAgIHsgR0xPQkFMX1BNX0NUUkwsICAgICAgICAgICAweDgwMCwgICAgICAweEZGLCAgICAgICB7IDB4QyAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBCaXRzWzc6MF09MHhDIC0gQ0ZHX1BNX1JYRExPWl9XQUlUICovCn07CgovKiBQRVggLSBjb25maWd1cmF0aW9uIHNlcSBmb3IgUkVGX0NMT0NLXzEwME1IeiAqLwpNVl9PUF9QQVJBTVMgcGV4Q29uZmlnUmVmQ2xvY2sxMDBNSHpbXSA9CnsKICAgIC8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICB1bml0T2Zmc2V0ICBtYXNrICAgICAgICBQRVggZGF0YSAgICB3YWl0VGltZSAgICBudW1PZkxvb3BzICovCiAgICB7IFBPV0VSX0FORF9QTExfQ1RSTF9SRUcsICAgMHg4MDAsICAgICAgMHgxRiwgICAgICAgeyAweDAgICB9LCAgICAgIDAsICAgICAgICAgIDAgICAgICAgfSwgLyogQml0c1s0OjBdPTB4MCAgLSBSRUZfRlJFRl9TRUwgKi8KICAgIHsgTUlTQ19SRUcsICAgICAgICAgICAgICAgICAweDgwMCwgICAgICAweDQwMCwgICAgICB7IDB4MCAgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBCaXRbMTBdPTB4MCAgICAtIFJFRkNMS19TRUwgKi8KICAgIHsgR0xPQkFMX1BNX0NUUkwsICAgICAgICAgICAweDgwMCwgICAgICAweEZGLCAgICAgICB7IDB4MUUgIH0sICAgICAgMCwgICAgICAgICAgMCAgICAgICB9LCAvKiBCaXRzWzc6MF09MHgxRSAtIENGR19QTV9SWERMT1pfV0FJVCAqLwp9OwoKLyoqKioqKioqKioqKioqKioqLwovKiAgICBVU0IyICAgICAgICovCi8qKioqKioqKioqKioqKioqKi8KCk1WX09QX1BBUkFNUyB1c2IyUG93ZXJVcFBhcmFtc1tdID0KewoJLyogdW5pdHVuaXRCYXNlUmVnIHVuaXRPZmZzZXQgICBtYXNrICAgICAgIFVTQjIgZGF0YSAgd2FpdFRpbWUgIG51bU9mTG9vcHMgKi8KCXsgMHgxODQ0MCAsICAgICAgICAweDAgLypOQSovLAkweGZmZmZmZmZmLCB7MHg2Mn0sICAgICAgIDAsICAgICAgICAwfSwgLyogSW5pdCBwaHkgMCAqLwoJeyAweDE4NDQ0ICwgICAgICAgIDB4MCAvKk5BKi8sCTB4ZmZmZmZmZmYsIHsweDYyfSwgICAgICAgMCwgICAgICAgIDB9LCAvKiBJbml0IHBoeSAxICovCgl7IDB4MTg0NDggLCAgICAgICAgMHgwIC8qTkEqLywJMHhmZmZmZmZmZiwgezB4NjJ9LCAgICAgICAwLCAgICAgICAgMH0sIC8qIEluaXQgcGh5IDIgKi8KCXsgMHhDMDAwMCAsICAgICAgICAweDAgLypOQSovLAkweGZmZmZmZmZmLCB7MHg0MDYwNTIwNX0sIDAsICAgICAgICAwfSwgLyogUGh5IG9mZnNldCAweDAgLSBQTExfQ09OVFJPTDAgICovCgl7IDB4QzAwMUMgLCAgICAgICAgMHgwIC8qTkEqLywJMHhmZmZmZmZmZiwgezB4MzlGMTZDRX0sICAwLCAgICAgICAgMH0sCgl7IDB4QzIwMUMgLCAgICAgICAgMHgwIC8qTkEqLywJMHhmZmZmZmZmZiwgezB4MzlGMTZDRX0sICAwLCAgICAgICAgMH0sCgl7IDB4QzQwMUMgLCAgICAgICAgMHgwIC8qTkEqLywJMHhmZmZmZmZmZiwgezB4MzlGMTZDRX0sICAwLCAgICAgICAgMH0sCgl7IDB4QzAwMDQgLCAgICAgICAgMHgwIC8qTkEqLywJMHgxLCAgICAgICAgezB4MX0sICAgICAgICAwLCAgICAgICAgMH0sIC8qIFBoeSBvZmZzZXQgMHgxIC0gUExMX0NPTlRST0wxICovCgl7IDB4QzAwMEMgLCAgICAgICAgMHgwIC8qTkEqLywJMHgxMDAwMDAwLCAgezB4MTAwMDAwMH0sICAwLCAgICAgICAgMH0sIC8qIFBoeTAgcmVnaXN0ZXIgMyAgLSBUWCBDaGFubmVsIGNvbnRyb2wgMCAqLwoJeyAweEMyMDBDICwgICAgICAgIDB4MCAvKk5BKi8sCTB4MTAwMDAwMCwgIHsweDEwMDAwMDB9LCAgMCwgICAgICAgIDB9LCAvKiBQaHkwIHJlZ2lzdGVyIDMgIC0gVFggQ2hhbm5lbCBjb250cm9sIDAgKi8KCXsgMHhDNDAwQyAsICAgICAgICAweDAgLypOQSovLAkweDEwMDAwMDAsICB7MHgxMDAwMDAwfSwgIDAsICAgICAgICAwfSwgLyogUGh5MCByZWdpc3RlciAzICAtIFRYIENoYW5uZWwgY29udHJvbCAwICovCgl7IDB4QzAwMDggLCAgICAgICAgMHgwIC8qTkEqLywJMHg4MDgwMDAwMCwgezB4ODA4MDAwMDB9LCAxLCAgICAgMTAwMH0sIC8qIGNoZWNrIFBMTENBTF9ET05FIGlzIHNldCBhbmQgSU1QQ0FMX0RPTkUgaXMgc2V0Ki8KCXsgMHhDMDAxOCAsICAgICAgICAweDAgLypOQSovLAkweDgwMDAwMDAwLCB7MHg4MDAwMDAwMH0sIDEsICAgICAxMDAwfSwgLyogY2hlY2sgUkVHX1NRQ0FMX0RPTkUgIGlzIHNldCovCgl7IDB4QzAwMDAgLCAgICAgICAgMHgwIC8qTkEqLywJMHg4MDAwMDAwMCwgezB4ODAwMDAwMDB9LCAxLCAgICAgMTAwMH0gIC8qIGNoZWNrIFBMTF9SRUFEWSAgaXMgc2V0Ki8KfTsKCi8qKioqKioqKioqKioqKioqKi8KLyogICAgUVNHTUlJICAgICAqLwovKioqKioqKioqKioqKioqKiovCgovKiBRU0dNSUkgLSBwb3dlciB1cCBzZXEgKi8KTVZfT1BfUEFSQU1TIHFzZ21paVBvcnRQb3dlclVwUGFyYW1zW10gPQp7CgkvKiB1bml0QmFzZVJlZyAgICAgICAgICAgICAgICAgICAgdW5pdE9mZnNldCAgIAltYXNrICAgICAgICAgUVNHTUlJIGRhdGEJCXdhaXRUaW1lICAgbnVtT2ZMb29wcyAqLwoJeyBRU0dNSUlfQ09OVFJPTF9SRUcxLAkJCQkweDAsICAJCTB4NDAwMDAwMDAsCXsgMHg0MDAwMDAwMAl9LCAJICAgMCwJCSAgMCB9LAkgIC8qIENvbm5lY3QgdGhlIFFTR01JSSB0byBHaWdhYml0IEV0aGVybmV0IHVuaXRzICovCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLAkweDI4LCAgCQkweEYwMDA2LAl7IDB4ODAwMDIJCX0sIAkgICAwLAkJICAwIH0sCSAgLyogUG93ZXIgVXAgKi8KCXsgQ09NTU9OX1BIWV9DT05GSUdVUkFUSU9OMV9SRUcsCTB4MjgsCQkweDc4MDAsCSAgICB7IDB4NjAwMAkJfSwgCSAgIDAsCQkgIDAgfSwJICAvKiBVbnJlc2V0ICovCgl7IFBPV0VSX0FORF9QTExfQ1RSTF9SRUcsCQkJMHg4MDAsCQkweEZGLAkgICAgeyAweEZDODEJCX0sIAkgICAwLAkJICAwIH0sCSAgLyogUGh5IFNlbGVjdG9yICovCgl7IE1JU0NfUkVHLAkJCQkJCQkweDgwMCwJICAgIDB4NEMwLAkgICAgeyAweDQ4MAkJCX0sICAgICAwLAkgICAgICAwIH0gCSAgLyogUmVmIGNsb2NrIHNvdXJjZSBzZWxlY3QgKi8KfTsKCi8qIFFTR01JSSAtIHNwZWVkIGNvbmZpZyBzZXEgKi8KTVZfT1BfUEFSQU1TIHFzZ21paVBvcnRTcGVlZENvbmZpZ1BhcmFtc1tdID0KewoJLyogdW5pdEJhc2VSZWcgIAkJCQkgIHVuaXRPZmZzZXQgICAJbWFzayAgICAgICAgICBRU0dNSUkJCXdhaXRUaW1lICAgbnVtT2ZMb29wcyAqLwogICAgeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgICAweDI4LAkJMHgzRkMwMDAwMCwJeyAweENDMDAwMDAJfSwgCQkwLAkJICAgMCB9LCAvKiBCYXVkIFJhdGUgKi8KCXsgSVNPTEFURV9SRUcsCSAJCQkJICAgMHg4MDAsCSAgICAweEZGLAkgICAgeyAweDMzCQl9LCAJCTAsCSAgICAgICAwIH0sIC8qIFBoeSBHZW4gUlggYW5kIFRYICovCgl7IExPT1BCQUNLX1JFRywJIAkJCQkgICAweDgwMCwJICAgIDB4RSwJICAgIHsgMHgyCQl9LCAJCTAsCSAgICAgICAwIH0gIC8qIEJ1cyBXaWR0aCAqLwp9OwoKLyogUVNHTUlJIC0gU2VsZWN0IGVsZWN0cmljYWwgcGFyYW0gc2VxICovCk1WX09QX1BBUkFNUyBxc2dtaWlQb3J0RWxlY3RyaWNhbENvbmZpZ1BhcmFtc1tdID0KewoJLyogdW5pdHVuaXRCYXNlUmVnCQl1bml0T2Zmc2V0ICAgbWFzawkJCVFTR01JSSBkYXRhCQl3YWl0VGltZSAgICBudW1PZkxvb3BzICovCgl7IEcxX1NFVFRJTkdTXzBfUkVHLAkweDgwMCwJCSAweDgwMDAsCSAgeyAweDAJfSwJCQkwLAkJCQkwCQl9IC8qIFNsZXcgcmF0ZSBhbmQgZW1waGFzaXMgKi8KfTsKCi8qIFFTR01JSSAtIFRYIGNvbmZpZyBzZXEgKi8KTVZfT1BfUEFSQU1TIHFzZ21paVBvcnRUeENvbmZpZ1BhcmFtczFbXSA9CnsKCS8qIHVuaXR1bml0QmFzZVJlZyAgICAgICAgICAgICAgIHVuaXRPZmZzZXQgICBtYXNrICAgICAgICAgIFFTR01JSSBkYXRhCQl3YWl0VGltZSAgICBudW1PZkxvb3BzICovCgl7IEdMVUVfUkVHLAkJCSAgICAgICAgICAgICAgMHg4MDAsCSAgMHgxODAwLCAgICAgeyAweDgwMAkJfSwgICAgIDAsCSAgICAgICAwCQkgICB9LAoJeyBSRVNFVF9ERkVfUkVHLAkJICAgICAgICAgIDB4ODAwLAkgIDB4NDAxLAkgIHsgMHg0MDEJCX0sICAgICAwLAkgICAgICAgMAkJICAgfSwgLyogU2Z0IFJlc2V0IHB1bHNlICovCgl7IFJFU0VUX0RGRV9SRUcsCQkgICAgICAgICAgMHg4MDAsCSAgMHg0MDEsCSAgeyAweDAJCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0sIC8qIFNmdCBSZXNldCBwdWxzZSAqLwogICAgeyBMQU5FX0FMSUdOX1JFRzAsICAgICAgICAgICAgICAgIDB4ODAwLAkgIDB4MTAwMCwJICB7IDB4MTAwMAkJfSwgICAgIDAsCSAgICAgICAwCQkgICB9LCAvKiBMYW5lIGFsaWduICovCiAgICB7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgMHgyOCwJCSAgMHg3MDAwMCwgICAgeyAweDcwMDAwCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0sIC8qIFBvd2VyIHVwIFBMTCwgUlggYW5kIFRYICovCiAgICB7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAgMHgyOCwJCSAgMHg4MDAwMCwgICAgeyAweDgwMDAwCQl9LCAgICAgMCwJICAgICAgIDAJCSAgIH0gIC8qIFR4IGRyaXZlciBvdXRwdXQgaWRsZSAqLwp9OwoKTVZfT1BfUEFSQU1TIHFzZ21paVBvcnRUeENvbmZpZ1BhcmFtczJbXSA9CnsKCS8qIHVuaXR1bml0QmFzZVJlZwkJCQl1bml0T2Zmc2V0CQltYXNrCQkJUVNHTUlJIGRhdGEJCXdhaXRUaW1lICAgIG51bU9mTG9vcHMgKi8KCXsgQ09NTU9OX1BIWV9TVEFUVVMxX1JFRywJCQkweDI4LAkJMHhDLAkJCXsgMHhDCQkJfSwJMTAsCQkJMTAwMAkJfSwJLyogV2FpdCBmb3IgUEhZIHBvd2VyIHVwIHNlcXVlbmNlIHRvIGZpbmlzaCAqLwoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywJMHgyOCwJCTB4NDAwODAwMDAsCQl7IDB4NDAwMDAwMDAJfSwJMCwJCQkwCQkJfSwgIC8qIEFzc2VydCBSeCBJbml0IGFuZCBUeCBkcml2ZXIgb3V0cHV0IHZhbGlkICovCgl7IENPTU1PTl9QSFlfU1RBVFVTMV9SRUcsCQkJMHgyOCwJICAgIDB4MSwJCQl7IDB4MQkJCX0sICAxLAkJCTEwMDAJICAgIH0sICAvKiBXYWl0IGZvciBQSFkgcG93ZXIgdXAgc2VxdWVuY2UgdG8gZmluaXNoICovCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLAkweDI4LAkJMHg0MDAwMDAwMCwJCXsgMHgwCQkJfSwJMCwJCQkwCQkgICAgfSAgIC8qIERlLWFzc2VydCBSeCBJbml0ICovCn07CgoKLyogU0VSREVTX1BPV0VSX0RPV04gKi8KTVZfT1BfUEFSQU1TIHNlcmRlc1Bvd2VyRG93blBhcmFtc1tdID0KewoJeyBDT01NT05fUEhZX0NPTkZJR1VSQVRJT04xX1JFRywgMHgyOCwgKDB4RiA8PCAxMSksIHsgKDB4MyA8PCAxMSkgfSwgMCwJICAgICAwCX0sCgl7IENPTU1PTl9QSFlfQ09ORklHVVJBVElPTjFfUkVHLCAweDI4LCAoMHg3IDw8IDE2KSwgeyAwCQkgIH0sIDAsCSAgICAgMAl9Cn07CgovKioqKioqKioqKioqKioqKioqKioqKioqKiBMb2NhbCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zICoqKioqKioqKioqKioqKioqKioqKioqLwovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12Q3RybFNlcmRlc1JldkdldAoqCiogREVTQ1JJUFRJT046IEdldCB0aGUgU2VyZGVzIHJldmlzaW9uIG51bWJlcgoqCiogSU5QVVQ6IGNvbmZpZ0ZpZWxkIC0gRmllbGQgZGVzY3JpcHRpb24gZW51bQoqCiogT1VUUFVUOiBOb25lCioKKiBSRVRVUk46CiogCQk4Yml0IFNlcmRlcyByZXZpc2lvbiBudW1iZXIKKgoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNVl9VOCBtdkh3c0N0cmxTZXJkZXNSZXZHZXQoTVZfVk9JRCkKewojaWZkZWYgTVY4OEY2OFhYCiAgICAvKiBmb3IgQTM4eC1aMSAqLwogICAgaWYgKG12U3lzRW52RGV2aWNlUmV2R2V0KCkgPT0gTVZfODhGNjhYWF9aMV9JRCkgewogICAgICAgIHJldHVybiBNVl9TRVJERVNfUkVWXzFfMjsKICAgIH0KI2VuZGlmCiAgICAvKiBmb3IgQTM5eC1aMSwgQTM4eC1BMCAqLwogICAgcmV0dXJuIE1WX1NFUkRFU19SRVZfMl8xOwp9CgpNVl9VMzIgbXZId3NTZXJkZXNUb3BvbG9neVZlcmlmeShTRVJERVNfVFlQRSBzZXJkZXNUeXBlLCBNVl9VMzIgc2VyZGVzSWQsIFNFUkRFU19NT0RFIHNlcmRlc01vZGUpCnsKCglNVl9VMzIgdGVzdFJlc3VsdCA9IDA7CglNVl9VOCBzZXJkTWF4TnVtYix1bml0TnVtYjsKCU1WX1VOSVRfSUQgdW5pdElkOwoKCWlmIChzZXJkZXNUeXBlID4gUlhBVUkpewoJCW12UHJpbnRmKCIlczogV2FybmluZzogV3Jvbmcgc2VyZGVzIHR5cGUgJXMgc2VyZGVzIyVkIFxuIiwgX19mdW5jX18sIHNlcmRlc1R5cGVUb1N0cmluZ1tzZXJkZXNUeXBlXSwgc2VyZGVzSWQpOwoJCXJldHVybiBNVl9GQUlMOwoJfQoJdW5pdElkID0gc2VyZGVzVHlwZVRvVW5pdEluZm9bc2VyZGVzVHlwZV0uc2VyZGVzVW5pdElkOwoJdW5pdE51bWIgPXNlcmRlc1R5cGVUb1VuaXRJbmZvW3NlcmRlc1R5cGVdLnNlcmRlc1VuaXROdW07CglzZXJkTWF4TnVtYiA9IG12U3lzRW52VW5pdE1heE51bUdldCh1bml0SWQpOwoKCWlmIChTZXJkZXNMYW5lSW5Vc2VDb3VudFt1bml0SWRdW3VuaXROdW1iXSAhPSAwKSB7CQkvKiBpZiBkaWRuJ3QgZXhjZWVkIGFtb3VudCBvZiByZXF1aXJlZCBTZXJkZXMgbGFuZXMgZm9yIGN1cnJlbnQgdHlwZSAqLwoJCVNlcmRlc0xhbmVJblVzZUNvdW50W3VuaXRJZF1bdW5pdE51bWJdLS07CQkJLyogdXBkYXRlIGFtb3VudCBvZiByZXF1aXJlZCBTZXJkZXMgbGFuZXMgZm9yIGN1cnJlbnQgdHlwZSAqLwoKCQlpZiAoU2VyZGVzTGFuZUluVXNlQ291bnRbdW5pdElkXVt1bml0TnVtYl0gPT0gMCl7CS8qIGlmIHJlYWNoZWQgdGhlIGV4YWN0IGFtb3VudCBvZiByZXF1aXJlZCBTZXJkZXMgbGFuZXMgZm9yIGN1cnJlbnQgdHlwZSAqLwoJCWlmICgoKHNlcmRlc1R5cGUgPD0gUEVYMykpICYmICgoc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3g0KSB8fCAoc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3g0KSkpCgkJCXNlcmRlc1VuaXRDb3VudFtQRVhfVU5JVF9JRF0gKz0yOwkJCQkvKiBQQ2lleDQgdXNlcyAyIFNlckRlcyAqLwoJCWVsc2UKCQkJc2VyZGVzVW5pdENvdW50W3VuaXRJZF0rKzsKCgkJaWYgKHNlcmRlc1VuaXRDb3VudFt1bml0SWRdID4gc2VyZE1heE51bWIpCQkJLyogdGVzdCBTb0MgdW5pdCBjb3VudCBsaW1pdGF0aW9uICovCgkJCXRlc3RSZXN1bHQgPSBXUk9OR19OVU1CRVJfT0ZfVU5JVFM7CgkJZWxzZSBpZiAodW5pdE51bWIgPj0gc2VyZE1heE51bWIpCQkJCQkvKiB0ZXN0IFNvQyB1bml0IG51bWJlciBsaW1pdGF0aW9uICovCgkJCXRlc3RSZXN1bHQgPSBVTklUX05VTUJFUl9WSU9MQVRJT047CgkJfQoJfQoJZWxzZQoJewoJCXRlc3RSZXN1bHQgPSBTRVJERVNfQUxSRUFEWV9JTl9VU0U7CgkJaWYgKHRlc3RSZXN1bHQgPT0gU0VSREVTX0FMUkVBRFlfSU5fVVNFKQoJCXsKCQkJbXZQcmludGYoIiVzOiBFcnJvcjogc2VyZGVzIGxhbmUgJWQgaXMgY29uZmlndXJlZCB0byB0eXBlICVzOiB0eXBlIGFscmVhZHkgaW4gdXNlXG4iLCBfX2Z1bmNfXywgc2VyZGVzSWQsIHNlcmRlc1R5cGVUb1N0cmluZ1tzZXJkZXNUeXBlXSk7CgkJCXJldHVybiBNVl9GQUlMOwoJCX0KCQllbHNlIGlmICh0ZXN0UmVzdWx0ID09IFdST05HX05VTUJFUl9PRl9VTklUUykKCQl7CgkJCW12UHJpbnRmKCIlczogV2FybmluZzogc2VyZGVzIGxhbmUgJWQgaXMgc2V0IHRvIHR5cGUgJXMuXG4iLCBfX2Z1bmNfXywgc2VyZGVzSWQsc2VyZGVzVHlwZVRvU3RyaW5nW3NlcmRlc1R5cGVdKTsKCQkJbXZQcmludGYoIiVzOiBNYXhpbXVtIHN1cHBvcnRlZCBsYW5lcyBhcmUgYWxyZWFkeSBzZXQgdG8gdGhpcyB0eXBlIChsaW1pdCA9ICVkKVxuIiwgX19mdW5jX18sIHNlcmRNYXhOdW1iKTsKCQkJcmV0dXJuIE1WX0ZBSUw7CgkJfQoKCQllbHNlIGlmICh0ZXN0UmVzdWx0ID09IFVOSVRfTlVNQkVSX1ZJT0xBVElPTikKCQl7CgkJCW12UHJpbnRmKCIlczogV2FybmluZzogc2VyZGVzIGxhbmUgJWQgdHlwZSBpcyAlczogY3VycmVudCBkZXZpY2Ugc3VwcG9ydCBvbmx5ICVkIHVuaXRzIG9mIHRoaXMgdHlwZS5cbiIsIF9fZnVuY19fLCBzZXJkZXNJZCwgc2VyZGVzVHlwZVRvU3RyaW5nW3NlcmRlc1R5cGVdLHNlcmRNYXhOdW1iICk7CgkJCXJldHVybiBNVl9GQUlMOwoJCX0KCX0KCXJldHVybiBNVl9PSzsKfQoKTVZfVk9JRCBtdkh3c1NlcmRlc1hBVUlUb3BvbG9neVZlcmlmeShNVl9WT0lEKQp7CiBpZiAoKFNlcmRlc0xhbmVJblVzZUNvdW50W1hBVUlfVU5JVF9JRF1bMF0gIT0gMCkgJiYgICAoU2VyZGVzTGFuZUluVXNlQ291bnRbWEFVSV9VTklUX0lEXVswXSAhPSA0KSl7IC8qIGlmICBYQVVJIGlzIGluIHVzZSAtIFNlcmRlc0xhbmVJblVzZUNvdW50IGhhcyB0byBiZSA9IDA7CgkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgICAgIGlmIGl0IGlzIG5vdCBpbiB1c2UgIGhhc3QgYmUgPSA0ICovCiAJbXZQcmludGYoIiVzOiBXYXJuaW5nOiB3cm9uZyBudW1iZXIgb2YgbGFuZXMgaXMgc2V0IHRvIFhBVUkgLSAlZFxuIiwgX19mdW5jX18sIFNlcmRlc0xhbmVJblVzZUNvdW50W1hBVUlfVU5JVF9JRF1bMF0pOwoJbXZQcmludGYoIiVzOiBYQVVJIGhhcyB0byBiZSBkZWZpbmVkIG9uIDQgbGFuZXNcbiIsIF9fZnVuY19fKTsKIH0KCiBpZiAoKFNlcmRlc0xhbmVJblVzZUNvdW50W1JYQVVJX1VOSVRfSURdWzBdICE9IDApICYmICAgKFNlcmRlc0xhbmVJblVzZUNvdW50W1JYQVVJX1VOSVRfSURdWzBdICE9IDIpKXsvKiBpZiAgUlhBVUkgaXMgaW4gdXNlIC0gU2VyZGVzTGFuZUluVXNlQ291bnQgaGFzIHRvIGJlID0gMDsKCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkgIGlmIGl0IGlzIG5vdCBpbiB1c2UgIGhhc3QgYmUgPSAyICovCgltdlByaW50ZigiJXM6IFdhcm5pbmc6IHdyb25nIG51bWJlciBvZiBsYW5lcyBpcyBzZXQgdG8gUlhBVUkgLSAlZFxuIiwgX19mdW5jX18sIFNlcmRlc0xhbmVJblVzZUNvdW50W1JYQVVJX1VOSVRfSURdWzBdKTsKCW12UHJpbnRmKCIlczogUlhBVUkgaGFzIHRvIGJlIGRlZmluZWQgb24gMiBsYW5lc1xuIiwgX19mdW5jX18pOwogfQoKfQoKTVZfU1RBVFVTIG12SHdzU2VyZGVzU2VxRGJJbml0KE1WX1ZPSUQpCnsKCURFQlVHX0lOSVRfRlVMTF9TKCJcbiMjIyBzZXJkZXNTZXEzOHhJbml0ICMjI1xuIik7CglNVl9VOCBzZXJkZXNSZXYgPSBtdkh3c0N0cmxTZXJkZXNSZXZHZXQoKTsKCglpZihzZXJkZXNSZXYgPT0gTVZfU0VSREVTX1JFVl9OQSkgewoJCW12UHJpbnRmKCJtdkh3c1NlcmRlc1NlcURiSW5pdDogc2VyZGVzIHJldmlzaW9uIG51bWJlciBpcyBub3Qgc3VwcG9ydGVkXG4iKTsKCQlyZXR1cm4gTVZfTk9UX1NVUFBPUlRFRDsKCX0KCgkvKiBTQVRBX1BPUlRfMF9PTkxZX1BPV0VSX1VQX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltTQVRBX1BPUlRfMF9PTkxZX1BPV0VSX1VQX1NFUV0ub3BQYXJhbXNQdHIgPSBzYXRhUG9ydDBQb3dlclVwUGFyYW1zOwoJc2VyZGVzU2VxRGJbU0FUQV9QT1JUXzBfT05MWV9QT1dFUl9VUF9TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNhdGFQb3J0MFBvd2VyVXBQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltTQVRBX1BPUlRfMF9PTkxZX1BPV0VSX1VQX1NFUV0uZGF0YUFycklkeCAgPSBTQVRBOwoKCS8qIFNBVEFfUE9SVF8xX09OTFlfUE9XRVJfVVBfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1NBVEFfUE9SVF8xX09OTFlfUE9XRVJfVVBfU0VRXS5vcFBhcmFtc1B0ciA9IHNhdGFQb3J0MVBvd2VyVXBQYXJhbXM7CglzZXJkZXNTZXFEYltTQVRBX1BPUlRfMV9PTkxZX1BPV0VSX1VQX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YVBvcnQxUG93ZXJVcFBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1NBVEFfUE9SVF8xX09OTFlfUE9XRVJfVVBfU0VRXS5kYXRhQXJySWR4ICA9IFNBVEE7CgoJLyogU0FUQV9QT1dFUl9VUF9TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbU0FUQV9QT1dFUl9VUF9TRVFdLm9wUGFyYW1zUHRyID0gc2F0YUFuZFNnbWlpUG93ZXJVcFBhcmFtczsKCXNlcmRlc1NlcURiW1NBVEFfUE9XRVJfVVBfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhQW5kU2dtaWlQb3dlclVwUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbU0FUQV9QT1dFUl9VUF9TRVFdLmRhdGFBcnJJZHggID0gU0FUQTsKCgkvKiBTQVRBX18xXzVfU1BFRURfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltTQVRBX18xXzVfU1BFRURfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlTcGVlZENvbmZpZ1BhcmFtczsKCXNlcmRlc1NlcURiW1NBVEFfXzFfNV9TUEVFRF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhQW5kU2dtaWlTcGVlZENvbmZpZ1BhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1NBVEFfXzFfNV9TUEVFRF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ICA9IFNBVEE7CgoJLyogU0FUQV9fM19TUEVFRF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1NBVEFfXzNfU1BFRURfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlTcGVlZENvbmZpZ1BhcmFtczsKCXNlcmRlc1NlcURiW1NBVEFfXzNfU1BFRURfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YUFuZFNnbWlpU3BlZWRDb25maWdQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltTQVRBX18zX1NQRUVEX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gU0FUQTsKCgkvKiBTQVRBX182X1NQRUVEX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbU0FUQV9fNl9TUEVFRF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHNhdGFBbmRTZ21paVNwZWVkQ29uZmlnUGFyYW1zOwoJc2VyZGVzU2VxRGJbU0FUQV9fNl9TUEVFRF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhQW5kU2dtaWlTcGVlZENvbmZpZ1BhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1NBVEFfXzZfU1BFRURfQ09ORklHX1NFUV0uZGF0YUFycklkeCAgPSBTQVRBOwoKICAgIC8qIFNBVEFfRUxFQ1RSSUNBTF9DT05GSUdfU0VRIHNlcSBzZXF1ZW5jZSBpbml0ICovCiAgICBpZihzZXJkZXNSZXYgPT0gTVZfU0VSREVTX1JFVl8xXzIpIHsKCQlzZXJkZXNTZXFEYltTQVRBX0VMRUNUUklDQUxfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBzYXRhRWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjFQYXJhbXM7CgkJc2VyZGVzU2VxRGJbU0FUQV9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNhdGFFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MVBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKICAgIH0gZWxzZSB7CgkJc2VyZGVzU2VxRGJbU0FUQV9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gc2F0YUVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zOwoJCXNlcmRlc1NlcURiW1NBVEFfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhRWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjJQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7Cgl9CglzZXJkZXNTZXFEYltTQVRBX0VMRUNUUklDQUxfQ09ORklHX1NFUV0uZGF0YUFycklkeCAgPSBTQVRBOwoKICAgIC8qIFNBVEFfVFhfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCiAgICBzZXJkZXNTZXFEYltTQVRBX1RYX0NPTkZJR19TRVExXS5vcFBhcmFtc1B0ciA9IHNhdGFBbmRTZ21paVR4Q29uZmlnUGFyYW1zMTsKICAgIHNlcmRlc1NlcURiW1NBVEFfVFhfQ09ORklHX1NFUTFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNhdGFBbmRTZ21paVR4Q29uZmlnUGFyYW1zMSkgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKICAgIHNlcmRlc1NlcURiW1NBVEFfVFhfQ09ORklHX1NFUTFdLmRhdGFBcnJJZHggID0gU0FUQTsKCiAgICAvKiBTQVRBX1BPUlRfMF9PTkxZX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbU0FUQV9QT1JUXzBfT05MWV9UWF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHNhdGFQb3J0MFR4Q29uZmlnUGFyYW1zOwoJc2VyZGVzU2VxRGJbU0FUQV9QT1JUXzBfT05MWV9UWF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhUG9ydDBUeENvbmZpZ1BhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1NBVEFfUE9SVF8wX09OTFlfVFhfQ09ORklHX1NFUV0uZGF0YUFycklkeCAgPSBTQVRBOwoKCS8qIFNBVEFfUE9SVF8xX09OTFlfVFhfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltTQVRBX1BPUlRfMV9PTkxZX1RYX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gc2F0YVBvcnQxVHhDb25maWdQYXJhbXM7CglzZXJkZXNTZXFEYltTQVRBX1BPUlRfMV9PTkxZX1RYX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNhdGFQb3J0MVR4Q29uZmlnUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbU0FUQV9QT1JUXzFfT05MWV9UWF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ICA9IFNBVEE7CgogICAgLyogU0FUQV9UWF9DT05GSUdfU0VRMiBzZXF1ZW5jZSBpbml0ICovCiAgICBpZihzZXJkZXNSZXYgPT0gTVZfU0VSREVTX1JFVl8xXzIpIHsKCQlzZXJkZXNTZXFEYltTQVRBX1RYX0NPTkZJR19TRVEyXS5vcFBhcmFtc1B0ciA9IHNhdGFBbmRTZ21paVR4Q29uZmlnU2VyZGVzUmV2MVBhcmFtczI7CgkJc2VyZGVzU2VxRGJbU0FUQV9UWF9DT05GSUdfU0VRMl0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YUFuZFNnbWlpVHhDb25maWdTZXJkZXNSZXYxUGFyYW1zMikgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCX0gZWxzZSB7CgkJc2VyZGVzU2VxRGJbU0FUQV9UWF9DT05GSUdfU0VRMl0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlUeENvbmZpZ1NlcmRlc1JldjJQYXJhbXMyOwoJCXNlcmRlc1NlcURiW1NBVEFfVFhfQ09ORklHX1NFUTJdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNhdGFBbmRTZ21paVR4Q29uZmlnU2VyZGVzUmV2MlBhcmFtczIpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7Cgl9CglzZXJkZXNTZXFEYltTQVRBX1RYX0NPTkZJR19TRVEyXS5kYXRhQXJySWR4ICA9IFNBVEE7CgoJLyogU0dNSUlfUE9XRVJfVVBfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1NHTUlJX1BPV0VSX1VQX1NFUV0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlQb3dlclVwUGFyYW1zOwoJc2VyZGVzU2VxRGJbU0dNSUlfUE9XRVJfVVBfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhQW5kU2dtaWlQb3dlclVwUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbU0dNSUlfUE9XRVJfVVBfU0VRXS5kYXRhQXJySWR4ICA9IFNHTUlJOwoKCS8qIFNHTUlJX18xXzI1X1NQRUVEX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbU0dNSUlfXzFfMjVfU1BFRURfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlTcGVlZENvbmZpZ1BhcmFtczsKCXNlcmRlc1NlcURiW1NHTUlJX18xXzI1X1NQRUVEX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNhdGFBbmRTZ21paVNwZWVkQ29uZmlnUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbU0dNSUlfXzFfMjVfU1BFRURfQ09ORklHX1NFUV0uZGF0YUFycklkeCAgPSBTR01JSTsKCgkvKiBTR01JSV9fM18xMjVfU1BFRURfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltTR01JSV9fM18xMjVfU1BFRURfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlTcGVlZENvbmZpZ1BhcmFtczsKCXNlcmRlc1NlcURiW1NHTUlJX18zXzEyNV9TUEVFRF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhQW5kU2dtaWlTcGVlZENvbmZpZ1BhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1NHTUlJX18zXzEyNV9TUEVFRF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ICA9IFNHTUlJXzNfMTI1OwoKICAgIC8qIFNHTUlJX0VMRUNUUklDQUxfQ09ORklHX1NFUSBzZXEgc2VxdWVuY2UgaW5pdCAqLwoJaWYoc2VyZGVzUmV2ID09IE1WX1NFUkRFU19SRVZfMV8yKSB7CgkJc2VyZGVzU2VxRGJbU0dNSUlfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHNnbWlpRWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjFQYXJhbXM7CgkJc2VyZGVzU2VxRGJbU0dNSUlfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihzZ21paUVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYxUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJfSBlbHNlIHsKCQlzZXJkZXNTZXFEYltTR01JSV9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gc2dtaWlFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MlBhcmFtczsKCQlzZXJkZXNTZXFEYltTR01JSV9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHNnbWlpRWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjJQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7Cgl9CglzZXJkZXNTZXFEYltTR01JSV9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gU0dNSUk7CgoJLyogU0dNSUlfVFhfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltTR01JSV9UWF9DT05GSUdfU0VRMV0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlUeENvbmZpZ1BhcmFtczE7CglzZXJkZXNTZXFEYltTR01JSV9UWF9DT05GSUdfU0VRMV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2F0YUFuZFNnbWlpVHhDb25maWdQYXJhbXMxKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbU0dNSUlfVFhfQ09ORklHX1NFUTFdLmRhdGFBcnJJZHggID0gU0dNSUk7CgoJLyogU0dNSUlfVFhfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCglpZihzZXJkZXNSZXYgPT0gTVZfU0VSREVTX1JFVl8xXzIpIHsKCQlzZXJkZXNTZXFEYltTR01JSV9UWF9DT05GSUdfU0VRMl0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlUeENvbmZpZ1NlcmRlc1JldjFQYXJhbXMyOwoJCXNlcmRlc1NlcURiW1NHTUlJX1RYX0NPTkZJR19TRVEyXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhQW5kU2dtaWlUeENvbmZpZ1NlcmRlc1JldjFQYXJhbXMyKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJfSBlbHNlIHsKCQlzZXJkZXNTZXFEYltTR01JSV9UWF9DT05GSUdfU0VRMl0ub3BQYXJhbXNQdHIgPSBzYXRhQW5kU2dtaWlUeENvbmZpZ1NlcmRlc1JldjJQYXJhbXMyOwoJCXNlcmRlc1NlcURiW1NHTUlJX1RYX0NPTkZJR19TRVEyXS5jZmdTZXFTaXplICA9IHNpemVvZihzYXRhQW5kU2dtaWlUeENvbmZpZ1NlcmRlc1JldjJQYXJhbXMyKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJfQoJc2VyZGVzU2VxRGJbU0dNSUlfVFhfQ09ORklHX1NFUTJdLmRhdGFBcnJJZHggID0gU0dNSUk7CgoJLyogUEVYX1BPV0VSX1VQX1NFUSBzZXF1ZW5jZSBpbml0ICovCglpZihzZXJkZXNSZXYgPT0gTVZfU0VSREVTX1JFVl8xXzIpIHsKCQlzZXJkZXNTZXFEYltQRVhfUE9XRVJfVVBfU0VRXS5vcFBhcmFtc1B0ciA9IHBleEFuZFVzYjNQb3dlclVwU2VyZGVzUmV2MVBhcmFtczsKCQlzZXJkZXNTZXFEYltQRVhfUE9XRVJfVVBfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihwZXhBbmRVc2IzUG93ZXJVcFNlcmRlc1JldjFQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7Cgl9IGVsc2UgewoJCXNlcmRlc1NlcURiW1BFWF9QT1dFUl9VUF9TRVFdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1Bvd2VyVXBTZXJkZXNSZXYyUGFyYW1zOwoJCXNlcmRlc1NlcURiW1BFWF9QT1dFUl9VUF9TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEFuZFVzYjNQb3dlclVwU2VyZGVzUmV2MlBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCX0KCXNlcmRlc1NlcURiW1BFWF9QT1dFUl9VUF9TRVFdLmRhdGFBcnJJZHggID0gUEVYOwoKCS8qIFBFWF9fMl81X1NQRUVEX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbUEVYX18yXzVfU1BFRURfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzU3BlZWRDb25maWdQYXJhbXM7CglzZXJkZXNTZXFEYltQRVhfXzJfNV9TUEVFRF9DT05GSUdfU0VRXS5jZmdTZXFTaXplID0gIHNpemVvZihwZXhBbmRVc2IzU3BlZWRDb25maWdQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltQRVhfXzJfNV9TUEVFRF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ID0gIFBFWF9fMl81R2JwczsKCgkvKiBQRVhfXzVfU1BFRURfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltQRVhfXzVfU1BFRURfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzU3BlZWRDb25maWdQYXJhbXM7CglzZXJkZXNTZXFEYltQRVhfXzVfU1BFRURfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4QW5kVXNiM1NwZWVkQ29uZmlnUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbUEVYX181X1NQRUVEX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gUEVYX181R2JwczsKCiAgICAvKiBQRVhfRUxFQ1RSSUNBTF9DT05GSUdfU0VRIHNlcSBzZXF1ZW5jZSBpbml0ICovCglpZihzZXJkZXNSZXYgPT0gTVZfU0VSREVTX1JFVl8xXzIpIHsKCQlzZXJkZXNTZXFEYltQRVhfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHBleEVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYxUGFyYW1zOwoJCXNlcmRlc1NlcURiW1BFWF9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYxUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJfSBlbHNlIHsKCQlzZXJkZXNTZXFEYltQRVhfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHBleEVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zOwoJCXNlcmRlc1NlcURiW1BFWF9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEVsZWN0cmljYWxDb25maWdTZXJkZXNSZXYyUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJfQoJc2VyZGVzU2VxRGJbUEVYX0VMRUNUUklDQUxfQ09ORklHX1NFUV0uZGF0YUFycklkeCA9IFBFWDsKCgkvKiBQRVhfVFhfQ09ORklHX1NFUTEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbUEVYX1RYX0NPTkZJR19TRVExXS5vcFBhcmFtc1B0ciA9IHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczE7CglzZXJkZXNTZXFEYltQRVhfVFhfQ09ORklHX1NFUTFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEFuZFVzYjNUeENvbmZpZ1BhcmFtczEpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltQRVhfVFhfQ09ORklHX1NFUTFdLmRhdGFBcnJJZHggID0gUEVYOwoKICAgIC8qIFBFWF9UWF9DT05GSUdfU0VRMiBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltQRVhfVFhfQ09ORklHX1NFUTJdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMjsKCXNlcmRlc1NlcURiW1BFWF9UWF9DT05GSUdfU0VRMl0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMikgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1BFWF9UWF9DT05GSUdfU0VRMl0uZGF0YUFycklkeCAgPSBQRVg7CgoJLyogUEVYX1RYX0NPTkZJR19TRVEzIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1BFWF9UWF9DT05GSUdfU0VRM10ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMzOwoJc2VyZGVzU2VxRGJbUEVYX1RYX0NPTkZJR19TRVEzXS5jZmdTZXFTaXplICA9IHNpemVvZihwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMzKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbUEVYX1RYX0NPTkZJR19TRVEzXS5kYXRhQXJySWR4ICA9IFBFWDsKCgkvKiBQRVhfQllfNF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1BFWF9CWV80X0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gcGV4Qnk0Q29uZmlnUGFyYW1zOwoJc2VyZGVzU2VxRGJbUEVYX0JZXzRfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4Qnk0Q29uZmlnUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbUEVYX0JZXzRfQ09ORklHX1NFUV0uZGF0YUFycklkeCAgPSBQRVg7CgoJLyogUEVYX0NPTkZJR19SRUZfQ0xPQ0tfMjVNSHpfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1BFWF9DT05GSUdfUkVGX0NMT0NLXzI1TUh6X1NFUV0ub3BQYXJhbXNQdHIgPSBwZXhDb25maWdSZWZDbG9jazI1TUh6OwoJc2VyZGVzU2VxRGJbUEVYX0NPTkZJR19SRUZfQ0xPQ0tfMjVNSHpfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihwZXhDb25maWdSZWZDbG9jazI1TUh6KSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbUEVYX0NPTkZJR19SRUZfQ0xPQ0tfMjVNSHpfU0VRXS5kYXRhQXJySWR4ICA9IFBFWDsKCgkvKiBQRVhfRUxFQ1RSSUNBTF9DT05GSUdfUkVGX0NMT0NLXzQwTUh6X1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltQRVhfQ09ORklHX1JFRl9DTE9DS180ME1Iel9TRVFdLm9wUGFyYW1zUHRyID0gcGV4Q29uZmlnUmVmQ2xvY2s0ME1IejsKCXNlcmRlc1NlcURiW1BFWF9DT05GSUdfUkVGX0NMT0NLXzQwTUh6X1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4Q29uZmlnUmVmQ2xvY2s0ME1IeikgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1BFWF9DT05GSUdfUkVGX0NMT0NLXzQwTUh6X1NFUV0uZGF0YUFycklkeCAgPSBQRVg7CgogICAgLyogUEVYX0NPTkZJR19SRUZfQ0xPQ0tfMTAwTUh6X1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltQRVhfQ09ORklHX1JFRl9DTE9DS18xMDBNSHpfU0VRXS5vcFBhcmFtc1B0ciA9IHBleENvbmZpZ1JlZkNsb2NrMTAwTUh6OwoJc2VyZGVzU2VxRGJbUEVYX0NPTkZJR19SRUZfQ0xPQ0tfMTAwTUh6X1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4Q29uZmlnUmVmQ2xvY2sxMDBNSHopIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltQRVhfQ09ORklHX1JFRl9DTE9DS18xMDBNSHpfU0VRXS5kYXRhQXJySWR4ICA9IFBFWDsKCgkvKiBVU0IzX1BPV0VSX1VQX1NFUSBzZXF1ZW5jZSBpbml0ICovCglpZihzZXJkZXNSZXYgPT0gTVZfU0VSREVTX1JFVl8xXzIpIHsKCQlzZXJkZXNTZXFEYltVU0IzX1BPV0VSX1VQX1NFUV0ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzUG93ZXJVcFNlcmRlc1JldjFQYXJhbXM7CgkJc2VyZGVzU2VxRGJbVVNCM19QT1dFUl9VUF9TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEFuZFVzYjNQb3dlclVwU2VyZGVzUmV2MVBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCX0gZWxzZSB7CgkJc2VyZGVzU2VxRGJbVVNCM19QT1dFUl9VUF9TRVFdLm9wUGFyYW1zUHRyID0gcGV4QW5kVXNiM1Bvd2VyVXBTZXJkZXNSZXYyUGFyYW1zOwoJCXNlcmRlc1NlcURiW1VTQjNfUE9XRVJfVVBfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihwZXhBbmRVc2IzUG93ZXJVcFNlcmRlc1JldjJQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7Cgl9CglzZXJkZXNTZXFEYltVU0IzX1BPV0VSX1VQX1NFUV0uZGF0YUFycklkeCA9IFVTQjM7CgoJLyogVVNCM19fSE9TVF9TUEVFRF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1VTQjNfX0hPU1RfU1BFRURfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzU3BlZWRDb25maWdQYXJhbXM7CglzZXJkZXNTZXFEYltVU0IzX19IT1NUX1NQRUVEX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHBleEFuZFVzYjNTcGVlZENvbmZpZ1BhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1VTQjNfX0hPU1RfU1BFRURfQ09ORklHX1NFUV0uZGF0YUFycklkeCAgPSBVU0IzX181R2Jwc19IT1NUOwoKCS8qIFVTQjNfX0RFVklDRV9TUEVFRF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCXNlcmRlc1NlcURiW1VTQjNfX0RFVklDRV9TUEVFRF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHBleEFuZFVzYjNTcGVlZENvbmZpZ1BhcmFtczsKCXNlcmRlc1NlcURiW1VTQjNfX0RFVklDRV9TUEVFRF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihwZXhBbmRVc2IzU3BlZWRDb25maWdQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CglzZXJkZXNTZXFEYltVU0IzX19ERVZJQ0VfU1BFRURfQ09ORklHX1NFUV0uZGF0YUFycklkeCAgPSBVU0IzX181R2Jwc19ERVZJQ0U7CgogICAgLyogVVNCM19FTEVDVFJJQ0FMX0NPTkZJR19TRVEgc2VxIHNlcXVlbmNlIGluaXQgKi8KICAgIGlmKHNlcmRlc1JldiA9PSBNVl9TRVJERVNfUkVWXzFfMikgewoJCXNlcmRlc1NlcURiW1VTQjNfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHVzYjNFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MVBhcmFtczsKCQlzZXJkZXNTZXFEYltVU0IzX0VMRUNUUklDQUxfQ09ORklHX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YodXNiM0VsZWN0cmljYWxDb25maWdTZXJkZXNSZXYxUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJfSBlbHNlIHsKCQlzZXJkZXNTZXFEYltVU0IzX0VMRUNUUklDQUxfQ09ORklHX1NFUV0ub3BQYXJhbXNQdHIgPSB1c2IzRWxlY3RyaWNhbENvbmZpZ1NlcmRlc1JldjJQYXJhbXM7CgkJc2VyZGVzU2VxRGJbVVNCM19FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHVzYjNFbGVjdHJpY2FsQ29uZmlnU2VyZGVzUmV2MlBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCX0KCXNlcmRlc1NlcURiW1VTQjNfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5kYXRhQXJySWR4ID0gVVNCMzsKCgkvKiBVU0IzX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbVVNCM19UWF9DT05GSUdfU0VRMV0ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMxOwoJc2VyZGVzU2VxRGJbVVNCM19UWF9DT05GSUdfU0VRMV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMSkgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1VTQjNfVFhfQ09ORklHX1NFUTFdLmRhdGFBcnJJZHggID0gVVNCMzsKCiAgICAvKiBVU0IzX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbVVNCM19UWF9DT05GSUdfU0VRMl0ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMyOwoJc2VyZGVzU2VxRGJbVVNCM19UWF9DT05GSUdfU0VRMl0uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMikgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1VTQjNfVFhfQ09ORklHX1NFUTJdLmRhdGFBcnJJZHggID0gVVNCMzsKCgkvKiBVU0IzX1RYX0NPTkZJR19TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbVVNCM19UWF9DT05GSUdfU0VRM10ub3BQYXJhbXNQdHIgPSBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMzOwoJc2VyZGVzU2VxRGJbVVNCM19UWF9DT05GSUdfU0VRM10uY2ZnU2VxU2l6ZSAgPSBzaXplb2YocGV4QW5kVXNiM1R4Q29uZmlnUGFyYW1zMykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1VTQjNfVFhfQ09ORklHX1NFUTNdLmRhdGFBcnJJZHggID0gVVNCMzsKCgkvKiBVU0IyX1BPV0VSX1VQX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltVU0IyX1BPV0VSX1VQX1NFUV0ub3BQYXJhbXNQdHIgPSB1c2IyUG93ZXJVcFBhcmFtczsKCXNlcmRlc1NlcURiW1VTQjJfUE9XRVJfVVBfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZih1c2IyUG93ZXJVcFBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCXNlcmRlc1NlcURiW1VTQjJfUE9XRVJfVVBfU0VRXS5kYXRhQXJySWR4ICA9IDA7CgoJLyogVVNCM19ERVZJQ0VfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCglzZXJkZXNTZXFEYltVU0IzX0RFVklDRV9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHVzYjNEZXZpY2VDb25maWdQYXJhbXM7CglzZXJkZXNTZXFEYltVU0IzX0RFVklDRV9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZih1c2IzRGV2aWNlQ29uZmlnUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbVVNCM19ERVZJQ0VfQ09ORklHX1NFUV0uZGF0YUFycklkeCAgPSAwOyAvKiBOb3QgcmVsZXZhbnQgKi8KCgkvKiBTRVJERVNfUE9XRVJfRE9XTl9TRVEgc2VxdWVuY2UgaW5pdCAqLwoJc2VyZGVzU2VxRGJbU0VSREVTX1BPV0VSX0RPV05fU0VRXS5vcFBhcmFtc1B0ciA9IHNlcmRlc1Bvd2VyRG93blBhcmFtczsKCXNlcmRlc1NlcURiW1NFUkRFU19QT1dFUl9ET1dOX1NFUV0uY2ZnU2VxU2l6ZSAgPSBzaXplb2Yoc2VyZGVzUG93ZXJEb3duUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJc2VyZGVzU2VxRGJbU0VSREVTX1BPV0VSX0RPV05fU0VRXS5kYXRhQXJySWR4ICA9IEZJUlNUX0NFTEw7CgoJaWYoc2VyZGVzUmV2ID09IE1WX1NFUkRFU19SRVZfMl8xKSB7CgkJLyogUVNHTUlJX1BPV0VSX1VQX1NFUSBzZXF1ZW5jZSBpbml0ICovCgkJc2VyZGVzU2VxRGJbUVNHTUlJX1BPV0VSX1VQX1NFUV0ub3BQYXJhbXNQdHIgPSBxc2dtaWlQb3J0UG93ZXJVcFBhcmFtczsKCQlzZXJkZXNTZXFEYltRU0dNSUlfUE9XRVJfVVBfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihxc2dtaWlQb3J0UG93ZXJVcFBhcmFtcykgLyBzaXplb2YoTVZfT1BfUEFSQU1TKTsKCQlzZXJkZXNTZXFEYltRU0dNSUlfUE9XRVJfVVBfU0VRXS5kYXRhQXJySWR4ICA9IFFTR01JSV9TRVFfSURYOwoKCQkvKiBRU0dNSUlfXzVfU1BFRURfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCgkJc2VyZGVzU2VxRGJbUVNHTUlJX181X1NQRUVEX0NPTkZJR19TRVFdLm9wUGFyYW1zUHRyID0gcXNnbWlpUG9ydFNwZWVkQ29uZmlnUGFyYW1zOwoJCXNlcmRlc1NlcURiW1FTR01JSV9fNV9TUEVFRF9DT05GSUdfU0VRXS5jZmdTZXFTaXplICA9IHNpemVvZihxc2dtaWlQb3J0U3BlZWRDb25maWdQYXJhbXMpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CgkJc2VyZGVzU2VxRGJbUVNHTUlJX181X1NQRUVEX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gUVNHTUlJX1NFUV9JRFg7CgoJCS8qIFFTR01JSV9FTEVDVFJJQ0FMX0NPTkZJR19TRVEgc2VxIHNlcXVlbmNlIGluaXQgKi8KCQlzZXJkZXNTZXFEYltRU0dNSUlfRUxFQ1RSSUNBTF9DT05GSUdfU0VRXS5vcFBhcmFtc1B0ciA9IHFzZ21paVBvcnRFbGVjdHJpY2FsQ29uZmlnUGFyYW1zOwoJCXNlcmRlc1NlcURiW1FTR01JSV9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHFzZ21paVBvcnRFbGVjdHJpY2FsQ29uZmlnUGFyYW1zKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJCXNlcmRlc1NlcURiW1FTR01JSV9FTEVDVFJJQ0FMX0NPTkZJR19TRVFdLmRhdGFBcnJJZHggID0gUVNHTUlJX1NFUV9JRFg7CgoJCS8qIFFTR01JSV9UWF9DT05GSUdfU0VRIHNlcXVlbmNlIGluaXQgKi8KCQlzZXJkZXNTZXFEYltRU0dNSUlfVFhfQ09ORklHX1NFUTFdLm9wUGFyYW1zUHRyID0gcXNnbWlpUG9ydFR4Q29uZmlnUGFyYW1zMTsKCQlzZXJkZXNTZXFEYltRU0dNSUlfVFhfQ09ORklHX1NFUTFdLmNmZ1NlcVNpemUgID0gc2l6ZW9mKHFzZ21paVBvcnRUeENvbmZpZ1BhcmFtczEpIC8gc2l6ZW9mKE1WX09QX1BBUkFNUyk7CgkJc2VyZGVzU2VxRGJbUVNHTUlJX1RYX0NPTkZJR19TRVExXS5kYXRhQXJySWR4ICA9IFFTR01JSV9TRVFfSURYOwoKCQkvKiBRU0dNSUlfVFhfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0ICovCgkJc2VyZGVzU2VxRGJbUVNHTUlJX1RYX0NPTkZJR19TRVEyXS5vcFBhcmFtc1B0ciA9IHFzZ21paVBvcnRUeENvbmZpZ1BhcmFtczI7CgkJc2VyZGVzU2VxRGJbUVNHTUlJX1RYX0NPTkZJR19TRVEyXS5jZmdTZXFTaXplICA9IHNpemVvZihxc2dtaWlQb3J0VHhDb25maWdQYXJhbXMyKSAvIHNpemVvZihNVl9PUF9QQVJBTVMpOwoJCXNlcmRlc1NlcURiW1FTR01JSV9UWF9DT05GSUdfU0VRMl0uZGF0YUFycklkeCAgPSBRU0dNSUlfU0VRX0lEWDsKCX0KCiAgICByZXR1cm4gTVZfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovClNFUkRFU19TRVEgc2VyZGVzVHlwZUFuZFNwZWVkVG9TcGVlZFNlcQooCglTRVJERVNfVFlQRSBzZXJkZXNUeXBlLAoJU0VSREVTX1NQRUVEIGJhdWRSYXRlCikKewoJU0VSREVTX1NFUSBzZXFJZCA9IFNFUkRFU19MQVNUX1NFUTsKCglERUJVR19JTklUX0ZVTExfUygiXG4jIyMgc2VyZGVzVHlwZUFuZFNwZWVkVG9TcGVlZFNlcSAjIyNcbiIpOwoJc3dpdGNoIChzZXJkZXNUeXBlKSB7CgljYXNlIFBFWDA6CgljYXNlIFBFWDE6CgljYXNlIFBFWDI6CgljYXNlIFBFWDM6CgkJaWYgKGJhdWRSYXRlID09IF9fMl81R2JwcykKCQkJc2VxSWQgPSBQRVhfXzJfNV9TUEVFRF9DT05GSUdfU0VROwoJCWVsc2UgaWYgKGJhdWRSYXRlID09IF9fNUdicHMpCgkJCXNlcUlkID0gUEVYX181X1NQRUVEX0NPTkZJR19TRVE7CgkJYnJlYWs7CgljYXNlIFVTQjNfSE9TVDA6CgljYXNlIFVTQjNfSE9TVDE6CgkJaWYgKGJhdWRSYXRlID09IF9fNUdicHMpCgkJCXNlcUlkID0gVVNCM19fSE9TVF9TUEVFRF9DT05GSUdfU0VROwoJCWJyZWFrOwoJY2FzZSBVU0IzX0RFVklDRToKCQlpZiAoYmF1ZFJhdGUgPT0gX181R2JwcykKCQkJc2VxSWQgPSBVU0IzX19ERVZJQ0VfU1BFRURfQ09ORklHX1NFUTsKCQlicmVhazsKCWNhc2UgU0FUQTA6CgljYXNlIFNBVEExOgoJY2FzZSBTQVRBMjoKCWNhc2UgU0FUQTM6CgkJaWYgKGJhdWRSYXRlID09IF9fMV81R2JwcykKCQkJc2VxSWQgPSBTQVRBX18xXzVfU1BFRURfQ09ORklHX1NFUTsKCQllbHNlIGlmIChiYXVkUmF0ZSA9PSBfXzNHYnBzKQoJCQlzZXFJZCA9IFNBVEFfXzNfU1BFRURfQ09ORklHX1NFUTsKCQllbHNlIGlmIChiYXVkUmF0ZSA9PSBfXzZHYnBzKQoJCQlzZXFJZCA9IFNBVEFfXzZfU1BFRURfQ09ORklHX1NFUTsKCQlicmVhazsKCWNhc2UgU0dNSUkwOgoJY2FzZSBTR01JSTE6CgljYXNlIFNHTUlJMjoKI2lmZGVmIE1WODhGNjlYWAogICAgY2FzZSBTR01JSTM6CiNlbmRpZgogICAgICAgIGlmIChiYXVkUmF0ZSA9PSBfXzFfMjVHYnBzKQoJCQlzZXFJZCA9IFNHTUlJX18xXzI1X1NQRUVEX0NPTkZJR19TRVE7CgkJZWxzZSBpZiAoYmF1ZFJhdGUgPT0gX18zXzEyNUdicHMpCgkJCXNlcUlkID0gU0dNSUlfXzNfMTI1X1NQRUVEX0NPTkZJR19TRVE7CgkJYnJlYWs7CiAgICBjYXNlIFFTR01JSToKICAgICAgICBzZXFJZCA9IFFTR01JSV9fNV9TUEVFRF9DT05GSUdfU0VROwogICAgICAgIGJyZWFrOwojaWZkZWYgTVY4OEY2OVhYCiAgICBjYXNlIFhBVUk6CiAgICAgICAgc2VxSWQgPSBYQVVJX18zXzEyNV9TUEVFRF9DT05GSUdfU0VROwogICAgICAgIGJyZWFrOwogICAgY2FzZSBSWEFVSToKICAgICAgICBzZXFJZCA9IFJYQVVJX182XzI1X1NQRUVEX0NPTkZJR19TRVE7CiAgICAgICAgYnJlYWs7CiNlbmRpZgoJZGVmYXVsdDoKCQlyZXR1cm4gU0VSREVTX0xBU1RfU0VROwoJfQoKCXJldHVybiBzZXFJZDsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KTVZfU1RBVFVTIG12SHdzQm9hcmRUb3BvbG9neUxvYWQoU0VSREVTX01BUCAgKnNlcmRlc01hcEFycmF5KQp7CglNVl9VMzIgYm9hcmRJZCA9IG12Qm9hcmRJZEdldCgpOwoJTVZfVTMyIGJvYXJkSWRJbmRleCA9IG12Qm9hcmRJZEluZGV4R2V0KGJvYXJkSWQpOwoKCURFQlVHX0lOSVRfRlVMTF9TKCJcbiMjIyBtdkh3c0JvYXJkVG9wb2xvZ3lMb2FkICMjI1xuIik7CgkvKiBnZXR0aW5nIGJvYXJkIHRvcG9sb2d5IGFjY29yZGluZyB0byB0aGUgYm9hcmQgaWQgKi8KCURFQlVHX0lOSVRfRlVMTF9TKCJHZXR0aW5nIGJvYXJkIHRvcG9sb2d5IGFjY29yZGluZyB0byB0aGUgYm9hcmQgaWRcbiIpOwoKCUNIRUNLX1NUQVRVUyhsb2FkVG9wb2xvZ3lGdW5jQXJyW2JvYXJkSWRJbmRleF0oc2VyZGVzTWFwQXJyYXkpKTsKCglyZXR1cm4gTVZfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgpNVl9WT0lEIHByaW50VG9wb2xvZ3lEZXRhaWxzKFNFUkRFU19NQVAgICpzZXJkZXNNYXBBcnJheSkKewoJTVZfVTMyIGxhbmVOdW07CgoJREVCVUdfSU5JVF9TKCJib2FyZCBTZXJEZXMgbGFuZXMgdG9wb2xvZ3kgZGV0YWlsczpcbiIpOwoKCURFQlVHX0lOSVRfUygiIHwgTGFuZSAjICB8IFNwZWVkIHwgIFR5cGUgICAgICAgfFxuIik7CglERUJVR19JTklUX1MoIiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7Cglmb3IgKGxhbmVOdW0gPSAwOyBsYW5lTnVtIDwgbXZId3NTZXJkZXNHZXRNYXhMYW5lKCk7IGxhbmVOdW0rKykgewoJCWlmIChzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlID09IERFRkFVTFRfU0VSREVTKQoJCXsKCQkJY29udGludWU7CgkJfQoJCURFQlVHX0lOSVRfUygiIHwgICAiKTsKCQlERUJVR19JTklUX0QobXZId3NHZXRQaHlzaWNhbFNlcmRlc051bShsYW5lTnVtKSwgMSk7CgkJREVCVUdfSU5JVF9TKCIgICAgfCAgIik7CgkJREVCVUdfSU5JVF9EKHNlcmRlc01hcEFycmF5W2xhbmVOdW1dLnNlcmRlc1NwZWVkLCAyKTsKCQlERUJVR19JTklUX1MoIiAgIHwgICIpOwoJCURFQlVHX0lOSVRfUygoY2hhciAqKXNlcmRlc1R5cGVUb1N0cmluZ1tzZXJkZXNNYXBBcnJheVtsYW5lTnVtXS5zZXJkZXNUeXBlXSk7CgkJREVCVUdfSU5JVF9TKCJcdHxcbiIpOwoJfQoJREVCVUdfSU5JVF9TKCIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwp9CgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KTVZfU1RBVFVTIG12SHdzUHJlU2VyZGVzSW5pdENvbmZpZyhNVl9WT0lEKQp7CiAgICBNVl9VMzIgZGF0YTsKCiAgICAvKiBjb25maWd1cmUgQ29yZSBQTEwgKi8KICAgIC8qCiAgICBzZXQgUExMIHBhcmFtZXRlcnMKICAgIGJpdHNbMjowXSAgPTB4MyAoQ29yZS1QTEwgS2RpdikKICAgIGJpdHNbMjA6MTJdPTB4OUYgKENvcmUtUExMIE5kaXYpCiAgICBiaXRzWzI0OjIxXT0weDcoQ29yZS1QTEwgVkNPIEJhbmQpCiAgICBiaXRzWzI4OjI1XT0weDEoQ29yZS1QTEwgUmxmKQogICAgYml0c1szMToyOV09MHgyKENvcmUtUExMIGNoYXJnZS1wdW1wIGFkanVzdCkKICAgICovCiAgICBNVl9SRUdfV1JJVEUoQ09SRV9QTExfUEFSQU1FVEVSU19SRUcsIDB4NDJFOUYwMDMpOwoKICAgIC8qIEVuYWJsZSBQTEwgQ29uZmlndXJhdGlvbiAqLwogICAgZGF0YSA9IE1WX1JFR19SRUFEKENPUkVfUExMX0NPTkZJR19SRUcpOwogICAgZGF0YSA9IFNFVF9CSVQoZGF0YSwgOSk7CiAgICBNVl9SRUdfV1JJVEUoQ09SRV9QTExfQ09ORklHX1JFRywgZGF0YSk7CgogICAgcmV0dXJuIE1WX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNVl9TVEFUVVMgbXZId3NDdHJsSGlnaFNwZWVkU2VyZGVzUGh5Q29uZmlnKE1WX1ZPSUQpCnsKCURFQlVHX0lOSVRfRlVMTF9TKCJcbiMjIyBtdkN0cmxIaWdoU3BlZWRTZXJkZXNQaHlDb25maWcgIyMjXG4iKTsKCglERUJVR19JTklUX1MoIkhpZ2ggc3BlZWQgUEhZIC0gVmVyc2lvbjogIik7CglERUJVR19JTklUX1MoU0VSREVTX1ZFUklPTik7CglERUJVR19JTklUX1MoIlxuIik7CgoJLyogSW5pdCBzZXJkZXMgc2VxdWVuY2VzIERCICovCglpZiAobXZId3NTZXJkZXNTZXFJbml0KCkgIT0gTVZfT0spewoJCW12UHJpbnRmKCJtdkh3c0N0cmxIaWdoU3BlZWRTZXJkZXNQaHlDb25maWc6IEVycm9yOiBTZXJkZXMgaW5pdGlhbGl6YXRpb24gZmFpbFxuIik7CgkJcmV0dXJuIE1WX0ZBSUw7Cgl9CgoJLyogVFdTSSBpbml0ICovCglERUJVR19JTklUX0ZVTExfUygibXZId3NUd3NpSW5pdFdyYXBwZXI6IEluaXQgVFdTSSBpbnRlcmZhY2UuXG4iKTsKCUNIRUNLX1NUQVRVUyhtdkh3c1R3c2lJbml0V3JhcHBlcigpKTsKCgkvKiBCb2FyZCB0b3BvbG9neSBsb2FkICovCglERUJVR19JTklUX0ZVTExfUygibXZDdHJsSGlnaFNwZWVkU2VyZGVzUGh5Q29uZmlnOiBMb2FkaW5nIGJvYXJkIHRvcG9sb2d5Li5cbiIpOwogICAgQ0hFQ0tfU1RBVFVTKG12SHdzQm9hcmRUb3BvbG9neUxvYWQoc2VyZGVzQ29uZmlndXJhdGlvbk1hcCkpOwoKCS8qIHByaW50IHRvcG9sb2d5ICovCglwcmludFRvcG9sb2d5RGV0YWlscyhzZXJkZXNDb25maWd1cmF0aW9uTWFwKTsKCglDSEVDS19TVEFUVVMobXZId3NQcmVTZXJkZXNJbml0Q29uZmlnKCkpOwoKCS8qIFBvd2VyLVVwIHNlcXVlbmNlICovCglERUJVR19JTklUX0ZVTExfUygibXZDdHJsSGlnaFNwZWVkU2VyZGVzUGh5Q29uZmlnOiBTdGFydGluZyBzZXJkZXMgcG93ZXIgdXAgc2VxdWVuY2VcbiIpOwoKCUNIRUNLX1NUQVRVUyhtdkh3c1Bvd2VyVXBTZXJkZXNMYW5lcyhzZXJkZXNDb25maWd1cmF0aW9uTWFwKSk7CgoJREVCVUdfSU5JVF9GVUxMX1MoIlxuIyMjIG12Q3RybEhpZ2hTcGVlZFNlcmRlc1BoeUNvbmZpZyBlbmRlZCBzdWNjZXNzZnVsbHkgIyMjXG4iKTsKCglERUJVR19JTklUX1MoRU5ERURfT0spOwoKCXJldHVybiBNVl9PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KTVZfU1RBVFVTIG12U2VyZGVzUG9sYXJpdHlDb25maWcoTVZfVTMyIHNlcmRlc051bSwgTVZfQk9PTCBpc1J4KQp7CglNVl9VMzIgZGF0YTsKCU1WX1UzMiByZWdBZGRyOwoJTVZfVTggYml0T2ZmID0gKGlzUngpID8gMTEgOiAxMDsKCglyZWdBZGRyID0gU0VSREVTX1JFR1NfTEFORV9CQVNFX09GRlNFVChzZXJkZXNOdW0pICsgU1lOQ19QQVRURVJOX1JFRzsKCglkYXRhID0gTVZfUkVHX1JFQUQocmVnQWRkcik7CgoJZGF0YSA9IFNFVF9CSVQoZGF0YSwgYml0T2ZmKTsKCglNVl9SRUdfV1JJVEUocmVnQWRkciwgZGF0YSk7CgoJcmV0dXJuIE1WX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNVl9TVEFUVVMgbXZId3NQb3dlclVwU2VyZGVzTGFuZXMoU0VSREVTX01BUCAgKnNlcmRlc0NvbmZpZ01hcCkKewoJTVZfVTMyIHNlcmRlc0lkLCBzZXJkZXNMYW5lTnVtOwoJUkVGX0NMT0NLIHJlZkNsb2NrOwoJU0VSREVTX1RZUEUgc2VyZGVzVHlwZTsKCVNFUkRFU19TUEVFRCBzZXJkZXNTcGVlZDsKCVNFUkRFU19NT0RFICBzZXJkZXNNb2RlOwoJTVZfQk9PTCAgICAgIHNlcmRlc1J4UG9sYXJpdHlTd2FwOwoJTVZfQk9PTCAgICAgIHNlcmRlc1R4UG9sYXJpdHlTd2FwOwoJTVZfQk9PTCAgICAgIGlzUGV4RW5hYmxlZCA9IE1WX0ZBTFNFOyAvKiBmbGFnIHdoaWNoIGluZGljYXRlcyB0aGF0IG9uZSBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VyZGVzIGlzIG9mIFBFWC4gaW4gdGhpcyBjYXNlLCBQRVgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdCB3aWxsIGJlIGluaXRpYWxpemVkIGFmdGVyIFNlcmRlcyBwb3dlci11cCAqLwoKCURFQlVHX0lOSVRfRlVMTF9TKCJcbiMjIyBtdkh3c1Bvd2VyVXBTZXJkZXNMYW5lcyAjIyNcbiIpOwoKCS8qIENPTU1PTiBQSFlTIFNFTEVDVE9SUyByZWdpc3RlciBjb25maWd1cmF0aW9uICovCglERUJVR19JTklUX0ZVTExfUygibXZId3NQb3dlclVwU2VyZGVzTGFuZXM6IFVwZGF0aW5nIENPTU1PTiBQSFlTIFNFTEVDVE9SUyByZWdcbiIpOwoJQ0hFQ0tfU1RBVFVTKG12SHdzVXBkYXRlU2VyZGVzUGh5U2VsZWN0b3JzKHNlcmRlc0NvbmZpZ3VyYXRpb25NYXApKTsKCgkvKiBwZXIgU2VyZGVzIFBvd2VyIFVwICovCglmb3IgKHNlcmRlc0lkID0gMDsgc2VyZGVzSWQgPCBtdkh3c1NlcmRlc0dldE1heExhbmUoKTsgc2VyZGVzSWQrKykgewoJCXNlcmRlc0xhbmVOdW0gPSBtdkh3c0dldFBoeXNpY2FsU2VyZGVzTnVtKHNlcmRlc0lkKTsKCgkJREVCVUdfSU5JVF9GVUxMX1MoImNhbGxpbmcgc2VyZGVzUG93ZXJVcEN0cmw6IHNlcmRlcyBsYW5lIG51bWJlciAiKTsKCQlERUJVR19JTklUX0ZVTExfRF8xMChzZXJkZXNMYW5lTnVtLCAxKTsKCQlERUJVR19JTklUX0ZVTExfUygiXG4iKTsKCgkJc2VyZGVzVHlwZSA9IHNlcmRlc0NvbmZpZ01hcFtzZXJkZXNJZF0uc2VyZGVzVHlwZTsKCQlzZXJkZXNTcGVlZCA9IHNlcmRlc0NvbmZpZ01hcFtzZXJkZXNJZF0uc2VyZGVzU3BlZWQ7CgkJc2VyZGVzTW9kZSA9IHNlcmRlc0NvbmZpZ01hcFtzZXJkZXNJZF0uc2VyZGVzTW9kZTsKCQlzZXJkZXNSeFBvbGFyaXR5U3dhcCA9IHNlcmRlc0NvbmZpZ01hcFtzZXJkZXNJZF0uc3dhcFJ4OwoJCXNlcmRlc1R4UG9sYXJpdHlTd2FwID0gc2VyZGVzQ29uZmlnTWFwW3NlcmRlc0lkXS5zd2FwVHg7CgoJCS8qIHNlcmRlcyBsYW5lIGlzIG5vdCBpbiB1c2UgKi8KCQlpZiAoc2VyZGVzVHlwZSA9PSBERUZBVUxUX1NFUkRFUykKCQkJY29udGludWU7CgkJZWxzZSBpZihzZXJkZXNUeXBlIDw9IFBFWDMpIC8qIFBFWCB0eXBlICovCgkJCWlzUGV4RW5hYmxlZCA9IE1WX1RSVUU7CgoJCXJlZkNsb2NrID0gbXZId3NTZXJkZXNHZXRSZWZDbG9ja1ZhbChzZXJkZXNUeXBlKTsKCQlpZiAocmVmQ2xvY2sgPT0gUkVGX0NMT0NLX1VOU1VQUE9SVEVEKSB7CgkJCURFQlVHX0lOSVRfUygibXZId3NQb3dlclVwU2VyZGVzTGFuZXM6IHVuc3VwcG9ydGVkIHJlZiBjbG9ja1xuIik7CgkJCXJldHVybiBNVl9OT1RfU1VQUE9SVEVEOwoJCX0KCQlDSEVDS19TVEFUVVMobXZTZXJkZXNQb3dlclVwQ3RybChzZXJkZXNMYW5lTnVtLAoJCQkJCQkgTVZfVFJVRSwKCQkJCQkJIHNlcmRlc1R5cGUsCgkJCQkJCSBzZXJkZXNTcGVlZCwKCQkJCQkJIHNlcmRlc01vZGUsCgkJCQkJCSByZWZDbG9jaykpOwoKCQkvKiBSWCBQb2xhcml0eSBjb25maWcgKi8KCQlpZihzZXJkZXNSeFBvbGFyaXR5U3dhcCkKCQkJQ0hFQ0tfU1RBVFVTKG12U2VyZGVzUG9sYXJpdHlDb25maWcoc2VyZGVzTGFuZU51bSwgTVZfVFJVRSkpOwoKCQkvKiBUWCBQb2xhcml0eSBjb25maWcgKi8KCQlpZihzZXJkZXNUeFBvbGFyaXR5U3dhcCkKCQkJQ0hFQ0tfU1RBVFVTKG12U2VyZGVzUG9sYXJpdHlDb25maWcoc2VyZGVzTGFuZU51bSwgTVZfRkFMU0UpKTsKCX0KCglpZihpc1BleEVuYWJsZWQpCgl7CgkJLyogU2V0IFBFWF9UWF9DT05GSUdfU0VRIHNlcXVlbmNlIGZvciBQRVh4NCBtb2RlLgoJCSAgIEFmdGVyIGZpbmlzaCB0aGUgUG93ZXJVcCBzZXF1ZW5jZSBmb3IgYWxsIGxhbmVzLAoJCSAgIHRoZSBsYW5lcyBzaG91bGQgYmUgcmVsZWFzZWQgZnJvbSByZXNldCBzdGF0ZS4JKi8KCQlDSEVDS19TVEFUVVMobXZId3NQZXhUeENvbmZpZ1NlcShzZXJkZXNDb25maWdNYXApKTsKCgkJLyogUEVYIGNvbmZpZ3VyYXRpb24qLwoJCUNIRUNLX1NUQVRVUyhtdkh3c1BleENvbmZpZyhzZXJkZXNDb25maWdNYXApKTsKCX0KCgkvKiBVU0IyIGNvbmZpZ3VyYXRpb24gKi8KCURFQlVHX0lOSVRfRlVMTF9TKCJtdkh3c1Bvd2VyVXBTZXJkZXNMYW5lczogaW5pdCBVU0IyIFBoeXNcbiIpOwoJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYygwIC8qIG5vdCByZWxldmFudCAqLywgVVNCMl9QT1dFUl9VUF9TRVEpKTsKCglERUJVR19JTklUX0ZVTExfUygiIyMjIG12SHdzUG93ZXJVcFNlcmRlc0xhbmVzIGVuZGVkIHN1Y2Nlc3NmdWxseSAjIyNcbiIpOwoJcmV0dXJuIE1WX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwoKTVZfU1RBVFVTIG12Q3RybEhpZ2hTcGVlZFNlcmRlc1BoeUNvbmZpZyhNVl9WT0lEKQp7CglyZXR1cm4gbXZId3NDdHJsSGlnaFNwZWVkU2VyZGVzUGh5Q29uZmlnKCk7IC8vIHN0dWIKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RhdGljIE1WX1NUQVRVUyBtdlNlcmRlc1BleFVzYjNQaXBlRGVsYXlXQShNVl9VMzIgc2VyZGVzTnVtLCBNVl9VOCBzZXJkZXNUeXBlKQp7CglNVl9VMzIgcmVnRGF0YTsKCgkvKiBXQSBmb3IgQTM4MCBaMSByZWxldmFudCBmb3IgbGFuZXMgMyw0LDUgb25seSovCglpZiAoc2VyZGVzTnVtID49IDMpCgl7CgkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKEdFTkVSQUxfUFVSUE9TRV9SRVNFUlZFRDBfUkVHKTsKCQkvKiBzZXQgZGVsYXkgb24gcGlwZSAtCgkJICogV2hlbiBsYW5lIDMgaXMgY29ubmVjdGVkIHRvIGEgTUFDIG9mIFBleCAtPiBzZXQgYml0IDcgdG8gMS4KCQkgKiBXaGVuIGxhbmUgMyBpcyBjb25uZWN0ZWQgdG8gYSBNQUMgb2YgVVNCMyAtPiBzZXQgYml0IDcgdG8gMC4KCQkgKiBXaGVuIGxhbmUgNCBpcyBjb25uZWN0ZWQgdG8gYSBNQUMgb2YgUGV4IC0+IHNldCBiaXQgOCB0byAxLgoJCSAqIFdoZW4gbGFuZSA0IGlzIGNvbm5lY3RlZCB0byBhIE1BQyBvZiBVU0IzIC0+IHNldCBiaXQgOCB0byAwLgoJCSAqIFdoZW4gbGFuZSA1IGlzIGNvbm5lY3RlZCB0byBhIE1BQyBvZiBQZXggLT4gc2V0IGJpdCA4IHRvIDEuCgkJICogV2hlbiBsYW5lIDUgaXMgY29ubmVjdGVkIHRvIGEgTUFDIG9mIFVTQjMgLT4gc2V0IGJpdCA4IHRvIDAuCgkJICovCgkJaWYgKHNlcmRlc1R5cGUgPT0gUEVYKQoJCXsKCQkJcmVnRGF0YSB8PSAxIDw8ICg3ICsgKHNlcmRlc051bSAtIDMpKTsKCQl9CgkJaWYgKHNlcmRlc1R5cGUgPT0gVVNCMykKCQl7CgkJCS8qIFVTQjMgKi8KCQkJcmVnRGF0YSAmPSB+KDEgPDwgKDcgKyAoc2VyZGVzTnVtIC0gMykpKTsKCQl9CgkJTVZfUkVHX1dSSVRFKEdFTkVSQUxfUFVSUE9TRV9SRVNFUlZFRDBfUkVHLCByZWdEYXRhKTsKCX0KCglyZXR1cm4gTVZfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12SHdzU2VyZGVzUGV4UmVmQ2xvY2tTYXRSR2V0IC0KKgoqIERFU0NSSVBUSU9OOiBHZXQgdGhlIHJlZmVyZW5jZSBjbG9jayB2YWx1ZSBmcm9tIERFVklDRV9TQU1QTEVfQVRfUkVTRVQxX1JFRyBhbmQgY2hlY2s6CiogICAgICAgICAgICAgIGJpdFsyXSBmb3IgUEVYIzAsIGJpdFszXSBmb3IgUEVYIzEsIGJpdFszMF0gZm9yIFBFWCMyLCBiaXRbMzFdIGZvciBQRVgjMy4KKiAgICAgICAgICAgICAgSWYgYml0PTAgLS0+IFJFRl9DTE9DS18xMDBNSHoKKiAgICAgICAgICAgICAgSWYgYml0PTEgJiYgREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHIGJpdFswXT0wIC0tPiBSRUZfQ0xPQ0tfMjVNSHoKKiAgICAgICAgICAgICAgSWYgYml0PTEgJiYgREVWSUNFX1NBTVBMRV9BVF9SRVNFVDJfUkVHIGJpdFswXT0xIC0tPiBSRUZfQ0xPQ0tfNDBNSHoKKgoqIElOUFVUOiAgICAgICAgc2VyZGVzVHlwZSAtIFR5cGUgb2YgU2VyZGVzCioKKiBPVVRQVVQ6ICAgICAgIHBleFNhdFIgICAtICBSZXR1cm4gdGhlIFJFRl9DTE9DSyB2YWx1ZToKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBSRUZfQ0xPQ0tfMjVNSHosIFJFRl9DTE9DS180ME1IeiBvciBSRUZfQ0xPQ0tfMTAwTUh6CioKKiBSRVRVUk5TOiAgICAgIE1WX09LICAgICAgICAtIGZvciBzdWNjZXNzCiogICAgICAgICAgICAgICBNVl9CQURfUEFSQU0gLSBmb3IgZmFpbAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCk1WX1NUQVRVUyBtdkh3c1NlcmRlc1BleFJlZkNsb2NrU2F0UkdldChTRVJERVNfVFlQRSBzZXJkZXNUeXBlLCBNVl9VMzIgKnBleFNhdFIpCnsKICAgIE1WX1UzMiBkYXRhLCByZWdTYXRSMTsKCiAgICByZWdTYXRSMSA9IE1WX1JFR19SRUFEKERFVklDRV9TQU1QTEVfQVRfUkVTRVQxX1JFRyk7CgogICAgc3dpdGNoIChzZXJkZXNUeXBlKSB7CiAgICBjYXNlIFBFWDA6CiAgICAgICAgZGF0YSA9IFJFRl9DTEtfU0VMRUNUT1JfVkFMX1BFWDAocmVnU2F0UjEpOwogICAgICAgIGJyZWFrOwogICAgY2FzZSBQRVgxOgogICAgICAgIGRhdGEgPSBSRUZfQ0xLX1NFTEVDVE9SX1ZBTF9QRVgxKHJlZ1NhdFIxKTsKICAgICAgICBicmVhazsKICAgIGNhc2UgUEVYMjoKICAgICAgICBkYXRhID0gUkVGX0NMS19TRUxFQ1RPUl9WQUxfUEVYMihyZWdTYXRSMSk7CiAgICAgICAgYnJlYWs7CiAgICBjYXNlIFBFWDM6CiAgICAgICAgZGF0YSA9IFJFRl9DTEtfU0VMRUNUT1JfVkFMX1BFWDMocmVnU2F0UjEpOwogICAgICAgIGJyZWFrOwogICAgZGVmYXVsdDoKICAgICAgICBtdlByaW50ZigiJXM6IEVycm9yOiBTZXJEZXMgdHlwZSAlZCBpcyBub3Qgc3VwcG9ydGVkXG4iLCBfX2Z1bmNfXywgc2VyZGVzVHlwZSk7CiAgICAgICAgcmV0dXJuIE1WX0JBRF9QQVJBTTsKICAgIH0KCiAgICAqcGV4U2F0UiA9IGRhdGE7CgogICAgcmV0dXJuIE1WX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNVl9VMzIgbXZId3NTZXJkZXNHZXRSZWZDbG9ja1ZhbChTRVJERVNfVFlQRSBzZXJkZXNUeXBlKQp7CiAgICBNVl9VMzIgcGV4U2F0UjsKICAgIFJFRl9DTE9DSyByZWZDbG9jazsKCiAgICBERUJVR19JTklUX0ZVTExfUygiXG4jIyMgbXZId3NTZXJkZXNHZXRSZWZDbG9ja1ZhbCAjIyNcbiIpOwoKICAgIGlmIChzZXJkZXNUeXBlID49IExBU1RfU0VSREVTX1RZUEUpIHsKICAgICAgICByZXR1cm4gUkVGX0NMT0NLX1VOU1VQUE9SVEVEOwogICAgfQoKICAgIC8qIHJlYWQgcmVmIGNsb2NrIGZyb20gU0BSICovCiAgICByZWZDbG9jayA9IG12SHdzU2VyZGVzU2lsaWNvblJlZkNsb2NrR2V0KCk7CgogICAgaWYoc2VyZGVzVHlwZSA+IFBFWDMpIHsKICAgICAgICAvKiBmb3IgYWxsIFNlcmRlcyB0eXBlcyBidXQgUENJZSAqLwogICAgICAgIHJldHVybiByZWZDbG9jazsKICAgIH0KCiAgICAvKiBmb3IgUENJZSwgbmVlZCBhbHNvIHRvIGNoZWNrIFBDSWUgU0BSICovCiAgICBDSEVDS19TVEFUVVMobXZId3NTZXJkZXNQZXhSZWZDbG9ja1NhdFJHZXQoc2VyZGVzVHlwZSwgJnBleFNhdFIpKTsKCiAgICBpZiAocGV4U2F0UiA9PSAwKSB7CiAgICAgICAgcmV0dXJuIFJFRl9DTE9DS19fMTAwTUh6OwogICAgfQogICAgZWxzZSBpZihwZXhTYXRSID09IDEpIHsKICAgICAgICAvKiB2YWx1ZSBvZiAxIG1lYW5zIHdlIGNhbiB1c2UgcmVmIGNsb2NrIGZyb20gU29DIChhcyBvdGhlciBTZXJkZXMgdHlwZXMpICovCiAgICAgICAgcmV0dXJuIHJlZkNsb2NrOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgbXZQcmludGYoIiVzOiBFcnJvcjogUkVGX0NMS19TRUxFQ1RPUl9WQUwgZm9yIFNlckRlcyB0eXBlICVkIGlzIHdyb25nXG4iLCBfX2Z1bmNfXywgc2VyZGVzVHlwZSk7CiAgICAgICAgcmV0dXJuIFJFRl9DTE9DS19VTlNVUFBPUlRFRDsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KTVZfU1RBVFVTIG12U2VyZGVzUG93ZXJVcEN0cmwKKAoJTVZfVTMyIHNlcmRlc051bSwKCU1WX0JPT0wgc2VyZGVzUG93ZXJVcCwKCVNFUkRFU19UWVBFIHNlcmRlc1R5cGUsCglTRVJERVNfU1BFRUQgYmF1ZFJhdGUsCglTRVJERVNfTU9ERSAgc2VyZGVzTW9kZSwKCVJFRl9DTE9DSyByZWZDbG9jawopCnsKI2lmZGVmIERCX0xJTktfQ0hFQ0sKCWludCBpOwojZW5kaWYKCU1WX1UzMiBzYXRhSWR4LCBwZXhJZHgsIHNhdGFQb3J0OwoJU0VSREVTX1NFUSBzcGVlZFNlcUlkOwoJTVZfVTMyIHJlZ0RhdGE7CglNVl9CT09MIGlzUGV4QnkxOwoKCURFQlVHX0lOSVRfRlVMTF9TKCJcbiMjIyBtdlNlcmRlc1Bvd2VyVXBDdHJsICMjI1xuIik7CgoJaWYgKHNlcmRlc1Bvd2VyVXAgPT0gTVZfVFJVRSkgeyAvKiBTZXJkZXMgcG93ZXIgdXAgKi8KCQlERUJVR19JTklUX0ZVTExfUygibXZTZXJkZXNQb3dlclVwQ3RybDogZXhlY3V0aW5nIHBvd2VyIHVwLi4gIik7CgkJREVCVUdfSU5JVF9GVUxMX0MoInNlcmRlcyBudW0gPSAiLCBzZXJkZXNOdW0sIDIpOwoJCURFQlVHX0lOSVRfRlVMTF9DKCJzZXJkZXMgdHlwZSA9ICIsIHNlcmRlc1R5cGUsIDIpOwoKCQlERUJVR19JTklUX0ZVTExfUygiR29pbmcgYWNjZXNzIDEiKTsKCgkJLyogR2V0dGluZyB0aGUgU3BlZWQgU2VsZWN0IHNlcXVlbmNlIGlkICovCgkJc3BlZWRTZXFJZCA9IHNlcmRlc1R5cGVBbmRTcGVlZFRvU3BlZWRTZXEoc2VyZGVzVHlwZSwgYmF1ZFJhdGUpOwoJCWlmIChzcGVlZFNlcUlkID09IFNFUkRFU19MQVNUX1NFUSkgewoJCQltdlByaW50ZigibXZTZXJkZXNQb3dlclVwQ3RybDogc2VyZGVzIHR5cGUgJWQgYW5kIHNwZWVkICVkIGFyZSBub3Qgc3VwcG9ydGVkIHRvZ2V0aGVyXG4iLAoJCQkJCSBzZXJkZXNUeXBlLCBiYXVkUmF0ZSk7CgoJCQlyZXR1cm4gTVZfQkFEX1BBUkFNOwoJCX0KCgkJLyogRXhlY3V0aW5nIHBvd2VyIHVwLCByZWYgY2xvY2sgc2V0LCBzcGVlZCBjb25maWcgYW5kIFRYIGNvbmZpZyAqLwoJCXN3aXRjaCAoc2VyZGVzVHlwZSkgewoJCWNhc2UgUEVYMDoKCQljYXNlIFBFWDE6CgkJY2FzZSBQRVgyOgoJCWNhc2UgUEVYMzoKCQkJaWYgKG12SHdzQ3RybFNlcmRlc1JldkdldCgpID09IE1WX1NFUkRFU19SRVZfMV8yKSB7CgkJCQlDSEVDS19TVEFUVVMobXZTZXJkZXNQZXhVc2IzUGlwZURlbGF5V0Eoc2VyZGVzTnVtLCBQRVgpKTsKCQkJfQoKCQkJaXNQZXhCeTEgPSAoc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3gxKSB8fCAoc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3gxKTsKCQkJcGV4SWR4ID0gc2VyZGVzVHlwZSAtIFBFWDA7CgoJCQlpZiAoKGlzUGV4QnkxID09IE1WX1RSVUUpIHx8IChzZXJkZXNUeXBlID09IFBFWDApKQoJCQl7CgkJCQkvKiBGb3IgUEVYIGJ5IDQsIGluaXQgb25seSB0aGUgUEVYIDAgKi8KCQkJCXJlZ0RhdGEgPSBNVl9SRUdfUkVBRChTT0NfQ09OVFJPTF9SRUcxKTsKCQkJCWlmIChpc1BleEJ5MSA9PSBNVl9UUlVFKSB7CgkJCQkJcmVnRGF0YSB8PSAweDQwMDA7CgkJCQl9CgkJCQllbHNlewoJCQkJCXJlZ0RhdGEgJj0gfjB4NDAwMDsKCQkJCX0KCQkJCU1WX1JFR19XUklURShTT0NfQ09OVFJPTF9SRUcxLCByZWdEYXRhKTsKCgkJCQlyZWdEYXRhID0gTVZfUkVHX1JFQUQoKChNVl9QRVhfSUZfUkVHU19CQVNFKHBleElkeCkpICsgMHg2YykpOwoJCQkJcmVnRGF0YSAmPSB+MHgzRjA7CgkJCQlpZiAoaXNQZXhCeTEgPT0gTVZfVFJVRSkgewoJCQkJCXJlZ0RhdGEgfD0gMHgxMDsKCQkJCX0KCQkJCWVsc2UgewoJCQkJCXJlZ0RhdGEgfD0gMHg0MDsKCQkJCX0KCQkJCU1WX1JFR19XUklURSgoKE1WX1BFWF9JRl9SRUdTX0JBU0UocGV4SWR4KSkgKyAweDZjKSwgcmVnRGF0YSk7CgoJCQkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKCgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZHgpKSArIDB4NmMpKTsKCQkJCXJlZ0RhdGEgJj0gfjB4RjsKCQkJCXJlZ0RhdGEgfD0gMHgyOwoJCQkJTVZfUkVHX1dSSVRFKCgoTVZfUEVYX0lGX1JFR1NfQkFTRShwZXhJZHgpKSArIDB4NmMpLCByZWdEYXRhKTsKCgkJCQlyZWdEYXRhID0gTVZfUkVHX1JFQUQoKChNVl9QRVhfSUZfUkVHU19CQVNFKHBleElkeCkpICsgMHg3MCkpOwoJCQkJcmVnRGF0YSAmPSB+MHg0MDsKCQkJCXJlZ0RhdGEgfD0gMHg0MDsKCQkJCU1WX1JFR19XUklURSgoKE1WX1BFWF9JRl9SRUdTX0JBU0UocGV4SWR4KSkgKyAweDcwKSwgcmVnRGF0YSk7CgkJCX0KCiAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBQRVhfUE9XRVJfVVBfU0VRKSk7CiAgICAgICAgICAgIGlmIChpc1BleEJ5MSA9PSBNVl9GQUxTRSkgewogICAgICAgICAgICAgICAgLyogZm9yIFBFWCBieSA0IC0gdXNlIHRoZSBQRVggaW5kZXggYXMgdGhlIHNlcSBhcnJheSBpbmRleCAqLwogICAgICAgICAgICAgICAgc2VyZGVzU2VxRGJbUEVYX0JZXzRfQ09ORklHX1NFUV0uZGF0YUFycklkeCA9IHBleElkeDsKICAgICAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBQRVhfQllfNF9DT05GSUdfU0VRKSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdkh3c1JlZkNsb2NrU2V0KHNlcmRlc051bSwgc2VyZGVzVHlwZSwgcmVmQ2xvY2spKTsKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIHNwZWVkU2VxSWQpKTsKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9FTEVDVFJJQ0FMX0NPTkZJR19TRVEpKTsKCgkJCWlmIChpc1BleEJ5MSA9PSBNVl9UUlVFKSB7CgkJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUEVYX1RYX0NPTkZJR19TRVEyKSk7CgkJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUEVYX1RYX0NPTkZJR19TRVEzKSk7CgkJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUEVYX1RYX0NPTkZJR19TRVExKSk7CgkJCX0KCgkJCW12T3NVRGVsYXkoMjApOwoKI2lmZGVmIERCX0xJTktfQ0hFQ0sKCQkJaWYgKHNlcmRlc051bSA9PSAxKSB7CgkJCQlNVl9SRUdfV1JJVEUoU09DX0NPTlRST0xfUkVHMSwgMHgwNzA3QzBGMSk7CgkJCQlmb3IgKGkgPSAwOyBpIDwgTElOS19XQUlUX0NOVFI7IGkrKykgewoJCQkJCWlmICgoTVZfUkVHX1JFQUQoMHg4MWE2NCkgJiAweEZGKSA9PSAweDdFKSB7CgkJCQkJCURFQlVHX0lOSVRfUygiUENJZTAgTElOSyBVUCA7LSlcbiIpOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQkJbXZPc1VEZWxheShMSU5LX1dBSVRfU0xFRVApOwoJCQkJfQoKCQkJCWlmIChpID09IExJTktfV0FJVF9DTlRSKQoJCQkJCURFQlVHX0lOSVRfUygiUENJZTAgTk8gTElOSyA7LXxcbiIpOwoJCQl9ZWxzZXsKCQkJCU1WX1JFR19XUklURShTT0NfQ09OVFJPTF9SRUcxLCAweDA3MDdDMEYzKTsKCQkJCWZvciAoaSA9IDA7IGkgPCBMSU5LX1dBSVRfQ05UUjsgaSsrKSB7CgkJCQkJaWYgKChNVl9SRUdfUkVBRCgweDQxYTY0KSAmIDB4RkYpID09IDB4N0UpIHsKCQkJCQkJREVCVUdfSU5JVF9TKCJQQ0llMSBMSU5LIFVQIDstKVxuIik7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQltdk9zVURlbGF5KExJTktfV0FJVF9TTEVFUCk7CgkJCQl9CgoJCQkJaWYgKGkgPT0gTElOS19XQUlUX0NOVFIpCgkJCQkJREVCVUdfSU5JVF9TKCJQQ0llMSBOTyBMSU5LIDstfFxuIik7CgkJCX0KI2VuZGlmICAgICAgICAgICAgICAgICAgLyogREJfTElOS19DSEVDSyAqLwoKCQkJYnJlYWs7CgkJY2FzZSBVU0IzX0hPU1QwOgoJCWNhc2UgVVNCM19IT1NUMToKICAgICAgICBjYXNlIFVTQjNfREVWSUNFOgoJCQlpZiAobXZId3NDdHJsU2VyZGVzUmV2R2V0KCkgPT0gTVZfU0VSREVTX1JFVl8xXzIpIHsKCQkJCUNIRUNLX1NUQVRVUyhtdlNlcmRlc1BleFVzYjNQaXBlRGVsYXlXQShzZXJkZXNOdW0sIFVTQjMpKTsKCQkJfQoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgVVNCM19QT1dFUl9VUF9TRVEpKTsKCQkJQ0hFQ0tfU1RBVFVTKG12SHdzUmVmQ2xvY2tTZXQoc2VyZGVzTnVtLCBzZXJkZXNUeXBlLCByZWZDbG9jaykpOwoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgc3BlZWRTZXFJZCkpOwogICAgICAgICAgICBpZiAoc2VyZGVzVHlwZSA9PSBVU0IzX0RFVklDRSkgewogICAgICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFVTQjNfREVWSUNFX0NPTkZJR19TRVEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgVVNCM19FTEVDVFJJQ0FMX0NPTkZJR19TRVEpKTsKCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFVTQjNfVFhfQ09ORklHX1NFUTEpKTsKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFVTQjNfVFhfQ09ORklHX1NFUTIpKTsKCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFVTQjNfVFhfQ09ORklHX1NFUTMpKTsKCgkJCW12T3NVRGVsYXkoMTAwMDApOwoKI2lmZGVmIERCX0xJTktfQ0hFQ0sKCQkJaWYgKCBzZXJkZXNOdW0gPT0gNCkgewoJCQkJaWYgKCAwICE9IChNVl9SRUdfUkVBRCgweEEyMDA0KSAmIDB4MTAwKSkKCQkJCQlERUJVR19JTklUX1MoIlVTQiBQTEwwIExPQ0tFRCA7LXxcbiIpOwoJCQkJZWxzZQoJCQkJCURFQlVHX0lOSVRfUygiVVNCIFBMTDAgVU5MT0NLIDstKVxuIik7CgoJCQkJaWYgKCAweEQgPT0gKE1WX1JFR19SRUFEKDB4MTgzQjgpICYgMHhEKSkKCQkJCQlERUJVR19JTklUX1MoIlVTQiBQTEwwIFJFQURZIDstKVxuIik7CgkJCQllbHNlCgkJCQkJREVCVUdfSU5JVF9TKCJVU0IgUExMMCBOT1QgUkVBRFkgOy18XG4iKTsKCQkJfWVsc2V7CgkJCQlpZiAoIDAgIT0gKE1WX1JFR19SRUFEKDB4QTI4MDQpICYgMHgxMDApKQoJCQkJCURFQlVHX0lOSVRfUygiVVNCIFBMTDEgTE9DS0VEIDstfFxuIik7CgkJCQllbHNlCgkJCQkJREVCVUdfSU5JVF9TKCJVU0IgUExMMSBVTkxPQ0sgOy0pXG4iKTsKCgkJCQlpZiAoIDB4RCA9PSAoTVZfUkVHX1JFQUQoMHgxODNFMCkgJiAweEQpKQoJCQkJCURFQlVHX0lOSVRfUygiVVNCIFBMTDEgUkVBRFkgOy0pXG4iKTsKCQkJCWVsc2UKCQkJCQlERUJVR19JTklUX1MoIlVTQiBQTEwxIE5PVCBSRUFEWSA7LXxcbiIpOwoJCQl9CiNlbmRpZiAvKiBEQl9MSU5LX0NIRUNLICovCgoJCQlicmVhazsKCQljYXNlIFNBVEEwOgoJCWNhc2UgU0FUQTE6CgkJY2FzZSBTQVRBMjoKCQljYXNlIFNBVEEzOgoJCQlzYXRhSWR4ID0gKChzZXJkZXNUeXBlID09IFNBVEEwKSB8fCAoc2VyZGVzVHlwZSA9PSBTQVRBMSkpID8gMCA6IDE7CgkJCXNhdGFQb3J0ID0gKChzZXJkZXNUeXBlID09IFNBVEEwKSB8fCAoc2VyZGVzVHlwZSA9PSBTQVRBMikpID8gMCA6IDE7CgoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNhdGFJZHgsIChzYXRhUG9ydCA9PSAwKSA/IFNBVEFfUE9SVF8wX09OTFlfUE9XRVJfVVBfU0VRIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQVRBX1BPUlRfMV9PTkxZX1BPV0VSX1VQX1NFUSkpOwoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgU0FUQV9QT1dFUl9VUF9TRVEpKTsKCQkJQ0hFQ0tfU1RBVFVTKG12SHdzUmVmQ2xvY2tTZXQoc2VyZGVzTnVtLCBzZXJkZXNUeXBlLCByZWZDbG9jaykpOwoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgc3BlZWRTZXFJZCkpOwogICAgICAgICAgICBDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgU0FUQV9FTEVDVFJJQ0FMX0NPTkZJR19TRVEpKTsKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFNBVEFfVFhfQ09ORklHX1NFUTEpKTsKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzYXRhSWR4LCAoc2F0YVBvcnQgPT0gMCkgPyBTQVRBX1BPUlRfMF9PTkxZX1RYX0NPTkZJR19TRVEgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNBVEFfUE9SVF8xX09OTFlfVFhfQ09ORklHX1NFUSkpOwogICAgICAgICAgICBDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgU0FUQV9UWF9DT05GSUdfU0VRMikpOwoKCQkJbXZPc1VEZWxheSgxMDAwMCk7CiNpZmRlZiBEQl9MSU5LX0NIRUNLCgkJCWlmICggc2VyZGVzTnVtID09IDApIHsKCQkJCWZvciAoaSA9IDA7IGkgPCBMSU5LX1dBSVRfQ05UUjsgaSsrKSB7CgkJCQkJaWYgKChNVl9SRUdfUkVBRCgweDE4MzE4KSAmIDB4RCkgPT0gMHhEKSB7CgkJCQkJCURFQlVHX0lOSVRfUygiU0FUQTAgUExMIFJFQURZIDstKVxuIik7CgkJCQkJCWJyZWFrOwoJCQkJCX0KCQkJCQltdk9zVURlbGF5KExJTktfV0FJVF9TTEVFUCk7CgkJCQl9CgoJCQkJaWYgKGkgPT0gTElOS19XQUlUX0NOVFIpCgkJCQkJREVCVUdfSU5JVF9TKCJTQVRBMCBQTEwgTk9UIFJFQURZXG4iKTsKCQkJfWVsc2V7CgkJCQlmb3IgKGkgPSAwOyBpIDwgTElOS19XQUlUX0NOVFI7IGkrKykgewoJCQkJCWlmICgoTVZfUkVHX1JFQUQoMHgxODM5MCkgJiAweEQpID09IDB4RCkgewoJCQkJCQlERUJVR19JTklUX1MoIlNBVEExIFBMTCBSRUFEWSA7LSlcbiIpOwoJCQkJCQlicmVhazsKCQkJCQl9CgkJCQkJbXZPc1VEZWxheShMSU5LX1dBSVRfU0xFRVApOwoJCQkJfQoKCQkJCWlmIChpID09IExJTktfV0FJVF9DTlRSKQoJCQkJCURFQlVHX0lOSVRfUygiU0FUQTEgUExMIE5PVCBSRUFEWVxuIik7CgkJCX0KI2VuZGlmICAgICAgICAgICAgICAgICAgLyogREJfTElOS19DSEVDSyAqLwoJCQlicmVhazsKCQljYXNlIFNHTUlJMDoKCQljYXNlIFNHTUlJMToKCQljYXNlIFNHTUlJMjoKCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFNHTUlJX1BPV0VSX1VQX1NFUSkpOwoJCQlDSEVDS19TVEFUVVMobXZId3NSZWZDbG9ja1NldChzZXJkZXNOdW0sIHNlcmRlc1R5cGUsIHJlZkNsb2NrKSk7CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBzcGVlZFNlcUlkKSk7CiAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBTR01JSV9FTEVDVFJJQ0FMX0NPTkZJR19TRVEpKTsKCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFNHTUlJX1RYX0NPTkZJR19TRVExKSk7CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBTR01JSV9UWF9DT05GSUdfU0VRMikpOwoKCQkJLyogR0JFIGNvbmZpZ3VyYXRpb24gKi8KCQkJcmVnRGF0YSA9IE1WX1JFR19SRUFEKEdCRV9DT05GSUdVUkFUSU9OX1JFRyk7CgkJCXJlZ0RhdGEgfD0gMHgxIDw8IChzZXJkZXNUeXBlIC0gU0dNSUkwKTsgLyogd3JpdGUgdGhlIFNHTUlJIGluZGV4ICovCgkJCU1WX1JFR19XUklURShHQkVfQ09ORklHVVJBVElPTl9SRUcsIHJlZ0RhdGEpOwoKCQkJYnJlYWs7CgkJY2FzZSBRU0dNSUk6CgkJCWlmIChtdkh3c0N0cmxTZXJkZXNSZXZHZXQoKSA8IE1WX1NFUkRFU19SRVZfMl8xKSB7CgkJCQlyZXR1cm4gTVZfTk9UX1NVUFBPUlRFRDsKCQkJfQoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc051bSwgUVNHTUlJX1BPV0VSX1VQX1NFUSkpOwoJCQlDSEVDS19TVEFUVVMobXZId3NSZWZDbG9ja1NldChzZXJkZXNOdW0sIHNlcmRlc1R5cGUsIHJlZkNsb2NrKSk7CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBzcGVlZFNlcUlkKSk7CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBRU0dNSUlfRUxFQ1RSSUNBTF9DT05GSUdfU0VRKSk7CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBRU0dNSUlfVFhfQ09ORklHX1NFUTEpKTsKCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFFTR01JSV9UWF9DT05GSUdfU0VRMikpOwogICAgICAgICAgICBicmVhazsKCQljYXNlIFNHTUlJMzoKCQljYXNlIFhBVUk6CiAgICAgICAgY2FzZSBSWEFVSToKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VyZGVzUG93ZXJVcEN0cmxFeHQoc2VyZGVzTnVtLCBzZXJkZXNQb3dlclVwLCBzZXJkZXNUeXBlLCBiYXVkUmF0ZSwgc2VyZGVzTW9kZSwgcmVmQ2xvY2spKTsKICAgICAgICAgICAgYnJlYWs7CgkJZGVmYXVsdDoKCQkJREVCVUdfSU5JVF9TKCJtdlNlcmRlc1Bvd2VyVXBDdHJsOiBiYWQgc2VyZGVzVHlwZSBwYXJhbWV0ZXJcbiIpOwoJCQlyZXR1cm4gTVZfQkFEX1BBUkFNOwoJCX0KCX1lbHNlIHsgLyogU2VyZGVzIHBvd2VyIGRvd24gKi8KCQlERUJVR19JTklUX0ZVTExfUygibXZTZXJkZXNQb3dlclVwOiBleGVjdXRpbmcgcG93ZXIgZG93bi4uICIpOwoJCURFQlVHX0lOSVRfRlVMTF9DKCJzZXJkZXMgbnVtID0gIiwgc2VyZGVzTnVtLCAxKTsKCgkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFNFUkRFU19QT1dFUl9ET1dOX1NFUSkpOwoJfQoKCURFQlVHX0lOSVRfRlVMTF9DKCJtdlNlcmRlc1Bvd2VyVXBDdHJsIGVuZGVkIHN1Y2Nlc3NmdWxseSBmb3Igc2VyZGVzICIsIHNlcmRlc051bSwgMik7CgoJcmV0dXJuIE1WX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpNVl9TVEFUVVMgbXZId3NVcGRhdGVTZXJkZXNQaHlTZWxlY3RvcnMoU0VSREVTX01BUCogc2VyZGVzQ29uZmlnTWFwKQp7CglNVl9VMzIgbGFuZURhdGEsIHNlcmRlc0lkeCxzZXJkZXNMYW5lSHdOdW0sIHJlZ0RhdGEgPSAwOwoJU0VSREVTX1RZUEUgc2VyZGVzVHlwZTsKCVNFUkRFU19NT0RFIHNlcmRlc01vZGU7CglNVl9VOCAgICAgICBzZWxlY3RCaXRPZmY7CglNVl9CT09MIGlzUEVYeDQgPSBNVl9GQUxTRTsKCU1WX0JPT0wgdXBkYXRlZFRvcG9sb2d5UHJpbnQgPSBNVl9GQUxTRTsKCglERUJVR19JTklUX0ZVTExfUygiXG4jIyMgbXZId3NVcGRhdGVTZXJkZXNQaHlTZWxlY3RvcnMgIyMjXG4iKTsKCURFQlVHX0lOSVRfRlVMTF9TKCJVcGRhdGluZyB0aGUgQ09NTU9OIFBIWVMgU0VMRUNUT1JTIHJlZ2lzdGVyIHdpdGggdGhlIHNlcmRlcyB0eXBlc1xuIik7CgoJaWYobXZId3NDdHJsU2VyZGVzUmV2R2V0KCkgPT0gTVZfU0VSREVTX1JFVl8xXzIpIHsKCQlzZWxlY3RCaXRPZmYgPSAzOwoJfSBlbHNlIHsKCQlzZWxlY3RCaXRPZmYgPSA0OwoJfQoKCS8qIFVwZGF0aW5nIGJpdHMgMC0xNyBpbiB0aGUgQ09NTU9OIFBIWVMgU0VMRUNUT1JTIHJlZ2lzdGVyIGFjY29yZGluZyB0byB0aGUgc2VyZGVzIHR5cGVzICovCglmb3IgKHNlcmRlc0lkeCA9IDA7IHNlcmRlc0lkeCA8IG12SHdzU2VyZGVzR2V0TWF4TGFuZSgpOyBzZXJkZXNJZHgrKykgewoJCXNlcmRlc1R5cGUgPSBzZXJkZXNDb25maWdNYXBbc2VyZGVzSWR4XS5zZXJkZXNUeXBlOwoJCXNlcmRlc01vZGUgPSBzZXJkZXNDb25maWdNYXBbc2VyZGVzSWR4XS5zZXJkZXNNb2RlOwoJCXNlcmRlc0xhbmVId051bSA9IG12SHdzR2V0UGh5c2ljYWxTZXJkZXNOdW0oc2VyZGVzSWR4KTsKCgkJbGFuZURhdGEgPSBtdkh3c1NlcmRlc0dldFBoeVNlbGVjdG9yVmFsKHNlcmRlc0xhbmVId051bSwgc2VyZGVzVHlwZSk7CgoJCWlmKHNlcmRlc1R5cGUgPT0gREVGQVVMVF9TRVJERVMpIHsKCQkJY29udGludWU7CgkJfQoJCWlmIChtdkh3c1NlcmRlc1RvcG9sb2d5VmVyaWZ5KHNlcmRlc1R5cGUsc2VyZGVzSWR4LHNlcmRlc01vZGUpICE9IE1WX09LKXsKCQkJc2VyZGVzQ29uZmlnTWFwW3NlcmRlc0lkeF0uc2VyZGVzVHlwZSA9IERFRkFVTFRfU0VSREVTOwoJCQltdlByaW50ZigiJXM6IFNlckRlcyBsYW5lICMlZCBpcyAgZGlzYWJsZWRcbiIsX19mdW5jX18sIHNlcmRlc0xhbmVId051bSk7CgkJCXVwZGF0ZWRUb3BvbG9neVByaW50ID0gTVZfVFJVRTsKCQkJY29udGludWU7CgkJfQoJCS8qIENoZWNraW5nIGlmIHRoZSBib2FyZCB0b3BvbG9neSBjb25maWd1cmF0aW9uIGluY2x1ZGVzIFBFWHg0IC0gZm9yIHRoZSBuZXh0IHN0ZXAgKi8KCQlpZiAoKHNlcmRlc01vZGUgPT0gUEVYX0VORF9QT0lOVF94NCkgfHwgKHNlcmRlc01vZGUgPT0gUEVYX1JPT1RfQ09NUExFWF94NCkpIHsKICAgICAgICAgICAgLyogdXBkYXRlIGxhbmUgZGF0YSB0byB0aGUgMyBuZXh0IFNFUkRFUyBsYW5lcyAqLwogICAgICAgICAgICBsYW5lRGF0YSA9IGNvbW1vblBoeXNTZWxlY3RvcnNQZXhCeTRMYW5lc1tzZXJkZXNMYW5lSHdOdW1dOwoJCQlpZiAoc2VyZGVzVHlwZSA9PSBQRVgwKSB7CgkJCQlpc1BFWHg0ID0gTVZfVFJVRTsKCQkJfQoJCX0KCgkJaWYgKGxhbmVEYXRhID09IE5BKSB7CgkJCW12UHJpbnRmKCIlczogV2FybmluZzogU2VyRGVzIGxhbmUgIyVkIGFuZCB0eXBlICVkIGFyZSBub3Qgc3VwcG9ydGVkIHRvZ2V0aGVyXG4iLAoJCQkJCV9fZnVuY19fLCBzZXJkZXNMYW5lSHdOdW0sIHNlcmRlc01vZGUpOwoJCQlzZXJkZXNDb25maWdNYXBbc2VyZGVzSWR4XS5zZXJkZXNUeXBlID0gREVGQVVMVF9TRVJERVM7CgkJCW12UHJpbnRmKCIlczogU2VyRGVzIGxhbmUgIyVkIGlzICBkaXNhYmxlZFxuIixfX2Z1bmNfXywgc2VyZGVzTGFuZUh3TnVtKTsKCQkJY29udGludWU7CgkJfQoJCS8qIFVwZGF0aW5nIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSB3cml0dGVuIHRvIENPTU1PTl9QSFlTX1NFTEVDVE9SU19SRUcgKi8KCQlyZWdEYXRhIHw9IChsYW5lRGF0YSA8PCAoc2VsZWN0Qml0T2ZmICogc2VyZGVzTGFuZUh3TnVtKSk7Cgl9CgoJLyogY2hlY2sgdGhhdCBudW1iZXIgb2YgdXNlZCBsYW5lcyBmb3IgWEFVSSBhbmQgUlhBVUkgKGlmIHVzZWQpIGlzIHJpZ2h0ICovCgltdkh3c1NlcmRlc1hBVUlUb3BvbG9neVZlcmlmeSgpOwoKCS8qIHByaW50IHRvcG9sb2d5ICovCglpZiAodXBkYXRlZFRvcG9sb2d5UHJpbnQpCgkJcHJpbnRUb3BvbG9neURldGFpbHMoc2VyZGVzQ29uZmlnTWFwKTsKCgkvKiBVcGRhdGluZyB0aGUgUEVYeDQgRW5hYmxlIGJpdCBpbiB0aGUgQ09NTU9OIFBIWVMgU0VMRUNUT1JTIHJlZ2lzdGVyIGZvciBQRVh4NCBtb2RlICovCglyZWdEYXRhIHw9IChpc1BFWHg0ID09IE1WX1RSVUUpID8gKDB4MSA8PCBQRVh4NF9FTkFCTEVfT0ZGUykgOiAwOwoKCS8qIFVwZGF0aW5nIHRoZSBDT01NT04gUEhZUyBTRUxFQ1RPUlMgcmVnaXN0ZXIgKi8KCU1WX1JFR19XUklURShDT01NT05fUEhZU19TRUxFQ1RPUlNfUkVHLCByZWdEYXRhKTsKCglyZXR1cm4gTVZfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCk1WX1NUQVRVUyBtdkh3c1JlZkNsb2NrU2V0CigKICAgIE1WX1UzMiBzZXJkZXNOdW0sCiAgICBTRVJERVNfVFlQRSBzZXJkZXNUeXBlLAogICAgUkVGX0NMT0NLIHJlZkNsb2NrCikKewogICAgTVZfVTMyIGRhdGExPTAsIGRhdGEyPTAsIGRhdGEzPTAsIHJlZ0RhdGE7CgogICAgREVCVUdfSU5JVF9GVUxMX1MoIlxuIyMjIG12SHdzUmVmQ2xvY2tTZXQgIyMjXG4iKTsKCiAgICBpZiAobXZId3NJc1NlcmRlc0FjdGl2ZShzZXJkZXNOdW0pICE9IE1WX1RSVUUpIHsKICAgICAgICBtdlByaW50ZigiJXM6IFNlckRlcyBsYW5lICMlZCBpcyBub3QgQWN0aXZlXG4iLCBfX2Z1bmNfXywgc2VyZGVzTnVtKTsKICAgICAgICByZXR1cm4gTVZfQkFEX1BBUkFNOwogICAgfQoKICAgIHN3aXRjaCAoc2VyZGVzVHlwZSkgewogICAgY2FzZSBQRVgwOgogICAgY2FzZSBQRVgxOgogICAgY2FzZSBQRVgyOgogICAgY2FzZSBQRVgzOgogICAgICAgIHN3aXRjaCAocmVmQ2xvY2spIHsKICAgICAgICBjYXNlIFJFRl9DTE9DS19fMjVNSHo6CiAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBQRVhfQ09ORklHX1JFRl9DTE9DS18yNU1Iel9TRVEpKTsKICAgICAgICAgICAgcmV0dXJuIE1WX09LOwogICAgICAgIGNhc2UgUkVGX0NMT0NLX18xMDBNSHo6CiAgICAgICAgICAgIENIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTnVtLCBQRVhfQ09ORklHX1JFRl9DTE9DS18xMDBNSHpfU0VRKSk7CiAgICAgICAgICAgIHJldHVybiBNVl9PSzsKI2lmZGVmIE1WODhGNjlYWAogICAgICAgIGNhc2UgUkVGX0NMT0NLX180ME1IejoKICAgICAgICAgICAgQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNOdW0sIFBFWF9DT05GSUdfUkVGX0NMT0NLXzQwTUh6X1NFUSkpOwogICAgICAgICAgICByZXR1cm4gTVZfT0s7CiNlbmRpZgogICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIG12UHJpbnRmKCIlczogRXJyb3I6IHJlZkNsb2NrICVkIGZvciBTZXJEZXMgbGFuZSAjJWQsIHR5cGUgJWQgaXMgbm90IHN1cHBvcnRlZFxuIiwKICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVmQ2xvY2ssIHNlcmRlc051bSwgc2VyZGVzVHlwZSk7CiAgICAgICAgICAgIHJldHVybiBNVl9CQURfUEFSQU07CiAgICAgICAgfQogICAgY2FzZSBVU0IzX0hPU1QwOgogICAgY2FzZSBVU0IzX0hPU1QxOgogICAgY2FzZSBVU0IzX0RFVklDRToKICAgICAgICBpZiAocmVmQ2xvY2sgPT0gUkVGX0NMT0NLX18yNU1IeikgewogICAgICAgICAgICBkYXRhMSA9IFBPV0VSX0FORF9QTExfQ1RSTF9SRUdfMjVNSFpfVkFMXzI7CiAgICAgICAgICAgIGRhdGEyID0gR0xPQkFMX1BNX0NUUkxfUkVHXzI1TUhaX1ZBTDsKICAgICAgICAgICAgZGF0YTMgPSBMQU5FX0NGRzRfUkVHXzI1TUhaX1ZBTDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocmVmQ2xvY2sgPT0gUkVGX0NMT0NLX180ME1IeikgewoJCQlkYXRhMSA9IFBPV0VSX0FORF9QTExfQ1RSTF9SRUdfNDBNSFpfVkFMOwogICAgICAgICAgICBkYXRhMiA9IEdMT0JBTF9QTV9DVFJMX1JFR180ME1IWl9WQUw7CiAgICAgICAgICAgIGRhdGEzID0gTEFORV9DRkc0X1JFR180ME1IWl9WQUw7CgkJfQoJCWVsc2V7CgkJCW12UHJpbnRmKCJtdkh3c1JlZkNsb2NrU2V0OiByZWYgY2xvY2sgaXMgbm90IHZhbGlkIGZvciBzZXJkZXMgdHlwZSAlZFxuIiwgc2VyZGVzVHlwZSk7CgkJCXJldHVybiBNVl9CQURfUEFSQU07CgkJfQoJCWJyZWFrOwoJY2FzZSBTQVRBMDoKCWNhc2UgU0FUQTE6CgljYXNlIFNBVEEyOgogICAgY2FzZSBTQVRBMzoKICAgIGNhc2UgU0dNSUkwOgoJY2FzZSBTR01JSTE6CgljYXNlIFNHTUlJMjoKCWNhc2UgUVNHTUlJOgoJCWlmIChyZWZDbG9jayA9PSBSRUZfQ0xPQ0tfXzI1TUh6KSB7CgkJCWRhdGExID0gUE9XRVJfQU5EX1BMTF9DVFJMX1JFR18yNU1IWl9WQUxfMTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocmVmQ2xvY2sgPT0gUkVGX0NMT0NLX180ME1IeikgewoJCQlkYXRhMSA9IFBPV0VSX0FORF9QTExfQ1RSTF9SRUdfNDBNSFpfVkFMOwogICAgICAgIH0KICAgICAgICBlbHNlewoJCQltdlByaW50ZigibXZId3NSZWZDbG9ja1NldDogcmVmIGNsb2NrIGlzIG5vdCB2YWxpZCBmb3Igc2VyZGVzIHR5cGUgJWRcbiIsIHNlcmRlc1R5cGUpOwoJCQlyZXR1cm4gTVZfQkFEX1BBUkFNOwogICAgICAgIH0KICAgICAgICBicmVhazsKI2lmZGVmIE1WODhGNjlYWAoJY2FzZSBTR01JSTM6CgljYXNlIFhBVUk6CgljYXNlIFJYQVVJOgogICAgICAgIGlmIChyZWZDbG9jayA9PSBSRUZfQ0xPQ0tfXzI1TUh6KSB7CgkJCWRhdGExID0gUE9XRVJfQU5EX1BMTF9DVFJMX1JFR18yNU1IWl9WQUxfMTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocmVmQ2xvY2sgPT0gUkVGX0NMT0NLX180ME1IeikgewoJCQlkYXRhMSA9IFBPV0VSX0FORF9QTExfQ1RSTF9SRUdfNDBNSFpfVkFMOwogICAgICAgIH0KICAgICAgICBlbHNlewoJCQltdlByaW50ZigibXZId3NSZWZDbG9ja1NldDogcmVmIGNsb2NrIGlzIG5vdCB2YWxpZCBmb3Igc2VyZGVzIHR5cGUgJWRcbiIsIHNlcmRlc1R5cGUpOwoJCQlyZXR1cm4gTVZfQkFEX1BBUkFNOwogICAgICAgIH0KICAgICAgICBicmVhazsKI2VuZGlmCiAgICBkZWZhdWx0OgoJCURFQlVHX0lOSVRfUygibXZId3NSZWZDbG9ja1NldDogbm90IHN1cHBvcnRlZCBzZXJkZXMgdHlwZVxuIik7CgkJcmV0dXJuIE1WX0JBRF9QQVJBTTsKCX0KCgkvKiBXcml0ZSB0aGUgcmVmQ2xvY2sgdG8gcmVsZXZhbnQgU0VMRUNUX1JFRl9DTE9DS19SRUcgYml0cyBhbmQgb2Zmc2V0ICovCglyZWdEYXRhID0gTVZfUkVHX1JFQUQoUE9XRVJfQU5EX1BMTF9DVFJMX1JFRyArIFNFUkRFU19SRUdTX0xBTkVfQkFTRV9PRkZTRVQoc2VyZGVzTnVtKSk7CglyZWdEYXRhICY9IFBPV0VSX0FORF9QTExfQ1RSTF9SRUdfTUFTSzsKCXJlZ0RhdGEgfD0gZGF0YTE7CglNVl9SRUdfV1JJVEUoUE9XRVJfQU5EX1BMTF9DVFJMX1JFRyArIFNFUkRFU19SRUdTX0xBTkVfQkFTRV9PRkZTRVQoc2VyZGVzTnVtKSwgcmVnRGF0YSk7CgogICAgaWYgKChzZXJkZXNUeXBlID09IFVTQjNfSE9TVDApIHx8IChzZXJkZXNUeXBlID09IFVTQjNfSE9TVDEpIHx8IChzZXJkZXNUeXBlID09IFVTQjNfREVWSUNFKSkgewogICAgICAgIHJlZ0RhdGEgPSBNVl9SRUdfUkVBRChHTE9CQUxfUE1fQ1RSTCArIFNFUkRFU19SRUdTX0xBTkVfQkFTRV9PRkZTRVQoc2VyZGVzTnVtKSk7CiAgICAgICAgcmVnRGF0YSAmPSBHTE9CQUxfUE1fQ1RSTF9SRUdfTUFTSzsKICAgICAgICByZWdEYXRhIHw9IGRhdGEyOwogICAgICAgIE1WX1JFR19XUklURShHTE9CQUxfUE1fQ1RSTCArIFNFUkRFU19SRUdTX0xBTkVfQkFTRV9PRkZTRVQoc2VyZGVzTnVtKSwgcmVnRGF0YSk7CgogICAgICAgIHJlZ0RhdGEgPSBNVl9SRUdfUkVBRChMQU5FX0NGRzRfUkVHICsgU0VSREVTX1JFR1NfTEFORV9CQVNFX09GRlNFVChzZXJkZXNOdW0pKTsKICAgICAgICByZWdEYXRhICY9IExBTkVfQ0ZHNF9SRUdfTUFTSzsKICAgICAgICByZWdEYXRhIHw9IGRhdGEzOwogICAgICAgIE1WX1JFR19XUklURShMQU5FX0NGRzRfUkVHICsgU0VSREVTX1JFR1NfTEFORV9CQVNFX09GRlNFVChzZXJkZXNOdW0pLCByZWdEYXRhKTsKICAgIH0KCglyZXR1cm4gTVZfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqIG12SHdzUGV4VHhDb25maWdTZXEgLQoqCiogREVTQ1JJUFRJT046ICAgICAgICAgIFNldCBQRVhfVFhfQ09ORklHX1NFUSBzZXF1ZW5jZSBpbml0IGZvciBQRVh4NCBtb2RlCiogSU5QVVQ6ICAgICAgICAgICAgICAgIHNlcmRlc01hcCAgICAgICAtIFRoZSBib2FyZCB0b3BvbG9neSBtYXAKKiBPVVRQVVQ6ICAgICAgICAgICAgICAgTm9uZQoqIFJFVFVSTlM6ICAgICAgICAgICAgICBNVl9PSyAgICAgICAgICAgLSBmb3Igc3VjY2VzcwoqICAgICAgICAgICAgICAgICAgICAgICBNVl9CQURfUEFSQU0gICAgLSBmb3IgZmFpbAoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCk1WX1NUQVRVUyBtdkh3c1BleFR4Q29uZmlnU2VxKFNFUkRFU19NQVAgKnNlcmRlc01hcCkKewogICAgU0VSREVTX01PREUgc2VyZGVzTW9kZTsKICAgIE1WX1UzMiBzZXJkZXNMYW5lSWQsIHNlcmRlc0xhbmVId051bTsKCiAgICBERUJVR19JTklUX0ZVTExfUygiXG4jIyMgbXZId3NQZXhUeENvbmZpZ1NlcSAjIyNcbiIpOwoKCS8qICBGb3IgUEVYeDQ6IHRoZSBwZXhBbmRVc2IzVHhDb25maWdQYXJhbXMxLzIvMyBjb25maWd1cmF0aW9ucyBzaG91bGQgcnVuCgkJCSAgYnkgc2V0dGluZyBlYWNoIHNlcXVlbmNlIGZvciBhbGwgNCBsYW5lcy4gKi8KCgkvKiByZWxlc2UgcGlwZSBzb2Z0IHJlc2V0IGZvciBhbGwgbGFuZXMgKi8KCWZvciAoc2VyZGVzTGFuZUlkID0gMDsgc2VyZGVzTGFuZUlkIDwgbXZId3NTZXJkZXNHZXRNYXhMYW5lKCk7IHNlcmRlc0xhbmVJZCsrKSB7CgkJc2VyZGVzTW9kZSA9IHNlcmRlc01hcFtzZXJkZXNMYW5lSWRdLnNlcmRlc01vZGU7CgkJc2VyZGVzTGFuZUh3TnVtID0gbXZId3NHZXRQaHlzaWNhbFNlcmRlc051bShzZXJkZXNMYW5lSWQpOwoKCQlpZiAoKHNlcmRlc01vZGUgPT0gUEVYX1JPT1RfQ09NUExFWF94NCkgfHwgKHNlcmRlc01vZGUgPT0gUEVYX0VORF9QT0lOVF94NCkpIHsKCQkJQ0hFQ0tfU1RBVFVTKG12U2VxRXhlYyhzZXJkZXNMYW5lSHdOdW0sIFBFWF9UWF9DT05GSUdfU0VRMSkpOwoJCX0KCX0KCgkvKiBzZXQgcGh5IHNvZnQgcmVzZXQgZm9yIGFsbCBsYW5lcyAqLwoJZm9yIChzZXJkZXNMYW5lSWQgPSAwOyBzZXJkZXNMYW5lSWQgPCBtdkh3c1NlcmRlc0dldE1heExhbmUoKTsgc2VyZGVzTGFuZUlkKyspIHsKCQlzZXJkZXNNb2RlID0gc2VyZGVzTWFwW3NlcmRlc0xhbmVJZF0uc2VyZGVzTW9kZTsKCQlzZXJkZXNMYW5lSHdOdW0gPSBtdkh3c0dldFBoeXNpY2FsU2VyZGVzTnVtKHNlcmRlc0xhbmVJZCk7CgkJaWYgKChzZXJkZXNNb2RlID09IFBFWF9ST09UX0NPTVBMRVhfeDQpIHx8IChzZXJkZXNNb2RlID09IFBFWF9FTkRfUE9JTlRfeDQpKSB7CgkJCUNIRUNLX1NUQVRVUyhtdlNlcUV4ZWMoc2VyZGVzTGFuZUh3TnVtLCBQRVhfVFhfQ09ORklHX1NFUTIpKTsKCQl9Cgl9CgoJLyogc2V0IHBoeSBzb2Z0IHJlc2V0IGZvciBhbGwgbGFuZXMgKi8KCWZvciAoc2VyZGVzTGFuZUlkID0gMDsgc2VyZGVzTGFuZUlkIDwgbXZId3NTZXJkZXNHZXRNYXhMYW5lKCk7IHNlcmRlc0xhbmVJZCsrKSB7CgkJc2VyZGVzTW9kZSA9IHNlcmRlc01hcFtzZXJkZXNMYW5lSWRdLnNlcmRlc01vZGU7CgkJc2VyZGVzTGFuZUh3TnVtID0gbXZId3NHZXRQaHlzaWNhbFNlcmRlc051bShzZXJkZXNMYW5lSWQpOwoJCWlmICgoc2VyZGVzTW9kZSA9PSBQRVhfUk9PVF9DT01QTEVYX3g0KSB8fCAoc2VyZGVzTW9kZSA9PSBQRVhfRU5EX1BPSU5UX3g0KSkgewoJCQlDSEVDS19TVEFUVVMobXZTZXFFeGVjKHNlcmRlc0xhbmVId051bSwgUEVYX1RYX0NPTkZJR19TRVEzKSk7CgkJfQoJfQoKCXJldHVybiBNVl9PSzsKfQoKCgo=