From: Red K. <red...@pr...> - 2004-05-19 12:30:37
|
I2lmbmRlZiB4ZW5vY2lkZV9fZGF0YWludGVyZmFjZXNfX2JlaGF2aW9yX19pY2Fycmllcl9oDQoj ZGVmaW5lIHhlbm9jaWRlX19kYXRhaW50ZXJmYWNlc19fYmVoYXZpb3JfX2ljYXJyaWVyX2gNCg0K I2luY2x1ZGUgPHV0aWxpdHkvY29tbW9uLmg+DQojaW5jbHVkZSAiLi4vLi4vY29tbW9uL3hlbm9y ZXF1aXNpdGVzLmgiDQ0KI2luY2x1ZGUgPG1hcD4NDQojaW5jbHVkZSA8Ym9vc3Qvc2hhcmVkX3B0 ci5ocHA+DQ0KI2luY2x1ZGUgIi4uLy4uL2NvbW1vbi9leGNlcHRpb25zLmgiDQoNCnVzaW5nIG5h bWVzcGFjZSBVdGlsaXR5Ow0KDQpuYW1lc3BhY2UgWGVub2NpZGUNCnsNCiAgICBuYW1lc3BhY2Ug QmVoYXZpb3INCiAgICB7DQ0KLy8gUks6IEkgZG9udCBrbm93IGlmIHlvdXIgZGV2ZWxvcG1lbnQg ZW52aXJvbm1lbnQgb3IgeW91ciBtYWlsIGNsaWVudCBrZWVwcyB0cmFzaGluZyB0aGUgc291cmNl cw0KLy8gICAgIHRyeSB0byB6aXAgdGhlbSB0aGUgbmV4dCB0aW1lLg0KDQoNCi8vIFJLOiBOZXZl ciBwdXQgZnVuY3Rpb25zIGluIHRoZSBnZW5lcmFsIG5hbWVzcGFjZSB3aXRob3V0IGEgY2xhc3Mu Li4gVGhhdCBpcyBlaXRoZXIgYW4gaW50ZXJuYWwgbWV0aG9kLCBvciBmaW5kIHNvbWV3aGVyZSBp dA0KLy8gICAgIGJlbG9uZ3MgdG8uLi4gc29tZSBzb3J0IG9mIEdlb21ldHJ5IHV0aWxpdHkgY2xh c3MgKEkgZGlzY291cmFnZSB0aGlzIGZvciBub3cpLiBJZiB3ZSBuZWVkIGl0LCB3ZSBjYW4gcmVm YWN0b3IgaXQgaW4gYSBjb3VwbGUgb2YgbWludXRlcy4NCkJvb2wgcG9pbnRJblJlY3RhbmdsZShV SW50MzIgcG9pbnRYLCBVSW50MzIgcG9pbnRZLCBVSW50MzIgY29ybmVyWCwgVUludDMyIGNvcm5l clksIFVJbnQzMiB3aWR0aCwgVUludDMyIGhlaWdodCkNCnsNCglyZXR1cm4gKChwb2ludFggPj0g Y29ybmVyWCkgfHwgKHBvaW50WSA+PSBjb3JuZXJZKSB8fCAocG9pbnRYIDw9IGNvcm5lclggKyB3 aWR0aCkgfHwgKHBvaW50WSA8PSBjb3JuZXJZICsgaGVpZ2h0KSk7DQp9DQ0KDQp0ZW1wbGF0ZTwg Y2xhc3MgQ2FycmlhYmxlT2JqZWN0ID4NCmNsYXNzIENhcnJpZXJDb250YWluZXINCnsNCnB1Ymxp YzogICANCg0KICAgdHlwZWRlZiBib29zdDo6c2hhcmVkX3B0cjwgQ2FycmllckNvbnRhaW5lciA+ IFJlZmVyZW5jZTsNCiAgIA0KICAgdHlwZWRlZiBVdGlsaXR5OjpUdXBsZTI8IFVJbnQzMiwgVUlu dDMyID4gUG9zaXRpb25UdXBsZTsNDQogICB0eXBlZGVmIFV0aWxpdHk6OlR1cGxlMzwgQ2Fycmlh YmxlT2JqZWN0LCBVSW50MzIsIFVJbnQzMj4gUG9zaXRpb25lZE9iamVjdDsNCiAgIA0KICAgc3Rh dGljIGNvbnN0IFBvc2l0aW9uVHVwbGUgYW55d2hlcmU7DQogICBzdGF0aWMgY29uc3QgUG9zaXRp b25UdXBsZSBudWxsUG9zaXRpb247DQoNCiAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8 UG9zaXRpb25lZE9iamVjdD46Oml0ZXJhdG9yIEl0ZXJhdG9yOw0KDQogICAvLyEgQGJyaWVmIFRo aXMgaXMgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuDQogICAvLyEgQHBhcmFtIG5hbWUgaXMgdGhl IHN5bWJvbGljIG5hbWUgb2YgdGhlIGNvbnRhaW5lci4NCiAgIENhcnJpZXJDb250YWluZXIgKCBV dGlsaXR5OjpTdHJpbmcgbmFtZSwgVUludDMyIG1heFhTaXplLCBVSW50MzIgbWF4WVNpemUsIFJl YWwgbWF4V2VpZ2h0LCBVSW50MzIgbWF4SXRlbXMgKTsNCg0KICAgLy8hIEl0IGFkZHMgYW4gZWxl bWVudCBpbiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLg0KICAgLy8hIEByZW1hcmsgSWYgdGhlIHBv c2l0aW9ucyBhcmUgaW52YWxpZCB0aGVuIGl0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLg0KICAg dm9pZCBhZGRFbGVtZW50ICggQ2FycmlhYmxlT2JqZWN0IGVsZW1lbnQsIEludDMyIHhQb3NpdGlv biwgSW50MzIgeVBvc2l0aW9uICk7DQogICAvLyEgSXQgYWRkcyBhbiBlbGVtZW50IGluIHRoZSBz cGVjaWZpZWQgcG9zaXRpb24uDQogICAvLyEgQHJlbWFyayBJZiB0aGUgcG9zaXRpb25zIGFyZSBp bnZhbGlkIHRoZW4gaXQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uDQogICB2b2lkIGFkZEVsZW1l bnQgKCBDYXJyaWFibGVPYmplY3QgZWxlbWVudCwgUG9zaXRpb25UdXBsZSBwb3NpdGlvbiA9IGFu eXdoZXJlICk7DQoNCiAgIC8vISBJdCByZW1vdmVzIGFuIGVsZW1lbnQgZnJvbSB0aGUgY29udGFp bmVyLg0KCXZvaWQgcmVtb3ZlRWxlbWVudCAoIENhcnJpYWJsZU9iamVjdCBlbGVtZW50ICk7DQog ICAvLyEgSXQgcmVtb3ZlcyB0aGUgRklSU1QgZWxlbWVudCBbaW5dIE9DQ1VQWUlORyBwb3NpdGlv biAoeCx5KSBhbmQgcmV0dXJucyBpdC4NCiAgIENhcnJpYWJsZU9iamVjdCByZW1vdmVFbGVtZW50 ICggVUludDMyIHhQb3NpdGlvbiwgVUludDMyIHlQb3NpdGlvbiApOw0KDQogICAvLyEgQGJyaWVm IFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBjYW4gYmUgYWRkZWQgYXQgdGhlIHNwZWNpZmll ZCBwb3NpdGlvbi4NDQogICAvLyEgQGJyaWVmIEFzc3VtZXMgcG9zaXRpb25hbCBjb250YWluZXIu DQogICBCb29sIGNhbkFkZEVsZW1lbnQgKCBDYXJyaWFibGVPYmplY3QgZWxlbWVudCwgSW50MzIg eFBvc2l0aW9uLCBJbnQzMiB5UG9zaXRpb24gKTsNCiAgIC8vISBAYnJpZWYgUmV0dXJucyB0cnVl IGlmIHRoZSBlbGVtZW50IGNhbiBiZSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLg0K ICAgLy8hIEBicmllZiBBc3N1bWVzIHBvc2l0aW9uYWwgY29udGFpbmVyLg0NCiAgIEJvb2wgY2Fu QWRkRWxlbWVudCAoIENhcnJpYWJsZU9iamVjdCBlbGVtZW50LCBQb3NpdGlvblR1cGxlIHBvc2l0 aW9uID0gQ2FycmllckNvbnRhaW5lcjo6YW55d2hlcmUgKTsNCg0KICAgLy8hIEBicmllZiBJdCBj aGVja3Mgd2hldGhlciB0aGVyZSBpcyBhIHBvc2l0aW9uIHRoYXQgaW4gd2hpY2ggaXQgY2FuIHB1 dCB0aGUgZWxlbWVudC4NCiAgIC8vISBAYnJpZWYgQXNzdW1lcyBwb3NpdGlvbmFsIGNvbnRhaW5l ci4NDQogICANCiAgIC8vIFJLOiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgYWNjb21wbGlzaGVkIGJ5 IHRoZSBtb3N0IGNvbW1vbiBhZGRFbGVtZW50ICggZWxlbWVudCApIGNhbGwsIHRoYXQgaXMgd2h5 IHRoZSBhbnl3aGVyZSBjb25zdGFudCBpcyB0aGVyZSBmb3INCiAgIC8vICAgICB0byBoYXZlIGEg dW5pZmllZCBzdHlsZS4gVGhpcyBtZXRob2QgaXMgZWl0aGVyIHN1cGVyZmx1b3VzIChpdCBpcyBy ZXBsaWNhdGluZyBhbHJlYWR5IGF2YWlsYWJsZSBmdW5jdGlvbmFsaXR5KSBvciBpdCBpcyBtaXN0 YWtlbmx5DQogICAvLyAgICAgcGxhY2VkIGFzIHB1YmxpYywgYW5kIHNob3VsZCBiZSB1c2VkIGFz IGEgcHJpdmF0ZSB1dGlsaXR5IG1ldGhvZC4NCg0KICAgLy8hIEByZXR1cm5zIG51bGxQb3NpdGlv biBpZiBpdCBjb3VsZG50IGZpbmQgYSBwb3NpdGlvbiB0byBwdXQgdGhlIGVsZW1lbnRzIGluIHRo ZSBjb250YWluZXIuDQogICAvLyEgQHJldHVybnMgQSBQb3NpdGlvblR1cGxlIHdpdGggdGhlIHRv cC1sZWZ0IHBvc2l0aW9uIHdoZXJlIGl0IGNhbiBwdXQgdGhlIGVsZW1lbnQsIHlvdSBoYXZlIHRv IHBhc3MgdGhhdCBwYXJhbWV0ZXIgdG8gYW4gYWRkRWxlbWVudCBjYWxsLg0KICAgUG9zaXRpb25U dXBsZSB3aGVyZUNhbkFkZEVsZW1lbnQgKCBDYXJyaWFibGVPYmplY3QgZWxlbWVudCApOw0KDQog ICAvLyEgUmV0dXJucyB0aGUgY29udGFpbmVyIG5hbWUNCiAgIFV0aWxpdHk6OlN0cmluZyBnZXRD b250YWluZXJOYW1lICgpOw0KDQogICAvLyEgUmV0dXJucyB0aGUgY29udGFpbmVyIGhhc2ggdmFs dWUuDQogICBVSW50MzIgZ2V0Q29udGFpbmVyTmFtZUhhc2ggKCk7DQoNCiAgIC8vISBSZXR1cm4g dGhlIHRvdGFsIHdlaWdodCBvZiBhbGwgdGhlIG9iamVjdHMgc3RvcmVkIGluIHRoZSBjb250YWlu ZXIuDQogICBSZWFsIGdldEN1cnJlbnRUb3RhbFdlaWdodCAoKTsNCg0KICAgLy8hIEBicmllZiBS ZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBjb250YWluZXIu DQogICBJdGVyYXRvciBnZXRDb250YWluZXJCZWdpbiAoKTsNCg0KICAgLy8hIEBicmllZiBSZXR1 cm5zIGFuIGl0ZXJhdG9yIHNob3dpbmcgdGhlIGVuZCBvZiB0aGUgY29udGFpbmVyLg0KICAgSXRl cmF0b3IgZ2V0Q29udGFpbmVyRW5kICgpOw0KDQpwcm90ZWN0ZWQ6DQoNCiAgIC8vISBUaGUgbmFt ZSBvZiB0aGUgY29udGFpbmVyDQogICBVdGlsaXR5OjpTdHJpbmcgbmFtZTsNCiAgIC8vISBUaGlz IGlzIHRoZSBwcmVjYWxjdWxhdGVkIGNvbnRhaW5lciBuYW1lIGhhc2ggdmFsdWUuDQogICBVSW50 MzIgbmFtZUhhc2g7DQoNCiAgIC8vISBUaGUgbWF4aW11bSBzaXplIG9mIHRoZSBjb250YWluZXIg aW4gdGhlIFggYXhpcy4NCiAgIFVJbnQzMiBtYXhYU2l6ZTsNCiAgIC8vISBUaGUgbWF4aW11bSBz aXplIG9mIHRoZSBjb250YWluZXIgaW4gdGhlIFkgYXhpcy4NCiAgIFVJbnQzMiBtYXhZU2l6ZTsN CiAgIC8vISBUaGUgbWF4aW11bSB3ZWlnaHQgb2YgdGhlIGl0ZW1zIGluIHRoZSBjb250YWluZXIu DQogICBSZWFsIG1heFdlaWdodDsNCiAgIC8vISBUaGUgbWF4aW11bSBpdGVtcyB0aGF0IGNhbiBi ZSBwdXQgaW4gdGhlIGNvbnRhaW5lciwgd2hldGhlciB0aGVyZSBpcyBzcGFjZSBhdmFpbGFibGUg b3Igbm90Lg0KICAgVUludDMyIG1heEl0ZW1zOw0KDQogICAvLyEgVGhpcyBpcyB0aGUgZWxlbWVu dCBjb250YWluZXINCiAgIHN0ZDo6dmVjdG9yPFBvc2l0aW9uZWRPYmplY3Q+IGNvbnRhaW5lckVs ZW1lbnRzOw0KDQogICAvLyEgQGJyaWVmIFRoaXMgaXMgYSB1c2VyIHNwZWNpZmljYWJsZSB3YXkg b2YgZmluZGluZyBhIHBsYWNlIGluIHRoZSBjb250YWluZXIgZm9yIGFuIHNwZWNpZmllZCBlbGVt ZW50Lg0KICAgdmlydHVhbCBQb3NpdGlvblR1cGxlIGZpbmRFbGVtZW50UG9zaXRpb24gKCBDYXJy aWFibGVPYmplY3QgZWxlbWVudCApOw0KICAgDQogICAvLyEgQGJyaWVmIElmIHlvdSBuZWVkIHRv IHNwZWNpZnkgYSBkaWZmZXJlbnQgYWNjZXB0aW9uIEJlaGF2aW9yIG92ZXJyaWRlIHRoaXMgbWV0 aG9kLg0KICAgLy8hIEBwYXIgRm9yIGV4YW1wbGUgaWYgeW91IGhhdmUgdG8gYWNjZXB0IG9ubHkg SVdlYXBvbnMgdGhlbiB5b3Ugb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gYWNjZXB0IG9ubHkgZWxl bWVudHMgZGVyaXZlZCBmcm9tIElXZWFwb24gaW50ZXJmYWNlLg0KICAgLy8hIEByZW1hcmsgVGhp cyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGEgcGxhY2Ugd2FzIGZvdW5kIChvciBwcm92aWRlZCkg Zm9yIHRoZSBlbGVtZW50Lg0KICAgLy8hIEByZXR1cm5zIFRydWUgdG8gYWNjZXB0IHRoZSBlbGVt ZW50LCBmYWxzZSB0byByZWplY3QgaXQuDQogICB2aXJ0dWFsIEJvb2wgdXNlckRlZmluZWRFbGVt ZW50QWNjZXB0ICggQ2FycmlhYmxlT2JqZWN0IGVsZW1lbnQsIFBvc2l0aW9uVHVwbGUgcG9zaXRp b24gKTsNCg0KfTsNCg0vLyBSSzogVGhpcyBkZXNpZ24gaXMgc3VwcG9zZWQgdG8gYmUgcG9zaXRp b25hbCAod2l0aCBhIHBvc2liaWxpdHkgdG8gdXNlIHRoZSBQT1NJVElPTkFMIERPTlQgQ0FSRSBp bnRlcmZhY2UpIHNvIHRoaXMgaW5oZXJpdGFuY2UgaXMgc3VwZXJmbHVvdXMuDQp0ZW1wbGF0ZTwg Y2xhc3MgQ2FycmlhYmxlT2JqZWN0ID4NDQpjbGFzcyBQb3NpdGlvbmFsQ29udGFpbmVyOiBwdWJs aWMgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+DQ0Kew0NCnB1YmxpYzoNDQoJLy8h IEBicmllZiBUaGlzIGlzIHRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yLg0NCgkvLyEgQHBhcmFtIG5h bWUgaXMgdGhlIHN5bWJvbGljIG5hbWUgb2YgdGhlIGNvbnRhaW5lci4NDQogICBQb3NpdGlvbmFs Q29udGFpbmVyICggVXRpbGl0eTo6U3RyaW5nIG5hbWUsIFVJbnQzMiBtYXhYU2l6ZSwgVUludDMy IG1heFlTaXplLCBSZWFsIG1heFdlaWdodCwgVUludDMyIG1heEl0ZW1zICk7DQ0KcHJvdGVjdGVk Og0NCgl2aXJ0dWFsIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6UG9zaXRpb25U dXBsZSBmaW5kRWxlbWVudFBvc2l0aW9uIChDYXJyaWFibGVPYmplY3QgZWxlbWVudCk7DQ0KfTsN DQoNCi8vIFN0YXRpYyBjb25zdGFudCBpbml0aWFsaXphdGlvbi4NCnRlbXBsYXRlPCBjbGFzcyBD YXJyaWFibGVPYmplY3QgPg0KY29uc3QgdHlwZW5hbWUgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFi bGVPYmplY3Q+OjpQb3NpdGlvblR1cGxlIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0 Pjo6YW55d2hlcmUgPSBDYXJyaWVyQ29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46OlBvc2l0aW9u VHVwbGUgKDAsMCk7DQoNCnRlbXBsYXRlPCBjbGFzcyBDYXJyaWFibGVPYmplY3QgPg0KY29uc3Qg dHlwZW5hbWUgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpQb3NpdGlvblR1cGxl IENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6bnVsbFBvc2l0aW9uID0gQ2Fycmll ckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpQb3NpdGlvblR1cGxlICgtMSwtMSk7DQoNCg0K dGVtcGxhdGU8IGNsYXNzIENhcnJpYWJsZU9iamVjdCA+DQpDYXJyaWVyQ29udGFpbmVyPENhcnJp YWJsZU9iamVjdD46OkNhcnJpZXJDb250YWluZXIgKCBVdGlsaXR5OjpTdHJpbmcgbmFtZSwgVUlu dDMyIG1heFhTaXplLCBVSW50MzIgbWF4WVNpemUsIFJlYWwgbWF4V2VpZ2h0LCBVSW50MzIgbWF4 SXRlbXMgKQ0Kew0NCiAgIHRoaXMtPm5hbWUgPSBuYW1lOw0NCiAgIHRoaXMtPm1heFhTaXplID0g bWF4WFNpemU7DQ0KICAgdGhpcy0+bWF4WVNpemUgPSBtYXhZU2l6ZTsNDQogICB0aGlzLT5tYXhX ZWlnaHQgPSBtYXhXZWlnaHQ7DQ0KICAgdGhpcy0+bWF4SXRlbXMgPSBtYXhJdGVtczsNDQovLyAg IHRoaXMtPmNvbnRhaW5lckVsZW1lbnRzID0gW107DQ0KLy8gICBVSW50MzIgbmFtZUhhc2g7DQ0K Ly8gICB2aXJ0dWFsIFBvc2l0aW9uVHVwbGUgZmluZEVsZW1lbnRQb3NpdGlvbiAoIENhcnJpYWJs ZU9iamVjdCBlbGVtZW50ICk7DQ0KLy8gICB2aXJ0dWFsIEJvb2wgdXNlckRlZmluZWRFbGVtZW50 QWNjZXB0ICggQ2FycmlhYmxlT2JqZWN0IGVsZW1lbnQsIFBvc2l0aW9uVHVwbGUgcG9zaXRpb24g KTsNDQp9Ow0NCg0KdGVtcGxhdGU8IGNsYXNzIENhcnJpYWJsZU9iamVjdCA+DQp2b2lkIENhcnJp ZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6YWRkRWxlbWVudCAoIENhcnJpYWJsZU9iamVj dCBlbGVtZW50LCBJbnQzMiB4UG9zaXRpb24sIEludDMyIHlQb3NpdGlvbiApDQp7DQ0KCWlmIChj YW5BZGRFbGVtZW50KGVsZW1lbnQsIHhQb3NpdGlvbiwgeVBvc2l0aW9uKSkNDQoJCQljb250YWlu ZXJFbGVtZW50cy5wdXNoX2JhY2soUG9zaXRpb25lZE9iamVjdChlbGVtZW50LCB4UG9zaXRpb24s IHlQb3NpdGlvbikpOw0NCn07DQoNCnRlbXBsYXRlPCBjbGFzcyBDYXJyaWFibGVPYmplY3QgPg0K dm9pZCBDYXJyaWVyQ29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46OmFkZEVsZW1lbnQgKCBDYXJy aWFibGVPYmplY3QgZWxlbWVudCwgdHlwZW5hbWUgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVP YmplY3Q+OjpQb3NpdGlvblR1cGxlIHBvc2l0aW9uKQ0Kew0NCglpZiAocG9zaXRpb24gPT0gYW55 d2hlcmUpDQ0KCXsNDQoJCVBvc2l0aW9uVHVwbGUgb3BlblBvc2l0aW9uID0gZmluZEVsZW1lbnRQ b3NpdGlvbihlbGVtZW50KTsNDQoJCWlmICghKG9wZW5Qb3NpdGlvbiA9PSBudWxsUG9zaXRpb24p KQ0NCgkJCWFkZEVsZW1lbnQoZWxlbWVudCwgb3BlblBvc2l0aW9uLmdldEZpcnN0KCksIG9wZW5Q b3NpdGlvbi5nZXRTZWNvbmQoKSk7DQ0KCQkvLyBSSzogTkVWRVIgRVZFUiB0aHJvdyB1bnN0cnVj dHVyZWQgZXhjZXB0aW9ucy4uLiBhbmQgTkVWRVIgRVZFUiBieSB2YWx1ZSAoc2V2ZXJhbCBwcm9i bGVtcyBhcnJpc2UgYmVjYXVzZSBvZiB0aGlzKS4NICAgICAgLy8gICAgIFVTRSB0aGUgZXhjZXB0 aW9ucyB0aGF0IGFyZSBzcGVjaWZpZWQgaW4gdGhlIGV4Y2VwdGlvbnMuaCBmaWxlLi4uDSAgICAg IC8vICAgICBJbiB0aGlzIGNhc2UgdGhlIHByb2JsZW0gaXMgY2F1c2VkIGJ5IHRoZSB1c2VyIG1p c2JlaGF2aW9yIG9yIG5vdCBjYWxsaW5nIGNhbkFkZEVsZW1lbnQgYmVmb3JlIGNhbGxpbmcgYWRk LiAoIHlvdSBkb250IGhhdmUgdG8gY2hlY2sgYW55dGhpbmcgaGVyZSwgZXhjZXB0IHRoYXQgeW91 IGNhbiBwdXQgdGhlIG9iamVjdCB3aGVyZSBpdCBiZWxvbmdzIGFzIGEgcHJlY29uZGl0aW9uKS4N ICAgICAgZWxzZSB0aHJvdyAiTm8gcGxhY2UgaW4gdGhlIGNvbnRhaW5lciI7DQ0KDQ0KCX0NDQoJ ZWxzZSBhZGRFbGVtZW50KGVsZW1lbnQsIHBvc2l0aW9uLmdldEZpcnN0KCksIHBvc2l0aW9uLmdl dFNlY29uZCgpKTsNDQp9Ow0KDQp0ZW1wbGF0ZTwgY2xhc3MgQ2FycmlhYmxlT2JqZWN0ID4NCnZv aWQgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpyZW1vdmVFbGVtZW50ICggQ2Fy cmlhYmxlT2JqZWN0IGVsZW1lbnQgKQ0Kew0NCglVSW50MzIgaW5kZXggPSAwOw0NCiAgIC8vIFJL OiBUaGUgc2FtZSB0aGluZyBhYm91dCBmb3IgdGhhdCBpcyBwbGFjZWQgc29tZXdoZXJlIGVsc2Uu Li4gZGlkbnQgZmxhZyBldmVyeSBvY2N1cmVuY2Ugb2YgdGhpcyBpbiB0aGUgc291cmNlIHRob3Vn aC4NCgl3aGlsZSAoaW5kZXggPD0gY29udGFpbmVyRWxlbWVudHMuc2l6ZSgpKQ0NCgl7DQ0KCQlp ZiAoY29udGFpbmVyRWxlbWVudHMuYXQoaW5kZXgpLmdldEZpcnN0KCkgPT0gZWxlbWVudCkNDQoJ CXsNDQoJCQkvLyBtYW51YWwgZXJhc2UNDQoJCQl3aGlsZSAoaW5kZXggPCBjb250YWluZXJFbGVt ZW50cy5zaXplKCkpDQ0KCQkJew0NCgkJCQljb250YWluZXJFbGVtZW50c1tpbmRleF0gPSBjb250 YWluZXJFbGVtZW50cy5hdChpbmRleCsxKTsNDQoJCQkJaW5kZXgrKzsNDQoJCQl9DQ0KCQkJY29u dGFpbmVyRWxlbWVudHMucG9wX2JhY2soKTsNDQoJCX0NDQoJCWluZGV4Kys7DQ0KCX0NDQp9Ow0K DQp0ZW1wbGF0ZTwgY2xhc3MgQ2FycmlhYmxlT2JqZWN0ID4NCkNhcnJpYWJsZU9iamVjdCBDYXJy aWVyQ29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46OnJlbW92ZUVsZW1lbnQgKCBVSW50MzIgeFBv c2l0aW9uLCBVSW50MzIgeVBvc2l0aW9uICkNCnsNICAgLy8gUks6IFRoaXMgaXMgYSBiZXR0ZXIg d2F5IG9mIGRvaW5nIHRoZSBzYW1lLCBhcyBtdWNoIGFzIHlvdSBjYW4gZm9yIGxvb2tzIHdpdGgg aXRlcmF0b3IgY291bnRlcnMNCiAgIC8vICAgICB1c2UgRk9SIGFzIGl0IGlzIHRoZSBiZXN0IGNv bnRyb2wgc3RydWN0dXJlIGZvciB0aGF0IGNhc2UuIFRha2UgYSBsb29rIGF0IGhvdyB0aWdodCB0 aGUgbmV3DQogICAvLyAgICAgaW1wbGVtZW50YXRpb24gaXMsIGFuZCBob3cgd2UgZG9udCB3YXN0 ZSBlZmZvcnRzIHRvIGtlZXAgdGhlIHZlY3RvciAib3JkZXJlZCIuLi4gQXMgdGhlcmUgaXMNCiAg IC8vICAgICBubyBvcmRlcmVkIHJlcXVpcmVtZW50IG9uIHRoaXMgd2UgY2FuIG1vdmUgd2hhdGV2 ZXIgb2JqZWN0IGV2ZXJ5d2hlcmUgd2Ugd2FudC4gSWYgd2UgZW5kIHVwDQogICAvLyAgICAgbmVl ZGluZyBhIG1vcmUgc3RyaWN0IG9yZGVyIHdlIGNhbiBwYXJ0aWFsIHNwZWNpYWxpemF0ZSB0aGlz IHRlbXBsYXRlLg0KCVVJbnQzMiBpbmRleCA9IDA7DSAgIFVJbnQzMiBjb250YWluZXJTaXplID0g Y29udGFpbmVyRWxlbWVudHMuc2l6ZSAoKTsNDQogICBmb3IgKCBVSW50MzIgaSA9IDA7IGkgPCBj b250YWluZXJTaXplOyBpKysgKQ0KICAgew0KICAgICAgUG9zaXRpb25lZE9iamVjdCBjdXJyZW50 RWxlbWVudCA9IGNvbnRhaW5lckVsZW1lbnRzW2ldOw0KICAgICAgaWYgKCBwb2ludEluUmVjdGFu Z2xlKCANCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeFBvc2l0aW9uLCANCiAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgeVBvc2l0aW9uLCANCiAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgY3VycmVudEVsZW1lbnQuZ2V0U2Vjb25kKCksIA0KICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBjdXJyZW50RWxlbWVudC5nZXRUaGlyZCgpLCANCiAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgY3VycmVudEVsZW1lbnQuZ2V0Rmlyc3QoKS5nZXRPYmplY3RYU2l6ZSgpLCANCiAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnQuZ2V0Rmlyc3QoKS5nZXRP YmplY3RZU2l6ZSgpDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKQ0KICAgICAgICAgICkN CiAgICAgIHsNCiAgICAgICAgIGNvbnRhaW5lckVsZW1lbnRzW2ldID0gY29udGFpbmVyRWxlbWVu dHNbY29udGFpbmVyU2l6ZS0xXTsNCiAgICAgICAgIGNvbnRhaW5lckVsZW1lbnRzLnBvcF9iYWNr ICgpOw0KICAgICAgICAgcmV0dXJuIGN1cnJlbnRFbGVtZW50LmdldEZpcnN0ICgpOw0KICAgICAg fTsNCiAgIH07DQoNCiAgIHRocm93IG5ldyBYRUludmFsaWRQYXJhbWV0ZXIgKCk7ICAgDQoNCi8q DXdoaWxlIChpbmRleCAhPSBjb250YWluZXJFbGVtZW50cy5zaXplKCkpDQ0KCXsNDQoJCVBvc2l0 aW9uZWRPYmplY3QgY3VycmVudEVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50cy5hdChpbmRleCk7 DQ0KCQlpZiAocG9pbnRJblJlY3RhbmdsZSh4UG9zaXRpb24sIHlQb3NpdGlvbiwgY3VycmVudEVs ZW1lbnQuZ2V0U2Vjb25kKCksIGN1cnJlbnRFbGVtZW50LmdldFRoaXJkKCksIGN1cnJlbnRFbGVt ZW50LmdldEZpcnN0KCkuZ2V0T2JqZWN0WFNpemUoKSwgY3VycmVudEVsZW1lbnQuZ2V0Rmlyc3Qo KS5nZXRPYmplY3RZU2l6ZSgpKSkNCgkJew0KCQkJLy8gbWFudWFsIGVyYXNlDQoJCQl3aGlsZSAo aW5kZXggPCBjb250YWluZXJFbGVtZW50cy5zaXplKCkpDQoJCQl7DQoJCQkJY29udGFpbmVyRWxl bWVudHNbaW5kZXhdID0gY29udGFpbmVyRWxlbWVudHMuYXQoaW5kZXgrMSk7DQoJCQkJaW5kZXgr KzsNCgkJCX0NCgkJCWNvbnRhaW5lckVsZW1lbnRzLnBvcF9iYWNrKCk7DQoJCQlyZXR1cm4gY3Vy cmVudEVsZW1lbnQuZ2V0Rmlyc3QoKTsNCgkJfQ0KCQlpbmRleCsrOw0JfQ0JLy8gaWYgdGhpcyBw b2ludCBpcyByZWFjaGVkLCB0aGUgcG9zaXRpb24gaXMgdW5vY2N1cGllZA0KCXRocm93ICJObyBl bGVtZW50IGF0IGdpdmVuIHBvaW50IjsNCglyZXR1cm4gTlVMTDsNKi8NCn07DQoNCnRlbXBsYXRl PCBjbGFzcyBDYXJyaWFibGVPYmplY3QgPg0KVXRpbGl0eTo6Qm9vbCBDYXJyaWVyQ29udGFpbmVy PENhcnJpYWJsZU9iamVjdD46OmNhbkFkZEVsZW1lbnQgKCBDYXJyaWFibGVPYmplY3QgZWxlbWVu dCwgSW50MzIgeFBvc2l0aW9uLCBJbnQzMiB5UG9zaXRpb24gKQ0Kew0NCgkvLyB0aHJvdyBleGNl cHRpb25zIGhlcmU/DQ0KCWlmICgoY29udGFpbmVyRWxlbWVudHMuc2l6ZSgpID09IG1heEl0ZW1z KQ0NCgkJfHwgKGVsZW1lbnQuZ2V0T2JqZWN0V2VpZ2h0KCkgKyB0aGlzLT5nZXRDdXJyZW50VG90 YWxXZWlnaHQoKSA+IG1heFdlaWdodCkNDQoJCXx8ICh4UG9zaXRpb24gPCAwKSB8fCAoeVBvc2l0 aW9uIDwgMCkNDQoJCXx8ICh4UG9zaXRpb24gKyBlbGVtZW50LmdldE9iamVjdFhTaXplKCkgPj0g bWF4WFNpemUpDQ0KCQl8fCAoeVBvc2l0aW9uICsgZWxlbWVudC5nZXRPYmplY3RZU2l6ZSgpID49 IG1heFlTaXplKSkNDQogICAgICAgICAvLyBSSzogTkVWRVIgdXNlIHRoZSBDIG1hc2sgZm9yIGJv b2xlYW4gdmFsdWVzLiBGQUxTRSBpcyAwIGluc3RlYWQgb2YgZmFsc2UuLi4gDSAgICAgICAgIC8v ICAgICBRdWl0ZSBhIHByb2JsZW0sIHlvdSBhcmUgZG9pbmcgYSBjb2hlcnNpb24gaW4gaGVyZSBh bmQgdXNpbmcgYXJpdGhtZXRpYyBib29sZWFucyB0aGF0IGlzIHF1aXRlIGEgYmFkIGFuZCByaXNr eSBoYWJpdC4NICAgICAgICAgLy8gICAgIFVzZSByZXR1cm4gZmFsc2U7IGluc3RlYWQuDSAgICAg ICAgIHJldHVybiBGQUxTRTsNDQoJcmV0dXJuIHVzZXJEZWZpbmVkRWxlbWVudEFjY2VwdChlbGVt ZW50LCBQb3NpdGlvblR1cGxlKHhQb3NpdGlvbiwgeVBvc2l0aW9uKSk7DQ0KfTsNCg0KdGVtcGxh dGU8IGNsYXNzIENhcnJpYWJsZU9iamVjdCA+DQpVdGlsaXR5OjpCb29sIENhcnJpZXJDb250YWlu ZXI8Q2FycmlhYmxlT2JqZWN0Pjo6Y2FuQWRkRWxlbWVudCAoIENhcnJpYWJsZU9iamVjdCBlbGVt ZW50LCB0eXBlbmFtZSBDYXJyaWVyQ29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46OlBvc2l0aW9u VHVwbGUgcG9zaXRpb24gKQ0Kew0NCglpZiAocG9zaXRpb24gPT0gYW55d2hlcmUpIHJldHVybiAo ISh0aGlzLT53aGVyZUNhbkFkZEVsZW1lbnQoZWxlbWVudCkgPT0gbnVsbFBvc2l0aW9uKSk7DQ0K CWVsc2UgcmV0dXJuIGNhbkFkZEVsZW1lbnQoZWxlbWVudCwgcG9zaXRpb24uZ2V0Rmlyc3QoKSwg cG9zaXRpb24uZ2V0U2Vjb25kKCkpOw0NCn07DQoNCnRlbXBsYXRlPCBjbGFzcyBDYXJyaWFibGVP YmplY3QgPg0KdHlwZW5hbWUgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpQb3Np dGlvblR1cGxlIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6d2hlcmVDYW5BZGRF bGVtZW50ICggQ2FycmlhYmxlT2JqZWN0IGVsZW1lbnQgKQ0Kew0NCglyZXR1cm4gZmluZEVsZW1l bnRQb3NpdGlvbihlbGVtZW50KTsNDQp9Ow0KDQp0ZW1wbGF0ZTwgY2xhc3MgQ2FycmlhYmxlT2Jq ZWN0ID4NClV0aWxpdHk6OlN0cmluZyBDYXJyaWVyQ29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46 OmdldENvbnRhaW5lck5hbWUgKCkNCnsNDQoJcmV0dXJuIG5hbWU7DQ0KfTsNCg0KdGVtcGxhdGU8 IGNsYXNzIENhcnJpYWJsZU9iamVjdCA+DQpVdGlsaXR5OjpVSW50MzIgQ2FycmllckNvbnRhaW5l cjxDYXJyaWFibGVPYmplY3Q+OjpnZXRDb250YWluZXJOYW1lSGFzaCAoKQ0Kew0NCglyZXR1cm4g bmFtZUhhc2g7DQ0KfTsNCg0KdGVtcGxhdGU8IGNsYXNzIENhcnJpYWJsZU9iamVjdCA+DQpVdGls aXR5OjpSZWFsIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6Z2V0Q3VycmVudFRv dGFsV2VpZ2h0ICgpDQp7DQ0KCVVJbnQzMiBpdGVyYXRvciA9IDA7DQ0KCVJlYWwgcmV0dXJuVmFs dWUgPSAwOw0NCgl3aGlsZSAoaXRlcmF0b3IgPCBjb250YWluZXJFbGVtZW50cy5zaXplKCkpDQ0K CXsNDQoJCXJldHVyblZhbHVlICs9IGNvbnRhaW5lckVsZW1lbnRzLmF0KGl0ZXJhdG9yKS5nZXRG aXJzdCgpLmdldE9iamVjdFdlaWdodCgpOw0NCgkJaXRlcmF0b3IrKzsNDQoJfQ0NCglyZXR1cm4g cmV0dXJuVmFsdWU7DQ0KfTsNCg0KdGVtcGxhdGU8IGNsYXNzIENhcnJpYWJsZU9iamVjdCA+DQp0 eXBlbmFtZSBDYXJyaWVyQ29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46Okl0ZXJhdG9yIENhcnJp ZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6Z2V0Q29udGFpbmVyQmVnaW4gKCkNCnsNDQoJ cmV0dXJuIGNvbnRhaW5lckVsZW1lbnRzLmJlZ2luKCk7DQ0KfTsNCg0KdGVtcGxhdGU8IGNsYXNz IENhcnJpYWJsZU9iamVjdCA+DQp0eXBlbmFtZSBDYXJyaWVyQ29udGFpbmVyPENhcnJpYWJsZU9i amVjdD46Okl0ZXJhdG9yIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6Z2V0Q29u dGFpbmVyRW5kICgpDQp7DQ0KCXJldHVybiBjb250YWluZXJFbGVtZW50cy5lbmQoKTsNDQp9Ow0K DQ0KLy8hIEZvciBzdGFuZGFyZCBzdG9yZS10eXBlIGNvbnRhaW5lcnMgOikNCnRlbXBsYXRlPCBj bGFzcyBDYXJyaWFibGVPYmplY3QgPg0KdHlwZW5hbWUgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFi bGVPYmplY3Q+OjpQb3NpdGlvblR1cGxlIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0 Pjo6ZmluZEVsZW1lbnRQb3NpdGlvbiAoIENhcnJpYWJsZU9iamVjdCBlbGVtZW50ICkNCnsNDQoJ aWYgKCBjYW5BZGRFbGVtZW50KGVsZW1lbnQsMSwxKSApDQ0KCQlyZXR1cm4gUG9zaXRpb25UdXBs ZSgxLDEpOw0NCgllbHNlDQ0KCQlyZXR1cm4gbnVsbFBvc2l0aW9uOw0NCn07DQoNCi8vISBGb3Ig c3RhbmRhcmQgcG9zaXRpb25hbCBjb250YWluZXJzDXRlbXBsYXRlPCBjbGFzcyBDYXJyaWFibGVP YmplY3QgPg10eXBlbmFtZSBDYXJyaWVyQ29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46OlBvc2l0 aW9uVHVwbGUgUG9zaXRpb25hbENvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpmaW5kRWxlbWVu dFBvc2l0aW9uICggQ2FycmlhYmxlT2JqZWN0IGVsZW1lbnQgKQ0NCnsNDQoJVUludDMyIHggPSAw Ow0NCglVSW50MzIgeSA9IDA7DQ0KDSAgIC8vIFJLOiBUaGlzIGlzIGJldHRlciBoYW5kbGVkIGJ5 IDIgZm9yIHN0YXRlbWVudHMuDSAgIHdoaWxlICh4ICE9IG1heFhTaXplKQ0NCgl7DQ0KCQl3aGls ZSAoeSAhPSBtYXhZU2l6ZSkNDQoJCXsNDQoJCQlpZiAoY2FuQWRkRWxlbWVudChlbGVtZW50LCB4 LCB5KSkNDQoJCQkJcmV0dXJuIFBvc2l0aW9uVHVwbGUoeCwgeSk7DQ0KCQkJeSsrOw0NCgkJfQ0N CgkJeSA9IDA7DQ0KCQl4Kys7DQ0KCX0NDQoJcmV0dXJuIG51bGxQb3NpdGlvbjsNDQp9Ow0NCg0N Cg0NCi8vIFJLOiBUaGlzIGhhcyB0byBiZSBpbXBsZW1lbnRlZCBhbnl3YXlzIGJ1dCB3aWxsIGFs d2F5cyByZXR1cm4gdHJ1ZSB1bmxlc3Mgb3ZlcnJpZGVuLg0KdGVtcGxhdGU8IGNsYXNzIENhcnJp YWJsZU9iamVjdCA+DQpVdGlsaXR5OjpCb29sIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2Jq ZWN0Pjo6dXNlckRlZmluZWRFbGVtZW50QWNjZXB0ICggQ2FycmlhYmxlT2JqZWN0IGVsZW1lbnQs IHR5cGVuYW1lIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6UG9zaXRpb25UdXBs ZSBwb3NpdGlvbiApDQp7DQogICByZXR1cm4gdHJ1ZTsNCn07DQoNCg0KDQoNCi8vISAgIEBicmll ZiBUaGlzIGludGVyZmFjZSBpcyBpbmhlcml0ZWQgYnkgYW55IG9iamVjdCB0aGF0IGNhbiBjYXJy eSBvciBzdG9yZSBvYmplY3RzIGxpa2UgR2VuZXJhbCBTdG9yZXMsIEFpcmNyYWZ0cywgU29sZGll cnMsIGV0Yy4NCi8vISAgIEBwYXIgVGhlIGNhcnJpZXIgaW50ZXJmYWNlIHdpbGwgZGVmaW5lIGFs bCB0aGUgbmVjZXNhcnkgbWV0aG9kcyB0byBtYW5pcHVsYXRlIA0KLy8hICAgICAgICB0aGUgY29u dGFpbmVycyB0aGF0IGV2ZXJ5IGNhcnJpZXIgb2JqZWN0IHdpbGwgaGF2ZS4gDQovLyEgICBAcGFy IEF0IHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIG9iamVjdCB0aGUgaW50ZXJuYWxDYXJyaWVySW5p dCB2aXJ0dWFsIG1ldGhvZA0KLy8hICAgICAgICB3aWxsIGJlIGNhbGxlZCBhbmQgdGhlIGNhcnJp ZXIgd2lsbCBpbml0aWFsaXplIGl0c2VsZiwgYmFzZWQgb24gdGhlIGNvbnRhaW5lcnMNCi8vISAg ICAgICAgdGhhdCBpdCBpcyBhbGxvd2VkIHRvIHVzZS4NCi8vISAgIEBub3RlIEl0IHdvdWxkIGJl IGludGVyZXN0aW5nIHRvIGJlIGFibGUgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhbHVlcyBmcm9tIGFu IHNjcmlwdCBvciB2aWEgDQovLyEgICAgICAgIGFuIHNwZWNpYWwgZmlsZSwgYmVjYXVzZSBvZiB0 aGF0IGFueSBjYXJyaWVyIG9iamVjdCB3aWxsIGhhdmUgYSBjbGFzcyBuYW1lLiBGb3IgaW5zdGFu Y2UNCi8vISAgICAgICAgYSBzb2xkaWVyIGZpbGUgd2lsbCBiZSBhc3NvY2lhdGVkIHRvIGl0cyBj b25maWd1cmF0aW9uIHZpYSBhICJTb2xkaWVyIiBuYW1lLiBUaGUgbmFtZSBvZiB0aGUNCi8vISAg ICAgICAgY2xhc3MgY2FuIGJlIHJldHJpZXZlZCB2aWEgaXRzIEMrKyBSVFRJIGluZm9ybWF0aW9u Lg0KLy8hICAgQHJlbWFyayBFdmVyeSBjYXJyaWFibGUgb2JqZWN0IG11c3QgaGF2ZSBvbmx5IG9u ZSBJQ2FycmllciBhc3NvY2lhdGVkIGFzIGEgcGFyZW50Lg0KdGVtcGxhdGU8IGNsYXNzIENhcnJp YWJsZU9iamVjdCA+DQpjbGFzcyBJQ2Fycmllcg0Kew0KcHVibGljOg0KDQogICB0eXBlZGVmIHR5 cGVuYW1lIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6UmVmZXJlbmNlIENvbnRh aW5lclJlZmVyZW5jZTsNCg0KICAgQ29udGFpbmVyUmVmZXJlbmNlIGdldENhcnJpZXJDb250YWlu ZXJCeU5hbWUgKCBVdGlsaXR5OjpTdHJpbmcgbmFtZSApOw0KDQpwcm90ZWN0ZWQ6DQoNCiAgIC8v ISBAYnJpZWYgVGhpcyBpcyB0aGUgaW5pdGlhbGl6YXRpb24gbWV0aG9kIHRoYXQgd2Ugd2lsbCBo YXZlIHRvIG92ZXJyaWRlIHRvIG1vZGlmeSB0aGUNCiAgIC8vISBpbml0aWFsaXphdGlvbiBwcm9j ZXNzLg0KICAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVDYXJyaWVyICgpOw0KDQogICBzdGQ6Om1h cDwgVXRpbGl0eTo6U3RyaW5nLCBDb250YWluZXJSZWZlcmVuY2UgPiBjYXJyaWVyQ29udGFpbmVy czsNCg0KfTsNCg0KDQp0ZW1wbGF0ZTwgY2xhc3MgQ2FycmlhYmxlT2JqZWN0ID4NCnR5cGVuYW1l IElDYXJyaWVyPENhcnJpYWJsZU9iamVjdD46OkNvbnRhaW5lclJlZmVyZW5jZSBJQ2FycmllcjxD YXJyaWFibGVPYmplY3Q+OjpnZXRDYXJyaWVyQ29udGFpbmVyQnlOYW1lICggVXRpbGl0eTo6U3Ry aW5nIG5hbWUgKQ0Kew0KICAgQ29udGFpbmVyUmVmZXJlbmNlIGF1eCAoIGNhcnJpZXJDb250YWlu ZXJzLmZpbmQgKCBuYW1lICkgKTsNCg0KICAgLy8gUks6IFVzZSB0aGlzIGtpbmQgb2Ygc3RydWN0 dXJlcyB0byBjaGVjayBmb3IgdGhpbmdzIHRoYXQgbXVzdCBoYXZlIGJlZW4gaW4gdGhlDQogICAv LyAgICAgbWV0aG9kIGNvbnRyYWN0Li4uIHRoYXQgbWVhbnMgYW55dGhpbmcgeW91IGFzc3VtZSBo YXMgdG8gYmUgdHJ1ZSBvbiBlbnRyYW5jZQ0KICAgLy8gICAgIG9yIGV2ZW4gaW4gdGhlIG1pZGRs ZSBvciBlbmQgb2YgdGhlIG1ldGhvZC4gVGhlIFRBRyBwcmVmaXggI1BSRUNPTkRJVElPTiBpcw0K ICAgLy8gICAgIHVzZWQgdG8gZmxhZyB0aGUgY29uc3RydWN0IHRvIGZ1cnRoZXIgcmVtb3ZhbCBp biByZWxlYXNlIG1vZGUgaWYgdGhlIGNvbnRyb2xzDQogICAvLyAgICAgZG8gaGF2ZSBhIHBlcmZv cm1hbmNlIGltcGFjdCAocHJvZmlsaW5nIGNvbXByb2JhYmxlIG9mIGNvdXJzZSkuDQogICAvLyAj UFJFQ09ORElUSU9OQkVHSU4NCiAgIGlmICggYXV4ID09IE5VTEwgKQ0KICAgICAgdGhyb3cgbmV3 IFhFSW52YWxpZFBhcmFtZXRlciAoKTsNCiAgIC8vICNQUkVDT05ESVRJT05FTkQNCg0KICAgcmV0 dXJuIGF1eDsNCg0KfTsgDQoNCnRlbXBsYXRlPCBjbGFzcyBDYXJyaWFibGVPYmplY3QgPg0Kdm9p ZCBJQ2FycmllcjxDYXJyaWFibGVPYmplY3Q+Ojppbml0aWFsaXplQ2FycmllciAoKQ0Ke307DQoN Cg0KDQoJfTsgLy8gQmVoYXZpb3INCn07IC8vIFhlbm9jaWRlDQoNCg0KI2VuZGlmDQo= |
From: Tamas T. <te...@cs...> - 2004-05-20 08:10:44
Attachments:
icarrier.zi_
|
Remarks: - in the attached version addElement(what, where) accepts 'nullPosition' by default to ignore positional restraints and 'anywhere' to find a position in accordance with positional restraints; I hope something like this is what you meant by "not positional interface" - IIRC 'for' loops are discouraged in the programming guideline doc, so I'd like to have a clarification on how much are we going for "readability" vs. "compactness" centurion |
From: Red K. <red...@pr...> - 2004-05-20 12:47:37
|
I2lmbmRlZiB4ZW5vY2lkZV9fZGF0YWludGVyZmFjZXNfX2JlaGF2aW9yX19pY2Fycmllcl9oCiNk ZWZpbmUgeGVub2NpZGVfX2RhdGFpbnRlcmZhY2VzX19iZWhhdmlvcl9faWNhcnJpZXJfaAoKI2lu Y2x1ZGUgPHV0aWxpdHkvY29tbW9uLmg+CiNpbmNsdWRlICIuLi8uLi9jb21tb24veGVub3JlcXVp c2l0ZXMuaCINCg0KLy8gUks6IFRoaXMgdHdvIGhhZCBhbHJlYWR5IGJlZW4gYWRkZWQgaW4gdGhl IGN1cnJlbnQgQ1ZTLCBqdXN0IGRvIGFuIHVwZGF0ZS4gKHV0aWxpdHkgYW5kIHhlbm9yZXF1aXNp dGVzLmgpDQovLyAgICAgSSBzdWdnZXN0IGV2ZXJ5b25lIHRoYXQgZXZlcnkgdGltZSB5b3Ugd29y ayBkbyBhbiB1cGRhdGUgb2YgdGhlIGFwcHJvcHJpYXRlIG1vZHVsZXMuDQojaW5jbHVkZSA8bWFw Pg0KI2luY2x1ZGUgPGJvb3N0L3NoYXJlZF9wdHIuaHBwPg0KCiNpbmNsdWRlICIuLi8uLi9jb21t b24vZXhjZXB0aW9ucy5oIgoKdXNpbmcgbmFtZXNwYWNlIFV0aWxpdHk7CgpuYW1lc3BhY2UgWGVu b2NpZGUKewogICAgbmFtZXNwYWNlIEJlaGF2aW9yCiAgICB7DQoKCi8vIFJLOiBUaGUgY29kZSBp cyBhbG1vc3QgcmVhZHkgZm9yIENWUyBBY2NlcHRhbmNlLCBqdXN0IGNvcnJlY3QgYSBjb3VwbGUg b2YgdGhpbmdzIEkgcG9pbnRlZCBvdXQuCi8vICAgICBNb3N0IG9mIHRoZW0gYXJlIHRoaW5ncyB5 b3UgZm9yZ290IHRvIGFkZCwgYW5kIGEgdmVyeSBsaXR0bGUgbWlzdW5kZXJzdGFuZGluZyByZWdh cmRpbmcKLy8gICAgIGR1cGxpY2F0ZWQgb2JqZWN0cywgYnV0IGV4Y2VsZW50IGpvYiBzbyBmYXIu Ci8vIFJLOiBZb3Ugc2hvdWxkIHRha2UgYSBsb29rIGF0IGdyb3VwaW5nIHRlY2huaXF1ZXMgZnJv bSB0aGUgYm9vayBDb2RlIENvbXBsZXRlLCBpdCBpcyBhbiBleGNlbGVudAovLyAgICAgcmVzb3Vy Y2UuCnRlbXBsYXRlPCBjbGFzcyBDYXJyaWFibGVPYmplY3QgPgpjbGFzcyBDYXJyaWVyQ29udGFp bmVyCnsKcHVibGljOiAgIAoKICAgdHlwZWRlZiBib29zdDo6c2hhcmVkX3B0cjwgQ2FycmllckNv bnRhaW5lciA+IFJlZmVyZW5jZTsKICAgCiAgIHR5cGVkZWYgVXRpbGl0eTo6VHVwbGUyPCBVSW50 MzIsIFVJbnQzMiA+IFBvc2l0aW9uVHVwbGU7DQogICB0eXBlZGVmIFV0aWxpdHk6OlR1cGxlMzwg Q2FycmlhYmxlT2JqZWN0LCBVSW50MzIsIFVJbnQzMj4gUG9zaXRpb25lZE9iamVjdDsKICAgCiAg IHN0YXRpYyBjb25zdCBQb3NpdGlvblR1cGxlIGFueXdoZXJlOwogICBzdGF0aWMgY29uc3QgUG9z aXRpb25UdXBsZSBudWxsUG9zaXRpb247DQoKICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnZlY3Rv cjxQb3NpdGlvbmVkT2JqZWN0Pjo6aXRlcmF0b3IgSXRlcmF0b3I7CgogICAvLyEgQGJyaWVmIFRo aXMgaXMgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCiAgIC8vISBAcGFyYW0gbmFtZSBpcyB0aGUg c3ltYm9saWMgbmFtZSBvZiB0aGUgY29udGFpbmVyLgogICBDYXJyaWVyQ29udGFpbmVyICggVXRp bGl0eTo6U3RyaW5nIG5hbWUsIFVJbnQzMiBtYXhYU2l6ZSwgVUludDMyIG1heFlTaXplLCBSZWFs IG1heFdlaWdodCwgVUludDMyIG1heEl0ZW1zICk7CgogICAvLyEgSXQgYWRkcyBhbiBlbGVtZW50 IGluIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCiAgIC8vISBAcmVtYXJrIElmIHRoZSBwb3NpdGlv bnMgYXJlIGludmFsaWQgdGhlbiBpdCB3aWxsIHRocm93IGFuIGV4Y2VwdGlvbi4KICAgdm9pZCBh ZGRFbGVtZW50ICggQ2FycmlhYmxlT2JqZWN0IGVsZW1lbnQsIEludDMyIHhQb3NpdGlvbiwgSW50 MzIgeVBvc2l0aW9uICk7CiAgIC8vISBJdCBhZGRzIGFuIGVsZW1lbnQgaW4gdGhlIHNwZWNpZmll ZCBwb3NpdGlvbi4KICAgLy8hIEByZW1hcmsgSWYgdGhlIHBvc2l0aW9ucyBhcmUgaW52YWxpZCB0 aGVuIGl0IHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgogICB2b2lkIGFkZEVsZW1lbnQgKCBDYXJy aWFibGVPYmplY3QgZWxlbWVudCwgUG9zaXRpb25UdXBsZSBwb3NpdGlvbiA9IG51bGxQb3NpdGlv biApOwoKICAgLy8hIEl0IHJlbW92ZXMgYW4gZWxlbWVudCBmcm9tIHRoZSBjb250YWluZXIuCgl2 b2lkIHJlbW92ZUVsZW1lbnQgKCBDYXJyaWFibGVPYmplY3QgZWxlbWVudCApOwoKICAgLy8gUks6 IER1cGxpY2F0ZXMgbm8gYWxsb3dlZCBoZXJlLi4uCiAgIC8vISBJdCByZW1vdmVzIHRoZSBGSVJT VCBlbGVtZW50IFtpbl0gT0NDVVBZSU5HIHBvc2l0aW9uICh4LHkpIGFuZCByZXR1cm5zIGl0Lgog ICBDYXJyaWFibGVPYmplY3QgcmVtb3ZlRWxlbWVudCAoIFVJbnQzMiB4UG9zaXRpb24sIFVJbnQz MiB5UG9zaXRpb24gKTsKCiAgIC8vISBAYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50 IGNhbiBiZSBhZGRlZCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLg0KICAgLy8hIEBicmllZiBB c3N1bWVzIHBvc2l0aW9uYWwgY29udGFpbmVyLgogICBCb29sIGNhbkFkZEVsZW1lbnQgKCBDYXJy aWFibGVPYmplY3QgZWxlbWVudCwgSW50MzIgeFBvc2l0aW9uLCBJbnQzMiB5UG9zaXRpb24gKTsK ICAgLy8hIEBicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgY2FuIGJlIGFkZGVkIGF0 IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCiAgIC8vISBAYnJpZWYgQXNzdW1lcyBwb3NpdGlvbmFs IGNvbnRhaW5lci4NCiAgIEJvb2wgY2FuQWRkRWxlbWVudCAoIENhcnJpYWJsZU9iamVjdCBlbGVt ZW50LCBQb3NpdGlvblR1cGxlIHBvc2l0aW9uID0gQ2FycmllckNvbnRhaW5lcjo6YW55d2hlcmUg KTsKCiAgIC8vISBSZXR1cm5zIHRoZSBjb250YWluZXIgbmFtZQogICBVdGlsaXR5OjpTdHJpbmcg Z2V0Q29udGFpbmVyTmFtZSAoKTsKCiAgIC8vISBSZXR1cm5zIHRoZSBjb250YWluZXIgaGFzaCB2 YWx1ZS4KICAgVUludDMyIGdldENvbnRhaW5lck5hbWVIYXNoICgpOwoKICAgLy8hIFJldHVybiB0 aGUgdG90YWwgd2VpZ2h0IG9mIGFsbCB0aGUgb2JqZWN0cyBzdG9yZWQgaW4gdGhlIGNvbnRhaW5l ci4KICAgUmVhbCBnZXRDdXJyZW50VG90YWxXZWlnaHQgKCk7CgogICAvLyEgQGJyaWVmIFJldHVy bnMgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lci4KICAg SXRlcmF0b3IgZ2V0Q29udGFpbmVyQmVnaW4gKCk7CgogICAvLyEgQGJyaWVmIFJldHVybnMgYW4g aXRlcmF0b3Igc2hvd2luZyB0aGUgZW5kIG9mIHRoZSBjb250YWluZXIuCiAgIEl0ZXJhdG9yIGdl dENvbnRhaW5lckVuZCAoKTsKCnByb3RlY3RlZDoKCiAgIC8vISBUaGUgbmFtZSBvZiB0aGUgY29u dGFpbmVyCiAgIFV0aWxpdHk6OlN0cmluZyBuYW1lOwogICAvLyEgVGhpcyBpcyB0aGUgcHJlY2Fs Y3VsYXRlZCBjb250YWluZXIgbmFtZSBoYXNoIHZhbHVlLgogICBVSW50MzIgbmFtZUhhc2g7Cgog ICAvLyEgVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgY29udGFpbmVyIGluIHRoZSBYIGF4aXMuCiAg IFVJbnQzMiBtYXhYU2l6ZTsKICAgLy8hIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGNvbnRhaW5l ciBpbiB0aGUgWSBheGlzLgogICBVSW50MzIgbWF4WVNpemU7CiAgIC8vISBUaGUgbWF4aW11bSB3 ZWlnaHQgb2YgdGhlIGl0ZW1zIGluIHRoZSBjb250YWluZXIuCiAgIFJlYWwgbWF4V2VpZ2h0Owog ICAvLyEgVGhlIG1heGltdW0gaXRlbXMgdGhhdCBjYW4gYmUgcHV0IGluIHRoZSBjb250YWluZXIs IHdoZXRoZXIgdGhlcmUgaXMgc3BhY2UgYXZhaWxhYmxlIG9yIG5vdC4KICAgVUludDMyIG1heEl0 ZW1zOwoKICAgLy8hIFRoaXMgaXMgdGhlIGVsZW1lbnQgY29udGFpbmVyCiAgIHN0ZDo6dmVjdG9y PFBvc2l0aW9uZWRPYmplY3Q+IGNvbnRhaW5lckVsZW1lbnRzOwoKCWlubGluZSBCb29sIHBvaW50 SW5SZWN0YW5nbGUoVUludDMyIHBvaW50WCwgVUludDMyIHBvaW50WSwgVUludDMyIGNvcm5lclgs IFVJbnQzMiBjb3JuZXJZLCBVSW50MzIgd2lkdGgsIFVJbnQzMiBoZWlnaHQpDQoJeyByZXR1cm4g KChwb2ludFggPj0gY29ybmVyWCkgfHwgKHBvaW50WSA+PSBjb3JuZXJZKSB8fCAocG9pbnRYIDw9 IGNvcm5lclggKyB3aWR0aCkgfHwgKHBvaW50WSA8PSBjb3JuZXJZICsgaGVpZ2h0KSk7IH0NCg0K ICAgLy8hIEBicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgY2FuIGJlIGFkZGVkIHcv byByZWdhcmQgdG8gb3RoZXIgaXRlbXMNCiAgIEJvb2wgY2FuV2Vha0FkZEVsZW1lbnQgKENhcnJp YWJsZU9iamVjdCBlbGVtZW50LCBJbnQzMiB4UG9zaXRpb24sIEludDMyIHlQb3NpdGlvbik7DQoN CiAgIC8vISBAYnJpZWYgVGhpcyBpcyBhIHVzZXIgc3BlY2lmaWNhYmxlIHdheSBvZiBmaW5kaW5n IGEgcGxhY2UgaW4gdGhlIGNvbnRhaW5lciBmb3IgYW4gc3BlY2lmaWVkIGVsZW1lbnQuCiAgIHZp cnR1YWwgUG9zaXRpb25UdXBsZSBmaW5kRWxlbWVudFBvc2l0aW9uICggQ2FycmlhYmxlT2JqZWN0 IGVsZW1lbnQgKTsKICAgCiAgIC8vISBAYnJpZWYgSWYgeW91IG5lZWQgdG8gc3BlY2lmeSBhIGRp ZmZlcmVudCBhY2NlcHRpb24gQmVoYXZpb3Igb3ZlcnJpZGUgdGhpcyBtZXRob2QuCiAgIC8vISBA cGFyIEZvciBleGFtcGxlIGlmIHlvdSBoYXZlIHRvIGFjY2VwdCBvbmx5IElXZWFwb25zIHRoZW4g eW91IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGFjY2VwdCBvbmx5IGVsZW1lbnRzIGRlcml2ZWQg ZnJvbSBJV2VhcG9uIGludGVyZmFjZS4KICAgLy8hIEByZW1hcmsgVGhpcyBtZXRob2QgaXMgY2Fs bGVkIGFmdGVyIGEgcGxhY2Ugd2FzIGZvdW5kIChvciBwcm92aWRlZCkgZm9yIHRoZSBlbGVtZW50 LgogICAvLyEgQHJldHVybnMgVHJ1ZSB0byBhY2NlcHQgdGhlIGVsZW1lbnQsIGZhbHNlIHRvIHJl amVjdCBpdC4KICAgdmlydHVhbCBCb29sIHVzZXJEZWZpbmVkRWxlbWVudEFjY2VwdCAoIENhcnJp YWJsZU9iamVjdCBlbGVtZW50LCBQb3NpdGlvblR1cGxlIHBvc2l0aW9uICk7Cgp9OwoKLy8gU3Rh dGljIGNvbnN0YW50IGluaXRpYWxpemF0aW9uLgp0ZW1wbGF0ZTwgY2xhc3MgQ2FycmlhYmxlT2Jq ZWN0ID4KY29uc3QgdHlwZW5hbWUgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpQ b3NpdGlvblR1cGxlIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6YW55d2hlcmUg PSBDYXJyaWVyQ29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46OlBvc2l0aW9uVHVwbGUgKDAsMCk7 Cgp0ZW1wbGF0ZTwgY2xhc3MgQ2FycmlhYmxlT2JqZWN0ID4KY29uc3QgdHlwZW5hbWUgQ2Fycmll ckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpQb3NpdGlvblR1cGxlIENhcnJpZXJDb250YWlu ZXI8Q2FycmlhYmxlT2JqZWN0Pjo6bnVsbFBvc2l0aW9uID0gQ2FycmllckNvbnRhaW5lcjxDYXJy aWFibGVPYmplY3Q+OjpQb3NpdGlvblR1cGxlICgtMSwtMSk7CgoKdGVtcGxhdGU8IGNsYXNzIENh cnJpYWJsZU9iamVjdCA+CkNhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6Q2Fycmll ckNvbnRhaW5lciAoIFV0aWxpdHk6OlN0cmluZyBuYW1lLCBVSW50MzIgbWF4WFNpemUsIFVJbnQz MiBtYXhZU2l6ZSwgUmVhbCBtYXhXZWlnaHQsIFVJbnQzMiBtYXhJdGVtcyApCnsNCiAgIHRoaXMt Pm5hbWUgPSBuYW1lOw0KICAgdGhpcy0+bWF4WFNpemUgPSBtYXhYU2l6ZTsNCiAgIHRoaXMtPm1h eFlTaXplID0gbWF4WVNpemU7DQogICB0aGlzLT5tYXhXZWlnaHQgPSBtYXhXZWlnaHQ7DQogICB0 aGlzLT5tYXhJdGVtcyA9IG1heEl0ZW1zOw0KLy8gICB0aGlzLT5jb250YWluZXJFbGVtZW50cyA9 IFtdOw0KLy8gICBVSW50MzIgbmFtZUhhc2g7DQovLyAgIHZpcnR1YWwgUG9zaXRpb25UdXBsZSBm aW5kRWxlbWVudFBvc2l0aW9uICggQ2FycmlhYmxlT2JqZWN0IGVsZW1lbnQgKTsNCi8vICAgdmly dHVhbCBCb29sIHVzZXJEZWZpbmVkRWxlbWVudEFjY2VwdCAoIENhcnJpYWJsZU9iamVjdCBlbGVt ZW50LCBQb3NpdGlvblR1cGxlIHBvc2l0aW9uICk7DQp9Ow0KDQp0ZW1wbGF0ZTwgY2xhc3MgQ2Fy cmlhYmxlT2JqZWN0ID4NCkJvb2wgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+Ojpj YW5XZWFrQWRkRWxlbWVudCAoQ2FycmlhYmxlT2JqZWN0IGVsZW1lbnQsIEludDMyIHhQb3NpdGlv biwgSW50MzIgeVBvc2l0aW9uKQ0Kew0KICAgLy8gUks6IFRoaXMgaXMgYSBtZXRob2QgdGhhdCBu ZWVkcyB0byBhc3NlcnQgdXMgKHRob3NlIHdobyB1c2UgdGhlIGNsYXNzKSB0aGF0IHdlIGNhbiBh ZGQgYW4gZWxlbWVudCBhbnl3aGVyZS4NCiAgIC8vICAgICBUaGF0IGlzIHdoeSBpdCBkb2VzbnQg cHJlY29uZGl0aW9ucy4NCiAgIGlmICgoY29udGFpbmVyRWxlbWVudHMuc2l6ZSgpID09IG1heEl0 ZW1zKSB8fCAoZWxlbWVudC5nZXRPYmplY3RXZWlnaHQoKSArIHRoaXMtPmdldEN1cnJlbnRUb3Rh bFdlaWdodCgpID4gbWF4V2VpZ2h0KSkNCgl7DQoJCXJldHVybiBmYWxzZTsNCgl9DQoJaWYgKCh4 UG9zaXRpb24gPCAwKSB8fCAoeVBvc2l0aW9uIDwgMCkNCgkJfHwgKHhQb3NpdGlvbiArIGVsZW1l bnQuZ2V0T2JqZWN0WFNpemUoKSA+PSBtYXhYU2l6ZSkNCgkJfHwgKHlQb3NpdGlvbiArIGVsZW1l bnQuZ2V0T2JqZWN0WVNpemUoKSA+PSBtYXhZU2l6ZSkpDQoJew0KCQlyZXR1cm4gZmFsc2U7DQoJ fQ0KCXJldHVybiB0cnVlOw0KfQ0KDQoKdGVtcGxhdGU8IGNsYXNzIENhcnJpYWJsZU9iamVjdCA+ CnZvaWQgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjphZGRFbGVtZW50ICggQ2Fy cmlhYmxlT2JqZWN0IGVsZW1lbnQsIEludDMyIHhQb3NpdGlvbiwgSW50MzIgeVBvc2l0aW9uICkK ew0KICAgLy8gUks6IFlvdSBtaXNzZWQgYSBwcmVjb25kaXRpb24gaGVyZSAobm8gZHVwbGljYXRl cykNCglhZGRFbGVtZW50KGVsZW1lbnQsIFBvc2l0aW9uVHVwbGUoeFBvc2l0aW9uLCB5UG9zaXRp b24pKTsNCn07Cgp0ZW1wbGF0ZTwgY2xhc3MgQ2FycmlhYmxlT2JqZWN0ID4Kdm9pZCBDYXJyaWVy Q29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46OmFkZEVsZW1lbnQgKCBDYXJyaWFibGVPYmplY3Qg ZWxlbWVudCwgdHlwZW5hbWUgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpQb3Np dGlvblR1cGxlIHBvc2l0aW9uKQp7CQ0KCWlmIChwb3NpdGlvbiA9PSBudWxsUG9zaXRpb24pDQoJ ew0KICAgICAgLy8gUks6IEFsd2F5cyB0aGluayB0aGUgZm9sbG93aW5nLCBwcmVjb25kaXRpb24g Y2FuIGJlIHJlbW92ZWQgdmlhIGFuIHNjcmlwdA0KICAgICAgLy8gICAgIGZvciBoaWdoIHBlcmZv cm1hbmNlIHRoYXRzIHdoeSB3ZSBmbGFnIHRoZW0uIHNvIHRoZXkgaGF2ZSB0byBiZSBzaW1wbGUN CiAgICAgIC8vICAgICBzdGF0ZW1lbnRzLiBIZXJlIHRoZSBwcmVjb25kaXRpb24gaXMgdGhhdCB3 ZSBjYW4gYWRkIGVsZW1lbnRzICh3ZSBoYXZlDQogICAgICAvLyAgICAgYWxyZWFkeSB0ZXN0ZWQg dGhhdCBiZWZvcmUpLg0KDQogICAgICAvLyAjUFJFQ09ORElUSU9OQkVHSU4NCiAgICAgIGlmIChj YW5XZWFrQWRkRWxlbWVudChlbGVtZW50LCAwLCAwKSkNCiAgICAgICAgIHRocm93IG5ldyBYRUlu dmFsaWRQYXJhbWV0ZXIgKCk7DQogICAgICAvLyAjUFJFQ09ORElUSU9ORU5EDQoJCQ0KICAgICAg Y29udGFpbmVyRWxlbWVudHMucHVzaF9iYWNrKFBvc2l0aW9uZWRPYmplY3QoZWxlbWVudCwgMCwg MCkpOw0KCX0NCgllbHNlIGlmICggY2FuV2Vha0FkZEVsZW1lbnQoZWxlbWVudCwgcG9zaXRpb24u Z2V0Rmlyc3QoKSwgcG9zaXRpb24uZ2V0U2Vjb25kKCkpICkNCgl7DQoJCWlmIChwb3NpdGlvbiA9 PSBhbnl3aGVyZSkNCgkJew0KCQkJUG9zaXRpb25UdXBsZSBvcGVuUG9zaXRpb24gPSBmaW5kRWxl bWVudFBvc2l0aW9uKGVsZW1lbnQpOw0KICAgICAgICAgDQogICAgICAgICAvLyBSSzogVGhlIGV4 Y2VwdGlvbiBpcyBhIGNsYXNzaWMgdXNlIG9mIGFuIGludmFsaWQgcGFyYW1ldGVyLCB0aGUgcGFy YW1ldGVyIChlbGVtZW50LHBvc2l0aW9uKQ0KICAgICAgICAgLy8gICAgIGRvIG5vdCBmdWxmaWxs IHRoZSByZXF1aXJlbWVudHMgb2YgdGhlIG1ldGhvZC4NCg0KICAgICAgICAgLy8gI1BSRUNPTkRJ VElPTkJFR0lODQogICAgICAgICBpZiAoIG9wZW5Qb3NpdGlvbiA9PSBudWxsUG9zaXRpb24gKQ0K ICAgICAgICAgICAgdGhyb3cgbmV3IFhFSW52YWxpZFBhcmFtZXRlciAoKTsNCiAgICAgICAgIC8v ICNQUkVDT05ESVRJT05FTkQNCg0KCQkJYWRkRWxlbWVudChlbGVtZW50LCBvcGVuUG9zaXRpb24u Z2V0Rmlyc3QoKSwgb3BlblBvc2l0aW9uLmdldFNlY29uZCgpKTsNCg0KCQl9DQoJCWVsc2UgaWYg KCB1c2VyRGVmaW5lZEVsZW1lbnRBY2NlcHQoZWxlbWVudCwgcG9zaXRpb24pICkNCiAgICAgIHsN CiAgICAgICAgIC8vIFJLOiBZb3UgbWlzc2VkIHRoZSBwcmVjb25kaXRpb24gaGVyZSAobm8gZHVw bGljYXRlcykNCgkJCWNvbnRhaW5lckVsZW1lbnRzLnB1c2hfYmFjayhQb3NpdGlvbmVkT2JqZWN0 KGVsZW1lbnQsIHBvc2l0aW9uLmdldEZpcnN0KCksIHBvc2l0aW9uLmdldFNlY29uZCgpKSk7DQog ICAgICB9Ow0KCX0NCn07Cgp0ZW1wbGF0ZTwgY2xhc3MgQ2FycmlhYmxlT2JqZWN0ID4Kdm9pZCBD YXJyaWVyQ29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46OnJlbW92ZUVsZW1lbnQgKCBDYXJyaWFi bGVPYmplY3QgZWxlbWVudCApCnsNCglVSW50MzIgY29udGFpbmVyU2l6ZSA9IGNvbnRhaW5lckVs ZW1lbnRzLnNpemUoKTsNCglmb3IgKCBVSW50MzIgaSA9IDA7IGkgIT0gY29udGFpbmVyU2l6ZTsg aSsrICkNCgl7DQoJCWlmIChjb250YWluZXJFbGVtZW50c1tpXS5nZXRGaXJzdCgpID09IGVsZW1l bnQpDQoJCXsNCgkJCWNvbnRhaW5lckVsZW1lbnRzW2ldID0gY29udGFpbmVyRWxlbWVudHNbY29u dGFpbmVyU2l6ZSAtIDFdOw0KCQkJY29udGFpbmVyRWxlbWVudHMucG9wX2JhY2soKTsgICAgICAg ICANCiAgICAgICAgIC8vIFJLOiB3ZSBoYXZlIGRlbGV0ZWQgKHRha2VuIG91dCB0aGUgZWxlbWVu dCBmcm9tIHRoZSBjb250YWluZXIpIG5vdyB3ZSByZXR1cm4uDQogICAgICAgICByZXR1cm47DQog ICAgICAgICAvLyBSSzogVGhpcyBpcyBhIGxvZ2ljIG1pc3Rha2UgeW91IGtlZXAgbG9va2luZyBm b3IgZHVwbGljYXRlcyAod2hhdCBieSBkZXNpZ24gaXMgbm90IGFsbG93ZWQpLi4uDQogICAgICAg ICAvLyAgICAgU2VlIG15IGNvcnJlY3Rpb25zIG9uIHRoZSB0b3AuDQogICAgICAgICAvLwkJCWkg PSBjb250YWluZXJTaXplIC0gMTsNCgkJfQ0KCX0NCn07Cgp0ZW1wbGF0ZTwgY2xhc3MgQ2Fycmlh YmxlT2JqZWN0ID4KQ2FycmlhYmxlT2JqZWN0IENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2Jq ZWN0Pjo6cmVtb3ZlRWxlbWVudCAoIFVJbnQzMiB4UG9zaXRpb24sIFVJbnQzMiB5UG9zaXRpb24g KQp7DQoJVUludDMyIGNvbnRhaW5lclNpemUgPSBjb250YWluZXJFbGVtZW50cy5zaXplKCk7DQoJ Zm9yICggVUludDMyIGkgPSAwOyBpIDwgY29udGFpbmVyU2l6ZTsgaSsrICkNCgl7DQoJCVBvc2l0 aW9uZWRPYmplY3QgY3VycmVudEVsZW1lbnQgPSBjb250YWluZXJFbGVtZW50c1tpXTsNCg0KICAg ICAgaWYgKCBwb2ludEluUmVjdGFuZ2xlKCAgeFBvc2l0aW9uLA0KCQkJCQkJCQl5UG9zaXRpb24s DQoJCQkJCQkJCWN1cnJlbnRFbGVtZW50LmdldFNlY29uZCgpLA0KCQkJCQkJCQljdXJyZW50RWxl bWVudC5nZXRUaGlyZCgpLA0KCQkJCQkJCQljdXJyZW50RWxlbWVudC5nZXRGaXJzdCgpLmdldE9i amVjdFhTaXplKCksDQoJCQkJCQkJCWN1cnJlbnRFbGVtZW50LmdldEZpcnN0KCkuZ2V0T2JqZWN0 WVNpemUoKSkgKQ0KCQl7DQoJCQljb250YWluZXJFbGVtZW50c1tpXSA9IGNvbnRhaW5lckVsZW1l bnRzW2NvbnRhaW5lclNpemUtMV07DQoJCQljb250YWluZXJFbGVtZW50cy5wb3BfYmFjaygpOw0K CQkNCiAgICAgICAgIHJldHVybiBjdXJyZW50RWxlbWVudC5nZXRGaXJzdCgpOw0KCQl9Ow0KCX07 DQoNCiAgIC8vIFJLOiBBcyB5b3Ugc2VlIHdlIGNhbm5vdCBmbGFnIHRoaXMgb25lIGZvciByZW1v dmFsLCBjYXVzZSBpZiB3ZSBkbyBpdCB3ZSBpbnRyb2R1Y2UNCiAgIC8vICAgICBhIHByb2JsZW0g d2hhdCBkbyB3ZSByZXR1cm4/Pz8/IChJcyBpdCBwb2ludGVyPywgaXMgaXQgb2JqZWN0Pywgd2hh dCBpcyBhIG51bGwgb2JqZWN0Pz8/ICkNCiAgIA0KICAgLy8gSWYgdGhpcyBwb2ludCBpcyByZWFj aGVkLCB0aGUgcG9zaXRpb24gaXMgdW5vY2N1cGllZA0KCXRocm93IG5ldyBYRUludmFsaWRQYXJh bWV0ZXIoKTsNCg0KICAgLy8gUks6IEJpZyBwcm9ibGVtLCB5b3UgYXJlIGFzc3VtaW5nIHdlIHdp bGwgY29udGFpbiBwb2ludGVycyAod2hhdCBtYXkgYmUgd3JvbmcpLi4uDQogICAvLyAgICAgQmUg ZXh0cmEgY2FyZWZ1bCB3aXRoIHRlbXBsYXRlcy4gKEluIHNob3J0IHRoaXMgc3RhdGVtZW50IGNh bm5vdCBiZSBoZXJlKQ0KICAgLy8gcmV0dXJuIE5VTEw7DQp9OwoKdGVtcGxhdGU8IGNsYXNzIENh cnJpYWJsZU9iamVjdCA+ClV0aWxpdHk6OkJvb2wgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVP YmplY3Q+OjpjYW5BZGRFbGVtZW50ICggQ2FycmlhYmxlT2JqZWN0IGVsZW1lbnQsIEludDMyIHhQ b3NpdGlvbiwgSW50MzIgeVBvc2l0aW9uICkKew0KCWlmICghIGNhbldlYWtBZGRFbGVtZW50KGVs ZW1lbnQsIHhQb3NpdGlvbiwgeVBvc2l0aW9uKSkgDQogICAgICByZXR1cm4gZmFsc2U7DQoJDQog ICByZXR1cm4gdXNlckRlZmluZWRFbGVtZW50QWNjZXB0KGVsZW1lbnQsIFBvc2l0aW9uVHVwbGUo eFBvc2l0aW9uLCB5UG9zaXRpb24pKTsNCn07Cgp0ZW1wbGF0ZTwgY2xhc3MgQ2FycmlhYmxlT2Jq ZWN0ID4KVXRpbGl0eTo6Qm9vbCBDYXJyaWVyQ29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46OmNh bkFkZEVsZW1lbnQgKCBDYXJyaWFibGVPYmplY3QgZWxlbWVudCwgdHlwZW5hbWUgQ2FycmllckNv bnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpQb3NpdGlvblR1cGxlIHBvc2l0aW9uICkKew0KCWlm IChwb3NpdGlvbiA9PSBhbnl3aGVyZSkgDQogICAgICAvLyBSSzogVXNlICE9IGluc3RlYWQsIHRo ZSAhIGF0IHRoZSBzdGFydCBjYW4gYmUgbmVnbGVjdGVkIHdoZW4gcmVhZGluZyBiZWNhdXNlDQog ICAgICAvLyAgICAgdGhlIHN0YXRlbWVudCBpcyBsb25nLiBJIGtub3cgdGhlcmUgYXJlIGNhc2Vz IHRoYXQgaXQgaXMgaW1wb3NpYmxlIHRvIGRvIHNvDQogICAgICAvLyAgICAgYnV0IGluIHRoaXMg Y2FzZSB5b3UgZ2FpbiByZWFkYWJpbGl0eSB3aXRob3V0IG1ha2luZyB0aGluZ3MgY29tcGxleC4N CiAgICAgIHJldHVybiAoISh0aGlzLT5maW5kRWxlbWVudFBvc2l0aW9uKGVsZW1lbnQpID09IG51 bGxQb3NpdGlvbikpOw0KCWVsc2UgDQogICAgICByZXR1cm4gY2FuQWRkRWxlbWVudCggZWxlbWVu dCwgcG9zaXRpb24uZ2V0Rmlyc3QoKSwgcG9zaXRpb24uZ2V0U2Vjb25kKCkgKTsNCn07Cgp0ZW1w bGF0ZTwgY2xhc3MgQ2FycmlhYmxlT2JqZWN0ID4KVXRpbGl0eTo6U3RyaW5nIENhcnJpZXJDb250 YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6Z2V0Q29udGFpbmVyTmFtZSAoKQp7DQoJcmV0dXJuIG5h bWU7DQp9OwoKdGVtcGxhdGU8IGNsYXNzIENhcnJpYWJsZU9iamVjdCA+ClV0aWxpdHk6OlVJbnQz MiBDYXJyaWVyQ29udGFpbmVyPENhcnJpYWJsZU9iamVjdD46OmdldENvbnRhaW5lck5hbWVIYXNo ICgpCnsNCglyZXR1cm4gbmFtZUhhc2g7DQp9OwoKdGVtcGxhdGU8IGNsYXNzIENhcnJpYWJsZU9i amVjdCA+ClV0aWxpdHk6OlJlYWwgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+Ojpn ZXRDdXJyZW50VG90YWxXZWlnaHQgKCkKew0KCVJlYWwgcmV0dXJuVmFsdWUgPSAwOw0KDQogICBV SW50MzIgY29udGFpbmVyU2l6ZSA9IGNvbnRhaW5lckVsZW1lbnRzLnNpemUoKTsNCiAgIGZvciAo VUludDMyIGkgPSAwOyBpIDwgY29udGFpbmVyU2l6ZTsgaSsrKQ0KCQlyZXR1cm5WYWx1ZSArPSBj b250YWluZXJFbGVtZW50c1tpXS5nZXRGaXJzdCgpLmdldE9iamVjdFdlaWdodCgpOw0KDQogICBy ZXR1cm4gcmV0dXJuVmFsdWU7DQp9OwoKdGVtcGxhdGU8IGNsYXNzIENhcnJpYWJsZU9iamVjdCA+ CnR5cGVuYW1lIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0Pjo6SXRlcmF0b3IgQ2Fy cmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpnZXRDb250YWluZXJCZWdpbiAoKQp7DQoJ cmV0dXJuIGNvbnRhaW5lckVsZW1lbnRzLmJlZ2luKCk7DQp9OwoKdGVtcGxhdGU8IGNsYXNzIENh cnJpYWJsZU9iamVjdCA+CnR5cGVuYW1lIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2JqZWN0 Pjo6SXRlcmF0b3IgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpnZXRDb250YWlu ZXJFbmQgKCkKew0KCXJldHVybiBjb250YWluZXJFbGVtZW50cy5lbmQoKTsNCn07Cgp0ZW1wbGF0 ZTwgY2xhc3MgQ2FycmlhYmxlT2JqZWN0ID4KdHlwZW5hbWUgQ2FycmllckNvbnRhaW5lcjxDYXJy aWFibGVPYmplY3Q+OjpQb3NpdGlvblR1cGxlIENhcnJpZXJDb250YWluZXI8Q2FycmlhYmxlT2Jq ZWN0Pjo6ZmluZEVsZW1lbnRQb3NpdGlvbiAoIENhcnJpYWJsZU9iamVjdCBlbGVtZW50ICkKew0K CWZvciAoVUludDMyIHggPSAwOyB4ICE9IG1heFhTaXplOyB4KyspDQogICB7DQogICAJZm9yIChV SW50MzIgeSA9IDA7IHkgIT0gbWF4WVNpemU7IHkrKykNCiAgICAgIHsNCiAgICAgICAgIGlmIChj YW5BZGRFbGVtZW50KGVsZW1lbnQsIHgsIHkpKQ0KCQkgICAJcmV0dXJuIFBvc2l0aW9uVHVwbGUo eCwgeSk7DQogICAgICB9DQogICB9Ow0KDQoJcmV0dXJuIG51bGxQb3NpdGlvbjsNCn07DQoNCg0K dGVtcGxhdGU8IGNsYXNzIENhcnJpYWJsZU9iamVjdCA+ClV0aWxpdHk6OkJvb2wgQ2FycmllckNv bnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+Ojp1c2VyRGVmaW5lZEVsZW1lbnRBY2NlcHQgKCBDYXJy aWFibGVPYmplY3QgZWxlbWVudCwgdHlwZW5hbWUgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVP YmplY3Q+OjpQb3NpdGlvblR1cGxlIHBvc2l0aW9uICkKew0KCXJldHVybiB0cnVlOw0KfTsKCgoK Ci8vISAgIEBicmllZiBUaGlzIGludGVyZmFjZSBpcyBpbmhlcml0ZWQgYnkgYW55IG9iamVjdCB0 aGF0IGNhbiBjYXJyeSBvciBzdG9yZSBvYmplY3RzIGxpa2UgR2VuZXJhbCBTdG9yZXMsIEFpcmNy YWZ0cywgU29sZGllcnMsIGV0Yy4KLy8hICAgQHBhciBUaGUgY2FycmllciBpbnRlcmZhY2Ugd2ls bCBkZWZpbmUgYWxsIHRoZSBuZWNlc2FyeSBtZXRob2RzIHRvIG1hbmlwdWxhdGUgCi8vISAgICAg ICAgdGhlIGNvbnRhaW5lcnMgdGhhdCBldmVyeSBjYXJyaWVyIG9iamVjdCB3aWxsIGhhdmUuIAov LyEgICBAcGFyIEF0IHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhlIG9iamVjdCB0aGUgaW50ZXJuYWxD YXJyaWVySW5pdCB2aXJ0dWFsIG1ldGhvZAovLyEgICAgICAgIHdpbGwgYmUgY2FsbGVkIGFuZCB0 aGUgY2FycmllciB3aWxsIGluaXRpYWxpemUgaXRzZWxmLCBiYXNlZCBvbiB0aGUgY29udGFpbmVy cwovLyEgICAgICAgIHRoYXQgaXQgaXMgYWxsb3dlZCB0byB1c2UuCi8vISAgIEBub3RlIEl0IHdv dWxkIGJlIGludGVyZXN0aW5nIHRvIGJlIGFibGUgdG8gaW5pdGlhbGl6ZSB0aGlzIHZhbHVlcyBm cm9tIGFuIHNjcmlwdCBvciB2aWEgCi8vISAgICAgICAgYW4gc3BlY2lhbCBmaWxlLCBiZWNhdXNl IG9mIHRoYXQgYW55IGNhcnJpZXIgb2JqZWN0IHdpbGwgaGF2ZSBhIGNsYXNzIG5hbWUuIEZvciBp bnN0YW5jZQovLyEgICAgICAgIGEgc29sZGllciBmaWxlIHdpbGwgYmUgYXNzb2NpYXRlZCB0byBp dHMgY29uZmlndXJhdGlvbiB2aWEgYSAiU29sZGllciIgbmFtZS4gVGhlIG5hbWUgb2YgdGhlCi8v ISAgICAgICAgY2xhc3MgY2FuIGJlIHJldHJpZXZlZCB2aWEgaXRzIEMrKyBSVFRJIGluZm9ybWF0 aW9uLgovLyEgICBAcmVtYXJrIEV2ZXJ5IGNhcnJpYWJsZSBvYmplY3QgbXVzdCBoYXZlIG9ubHkg b25lIElDYXJyaWVyIGFzc29jaWF0ZWQgYXMgYSBwYXJlbnQuCnRlbXBsYXRlPCBjbGFzcyBDYXJy aWFibGVPYmplY3QgPgpjbGFzcyBJQ2Fycmllcgp7CnB1YmxpYzoKCiAgIHR5cGVkZWYgdHlwZW5h bWUgQ2FycmllckNvbnRhaW5lcjxDYXJyaWFibGVPYmplY3Q+OjpSZWZlcmVuY2UgQ29udGFpbmVy UmVmZXJlbmNlOwoKICAgQ29udGFpbmVyUmVmZXJlbmNlIGdldENhcnJpZXJDb250YWluZXJCeU5h bWUgKCBVdGlsaXR5OjpTdHJpbmcgbmFtZSApOwoKcHJvdGVjdGVkOgoKICAgLy8hIEBicmllZiBU aGlzIGlzIHRoZSBpbml0aWFsaXphdGlvbiBtZXRob2QgdGhhdCB3ZSB3aWxsIGhhdmUgdG8gb3Zl cnJpZGUgdG8gbW9kaWZ5IHRoZQogICAvLyEgaW5pdGlhbGl6YXRpb24gcHJvY2Vzcy4KICAgdmly dHVhbCB2b2lkIGluaXRpYWxpemVDYXJyaWVyICgpOwoKICAgc3RkOjptYXA8IFV0aWxpdHk6OlN0 cmluZywgQ29udGFpbmVyUmVmZXJlbmNlID4gY2FycmllckNvbnRhaW5lcnM7Cgp9OwoKCnRlbXBs YXRlPCBjbGFzcyBDYXJyaWFibGVPYmplY3QgPgp0eXBlbmFtZSBJQ2FycmllcjxDYXJyaWFibGVP YmplY3Q+OjpDb250YWluZXJSZWZlcmVuY2UgSUNhcnJpZXI8Q2FycmlhYmxlT2JqZWN0Pjo6Z2V0 Q2FycmllckNvbnRhaW5lckJ5TmFtZSAoIFV0aWxpdHk6OlN0cmluZyBuYW1lICkKewogICBDb250 YWluZXJSZWZlcmVuY2UgYXV4ICggY2FycmllckNvbnRhaW5lcnMuZmluZCAoIG5hbWUgKSApOwoK ICAgLy8gI1BSRUNPTkRJVElPTkJFR0lOCiAgIGlmICggYXV4ID09IE5VTEwgKQogICAgICB0aHJv dyBuZXcgWEVJbnZhbGlkUGFyYW1ldGVyICgpOwogICAvLyAjUFJFQ09ORElUSU9ORU5ECgogICBy ZXR1cm4gYXV4OwoKfTsgCgp0ZW1wbGF0ZTwgY2xhc3MgQ2FycmlhYmxlT2JqZWN0ID4Kdm9pZCBJ Q2FycmllcjxDYXJyaWFibGVPYmplY3Q+Ojppbml0aWFsaXplQ2FycmllciAoKQp7fTsKCgoKCX07 IC8vIEJlaGF2aW9yCn07IC8vIFhlbm9jaWRlCgoKI2VuZGlmCg== |