From: Eric J. <ea...@ri...> - 2000-04-19 02:04:51
|
I have a patch for PySDL 0.0.3 to allow any Python file-like object to be loaded or saved as an image. It also allows strings to be loaded as data. This could be useful for games and other programs that might not want to store all of their images in individual files. So an image could be loaded any of these ways: i = sdl.image_load("test.jpg") i = sdl.image_load(open("test.jpg")) i = sdl.image_load(open("test.jpg").read(), 1) i = sdl.image_load(StringIO(open("test.jpg").read())) The extra parameter is used to inhibit PySDL from interpreting the string as a filename. The functions that can work that way are: image_load, image_is, image_load_type, and image_save_bmp. It should be pretty easy to add support to any function that uses SDL_RWops. It works with MetaKit and Mk4py, in two ways: taking the field straight out as a string, and using the supplied MkMemoIO.py wrapper class as a file-like object. bugs/issues: Saving to a string works, although it's not supposed to (since strings are immutable.) Use StringIO or cStringIO instead. Exceptions are propagated, however the tracebacks are sometimes a bit confusing because the actual callback from C isn't traced. (When using native Python objects.) It's assumed that upon receiving an I/O error, SDL will clean itself up and return an error, and not try to recover or continue. sure there's other things... And I hope someone's reading this list, because I didn't see any messages in the archives... ;)--spruceEVOHCFYNQPCNSDURERGN Content-Type: application/octet-stream; name="sdl.diff" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="sdl.diff" KioqIG9yaWcvc2RsbW9kdWxlLmMJVHVlIEFwciAxOCAxNzo1Njo0MiAyMDAwCi0tLSBzZGxtb2R1 bGUuYwlUdWUgQXByIDE4IDIwOjUxOjQxIDIwMDAKKioqKioqKioqKioqKioqCioqKiAyMywyOCAq KioqCi0tLSAyMywxNjggLS0tLQogICNkZWZpbmUgbWF4KHgseSkgeCA+IHkgPyB4IDogeQogICNl bmRpZgogIAorIHN0cnVjdCBQeXRob25fU0RMX1JXb3BzIHsKKyAJU0RMX1JXb3BzIGJhc2U7Cisg CVB5T2JqZWN0ICpvYmo7CisgCVB5T2JqZWN0ICpzZWVrX21ldGhvZDsKKyAJUHlPYmplY3QgKnRl bGxfbWV0aG9kOworIAlQeU9iamVjdCAqcmVhZF9tZXRob2Q7CisgCVB5T2JqZWN0ICp3cml0ZV9t ZXRob2Q7CisgCVB5T2JqZWN0ICpjbG9zZV9tZXRob2Q7CisgCWludCBlcnJfc2V0OworIH07Cisg Cisgc3RhdGljIGludCByd29wc19weXNlZWsoU0RMX1JXb3BzICpjb250ZXh0LCBpbnQgb2Zmc2V0 LCBpbnQgd2hlbmNlKSB7CisgCXN0cnVjdCBQeXRob25fU0RMX1JXb3BzICpydyA9IChzdHJ1Y3Qg UHl0aG9uX1NETF9SV29wcyAqKSBjb250ZXh0OworIAlQeU9iamVjdCAqcmVzdWx0OworIAlpbnQg cmV0dmFsOworIAkKKyAJaWYgKHJ3LT5lcnJfc2V0KSByZXR1cm4gLTE7CisgCWlmICghcnctPnNl ZWtfbWV0aG9kKSB7CisgCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZmlsZSBv YmplY3QgY2Fubm90IHNlZWsiKTsKKyAJCXJ3LT5lcnJfc2V0ID0gMTsKKyAJCXJldHVybiAtMTsK KyAJfQorIAlpZiAoIXJ3LT50ZWxsX21ldGhvZCkgeworIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhj X1R5cGVFcnJvciwgImZpbGUgb2JqZWN0IGNhbm5vdCB0ZWxsIik7CisgCQlydy0+ZXJyX3NldCA9 IDE7CisgCQlyZXR1cm4gLTE7CisgCX0KKyAJCisgCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5j dGlvbihydy0+c2Vla19tZXRob2QsICJpaSIsIG9mZnNldCwgd2hlbmNlKTsKKyAJaWYgKCFyZXN1 bHQpIHsKKyAJCXJ3LT5lcnJfc2V0ID0gMTsKKyAJCXJldHVybiAtMTsKKyAJfQorIAlQeV9ERUNS RUYocmVzdWx0KTsKKyAJcmVzdWx0ID0gUHlPYmplY3RfQ2FsbE9iamVjdChydy0+dGVsbF9tZXRo b2QsIFB5VHVwbGVfTmV3KDApKTsKKyAJaWYgKCFyZXN1bHQpIHsKKyAJCXJ3LT5lcnJfc2V0ID0g MTsKKyAJCXJldHVybiAtMTsKKyAJfQorIAlyZXR2YWwgPSBQeUludF9Bc0xvbmcocmVzdWx0KTsK KyAJUHlfREVDUkVGKHJlc3VsdCk7CisgCXJldHVybiByZXR2YWw7CisgfQorIAorIHN0YXRpYyBp bnQgcndvcHNfcHlyZWFkKFNETF9SV29wcyAqY29udGV4dCwgdm9pZCAqcHRyLCBpbnQgc2l6ZSwg aW50IG1heG51bSkgeworIAlzdHJ1Y3QgUHl0aG9uX1NETF9SV29wcyAqcncgPSAoc3RydWN0IFB5 dGhvbl9TRExfUldvcHMgKikgY29udGV4dDsKKyAJUHlPYmplY3QgKnJlc3VsdDsKKyAJaW50IHJl dHZhbDsKKyAJCisgCWlmIChydy0+ZXJyX3NldCkgcmV0dXJuIC0xOworIAlpZiAoIXJ3LT5yZWFk X21ldGhvZCkgeworIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZpbGUgb2Jq ZWN0IGNhbm5vdCByZWFkIik7CisgCQlydy0+ZXJyX3NldCA9IDE7CisgCQlyZXR1cm4gLTE7Cisg CX0KKyAJCisgCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxGdW5jdGlvbihydy0+cmVhZF9tZXRob2Qs ICJpIiwgc2l6ZSAqIG1heG51bSk7CisgCWlmICghcmVzdWx0KSB7CisgCQlydy0+ZXJyX3NldCA9 IDE7CisgCQlyZXR1cm4gLTE7CisgCX0KKyAJcmV0dmFsID0gUHlTdHJpbmdfU2l6ZShyZXN1bHQp IC8gc2l6ZTsKKyAJbWVtY3B5KHB0ciwgUHlTdHJpbmdfQXNTdHJpbmcocmVzdWx0KSwgcmV0dmFs ICogc2l6ZSk7CisgCVB5X0RFQ1JFRihyZXN1bHQpOworIAlyZXR1cm4gcmV0dmFsOworIH0KKyAK KyBzdGF0aWMgaW50IHJ3b3BzX3B5d3JpdGUoU0RMX1JXb3BzICpjb250ZXh0LCBjb25zdCB2b2lk ICpwdHIsIGludCBzaXplLCBpbnQgbWF4bnVtKSB7CisgCXN0cnVjdCBQeXRob25fU0RMX1JXb3Bz ICpydyA9IChzdHJ1Y3QgUHl0aG9uX1NETF9SV29wcyAqKSBjb250ZXh0OworIAlQeU9iamVjdCAq cmVzdWx0OworIAkKKyAJaWYgKHJ3LT5lcnJfc2V0KSByZXR1cm4gLTE7CisgCWlmICghcnctPndy aXRlX21ldGhvZCkgeworIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZpbGUg b2JqZWN0IGNhbm5vdCB3cml0ZSIpOworIAkJcnctPmVycl9zZXQgPSAxOworIAkJcmV0dXJuIC0x OworIAl9CisgCQorIAlyZXN1bHQgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24ocnctPndyaXRlX21l dGhvZCwgInMjIiwgCisgCSAgICBwdHIsIHNpemUgKiBtYXhudW0pOworIAlpZiAoIXJlc3VsdCkg eworIAkJcnctPmVycl9zZXQgPSAxOworIAkJcmV0dXJuIC0xOworIAl9CisgCVB5X0RFQ1JFRihy ZXN1bHQpOworIAlyZXR1cm4gbWF4bnVtOworIH0KKyAKKyBzdGF0aWMgaW50IHJ3b3BzX3B5Y2xv c2UoU0RMX1JXb3BzICpjb250ZXh0KSB7CisgCXN0cnVjdCBQeXRob25fU0RMX1JXb3BzICpydyA9 IChzdHJ1Y3QgUHl0aG9uX1NETF9SV29wcyAqKSBjb250ZXh0OworIAlQeU9iamVjdCAqcmVzdWx0 OworIAkKKyAJaWYgKHJ3LT5lcnJfc2V0KSByZXR1cm4gLTE7CisgCWlmICghcnctPmNsb3NlX21l dGhvZCkgeworIAkJcmV0dXJuIDA7CisgCX0KKyAJCisgCXJlc3VsdCA9IFB5T2JqZWN0X0NhbGxP YmplY3QocnctPmNsb3NlX21ldGhvZCwgUHlUdXBsZV9OZXcoMCkpOworIAlpZiAoIXJlc3VsdCkg eworIAkJcnctPmVycl9zZXQgPSAxOworIAkJcmV0dXJuIC0xOworIAl9CisgCVB5X0RFQ1JFRihy ZXN1bHQpOworIAlyZXR1cm4gMDsKKyB9CisgCisgc3RhdGljIFNETF9SV29wcyAqcndvcHNfcHl0 aG9uKFB5T2JqZWN0ICpvKSB7CisgCXN0cnVjdCBQeXRob25fU0RMX1JXb3BzICpydzsKKyAJaWYo UHlGaWxlX0NoZWNrKG8pKSB7CisgCQlyZXR1cm4gU0RMX1JXRnJvbUZQKFB5RmlsZV9Bc0ZpbGUo byksIDApOworIAl9CisgCWlmKFB5U3RyaW5nX0NoZWNrKG8pKSB7CisgCQlyZXR1cm4gU0RMX1JX RnJvbU1lbShQeVN0cmluZ19Bc1N0cmluZyhvKSwgUHlTdHJpbmdfU2l6ZShvKSk7CisgCX0KKyAK KyAJcncgPSBtYWxsb2Moc2l6ZW9mKHN0cnVjdCBQeXRob25fU0RMX1JXb3BzKSk7CisgCXJ3LT5v YmogPSBvOworIAlydy0+c2Vla19tZXRob2QgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG8sICJz ZWVrIik7CisgCXJ3LT50ZWxsX21ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgInRl bGwiKTsKKyAJcnctPnJlYWRfbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvLCAicmVh ZCIpOworIAlydy0+d3JpdGVfbWV0aG9kID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhvLCAid3Jp dGUiKTsKKyAJcnctPmNsb3NlX21ldGhvZCA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobywgImNs b3NlIik7CisgCXJ3LT5lcnJfc2V0ID0gMDsKKyAJcnctPmJhc2Uuc2VlayA9ICZyd29wc19weXNl ZWs7CisgCXJ3LT5iYXNlLnJlYWQgPSAmcndvcHNfcHlyZWFkOworIAlydy0+YmFzZS53cml0ZSA9 ICZyd29wc19weXdyaXRlOworIAlydy0+YmFzZS5jbG9zZSA9ICZyd29wc19weWNsb3NlOworIAor IAlpZiAoIXJ3LT5yZWFkX21ldGhvZCAmJiAhcnctPndyaXRlX21ldGhvZCkgeworIAkJZnJlZShy dyk7CisgCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAKKyAJCSAgICAiZmlsZSBv YmplY3RzIG11c3QgYmUgYWJsZSB0byBlaXRoZXIgcmVhZCBvciB3cml0ZSIpOworIAkJcmV0dXJu IDA7CisgCX0KKyAJUHlFcnJfQ2xlYXIoKTsKKyAJCisgCXJldHVybiAoU0RMX1JXb3BzICopIHJ3 OworIH0KKyAKKyAKICB2b2lkIGluaXRzZGwoKQogIHsKICAJUHlPYmplY3QqIG1vZHVsZTsKKioq KioqKioqKioqKioqCioqKiA3MTUsNzQ2ICoqKioKICAJUHlPYmplY3QqIHN1cmZhY2VfcmVmOwog IAlTRExfUldvcHMqIHNfb3BzX3JlZjsKICAJY2hhciogZmlsZTsKICAKISAJaWYoIVB5QXJnX1Bh cnNlVHVwbGUoYXJncywgIk8iLCAmYXJnX3JlZikpCiAgCQlyZXR1cm4gTlVMTDsKICAKISAJLyog V2UgbmVlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgRmlsZSBvYmpl Y3QsIG9yIGEKISAJICogZmlsZW5hbWUuIElmIGl0J3MgbmVpdGhlciwgdGhlbiB3ZSB0aHJvdyBh IFR5cGVFcnJvci4KISAJKi8KISAJCQohIAlpZihQeUZpbGVfQ2hlY2soYXJnX3JlZikpCiEgCXsK ISAJCXNfb3BzX3JlZiA9IFNETF9SV0Zyb21GUChQeUZpbGVfQXNGaWxlKGFyZ19yZWYpLCAwKTsK ISAJCXN1cmZhY2VfcmVmID0gc2RsX3N1cmZhY2VfTkVXKElNR19Mb2FkX1JXKHNfb3BzX3JlZiwg MCkpOwohIAohIAkJUHlfRnJlZShzX29wc19yZWYpOwohIAohIAkJcmV0dXJuIHN1cmZhY2VfcmVm OyAKISAJfQohIAkKISAJaWYoUHlTdHJpbmdfQ2hlY2soYXJnX3JlZikpCiAgCXsKICAJCWZpbGUg PSBQeVN0cmluZ19Bc1N0cmluZyhhcmdfcmVmKTsKICAJCXJldHVybiBzZGxfc3VyZmFjZV9ORVco SU1HX0xvYWQoZmlsZSkpOwogIAl9CiAgCiEgCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJy b3IsICJ0YWtlcyBhIGZpbGUgb2JqZWN0IG9yIHN0cmluZyBhcmd1bWVudCIpOwohIAlyZXR1cm4g TlVMTDsKICB9CiAgCiAgc3RhdGljIFB5T2JqZWN0KiBzZGxfaW1hZ2VfaXMoUHlPYmplY3QqIHNl bGYsIFB5T2JqZWN0KiBhcmdzKQotLS0gODU1LDg4NSAtLS0tCiAgCVB5T2JqZWN0KiBzdXJmYWNl X3JlZjsKICAJU0RMX1JXb3BzKiBzX29wc19yZWY7CiAgCWNoYXIqIGZpbGU7CisgCWludCBub3Rf ZmlsZW5hbWUgPSAwOwogIAohIAlpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT3xpIiwgJmFy Z19yZWYsICZub3RfZmlsZW5hbWUpKQogIAkJcmV0dXJuIE5VTEw7CiAgCiEgCVB5X0lOQ1JFRihh cmdfcmVmKTsKISAJaWYoIW5vdF9maWxlbmFtZSAmJiBQeVN0cmluZ19DaGVjayhhcmdfcmVmKSkK ICAJewogIAkJZmlsZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGFyZ19yZWYpOworIAkJUHlfREVDUkVG KGFyZ19yZWYpOwogIAkJcmV0dXJuIHNkbF9zdXJmYWNlX05FVyhJTUdfTG9hZChmaWxlKSk7CiAg CX0KKyAJCisgCXNfb3BzX3JlZiA9IHJ3b3BzX3B5dGhvbihhcmdfcmVmKTsKKyAJaWYgKCFzX29w c19yZWYpIHsKKyAJCVB5X0RFQ1JFRihhcmdfcmVmKTsKKyAJCXJldHVybiAwOworIAl9CisgCQor IAlzdXJmYWNlX3JlZiA9IHNkbF9zdXJmYWNlX05FVyhJTUdfTG9hZF9SVyhzX29wc19yZWYsIDAp KTsKICAKISAJZnJlZShzX29wc19yZWYpOwohIAlQeV9ERUNSRUYoYXJnX3JlZik7CiEgCQohIAly ZXR1cm4gc3VyZmFjZV9yZWY7CiAgfQogIAogIHN0YXRpYyBQeU9iamVjdCogc2RsX2ltYWdlX2lz KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncykKKioqKioqKioqKioqKioqCioqKiA3NDks NzczICoqKioKICAJUHlPYmplY3QqIHN1cmZhY2VfcmVmOwogIAlTRExfUldvcHMqIHNfb3BzX3Jl ZjsKICAJaW50IHR5cGUsIHN0YXR1czsKICAJCiEgCWlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3Ms ICJPaSIsICZhcmdfcmVmLCAmdHlwZSkpCiAgCQlyZXR1cm4gTlVMTDsKISAKISAJaWYoUHlTdHJp bmdfQ2hlY2soYXJnX3JlZikpCiAgCQlzX29wc19yZWYgPSBTRExfUldGcm9tRmlsZShQeVN0cmlu Z19Bc1N0cmluZyhhcmdfcmVmKSwgInJiIik7CiEgCWVsc2UKISAJaWYoUHlGaWxlX0NoZWNrKGFy Z19yZWYpKQohIAkJc19vcHNfcmVmID0gU0RMX1JXRnJvbUZQKFB5RmlsZV9Bc0ZpbGUoYXJnX3Jl ZiksIDApOwohIAllbHNlCiEgCXsKISAJCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3Is IAohIAkJCSJ0YWtlcyBhIGZpbGUgb2JqZWN0IG9yIHN0cmluZyBhcmd1bWVudCIpOwohIAkJcmV0 dXJuIE5VTEw7CiAgCX0KICAKICAJaWYoIXNfb3BzX3JlZikKICAJewohIAkJUHlFcnJfU2V0U3Ry aW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInVuYWJsZSB0byBhY3F1aXJlIGZpbGUgaW5mbyIpOwog IAkJcmV0dXJuIE5VTEw7CiAgCX0KICAKLS0tIDg4OCw5MTEgLS0tLQogIAlQeU9iamVjdCogc3Vy ZmFjZV9yZWY7CiAgCVNETF9SV29wcyogc19vcHNfcmVmOwogIAlpbnQgdHlwZSwgc3RhdHVzOwor IAlpbnQgbm90X2ZpbGVuYW1lID0gMDsKICAJCiEgCWlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3Ms ICJPaXxpIiwgJmFyZ19yZWYsICZ0eXBlLCAmbm90X2ZpbGVuYW1lKSkKICAJCXJldHVybiBOVUxM OwohIAkJCiEgCVB5X0lOQ1JFRihhcmdfcmVmKTsKISAJaWYoIW5vdF9maWxlbmFtZSAmJiBQeVN0 cmluZ19DaGVjayhhcmdfcmVmKSkKICAJCXNfb3BzX3JlZiA9IFNETF9SV0Zyb21GaWxlKFB5U3Ry aW5nX0FzU3RyaW5nKGFyZ19yZWYpLCAicmIiKTsKISAJZWxzZSB7CiEgCQlzX29wc19yZWYgPSBy d29wc19weXRob24oYXJnX3JlZik7CiAgCX0KICAKICAJaWYoIXNfb3BzX3JlZikKICAJewohIAkJ aWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CiEgCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRp bWVFcnJvciwgInVuYWJsZSB0byBhY3F1aXJlIGZpbGUgaW5mbyIpOwohIAkJfQohIAkJUHlfREVD UkVGKGFyZ19yZWYpOwogIAkJcmV0dXJuIE5VTEw7CiAgCX0KICAKKioqKioqKioqKioqKioqCioq KiA4MDcsODEyICoqKioKLS0tIDk0NSw5NTEgLS0tLQogIAl9CiAgCiAgCVB5X0ZyZWUoc19vcHNf cmVmKTsKKyAJUHlfREVDUkVGKGFyZ19yZWYpOwogIAlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIs IHN0YXR1cyk7CiAgfQogIAoqKioqKioqKioqKioqKioKKioqIDgxNyw4NDEgKioqKgogIAlTRExf UldvcHMqIHNfb3BzX3JlZjsKICAJaW50IHR5cGU7CiAgCVNETF9TdXJmYWNlKiBzX3N1cmZhY2Vf cmVmOwogIAohIAlpZighUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAiT2kiLCAmYXJnX3JlZiwgJnR5 cGUpKQogIAkJcmV0dXJuIE5VTEw7CiAgCiEgCWlmKFB5U3RyaW5nX0NoZWNrKGFyZ19yZWYpKQog IAkJc19vcHNfcmVmID0gU0RMX1JXRnJvbUZpbGUoUHlTdHJpbmdfQXNTdHJpbmcoYXJnX3JlZiks ICJyYiIpOwohIAllbHNlCiEgCWlmKFB5RmlsZV9DaGVjayhhcmdfcmVmKSkKISAJCXNfb3BzX3Jl ZiA9IFNETF9SV0Zyb21GUChQeUZpbGVfQXNGaWxlKGFyZ19yZWYpLCAwKTsKISAJZWxzZQohIAl7 CiEgCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLAohIAkJCSJ0YWtlcyBhIGZpbGUg b2JqZWN0IG9yIHN0cmluZyBhcmd1bWVudCIpOwohIAkJcmV0dXJuIE5VTEw7CiAgCX0KICAKICAJ aWYoIXNfb3BzX3JlZikKICAJewogIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJv ciwgInVuYWJsZSB0byBhY3F1aXJlIGZpbGUgaW5mbyIpOwogIAkJcmV0dXJuIE5VTEw7CiAgCX0K ICAKLS0tIDk1Niw5NzcgLS0tLQogIAlTRExfUldvcHMqIHNfb3BzX3JlZjsKICAJaW50IHR5cGU7 CiAgCVNETF9TdXJmYWNlKiBzX3N1cmZhY2VfcmVmOworIAlpbnQgbm90X2ZpbGVuYW1lID0gMDsK ICAKISAJaWYoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk9pfGkiLCAmYXJnX3JlZiwgJnR5cGUs ICZub3RfZmlsZW5hbWUpKQogIAkJcmV0dXJuIE5VTEw7CiAgCiEgCVB5X0lOQ1JFRihhcmdfcmVm KTsKISAJaWYoIW5vdF9maWxlbmFtZSAmJiBQeVN0cmluZ19DaGVjayhhcmdfcmVmKSkKICAJCXNf b3BzX3JlZiA9IFNETF9SV0Zyb21GaWxlKFB5U3RyaW5nX0FzU3RyaW5nKGFyZ19yZWYpLCAicmIi KTsKISAJZWxzZSB7CiEgCQlzX29wc19yZWYgPSByd29wc19weXRob24oYXJnX3JlZik7CiAgCX0K ICAKICAJaWYoIXNfb3BzX3JlZikKICAJewogIAkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRp bWVFcnJvciwgInVuYWJsZSB0byBhY3F1aXJlIGZpbGUgaW5mbyIpOworIAkJUHlfREVDUkVGKGFy Z19yZWYpOwogIAkJcmV0dXJuIE5VTEw7CiAgCX0KICAKKioqKioqKioqKioqKioqCioqKiA4NjYs ODc1ICoqKioKLS0tIDEwMDIsMTAxMyAtLS0tCiAgCQkJYnJlYWs7CiAgCQlkZWZhdWx0OgogIAkJ CS8qIHNkbF9zdXJmYWNlX05FVyB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIGl0cyBhcmd1bWVudCBp cyBOVUxMICovCisgCQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJpbGxlZ2Fs IGltYWdlIHR5cGUiKTsKICAJCQlzX3N1cmZhY2VfcmVmID0gTlVMTDsKICAJfQkJCQkJCQkJCQkJ CQkJIAogIAogIAlQeV9GcmVlKHNfb3BzX3JlZik7CisgCVB5X0RFQ1JFRihhcmdfcmVmKTsKICAJ cmV0dXJuIHNkbF9zdXJmYWNlX05FVyhzX3N1cmZhY2VfcmVmKTsKICB9CiAgCioqKioqKioqKioq KioqKgoqKiogODkxLDg5NyAqKioqCiAgCiAgCWlmKCFzdXJmKQogIAl7CiEgCQlQeUVycl9TZXRT dHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAidW5hYmxlIHRvIGFsbG9jYXRlIFNETCBzdXJmYWNl Iik7CiAgCQlyZXR1cm4gTlVMTDsKICAJfQogIAkJCi0tLSAxMDI5LDEwMzcgLS0tLQogIAogIAlp Zighc3VyZikKICAJewohIAkJaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7CiEgCQkJUHlFcnJfU2V0 U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgInVuYWJsZSB0byBhbGxvY2F0ZSBTREwgc3VyZmFj ZSIpOwohIAkJfQogIAkJcmV0dXJuIE5VTEw7CiAgCX0KICAJCQoqKioqKioqKioqKioqKioKKioq IDIwMjcsMjA1NiAqKioqCiAgCVNETF9SV29wcyogc19vcHNfcmVmOwogIAlpbnQgc3RhdHVzOwog IAljaGFyKiBmaWxlOwogIAkKISAJaWYoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk8iLCAmYXJn X3JlZikpCiAgCQlyZXR1cm4gTlVMTDsKICAKISAJaWYoUHlGaWxlX0NoZWNrKGFyZ19yZWYpKQoh IAl7CiEgCQlzX29wc19yZWYgPSBTRExfUldGcm9tRlAoUHlGaWxlX0FzRmlsZShhcmdfcmVmKSwg MCk7CiEgCQlzdGF0dXMgPSBTRExfU2F2ZUJNUF9SVyhzdXJmYWNlX3JlZi0+c3VyZiwgc19vcHNf cmVmLCAwKTsKISAKISAJCVB5X0ZyZWUoc19vcHNfcmVmKTsKISAJCXJldHVybiBQeV9CdWlsZFZh bHVlKCJpIiwgc3RhdHVzKTsKISAJfQohIAohIAlpZihQeVN0cmluZ19DaGVjayhhcmdfcmVmKSkK ICAJewogIAkJZmlsZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGFyZ19yZWYpOwogIAkJc3RhdHVzID0g U0RMX1NhdmVCTVAoc3VyZmFjZV9yZWYtPnN1cmYsIGZpbGUpOwogIAogIAkJUHlfRnJlZShzX29w c19yZWYpOwogIAkJcmV0dXJuIFB5X0J1aWxkVmFsdWUoImkiLCBzdGF0dXMpOwogIAl9CiAgCiEg CVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJ0YWtlcyBhIGZpbGUgb2JqZWN0IG9y IHN0cmluZyBhcmd1bWVudCIpOwohIAlyZXR1cm4gTlVMTDsgIAogIH0KICAKICAvKiBBdWRpbyBy ZWxhdGVkIGNvZGUgKi8KLS0tIDIxNjcsMjIwMyAtLS0tCiAgCVNETF9SV29wcyogc19vcHNfcmVm OwogIAlpbnQgc3RhdHVzOwogIAljaGFyKiBmaWxlOworIAlpbnQgbm90X2ZpbGVuYW1lID0gMDsK ICAJCiEgCWlmKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJPfGkiLCAmYXJnX3JlZiwgJm5vdF9m aWxlbmFtZSkpCiAgCQlyZXR1cm4gTlVMTDsKICAKISAJUHlfSU5DUkVGKGFyZ19yZWYpOwohIAlp Zighbm90X2ZpbGVuYW1lICYmIFB5U3RyaW5nX0NoZWNrKGFyZ19yZWYpKQogIAl7CiAgCQlmaWxl ID0gUHlTdHJpbmdfQXNTdHJpbmcoYXJnX3JlZik7CiAgCQlzdGF0dXMgPSBTRExfU2F2ZUJNUChz dXJmYWNlX3JlZi0+c3VyZiwgZmlsZSk7CiAgCisgCQlQeV9ERUNSRUYoYXJnX3JlZik7CiAgCQlQ eV9GcmVlKHNfb3BzX3JlZik7CiAgCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaSIsIHN0YXR1cyk7 CiAgCX0KICAKISAJc19vcHNfcmVmID0gcndvcHNfcHl0aG9uKGFyZ19yZWYpOwohIAlpZiAoIXNf b3BzX3JlZikgewohIAkJUHlfREVDUkVGKGFyZ19yZWYpOwohIAkJcmV0dXJuIDA7CiEgCX0KISAJ CiEgCXN0YXR1cyA9IFNETF9TYXZlQk1QX1JXKHN1cmZhY2VfcmVmLT5zdXJmLCBzX29wc19yZWYs IDApOwohIAkKISAJZnJlZShzX29wc19yZWYpOwohIAlQeV9ERUNSRUYoYXJnX3JlZik7CiEgCWlm ICghUHlFcnJfT2NjdXJyZWQoKSkgewohIAkJcmV0dXJuIFB5SW50X0Zyb21Mb25nKHN0YXR1cyk7 CiEgCX0gZWxzZSB7CiEgCQlyZXR1cm4gMDsKISAJfQogIH0KICAKICAvKiBBdWRpbyByZWxhdGVk IGNvZGUgKi8KKioqIG9yaWcvc2RsbW9kdWxlLmgJVHVlIEFwciAxOCAxOTozMzo1NSAyMDAwCi0t LSBzZGxtb2R1bGUuaAlUdWUgQXByIDE4IDIwOjUxOjQwIDIwMDAKKioqKioqKioqKioqKioqCioq KiAxODAsMTkzICoqKioKICAKICBzdGF0aWMgUHlPYmplY3QqIHNkbF9pbWFnZV9sb2FkKFB5T2Jq ZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncyk7CiAgc3RhdGljIGNoYXIgc2RsX2ltYWdlX2xvYWRf X2RvY19fW10gPQohIAkiaW1hZ2VfbG9hZChmaWxlIG9yIGZpbGVfb2JqZWN0KSAtPiBTdXJmYWNl XG4iCiAgCSJUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBTdXJmYWNlIGZyb20gYW4gaW1hZ2Ugc3Rv cmVkIGluIGZpbGUuXG4iCiAgCSJPciBpZiBhIGZpbGUgb2JqZWN0IHdhcyBwYXNzZWQsIGluc3Rl YWQgb2YgYSBmaWxlIG5hbWUsIGEgU3VyZmFjZVxuIgohIAkiaXMgY3JlYXRlZCBmcm9tIGFuIGlt YWdlIHN0b3JlZCBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgZmlsZS4iOwogIAogIHN0 YXRpYyBQeU9iamVjdCogc2RsX2ltYWdlX2lzKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJn cyk7CiAgc3RhdGljIGNoYXIgc2RsX2ltYWdlX2lzX19kb2NfX1tdID0KISAJImltYWdlX2lzKGZp bGUgb3IgZmlsZV9vYmplY3QsIHR5cGUpIC0+IGludFxuIgogIAkiUmV0dXJucyAxIGlmIHRoZSBj b250ZW50IG9mIHRoZSBmaWxlIG9yIGZpbGUgb2JqZWN0J3MgbG9jYXRpb24gaXMgYW5cbiIKICAJ ImltYWdlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0LlxuIgogIAkiU3VwcG9ydGVkIGZvcm1hdHM6 XG4iCi0tLSAxODAsMTk1IC0tLS0KICAKICBzdGF0aWMgUHlPYmplY3QqIHNkbF9pbWFnZV9sb2Fk KFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncyk7CiAgc3RhdGljIGNoYXIgc2RsX2ltYWdl X2xvYWRfX2RvY19fW10gPQohIAkiaW1hZ2VfbG9hZChmaWxlIG9yIGZpbGVfb2JqZWN0IFssbm90 X2ZpbGVuYW1lXSkgLT4gU3VyZmFjZVxuIgogIAkiVGhpcyBmdW5jdGlvbiBjcmVhdGVzIGEgU3Vy ZmFjZSBmcm9tIGFuIGltYWdlIHN0b3JlZCBpbiBmaWxlLlxuIgogIAkiT3IgaWYgYSBmaWxlIG9i amVjdCB3YXMgcGFzc2VkLCBpbnN0ZWFkIG9mIGEgZmlsZSBuYW1lLCBhIFN1cmZhY2VcbiIKISAJ ImlzIGNyZWF0ZWQgZnJvbSBhbiBpbWFnZSBzdG9yZWQgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24g aW4gdGhlIGZpbGVcbiIKISAJIklmIHRoZSBvcHRpb25hbCBub3RfZmlsZW5hbWUgcGFyYW1ldGVy IGlzIHNldCB0byAxLCB0aGVuIGEgc3RyaW5nXG4iCiEgCSJ3aWxsIG5vdCBiZSBpbnRlcnByZXRl ZCBhcyBhIGZpbGVuYW1lLCBidXQgYXMgdGhlIGFjdHVhbCBpbWFnZSBkYXRhLiI7CiAgCiAgc3Rh dGljIFB5T2JqZWN0KiBzZGxfaW1hZ2VfaXMoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdz KTsKICBzdGF0aWMgY2hhciBzZGxfaW1hZ2VfaXNfX2RvY19fW10gPQohIAkiaW1hZ2VfaXMoZmls ZSBvciBmaWxlX29iamVjdCwgdHlwZSBbLG5vdF9maWxlbmFtZV0pIC0+IGludFxuIgogIAkiUmV0 dXJucyAxIGlmIHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIG9yIGZpbGUgb2JqZWN0J3MgbG9jYXRp b24gaXMgYW5cbiIKICAJImltYWdlIGluIHRoZSBzcGVjaWZpZWQgZm9ybWF0LlxuIgogIAkiU3Vw cG9ydGVkIGZvcm1hdHM6XG4iCioqKioqKioqKioqKioqKgoqKiogMjAxLDIwNyAqKioqCiAgCiAg c3RhdGljIFB5T2JqZWN0KiBzZGxfaW1hZ2VfbG9hZF90eXBlKFB5T2JqZWN0KiBzZWxmLCBQeU9i amVjdCogYXJncyk7CiAgc3RhdGljIGNoYXIgc2RsX2ltYWdlX2xvYWRfdHlwZV9fZG9jX19bXSA9 CiEgCSJpbWFnZV9sb2FkX3R5cGUoZmlsZSBvciBmaWxlIG9iamVjdCwgdHlwZSkgLT4gU3VyZmFj ZVxuIgogIAkiQWxsb3dzIHRoZSBsb2FkaW5nIG9mIGEgU3VyZmFjZSwgYnV0IHdpdGggYSBzcGVj aWZpYyBsb2FkZXIuIjsKICAKICBzdGF0aWMgUHlPYmplY3QqIHNkbF9pbWFnZV9pbnZlcnRfYWxw aGEoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKLS0tIDIwMywyMDkgLS0tLQogIAog IHN0YXRpYyBQeU9iamVjdCogc2RsX2ltYWdlX2xvYWRfdHlwZShQeU9iamVjdCogc2VsZiwgUHlP YmplY3QqIGFyZ3MpOwogIHN0YXRpYyBjaGFyIHNkbF9pbWFnZV9sb2FkX3R5cGVfX2RvY19fW10g PQohIAkiaW1hZ2VfbG9hZF90eXBlKGZpbGUgb3IgZmlsZSBvYmplY3QsIHR5cGUgWyxub3RfZmls ZW5hbWVdKSAtPiBTdXJmYWNlXG4iCiAgCSJBbGxvd3MgdGhlIGxvYWRpbmcgb2YgYSBTdXJmYWNl LCBidXQgd2l0aCBhIHNwZWNpZmljIGxvYWRlci4iOwogIAogIHN0YXRpYyBQeU9iamVjdCogc2Rs X2ltYWdlX2ludmVydF9hbHBoYShQeU9iamVjdCogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwoqKioq KioqKioqKioqKioKKioqIDM5Nyw0MDMgKioqKgogIAogIHN0YXRpYyBQeU9iamVjdCogc2RsX3N1 cmZhY2Vfc2F2ZV9ibXAoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKICBzdGF0aWMg Y2hhciBzZGxfc3VyZmFjZV9zYXZlX2JtcF9fZG9jX19bXSA9CiEgCSJzYXZlX2JtcChmaWxlIG9y IGZpbGUgb2JqZWN0KSAtPiBpbnRcbiIKICAJIlRoaXMgZnVuY3Rpb24gc2F2ZXMgdGhlIFN1cmZh Y2UgYXMgYSBCTVAgZmlsZS4iOwogIAogIC8qIHNvdW5kIHJlbGF0ZWQgcHJvdG90eXBlcyBhbmQg X19kb2NfXyBzdHJpbmdzICovCi0tLSAzOTksNDA1IC0tLS0KICAKICBzdGF0aWMgUHlPYmplY3Qq IHNkbF9zdXJmYWNlX3NhdmVfYm1wKFB5T2JqZWN0KiBzZWxmLCBQeU9iamVjdCogYXJncyk7CiAg c3RhdGljIGNoYXIgc2RsX3N1cmZhY2Vfc2F2ZV9ibXBfX2RvY19fW10gPQohIAkic2F2ZV9ibXAo ZmlsZSBvciBmaWxlIG9iamVjdCBbLG5vdF9maWxlbmFtZV0pIC0+IGludFxuIgogIAkiVGhpcyBm dW5jdGlvbiBzYXZlcyB0aGUgU3VyZmFjZSBhcyBhIEJNUCBmaWxlLiI7CiAgCiAgLyogc291bmQg cmVsYXRlZCBwcm90b3R5cGVzIGFuZCBfX2RvY19fIHN0cmluZ3MgKi8K |