From: anorland AT hem2 DOT passagen DOT se (Anders Norlander) Subject: windres: .RES format support 12 Aug 1998 07:00:55 -0700 Message-ID: <35D19DDC.57CE704A.cygnus.cygwin32.developers@hem2.passagen.se> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------------0FF6D0FCD74BC9B46B0A1CBA" To: cygwin32-developers AT cygnus DOT com This is a multi-part message in MIME format. --------------0FF6D0FCD74BC9B46B0A1CBA Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit The attached file 'windres-res_sup.tar' contains a couple of files related to processing binary .RES files. The files are: resres.c - write_res_file and read_res_file functions rcparse.diff - a patch to rcparse.y that makes windres aware of SEPARATOR items in extended menus. rj.c, rj.h - a small program to join multiple .RES files Just remove the write_res_file and read_res_file stubs from windres.c and compile windres together with resres.c to add support for .RES files. A have also noted that windres doesn't allow CONTROL statements with the class specified as as string, but I haven't looked into the parser concerning that. Another suggestion: It would be better if windres worked more like a linker, that is it would take multiple input files and produce one single output file. It wouldn't be too difficult to modify windres to use a global resource directory that all resource parser routines add resources to. That way it would be possible to specify COFF, RES, executable and resource scripts as input and get one single output file. Best wishes /Anders Norlander --------------0FF6D0FCD74BC9B46B0A1CBA Content-Type: application/x-unknown-content-type-WinZip; name="windres-res_sup.tar" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="windres-res_sup.tar" cmVzcmVzLmMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEwMDY0NCAA ICAgNzY0IAAgICAxNDQgACAgICAgIDM1NjczICA2NTY0MzEyNjMwICAxMDc0NgAgMAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZXZlcnlvbmUAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAjaW5jbHVkZSA8YXNzZXJ0Lmg+DQojaW5jbHVk ZSA8c3RkaW8uaD4NCiNpbmNsdWRlIDxlcnJuby5oPg0KDQojaW5jbHVkZSAid2luZHJlcy5o Ig0KDQpzdHJ1Y3QgcmVzX2hkcg0Kew0KICB1bnNpZ25lZCBsb25nIGRhdGFfc2l6ZTsNCiAg dW5zaWduZWQgbG9uZyBoZWFkZXJfc2l6ZTsNCn07DQoNCnN0YXRpYyB2b2lkIHdyaXRlX3Jl c19kaXJlY3RvcnkNCiAgUEFSQU1TKChjb25zdCBzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqLA0K CSAgY29uc3Qgc3RydWN0IHJlc19pZCAqLGNvbnN0IHN0cnVjdCByZXNfaWQgKiwNCgkgIGlu dCAqLCBpbnQpKTsNCnN0YXRpYyB2b2lkIHdyaXRlX3Jlc19yZXNvdXJjZQ0KICBQQVJBTVMo KGNvbnN0IHN0cnVjdCByZXNfaWQgKixjb25zdCBzdHJ1Y3QgcmVzX2lkICosDQoJICBjb25z dCBzdHJ1Y3QgcmVzX3Jlc291cmNlICosaW50ICopKTsNCnN0YXRpYyB2b2lkIHdyaXRlX3Jl c19iaW4NClBBUkFNUygoY29uc3Qgc3RydWN0IHJlc19yZXNvdXJjZSAqLCBjb25zdCBzdHJ1 Y3QgcmVzX2lkICosDQoJY29uc3Qgc3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVz X3Jlc19pbmZvICopKTsNCg0Kc3RhdGljIHZvaWQgd3JpdGVfcmVzX2lkIFBBUkFNUygoY29u c3Qgc3RydWN0IHJlc19pZCAqKSk7DQpzdGF0aWMgdm9pZCB3cml0ZV9yZXNfaW5mbyBQQVJB TVMoKGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKikpOw0Kc3RhdGljIHZvaWQgd3JpdGVf cmVzX2RhdGEgUEFSQU1TKChjb25zdCB2b2lkICosIHNpemVfdCwgaW50KSk7DQpzdGF0aWMg dm9pZCB3cml0ZV9yZXNfaGVhZGVyDQogIFBBUkFNUygodW5zaWduZWQgbG9uZywgY29uc3Qg c3RydWN0IHJlc19pZCAqLCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosDQoJICBjb25zdCBzdHJ1 Y3QgcmVzX3Jlc19pbmZvICopKTsNCg0Kc3RhdGljIGludCByZWFkX3Jlc291cmNlX2VudHJ5 IFBBUkFNUygodm9pZCkpOw0Kc3RhdGljIHZvaWQgcmVhZF9yZXNfZGF0YSBQQVJBTVMoKHZv aWQgKiwgc2l6ZV90LCBpbnQpKTsNCnN0YXRpYyB2b2lkIHJlYWRfcmVzX2lkIFBBUkFNUygo c3RydWN0IHJlc19pZCAqKSk7DQpzdGF0aWMgdW5pY2hhciAqcmVhZF91bmlzdHJpbmcgUEFS QU1TKChpbnQgKikpOw0Kc3RhdGljIHZvaWQgc2tpcF9udWxsX3Jlc291cmNlIFBBUkFNUygo dm9pZCkpOw0KDQpzdGF0aWMgdW5zaWduZWQgbG9uZyBnZXRfaWRfc2l6ZSBQQVJBTVMoKGNv bnN0IHN0cnVjdCByZXNfaWQgKikpOw0Kc3RhdGljIHZvaWQgcmVzX2FsaWduX2ZpbGUgUEFS QU1TKCh2b2lkKSk7DQoNCnN0YXRpYyB2b2lkDQpyZXNfYWRkX3Jlc291cmNlDQogIFBBUkFN Uygoc3RydWN0IHJlc19yZXNvdXJjZSAqLGNvbnN0IHN0cnVjdCByZXNfaWQgKiwNCgkgIGNv bnN0IHN0cnVjdCByZXNfaWQgKixpbnQsaW50KSk7DQoNCnZvaWQNCnJlc19hcHBlbmRfcmVz b3VyY2UNCiAgUEFSQU1TKChzdHJ1Y3QgcmVzX2RpcmVjdG9yeSAqKiwgc3RydWN0IHJlc19y ZXNvdXJjZSAqLA0KCSAgaW50LCBjb25zdCBzdHJ1Y3QgcmVzX2lkICosIGludCkpOw0KDQpz dGF0aWMgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJlc291cmNlcyA9IE5VTEw7DQoNCnN0YXRp YyBGSUxFICpmcmVzOw0Kc3RhdGljIGNvbnN0IGNoYXIgKmZpbGVuYW1lOw0KDQpleHRlcm4g Y2hhciAqcHJvZ3JhbV9uYW1lOw0KDQovKiBSZWFkIHJlc291cmNlIGZpbGUgKi8NCnN0cnVj dCByZXNfZGlyZWN0b3J5ICoNCnJlYWRfcmVzX2ZpbGUgKGZuKQ0KICAgICBjb25zdCBjaGFy ICpmbjsNCnsNCiAgZmlsZW5hbWUgPSBmbjsNCiAgZnJlcyA9IGZvcGVuKGZpbGVuYW1lLCAi cmIiKTsNCiAgaWYgKGZyZXMgPT0gTlVMTCkNCiAgICBmYXRhbCAoImNhbid0IG9wZW4gYCVz JyBmb3Igb3V0cHV0OiAlcyIsIGZpbGVuYW1lLCBzdHJlcnJvciAoZXJybm8pKTsNCg0KICBz a2lwX251bGxfcmVzb3VyY2UoKTsNCg0KICB3aGlsZSAocmVhZF9yZXNvdXJjZV9lbnRyeSgp KQ0KICAgIDsNCg0KICBmY2xvc2UoZnJlcyk7DQoNCiAgcmV0dXJuIHJlc291cmNlczsNCn0N Cg0KLyogV3JpdGUgcmVzb3VyY2UgZmlsZSAqLw0Kdm9pZA0Kd3JpdGVfcmVzX2ZpbGUgKGZu LCByZXNkaXIpDQogICAgIGNvbnN0IGNoYXIgKmZuOw0KICAgICBjb25zdCBzdHJ1Y3QgcmVz X2RpcmVjdG9yeSAqcmVzZGlyOw0Kew0KICBpbnQgbGFuZ3VhZ2U7DQogIHN0YXRpYyBjb25z dCB1bnNpZ25lZCBjaGFyIHNpZ25bXSA9DQogIHsweDAwLCAweDAwLCAweDAwLCAweDAwLCAw eDIwLCAweDAwLCAweDAwLCAweDAwLA0KICAgMHhGRiwgMHhGRiwgMHgwMCwgMHgwMCwgMHhG RiwgMHhGRiwgMHgwMCwgMHgwMCwNCiAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAs IDB4MDAsIDB4MDAsIDB4MDAsDQogICAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAw eDAwLCAweDAwLCAweDAwfTsNCiAgbG9uZyBmcG9zOw0KICBzdHJ1Y3QgcmVzX2VudHJ5ICpl Ow0KICBpbnQgaTsNCg0KICBmaWxlbmFtZSA9IGZuOw0KDQogIGZyZXMgPSBmb3BlbihmaWxl bmFtZSwgIndiIik7DQogIGlmIChmcmVzID09IE5VTEwpDQogICAgZmF0YWwgKCJjYW4ndCBv cGVuIGAlcycgZm9yIG91dHB1dDogJXMiLCBmaWxlbmFtZSwgc3RyZXJyb3IgKGVycm5vKSk7 DQogIA0KICAvKiBXcml0ZSAzMiBiaXQgcmVzb3VyY2Ugc2lnbmF0dXJlICovDQogIHdyaXRl X3Jlc19kYXRhKHNpZ24sIHNpemVvZihzaWduKSwgMSk7DQoNCiAgLyogd3JpdGUgcmVzb3Vy Y2VzICovDQoNCiAgbGFuZ3VhZ2UgPSAtMTsNCiAgd3JpdGVfcmVzX2RpcmVjdG9yeSAocmVz ZGlyLCAoY29uc3Qgc3RydWN0IHJlc19pZCAqKSBOVUxMLA0KCQkgICAgICAgKGNvbnN0IHN0 cnVjdCByZXNfaWQgKikgTlVMTCwgJmxhbmd1YWdlLCAxKTsNCiAgDQogIC8qIGVuZCBmaWxl IG9uIERXT1JEIGJvdW5kYXJ5ICovDQogIGZwb3MgPSBmdGVsbChmcmVzKTsNCiAgaWYgKGZw b3MgJSA0KQ0KICAgIHdyaXRlX3Jlc19kYXRhKHNpZ24sIGZwb3MgJSA0LCAxKTsNCiAgDQog IGZjbG9zZShmcmVzKTsNCn0NCg0KLyogUmVhZCBhIHJlc291cmNlIGVudHJ5LCByZXR1cm5z IDAgd2hlbiBhbGwgcmVzb3VyY2VzIGFyZSByZWFkICovDQpzdGF0aWMgaW50DQpyZWFkX3Jl c291cmNlX2VudHJ5KHZvaWQpDQp7DQogIHN0cnVjdCByZXNfaWQgdHlwZTsNCiAgc3RydWN0 IHJlc19pZCBuYW1lOw0KICBzdHJ1Y3QgcmVzX3Jlc19pbmZvIHJlc2luZm87DQogIHN0cnVj dCByZXNfaGRyIHJlc2hkcjsNCiAgZW51bSByZXNfdHlwZSBydHlwZTsNCiAgbG9uZyB2ZXJz aW9uOw0KICBsb25nIG47DQogIHZvaWQgKmJ1ZmY7DQoNCiAgc3RydWN0IHJlc19yZXNvdXJj ZSAqcjsNCg0KICByZXNfYWxpZ25fZmlsZSgpOw0KDQogIC8qIFJlYWQgaGVhZGVyICovDQog IGlmIChmcmVhZCgmcmVzaGRyLCBzaXplb2YocmVzaGRyKSwgMSwgZnJlcykgIT0gMSkNCiAg ICByZXR1cm4gMDsNCiAgZnByaW50ZihzdGRlcnIsICJkYXRhX3NpemU6ICVkXG5oZWFkZXJf c2l6ZTogJWRcbiIsDQoJICByZXNoZHIuZGF0YV9zaXplLCByZXNoZHIuaGVhZGVyX3NpemUp Ow0KICANCiAgLyogcmVhZCByZXNvdXJjZSB0eXBlICovDQogIHJlYWRfcmVzX2lkKCZ0eXBl KTsNCiAgLyogcmVhZCByZXNvdXJjZSBpZCovDQogIHJlYWRfcmVzX2lkKCZuYW1lKTsNCg0K ICByZXNfYWxpZ25fZmlsZSgpOw0KDQogIC8qIFJlYWQgYWRkaXRpb25hbCByZXNvdXJjZSBo ZWFkZXIgKi8NCiAgcmVhZF9yZXNfZGF0YSgmcmVzaW5mby52ZXJzaW9uLCBzaXplb2YocmVz aW5mby52ZXJzaW9uKSwgMSk7DQogIHJlYWRfcmVzX2RhdGEoJnJlc2luZm8ubWVtZmxhZ3Ms IHNpemVvZihyZXNpbmZvLm1lbWZsYWdzKSwgMSk7DQogIHJlYWRfcmVzX2RhdGEoJnJlc2lu Zm8ubGFuZ3VhZ2UsIHNpemVvZihyZXNpbmZvLmxhbmd1YWdlKSwgMSk7DQogIHJlYWRfcmVz X2RhdGEoJnZlcnNpb24sIHNpemVvZih2ZXJzaW9uKSwgMSk7DQogIHJlYWRfcmVzX2RhdGEo JnJlc2luZm8uY2hhcmFjdGVyaXN0aWNzLCBzaXplb2YocmVzaW5mby5jaGFyYWN0ZXJpc3Rp Y3MpLCAxKTsNCg0KICByZXNfYWxpZ25fZmlsZSgpOw0KDQogIC8qIEFsbG9jYXRlIGJ1ZmZl ciBmb3IgZGF0YSAqLw0KICBidWZmID0gcmVzX2FsbG9jKHJlc2hkci5kYXRhX3NpemUpOw0K ICAvKiBSZWFkIGRhdGEgKi8NCiAgcmVhZF9yZXNfZGF0YShidWZmLCByZXNoZHIuZGF0YV9z aXplLCAxKTsNCiAgLyogQ29udmVydCBiaW5hcnkgZGF0YSB0byByZXNvdXJjZSAqLw0KICBy ID0gYmluX3RvX3Jlcyh0eXBlLCBidWZmLCByZXNoZHIuZGF0YV9zaXplLCAwKTsNCiAgci0+ cmVzX2luZm8gPSByZXNpbmZvOw0KICAvKiBBZGQgcmVzb3VyY2UgdG8gcmVzb3VyY2UgZGly ZWN0b3J5ICovDQogIHJlc19hZGRfcmVzb3VyY2UociwgJnR5cGUsICZuYW1lLCByZXNpbmZv Lmxhbmd1YWdlLCAwKTsNCg0KICByZXR1cm4gMTsNCn0NCg0KLyogd3JpdGUgcmVzb3VyY2Ug ZGlyZWN0b3J5IHRvIGJpbmFyeSByZXNvdXJjZSBmaWxlICovDQpzdGF0aWMgdm9pZA0Kd3Jp dGVfcmVzX2RpcmVjdG9yeSAocmQsIHR5cGUsIG5hbWUsIGxhbmd1YWdlLCBsZXZlbCkNCiAg ICAgY29uc3Qgc3RydWN0IHJlc19kaXJlY3RvcnkgKnJkOw0KICAgICBjb25zdCBzdHJ1Y3Qg cmVzX2lkICp0eXBlOw0KICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOw0KICAgICBp bnQgKmxhbmd1YWdlOw0KICAgICBpbnQgbGV2ZWw7DQp7DQogIGNvbnN0IHN0cnVjdCByZXNf ZW50cnkgKnJlOw0KDQogIGZvciAocmUgPSByZC0+ZW50cmllczsgIHJlICE9IE5VTEw7IHJl ID0gcmUtPm5leHQpDQogICAgew0KICAgICAgc3dpdGNoIChsZXZlbCkNCgl7DQoJY2FzZSAx Og0KCSAgLyogSWYgd2UncmUgYXQgbGV2ZWwgMSwgdGhlIGtleSBvZiB0aGlzIHJlc291cmNl IGlzIHRoZQ0KICAgICAgICAgICAgIHR5cGUuICBUaGlzIG5vcm1hbGx5IGR1cGxpY2F0ZXMg dGhlIGluZm9ybWF0aW9uIHdlIGhhdmUNCiAgICAgICAgICAgICBzdG9yZWQgd2l0aCB0aGUg cmVzb3VyY2UgaXRzZWxmLCBidXQgd2UgbmVlZCB0byByZW1lbWJlcg0KICAgICAgICAgICAg IHRoZSB0eXBlIGlmIHRoaXMgaXMgYSB1c2VyIGRlZmluZSByZXNvdXJjZSB0eXBlLiAgKi8N CgkgIHR5cGUgPSAmcmUtPmlkOw0KCSAgYnJlYWs7DQoNCgljYXNlIDI6DQoJICAvKiBJZiB3 ZSdyZSBhdCBsZXZlbCAyLCB0aGUga2V5IG9mIHRoaXMgcmVzb3VyY2UgaXMgdGhlIG5hbWUN CgkgICAgIHdlIGFyZSBnb2luZyB0byB1c2UgaW4gdGhlIHJjIHByaW50b3V0LiAqLw0KCSAg bmFtZSA9ICZyZS0+aWQ7DQoJICBicmVhazsNCg0KCWNhc2UgMzoNCgkgIC8qIElmIHdlJ3Jl IGF0IGxldmVsIDMsIHRoZW4gdGhpcyBrZXkgcmVwcmVzZW50cyBhIGxhbmd1YWdlLg0KCSAg ICAgVXNlIGl0IHRvIHVwZGF0ZSB0aGUgY3VycmVudCBsYW5ndWFnZS4gICovDQoJICBpZiAo ISByZS0+aWQubmFtZWQNCgkgICAgICAmJiByZS0+aWQudS5pZCAhPSAqbGFuZ3VhZ2UNCgkg ICAgICAmJiAocmUtPmlkLnUuaWQgJiAweGZmZmYpID09IHJlLT5pZC51LmlkKQ0KCSAgICB7 DQoJICAgICAgKmxhbmd1YWdlID0gcmUtPmlkLnUuaWQ7DQoJICAgIH0NCgkgIGJyZWFrOw0K DQoJZGVmYXVsdDoNCgkgIGJyZWFrOw0KCX0NCg0KICAgICAgaWYgKHJlLT5zdWJkaXIpDQoJ d3JpdGVfcmVzX2RpcmVjdG9yeSAocmUtPnUuZGlyLCB0eXBlLCBuYW1lLCBsYW5ndWFnZSwg bGV2ZWwgKyAxKTsNCiAgICAgIGVsc2UNCgl7DQoJICBpZiAobGV2ZWwgPT0gMykNCgkgICAg ew0KCSAgICAgIC8qIFRoaXMgaXMgdGhlIG5vcm1hbCBjYXNlOiB0aGUgdGhyZWUgbGV2ZWxz IGFyZQ0KICAgICAgICAgICAgICAgICBUWVBFL05BTUUvTEFOR1VBR0UuICBOQU1FIHdpbGwg aGF2ZSBiZWVuIHNldCBhdCBsZXZlbA0KICAgICAgICAgICAgICAgICAyLCBhbmQgcmVwcmVz ZW50cyB0aGUgbmFtZSB0byB1c2UuICBXZSBwcm9iYWJseSBqdXN0DQogICAgICAgICAgICAg ICAgIHNldCBMQU5HVUFHRSwgYW5kIGl0IHdpbGwgcHJvYmFibHkgbWF0Y2ggd2hhdCB0aGUN CiAgICAgICAgICAgICAgICAgcmVzb3VyY2UgaXRzZWxmIHJlY29yZHMgaWYgYW55dGhpbmcu ICAqLw0KCSAgICAgIHdyaXRlX3Jlc19yZXNvdXJjZSAodHlwZSwgbmFtZSwgcmUtPnUucmVz LCBsYW5ndWFnZSk7DQoJICAgIH0NCgkgIGVsc2UNCgkgICAgew0KCSAgICAgIGZwcmludGYg KHN0ZGVyciwgIi8vIFJlc291cmNlIGF0IHVuZXhwZWN0ZWQgbGV2ZWwgJWRcbiIsIGxldmVs KTsNCgkgICAgICB3cml0ZV9yZXNfcmVzb3VyY2UgKHR5cGUsIChzdHJ1Y3QgcmVzX2lkICop IE5VTEwsIHJlLT51LnJlcywNCgkJCQkgbGFuZ3VhZ2UpOw0KCSAgICB9DQoJfQ0KICAgIH0N Cg0KfQ0KDQpzdGF0aWMgdm9pZA0Kd3JpdGVfcmVzX3Jlc291cmNlICh0eXBlLCBuYW1lLCBy ZXMsIGxhbmd1YWdlKQ0KICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOw0KICAgICBj b25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOw0KICAgICBjb25zdCBzdHJ1Y3QgcmVzX3Jlc291 cmNlICpyZXM7DQogICAgIGludCAqbGFuZ3VhZ2U7DQp7DQogIGludCBydDsNCg0KICBzd2l0 Y2ggKHJlcy0+dHlwZSkNCiAgICB7DQogICAgZGVmYXVsdDoNCiAgICAgIGFib3J0ICgpOw0K DQogICAgY2FzZSBSRVNfVFlQRV9BQ0NFTEVSQVRPUjoNCiAgICAgIHJ0ID0gUlRfQUNDRUxF UkFUT1JTOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIFJFU19UWVBFX0JJVE1BUDoNCiAg ICAgIHJ0ID0gUlRfQklUTUFQOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIFJFU19UWVBF X0NVUlNPUjoNCiAgICAgIHJ0ID0gUlRfQ1VSU09SOw0KICAgICAgYnJlYWs7DQoNCiAgICBj YXNlIFJFU19UWVBFX0dST1VQX0NVUlNPUjoNCiAgICAgIHJ0ID0gUlRfR1JPVVBfQ1VSU09S Ow0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIFJFU19UWVBFX0RJQUxPRzoNCiAgICAgIHJ0 ID0gUlRfRElBTE9HOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIFJFU19UWVBFX0ZPTlQ6 DQogICAgICBydCA9IFJUX0ZPTlQ7DQogICAgICBicmVhazsNCg0KICAgIGNhc2UgUkVTX1RZ UEVfRk9OVERJUjoNCiAgICAgIHJ0ID0gUlRfRk9OVERJUjsNCiAgICAgIGJyZWFrOw0KDQog ICAgY2FzZSBSRVNfVFlQRV9JQ09OOg0KICAgICAgcnQgPSBSVF9JQ09OOw0KICAgICAgYnJl YWs7DQoNCiAgICBjYXNlIFJFU19UWVBFX0dST1VQX0lDT046DQogICAgICBydCA9IFJUX0dS T1VQX0lDT047DQogICAgICBicmVhazsNCg0KICAgIGNhc2UgUkVTX1RZUEVfTUVOVToNCiAg ICAgIHJ0ID0gUlRfTUVOVTsNCiAgICAgIGJyZWFrOw0KDQogICAgY2FzZSBSRVNfVFlQRV9N RVNTQUdFVEFCTEU6DQogICAgICBydCA9IFJUX01FU1NBR0VUQUJMRTsNCiAgICAgIGJyZWFr Ow0KDQogICAgY2FzZSBSRVNfVFlQRV9SQ0RBVEE6DQogICAgICBydCA9IFJUX1JDREFUQTsN CiAgICAgIGJyZWFrOw0KDQogICAgY2FzZSBSRVNfVFlQRV9TVFJJTkdUQUJMRToNCiAgICAg IHJ0ID0gUlRfU1RSSU5HOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIFJFU19UWVBFX1VT RVJEQVRBOg0KICAgICAgcnQgPSAwOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIFJFU19U WVBFX1ZFUlNJT05JTkZPOg0KICAgICAgcnQgPSBSVF9WRVJTSU9OOw0KICAgICAgYnJlYWs7 DQogICAgfQ0KDQogIGlmIChydCAhPSAwDQogICAgICAmJiB0eXBlICE9IE5VTEwNCiAgICAg ICYmICh0eXBlLT5uYW1lZCB8fCB0eXBlLT51LmlkICE9IHJ0KSkNCiAgICB7DQogICAgICBm cHJpbnRmIChzdGRlcnIsICIvLyBVbmV4cGVjdGVkIHJlc291cmNlIHR5cGUgbWlzbWF0Y2g6 ICIpOw0KICAgICAgcmVzX2lkX3ByaW50IChzdGRlcnIsICp0eXBlLCAxKTsNCiAgICAgIGZw cmludGYgKHN0ZGVyciwgIiAhPSAlZCIsIHJ0KTsNCiAgICAgIGFib3J0KCk7DQogICAgfQ0K DQogIHdyaXRlX3Jlc19iaW4ocmVzLCB0eXBlLCBuYW1lLCAmcmVzLT5yZXNfaW5mbyk7DQog IHJldHVybjsNCn0NCg0KLyogV3JpdGUgYSByZXNvdXJjZSBpbiBiaW5hcnkgcmVzb3VyY2Ug Zm9ybWF0ICovDQpzdGF0aWMgdm9pZA0Kd3JpdGVfcmVzX2JpbihyZXMsIHR5cGUsIG5hbWUs IHJlc2luZm8pDQogICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzb3VyY2UgKnJlczsNCiAgICAg Y29uc3Qgc3RydWN0IHJlc19pZCAqdHlwZTsNCiAgICAgY29uc3Qgc3RydWN0IHJlc19pZCAq bmFtZTsNCiAgICAgY29uc3Qgc3RydWN0IHJlc19yZXNfaW5mbyAqcmVzaW5mbzsNCnsNCiAg dW5zaWduZWQgbG9uZyBkYXRhc2l6ZSA9IDA7DQogIGNvbnN0IHN0cnVjdCBiaW5kYXRhICpi aW5fcmVwLCAqZGF0YTsNCg0KICBiaW5fcmVwID0gcmVzX3RvX2JpbihyZXMsIDApOw0KICBm b3IgKGRhdGEgPSBiaW5fcmVwOyBkYXRhICE9IE5VTEw7IGRhdGEgPSBkYXRhLT5uZXh0KQ0K ICAgIGRhdGFzaXplICs9IGRhdGEtPmxlbmd0aDsNCiAgDQogIHdyaXRlX3Jlc19oZWFkZXIo ZGF0YXNpemUsIHR5cGUsIG5hbWUsIHJlc2luZm8pOw0KDQogIGZvciAoZGF0YSA9IGJpbl9y ZXA7IGRhdGEgIT0gTlVMTDsgZGF0YSA9IGRhdGEtPm5leHQpDQogICAgd3JpdGVfcmVzX2Rh dGEoZGF0YS0+ZGF0YSwgZGF0YS0+bGVuZ3RoLCAxKTsNCn0NCg0KLyogR2V0IG51bWJlciBv ZiBieXRlcyBuZWVkZWQgdG8gc3RvcmUgYW4gaWQgaW4gYmluYXJ5IGZvcm1hdCAqLw0Kc3Rh dGljIHVuc2lnbmVkIGxvbmcNCmdldF9pZF9zaXplKGlkKQ0KICAgICBjb25zdCBzdHJ1Y3Qg cmVzX2lkICppZDsNCnsNCiAgaWYgKGlkLT5uYW1lZCkNCiAgICByZXR1cm4gc2l6ZW9mKHVu aWNoYXIpICogKGlkLT51Lm4ubGVuZ3RoICsgMSk7DQogIGVsc2UNCiAgICByZXR1cm4gc2l6 ZW9mKHVuaWNoYXIpICogMjsNCn0NCg0KLyogV3JpdGUgYSByZXNvdXJjZSBoZWFkZXIgKi8N CnN0YXRpYyB2b2lkDQp3cml0ZV9yZXNfaGVhZGVyKGRhdGFzaXplLHR5cGUsbmFtZSxyZXNp bmZvKQ0KICAgICB1bnNpZ25lZCBsb25nIGRhdGFzaXplOw0KICAgICBjb25zdCBzdHJ1Y3Qg cmVzX2lkICp0eXBlOw0KICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICpuYW1lOw0KICAgICBj b25zdCBzdHJ1Y3QgcmVzX3Jlc19pbmZvICpyZXNpbmZvOw0Kew0KICBzdHJ1Y3QgcmVzX2hk ciByZXNoZHI7DQogIHJlc2hkci5kYXRhX3NpemUgPSBkYXRhc2l6ZTsNCiAgcmVzaGRyLmhl YWRlcl9zaXplID0gMjQgKyBnZXRfaWRfc2l6ZSh0eXBlKSArIGdldF9pZF9zaXplKG5hbWUp Ow0KDQogIHJlc19hbGlnbl9maWxlKCk7DQogIHdyaXRlX3Jlc19kYXRhKCZyZXNoZHIsIHNp emVvZihyZXNoZHIpLCAxKTsNCiAgd3JpdGVfcmVzX2lkKHR5cGUpOw0KICB3cml0ZV9yZXNf aWQobmFtZSk7DQoNCiAgcmVzX2FsaWduX2ZpbGUoKTsNCg0KICB3cml0ZV9yZXNfaW5mbyhy ZXNpbmZvKTsNCiAgcmVzX2FsaWduX2ZpbGUoKTsNCn0NCg0KDQovKiBXcml0ZSBkYXRhIHRv IGZpbGUsIGFib3J0IG9uIGZhaWx1cmUgKi8NCnN0YXRpYyB2b2lkDQp3cml0ZV9yZXNfZGF0 YShkYXRhLCBzaXplLCBjb3VudCkNCiAgICAgY29uc3Qgdm9pZCAqZGF0YTsNCiAgICAgc2l6 ZV90IHNpemU7DQogICAgIGludCBjb3VudDsNCnsNCiAgaWYgKGZ3cml0ZShkYXRhLCBzaXpl LCBjb3VudCwgZnJlcykgIT0gY291bnQpDQogICAgZmF0YWwoIiVzOiAlczogY291bGQgbm90 IHdyaXRlIHRvIGZpbGUiLCBwcm9ncmFtX25hbWUsIGZpbGVuYW1lKTsNCn0NCg0KLyogUmVh ZCBkYXRhIGZyb20gZmlsZSwgYWJvcnQgb24gZmFpbHVyZSAqLw0Kc3RhdGljIHZvaWQNCnJl YWRfcmVzX2RhdGEoZGF0YSwgc2l6ZSwgY291bnQpDQogICAgIHZvaWQgKmRhdGE7DQogICAg IHNpemVfdCBzaXplOw0KICAgICBpbnQgY291bnQ7DQp7DQogIGlmIChmcmVhZChkYXRhLCBz aXplLCBjb3VudCwgZnJlcykgIT0gY291bnQpDQogICAgZmF0YWwoIiVzOiAlczogdW5leHBl Y3RlZCBlbmQgb2YgZmlsZSIsIHByb2dyYW1fbmFtZSwgZmlsZW5hbWUpOw0KfQ0KDQovKiBX cml0ZSBhIHJlc291cmNlIGlkICovDQpzdGF0aWMgdm9pZA0Kd3JpdGVfcmVzX2lkKGlkKQ0K ICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICppZDsNCnsNCiAgaWYgKGlkLT5uYW1lZCkNCiAg ICB7DQogICAgICB1bnNpZ25lZCBsb25nIGxlbiA9IGlkLT51Lm4ubGVuZ3RoOw0KICAgICAg dW5pY2hhciBudWxsX3Rlcm0gPSAwOw0KICAgICAgd3JpdGVfcmVzX2RhdGEoaWQtPnUubi5u YW1lLCBsZW4gKiBzaXplb2YodW5pY2hhciksIDEpOw0KICAgICAgd3JpdGVfcmVzX2RhdGEo Jm51bGxfdGVybSwgc2l6ZW9mKG51bGxfdGVybSksIDEpOw0KICAgIH0NCiAgZWxzZQ0KICAg IHsNCiAgICAgIHVuc2lnbmVkIHNob3J0IGkgPSAweEZGRkY7DQogICAgICB3cml0ZV9yZXNf ZGF0YSgmaSwgc2l6ZW9mKGkpLCAxKTsNCiAgICAgIGkgPSBpZC0+dS5pZDsNCiAgICAgIHdy aXRlX3Jlc19kYXRhKCZpLCBzaXplb2YoaSksIDEpOw0KICAgIH0NCn0NCg0KLyogV3JpdGUg cmVzb3VyY2UgaW5mbyAqLw0Kc3RhdGljIHZvaWQNCndyaXRlX3Jlc19pbmZvKGluZm8pDQog ICAgIGNvbnN0IHN0cnVjdCByZXNfcmVzX2luZm8gKmluZm87DQp7DQogIHdyaXRlX3Jlc19k YXRhKCZpbmZvLT52ZXJzaW9uLCBzaXplb2YoaW5mby0+dmVyc2lvbiksIDEpOw0KICB3cml0 ZV9yZXNfZGF0YSgmaW5mby0+bWVtZmxhZ3MsIHNpemVvZihpbmZvLT5tZW1mbGFncyksIDEp Ow0KICB3cml0ZV9yZXNfZGF0YSgmaW5mby0+bGFuZ3VhZ2UsIHNpemVvZihpbmZvLT5sYW5n dWFnZSksIDEpOw0KICB3cml0ZV9yZXNfZGF0YSgmaW5mby0+dmVyc2lvbiwgc2l6ZW9mKGlu Zm8tPnZlcnNpb24pLCAxKTsNCiAgd3JpdGVfcmVzX2RhdGEoJmluZm8tPmNoYXJhY3Rlcmlz dGljcywgc2l6ZW9mKGluZm8tPmNoYXJhY3RlcmlzdGljcyksIDEpOw0KfQ0KDQovKiByZWFk IGEgcmVzb3VyY2UgaWRlbnRpZmllciAqLw0Kdm9pZCByZWFkX3Jlc19pZChpZCkNCiAgICAg c3RydWN0IHJlc19pZCAqaWQ7DQp7DQogIHVuc2lnbmVkIHNob3J0IG9yZDsNCiAgdW5pY2hh ciAqaWRfcyA9IE5VTEw7DQogIGludCBsZW47DQoNCiAgcmVhZF9yZXNfZGF0YSgmb3JkLCBz aXplb2Yob3JkKSwgMSk7DQogIGlmIChvcmQgPT0gMHhGRkZGKSAvKiBhbiBvcmRpbmFsIGlk ICovDQogICAgew0KICAgICAgcmVhZF9yZXNfZGF0YSgmb3JkLCBzaXplb2Yob3JkKSwgMSk7 DQogICAgICBpZC0+bmFtZWQgPSAwOw0KICAgICAgaWQtPnUuaWQgPSBvcmQ7DQogICAgfQ0K ICBlbHNlIC8qIG5hbWVkIGlkICovDQogICAgew0KICAgICAgaWYgKGZzZWVrKGZyZXMsIC1z aXplb2Yob3JkKSwgU0VFS19DVVIpICE9IDApDQoJZmF0YWwoIiVzOiAlczogY291bGQgbm90 IHNlZWsgaW4gZmlsZSIsIHByb2dyYW1fbmFtZSwgZmlsZW5hbWUpOw0KICAgICAgaWRfcyA9 IHJlYWRfdW5pc3RyaW5nKCZsZW4pOw0KICAgICAgaWQtPm5hbWVkID0gMTsNCiAgICAgIGlk LT51Lm4ubGVuZ3RoID0gbGVuOw0KICAgICAgaWQtPnUubi5uYW1lID0gaWRfczsNCiAgICB9 DQp9DQoNCi8qIFJlYWQgYSBudWxsIHRlcm1pbmF0ZWQgVU5JQ09ERSBzdHJpbmcgKi8NCnN0 YXRpYyB1bmljaGFyICoNCnJlYWRfdW5pc3RyaW5nKGxlbikNCiAgICAgaW50ICpsZW47DQp7 DQogIHVuaWNoYXIgKnM7DQogIHVuaWNoYXIgYzsNCiAgdW5pY2hhciAqcDsNCiAgaW50IG47 DQogIGludCBsOw0KDQogICpsZW4gPSAwOw0KICBsID0gMDsNCiAgDQogIC8qIHRoZXJlIGFy ZSBoYXJkbHkgYW55IG5hbWVzIGxvbmdlciB0aGFuIDI1NiBjaGFyYWN0ZXJzICovDQogIHAg PSBzID0gKHVuaWNoYXIgKikgeG1hbGxvYyhzaXplb2YodW5pY2hhcikgKiAyNTYpOyANCiAg ZG8gDQogICAgew0KICAgICAgcmVhZF9yZXNfZGF0YSgmYywgc2l6ZW9mKGMpLCAxKTsNCiAg ICAgICpwKysgPSBjOw0KICAgICAgaWYgKGMgIT0gMCkNCglsKys7DQogICAgfQ0KICB3aGls ZSAoYyAhPSAwKTsNCiAgKmxlbiA9IGw7DQogIHJldHVybiBzOw0KfQ0KDQovKiBhbGlnbiBm aWxlIG9uIERXT1JEIGJvdW5kYXJ5ICovDQpzdGF0aWMgdm9pZA0KcmVzX2FsaWduX2ZpbGUo dm9pZCkNCnsNCiAgaWYgKGZzZWVrKGZyZXMsIGZ0ZWxsKGZyZXMpICUgNCwgU0VFS19DVVIp ICE9IDApDQogICAgZmF0YWwoIiVzOiAlczogdW5hYmxlIHRvIGFsaWduIGZpbGUiLCBwcm9n cmFtX25hbWUsIGZpbGVuYW1lKTsNCn0NCg0KLyogQ2hlY2sgaWYgZmlsZSBpcyBhIHdpbjMy IGJpbmFyeSByZXNvdXJjZSBmaWxlLCBpZiBzbw0KICAgc2tpcCBwYXN0IHRoZSBudWxsIHJl c291cmNlLiBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bCwgLTEgb24NCiAgIGVycm9yLg0KICov DQpzdGF0aWMgdm9pZA0Kc2tpcF9udWxsX3Jlc291cmNlKHZvaWQpDQp7DQogIHN0cnVjdCBy ZXNfaGRyIHJlc2hkciA9IHswLDB9Ow0KICByZWFkX3Jlc19kYXRhKCZyZXNoZHIsIHNpemVv ZihyZXNoZHIpLCAxKTsNCiAgaWYgKChyZXNoZHIuZGF0YV9zaXplICE9IDApIHx8IChyZXNo ZHIuaGVhZGVyX3NpemUgIT0gMHgyMCkpDQogICAgZ290byBza2lwX2VycjsNCiAgDQogIC8q IFN1YnRyYWN0IHNpemUgb2YgSGVhZGVyU2l6ZSBhbmQgRGF0YVNpemUgKi8NCiAgaWYgKGZz ZWVrKGZyZXMsIHJlc2hkci5oZWFkZXJfc2l6ZSAtIDgsIFNFRUtfQ1VSKSAhPSAwKQ0KICAg IGdvdG8gc2tpcF9lcnI7DQoNCiAgcmV0dXJuOw0KDQpza2lwX2VycjoNCiAgZnByaW50Zihz dGRlcnIsICIlczogJXM6IE5vdCBhIHZhbGlkIFdJTjMyIHJlc291cmNlIGZpbGVcbiIsIHBy b2dyYW1fbmFtZSwNCgkgIGZpbGVuYW1lKTsNCiAgeGV4aXQoMSk7DQp9DQoNCi8qIEFkZCBh IHJlc291cmNlIHRvIHJlc291cmNlIGRpcmVjdG9yeSAqLw0Kdm9pZA0KcmVzX2FkZF9yZXNv dXJjZSAocix0eXBlLGlkLGxhbmd1YWdlLGR1cG9rKQ0KICAgICBzdHJ1Y3QgcmVzX3Jlc291 cmNlICpyOw0KICAgICBjb25zdCBzdHJ1Y3QgcmVzX2lkICp0eXBlOw0KICAgICBjb25zdCBz dHJ1Y3QgcmVzX2lkICppZDsNCiAgICAgaW50IGxhbmd1YWdlOw0KICAgICBpbnQgZHVwb2s7 DQp7DQogIHN0cnVjdCByZXNfaWQgYVszXTsNCg0KICBhWzBdID0gKnR5cGU7DQogIGFbMV0g PSAqaWQ7DQogIGFbMl0ubmFtZWQgPSAwOw0KICBhWzJdLnUuaWQgPSBsYW5ndWFnZTsNCiAg cmVzX2FwcGVuZF9yZXNvdXJjZSAoJnJlc291cmNlcywgciwgMywgYSwgZHVwb2spOw0KfQ0K DQovKiBBcHBlbmQgYSByZXNvdXJjZSB0byByZXNvdXJjZSBkaXJlY3RvcnkuDQogICBUaGlz IGlzIGp1c3QgY29waWVkIGZyb20gZGVmaW5lX3Jlc291cmNlDQogICBhbmQgbW9kaWZpZWQg dG8gYWRkIGFuIGV4aXN0aW5nIHJlc291cmNlLg0KKi8NCnZvaWQNCnJlc19hcHBlbmRfcmVz b3VyY2UgKHJlc291cmNlcywgcmVzb3VyY2UsIGNpZHMsIGlkcywgZHVwb2spDQogICAgIHN0 cnVjdCByZXNfZGlyZWN0b3J5ICoqcmVzb3VyY2VzOw0KICAgICBzdHJ1Y3QgcmVzX3Jlc291 cmNlICpyZXNvdXJjZTsNCiAgICAgaW50IGNpZHM7DQogICAgIGNvbnN0IHN0cnVjdCByZXNf aWQgKmlkczsNCiAgICAgaW50IGR1cG9rOw0Kew0KICBzdHJ1Y3QgcmVzX2VudHJ5ICpyZSA9 IE5VTEw7DQogIGludCBpOw0KDQogIGFzc2VydCAoY2lkcyA+IDApOw0KICBmb3IgKGkgPSAw OyBpIDwgY2lkczsgaSsrKQ0KICAgIHsNCiAgICAgIHN0cnVjdCByZXNfZW50cnkgKipwcDsN Cg0KICAgICAgaWYgKCpyZXNvdXJjZXMgPT0gTlVMTCkNCgl7DQoJICBzdGF0aWMgdW5zaWdu ZWQgbG9uZyB0aW1ldmFsOw0KDQoJICAvKiBVc2UgdGhlIHNhbWUgdGltZXN0YW1wIGZvciBl dmVyeSByZXNvdXJjZSBjcmVhdGVkIGluIGENCiAgICAgICAgICAgICBzaW5nbGUgcnVuLiAg Ki8NCgkgIGlmICh0aW1ldmFsID09IDApDQoJICAgIHRpbWV2YWwgPSB0aW1lIChOVUxMKTsN Cg0KCSAgKnJlc291cmNlcyA9ICgoc3RydWN0IHJlc19kaXJlY3RvcnkgKikNCgkJCXJlc19h bGxvYyAoc2l6ZW9mICoqcmVzb3VyY2VzKSk7DQoJICAoKnJlc291cmNlcyktPmNoYXJhY3Rl cmlzdGljcyA9IDA7DQoJICAoKnJlc291cmNlcyktPnRpbWUgPSB0aW1ldmFsOw0KCSAgKCpy ZXNvdXJjZXMpLT5tYWpvciA9IDA7DQoJICAoKnJlc291cmNlcyktPm1pbm9yID0gMDsNCgkg ICgqcmVzb3VyY2VzKS0+ZW50cmllcyA9IE5VTEw7DQoJfQ0KDQogICAgICBmb3IgKHBwID0g JigqcmVzb3VyY2VzKS0+ZW50cmllczsgKnBwICE9IE5VTEw7IHBwID0gJigqcHApLT5uZXh0 KQ0KCWlmIChyZXNfaWRfY21wICgoKnBwKS0+aWQsIGlkc1tpXSkgPT0gMCkNCgkgIGJyZWFr Ow0KDQogICAgICBpZiAoKnBwICE9IE5VTEwpDQoJcmUgPSAqcHA7DQogICAgICBlbHNlDQoJ ew0KCSAgcmUgPSAoc3RydWN0IHJlc19lbnRyeSAqKSByZXNfYWxsb2MgKHNpemVvZiAqcmUp Ow0KCSAgcmUtPm5leHQgPSBOVUxMOw0KCSAgcmUtPmlkID0gaWRzW2ldOw0KCSAgaWYgKChp ICsgMSkgPCBjaWRzKQ0KCSAgICB7DQoJICAgICAgcmUtPnN1YmRpciA9IDE7DQoJICAgICAg cmUtPnUuZGlyID0gTlVMTDsNCgkgICAgfQ0KCSAgZWxzZQ0KCSAgICB7DQoJICAgICAgcmUt PnN1YmRpciA9IDA7DQoJICAgICAgcmUtPnUucmVzID0gTlVMTDsNCgkgICAgfQ0KDQoJICAq cHAgPSByZTsNCgl9DQoNCiAgICAgIGlmICgoaSArIDEpIDwgY2lkcykNCgl7DQoJICBpZiAo ISByZS0+c3ViZGlyKQ0KCSAgICB7DQoJICAgICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIs IHByb2dyYW1fbmFtZSk7DQoJICAgICAgcmVzX2lkc19wcmludCAoc3RkZXJyLCBpLCBpZHMp Ow0KCSAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogZXhwZWN0ZWQgdG8gYmUgYSBkaXJlY3Rv cnlcbiIpOw0KCSAgICAgIHhleGl0ICgxKTsNCgkgICAgfQ0KDQoJICByZXNvdXJjZXMgPSAm cmUtPnUuZGlyOw0KCX0NCiAgICB9DQoNCiAgaWYgKHJlLT5zdWJkaXIpDQogICAgew0KICAg ICAgZnByaW50ZiAoc3RkZXJyLCAiJXM6ICIsIHByb2dyYW1fbmFtZSk7DQogICAgICByZXNf aWRzX3ByaW50IChzdGRlcnIsIGNpZHMsIGlkcyk7DQogICAgICBmcHJpbnRmIChzdGRlcnIs ICI6IGV4cGVjdGVkIHRvIGJlIGEgbGVhZlxuIik7DQogICAgICB4ZXhpdCAoMSk7DQogICAg fQ0KDQogIGlmIChyZS0+dS5yZXMgIT0gTlVMTCkNCiAgICB7DQogICAgICBpZiAoZHVwb2sp DQoJcmV0dXJuOw0KDQogICAgICBmcHJpbnRmIChzdGRlcnIsICIlczogd2FybmluZzogIiwg cHJvZ3JhbV9uYW1lKTsNCiAgICAgIHJlc19pZHNfcHJpbnQgKHN0ZGVyciwgY2lkcywgaWRz KTsNCiAgICAgIGZwcmludGYgKHN0ZGVyciwgIjogZHVwbGljYXRlIHZhbHVlXG4iKTsNCiAg ICB9DQoNCiAgcmUtPnUucmVzID0gcmVzb3VyY2U7DQp9DQoAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAByY3Bh cnNlLmRpZmYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMTAwNjQ0IAAgICA3 NjQgACAgIDE0NCAAICAgICAgICA2NDEgIDY1NjQzMTQ1MzIgIDExNTE2ACAwAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHVzdGFyICAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAABldmVyeW9uZQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAACoqKiByY3BhcnNlLnkub3JpZwlGcmkgTWF5IDAxIDE3 OjQ5OjM2IDE5OTgNCi0tLSByY3BhcnNlLnkJV2VkIEF1ZyAxMiAxNTozMToyMCAxOTk4DQoq KioqKioqKioqKioqKioNCioqKiA5ODgsOTkzICoqKioNCi0tLSA5ODgsOTk3IC0tLS0NCiAg CSAgew0KICAJICAgICQkID0gZGVmaW5lX21lbnVpdGVtICgkMiwgJDMsICQ0LCAkNSwgMCwg TlVMTCk7DQogIAkgIH0NCisgCXwgTUVOVUlURU0gU0VQQVJBVE9SDQorICAgICAgICAgICB7 DQorIAkgICAgJCQgPSBkZWZpbmVfbWVudWl0ZW0gKE5VTEwsIDAsIDAsIDAsIDAsIE5VTEwp Ow0KKyAJICB9DQogIAl8IFBPUFVQIFFVT1RFRFNUUklORyBCRUcgbWVudWV4aXRlbXMgRU5E DQogIAkgIHsNCiAgCSAgICAkJCA9IGRlZmluZV9tZW51aXRlbSAoJDIsIDAsIDAsIDAsIDAs ICQ0KTsNCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAcmouYwAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADEwMDY0NCAAICAgNzY0 IAAgICAxNDQgACAgICAgICA2MDI0ICA2NTY0MzEzNjM0ICAxMDAyNwAgMAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB1c3RhciAgAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAZXZlcnlvbmUAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAvKg0KICByaiAtIEEgcHJvZ3JhbSB0byBqb2luIFdJTjMy IHJlc291cmNlIGZpbGVzIHRvIG9uZSBzaW5nbGUgZmlsZQ0KICANCiAgVGhpcyBwcm9ncmFt IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBtYXkgcmVkaXN0cmlidXRlIGl0IHVuZGVyIHRoZQ0K ICB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBUaGlzIHByb2dy YW0gaGFzDQogIGFic29sdXRlbHkgbm8gd2FycmFudHkuDQogIA0KICBUaGlzIHByb2dyYW0g dG8gam9pbnMgc2V2ZXJhbCAuUkVTIGZpbGVzIGludG8gb25lIHNpbmdsZSBmaWxlIC5SRVMg ZmlsZS4NCg0KKi8NCg0KI2luY2x1ZGUgPHN0ZGlvLmg+DQojaW5jbHVkZSA8bGltaXRzLmg+ DQojaW5jbHVkZSA8c3RyaW5nLmg+DQojaW5jbHVkZSA8c3RkbGliLmg+DQoNCiNpbmNsdWRl ICJyai5oIg0KDQojaWZuZGVmIFBBVEhfTUFYDQojZGVmaW5lIFBBVEhfTUFYIDI2MA0KI2Vu ZGlmIC8qIFBBVEhfTUFYICovDQoNCi8qIE91dHB1dCBmaWxlICovDQpGSUxFICpmb3V0ID0g TlVMTDsNCg0KLyogTmFtZSBvZiBvdXRwdXQgZmlsZSAqLw0KY2hhciBvdXRwdXRfZmlsZW5h bWVbUEFUSF9NQVhdID0gIiI7DQoNCmNoYXIgKnByZ19uYW1lOw0KY2hhciAqY3VycmVudF9m aWxlID0gTlVMTDsNCg0Kdm9pZCBhYm9ydF9taXNzaW5nX291dHB1dCgpOw0Kdm9pZCBhYm9y dF9lcnJvcihjb25zdCBjaGFyICptc2cpOw0Kdm9pZCBhZGRfZmlsZShjaGFyICpmaWxlbmFt ZSwgaW50IHNraXApOw0Kdm9pZCBza2lwX251bGxyZXNvdXJjZShGSUxFICpmaW4pOw0KDQpp bnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQ0Kew0KCWNoYXIgKmZpbGVuYW1lOw0K CWludCBpOw0KCS8qIE51bWJlciBvZiBpbnB1dCBmaWxlcyAqLw0KCWludCBuX2lucHV0X2Zp bGVzID0gMDsNCg0KCXByZ19uYW1lID0gYXJndlswXTsNCg0KCWlmIChhcmdjIDwgMikNCgl7 DQoJCWZwcmludGYoc3RkZXJyLCAiVXNhZ2U6ICVzIC1vIG91dHB1dCBGSUxFLi4uXG4iLCBw cmdfbmFtZSk7DQoJCWV4aXQoMSk7DQoJfQ0KDQoJZm9yIChpID0gMTsgaSA8IGFyZ2M7IGkr KykNCgl7DQoJCWZpbGVuYW1lID0gYXJndltpXTsNCgkJaWYgKHN0cm5jbXAoIi1vIiwgZmls ZW5hbWUsIDIpID09IDApDQoJCXsNCgkJCWlmIChmaWxlbmFtZVsyXSAhPSAnXDAnKQ0KCQkJ ew0KCQkJCXN0cmNweShvdXRwdXRfZmlsZW5hbWUsIGZpbGVuYW1lKzIpOw0KCQkJCWFyZ3Zb aV0gPSBOVUxMOw0KCQkJfQ0KCQkJZWxzZQ0KCQkJew0KCQkJCWFyZ3ZbaV0gPSBOVUxMOw0K CQkJCWlmIChhcmd2W2krMV0gIT0gTlVMTCkNCgkJCQl7DQoJCQkJCXN0cmNweShvdXRwdXRf ZmlsZW5hbWUsIGFyZ3ZbKytpXSk7DQoJCQkJCWFyZ3ZbaV0gPSBOVUxMOw0KCQkJCX0NCgkJ CQllbHNlDQoJCQkJCWFib3J0X21pc3Npbmdfb3V0cHV0KCk7DQoJCQl9DQoJCQlmb3V0ID0g Zm9wZW4ob3V0cHV0X2ZpbGVuYW1lLCAidyIpOw0KCQkJYnJlYWs7DQoJCX0NCgl9DQoNCglp ZiAoZm91dCA9PSBOVUxMKQ0KCQlhYm9ydF9taXNzaW5nX291dHB1dCgpOw0KDQoJZm9yIChp ID0gMTsgaSA8IGFyZ2M7IGkrKykNCgl7DQoJCWlmIChhcmd2W2ldICE9IE5VTEwpDQoJCXsN CgkJCWN1cnJlbnRfZmlsZSA9IGFyZ3ZbaV07DQoJCQlhZGRfZmlsZShjdXJyZW50X2ZpbGUs IG5faW5wdXRfZmlsZXMgIT0gMCk7DQoJCQluX2lucHV0X2ZpbGVzKys7DQoJCX0NCgl9DQoJ ZmNsb3NlKGZvdXQpOw0KCXJldHVybiAwOw0KfQ0KDQp2b2lkIGFib3J0X21pc3Npbmdfb3V0 cHV0KCkNCnsNCglmcHJpbnRmKHN0ZGVyciwgIiVzOiBNaXNzaW5nIG91dHB1dCBmaWxlXG4i LCBwcmdfbmFtZSk7DQoJZXhpdCgxKTsNCn0NCg0Kdm9pZCBhYm9ydF9lcnJvcihjb25zdCBj aGFyICptc2cpDQp7DQoJZnByaW50ZihzdGRlcnIsICIlczogJXM6ICVzXG4iLCBwcmdfbmFt ZSwgY3VycmVudF9maWxlLCBtc2cpOw0KCWV4aXQoMSk7DQp9DQoNCi8qIEFkZCBhIHJlc291 cmNlIGZpbGUgdG8gb3V0cHV0IGZpbGUgKi8NCnZvaWQgYWRkX2ZpbGUoY2hhciAqZmlsZW5h bWUsIGludCBza2lwKQ0Kew0KCXZvaWQgKmJ1ZmY7DQoJaW50IG5yZWFkOw0KCWxvbmcgZnBv czsNCglGSUxFICpmaW47DQoNCglidWZmID0gbWFsbG9jKEJVRkZfU0laRSk7DQoJaWYgKGJ1 ZmYgPT0gTlVMTCkNCgl7DQoJCXBlcnJvcihOVUxMKTsNCgkJZXhpdCgxKTsNCgl9DQoNCglm aW4gPSBmb3BlbihmaWxlbmFtZSwgInJiIik7DQoJaWYgKGZpbiA9PSBOVUxMKQ0KCXsNCgkJ cGVycm9yKGZpbGVuYW1lKTsNCgkJZXhpdCgxKTsNCgl9DQoNCglpZiAoc2tpcCkNCgkJc2tp cF9udWxscmVzb3VyY2UoZmluKTsNCg0KCWRvIHsNCgkJbnJlYWQgPSBmcmVhZChidWZmLCAx LCBCVUZGX1NJWkUsIGZpbik7DQoJCWlmIChmd3JpdGUoYnVmZiwgMSwgbnJlYWQsIGZvdXQp ICE9IG5yZWFkKQ0KCQl7DQoJCQlwZXJyb3IoZmlsZW5hbWUpOw0KCQkJZXhpdCgxKTsNCgkJ fQ0KCX0gd2hpbGUgKG5yZWFkID09IEJVRkZfU0laRSk7DQoNCglmcG9zID0gZnRlbGwoZm91 dCk7DQoJaWYgKGZwb3MgJSA0KQ0KCSAgew0KCSAgICB1bnNpZ25lZCBjaGFyIHRlcm1bXSA9 IHswLDAsMH07DQoJICAgIGZ3cml0ZSh0ZXJtLCBmcG9zICUgNCwgMSwgZm91dCk7DQoJICB9 DQoNCglmY2xvc2UoZmluKTsNCglmcmVlKGJ1ZmYpOw0KfQ0KDQovKg0KCVNraXBzIHRoZSBu dWxsIHJlc291cmNlIGF0IHRoZSBoZWFkIG9mIGEgV0lOMzIgcmVzb3VyY2UgZmlsZS4NCiov DQp2b2lkIHNraXBfbnVsbHJlc291cmNlKEZJTEUgKmZpbikNCnsNCglyc3JjX2hkciBoZHI7 DQoNCglpZiAoZnJlYWQoJmhkciwgMSwgc2l6ZW9mKGhkciksIGZpbikgIT0gc2l6ZW9mKGhk cikpDQoJCWFib3J0X2Vycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7DQoJaWYgKCAo aGRyLkRhdGFTaXplICE9IDApIHx8IChoZHIuSGVhZGVyU2l6ZSAhPSAweDIwKSApDQoJCWFi b3J0X2Vycm9yKCJOb3QgYSB2YWxpZCBXSU4zMiByZXNvdXJjZSIpOw0KDQoJaWYgKGZzZWVr KGZpbiwgaGRyLkhlYWRlclNpemUgLSA4LCBTRUVLX0NVUikgIT0gMCkNCgkJYWJvcnRfZXJy b3IoIlVuZXhwZWN0ZWQgZW5kIG9mIGZpbGUiKTsNCn0NCgAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHJqLmgAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAxMDA2NDQgACAgIDc2NCAAICAgMTQ0 IAAgICAgICAgIDU3NiAgNjU2NDMxMzQ2NiAgMTAwMjUAIDAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdXN0YXIgIAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAGV2ZXJ5b25lAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAI2lmbmRlZiBfcmpfaF8NCiNkZWZpbmUgX3JqX2hfDQoNCnR5cGVkZWYg dW5zaWduZWQgbG9uZyBEV09SRDsNCnR5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IFdPUkQ7 DQoNCnR5cGVkZWYgc3RydWN0IF9yc3JjX2hkciB7DQogIERXT1JECURhdGFTaXplOw0KICBE V09SRAlIZWFkZXJTaXplOw0KfSByc3JjX2hkcjsNCg0KdHlwZWRlZiBzdHJ1Y3QgX3JzcmNf ZGF0YV9oZHIgew0KICBEV09SRAlEYXRhVmVyc2lvbjsNCiAgRFdPUkQJTWVtb3J5RmxhZ3Nf TGFuZ3VhZ2VJRDsNCiAgRFdPUkQJVmVyc2lvbjsNCiAgRFdPUkQJQ2hhcmFjdGVyaXN0aWNz Ow0KfSByc3JjX2RhdGFfaGRyOw0KDQojZGVmaW5lIEJVRkZfU0laRSAyMDQ4DQoNCiNlbmRp ZiAvKiBfcmpfaF8gKi8NCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA --------------0FF6D0FCD74BC9B46B0A1CBA--