LyoKICogQ29weXJpZ2h0IChDKSAyMDAzIE1pY2hhZWwgR/xubmV3aWcKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2RlZmluZSBDT01fTk9fV0lORE9XU19ICiNpbmNsdWRlIDxzdGRhcmcuaD4KCiNpbmNsdWRlICJ3aW5kZWYuaCIKI2luY2x1ZGUgIndpbmJhc2UuaCIKI2luY2x1ZGUgIm9iamJhc2UuaCIKI2luY2x1ZGUgIm1lZGlhb2JqLmgiCiNpbmNsdWRlICJkbW9ydC5oIgoKI2luY2x1ZGUgIndpbmUvZGVidWcuaCIKCldJTkVfREVGQVVMVF9ERUJVR19DSEFOTkVMKG1zZG1vKTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTW9DcmVhdGVNZWRpYVR5cGUJKE1TRE1PLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBNb0NyZWF0ZU1lZGlhVHlwZShETU9fTUVESUFfVFlQRSoqIHBwbWVkaWEsIERXT1JEIGNiRm9ybWF0KQp7CiAgSFJFU1VMVCBocjsKCiAgVFJBQ0UoIiglcCwlbHUpXG4iLCBwcG1lZGlhLCBjYkZvcm1hdCk7CgogIGlmIChwcG1lZGlhID09IE5VTEwpCiAgICByZXR1cm4gRV9QT0lOVEVSOwoKICAqcHBtZWRpYSA9IENvVGFza01lbUFsbG9jKHNpemVvZihETU9fTUVESUFfVFlQRSkpOwogIGlmICgqcHBtZWRpYSA9PSBOVUxMKQogICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CgogIGhyID0gTW9Jbml0TWVkaWFUeXBlKCpwcG1lZGlhLCBjYkZvcm1hdCk7CiAgaWYgKEZBSUxFRChocikpIHsKICAgIENvVGFza01lbUZyZWUoKnBwbWVkaWEpOwogICAgKnBwbWVkaWEgPSBOVUxMOwogIH0KCiAgcmV0dXJuIGhyOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1vSW5pdE1lZGlhVHlwZQkJKE1TRE1PLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBNb0luaXRNZWRpYVR5cGUoRE1PX01FRElBX1RZUEUqIHBtZWRpYSwgRFdPUkQgY2JGb3JtYXQpCnsKICBUUkFDRSgiKCVwLCVsdSlcbiIsIHBtZWRpYSxjYkZvcm1hdCk7CgogIGlmIChwbWVkaWEgPT0gTlVMTCkKICAgIHJldHVybiBFX1BPSU5URVI7CgogIG1lbXNldChwbWVkaWEsIDAsIHNpemVvZihETU9fTUVESUFfVFlQRSkpOwoKICBpZiAoY2JGb3JtYXQgPiAwKSB7CiAgICBwbWVkaWEtPnBiRm9ybWF0ID0gQ29UYXNrTWVtQWxsb2MoY2JGb3JtYXQpOwogICAgaWYgKHBtZWRpYS0+cGJGb3JtYXQgPT0gTlVMTCkKICAgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CgogICAgcG1lZGlhLT5jYkZvcm1hdCA9IGNiRm9ybWF0OwogIH0KCiAgcmV0dXJuIFNfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTW9EZWxldGVNZWRpYVR5cGUJKE1TRE1PLkApCiAqLwpIUkVTVUxUIFdJTkFQSSBNb0RlbGV0ZU1lZGlhVHlwZShETU9fTUVESUFfVFlQRSogcG1lZGlhKQp7CiAgVFJBQ0UoIiglcClcbiIsIHBtZWRpYSk7CgogIGlmIChwbWVkaWEgPT0gTlVMTCkKICAgIHJldHVybiBFX1BPSU5URVI7CgogIE1vRnJlZU1lZGlhVHlwZShwbWVkaWEpOwogIENvVGFza01lbUZyZWUocG1lZGlhKTsKCiAgcmV0dXJuIFNfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTW9GcmVlTWVkaWFUeXBlCQkoTVNETU8uQCkKICovCkhSRVNVTFQgV0lOQVBJIE1vRnJlZU1lZGlhVHlwZShETU9fTUVESUFfVFlQRSogcG1lZGlhKQp7CiAgVFJBQ0UoIiglcClcbiIsIHBtZWRpYSk7CgogIGlmIChwbWVkaWEgPT0gTlVMTCkKICAgIHJldHVybiBFX1BPSU5URVI7CgogIGlmIChwbWVkaWEtPnBVbmsgIT0gTlVMTCkgewogICAgSVVua25vd25fUmVsZWFzZShwbWVkaWEtPnBVbmspOwogICAgcG1lZGlhLT5wVW5rID0gTlVMTDsKICB9CgogIGlmIChwbWVkaWEtPnBiRm9ybWF0ICE9IE5VTEwpIHsKICAgIENvVGFza01lbUZyZWUocG1lZGlhLT5wYkZvcm1hdCk7CiAgICBwbWVkaWEtPnBiRm9ybWF0ID0gTlVMTDsKICB9CgogIHJldHVybiBTX09LOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoJCU1vRHVwbGljYXRlTWVkaWFUeXBlCShNU0RNTy5AKQogKi8KSFJFU1VMVCBXSU5BUEkgTW9EdXBsaWNhdGVNZWRpYVR5cGUoRE1PX01FRElBX1RZUEUqKiBwcGRzdCwKCQkJCSAgICBjb25zdCBETU9fTUVESUFfVFlQRSogcHNyYykKewogIEhSRVNVTFQgaHI7CgogIFRSQUNFKCIoJXAsJXApXG4iLCBwcGRzdCwgcHNyYyk7CgogIGlmIChwcGRzdCA9PSBOVUxMIHx8IHBzcmMgPT0gTlVMTCkKICAgIHJldHVybiBFX1BPSU5URVI7CgogICpwcGRzdCA9IENvVGFza01lbUFsbG9jKHNpemVvZihETU9fTUVESUFfVFlQRSkpOwogIGlmICgqcHBkc3QgPT0gTlVMTCkKICAgIHJldHVybiBFX09VVE9GTUVNT1JZOwoKICBociA9IE1vQ29weU1lZGlhVHlwZSgqcHBkc3QsIHBzcmMpOwogIGlmIChGQUlMRUQoaHIpKSB7CiAgICBNb0ZyZWVNZWRpYVR5cGUoKnBwZHN0KTsKICAgICpwcGRzdCA9IE5VTEw7CiAgfQoKICByZXR1cm4gaHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgkJTW9Db3B5TWVkaWFUeXBlCQkoTVNETU8uQCkKICovCkhSRVNVTFQgV0lOQVBJIE1vQ29weU1lZGlhVHlwZShETU9fTUVESUFfVFlQRSogcGRzdCwKCQkJICAgICAgIGNvbnN0IERNT19NRURJQV9UWVBFKiBwc3JjKQp7CiAgVFJBQ0UoIiglcCwlcClcbiIsIHBkc3QsIHBzcmMpOwoKICBpZiAocGRzdCA9PSBOVUxMIHx8IHBzcmMgPT0gTlVMTCkKICAgIHJldHVybiBFX1BPSU5URVI7CgogIG1lbWNweSgmcGRzdC0+bWFqb3J0eXBlLCAgJnBzcmMtPm1ham9ydHlwZSwgIHNpemVvZihwc3JjLT5tYWpvcnR5cGUpKTsKICBtZW1jcHkoJnBkc3QtPnN1YnR5cGUsICAgICZwc3JjLT5zdWJ0eXBlLCAgICBzaXplb2YocHNyYy0+c3VidHlwZSkpOwogIG1lbWNweSgmcGRzdC0+Zm9ybWF0dHlwZSwgJnBzcmMtPmZvcm1hdHR5cGUsIHNpemVvZihwc3JjLT5mb3JtYXR0eXBlKSk7CgogIHBkc3QtPmJGaXhlZFNpemVTYW1wbGVzICAgID0gcHNyYy0+YkZpeGVkU2l6ZVNhbXBsZXM7CiAgcGRzdC0+YlRlbXBvcmFsQ29tcHJlc3Npb24gPSBwc3JjLT5iVGVtcG9yYWxDb21wcmVzc2lvbjsKICBwZHN0LT5sU2FtcGxlU2l6ZSAgICAgICAgICA9IHBzcmMtPmxTYW1wbGVTaXplOwogIHBkc3QtPmNiRm9ybWF0ICAgICAgICAgICAgID0gcHNyYy0+Y2JGb3JtYXQ7CgogIGlmIChwc3JjLT5wYkZvcm1hdCAhPSBOVUxMICYmIHBzcmMtPmNiRm9ybWF0ID4gMCkgewogICAgcGRzdC0+cGJGb3JtYXQgPSBDb1Rhc2tNZW1BbGxvYyhwc3JjLT5jYkZvcm1hdCk7CiAgICBpZiAocGRzdC0+cGJGb3JtYXQgPT0gTlVMTCkKICAgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CgogICAgbWVtY3B5KHBkc3QtPnBiRm9ybWF0LCBwc3JjLT5wYkZvcm1hdCwgcHNyYy0+Y2JGb3JtYXQpOwogIH0gZWxzZQogICAgcGRzdC0+cGJGb3JtYXQgPSBOVUxMOwoKICBpZiAocHNyYy0+cFVuayAhPSBOVUxMKSB7CiAgICBwZHN0LT5wVW5rID0gcHNyYy0+cFVuazsKICAgIElVbmtub3duX0FkZFJlZihwZHN0LT5wVW5rKTsKICB9IGVsc2UKICAgIHBkc3QtPnBVbmsgPSBOVUxMOwoKICByZXR1cm4gU19PSzsKfQo=