LyoKICogQ29weXJpZ2h0IChDKSAyMDAzIE1pY2hhZWwgR/xubmV3aWcKICoKICogVGhpcyBsaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogKiB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBsaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAqIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCiAqCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhbG9uZyB3aXRoIHRoaXMgbGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAgVVNBCiAqLwoKI2luY2x1ZGUgPHN0ZGFyZy5oPgoKI2RlZmluZSBDT0JKTUFDUk9TCiNkZWZpbmUgQ09NX05PX1dJTkRPV1NfSAoKI2luY2x1ZGUgIndpbmRlZi5oIgojaW5jbHVkZSAid2luYmFzZS5oIgojaW5jbHVkZSAib2JqYmFzZS5oIgojaW5jbHVkZSAibWVkaWFvYmouaCIKI2luY2x1ZGUgImRtb3J0LmgiCgojaW5jbHVkZSAid2luZS9kZWJ1Zy5oIgoKV0lORV9ERUZBVUxUX0RFQlVHX0NIQU5ORUwobXNkbW8pOwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICBNb0NyZWF0ZU1lZGlhVHlwZSAgICAoTVNETU8uQCkKICoKICogQWxsb2NhdGUgYSBuZXcgbWVkaWEgdHlwZSBzdHJ1Y3R1cmUKICovCkhSRVNVTFQgV0lOQVBJIE1vQ3JlYXRlTWVkaWFUeXBlKERNT19NRURJQV9UWVBFKiogcHBtZWRpYSwgRFdPUkQgY2JGb3JtYXQpCnsKICAgIEhSRVNVTFQgcjsKCiAgICBUUkFDRSgiJXAgJWx1XG4iLCBwcG1lZGlhLCBjYkZvcm1hdCk7CgogICAgaWYgKCFwcG1lZGlhKQogICAgICAgIHJldHVybiBFX1BPSU5URVI7CgogICAgKnBwbWVkaWEgPSBDb1Rhc2tNZW1BbGxvYyhzaXplb2YoRE1PX01FRElBX1RZUEUpKTsKICAgIGlmICghKnBwbWVkaWEpCiAgICAgICAgcmV0dXJuIEVfT1VUT0ZNRU1PUlk7CgogICAgciA9IE1vSW5pdE1lZGlhVHlwZSgqcHBtZWRpYSwgY2JGb3JtYXQpOwogICAgaWYgKEZBSUxFRChyKSkKICAgIHsKICAgICAgICBDb1Rhc2tNZW1GcmVlKCpwcG1lZGlhKTsKICAgICAgICAqcHBtZWRpYSA9IE5VTEw7CiAgICB9CgogICAgcmV0dXJuIHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgTW9Jbml0TWVkaWFUeXBlICAgICAgICAoTVNETU8uQCkKICoKICogSW5pdGlhbGl6ZSBtZWRpYSB0eXBlIHN0cnVjdHVyZQogKi8KSFJFU1VMVCBXSU5BUEkgTW9Jbml0TWVkaWFUeXBlKERNT19NRURJQV9UWVBFKiBwbWVkaWEsIERXT1JEIGNiRm9ybWF0KQp7CiAgICBUUkFDRSgiJXAgJWx1XG4iLCBwbWVkaWEsIGNiRm9ybWF0KTsKCiAgICBpZiAoIXBtZWRpYSkKICAgICAgICByZXR1cm4gRV9QT0lOVEVSOwoKICAgIG1lbXNldChwbWVkaWEsIDAsIHNpemVvZihETU9fTUVESUFfVFlQRSkpOwoKICAgIGlmIChjYkZvcm1hdCA+IDApCiAgICB7CiAgICAgICAgcG1lZGlhLT5wYkZvcm1hdCA9IENvVGFza01lbUFsbG9jKGNiRm9ybWF0KTsKICAgICAgICBpZiAoIXBtZWRpYS0+cGJGb3JtYXQpCiAgICAgICAgICAgIHJldHVybiBFX09VVE9GTUVNT1JZOwoKICAgICAgICBwbWVkaWEtPmNiRm9ybWF0ID0gY2JGb3JtYXQ7CiAgICB9CgogICAgcmV0dXJuIFNfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgTW9EZWxldGVNZWRpYVR5cGUgICAgKE1TRE1PLkApCiAqCiAqIERlbGV0ZSBhIG1lZGlhIHR5cGUgc3RydWN0dXJlCiAqLwpIUkVTVUxUIFdJTkFQSSBNb0RlbGV0ZU1lZGlhVHlwZShETU9fTUVESUFfVFlQRSogcG1lZGlhKQp7CiAgICBUUkFDRSgiJXBcbiIsIHBtZWRpYSk7CgogICAgaWYgKCFwbWVkaWEpCiAgICAgICAgcmV0dXJuIEVfUE9JTlRFUjsKCiAgICBNb0ZyZWVNZWRpYVR5cGUocG1lZGlhKTsKICAgIENvVGFza01lbUZyZWUocG1lZGlhKTsKCiAgICByZXR1cm4gU19PSzsKfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqICAgICAgICBNb0ZyZWVNZWRpYVR5cGUgICAgICAgIChNU0RNTy5AKQogKgogKiBGcmVlIGFsbG9jYXRlZCBtZW1iZXJzIG9mIGEgbWVkaWEgdHlwZSBzdHJ1Y3R1cmUKICovCkhSRVNVTFQgV0lOQVBJIE1vRnJlZU1lZGlhVHlwZShETU9fTUVESUFfVFlQRSogcG1lZGlhKQp7CiAgICBUUkFDRSgiJXBcbiIsIHBtZWRpYSk7CgogICAgaWYgKCFwbWVkaWEpCiAgICAgICAgcmV0dXJuIEVfUE9JTlRFUjsKCiAgICBpZiAocG1lZGlhLT5wVW5rKQogICAgewogICAgICAgIElVbmtub3duX1JlbGVhc2UocG1lZGlhLT5wVW5rKTsKICAgICAgICBwbWVkaWEtPnBVbmsgPSBOVUxMOwogICAgfQoKICAgIGlmIChwbWVkaWEtPnBiRm9ybWF0KQogICAgewogICAgICAgIENvVGFza01lbUZyZWUocG1lZGlhLT5wYkZvcm1hdCk7CiAgICAgICAgcG1lZGlhLT5wYkZvcm1hdCA9IE5VTEw7CiAgICB9CgogICAgcmV0dXJuIFNfT0s7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgTW9EdXBsaWNhdGVNZWRpYVR5cGUgICAgKE1TRE1PLkApCiAqCiAqIER1cGxpY2F0ZXMgYSBtZWRpYSB0eXBlIHN0cnVjdHVyZQogKi8KSFJFU1VMVCBXSU5BUEkgTW9EdXBsaWNhdGVNZWRpYVR5cGUoRE1PX01FRElBX1RZUEUqKiBwcGRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRE1PX01FRElBX1RZUEUqIHBzcmMpCnsKICAgIEhSRVNVTFQgcjsKCiAgICBUUkFDRSgiJXAgJXBcbiIsIHBwZHN0LCBwc3JjKTsKCiAgICBpZiAoIXBwZHN0IHx8ICFwc3JjKQogICAgICAgIHJldHVybiBFX1BPSU5URVI7CgogICAgKnBwZHN0ID0gQ29UYXNrTWVtQWxsb2Moc2l6ZW9mKERNT19NRURJQV9UWVBFKSk7CiAgICBpZiAoISpwcGRzdCkKICAgICAgICByZXR1cm4gRV9PVVRPRk1FTU9SWTsKCiAgICByID0gTW9Db3B5TWVkaWFUeXBlKCpwcGRzdCwgcHNyYyk7CiAgICBpZiAoRkFJTEVEKHIpKQogICAgewogICAgICAgIE1vRnJlZU1lZGlhVHlwZSgqcHBkc3QpOwogICAgICAgICpwcGRzdCA9IE5VTEw7CiAgICB9CgogICAgcmV0dXJuIHI7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKiAgICAgICAgTW9Db3B5TWVkaWFUeXBlICAgICAgICAoTVNETU8uQCkKICoKICogQ29weSBhIG5ldyBtZWRpYSB0eXBlIHN0cnVjdHVyZQogKi8KSFJFU1VMVCBXSU5BUEkgTW9Db3B5TWVkaWFUeXBlKERNT19NRURJQV9UWVBFKiBwZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRE1PX01FRElBX1RZUEUqIHBzcmMpCnsKICAgIFRSQUNFKCIlcCAlcFxuIiwgcGRzdCwgcHNyYyk7CgogICAgaWYgKCFwZHN0IHx8ICFwc3JjKQogICAgICAgIHJldHVybiBFX1BPSU5URVI7CgogICAgbWVtY3B5KCZwZHN0LT5tYWpvcnR5cGUsICAmcHNyYy0+bWFqb3J0eXBlLCAgc2l6ZW9mKHBzcmMtPm1ham9ydHlwZSkpOwogICAgbWVtY3B5KCZwZHN0LT5zdWJ0eXBlLCAgICAmcHNyYy0+c3VidHlwZSwgICAgc2l6ZW9mKHBzcmMtPnN1YnR5cGUpKTsKICAgIG1lbWNweSgmcGRzdC0+Zm9ybWF0dHlwZSwgJnBzcmMtPmZvcm1hdHR5cGUsIHNpemVvZihwc3JjLT5mb3JtYXR0eXBlKSk7CgogICAgcGRzdC0+YkZpeGVkU2l6ZVNhbXBsZXMgICAgPSBwc3JjLT5iRml4ZWRTaXplU2FtcGxlczsKICAgIHBkc3QtPmJUZW1wb3JhbENvbXByZXNzaW9uID0gcHNyYy0+YlRlbXBvcmFsQ29tcHJlc3Npb247CiAgICBwZHN0LT5sU2FtcGxlU2l6ZSAgICAgICAgICA9IHBzcmMtPmxTYW1wbGVTaXplOwogICAgcGRzdC0+Y2JGb3JtYXQgICAgICAgICAgICAgPSBwc3JjLT5jYkZvcm1hdDsKCiAgICBpZiAocHNyYy0+cGJGb3JtYXQgJiYgcHNyYy0+Y2JGb3JtYXQgPiAwKQogICAgewogICAgICAgIHBkc3QtPnBiRm9ybWF0ID0gQ29UYXNrTWVtQWxsb2MocHNyYy0+Y2JGb3JtYXQpOwogICAgICAgIGlmICghcGRzdC0+cGJGb3JtYXQpCiAgICAgICAgICAgIHJldHVybiBFX09VVE9GTUVNT1JZOwoKICAgICAgICBtZW1jcHkocGRzdC0+cGJGb3JtYXQsIHBzcmMtPnBiRm9ybWF0LCBwc3JjLT5jYkZvcm1hdCk7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcGRzdC0+cGJGb3JtYXQgPSBOVUxMOwoKICAgIGlmIChwc3JjLT5wVW5rKQogICAgewogICAgICAgIHBkc3QtPnBVbmsgPSBwc3JjLT5wVW5rOwogICAgICAgIElVbmtub3duX0FkZFJlZihwZHN0LT5wVW5rKTsKICAgIH0KICAgIGVsc2UKICAgICAgICBwZHN0LT5wVW5rID0gTlVMTDsKCiAgICByZXR1cm4gU19PSzsKfQo=