Date: Wed, 11 Jul 2007 10:09:32 +0000 From: Pawel Wieczorek <wieczyk@trzask.int.pl> To: freebsd-arch@freebsd.org Subject: new friend of sys/queue.h and sys/tree.h Message-ID: <4694AC5C.9040107@trzask.int.pl> In-Reply-To: <20070710.205751.-1962670861.imp@bsdimp.com> References: <20070708081511.GX1221@funkthat.com> <200707101833.l6AIX0xl049962@ambrisko.com> <20070710.205751.-1962670861.imp@bsdimp.com>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------020003070002010103050303 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit Hi, I did something like sys/queue.h and sys/tree.h: sys/bds.h bds - Basic Data Structures. Hash table are basic data structure, it is good to have it in kernel, but i did not see some easy to use framework like sys/queue.h in our kernel. At current time it have only hash table and multi-value hash table, but i want to add in near future something else. I did not done full documentation how to use it(yet), but i did two examples. One is how to use it user-space and one how to use it in kernel-space. I tested code on "cc" on OpenSolaris (because cc on sunos is more pedantic) and "cc" "c++" "c89" "c99" on FreeBSD 6.2-RELEASE. I develop sys/bds.h for my private usage, but i think it can be used in freebsd kernel programming, because is safe, easy to use and similar to sys/queue.h. I am waiting for comments... --------------020003070002010103050303 Content-Type: application/octet-stream; name="bdsm.tar" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="bdsm.tar" YmRzbQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAA MDAxNzUxIAAwMDE3NTAgADAwMDAwMDAwMDAwIDEwNjQ1MTI0Mjc2IDAxMjU3NwAgNQAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdpZWN6 eWsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa29udGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL01ha2VmaWxlAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDE3NTEgADAwMTc1MCAAMDAwMDAwMDAxNzIg MTA2NDUxMjM3NDMgMDE0MzE3ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABr b250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFNV QkRJUj1leGFtcGxlMCBleGFtcGxlMQoKbG9hZDoKCWNkIGV4YW1wbGUxL2RldjsgbWFrZSBs b2FkCgoKY29weToKCWNwIGV4YW1wbGUxL3V0aWwvYmRzY3RsIC4KCgoKLmluY2x1ZGU8YnNk LnN1YmRpci5taz4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYmRzbS9tYW4AAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAxNzUxIAAwMDE3NTAgADAwMDAwMDAwMDAwIDEw NjQ0MTc3NzQyIDAxMzM1NwAgNQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAB1c3RhcgAwMHdpZWN6eWsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa29u dGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNt L3N5cwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDE3 NTEgADAwMTc1MCAAMDAwMDAwMDAwMDAgMTA2NDUxMjQ3MzMgMDEzNDEzACA1AAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrb250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA ADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAwMDAwMCAxMDY0 NTEyNDM0NCAwMTQzMDYAIDUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRh AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAYmRzbS9l eGFtcGxlMQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAxNzUx IAAwMDE3NTAgADAwMDAwMDAwMDAwIDEwNjQ1MDIyNTA3IDAxNDMwNQAgNQAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdpZWN6eWsAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAa29udGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAw MDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL1JFQURNRQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAMDAwNjQ0IAAwMDAwMDAgADAwMTc1MCAAMDAwMDAwMDEyMTMgMTA2NDUx MjQxNzYgMDEzMDEyACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAHVzdGFyADAwcm9vdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrb250YQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEV4YW1wbGUg dXNhZ2Ugb2Ygc3lzL2Jkcy5oCj09PT09PT09PT09PT09PT09PT09PT09PT09CgpUbyBjb21w aWxlIHR5cGU6CiMgbWFrZQoKCmV4YW1wbGUwLwkJU21hbGwgcHJvZ3JhbW0gd2hpY2ggYWxs b3cgdGVzdAoJCQlvbmUgc3RydWN0dXJlIHVzZWQgYnkgTUFQIGFuZCBNTUFQLgoJCQlBZnRl ciBjb21waWxhdGlvbiB5b3UgY2FuIGV4ZWN1dGUKCQkJZXhhbXBsZTAvZXhhbXBsZTAgYmlu YXJ5LgoKCmV4YW1wbGUxCQlTbWFsbCBrZXJuZWwgbW9kdWxlIGFuZCB1dGlsaXR5IHByb2dy YW1tCgkJCXdoaWNoIGFsbG93IHRlc3QgTUFQIG9uIGtlcm5lbCBzaWRlLgoJCQlBZnRlciBj b21waWxhdGlvbiB5b3Ugc2hvdWxkIHR5cGUgCgkJCSMgbWFrZSBsb2FkIGNvcHkKCQkJdG8g bG9hZCBtb2R1bGUgaW50byBrZXJuZWwgYW5kIGNvcHkgYmRzY3RsCgkJCXV0aWxpdHkgdG8g eW91ciBjdXJyZW50IGRpcmVjb3RyeS4KCQkJUnVuIHV0aWxpdHkKCQkJIyAuL2Jkc2N0bAoJ CQkuLi5hbmQgaGF2ZSBmdW4uCgkJCVdBUk5JTkc6IEJlY2F1c2Uga2VybmVsIG1vZHVsZSBp cyB1c2luZwoJCQkJIHByaW50Zig5KSByb3V0aW5lLCBwbGVhc2UKCQkJCSBiZSBvbiBmaXJz dCB0ZXJtaW5hbCBvbiBjb25zb2xlCgkJCQkgb3Igd2F0Y2ggZG1lc2cuCgoJCQkKCgAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL2V4YW1w bGUxL2RldgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDE3NTEgADAw MTc1MCAAMDAwMDAwMDAwMDAgMTA2NDUxMjQzNzEgMDE1MDY1ACA1AAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAABrb250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAw MCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTEvTWFrZWZpbGUAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAwMDA1MSAxMDY0NTAzMDcy NSAwMTYwMjQAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAU1VCRElSPWRldiB1 dGlsCgouaW5jbHVkZTxic2Quc3ViZGlyLm1rPgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAABiZHNtL2V4YW1wbGUxL3V0aWwAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAMDAwNzU1IAAwMDE3NTEgADAwMTc1MCAAMDAwMDAwMDAwMDAgMTA2NDUxMjQ2MDMg MDE1MjYyACA1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AHVzdGFyADAwd2llY3p5awAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABrb250YQAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTEv dXRpbC9NYWtlZmlsZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA2NDQgADAwMTc1MSAAMDAxNzUw IAAwMDAwMDAwMDExNSAxMDY0NTAzNzI0MiAwMTcwMDAAIDAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAw MDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAUFJPRz1iZHNjdGwKU1JDUz1tYWluLmMKQ0ZMQUdTPS1JLi4vLi4gLUku Li9kZXYKTUFOPQoKLmluY2x1ZGU8YnNkLnByb2cubWs+CgoAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL2V4YW1wbGUxL3V0 aWwvbWFpbi5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNjQ0IAAwMDE3NTEgADAwMTc1MCAA MDAwMDAwMDcwMDAgMTA2NDUxMjQ1NjUgMDE2NDM1ACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAABrb250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAw MDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAC8qLQogKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGF3ZWwgV2llY3pvcmVrIDx3 aWVjenlrQGdtYWlsLmNvbT4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0 cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3 aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgogKiAxLiBSZWRpc3RyaWJ1 dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAog KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n IGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0 IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0 IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICog ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg dGhlIGRpc3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU SEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJS QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS UkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg QVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5U QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM VURJTkcsIEJVVAogKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7 IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQog KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB QklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgogKiBUSElTIFNPRlRXQVJF LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgog KgogKi8KCiNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KI2luY2x1ZGUgPHN5cy9wcm9jLmg+CiNp bmNsdWRlIDxzeXMvaW9jdGwuaD4KI2luY2x1ZGUgInN5cy9iZHMuaCIKI2luY2x1ZGUgImti ZHMuaCIKCiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVk ZSA8ZmNudGwuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCmlu dCBfX2ZkOwoKdm9pZApvcGVuZGV2KCkKewoJX19mZCA9IG9wZW4oIi9kZXYvYmRzIixPX1JE V1IpOwoJYXNzZXJ0KCBfX2ZkICE9IC0xICk7Cn0KCgojZGVmaW5lIEZMX0ZJUlNUIDB4MDEK I2RlZmluZSBGTF9MQVNUIDB4MDIKI2RlZmluZSBGTF9JRCAweDA0CiNkZWZpbmUgRkxfUFJJ TlQgMHgwOAojZGVmaW5lIEZMX1JFTU9WRSAweDEwCiNkZWZpbmUgRkxfUkVTRVQgMHgyMAoK I2RlZmluZSBDX0lOU0VSVCAoRkxfRklSU1R8RkxfTEFTVCkKI2RlZmluZSBDX1BSSU5UIChG TF9QUklOVCkKI2RlZmluZSBDX0xPT0tVUCAoRkxfSUQpCiNkZWZpbmUgQ19SRVNFVCAoRkxf UkVTRVQpCiNkZWZpbmUgQ19SRU1PVkUgKEZMX1JFTU9WRSkKCnZvaWQKdXNhZ2UoKQp7Cglw cmludGYoImJkc2N0bCAtZiBbZmlyc3RdIC1sIFtsYXN0XWkJIyBhZGQgbmV3IHBlcnNvbiBp bnRvIGtlcm5lbCBjaXRpemVuIHJlZ2lzdHJ5XG4iKTsKCXByaW50ZigiYnNkY3RsIC1pIFtp ZF0JCQkjIGxvb2t1cCBLQ1IgZm9yIElEXG4iKTsKCXByaW50ZigiYnNkY3RsIC1wCQkJIyBy ZXF1ZXN0IGtlcm5lbCB0byBwcmludCBLQ1JcbiIpOwoJcHJpbnRmKCJic2RjdGwgLXIJCQkj IHJlc2V0IEtDUlxuIik7CglwcmludGYoImJzZGN0bCAtZCBbaWRdCQkJIyByZW1vdmUgZnJv bSBLQ1IgcGVyc29uIHdpdGggaWRcbiIpOwoJcHJpbnRmKCJXQVJOSU5HOiBmb3IgJ2FkZCcg J3Jlc2V0JyBjb21tYW5kcyBrZXJuZWwgaXMgcHJpbnRpbmcgb3V0cHV0IGJ5IHByaW50Zig5 KVxuIik7Cn0KCmludAptYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKewoJY2hhciBjaDsK CXN0cnVjdCBrcGVyc29uIGs7CglpbnQgaWQ7CglpbnQgZmxhZyA9IDA7Cgl3aGlsZSAoIChj aCA9IGdldG9wdChhcmdjLGFyZ3YsImY6bDppOmQ6cnBoIikpICE9IC0xICkKCQlzd2l0Y2gg KGNoKSB7CgkJCWNhc2UgJ2YnOgoJCQkJZmxhZyB8PSBGTF9GSVJTVDsKCQkJCXN0cm5jcHko ay5maXJzdCxvcHRhcmcsRklSU1RfTUFYLTEpOwoJCQkJYnJlYWs7CgoJCQljYXNlICdsJzoK CQkJCWZsYWcgfD0gRkxfTEFTVDsKCQkJCXN0cm5jcHkoay5sYXN0LG9wdGFyZyxMQVNUX01B WC0xKTsKCQkJCWJyZWFrOwoKCQkJY2FzZSAnaSc6CgkJCQlmbGFnIHw9IEZMX0lEOwoJCQkJ aWQgPSBzdHJ0b2wob3B0YXJnLE5VTEwsMTApOwoJCQkJYnJlYWs7CgoJCQljYXNlICdkJzoK CQkJCWZsYWcgfD0gRkxfUkVNT1ZFOwoJCQkJaWQgPSBzdHJ0b2wob3B0YXJnLE5VTEwsMTAp OwoJCQkJYnJlYWs7CgkJCQoJCQljYXNlICdyJzoKCQkJCWZsYWcgfD0gRkxfUkVTRVQ7CgkJ CQlicmVhazsKCgkJCWNhc2UgJ3AnOgoJCQkJZmxhZyB8PSBGTF9QUklOVDsKCQkJCWJyZWFr OwoJCQlkZWZhdWx0OgoJCQljYXNlICdoJzoKCQkJCXVzYWdlKCk7CgkJCQlyZXR1cm4oMCk7 CgkJfQoJaWYgKGZsYWcgPT0gMCkgewoJCXVzYWdlKCk7CgkJcmV0dXJuKC0xKTsKCX0KCW9w ZW5kZXYoKTsKCWlmICggZmxhZyA9PSBDX0lOU0VSVCApIHsKCQlpb2N0bChfX2ZkLCBCRFNJ T1NQRVJTT04sICZrICk7CgkJcHJpbnRmKCJJbnNlcnRlZCB3aXRoIGlkICV1XG4iLGsuaWQp OwoJfSBlbHNlIGlmICggZmxhZyA9PSBDX1BSSU5UICkgewoJCWlvY3RsKF9fZmQsIEJEU0lP Q0tQUklOVCApOwoJfSBlbHNlIGlmICggZmxhZyA9PSBDX0xPT0tVUCApIHsKCQlrLmlkID0g aWQ7CgkJaW9jdGwoX19mZCwgQkRTSU9HUEVSU09OLCZrICk7CgkJaWYgKCBrLmlkID09IC0x ICkgewoJCQlwcmludGYoIk5vdCBmb3VuZFxuIik7CgkJfSBlbHNlIHsKCQkJcHJpbnRmKCIl LjR1CQklcwkJJXNcbiIsay5pZCxrLmZpcnN0LGsubGFzdCk7CgkJfQoJfSBlbHNlIGlmICgg ZmxhZyA9PSBDX1JFU0VUICkgewoJCWlvY3RsKF9fZmQsIEJEU0lPQ0tSRVNFVCApOwoJfSBl bHNlIGlmICggZmxhZyA9PSBDX1JFTU9WRSApIHsKCQlwcmludGYoInggJWx1ICV1XG4iLEJE U0lPQ1JFTU9WRSxpZCk7CgkJaW9jdGwoX19mZCwgQkRTSU9DUkVNT1ZFLCZpZCApOwoJfSBl bHNlCgkJdXNhZ2UoKTsKCXJldHVybiAoMCk7Cn0KYmRzbS9leGFtcGxlMS9kZXYvTWFrZWZp bGUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDc1NSAAMDAxNzUxIAAwMDE3NTAgADAwMDAwMDAw MTE0IDEwNjQ1MDM2MDQyIDAxNjYwMAAgMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAwMHdpZWN6eWsAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAa29udGEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AABLTU9EPQliZHMKU1JDUz0JYmRzLmMgaGFzaF9zdXBwb3J0LmMKQ0ZMQUdTPSAtSS4uLy4u Ci5pbmNsdWRlIDxic2Qua21vZC5taz4KAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTEvZGV2L2Jkcy5jAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAxMjU3 NCAxMDY0NTEyNDcwNCAwMTYwNzQAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AGtvbnRhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA LyotCiAqIENvcHlyaWdodCAoYykgMjAwNyBQYXdlbCBXaWVjem9yZWsgPHdpZWN6eWtAZ21h aWwuY29tPgogKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBh bmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICog bW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2lu ZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBz b3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGlj ZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1l ci4KICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNl IHRoZSBhYm92ZSBjb3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0 aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVu dGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJp YnV0aW9uLgogKgogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1Ig YGBBUyBJUycnIEFORCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElO Q0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAq IE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBP U0UgQVJFIERJU0NMQUlNRUQuCiAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUg TElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwKICogSU5DSURFTlRBTCwgU1BFQ0lB TCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVU CiAqIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9S IFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5F U1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBP RiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9S IFRPUlQKICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJ TiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GCiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYg QURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqLwoKI2lu Y2x1ZGUgPHN5cy9wYXJhbS5oPgojaW5jbHVkZSA8c3lzL3Vpby5oPgojaW5jbHVkZSA8c3lz L3Byb2MuaD4KI2luY2x1ZGUgPHN5cy9zeXN0bS5oPgojaW5jbHVkZSA8c3lzL2tlcm5lbC5o PgojaW5jbHVkZSA8c3lzL2lvY2NvbS5oPgojaW5jbHVkZSA8c3lzL2NvbmYuaD4KI2luY2x1 ZGUgPHN5cy9tb2R1bGUuaD4KI2luY2x1ZGUgPHN5cy9tYWxsb2MuaD4KI2luY2x1ZGUgInN5 cy9iZHMuaCIKCiNpbmNsdWRlICJrYmRzLmgiCgoKCgoKc3RydWN0IGNpdGl6ZW5fcmVnaXN0 cnkgY2l0aXplbl9yZWdpc3RyeTsKCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBEYXRhIG1hbmFnZW1l bnQKICovCgoKTUFMTE9DX0RFRklORShNX0tDUkVOVFJZLCAiS2VybmVsIENpdGl6ZW4gUmVn aXN0cnkgRW50cnkiLCAiIik7CgoKc3RhdGljIHZvaWQga2NyX2FkZCggc3RydWN0IGtwZXJz b24gKmsgKTsKc3RhdGljIHZvaWQga2NyX2dldCggc3RydWN0IGtwZXJzb24gKmsgKTsKc3Rh dGljIHZvaWQga2NyX3ByaW50KHZvaWQpOwpzdGF0aWMgdm9pZCBrY3JfcmVtb3ZlKCBpbnQg aWQgKTsKc3RhdGljIHZvaWQga2NyX3Jlc2V0KHZvaWQpOwoKdm9pZAprY3JfYWRkKCBzdHJ1 Y3Qga3BlcnNvbiAqcGFyYW0gKQp7CglzdGF0aWMgaW50IF9pZCA9IDB4NzQ2MTsKCXN0cnVj dCBrZXlfaWQga2lkOwoJc3RydWN0IGtwZXJzb24gKnBjb3B5OwoJcGFyYW0tPmlkID0ga2lk LmlkID0gX2lkKys7CglwYXJhbS0+Zmlyc3RbRklSU1RfTUFYLTFdID0gMDsKCXBhcmFtLT5s YXN0W0xBU1RfTUFYLTFdID0gMDsKCXBjb3B5ID0gKHN0cnVjdCBrcGVyc29uICopIG1hbGxv Yyggc2l6ZW9mKCpwY29weSksIE1fS0NSRU5UUlksIE1fV0FJVE9LICk7CgltZW1jcHkocGNv cHkscGFyYW0sc2l6ZW9mKCpwY29weSkpOwoJTUFQX0lOU0VSVCggJmNpdGl6ZW5fcmVnaXN0 cnksICZraWQsIHBjb3B5LCBjaXRyZWdfZW50cnkgKTsKfQoKdm9pZAprY3JfZ2V0KCBzdHJ1 Y3Qga3BlcnNvbiAqcGFyYW0gKQp7CglzdHJ1Y3Qga2V5X2lkIGtpZDsKCXN0cnVjdCBrcGVy c29uICpwY29weTsKCglraWQuaWQgPSBwYXJhbS0+aWQ7CglNQVBfTE9PS1VQKCAmY2l0aXpl bl9yZWdpc3RyeSwgJmtpZCwgcGNvcHksIGNpdHJlZ19lbnRyeSApOwoJaWYgKCBwY29weSAp IHsKCQltZW1jcHkocGFyYW0scGNvcHksc2l6ZW9mKCpwY29weSkpOwoJfSBlbHNlIHsKCQlw YXJhbS0+aWQgPSAtMTsKCX0KfQoKdm9pZAprY3JfcHJpbnQoKQp7CglzdHJ1Y3Qga3BlcnNv biAqazsKCXByaW50ZigiXG4tLS0tLUtlcm5lbCBDaXRpemVuIFJlZ2lzdHJ5LS0tLS0tLS0t LS0tXG4iKTsKCU1BUF9GT1JFQUNIKCBrLCAmY2l0aXplbl9yZWdpc3RyeSwgY2l0cmVnX2Vu dHJ5ICkgewoJCXByaW50ZigiJS40dQkJJXMJCSVzXG4iLGstPmlkLGstPmZpcnN0LGstPmxh c3QpOwoJfQoJcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tXG4iKTsKfQoKdm9pZAprY3JfcmVtb3ZlKGludCBpZCApCnsKCXN0cnVjdCBrcGVyc29u ICpwZXJzb247CglzdHJ1Y3Qga2V5X2lkIGtpZDsKCWtpZC5pZCA9IGlkOwoJTUFQX0xPT0tV UCggJmNpdGl6ZW5fcmVnaXN0cnksICZraWQsIHBlcnNvbiwgY2l0cmVnX2VudHJ5ICk7Cglp ZiAoIHBlcnNvbiApIHsKCQlNQVBfUkVNT1ZFKCAmY2l0aXplbl9yZWdpc3RyeSwgcGVyc29u LCBrcGVyc29uLCBjaXRyZWdfZW50cnkgKTsKCQlmcmVlKHBlcnNvbixNX0tDUkVOVFJZKTsK CX0gZWxzZSB7CgkJcHJpbnRmKCJObyBwZXJzb24gd2l0aCBpZCAlaVxuIixpZCk7Cgl9Cn0K CnZvaWQKa2NyX3Jlc2V0KCkKewoJc3RydWN0IGtwZXJzb24gKnBlcnNvbjsKCU1BUF9GT1JF QUNIX1NBRkUoIHBlcnNvbiwgJmNpdGl6ZW5fcmVnaXN0cnksIGNpdHJlZ19lbnRyeSApIHsK CQlNQVBfUkVNT1ZFKCAmY2l0aXplbl9yZWdpc3RyeSwgcGVyc29uLCBrcGVyc29uLCBjaXRy ZWdfZW50cnkgKTsKCQlmcmVlKHBlcnNvbixNX0tDUkVOVFJZKTsKCX0KfQoKCi8qLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLQogKiBEZXZpY2UgCiAqLwoKc3RhdGljIGludCBiZHNkZXZfb3BlbihzdHJ1Y3Qg Y2RldiAqZGV2LCBpbnQgZmxhZywgaW50IG90eXAsIHN0cnVjdCB0aHJlYWQgKnRkKTsKc3Rh dGljIGludCBiZHNkZXZfY2xvc2Uoc3RydWN0IGNkZXYgKmRldiwgaW50IGZsYWcsIGludCBv dHlwLCBzdHJ1Y3QgdGhyZWFkICp0ZCk7CnN0YXRpYyBpbnQgYmRzZGV2X2lvY3RsKHN0cnVj dCBjZGV2ICpkZXYsIHVfbG9uZyBjbWQsIGNhZGRyX3QgYXJnLCBpbnQgbW9kZSwgc3RydWN0 IHRocmVhZCAqdGQpOwpzdGF0aWMgaW50IGJkc2Rldl93cml0ZShzdHJ1Y3QgY2RldiAqZGV2 LCBzdHJ1Y3QgdWlvICp1aW8sIGludCBpb2ZsYWcpOwpzdGF0aWMgaW50IGJkc2Rldl9yZWFk KHN0cnVjdCBjZGV2ICpkZXYsIHN0cnVjdCB1aW8gKnVpbywgaW50IGlvZmxhZyk7CgoKaW50 CmJkc2Rldl9vcGVuKHN0cnVjdCBjZGV2ICpkZXYsIGludCBmbGFnLCBpbnQgb3R5cCwgc3Ry dWN0IHRocmVhZCAqdGQpCnsKCXJldHVybiAoMCk7Cn0KCmludApiZHNkZXZfY2xvc2Uoc3Ry dWN0IGNkZXYgKmRldiwgaW50IGZsYWcsIGludCBvdHlwLCBzdHJ1Y3QgdGhyZWFkICp0ZCkK ewoJcmV0dXJuICgwKTsKfQoKaW50CmJkc2Rldl9pb2N0bChzdHJ1Y3QgY2RldiAqZGV2LCB1 X2xvbmcgY21kLCBjYWRkcl90IGFyZywgaW50IG1vZGUsCiAgICBzdHJ1Y3QgdGhyZWFkICp0 ZCkKewoJaW50IGVycm9yID0gMDsKCXVuaW9uIHsKCQljYWRkcl90IGFyZzsKCQlzdHJ1Y3Qg a3BlcnNvbiAqcGVyc29uOwoJCWludCAqaWQ7Cgl9IEFSRzsKCgkKCUFSRy5hcmcgPSBhcmc7 Cglzd2l0Y2goY21kKSB7CgkJY2FzZSBCRFNJT1NQRVJTT046CgkJCWtjcl9hZGQoQVJHLnBl cnNvbik7CgkJCWJyZWFrOwoJCWNhc2UgQkRTSU9HUEVSU09OOgoJCQlrY3JfZ2V0KEFSRy5w ZXJzb24pOwoJCQlicmVhazsKCQljYXNlIEJEU0lPQ0tQUklOVDoKCQkJa2NyX3ByaW50KCk7 CgkJCWJyZWFrOwoJCWNhc2UgQkRTSU9DS1JFU0VUOgoJCQlrY3JfcmVzZXQoKTsKCQkJYnJl YWs7CgkJY2FzZSBCRFNJT0NSRU1PVkU6CgkJCWtjcl9yZW1vdmUoKkFSRy5pZCk7CgkJCWJy ZWFrOwoJCWRlZmF1bHQ6CgkJCWVycm9yID0gRUlOVkFMOwoJCQlicmVhazsKCX0KCXJldHVy biAoZXJyb3IpOwp9CgppbnQKYmRzZGV2X3dyaXRlKHN0cnVjdCBjZGV2ICpkZXYsIHN0cnVj dCB1aW8gKnVpbywgaW50IGlvZmxhZykKewogICAgcmV0dXJuKEVOT1RTVVApOwp9CgppbnQK YmRzZGV2X3JlYWQoc3RydWN0IGNkZXYgKmRldiwgc3RydWN0IHVpbyAqdWlvLCBpbnQgaW9m bGFnKQp7CiAgICByZXR1cm4oRU5PVFNVUCk7Cn0KCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBNb2R1 bGUKICovCgpzdGF0aWMgc3RydWN0IGNkZXZzdyBiZHNfYmRzZGV2c3cgPSB7CgkuZF92ZXJz aW9uID0gRF9WRVJTSU9OLAoJLmRfb3BlbiA9IGJkc2Rldl9vcGVuLAoJLmRfY2xvc2UgPSBi ZHNkZXZfY2xvc2UsCgkuZF9yZWFkID0gYmRzZGV2X3JlYWQsCgkuZF93cml0ZSA9IGJkc2Rl dl93cml0ZSwKCS5kX2lvY3RsID0gYmRzZGV2X2lvY3RsLAoJLmRfbmFtZSA9ICJiZHMiCn07 CgpzdGF0aWMgc3RydWN0IGNkZXYgKnNkZXY7CgoKc3RhdGljIGludApiZHNkZXZfbG9hZCht b2R1bGVfdCBtb2QsIGludCBjbWQsIHZvaWQgKmFyZykKewogICAgaW50ICBlcnIgPSAwOwog ICAgc3dpdGNoIChjbWQpIHsKICAgIGNhc2UgTU9EX0xPQUQ6CgloYXNoX2luaXQoJmNpdGl6 ZW5fcmVnaXN0cnkpOwoJc2RldiA9IG1ha2VfZGV2KCZiZHNfYmRzZGV2c3csIDAsIFVJRF9S T09ULCBHSURfV0hFRUwsIDA2MDAsICJiZHMiKTsKCWJyZWFrOwoKICAgIGNhc2UgTU9EX1VO TE9BRDoKCWtjcl9yZXNldCgpOwoJZGVzdHJveV9kZXYoc2Rldik7CglicmVhazsKICAgIGRl ZmF1bHQ6CgllcnIgPSBFT1BOT1RTVVBQOwoJYnJlYWs7CiAgICB9CgogICAgcmV0dXJuKGVy cik7Cn0KCkRFVl9NT0RVTEUoYmRzZGV2LCBiZHNkZXZfbG9hZCwgTlVMTCk7CgAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTEvZGV2L2hhc2hfc3VwcG9ydC5jAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAwMzc0NCAxMDY0NTAyNjA1 MCAwMjAwMzUAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyotCiAqIENvcHly aWdodCAoYykgMjAwNyBQYXdlbCBXaWVjem9yZWsgPHdpZWN6eWtAZ21haWwuY29tPgogKiBB bGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9u LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z CiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0 IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVk aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj b3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgog KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFO RCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5U QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM QUlNRUQuCiAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBB TlkgRElSRUNULCBJTkRJUkVDVCwKICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCiAqIE5PVCBMSU1J VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM T1NTIE9GIFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFks IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElO Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V VCBPRiBUSEUgVVNFIE9GCiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqLwojaW5jbHVkZSA8c3lzL3Bh cmFtLmg+CgojaW5jbHVkZSA8c3lzL3F1ZXVlLmg+CiNpbmNsdWRlICJzeXMvYmRzLmgiCgoj aW5jbHVkZSAia2Jkcy5oIgoKc3RhdGljIHVuc2lnbmVkIGludCBrZXlfaWRfaGFzaCggY29u c3Qgc3RydWN0IGtleV9pZCAqayApOwpzdGF0aWMgaW50IGtleV9pZF9jbXAoIGNvbnN0IHN0 cnVjdCBrZXlfaWQgKmsxLCBjb25zdCBzdHJ1Y3Qga2V5X2lkICprMiApOwpzdGF0aWMgdm9p ZCBrZXlfaWRfY3AoIHN0cnVjdCBrZXlfaWQgKmRzdCwgY29uc3Qgc3RydWN0IGtleV9pZCAq c3JjICk7CgoKc3RhdGljIHVuc2lnbmVkIGludAprZXlfaWRfaGFzaCggY29uc3Qgc3RydWN0 IGtleV9pZCAqayApCnsKCXJldHVybihrLT5pZCk7Cn0KCnN0YXRpYyBpbnQKa2V5X2lkX2Nt cCggY29uc3Qgc3RydWN0IGtleV9pZCAqazEsIGNvbnN0IHN0cnVjdCBrZXlfaWQgKmsyICkK ewoJcmV0dXJuKCBrMS0+aWQgPT0gazItPmlkICk7Cn0KCnN0YXRpYyB2b2lkCmtleV9pZF9j cCggc3RydWN0IGtleV9pZCAqZHN0LCBjb25zdCBzdHJ1Y3Qga2V5X2lkICpzcmMgKQp7Cglk c3QtPmlkID0gc3JjLT5pZDsKfQoKCnZvaWQKaGFzaF9pbml0KCBzdHJ1Y3QgY2l0aXplbl9y ZWdpc3RyeSAqaCApCnsKCU1BUF9JTklUKGgsa2V5X2lkX2hhc2gsa2V5X2lkX2NtcCxrZXlf aWRfY3ApOwp9CgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL2V4YW1wbGUxL2Rl di9rYmRzLmgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDE3NTEgADAwMTc1MCAA MDAwMDAwMDM2NjIgMTA2NDUxMjQ2MzEgMDE2MjUxACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAABrb250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAw MDAwIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAC8qLQogKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGF3ZWwgV2llY3pvcmVrIDx3 aWVjenlrQGdtYWlsLmNvbT4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0 cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3 aXRob3V0CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRo ZSBmb2xsb3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgogKiAxLiBSZWRpc3RyaWJ1 dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAog KiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5n IGRpc2NsYWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0 IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0 IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICog ICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGgg dGhlIGRpc3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBU SEUgQVVUSE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJS QU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FS UkFOVElFUwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElD VUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUg QVVUSE9SIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5U QUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNM VURJTkcsIEJVVAogKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVU RSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7 IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQog KiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElB QklMSVRZLCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0Up IEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgogKiBUSElTIFNPRlRXQVJF LCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgog KgogKi8KCiNpZm5kZWYgS19CRFNfSAojZGVmaW5lIEtfQkRTX0gKCgoKc3RydWN0IGtleV9p ZCB7CglpbnQgaWQ7Cn07CgojZGVmaW5lIEZJUlNUX01BWCAxMDAKI2RlZmluZSBMQVNUX01B WCAxMDAKCnN0cnVjdCBrcGVyc29uIHsKCWludCBpZDsKCWNoYXIgZmlyc3RbRklSU1RfTUFY XTsKCWNoYXIgbGFzdFtGSVJTVF9NQVhdOwoJTUFQX0VOVFJZKGtwZXJzb24sa2V5X2lkKSBj aXRyZWdfZW50cnk7Cn07CgoKI2RlZmluZSBCRFNJT1NQRVJTT04JX0lPV1IoJ3AnLCAxLCBz dHJ1Y3Qga3BlcnNvbikKI2RlZmluZSBCRFNJT0dQRVJTT04JX0lPV1IoJ3AnLCAyLCBzdHJ1 Y3Qga3BlcnNvbikKI2RlZmluZSBCRFNJT0NLUFJJTlQJX0lPKCdjJywzKQojZGVmaW5lIEJE U0lPQ0tSRVNFVAlfSU8oJ2MnLDQpCiNkZWZpbmUgQkRTSU9DUkVNT1ZFCV9JT1coJ3AnLDUs aW50KQoKI2lmZGVmIF9LRVJORUwKCi8qIEtlcm5lbCB3b3JsZCwga2VybmVsIGNpdGl6ZW5z IF09O10gKi8KCk1BUF9IRUFEKCBjaXRpemVuX3JlZ2lzdHJ5LCBrcGVyc29uLCAxMyApOwoK dm9pZCBoYXNoX2luaXQoIHN0cnVjdCBjaXRpemVuX3JlZ2lzdHJ5ICpoICk7CgojZW5kaWYg LyogX0tFUk5FTCAqLwoKI2VuZGlmIC8qIEtfQkRTX0ggKi8KAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAYmRzbS9leGFtcGxlMC9NYWtlZmlsZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAw MDc1NSAAMDAxNzUxIAAwMDE3NTAgADAwMDAwMDAwMTMyIDEwNjQ1MTI0MzM2IDAxNjAyNQAg MAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhcgAw MHdpZWN6eWsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAa29udGEAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAwMDAwMDAgADAwMDAwMCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABDQz1jYwpQUk9HPWV4YW1wbGUwClNS Q1M9bWFpbi5jIGhhc2hfc3VwcG9ydC5jCkNGTEFHUz0gLUkuLiAKTUFOPQoKCi5pbmNsdWRl PGJzZC5wcm9nLm1rPgoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAGJkc20vZXhhbXBsZTAvbWFpbi5jAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAwMDA3 NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAxNTYwMSAxMDY0NTEyMjczMCAwMTU0NjAAIDAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIAMDB3 aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyotCiAqIENvcHlyaWdodCAoYykgMjAw NyBQYXdlbCBXaWVjem9yZWsgPHdpZWN6eWtAZ21haWwuY29tPgogKiBBbGwgcmlnaHRzIHJl c2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmlu YXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0 dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFyZSBtZXQ6 CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0 aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlv bnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmlidXRpb25z IGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKICog ICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk aXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRl cmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiBUSElTIFNPRlRX QVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVT UyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVE IFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQg RklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuCiAqIElO IE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJ TkRJUkVDVCwKICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFV RU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCiAqIE5PVCBMSU1JVEVEIFRPLCBQUk9D VVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwK ICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVS IENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4g Q09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElOQ0xVRElORyBORUdM SUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNF IE9GCiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJ VFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqLwoKI2luY2x1ZGUgPHN5cy9xdWV1ZS5oPgojaW5j bHVkZSAic3lzL2Jkcy5oIgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5o PgojaW5jbHVkZSA8c3RkbGliLmg+CgojaW5jbHVkZSAiZXhhbXBsZTAuaCIKCgpzdHJ1Y3Qg d29ya2Vyc19ieV9pZCB3cmtzX2J5X2lkOwpzdHJ1Y3Qgd29ya2Vyc19ieV9sYXN0IHdya3Nf YnlfbGFzdDsKCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT0KICogRGF0YSBtYW5hZ2VtZW50IHJvdXRpbmVz CiAqLwoKCgpzdGF0aWMgdm9pZAp3b3JrZXJfYWRkKCBzdHJ1Y3Qgd29ya2VyICp3b3JrZXIg KQp7CglzdGF0aWMgaW50IF9rZXkgPSAweDEyMzQ7CglzdHJ1Y3Qga2V5X2lkIGtpZDsKCXN0 cnVjdCBrZXlfbGFzdCBrbGFzdDsKCgl3b3JrZXItPmlkID0gX2tleSsrOwoJa2lkLmlkID0g d29ya2VyLT5pZDsKCU1BUF9JTlNFUlQoJndya3NfYnlfaWQsICZraWQsIHdvcmtlciwgaGFz aF9ieV9pZCApOwoKCXN0cmNweShrbGFzdC5sYXN0LHdvcmtlci0+bGFzdCk7CglNTUFQX0lO U0VSVCgmd3Jrc19ieV9sYXN0LCZrbGFzdCwgd29ya2VyLCBoYXNoX2J5X2xhc3QgKTsKCQp9 CgpzdGF0aWMgc3RydWN0IHdvcmtlciAqCndvcmtlcl9sb29rdXAoIGludCBpZCApCnsKCXN0 cnVjdCB3b3JrZXIgKndvcmtlcjsKCXN0cnVjdCBrZXlfaWQgazsKCglrLmlkID0gaWQ7CglN QVBfTE9PS1VQKCZ3cmtzX2J5X2lkLCAmaywgd29ya2VyLCBoYXNoX2J5X2lkICk7CglyZXR1 cm4gKHdvcmtlcik7Cn0KCgpzdGF0aWMgaW50Cndvcmtlcl9yZW1vdmVfYnlfbGFzdCggY29u c3QgY2hhciAqIGxhc3QgKQp7CglzdHJ1Y3Qgd29ya2VyICp3b3JrZXI7CglzdHJ1Y3Qga2V5 X2xhc3Qga2xhc3Q7CglzdHJjcHkoa2xhc3QubGFzdCxsYXN0KTsKCU1NQVBfTE9PS1VQX0ZP UkVBQ0hfU0FGRSggJndya3NfYnlfbGFzdCwgJmtsYXN0LCB3b3JrZXIsIGhhc2hfYnlfbGFz dCApIHsKCQlNQVBfUkVNT1ZFKCZ3cmtzX2J5X2lkLHdvcmtlcix3b3JrZXIsaGFzaF9ieV9p ZCApOwoJCU1NQVBfUkVNT1ZFKCZ3cmtzX2J5X2xhc3Qsd29ya2VyLHdvcmtlcixoYXNoX2J5 X2xhc3QpOwkJCgkJcHJpbnRmKCIlLjR1ICUtMTVzICUtMTVzICUuMnUgJS0xNXNcbiIsd29y a2VyLT5pZCx3b3JrZXItPmZpcnN0LHdvcmtlci0+bGFzdCx3b3JrZXItPmFnZSx3b3JrZXIt PmNpdHkpOwkKCX0KCXJldHVybigwKTsKfQoKc3RhdGljIGludAp3b3JrZXJfcmVtb3ZlKCBp bnQgaWQgKQp7CglzdHJ1Y3Qgd29ya2VyICp3b3JrZXI7Cgl3b3JrZXIgPSB3b3JrZXJfbG9v a3VwKCBpZCApOwoKCWlmICggd29ya2VyID09IE5VTEwgKSByZXR1cm4oLTEpOwoJTUFQX1JF TU9WRSgmd3Jrc19ieV9pZCx3b3JrZXIsd29ya2VyLGhhc2hfYnlfaWQgKTsKCU1NQVBfUkVN T1ZFKCZ3cmtzX2J5X2xhc3Qsd29ya2VyLHdvcmtlcixoYXNoX2J5X2xhc3QpOwoKCWZyZWUo d29ya2VyKTsKCXJldHVybigxKTsKfQoKCnN0YXRpYyB2b2lkCndvcmtlcl9saXN0X2J5X2xh c3QoY29uc3QgY2hhciAqbGFzdCkKewoJc3RydWN0IHdvcmtlciAqd29ya2VyOwoJc3RydWN0 IGtleV9sYXN0IGtsYXN0OwoJc3RyY3B5KGtsYXN0Lmxhc3QsbGFzdCk7CglNTUFQX0xPT0tV UF9GT1JFQUNIKCAmd3Jrc19ieV9sYXN0LCAma2xhc3QsIHdvcmtlciwgaGFzaF9ieV9sYXN0 KSB7CgkJcHJpbnRmKCIlLjR1ICUtMTVzICUtMTVzICUuMnUgJS0xNXNcbiIsd29ya2VyLT5p ZCx3b3JrZXItPmZpcnN0LHdvcmtlci0+bGFzdCx3b3JrZXItPmFnZSx3b3JrZXItPmNpdHkp OwkKCX0KfQoKc3RhdGljIHZvaWQKd29ya2VyX2xpc3QoKQp7CglzdHJ1Y3Qgd29ya2VyICp3 b3JrZXI7CglNQVBfRk9SRUFDSCggIHdvcmtlciwgJndya3NfYnlfaWQsIGhhc2hfYnlfaWQp IHsKCQlwcmludGYoIiUuNHUgJS0xNXMgJS0xNXMgJS4ydSAlLTE1c1xuIix3b3JrZXItPmlk LHdvcmtlci0+Zmlyc3Qsd29ya2VyLT5sYXN0LHdvcmtlci0+YWdlLHdvcmtlci0+Y2l0eSk7 CQoJfQp9CgoKLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09CiAqIFVzZXIgaW50ZXJmYWNlIGhhbmRsZXJzCiAq LwoKc3RhdGljIGludCBfX2dldChjaGFyICprLGNoYXIgKmRhdGEsIGludCBsZW4pOwojZGVm aW5lIF9fR0VUKCBrb20sIGQsIGwgKSBpZiAoX19nZXQoa29tLGQsbCkgKSByZXR1cm47Cgpz dGF0aWMgdm9pZCB1aV9pbnNlcnQoKTsKc3RhdGljIHZvaWQgdWlfc2VsZWN0X2lkKCk7Cgpz dGF0aWMgaW50Cl9fZ2V0KGNoYXIgKmssY2hhciAqZGF0YSwgaW50IGxlbikKewoJaW50IG47 CglwcmludGYoIiVzOiAiLGspOwoJZmZsdXNoKHN0ZG91dCk7CglkYXRhWzBdID0gMDsKCWZw dXJnZShzdGRpbik7CglpZiAoIGZnZXRzKGRhdGEsbGVuLHN0ZGluKSA9PSBOVUxMICkgcmV0 dXJuKDEpOwoJbiA9IHN0cmxlbihkYXRhKTsKCWlmICggbiA+IDEgKQoJZGF0YVtuLTFdID0g MDsKCXJldHVybigwKTsKfQoKc3RhdGljIHZvaWQKdWlfbGlzdCgpCnsKCXdvcmtlcl9saXN0 KCk7Cn0KCnN0YXRpYyB2b2lkCnVpX3NlbGVjdF9pZCgpCnsKCXN0cnVjdCB3b3JrZXIgKndv cmtlcjsKCWNoYXIgaWRbMTBdOwoJaW50IF9pZDsKCglfX0dFVCgiSUQiLGlkLHNpemVvZihp ZCkpOwoJX2lkID0gc3RydG9sKGlkLE5VTEwsMTApOwoKCXdvcmtlciA9IHdvcmtlcl9sb29r dXAoX2lkKTsKCWlmICggd29ya2VyID09IE5VTEwgKSB7CgkJcHJpbnRmKCJFcnJvcjogY2Fu bm90IGZpbmQgd29ya2VyIHdpdGggaWQgJS40dVxuIixfaWQpOwoJCXJldHVybjsKCX0KCXBy aW50ZigiRm91bmQ6ICUuNHUgJS0xNXMgJS0xNXMgJS4ydSAlLTE1c1xuIix3b3JrZXItPmlk LHdvcmtlci0+Zmlyc3Qsd29ya2VyLT5sYXN0LHdvcmtlci0+YWdlLHdvcmtlci0+Y2l0eSk7 CQp9CgoKc3RhdGljIHZvaWQKdWlfc2VsZWN0X2xhc3QoKQp7CgljaGFyIGxhc3RbTEFTVF9N QVhdOwoKCV9fR0VUKCJMYXN0IixsYXN0LHNpemVvZihsYXN0KSk7CgoJd29ya2VyX2xpc3Rf YnlfbGFzdChsYXN0KTsKfQoKc3RhdGljIHZvaWQKdWlfcmVtb3ZlX2lkKCkKewoJY2hhciBp ZFsxMF07CglpbnQgX2lkOwoKCV9fR0VUKCJJRCIsaWQsc2l6ZW9mKGlkKSk7CglfaWQgPSBz dHJ0b2woaWQsTlVMTCwxMCk7CgoJaWYgKCB3b3JrZXJfcmVtb3ZlKF9pZCkgKSB7CgkJcHJp bnRmKCJFcnJvcjogbm8gdXNlciB3aXRoIHRoaXMgaWRcbiIpOwoJfSBlbHNlIHsKCQlwcmlu dGYoIlJlbW92ZWRcbiIpOwoJfQp9CgpzdGF0aWMgdm9pZAp1aV9yZW1vdmVfbGFzdCgpCnsK CWNoYXIgbGFzdFtMQVNUX01BWF07CglfX0dFVCgiTGFzdCIsbGFzdCxzaXplb2YobGFzdCkp OwoKCXdvcmtlcl9yZW1vdmVfYnlfbGFzdChsYXN0KTsKfQoKCnN0YXRpYyB2b2lkCnVpX2lu c2VydCgpCnsKCXN0cnVjdCB3b3JrZXIgKndvcmtlcjsKCXN0cnVjdCB3b3JrZXIgdGVtcDsK CWNoYXIgYWdlWzEwXTsKCglwdXRzKCI9PT4gQWRkaW5nIG5ldyB3b3JrZXIgaW50byBtZW1v cnkiKTsKCV9fR0VUKCJGaXJzdCBuYW1lIix0ZW1wLmZpcnN0LHNpemVvZih0ZW1wLmZpcnN0 KSk7CglfX0dFVCgiTGFzdCBuYW1lIix0ZW1wLmxhc3Qsc2l6ZW9mKHRlbXAubGFzdCkpOwoJ X19HRVQoIkFnZSIsYWdlLHNpemVvZihhZ2UpKTsKCV9fR0VUKCJDaXR5Iix0ZW1wLmNpdHks c2l6ZW9mKHRlbXAuY2l0eSkpOwoJCgl0ZW1wLmFnZSA9IHN0cnRvbChhZ2UsTlVMTCwxMCk7 CgkKCXdvcmtlciA9IChzdHJ1Y3Qgd29ya2VyKikgbWFsbG9jKCBzaXplb2YoKndvcmtlcikp OwoJbWVtY3B5KHdvcmtlciwmdGVtcCxzaXplb2YoKndvcmtlcikpOwoKCXdvcmtlcl9hZGQo d29ya2VyKTsKCXByaW50ZigiQWRkZWQgd2l0aCBpZCAlLjR1XG4iLHdvcmtlci0+aWQpOwoK fQoKCgovKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT0KICogTWFpbiBtZW51CiAqLwoKCmVudW0gb3B0aW9uX3Yg ewoJT1BfSU5WQUxJRCwKCU9QX1FVSVQsCglPUF9JTlNFUlQsCglPUF9MSVNULAoJT1BfU0VM RUNUX0lELAoJT1BfU0VMRUNUX0xBU1QsCglPUF9SRU1PVkVfSUQsCglPUF9SRU1PVkVfTEFT VAp9OwoKCnN0cnVjdCBvcHRpb24gewoJY29uc3QgY2hhciAqdGV4dDsKCWVudW0gb3B0aW9u X3YgdmFsdWU7Cn07CgoKc3RhdGljIGVudW0gb3B0aW9uX3YgZmluZF9vcHRpb24oY2hhciBj KTsKc3RhdGljIGVudW0gb3B0aW9uX3YgZ2V0X29wdGlvbl9mcm9tX3VzZXIodm9pZCk7Cgpz dHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKCXsgIlF1aXQiLCBPUF9RVUlUIH0sCgl7ICJJ bnNlcnQgbmV3IHBlcnNvbiB0byBtZW1vcnkiLCBPUF9JTlNFUlQgfSwKCXsgIkxpc3QgcGVy c29ucyBmcm9tIG1lbW9ydCIsIE9QX0xJU1QgfSwKCXsgIkNoZWNrIHBlcnNvbiBJRCIsIE9Q X1NFTEVDVF9JRCB9LAoJeyAiU2hvdyBwZXJzb25zIGJ5IGxhc3QgbmFtZSIsIE9QX1NFTEVD VF9MQVNUIH0sCgl7ICJSZW1vdmUgYnkgSUQiLCBPUF9SRU1PVkVfSUQgfSwKCXsgIlJlbW92 ZSBieSBsYXN0IiwgT1BfUkVNT1ZFX0xBU1QgfSwKCXsgTlVMTCwgT1BfSU5WQUxJRCB9LAp9 OwoKCnN0YXRpYyBlbnVtIG9wdGlvbl92CmZpbmRfb3B0aW9uKGNoYXIgYykKewoJc3RydWN0 IG9wdGlvbiAqb3AgPSBvcHRpb25zOwoJd2hpbGUgKCBvcC0+dGV4dCAmJiBjLS0gKSB7CgkJ b3ArKzsKCX0KCQoJcmV0dXJuIChvcC0+dmFsdWUpOwp9CgpzdGF0aWMgZW51bSBvcHRpb25f diAKZ2V0X29wdGlvbl9mcm9tX3VzZXIoKQp7CgljaGFyIGM7CglmcHVyZ2Uoc3RkaW4pOwoJ YyA9IGZnZXRjKHN0ZGluKSAtICcwJzsKCWlmICggZmVvZihzdGRpbikgKSB7CgkJcmV0dXJu IChPUF9RVUlUKTsKCX0KCXJldHVybiAoZmluZF9vcHRpb24oYykpOwoJCn0KCgpzdGF0aWMg aW50Cm1haW5fbWVudSgpCnsKCWludCBpOwoJaW50IHIgPSAxOwoJc3RydWN0IG9wdGlvbiAq b3AgPSBvcHRpb25zOwoJcHJpbnRmKCItLS0tLVxuIik7Cglmb3IgKGkgPSAwOyBvcC0+dGV4 dDsgaSsrLG9wKysgKSB7CiAJCXByaW50ZigiIC0gJS4xdQkJJXNcbiIsaSxvcC0+dGV4dCk7 Cgl9CglwcmludGYoIlxuUHJlc3Mgb3B0aW9uIG51bWJlciBrZXkgYW5kIGhpdCBlbnRlcjog Iik7Cglzd2l0Y2ggKCBnZXRfb3B0aW9uX2Zyb21fdXNlcigpICkgewoJCWNhc2UgT1BfUVVJ VDoKCQkJciA9IDA7CgkJCWJyZWFrOwoKCQljYXNlIE9QX0lOU0VSVDoKCQkJdWlfaW5zZXJ0 KCk7CgkJCWJyZWFrOwoKCQljYXNlIE9QX0xJU1Q6CgkJCXVpX2xpc3QoKTsKCQkJYnJlYWs7 CgoJCWNhc2UgT1BfU0VMRUNUX0lEOgoJCQl1aV9zZWxlY3RfaWQoKTsKCQkJYnJlYWs7CgoJ CWNhc2UgT1BfU0VMRUNUX0xBU1Q6CgkJCXVpX3NlbGVjdF9sYXN0KCk7CgkJCWJyZWFrOwoK CQljYXNlIE9QX0lOVkFMSUQ6CgkJCWJyZWFrOwoKCQljYXNlIE9QX1JFTU9WRV9JRDoKCQkJ dWlfcmVtb3ZlX2lkKCk7CgkJCWJyZWFrOwoKCQljYXNlIE9QX1JFTU9WRV9MQVNUOgoJCQl1 aV9yZW1vdmVfbGFzdCgpOwoJCQlicmVhazsKCgl9CglyZXR1cm4gKHIpOwp9CgppbnQKbWFp bigpCnsKCWlkX2hhc2hfaW5pdCgmd3Jrc19ieV9pZCk7CglsYXN0X2hhc2hfaW5pdCgmd3Jr c19ieV9sYXN0KTsKCXdoaWxlICggbWFpbl9tZW51KCkgKTsKCXJldHVybiAoMCk7Cn0KAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAGJkc20vZXhhbXBsZTAvaGFzaF9zdXBwb3J0LmMAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAwNDQ3MyAxMDY0NTAwMTMx NSAwMTcyNTMAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAdXN0YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyotCiAqIENvcHly aWdodCAoYykgMjAwNyBQYXdlbCBXaWVjem9yZWsgPHdpZWN6eWtAZ21haWwuY29tPgogKiBB bGwgcmlnaHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNv dXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9u LCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25z CiAqIGFyZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBt dXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0 IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVk aXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBj b3B5cmlnaHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhl IGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9v ciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgog KiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFO RCBBTlkgRVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU IE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5U QUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NM QUlNRUQuCiAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBB TlkgRElSRUNULCBJTkRJUkVDVCwKICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZ LCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCiAqIE5PVCBMSU1J VEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBM T1NTIE9GIFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBU SU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFks IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElO Q0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9V VCBPRiBUSEUgVVNFIE9GCiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBU SEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqLwoKI2luY2x1ZGUgPHN5cy9x dWV1ZS5oPgojaW5jbHVkZSAic3lzL2Jkcy5oIgoKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNs dWRlIDxzdHJpbmcuaD4KCiNpbmNsdWRlICJleGFtcGxlMC5oIgoKCnN0YXRpYyB1bnNpZ25l ZCBpbnQKa2V5X2lkX2hhc2goIGNvbnN0IHN0cnVjdCBrZXlfaWQgKmsgKQp7CglyZXR1cm4o ay0+aWQpOwp9CgpzdGF0aWMgaW50CmtleV9pZF9jbXAoIGNvbnN0IHN0cnVjdCBrZXlfaWQg KmsxLCBjb25zdCBzdHJ1Y3Qga2V5X2lkICprMiApCnsKCXJldHVybiggazEtPmlkID09IGsy LT5pZCApOwp9CgpzdGF0aWMgdm9pZAprZXlfaWRfY3AoIHN0cnVjdCBrZXlfaWQgKmRzdCwg Y29uc3Qgc3RydWN0IGtleV9pZCAqc3JjICkKewoJZHN0LT5pZCA9IHNyYy0+aWQ7Cn0KCgp2 b2lkCmlkX2hhc2hfaW5pdCggc3RydWN0IHdvcmtlcnNfYnlfaWQgKmhhc2ggKQp7CglNQVBf SU5JVChoYXNoLGtleV9pZF9oYXNoLGtleV9pZF9jbXAsa2V5X2lkX2NwKTsKfQoKCgpzdGF0 aWMgdW5zaWduZWQgaW50CmtleV9sYXN0X2hhc2goIGNvbnN0IHN0cnVjdCBrZXlfbGFzdCAq ayApCnsKCWludCBoID0gMjk7Cgljb25zdCBjaGFyICpwOwoJZm9yICggcCA9IGstPmxhc3Q7 ICpwICE9ICdcMCc7IHArKyApIHsKCQloICs9ICpwOwoJfQoJcmV0dXJuIChoKTsKfQoKc3Rh dGljIGludAprZXlfbGFzdF9jbXAoIGNvbnN0IHN0cnVjdCBrZXlfbGFzdCAqazEsIGNvbnN0 IHN0cnVjdCBrZXlfbGFzdCAqazIgKQp7CglyZXR1cm4gKHN0cmNhc2VjbXAoazEtPmxhc3Qs azItPmxhc3QpID09IDApOwp9CgoKc3RhdGljIHZvaWQKa2V5X2xhc3RfY3AoIHN0cnVjdCBr ZXlfbGFzdCAqZHN0LCBjb25zdCBzdHJ1Y3Qga2V5X2xhc3QgKnNyYyApCnsKCXN0cmNweShk c3QtPmxhc3Qsc3JjLT5sYXN0KTsKfQoKdm9pZApsYXN0X2hhc2hfaW5pdCggc3RydWN0IHdv cmtlcnNfYnlfbGFzdCAqaGFzaCApCnsKCU1NQVBfSU5JVChoYXNoLGtleV9sYXN0X2hhc2gs a2V5X2xhc3RfY21wLGtleV9sYXN0X2NwKTsKfQoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAGJkc20vZXhhbXBsZTAvZXhhbXBsZTAuaAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAwMDA3NTUgADAwMTc1MSAAMDAxNzUwIAAwMDAwMDAwMzYzMCAxMDY0NDc3MTMxNyAwMTYy NjUAIDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0 YXIAMDB3aWVjenlrAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGtvbnRhAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAMDAwMDAwIAAwMDAwMDAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALyotCiAqIENvcHlyaWdodCAo YykgMjAwNyBQYXdlbCBXaWVjem9yZWsgPHdpZWN6eWtAZ21haWwuY29tPgogKiBBbGwgcmln aHRzIHJlc2VydmVkLgogKgogKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBh bmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKICogbW9kaWZpY2F0aW9uLCBhcmUg cGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCiAqIGFy ZSBtZXQ6CiAqCiAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJl dGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICogMi4gUmVkaXN0cmli dXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmln aHQKICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxv d2luZyBkaXNjbGFpbWVyIGluIHRoZQogKiAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhl ciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgogKgogKiBUSElT IFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBBVVRIT1IgYGBBUyBJUycnIEFORCBBTlkg RVhQUkVTUyBPUgogKiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBM SU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCiAqIE9GIE1FUkNIQU5UQUJJTElU WSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQu CiAqIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgRElS RUNULCBJTkRJUkVDVCwKICogSU5DSURFTlRBTCwgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBD T05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUCiAqIE5PVCBMSU1JVEVEIFRP LCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9G IFVTRSwKICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBI T1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCiAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRI RVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKICogKElOQ0xVRElO RyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBU SEUgVVNFIE9GCiAqIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9T U0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAqCiAqLwoKI2lmbmRlZiBFWEFNUExFXzAKI2Rl ZmluZSBFWEFNUExFXzAKCiNkZWZpbmUgUFJJTUVfTlVNQkVSIDEzCgoKI2RlZmluZSBGSVJT VF9NQVggMTIwCiNkZWZpbmUgTEFTVF9NQVggMTIwCiNkZWZpbmUgQ0lUWV9NQVggMTIwCgpz dHJ1Y3Qga2V5X2lkIHsKCWludCBpZDsKfTsKCnN0cnVjdCBrZXlfbGFzdCB7CgljaGFyIGxh c3RbTEFTVF9NQVhdOwp9OwoKc3RydWN0IHdvcmtlciB7CglpbnQgaWQ7CgljaGFyIGZpcnN0 W0ZJUlNUX01BWF07CgljaGFyIGxhc3RbTEFTVF9NQVhdOwoJaW50IGFnZTsKCWNoYXIgY2l0 eVtDSVRZX01BWF07CgoJTUFQX0VOVFJZKHdvcmtlcixrZXlfaWQpIGhhc2hfYnlfaWQ7CglN TUFQX0VOVFJZKHdvcmtlcixrZXlfbGFzdCkgaGFzaF9ieV9sYXN0Owp9OwoKTUFQX0hFQUQo d29ya2Vyc19ieV9pZCx3b3JrZXIsUFJJTUVfTlVNQkVSKTsKTU1BUF9IRUFEKHdvcmtlcnNf YnlfbGFzdCx3b3JrZXIsUFJJTUVfTlVNQkVSKTsKCnZvaWQgaWRfaGFzaF9pbml0KCBzdHJ1 Y3Qgd29ya2Vyc19ieV9pZCAqdGFibGUgKTsKdm9pZCBsYXN0X2hhc2hfaW5pdCggc3RydWN0 IHdvcmtlcnNfYnlfbGFzdCAqdGFibGUgKTsKCgojZW5kaWYKAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABiZHNtL3N5cy9iZHMuaAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMDAwNzU1IAAwMDE3NTEgADAwMTc1MCAAMDAwMDAw MjI3MDMgMTA2NDUxMjQ3MjQgMDE0NDIyACAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyADAwd2llY3p5awAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAABrb250YQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADAwMDAwMCAAMDAwMDAwIAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAC8qLQogKiBDb3B5cmlnaHQgKGMpIDIwMDcgUGF3ZWwgV2llY3pvcmVrIDx3aWVjenlr QGdtYWlsLmNvbT4KICogQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogUmVkaXN0cmlidXRp b24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0 CiAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xs b3dpbmcgY29uZGl0aW9ucwogKiBhcmUgbWV0OgogKgogKiAxLiBSZWRpc3RyaWJ1dGlvbnMg b2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAogKiAgICBu b3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2Ns YWltZXIuCiAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJv ZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CiAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNv bmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUKICogICAgZG9j dW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRp c3RyaWJ1dGlvbi4KICoKICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQVVU SE9SIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1MgT1IKICogSU1QTElFRCBXQVJSQU5USUVT LCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElF UwogKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQ VVJQT1NFIEFSRSBESVNDTEFJTUVELgogKiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9S IEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsCiAqIElOQ0lERU5UQUwsIFNQ RUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcs IEJVVAogKiBOT1QgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09E UyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCiAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJV U0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQogKiBUSEVP UlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZ LCBPUiBUT1JUCiAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJ TkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRSBPRgogKiBUSElTIFNPRlRXQVJFLCBFVkVO IElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogKgogKi8K CiNpZm5kZWYgU1lTX0JEU19ICiNkZWZpbmUgU1lTX0JEU19ICgoKLyoKICogVGhpcyBmaWxl IGNvbnRhaW4gYmFzaWMgZGF0YSBzdHJ1Y3R1cmVzLiBUaGV5IGFyZSBzaW1pbGFyIHRvIHN0 cnVjdHVyZXMKICogaW4gc3lzL3F1ZXVlLmgsIHBsZWFzZSByZWFkIGRvY3VtZW50YXRpb24g Zm9yIGl0IGZpcnN0LiAKICoKICogISEgSW5jbHVkZSBzeXMvcXVldWUuaCBiZWZvcmUgdGhp cyBmaWxlLgogKiAKICogQSBtYXAgKCBkaWN0aW9uYXJ5LCBoYXNoLXRhYmxlLCBhc3NvY2lh dGl2ZSBhcnJheSApIHN0cnVjdHVyZSBpcyBoZWFkZWQKICogYnkgTUFQX0hFQUQgbWFjcm8u IFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIHRhYmxlIG9mIGxpc3RzIHJlcHJlc2VudGVkCiAq IGJ5IFNMSVNUIHN0cnVjdHVyZSBmcm9tIHN5cy9xdWV1ZS5oLiBUaGUgbGVuZ3RoIG9mIHRh YmxlIGlzIHR5cGVkIGJ5IHVzZXIKICogYXMgcHJpbWUtbnVtYmVyLXBhcmFtZXRlciBpbiBI RUFEIG1hY3JvLiBTdHJ1Y3R1cmVzIGFyZSB1c2VkIHRvCiAqIGRlY3Jhc2UgdGltZSBvZiBp dGVtIGFjY2VzcyAuIFVzZXIgaGFkIHRvIHNwZWNpZnkgYSBzdHJ1Y3R1cmUKICogd2hpY2gg d2lsbCBiZSB1c2VyIGFzIGtleS4KICogVGhlIGluaXRpYWxpemVyIChNQVBfSU5JVCkgbmVl ZCBwb2ludGVycyB0byBoYXNoLWZ1bmN0aW9uLCBrZXktY29weSBhbmQKICoga2V5LWNvbXBh cmUgcm91dGluZXMuIE1lbW9yeSBhZGRyZXNzZXMgb2YgdGhlbiB0aGVtIHdpbGwgYmUgc3Rv cmVkCiAqIGluIGRhdGEgc3RydWN0dXJlIGZvciBsYXRlciB1c2FnZS4gUGxlYXNlIHNlZSBk ZWZpbml0aW9uIG9mIGJkc18qIHR5cGVzCiAqIGluIHRoaXMgZmlsZSBmb3IgbW9yZSBpbmZv cm1hdGlvbi4KICogQSBtdWx0aSBtYXAgc3RydWN0dXJlIGlzIGhlYWRlZCBieSBNTUFQX0hF QUQgbWFjcm8gdG8gcmVkdWNlIGxpbmVzIG9mIGNvZGUKICouKGxlc3MgcHJvYmFsaXR5IHRv IG1ha2UgYnVnKS4gSXQgaXMgaWRlbnRpY2FsIHRvCiAqIHNpbmdsZSBtYXAgd2l0aCBkaWZm ZXJlbmNlIHRoYXQgY2FuIHN0b3JlIG1hbnkgdmFyaWFibGVzIGZvciB0aGlzIHNhbWUga2V5 LgogKiBGb3IgdGhpcyBmZWF0dXJlIGl0IGlzIGltcGxlbWVudGluZyBhZGRpdGlvbmFsIG1h Y3JvOiBfTE9PS1VQX0ZPUkVBQ0gKICogKGFuZCBfU0FGRSB2ZXJzaW9uKS4KICogSW4gaW1w bGVtZW50YXRpb24gdGhlIE1BUCBhbmQgTU1BUCBhcmUgaWRlbnRpY2FsLCBpdCBoYXZlIGRp ZmZlcmVudCBuYW1lcwogKiBmb3IgbG9naWNhbCBzZXBlcmF0aW9uLiBJdCBpcyBhbHNvIHVz aW5nIGludGVybmFsIHRlbXBsYXRlIGZvciBnZW5lcmF0ZQogKiBhbm90aGVyIGludGVybmFs IG5hbWVzIGZvciBNQVAgYW5kIE1NQVAsIGluIHRoaXMgd2F5IGNvbXBpbGVyIGNhbiBnZW5l cmF0ZQogKiBlcnJvciAgd2hlbiBwcm9ncmFtbWVyIHdpbGwgdXNlIGZvciBleGFtcGxlIE1B UCBtYWNybyBvbiBNTUFQIHN0cnVjdHVyZS4KICoKICogICAgICAgICAgICAgICAgICAgICAg ICAgIE1BUCAgICBNTUFQCiAqIF9IRUFEICAgICAgICAgICAgICAgICAgICArICAgICAgKwog KiBfSEVBRF9JTklUSUFMSVpFUiAgICAgICAgLSAgICAgIC0KICogX0VOVFJZICAgICAgICAg ICAgICAgICAgICsgICAgICArCiAqIF9JTklUICAgICAgICAgICAgICAgICAgICArICAgICAg KwogKiBfRU1QVFkgICAgICAgICAgICAgICAgICAgKyAgICAgICsKICogX0ZJUlNUICAgICAg ICAgICAgICAgICAgIC0gICAgICAtCiAqIF9ORVhUICAgICAgICAgICAgICAgICAgICAtICAg ICAgLQogKiBfUFJFViAgICAgICAgICAgICAgICAgICAgLSAgICAgIC0KICogX0xBU1QgICAg ICAgICAgICAgICAgICAgIC0gICAgICAtCiAqIF9LRVkgICAgICAgICAgICAgICAgICAgICAr ICAgICAgKwogKiBfRk9SRUFDSCAgICAgICAgICAgICAgICAgKyAgICAgICsKICogX0ZPUkVB Q0hfU0FGRSAgICAgICAgICAgICsgICAgICArCiAqIF9GT1JFQUNIX1JFVkVSU0UgICAgICAg ICAtICAgICAgLQogKiBfRk9SRUFDSF9SRVZFUlNFX1NBRkUgICAgLSAgICAgIC0KICogX0lO U0VSVCAgICAgICAgICAgICAgICAgICsgICAgICArCiAqIF9JTlNFUlRfSEVBRCAgICAgICAg ICAgICAtICAgICAgLQogKiBfSU5TRVJUX0JFRk9SRSAgICAgICAgICAgLSAgICAgIC0KICog X0lOU0VSVF9BRlRFUiAgICAgICAgICAgIC0gICAgICAtCiAqIF9JTlNFUlRfVEFJTCAgICAg ICAgICAgICAtICAgICAgLQogKiBfQ09OQ0FUICAgICAgICAgICAgICAgICAgLSAgICAgIC0K ICogX1JFTU9WRV9IRUFEICAgICAgICAgICAgIC0gICAgICAtCiAqIF9SRU1PVkUgICAgICAg ICAgICAgICAgICArICAgICAgKwogKiBfTE9PS1VQICAgICAgICAgICAgICAgICAgKyAgICAg ICsKICogX0xPT0tVUF9GT1JFQUNIICAgICAgICAgIC0gICAgICArCiAqIF9MT09LVVBfRk9S RUFDSF9TQUZFICAgICAtICAgICAgKwogKgogKiBJbXBsZW1lbnRhdGlvbiBub3RlcwogKiAt LS0tLS0tLS0tLS0tLS0tLS0tLQogKgogKi8KCgp0eXBlZGVmIHVuc2lnbmVkIGludCBiZHNf aGFzaF9mdW5jX3QoIGNvbnN0IHZvaWQgKmtleSApOwp0eXBlZGVmIGludCBiZHNfa2V5X2Nt cF9mdW5jX3QgKCBjb25zdCB2b2lkICprZXkxLCBjb25zdCB2b2lkICprZXkyICk7CnR5cGVk ZWYgdm9pZCBiZHNfa2V5X2NwX2Z1bmNfdCggdm9pZCAqa2V5ZHN0LCBjb25zdCB2b2lkICpr ZXlzcmMgKTsKCi8qCiAqIEdlbmVyaWMgbWFwIHRlbXBsYXRlCiAqLwoKI2RlZmluZSBfdE1B UF9QUklNRV9USU5ZCTQ5CiNkZWZpbmUgX3RNQVBfUFJJTUVfU01BTEwJMTQ5CiNkZWZpbmUg X3RNQVBfUFJJTUVfTUVESVVNCTk3NwojZGVmaW5lIF90TUFQX1BSSU1FX0xBUkdFCTEyNzcK I2RlZmluZSBfdE1BUF9QUklNRV9IVUdFCTI0NTkKCgojZGVmaW5lIF90TUFQX0xPT0tVUF9G Uk9NX0xJU1QoaGVhZCwgbGlzdCxrZXksdmFyLGZpZWxkLF90ZmllbGQpIGRvIHsJXAoJaW50 IF9oaWZvdW5kID0gMDsJCQkJCQlcCglTTElTVF9GT1JFQUNIKHZhciwgbGlzdCwgZmllbGQu X3RmaWVsZCApIHsJCQlcCgkJaWYgKCBoZWFkLT5jbXBmdW5jKGtleSwmdmFyLT5maWVsZC5r ZXljb3B5KSApIHsJXAoJCQlfaGlmb3VuZCA9IDE7CQkJCQlcCgkJCWJyZWFrOwkJCQkJCVwK CQl9CQkJCQkJCVwKCX0JCQkJCQkJCVwKCWlmICggIV9oaWZvdW5kICkgdmFyID0gTlVMTDsJ CQkJCVwKfSB3aGlsZSgwKQoKI2RlZmluZSBfdE1BUF9JTlNFUlRfSU5UT19MSVNUKGhlYWQs bGlzdCxrZXksdmFyLGZpZWxkLF90ZmllbGQpIGRvIHsJXAoJaGVhZC0+Y3BmdW5jKCYodmFy LT5maWVsZC5rZXljb3B5KSxrZXkpOwkJCVwKCWhlYWQtPmNvdW50Kys7CQkJCQkJCVwKCVNM SVNUX0lOU0VSVF9IRUFEKCBsaXN0LCB2YXIsIGZpZWxkLl90ZmllbGQgKTsJCQlcCn0gd2hp bGUoMCkKCgojZGVmaW5lIF90TUFQX0xJU1QoaGVhZCxpKSAmKChoZWFkKS0+bGlzdFtpXSkK CiNkZWZpbmUgX3RNQVBfTEVOR1RIKGhlYWQpICAoc2l6ZW9mKChoZWFkKS0+bGlzdCkvc2l6 ZW9mKChoZWFkKS0+bGlzdFswXSkpCgojZGVmaW5lIF90TUFQX0lOREVYKGhlYWQsa2V5KSAo KChoZWFkKS0+aGZ1bmMoa2V5KSklX3RNQVBfTEVOR1RIKGhlYWQpKQoKCiNkZWZpbmUgX3RN QVBfSEVBRChuYW1lLHR5cGUscHJpbWUpCQkJCQlcCnN0cnVjdCBuYW1lIHsJCQkJCQkJCVwK CXVuc2lnbmVkIGludCB0bXBfaTsJCQkJCQlcCglzdHJ1Y3QgdHlwZSAqdG1wX3Y7CQkJCQkJ XAoJaW50IGNvdW50OwkJCQkJCQlcCgliZHNfaGFzaF9mdW5jX3QgKmhmdW5jOwkJCQkJCVwK CWJkc19rZXlfY21wX2Z1bmNfdCAqY21wZnVuYzsJCQkJCVwKCWJkc19rZXlfY3BfZnVuY190 ICpjcGZ1bmM7CQkJCQlcCglTTElTVF9IRUFEKCx0eXBlKSBsaXN0W3ByaW1lXTsJCQkJCVwK fQoKCiNkZWZpbmUgX3RNQVBfRU5UUlkodHlwZSxrZXl0eXBlLF90ZmllbGQpCQkJCVwKc3Ry dWN0IHsJCQkJCQkJCVwKCVNMSVNUX0VOVFJZKHR5cGUpIF90ZmllbGQ7CQkJCQlcCglzdHJ1 Y3Qga2V5dHlwZSBrZXljb3B5OwkJCQkJCVwKfQoKCiNkZWZpbmUgX3RNQVBfSU5JVChoZWFk LF9oZnVuYyxfY21wZnVuYyxfY3BmdW5jKSBkbyB7CQkJXAoJdW5zaWduZWQgaW50IF9oaWw7 CQkJCQkJXAoJKGhlYWQpLT5oZnVuYyA9IChiZHNfaGFzaF9mdW5jX3QqKV9oZnVuYzsJCQlc CgkoaGVhZCktPmNtcGZ1bmMgPSAoYmRzX2tleV9jbXBfZnVuY190KilfY21wZnVuYzsJCVwK CShoZWFkKS0+Y3BmdW5jID0gKGJkc19rZXlfY3BfZnVuY190KilfY3BmdW5jOwkJCVwKCSho ZWFkKS0+Y291bnQgPSAwOwkJCQkJCVwKICAgIGZvciAoIF9oaWwgPSAwOyBfaGlsIDwgX3RN QVBfTEVOR1RIKGhlYWQpOyBfaGlsKysgKSB7CQlcCgkJU0xJU1RfSU5JVCggX3RNQVBfTElT VChoZWFkLF9oaWwpICk7CQkJXAogICAgfQkJCQkJCQkJCVwKfSB3aGlsZSgwKQoKI2RlZmlu ZSBfdE1BUF9FTVBUWShoZWFkKSAoKGhlYWQpLT5jb3VudCA9PSAwKQoKI2RlZmluZSBfdE1B UF9LRVkodmFyLGZpZWxkKSAoJih2YXIpLT5maWVsZC5rZXljb3B5KQoKCiNkZWZpbmUgX3RN QVBfSU5TRVJUKGhlYWQsIGtleSwgdmFyLCBmaWVsZCxfdGZpZWxkICkgZG8gewkJXAoJdW5z aWduZWQgaW50IF9oaWwgPSBfdE1BUF9JTkRFWChoZWFkLGtleSk7CQkJXAoJX3RNQVBfSU5T RVJUX0lOVE9fTElTVCgoaGVhZCksIF90TUFQX0xJU1QoaGVhZCxfaGlsKSwJCVwKCQkJa2V5 LHZhcixmaWVsZCxfdGZpZWxkKTsJCQkJXAp9IHdoaWxlKDApCgoKI2RlZmluZSBfdE1BUF9G T1JFQUNIKHZhciwgaGVhZCwgZmllbGQsX3RmaWVsZCkJCQkJXApmb3IgKCAoaGVhZCktPnRt cF9pID0gMDsJCQkJCQlcCgkJKGhlYWQpLT50bXBfaSA8IF90TUFQX0xFTkdUSChoZWFkKTsJ CQlcCgkJKGhlYWQpLT50bXBfaSsrICkJCQkJCVwKCVNMSVNUX0ZPUkVBQ0godmFyLCBfdE1B UF9MSVNUKGhlYWQsKGhlYWQpLT50bXBfaSksIGZpZWxkLl90ZmllbGQpCgoKI2RlZmluZSBf dE1BUF9GT1JFQUNIX1NBRkUodmFyLCBoZWFkLCBmaWVsZCwgX3RmaWVsZCApCQkJXApmb3Ig KCAoaGVhZCktPnRtcF9pID0gMDsJCQkJCQlcCgkJKGhlYWQpLT50bXBfaSA8IF90TUFQX0xF TkdUSChoZWFkKTsJCQlcCgkJKGhlYWQpLT50bXBfaSsrICkJCQkJCVwKCVNMSVNUX0ZPUkVB Q0hfU0FGRSh2YXIsIF90TUFQX0xJU1QoaGVhZCwoaGVhZCktPnRtcF9pKSwgZmllbGQuX3Rm aWVsZCwoaGVhZCktPnRtcF92ICkKCgoKI2RlZmluZSBfdE1BUF9SRU1PVkUoIGhlYWQsIHZh ciwgdHlwZSwgZmllbGQsIF90ZmllbGQgKSBkbyB7CQlcCglpbnQgX2hpbCA9IF90TUFQX0lO REVYKGhlYWQsICYodmFyKS0+ZmllbGQua2V5Y29weSk7CQlcCglTTElTVF9SRU1PVkUoIF90 TUFQX0xJU1QoaGVhZCxfaGlsKSwgdmFyLCB0eXBlLGZpZWxkLl90ZmllbGQgKTtcCn0gd2hp bGUoMCkKCQoKCiNkZWZpbmUgX3RNQVBfTE9PS1VQKCBoZWFkLCBrZXksIHZhciwgZmllbGQs X3RmaWVsZCApIGRvIHsJCVwKCXVuc2lnbmVkIGludCBfaGlsID0gX3RNQVBfSU5ERVgoaGVh ZCxrZXkpOwkJCVwKCV90TUFQX0xPT0tVUF9GUk9NX0xJU1QoIChoZWFkKSwgX3RNQVBfTElT VChoZWFkLF9oaWwpLAkJXAoJCQlrZXksIHZhciwgZmllbGQsIF90ZmllbGQpOwkJCVwKfSB3 aGlsZSgwKQoKCiNkZWZpbmUgX3RNQVBfTE9PS1VQX0ZPUkVBQ0goaCwga2V5LCB2YXIsZmll bGQsX3RmaWVsZCkJCQlcCglTTElTVF9GT1JFQUNIKHZhciwgX3RNQVBfTElTVChoLF90TUFQ X0lOREVYKGgsa2V5KSksIGZpZWxkLl90ZmllbGQpXAoJCWlmICggKGgpLT5jbXBmdW5jKGtl eSwmdmFyLT5maWVsZC5rZXljb3B5KSApCgkKCiNkZWZpbmUgX3RNQVBfTE9PS1VQX0ZPUkVB Q0hfU0FGRShoLCBrLCBkLGYsIF90ZmllbGQpCQkJXAoJU0xJU1RfRk9SRUFDSF9TQUZFKGQs IF90TUFQX0xJU1QoaCxfdE1BUF9JTkRFWChoLGspKSwgZi5fdGZpZWxkLChoKS0+dG1wX3Yp XAoJCWlmICggKGgpLT5jbXBmdW5jKGssJmQtPmYua2V5Y29weSkgKQoKCi8qCiAqIE1hcCBk ZWZpbml0aW9ucwogKi8KCgojZGVmaW5lIF9NQVBfTEZJRUxECW1wZmxkCgojZGVmaW5lIE1B UF9IRUFEKG5hbWUsdHlwZSxwcmltZSkJCQkJCVwKCV90TUFQX0hFQUQobmFtZSx0eXBlLHBy aW1lKQoKI2RlZmluZSBNQVBfRU5UUlkodHlwZSxrZXl0eXBlKQkJCQkJCVwKCV90TUFQX0VO VFJZKHR5cGUsa2V5dHlwZSxfTUFQX0xGSUVMRCkKCiNkZWZpbmUgTUFQX0tFWSh2YXIsZmll bGQpCQkJCQkJXAoJX3RNQVBfS0VZKHZhcixmaWVsZCkKCiNkZWZpbmUgTUFQX0lOSVQoaGVh ZCxfaGZ1bmMsX2NtcGZ1bmMsX2NwZnVuYykJCQkJXAoJX3RNQVBfSU5JVChoZWFkLF9oZnVu YyxfY21wZnVuYyxfY3BmdW5jKQoKI2RlZmluZSBNQVBfRU1QVFkoaGVhZCkJCQkJCQkJXAoJ X3RNQVBfRU1QVFkoaGVhZCkKCiNkZWZpbmUgTUFQX0ZPUkVBQ0goIHZhciwgaGVhZCwgZmll bGQpCQkJCQlcCglfdE1BUF9GT1JFQUNIKCB2YXIsIGhlYWQsIGZpZWxkLF9NQVBfTEZJRUxE KQoKI2RlZmluZSBNQVBfRk9SRUFDSF9TQUZFKCB2YXIsIGhlYWQsIGZpZWxkICkJCQkJXAoJ X3RNQVBfRk9SRUFDSF9TQUZFKCB2YXIsIGhlYWQsIGZpZWxkLCBfTUFQX0xGSUVMRCApCgoj ZGVmaW5lIE1BUF9SRU1PVkUoIGhlYWQsIHZhciwgdHlwZSwgZmllbGQgKQkJCQlcCglfdE1B UF9SRU1PVkUoIGhlYWQsIHZhciwgdHlwZSwgZmllbGQsX01BUF9MRklFTEQgKQoKI2RlZmlu ZSBNQVBfUkVNT1ZFX0JZX0tFWSggaGVhZCwga2V5LCB0eXBlLCBmaWVsZCApCQkJXAoJX3RN QVBfUkVNT1ZFX0JZX0tFWSggaGVhZCwga2V5LCB0eXBlLCBmaWVsZCxfTUFQX0xGSUVMRCAp CgojZGVmaW5lIE1BUF9MT09LVVAoIGhlYWQsIGtleSwgdmFyLCBmaWVsZCApCQkJCVwKCV90 TUFQX0xPT0tVUCggaGVhZCwga2V5LCB2YXIsIGZpZWxkLF9NQVBfTEZJRUxEICkKCiNkZWZp bmUgTUFQX0lOU0VSVChoZWFkLCBrZXksIHZhciwgZmllbGQgKQkJCQlcCglfdE1BUF9JTlNF UlQoaGVhZCwga2V5LCB2YXIsIGZpZWxkLF9NQVBfTEZJRUxEICkKCi8qCiAqIE11bHRpIG1h cCBkZWZpbml0aW9ucwogKi8KCiNkZWZpbmUgX01NQVBfTEZJRUxECW1tcGZsZAoKI2RlZmlu ZSBNTUFQX0hFQUQobmFtZSx0eXBlLHByaW1lKQkJCQkJXAoJX3RNQVBfSEVBRChuYW1lLHR5 cGUscHJpbWUpCgojZGVmaW5lIE1NQVBfRU5UUlkodHlwZSxrZXl0eXBlKQkJCQkJXAoJX3RN QVBfRU5UUlkodHlwZSxrZXl0eXBlLF9NTUFQX0xGSUVMRCkKCiNkZWZpbmUgTU1BUF9LRVko dmFyLGZpZWxkKQkJCQkJCVwKCV90TUFQX0tFWSh2YXIsZmllbGQpCgojZGVmaW5lIE1NQVBf SU5JVChoZWFkLF9oZnVuYyxfY21wZnVuYyxfY3BmdW5jKQkJCQlcCglfdE1BUF9JTklUKGhl YWQsX2hmdW5jLF9jbXBmdW5jLF9jcGZ1bmMpCgojZGVmaW5lIE1NQVBfRU1QVFkoaGVhZCkJ CQkJCQlcCglfdE1BUF9FTVBUWShoZWFkKQoKI2RlZmluZSBNTUFQX0ZPUkVBQ0goIHZhciwg aGVhZCwgZmllbGQpCQkJCQlcCglfdE1BUF9GT1JFQUNIKCB2YXIsIGhlYWQsIGZpZWxkLF9N TUFQX0xGSUVMRCkKCiNkZWZpbmUgTU1BUF9GT1JFQUNIX1NBRkUoIHZhciwgaGVhZCwgZmll bGQgKQkJCQlcCglfdE1BUF9GT1JFQUNIX1NBRkUoIHZhciwgaGVhZCwgZmllbGQsX01NQVBf TEZJRUxEICkKCiNkZWZpbmUgTU1BUF9SRU1PVkUoIGhlYWQsIHZhciwgdHlwZSwgZmllbGQg KQkJCQlcCglfdE1BUF9SRU1PVkUoIGhlYWQsIHZhciwgdHlwZSwgZmllbGQsX01NQVBfTEZJ RUxEICkKCiNkZWZpbmUgTU1BUF9SRU1PVkVfQllfS0VZKCBoZWFkLCBrZXksIHR5cGUsIGZp ZWxkICkJCQlcCglfdE1BUF9SRU1PVkVfQllfS0VZKCBoZWFkLCBrZXksIHR5cGUsIGZpZWxk LF9NTUFQX0xGSUVMRCApCgojZGVmaW5lIE1NQVBfTE9PS1VQKCBoZWFkLCBrZXksIHZhciwg ZmllbGQgKQkJCQlcCglfdE1BUF9MT09LVVAoIGhlYWQsIGtleSwgdmFyLCBmaWVsZCxfTU1B UF9MRklFTEQgKQoKI2RlZmluZSBNTUFQX0xPT0tVUF9GT1JFQUNIKCBoZWFkLCBrZXksIHZh ciwgZmllbGQgKQkJCVwKCV90TUFQX0xPT0tVUF9GT1JFQUNIKCBoZWFkLCBrZXksIHZhciwg ZmllbGQsX01NQVBfTEZJRUxEICkKCiNkZWZpbmUgTU1BUF9MT09LVVBfRk9SRUFDSF9TQUZF KCBoZWFkLCBrZXksIHZhciwgZmllbGQgKQkJXAoJX3RNQVBfTE9PS1VQX0ZPUkVBQ0hfU0FG RSggaGVhZCwga2V5LCB2YXIsIGZpZWxkLF9NTUFQX0xGSUVMRCApCgojZGVmaW5lIE1NQVBf SU5TRVJUKGhlYWQsIGtleSwgdmFyLCBmaWVsZCApCQkJCVwKCV90TUFQX0lOU0VSVChoZWFk LCBrZXksIHZhciwgZmllbGQsX01NQVBfTEZJRUxEICkKCgoKI2VuZGlmIC8qIFNZU19CRFNf SCAqLwoAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAA== --------------020003070002010103050303 Content-Type: text/plain; name="bds.h" Content-Transfer-Encoding: 7bit Content-Disposition: inline; filename="bds.h" /*- * Copyright (c) 2007 Pawel Wieczorek <wieczyk@gmail.com> * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * */ #ifndef SYS_BDS_H #define SYS_BDS_H /* * This file contain basic data structures. They are similar to structures * in sys/queue.h, please read documentation for it first. * * !! Include sys/queue.h before this file. * * A map ( dictionary, hash-table, associative array ) structure is headed * by MAP_HEAD macro. This structure contains table of lists represented * by SLIST structure from sys/queue.h. The length of table is typed by user * as prime-number-parameter in HEAD macro. Structures are used to * decrase time of item access . User had to specify a structure * which will be user as key. * The initializer (MAP_INIT) need pointers to hash-function, key-copy and * key-compare routines. Memory addresses of then them will be stored * in data structure for later usage. Please see definition of bds_* types * in this file for more information. * A multi map structure is headed by MMAP_HEAD macro to reduce lines of code *.(less probality to make bug). It is identical to * single map with difference that can store many variables for this same key. * For this feature it is implementing additional macro: _LOOKUP_FOREACH * (and _SAFE version). * In implementation the MAP and MMAP are identical, it have different names * for logical seperation. It is also using internal template for generate * another internal names for MAP and MMAP, in this way compiler can generate * error when programmer will use for example MAP macro on MMAP structure. * * MAP MMAP * _HEAD + + * _HEAD_INITIALIZER - - * _ENTRY + + * _INIT + + * _EMPTY + + * _FIRST - - * _NEXT - - * _PREV - - * _LAST - - * _KEY + + * _FOREACH + + * _FOREACH_SAFE + + * _FOREACH_REVERSE - - * _FOREACH_REVERSE_SAFE - - * _INSERT + + * _INSERT_HEAD - - * _INSERT_BEFORE - - * _INSERT_AFTER - - * _INSERT_TAIL - - * _CONCAT - - * _REMOVE_HEAD - - * _REMOVE + + * _LOOKUP + + * _LOOKUP_FOREACH - + * _LOOKUP_FOREACH_SAFE - + * * Implementation notes * -------------------- * */ typedef unsigned int bds_hash_func_t( const void *key ); typedef int bds_key_cmp_func_t ( const void *key1, const void *key2 ); typedef void bds_key_cp_func_t( void *keydst, const void *keysrc ); /* * Generic map template */ #define _tMAP_PRIME_TINY 49 #define _tMAP_PRIME_SMALL 149 #define _tMAP_PRIME_MEDIUM 977 #define _tMAP_PRIME_LARGE 1277 #define _tMAP_PRIME_HUGE 2459 #define _tMAP_LOOKUP_FROM_LIST(head, list,key,var,field,_tfield) do { \ int _hifound = 0; \ SLIST_FOREACH(var, list, field._tfield ) { \ if ( head->cmpfunc(key,&var->field.keycopy) ) { \ _hifound = 1; \ break; \ } \ } \ if ( !_hifound ) var = NULL; \ } while(0) #define _tMAP_INSERT_INTO_LIST(head,list,key,var,field,_tfield) do { \ head->cpfunc(&(var->field.keycopy),key); \ head->count++; \ SLIST_INSERT_HEAD( list, var, field._tfield ); \ } while(0) #define _tMAP_LIST(head,i) &((head)->list[i]) #define _tMAP_LENGTH(head) (sizeof((head)->list)/sizeof((head)->list[0])) #define _tMAP_INDEX(head,key) (((head)->hfunc(key))%_tMAP_LENGTH(head)) #define _tMAP_HEAD(name,type,prime) \ struct name { \ unsigned int tmp_i; \ struct type *tmp_v; \ int count; \ bds_hash_func_t *hfunc; \ bds_key_cmp_func_t *cmpfunc; \ bds_key_cp_func_t *cpfunc; \ SLIST_HEAD(,type) list[prime]; \ } #define _tMAP_ENTRY(type,keytype,_tfield) \ struct { \ SLIST_ENTRY(type) _tfield; \ struct keytype keycopy; \ } #define _tMAP_INIT(head,_hfunc,_cmpfunc,_cpfunc) do { \ unsigned int _hil; \ (head)->hfunc = (bds_hash_func_t*)_hfunc; \ (head)->cmpfunc = (bds_key_cmp_func_t*)_cmpfunc; \ (head)->cpfunc = (bds_key_cp_func_t*)_cpfunc; \ (head)->count = 0; \ for ( _hil = 0; _hil < _tMAP_LENGTH(head); _hil++ ) { \ SLIST_INIT( _tMAP_LIST(head,_hil) ); \ } \ } while(0) #define _tMAP_EMPTY(head) ((head)->count == 0) #define _tMAP_KEY(var,field) (&(var)->field.keycopy) #define _tMAP_INSERT(head, key, var, field,_tfield ) do { \ unsigned int _hil = _tMAP_INDEX(head,key); \ _tMAP_INSERT_INTO_LIST((head), _tMAP_LIST(head,_hil), \ key,var,field,_tfield); \ } while(0) #define _tMAP_FOREACH(var, head, field,_tfield) \ for ( (head)->tmp_i = 0; \ (head)->tmp_i < _tMAP_LENGTH(head); \ (head)->tmp_i++ ) \ SLIST_FOREACH(var, _tMAP_LIST(head,(head)->tmp_i), field._tfield) #define _tMAP_FOREACH_SAFE(var, head, field, _tfield ) \ for ( (head)->tmp_i = 0; \ (head)->tmp_i < _tMAP_LENGTH(head); \ (head)->tmp_i++ ) \ SLIST_FOREACH_SAFE(var, _tMAP_LIST(head,(head)->tmp_i), field._tfield,(head)->tmp_v ) #define _tMAP_REMOVE( head, var, type, field, _tfield ) do { \ int _hil = _tMAP_INDEX(head, &(var)->field.keycopy); \ SLIST_REMOVE( _tMAP_LIST(head,_hil), var, type,field._tfield );\ } while(0) #define _tMAP_LOOKUP( head, key, var, field,_tfield ) do { \ unsigned int _hil = _tMAP_INDEX(head,key); \ _tMAP_LOOKUP_FROM_LIST( (head), _tMAP_LIST(head,_hil), \ key, var, field, _tfield); \ } while(0) #define _tMAP_LOOKUP_FOREACH(h, key, var,field,_tfield) \ SLIST_FOREACH(var, _tMAP_LIST(h,_tMAP_INDEX(h,key)), field._tfield)\ if ( (h)->cmpfunc(key,&var->field.keycopy) ) #define _tMAP_LOOKUP_FOREACH_SAFE(h, k, d,f, _tfield) \ SLIST_FOREACH_SAFE(d, _tMAP_LIST(h,_tMAP_INDEX(h,k)), f._tfield,(h)->tmp_v)\ if ( (h)->cmpfunc(k,&d->f.keycopy) ) /* * Map definitions */ #define _MAP_LFIELD mpfld #define MAP_HEAD(name,type,prime) \ _tMAP_HEAD(name,type,prime) #define MAP_ENTRY(type,keytype) \ _tMAP_ENTRY(type,keytype,_MAP_LFIELD) #define MAP_KEY(var,field) \ _tMAP_KEY(var,field) #define MAP_INIT(head,_hfunc,_cmpfunc,_cpfunc) \ _tMAP_INIT(head,_hfunc,_cmpfunc,_cpfunc) #define MAP_EMPTY(head) \ _tMAP_EMPTY(head) #define MAP_FOREACH( var, head, field) \ _tMAP_FOREACH( var, head, field,_MAP_LFIELD) #define MAP_FOREACH_SAFE( var, head, field ) \ _tMAP_FOREACH_SAFE( var, head, field, _MAP_LFIELD ) #define MAP_REMOVE( head, var, type, field ) \ _tMAP_REMOVE( head, var, type, field,_MAP_LFIELD ) #define MAP_REMOVE_BY_KEY( head, key, type, field ) \ _tMAP_REMOVE_BY_KEY( head, key, type, field,_MAP_LFIELD ) #define MAP_LOOKUP( head, key, var, field ) \ _tMAP_LOOKUP( head, key, var, field,_MAP_LFIELD ) #define MAP_INSERT(head, key, var, field ) \ _tMAP_INSERT(head, key, var, field,_MAP_LFIELD ) /* * Multi map definitions */ #define _MMAP_LFIELD mmpfld #define MMAP_HEAD(name,type,prime) \ _tMAP_HEAD(name,type,prime) #define MMAP_ENTRY(type,keytype) \ _tMAP_ENTRY(type,keytype,_MMAP_LFIELD) #define MMAP_KEY(var,field) \ _tMAP_KEY(var,field) #define MMAP_INIT(head,_hfunc,_cmpfunc,_cpfunc) \ _tMAP_INIT(head,_hfunc,_cmpfunc,_cpfunc) #define MMAP_EMPTY(head) \ _tMAP_EMPTY(head) #define MMAP_FOREACH( var, head, field) \ _tMAP_FOREACH( var, head, field,_MMAP_LFIELD) #define MMAP_FOREACH_SAFE( var, head, field ) \ _tMAP_FOREACH_SAFE( var, head, field,_MMAP_LFIELD ) #define MMAP_REMOVE( head, var, type, field ) \ _tMAP_REMOVE( head, var, type, field,_MMAP_LFIELD ) #define MMAP_REMOVE_BY_KEY( head, key, type, field ) \ _tMAP_REMOVE_BY_KEY( head, key, type, field,_MMAP_LFIELD ) #define MMAP_LOOKUP( head, key, var, field ) \ _tMAP_LOOKUP( head, key, var, field,_MMAP_LFIELD ) #define MMAP_LOOKUP_FOREACH( head, key, var, field ) \ _tMAP_LOOKUP_FOREACH( head, key, var, field,_MMAP_LFIELD ) #define MMAP_LOOKUP_FOREACH_SAFE( head, key, var, field ) \ _tMAP_LOOKUP_FOREACH_SAFE( head, key, var, field,_MMAP_LFIELD ) #define MMAP_INSERT(head, key, var, field ) \ _tMAP_INSERT(head, key, var, field,_MMAP_LFIELD ) #endif /* SYS_BDS_H */ --------------020003070002010103050303--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?4694AC5C.9040107>