REDROOM
PHP 8.0.30
Path:
Logout
Edit File
Size: 28.09 KB
Close
//proc/thread-self/root/opt/alt/python37/lib64/python3.7/site-packages/numpy/doc/__pycache__/subclassing.cpython-37.pyc
Text
Base64
Qg0NCgAAAADC2EZkkG8AAOMAAAAAAAAAAAAAAAACAAAAQAAAAHMcAAAAZABaAGQBZAJsAW0CWgJtA1oDbQRaBAEAZANTACkEYUhvAAA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpTdWJjbGFzc2luZyBuZGFycmF5IGluIHB5dGhvbgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKSW50cm9kdWN0aW9uCi0tLS0tLS0tLS0tLQoKU3ViY2xhc3NpbmcgbmRhcnJheSBpcyByZWxhdGl2ZWx5IHNpbXBsZSwgYnV0IGl0IGhhcyBzb21lIGNvbXBsaWNhdGlvbnMKY29tcGFyZWQgdG8gb3RoZXIgUHl0aG9uIG9iamVjdHMuICBPbiB0aGlzIHBhZ2Ugd2UgZXhwbGFpbiB0aGUgbWFjaGluZXJ5CnRoYXQgYWxsb3dzIHlvdSB0byBzdWJjbGFzcyBuZGFycmF5LCBhbmQgdGhlIGltcGxpY2F0aW9ucyBmb3IKaW1wbGVtZW50aW5nIGEgc3ViY2xhc3MuCgpuZGFycmF5cyBhbmQgb2JqZWN0IGNyZWF0aW9uCj09PT09PT09PT09PT09PT09PT09PT09PT09PT0KClN1YmNsYXNzaW5nIG5kYXJyYXkgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCBuZXcgaW5zdGFuY2VzIG9mCm5kYXJyYXkgY2xhc3NlcyBjYW4gY29tZSBhYm91dCBpbiB0aHJlZSBkaWZmZXJlbnQgd2F5cy4gIFRoZXNlIGFyZToKCiMuIEV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwgLSBhcyBpbiBgYE15U3ViQ2xhc3MocGFyYW1zKWBgLiAgVGhpcyBpcwogICB0aGUgdXN1YWwgcm91dGUgdG8gUHl0aG9uIGluc3RhbmNlIGNyZWF0aW9uLgojLiBWaWV3IGNhc3RpbmcgLSBjYXN0aW5nIGFuIGV4aXN0aW5nIG5kYXJyYXkgYXMgYSBnaXZlbiBzdWJjbGFzcwojLiBOZXcgZnJvbSB0ZW1wbGF0ZSAtIGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIGZyb20gYSB0ZW1wbGF0ZQogICBpbnN0YW5jZS4gRXhhbXBsZXMgaW5jbHVkZSByZXR1cm5pbmcgc2xpY2VzIGZyb20gYSBzdWJjbGFzc2VkIGFycmF5LAogICBjcmVhdGluZyByZXR1cm4gdHlwZXMgZnJvbSB1ZnVuY3MsIGFuZCBjb3B5aW5nIGFycmF5cy4gIFNlZQogICA6cmVmOmBuZXctZnJvbS10ZW1wbGF0ZWAgZm9yIG1vcmUgZGV0YWlscwoKVGhlIGxhc3QgdHdvIGFyZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgbmRhcnJheXMgLSBpbiBvcmRlciB0byBzdXBwb3J0CnRoaW5ncyBsaWtlIGFycmF5IHNsaWNpbmcuICBUaGUgY29tcGxpY2F0aW9ucyBvZiBzdWJjbGFzc2luZyBuZGFycmF5IGFyZQpkdWUgdG8gdGhlIG1lY2hhbmlzbXMgbnVtcHkgaGFzIHRvIHN1cHBvcnQgdGhlc2UgbGF0dGVyIHR3byByb3V0ZXMgb2YKaW5zdGFuY2UgY3JlYXRpb24uCgouLiBfdmlldy1jYXN0aW5nOgoKVmlldyBjYXN0aW5nCi0tLS0tLS0tLS0tLQoKKlZpZXcgY2FzdGluZyogaXMgdGhlIHN0YW5kYXJkIG5kYXJyYXkgbWVjaGFuaXNtIGJ5IHdoaWNoIHlvdSB0YWtlIGFuCm5kYXJyYXkgb2YgYW55IHN1YmNsYXNzLCBhbmQgcmV0dXJuIGEgdmlldyBvZiB0aGUgYXJyYXkgYXMgYW5vdGhlcgooc3BlY2lmaWVkKSBzdWJjbGFzczoKCj4+PiBpbXBvcnQgbnVtcHkgYXMgbnAKPj4+ICMgY3JlYXRlIGEgY29tcGxldGVseSB1c2VsZXNzIG5kYXJyYXkgc3ViY2xhc3MKPj4+IGNsYXNzIEMobnAubmRhcnJheSk6IHBhc3MKPj4+ICMgY3JlYXRlIGEgc3RhbmRhcmQgbmRhcnJheQo+Pj4gYXJyID0gbnAuemVyb3MoKDMsKSkKPj4+ICMgdGFrZSBhIHZpZXcgb2YgaXQsIGFzIG91ciB1c2VsZXNzIHN1YmNsYXNzCj4+PiBjX2FyciA9IGFyci52aWV3KEMpCj4+PiB0eXBlKGNfYXJyKQo8Y2xhc3MgJ0MnPgoKLi4gX25ldy1mcm9tLXRlbXBsYXRlOgoKQ3JlYXRpbmcgbmV3IGZyb20gdGVtcGxhdGUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk5ldyBpbnN0YW5jZXMgb2YgYW4gbmRhcnJheSBzdWJjbGFzcyBjYW4gYWxzbyBjb21lIGFib3V0IGJ5IGEgdmVyeQpzaW1pbGFyIG1lY2hhbmlzbSB0byA6cmVmOmB2aWV3LWNhc3RpbmdgLCB3aGVuIG51bXB5IGZpbmRzIGl0IG5lZWRzIHRvCmNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBmcm9tIGEgdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgbW9zdCBvYnZpb3VzIHBsYWNlCnRoaXMgaGFzIHRvIGhhcHBlbiBpcyB3aGVuIHlvdSBhcmUgdGFraW5nIHNsaWNlcyBvZiBzdWJjbGFzc2VkIGFycmF5cy4KRm9yIGV4YW1wbGU6Cgo+Pj4gdiA9IGNfYXJyWzE6XQo+Pj4gdHlwZSh2KSAjIHRoZSB2aWV3IGlzIG9mIHR5cGUgJ0MnCjxjbGFzcyAnQyc+Cj4+PiB2IGlzIGNfYXJyICMgYnV0IGl0J3MgYSBuZXcgaW5zdGFuY2UKRmFsc2UKClRoZSBzbGljZSBpcyBhICp2aWV3KiBvbnRvIHRoZSBvcmlnaW5hbCBgYGNfYXJyYGAgZGF0YS4gIFNvLCB3aGVuIHdlCnRha2UgYSB2aWV3IGZyb20gdGhlIG5kYXJyYXksIHdlIHJldHVybiBhIG5ldyBuZGFycmF5LCBvZiB0aGUgc2FtZQpjbGFzcywgdGhhdCBwb2ludHMgdG8gdGhlIGRhdGEgaW4gdGhlIG9yaWdpbmFsLgoKVGhlcmUgYXJlIG90aGVyIHBvaW50cyBpbiB0aGUgdXNlIG9mIG5kYXJyYXlzIHdoZXJlIHdlIG5lZWQgc3VjaCB2aWV3cywKc3VjaCBhcyBjb3B5aW5nIGFycmF5cyAoYGBjX2Fyci5jb3B5KClgYCksIGNyZWF0aW5nIHVmdW5jIG91dHB1dCBhcnJheXMKKHNlZSBhbHNvIDpyZWY6YGFycmF5LXdyYXBgKSwgYW5kIHJlZHVjaW5nIG1ldGhvZHMgKGxpa2UKYGBjX2Fyci5tZWFuKClgYC4KClJlbGF0aW9uc2hpcCBvZiB2aWV3IGNhc3RpbmcgYW5kIG5ldy1mcm9tLXRlbXBsYXRlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpUaGVzZSBwYXRocyBib3RoIHVzZSB0aGUgc2FtZSBtYWNoaW5lcnkuICBXZSBtYWtlIHRoZSBkaXN0aW5jdGlvbiBoZXJlLApiZWNhdXNlIHRoZXkgcmVzdWx0IGluIGRpZmZlcmVudCBpbnB1dCB0byB5b3VyIG1ldGhvZHMuICBTcGVjaWZpY2FsbHksCjpyZWY6YHZpZXctY2FzdGluZ2AgbWVhbnMgeW91IGhhdmUgY3JlYXRlZCBhIG5ldyBpbnN0YW5jZSBvZiB5b3VyIGFycmF5CnR5cGUgZnJvbSBhbnkgcG90ZW50aWFsIHN1YmNsYXNzIG9mIG5kYXJyYXkuICA6cmVmOmBuZXctZnJvbS10ZW1wbGF0ZWAKbWVhbnMgeW91IGhhdmUgY3JlYXRlZCBhIG5ldyBpbnN0YW5jZSBvZiB5b3VyIGNsYXNzIGZyb20gYSBwcmUtZXhpc3RpbmcKaW5zdGFuY2UsIGFsbG93aW5nIHlvdSAtIGZvciBleGFtcGxlIC0gdG8gY29weSBhY3Jvc3MgYXR0cmlidXRlcyB0aGF0CmFyZSBwYXJ0aWN1bGFyIHRvIHlvdXIgc3ViY2xhc3MuCgpJbXBsaWNhdGlvbnMgZm9yIHN1YmNsYXNzaW5nCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCklmIHdlIHN1YmNsYXNzIG5kYXJyYXksIHdlIG5lZWQgdG8gZGVhbCBub3Qgb25seSB3aXRoIGV4cGxpY2l0CmNvbnN0cnVjdGlvbiBvZiBvdXIgYXJyYXkgdHlwZSwgYnV0IGFsc28gOnJlZjpgdmlldy1jYXN0aW5nYCBvcgo6cmVmOmBuZXctZnJvbS10ZW1wbGF0ZWAuICBOdW1QeSBoYXMgdGhlIG1hY2hpbmVyeSB0byBkbyB0aGlzLCBhbmQgdGhpcwptYWNoaW5lcnkgdGhhdCBtYWtlcyBzdWJjbGFzc2luZyBzbGlnaHRseSBub24tc3RhbmRhcmQuCgpUaGVyZSBhcmUgdHdvIGFzcGVjdHMgdG8gdGhlIG1hY2hpbmVyeSB0aGF0IG5kYXJyYXkgdXNlcyB0byBzdXBwb3J0CnZpZXdzIGFuZCBuZXctZnJvbS10ZW1wbGF0ZSBpbiBzdWJjbGFzc2VzLgoKVGhlIGZpcnN0IGlzIHRoZSB1c2Ugb2YgdGhlIGBgbmRhcnJheS5fX25ld19fYGAgbWV0aG9kIGZvciB0aGUgbWFpbiB3b3JrCm9mIG9iamVjdCBpbml0aWFsaXphdGlvbiwgcmF0aGVyIHRoZW4gdGhlIG1vcmUgdXN1YWwgYGBfX2luaXRfX2BgCm1ldGhvZC4gIFRoZSBzZWNvbmQgaXMgdGhlIHVzZSBvZiB0aGUgYGBfX2FycmF5X2ZpbmFsaXplX19gYCBtZXRob2QgdG8KYWxsb3cgc3ViY2xhc3NlcyB0byBjbGVhbiB1cCBhZnRlciB0aGUgY3JlYXRpb24gb2Ygdmlld3MgYW5kIG5ldwppbnN0YW5jZXMgZnJvbSB0ZW1wbGF0ZXMuCgpBIGJyaWVmIFB5dGhvbiBwcmltZXIgb24gYGBfX25ld19fYGAgYW5kIGBgX19pbml0X19gYAo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKYGBfX25ld19fYGAgaXMgYSBzdGFuZGFyZCBQeXRob24gbWV0aG9kLCBhbmQsIGlmIHByZXNlbnQsIGlzIGNhbGxlZApiZWZvcmUgYGBfX2luaXRfX2BgIHdoZW4gd2UgY3JlYXRlIGEgY2xhc3MgaW5zdGFuY2UuIFNlZSB0aGUgYHB5dGhvbgpfX25ld19fIGRvY3VtZW50YXRpb24KPGh0dHA6Ly9kb2NzLnB5dGhvbi5vcmcvcmVmZXJlbmNlL2RhdGFtb2RlbC5odG1sI29iamVjdC5fX25ld19fPmBfIGZvciBtb3JlIGRldGFpbC4KCkZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgZm9sbG93aW5nIFB5dGhvbiBjb2RlOgoKLi4gdGVzdGNvZGU6OgoKICBjbGFzcyBDKG9iamVjdCk6CiAgICAgIGRlZiBfX25ld19fKGNscywgKmFyZ3MpOgogICAgICAgICAgcHJpbnQoJ0NscyBpbiBfX25ld19fOicsIGNscykKICAgICAgICAgIHByaW50KCdBcmdzIGluIF9fbmV3X186JywgYXJncykKICAgICAgICAgIHJldHVybiBvYmplY3QuX19uZXdfXyhjbHMsICphcmdzKQoKICAgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKICAgICAgICAgIHByaW50KCd0eXBlKHNlbGYpIGluIF9faW5pdF9fOicsIHR5cGUoc2VsZikpCiAgICAgICAgICBwcmludCgnQXJncyBpbiBfX2luaXRfXzonLCBhcmdzKQoKbWVhbmluZyB0aGF0IHdlIGdldDoKCj4+PiBjID0gQygnaGVsbG8nKQpDbHMgaW4gX19uZXdfXzogPGNsYXNzICdDJz4KQXJncyBpbiBfX25ld19fOiAoJ2hlbGxvJywpCnR5cGUoc2VsZikgaW4gX19pbml0X186IDxjbGFzcyAnQyc+CkFyZ3MgaW4gX19pbml0X186ICgnaGVsbG8nLCkKCldoZW4gd2UgY2FsbCBgYEMoJ2hlbGxvJylgYCwgdGhlIGBgX19uZXdfX2BgIG1ldGhvZCBnZXRzIGl0cyBvd24gY2xhc3MKYXMgZmlyc3QgYXJndW1lbnQsIGFuZCB0aGUgcGFzc2VkIGFyZ3VtZW50LCB3aGljaCBpcyB0aGUgc3RyaW5nCmBgJ2hlbGxvJ2BgLiAgQWZ0ZXIgcHl0aG9uIGNhbGxzIGBgX19uZXdfX2BgLCBpdCB1c3VhbGx5IChzZWUgYmVsb3cpCmNhbGxzIG91ciBgYF9faW5pdF9fYGAgbWV0aG9kLCB3aXRoIHRoZSBvdXRwdXQgb2YgYGBfX25ld19fYGAgYXMgdGhlCmZpcnN0IGFyZ3VtZW50IChub3cgYSBjbGFzcyBpbnN0YW5jZSksIGFuZCB0aGUgcGFzc2VkIGFyZ3VtZW50cwpmb2xsb3dpbmcuCgpBcyB5b3UgY2FuIHNlZSwgdGhlIG9iamVjdCBjYW4gYmUgaW5pdGlhbGl6ZWQgaW4gdGhlIGBgX19uZXdfX2BgCm1ldGhvZCBvciB0aGUgYGBfX2luaXRfX2BgIG1ldGhvZCwgb3IgYm90aCwgYW5kIGluIGZhY3QgbmRhcnJheSBkb2VzCm5vdCBoYXZlIGFuIGBgX19pbml0X19gYCBtZXRob2QsIGJlY2F1c2UgYWxsIHRoZSBpbml0aWFsaXphdGlvbiBpcwpkb25lIGluIHRoZSBgYF9fbmV3X19gYCBtZXRob2QuCgpXaHkgdXNlIGBgX19uZXdfX2BgIHJhdGhlciB0aGFuIGp1c3QgdGhlIHVzdWFsIGBgX19pbml0X19gYD8gIEJlY2F1c2UKaW4gc29tZSBjYXNlcywgYXMgZm9yIG5kYXJyYXksIHdlIHdhbnQgdG8gYmUgYWJsZSB0byByZXR1cm4gYW4gb2JqZWN0Cm9mIHNvbWUgb3RoZXIgY2xhc3MuICBDb25zaWRlciB0aGUgZm9sbG93aW5nOgoKLi4gdGVzdGNvZGU6OgoKICBjbGFzcyBEKEMpOgogICAgICBkZWYgX19uZXdfXyhjbHMsICphcmdzKToKICAgICAgICAgIHByaW50KCdEIGNscyBpczonLCBjbHMpCiAgICAgICAgICBwcmludCgnRCBhcmdzIGluIF9fbmV3X186JywgYXJncykKICAgICAgICAgIHJldHVybiBDLl9fbmV3X18oQywgKmFyZ3MpCgogICAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgogICAgICAgICAgIyB3ZSBuZXZlciBnZXQgaGVyZQogICAgICAgICAgcHJpbnQoJ0luIEQgX19pbml0X18nKQoKbWVhbmluZyB0aGF0OgoKPj4+IG9iaiA9IEQoJ2hlbGxvJykKRCBjbHMgaXM6IDxjbGFzcyAnRCc+CkQgYXJncyBpbiBfX25ld19fOiAoJ2hlbGxvJywpCkNscyBpbiBfX25ld19fOiA8Y2xhc3MgJ0MnPgpBcmdzIGluIF9fbmV3X186ICgnaGVsbG8nLCkKPj4+IHR5cGUob2JqKQo8Y2xhc3MgJ0MnPgoKVGhlIGRlZmluaXRpb24gb2YgYGBDYGAgaXMgdGhlIHNhbWUgYXMgYmVmb3JlLCBidXQgZm9yIGBgRGBgLCB0aGUKYGBfX25ld19fYGAgbWV0aG9kIHJldHVybnMgYW4gaW5zdGFuY2Ugb2YgY2xhc3MgYGBDYGAgcmF0aGVyIHRoYW4KYGBEYGAuICBOb3RlIHRoYXQgdGhlIGBgX19pbml0X19gYCBtZXRob2Qgb2YgYGBEYGAgZG9lcyBub3QgZ2V0CmNhbGxlZC4gIEluIGdlbmVyYWwsIHdoZW4gdGhlIGBgX19uZXdfX2BgIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBvZgpjbGFzcyBvdGhlciB0aGFuIHRoZSBjbGFzcyBpbiB3aGljaCBpdCBpcyBkZWZpbmVkLCB0aGUgYGBfX2luaXRfX2BgCm1ldGhvZCBvZiB0aGF0IGNsYXNzIGlzIG5vdCBjYWxsZWQuCgpUaGlzIGlzIGhvdyBzdWJjbGFzc2VzIG9mIHRoZSBuZGFycmF5IGNsYXNzIGFyZSBhYmxlIHRvIHJldHVybiB2aWV3cwp0aGF0IHByZXNlcnZlIHRoZSBjbGFzcyB0eXBlLiAgV2hlbiB0YWtpbmcgYSB2aWV3LCB0aGUgc3RhbmRhcmQKbmRhcnJheSBtYWNoaW5lcnkgY3JlYXRlcyB0aGUgbmV3IG5kYXJyYXkgb2JqZWN0IHdpdGggc29tZXRoaW5nCmxpa2U6OgoKICBvYmogPSBuZGFycmF5Ll9fbmV3X18oc3VidHlwZSwgc2hhcGUsIC4uLgoKd2hlcmUgYGBzdWJkdHlwZWBgIGlzIHRoZSBzdWJjbGFzcy4gIFRodXMgdGhlIHJldHVybmVkIHZpZXcgaXMgb2YgdGhlCnNhbWUgY2xhc3MgYXMgdGhlIHN1YmNsYXNzLCByYXRoZXIgdGhhbiBiZWluZyBvZiBjbGFzcyBgYG5kYXJyYXlgYC4KClRoYXQgc29sdmVzIHRoZSBwcm9ibGVtIG9mIHJldHVybmluZyB2aWV3cyBvZiB0aGUgc2FtZSB0eXBlLCBidXQgbm93CndlIGhhdmUgYSBuZXcgcHJvYmxlbS4gIFRoZSBtYWNoaW5lcnkgb2YgbmRhcnJheSBjYW4gc2V0IHRoZSBjbGFzcwp0aGlzIHdheSwgaW4gaXRzIHN0YW5kYXJkIG1ldGhvZHMgZm9yIHRha2luZyB2aWV3cywgYnV0IHRoZSBuZGFycmF5CmBgX19uZXdfX2BgIG1ldGhvZCBrbm93cyBub3RoaW5nIG9mIHdoYXQgd2UgaGF2ZSBkb25lIGluIG91ciBvd24KYGBfX25ld19fYGAgbWV0aG9kIGluIG9yZGVyIHRvIHNldCBhdHRyaWJ1dGVzLCBhbmQgc28gb24uICAoQXNpZGUgLQp3aHkgbm90IGNhbGwgYGBvYmogPSBzdWJkdHlwZS5fX25ld19fKC4uLmBgIHRoZW4/ICBCZWNhdXNlIHdlIG1heSBub3QKaGF2ZSBhIGBgX19uZXdfX2BgIG1ldGhvZCB3aXRoIHRoZSBzYW1lIGNhbGwgc2lnbmF0dXJlKS4KClRoZSByb2xlIG9mIGBgX19hcnJheV9maW5hbGl6ZV9fYGAKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQoKYGBfX2FycmF5X2ZpbmFsaXplX19gYCBpcyB0aGUgbWVjaGFuaXNtIHRoYXQgbnVtcHkgcHJvdmlkZXMgdG8gYWxsb3cKc3ViY2xhc3NlcyB0byBoYW5kbGUgdGhlIHZhcmlvdXMgd2F5cyB0aGF0IG5ldyBpbnN0YW5jZXMgZ2V0IGNyZWF0ZWQuCgpSZW1lbWJlciB0aGF0IHN1YmNsYXNzIGluc3RhbmNlcyBjYW4gY29tZSBhYm91dCBpbiB0aGVzZSB0aHJlZSB3YXlzOgoKIy4gZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCAoYGBvYmogPSBNeVN1YkNsYXNzKHBhcmFtcylgYCkuICBUaGlzIHdpbGwKICAgY2FsbCB0aGUgdXN1YWwgc2VxdWVuY2Ugb2YgYGBNeVN1YkNsYXNzLl9fbmV3X19gYCB0aGVuIChpZiBpdCBleGlzdHMpCiAgIGBgTXlTdWJDbGFzcy5fX2luaXRfX2BgLgojLiA6cmVmOmB2aWV3LWNhc3RpbmdgCiMuIDpyZWY6YG5ldy1mcm9tLXRlbXBsYXRlYAoKT3VyIGBgTXlTdWJDbGFzcy5fX25ld19fYGAgbWV0aG9kIG9ubHkgZ2V0cyBjYWxsZWQgaW4gdGhlIGNhc2Ugb2YgdGhlCmV4cGxpY2l0IGNvbnN0cnVjdG9yIGNhbGwsIHNvIHdlIGNhbid0IHJlbHkgb24gYGBNeVN1YkNsYXNzLl9fbmV3X19gYCBvcgpgYE15U3ViQ2xhc3MuX19pbml0X19gYCB0byBkZWFsIHdpdGggdGhlIHZpZXcgY2FzdGluZyBhbmQKbmV3LWZyb20tdGVtcGxhdGUuICBJdCB0dXJucyBvdXQgdGhhdCBgYE15U3ViQ2xhc3MuX19hcnJheV9maW5hbGl6ZV9fYGAKKmRvZXMqIGdldCBjYWxsZWQgZm9yIGFsbCB0aHJlZSBtZXRob2RzIG9mIG9iamVjdCBjcmVhdGlvbiwgc28gdGhpcyBpcwp3aGVyZSBvdXIgb2JqZWN0IGNyZWF0aW9uIGhvdXNla2VlcGluZyB1c3VhbGx5IGdvZXMuCgoqIEZvciB0aGUgZXhwbGljaXQgY29uc3RydWN0b3IgY2FsbCwgb3VyIHN1YmNsYXNzIHdpbGwgbmVlZCB0byBjcmVhdGUgYQogIG5ldyBuZGFycmF5IGluc3RhbmNlIG9mIGl0cyBvd24gY2xhc3MuICBJbiBwcmFjdGljZSB0aGlzIG1lYW5zIHRoYXQKICB3ZSwgdGhlIGF1dGhvcnMgb2YgdGhlIGNvZGUsIHdpbGwgbmVlZCB0byBtYWtlIGEgY2FsbCB0bwogIGBgbmRhcnJheS5fX25ld19fKE15U3ViQ2xhc3MsLi4uKWBgLCBhIGNsYXNzLWhpZXJhcmNoeSBwcmVwYXJlZCBjYWxsIHRvCiAgYGBzdXBlcihNeVN1YkNsYXNzLCBjbHMpLl9fbmV3X18oY2xzLCAuLi4pYGAsIG9yIGRvIHZpZXcgY2FzdGluZyBvZiBhbgogIGV4aXN0aW5nIGFycmF5IChzZWUgYmVsb3cpCiogRm9yIHZpZXcgY2FzdGluZyBhbmQgbmV3LWZyb20tdGVtcGxhdGUsIHRoZSBlcXVpdmFsZW50IG9mCiAgYGBuZGFycmF5Ll9fbmV3X18oTXlTdWJDbGFzcywuLi5gYCBpcyBjYWxsZWQsIGF0IHRoZSBDIGxldmVsLgoKVGhlIGFyZ3VtZW50cyB0aGF0IGBgX19hcnJheV9maW5hbGl6ZV9fYGAgcmVjZWl2ZXMgZGlmZmVyIGZvciB0aGUgdGhyZWUKbWV0aG9kcyBvZiBpbnN0YW5jZSBjcmVhdGlvbiBhYm92ZS4KClRoZSBmb2xsb3dpbmcgY29kZSBhbGxvd3MgdXMgdG8gbG9vayBhdCB0aGUgY2FsbCBzZXF1ZW5jZXMgYW5kIGFyZ3VtZW50czoKCi4uIHRlc3Rjb2RlOjoKCiAgIGltcG9ydCBudW1weSBhcyBucAoKICAgY2xhc3MgQyhucC5uZGFycmF5KToKICAgICAgIGRlZiBfX25ld19fKGNscywgKmFyZ3MsICoqa3dhcmdzKToKICAgICAgICAgICBwcmludCgnSW4gX19uZXdfXyB3aXRoIGNsYXNzICVzJyAlIGNscykKICAgICAgICAgICByZXR1cm4gc3VwZXIoQywgY2xzKS5fX25ld19fKGNscywgKmFyZ3MsICoqa3dhcmdzKQoKICAgICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgogICAgICAgICAgICMgaW4gcHJhY3RpY2UgeW91IHByb2JhYmx5IHdpbGwgbm90IG5lZWQgb3Igd2FudCBhbiBfX2luaXRfXwogICAgICAgICAgICMgbWV0aG9kIGZvciB5b3VyIHN1YmNsYXNzCiAgICAgICAgICAgcHJpbnQoJ0luIF9faW5pdF9fIHdpdGggY2xhc3MgJXMnICUgc2VsZi5fX2NsYXNzX18pCgogICAgICAgZGVmIF9fYXJyYXlfZmluYWxpemVfXyhzZWxmLCBvYmopOgogICAgICAgICAgIHByaW50KCdJbiBhcnJheV9maW5hbGl6ZTonKQogICAgICAgICAgIHByaW50KCcgICBzZWxmIHR5cGUgaXMgJXMnICUgdHlwZShzZWxmKSkKICAgICAgICAgICBwcmludCgnICAgb2JqIHR5cGUgaXMgJXMnICUgdHlwZShvYmopKQoKCk5vdzoKCj4+PiAjIEV4cGxpY2l0IGNvbnN0cnVjdG9yCj4+PiBjID0gQygoMTAsKSkKSW4gX19uZXdfXyB3aXRoIGNsYXNzIDxjbGFzcyAnQyc+CkluIGFycmF5X2ZpbmFsaXplOgogICBzZWxmIHR5cGUgaXMgPGNsYXNzICdDJz4KICAgb2JqIHR5cGUgaXMgPHR5cGUgJ05vbmVUeXBlJz4KSW4gX19pbml0X18gd2l0aCBjbGFzcyA8Y2xhc3MgJ0MnPgo+Pj4gIyBWaWV3IGNhc3RpbmcKPj4+IGEgPSBucC5hcmFuZ2UoMTApCj4+PiBjYXN0X2EgPSBhLnZpZXcoQykKSW4gYXJyYXlfZmluYWxpemU6CiAgIHNlbGYgdHlwZSBpcyA8Y2xhc3MgJ0MnPgogICBvYmogdHlwZSBpcyA8dHlwZSAnbnVtcHkubmRhcnJheSc+Cj4+PiAjIFNsaWNpbmcgKGV4YW1wbGUgb2YgbmV3LWZyb20tdGVtcGxhdGUpCj4+PiBjdiA9IGNbOjFdCkluIGFycmF5X2ZpbmFsaXplOgogICBzZWxmIHR5cGUgaXMgPGNsYXNzICdDJz4KICAgb2JqIHR5cGUgaXMgPGNsYXNzICdDJz4KClRoZSBzaWduYXR1cmUgb2YgYGBfX2FycmF5X2ZpbmFsaXplX19gYCBpczo6CgogICAgZGVmIF9fYXJyYXlfZmluYWxpemVfXyhzZWxmLCBvYmopOgoKT25lIHNlZXMgdGhhdCB0aGUgYGBzdXBlcmBgIGNhbGwsIHdoaWNoIGdvZXMgdG8KYGBuZGFycmF5Ll9fbmV3X19gYCwgcGFzc2VzIGBgX19hcnJheV9maW5hbGl6ZV9fYGAgdGhlIG5ldyBvYmplY3QsIG9mIG91cgpvd24gY2xhc3MgKGBgc2VsZmBgKSBhcyB3ZWxsIGFzIHRoZSBvYmplY3QgZnJvbSB3aGljaCB0aGUgdmlldyBoYXMgYmVlbgp0YWtlbiAoYGBvYmpgYCkuICBBcyB5b3UgY2FuIHNlZSBmcm9tIHRoZSBvdXRwdXQgYWJvdmUsIHRoZSBgYHNlbGZgYCBpcwphbHdheXMgYSBuZXdseSBjcmVhdGVkIGluc3RhbmNlIG9mIG91ciBzdWJjbGFzcywgYW5kIHRoZSB0eXBlIG9mIGBgb2JqYGAKZGlmZmVycyBmb3IgdGhlIHRocmVlIGluc3RhbmNlIGNyZWF0aW9uIG1ldGhvZHM6CgoqIFdoZW4gY2FsbGVkIGZyb20gdGhlIGV4cGxpY2l0IGNvbnN0cnVjdG9yLCBgYG9iamBgIGlzIGBgTm9uZWBgCiogV2hlbiBjYWxsZWQgZnJvbSB2aWV3IGNhc3RpbmcsIGBgb2JqYGAgY2FuIGJlIGFuIGluc3RhbmNlIG9mIGFueQogIHN1YmNsYXNzIG9mIG5kYXJyYXksIGluY2x1ZGluZyBvdXIgb3duLgoqIFdoZW4gY2FsbGVkIGluIG5ldy1mcm9tLXRlbXBsYXRlLCBgYG9iamBgIGlzIGFub3RoZXIgaW5zdGFuY2Ugb2Ygb3VyCiAgb3duIHN1YmNsYXNzLCB0aGF0IHdlIG1pZ2h0IHVzZSB0byB1cGRhdGUgdGhlIG5ldyBgYHNlbGZgYCBpbnN0YW5jZS4KCkJlY2F1c2UgYGBfX2FycmF5X2ZpbmFsaXplX19gYCBpcyB0aGUgb25seSBtZXRob2QgdGhhdCBhbHdheXMgc2VlcyBuZXcKaW5zdGFuY2VzIGJlaW5nIGNyZWF0ZWQsIGl0IGlzIHRoZSBzZW5zaWJsZSBwbGFjZSB0byBmaWxsIGluIGluc3RhbmNlCmRlZmF1bHRzIGZvciBuZXcgb2JqZWN0IGF0dHJpYnV0ZXMsIGFtb25nIG90aGVyIHRhc2tzLgoKVGhpcyBtYXkgYmUgY2xlYXJlciB3aXRoIGFuIGV4YW1wbGUuCgpTaW1wbGUgZXhhbXBsZSAtIGFkZGluZyBhbiBleHRyYSBhdHRyaWJ1dGUgdG8gbmRhcnJheQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKLi4gdGVzdGNvZGU6OgoKICBpbXBvcnQgbnVtcHkgYXMgbnAKCiAgY2xhc3MgSW5mb0FycmF5KG5wLm5kYXJyYXkpOgoKICAgICAgZGVmIF9fbmV3X18oc3VidHlwZSwgc2hhcGUsIGR0eXBlPWZsb2F0LCBidWZmZXI9Tm9uZSwgb2Zmc2V0PTAsCiAgICAgICAgICAgICAgICAgIHN0cmlkZXM9Tm9uZSwgb3JkZXI9Tm9uZSwgaW5mbz1Ob25lKToKICAgICAgICAgICMgQ3JlYXRlIHRoZSBuZGFycmF5IGluc3RhbmNlIG9mIG91ciB0eXBlLCBnaXZlbiB0aGUgdXN1YWwKICAgICAgICAgICMgbmRhcnJheSBpbnB1dCBhcmd1bWVudHMuICBUaGlzIHdpbGwgY2FsbCB0aGUgc3RhbmRhcmQKICAgICAgICAgICMgbmRhcnJheSBjb25zdHJ1Y3RvciwgYnV0IHJldHVybiBhbiBvYmplY3Qgb2Ygb3VyIHR5cGUuCiAgICAgICAgICAjIEl0IGFsc28gdHJpZ2dlcnMgYSBjYWxsIHRvIEluZm9BcnJheS5fX2FycmF5X2ZpbmFsaXplX18KICAgICAgICAgIG9iaiA9IHN1cGVyKEluZm9BcnJheSwgc3VidHlwZSkuX19uZXdfXyhzdWJ0eXBlLCBzaGFwZSwgZHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCBvZmZzZXQsIHN0cmlkZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JkZXIpCiAgICAgICAgICAjIHNldCB0aGUgbmV3ICdpbmZvJyBhdHRyaWJ1dGUgdG8gdGhlIHZhbHVlIHBhc3NlZAogICAgICAgICAgb2JqLmluZm8gPSBpbmZvCiAgICAgICAgICAjIEZpbmFsbHksIHdlIG11c3QgcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdDoKICAgICAgICAgIHJldHVybiBvYmoKCiAgICAgIGRlZiBfX2FycmF5X2ZpbmFsaXplX18oc2VsZiwgb2JqKToKICAgICAgICAgICMgYGBzZWxmYGAgaXMgYSBuZXcgb2JqZWN0IHJlc3VsdGluZyBmcm9tCiAgICAgICAgICAjIG5kYXJyYXkuX19uZXdfXyhJbmZvQXJyYXksIC4uLiksIHRoZXJlZm9yZSBpdCBvbmx5IGhhcwogICAgICAgICAgIyBhdHRyaWJ1dGVzIHRoYXQgdGhlIG5kYXJyYXkuX19uZXdfXyBjb25zdHJ1Y3RvciBnYXZlIGl0IC0KICAgICAgICAgICMgaS5lLiB0aG9zZSBvZiBhIHN0YW5kYXJkIG5kYXJyYXkuCiAgICAgICAgICAjCiAgICAgICAgICAjIFdlIGNvdWxkIGhhdmUgZ290IHRvIHRoZSBuZGFycmF5Ll9fbmV3X18gY2FsbCBpbiAzIHdheXM6CiAgICAgICAgICAjIEZyb20gYW4gZXhwbGljaXQgY29uc3RydWN0b3IgLSBlLmcuIEluZm9BcnJheSgpOgogICAgICAgICAgIyAgICBvYmogaXMgTm9uZQogICAgICAgICAgIyAgICAod2UncmUgaW4gdGhlIG1pZGRsZSBvZiB0aGUgSW5mb0FycmF5Ll9fbmV3X18KICAgICAgICAgICMgICAgY29uc3RydWN0b3IsIGFuZCBzZWxmLmluZm8gd2lsbCBiZSBzZXQgd2hlbiB3ZSByZXR1cm4gdG8KICAgICAgICAgICMgICAgSW5mb0FycmF5Ll9fbmV3X18pCiAgICAgICAgICBpZiBvYmogaXMgTm9uZTogcmV0dXJuCiAgICAgICAgICAjIEZyb20gdmlldyBjYXN0aW5nIC0gZS5nIGFyci52aWV3KEluZm9BcnJheSk6CiAgICAgICAgICAjICAgIG9iaiBpcyBhcnIKICAgICAgICAgICMgICAgKHR5cGUob2JqKSBjYW4gYmUgSW5mb0FycmF5KQogICAgICAgICAgIyBGcm9tIG5ldy1mcm9tLXRlbXBsYXRlIC0gZS5nIGluZm9hcnJbOjNdCiAgICAgICAgICAjICAgIHR5cGUob2JqKSBpcyBJbmZvQXJyYXkKICAgICAgICAgICMKICAgICAgICAgICMgTm90ZSB0aGF0IGl0IGlzIGhlcmUsIHJhdGhlciB0aGFuIGluIHRoZSBfX25ld19fIG1ldGhvZCwKICAgICAgICAgICMgdGhhdCB3ZSBzZXQgdGhlIGRlZmF1bHQgdmFsdWUgZm9yICdpbmZvJywgYmVjYXVzZSB0aGlzCiAgICAgICAgICAjIG1ldGhvZCBzZWVzIGFsbCBjcmVhdGlvbiBvZiBkZWZhdWx0IG9iamVjdHMgLSB3aXRoIHRoZQogICAgICAgICAgIyBJbmZvQXJyYXkuX19uZXdfXyBjb25zdHJ1Y3RvciwgYnV0IGFsc28gd2l0aAogICAgICAgICAgIyBhcnIudmlldyhJbmZvQXJyYXkpLgogICAgICAgICAgc2VsZi5pbmZvID0gZ2V0YXR0cihvYmosICdpbmZvJywgTm9uZSkKICAgICAgICAgICMgV2UgZG8gbm90IG5lZWQgdG8gcmV0dXJuIGFueXRoaW5nCgoKVXNpbmcgdGhlIG9iamVjdCBsb29rcyBsaWtlIHRoaXM6CgogID4+PiBvYmogPSBJbmZvQXJyYXkoc2hhcGU9KDMsKSkgIyBleHBsaWNpdCBjb25zdHJ1Y3RvcgogID4+PiB0eXBlKG9iaikKICA8Y2xhc3MgJ0luZm9BcnJheSc+CiAgPj4+IG9iai5pbmZvIGlzIE5vbmUKICBUcnVlCiAgPj4+IG9iaiA9IEluZm9BcnJheShzaGFwZT0oMywpLCBpbmZvPSdpbmZvcm1hdGlvbicpCiAgPj4+IG9iai5pbmZvCiAgJ2luZm9ybWF0aW9uJwogID4+PiB2ID0gb2JqWzE6XSAjIG5ldy1mcm9tLXRlbXBsYXRlIC0gaGVyZSAtIHNsaWNpbmcKICA+Pj4gdHlwZSh2KQogIDxjbGFzcyAnSW5mb0FycmF5Jz4KICA+Pj4gdi5pbmZvCiAgJ2luZm9ybWF0aW9uJwogID4+PiBhcnIgPSBucC5hcmFuZ2UoMTApCiAgPj4+IGNhc3RfYXJyID0gYXJyLnZpZXcoSW5mb0FycmF5KSAjIHZpZXcgY2FzdGluZwogID4+PiB0eXBlKGNhc3RfYXJyKQogIDxjbGFzcyAnSW5mb0FycmF5Jz4KICA+Pj4gY2FzdF9hcnIuaW5mbyBpcyBOb25lCiAgVHJ1ZQoKVGhpcyBjbGFzcyBpc24ndCB2ZXJ5IHVzZWZ1bCwgYmVjYXVzZSBpdCBoYXMgdGhlIHNhbWUgY29uc3RydWN0b3IgYXMgdGhlCmJhcmUgbmRhcnJheSBvYmplY3QsIGluY2x1ZGluZyBwYXNzaW5nIGluIGJ1ZmZlcnMgYW5kIHNoYXBlcyBhbmQgc28gb24uCldlIHdvdWxkIHByb2JhYmx5IHByZWZlciB0aGUgY29uc3RydWN0b3IgdG8gYmUgYWJsZSB0byB0YWtlIGFuIGFscmVhZHkKZm9ybWVkIG5kYXJyYXkgZnJvbSB0aGUgdXN1YWwgbnVtcHkgY2FsbHMgdG8gYGBucC5hcnJheWBgIGFuZCByZXR1cm4gYW4Kb2JqZWN0LgoKU2xpZ2h0bHkgbW9yZSByZWFsaXN0aWMgZXhhbXBsZSAtIGF0dHJpYnV0ZSBhZGRlZCB0byBleGlzdGluZyBhcnJheQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpIZXJlIGlzIGEgY2xhc3MgdGhhdCB0YWtlcyBhIHN0YW5kYXJkIG5kYXJyYXkgdGhhdCBhbHJlYWR5IGV4aXN0cywgY2FzdHMKYXMgb3VyIHR5cGUsIGFuZCBhZGRzIGFuIGV4dHJhIGF0dHJpYnV0ZS4KCi4uIHRlc3Rjb2RlOjoKCiAgaW1wb3J0IG51bXB5IGFzIG5wCgogIGNsYXNzIFJlYWxpc3RpY0luZm9BcnJheShucC5uZGFycmF5KToKCiAgICAgIGRlZiBfX25ld19fKGNscywgaW5wdXRfYXJyYXksIGluZm89Tm9uZSk6CiAgICAgICAgICAjIElucHV0IGFycmF5IGlzIGFuIGFscmVhZHkgZm9ybWVkIG5kYXJyYXkgaW5zdGFuY2UKICAgICAgICAgICMgV2UgZmlyc3QgY2FzdCB0byBiZSBvdXIgY2xhc3MgdHlwZQogICAgICAgICAgb2JqID0gbnAuYXNhcnJheShpbnB1dF9hcnJheSkudmlldyhjbHMpCiAgICAgICAgICAjIGFkZCB0aGUgbmV3IGF0dHJpYnV0ZSB0byB0aGUgY3JlYXRlZCBpbnN0YW5jZQogICAgICAgICAgb2JqLmluZm8gPSBpbmZvCiAgICAgICAgICAjIEZpbmFsbHksIHdlIG11c3QgcmV0dXJuIHRoZSBuZXdseSBjcmVhdGVkIG9iamVjdDoKICAgICAgICAgIHJldHVybiBvYmoKCiAgICAgIGRlZiBfX2FycmF5X2ZpbmFsaXplX18oc2VsZiwgb2JqKToKICAgICAgICAgICMgc2VlIEluZm9BcnJheS5fX2FycmF5X2ZpbmFsaXplX18gZm9yIGNvbW1lbnRzCiAgICAgICAgICBpZiBvYmogaXMgTm9uZTogcmV0dXJuCiAgICAgICAgICBzZWxmLmluZm8gPSBnZXRhdHRyKG9iaiwgJ2luZm8nLCBOb25lKQoKClNvOgoKICA+Pj4gYXJyID0gbnAuYXJhbmdlKDUpCiAgPj4+IG9iaiA9IFJlYWxpc3RpY0luZm9BcnJheShhcnIsIGluZm89J2luZm9ybWF0aW9uJykKICA+Pj4gdHlwZShvYmopCiAgPGNsYXNzICdSZWFsaXN0aWNJbmZvQXJyYXknPgogID4+PiBvYmouaW5mbwogICdpbmZvcm1hdGlvbicKICA+Pj4gdiA9IG9ialsxOl0KICA+Pj4gdHlwZSh2KQogIDxjbGFzcyAnUmVhbGlzdGljSW5mb0FycmF5Jz4KICA+Pj4gdi5pbmZvCiAgJ2luZm9ybWF0aW9uJwoKLi4gX2FycmF5LXVmdW5jOgoKYGBfX2FycmF5X3VmdW5jX19gYCBmb3IgdWZ1bmNzCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAuLiB2ZXJzaW9uYWRkZWQ6OiAxLjEzCgpBIHN1YmNsYXNzIGNhbiBvdmVycmlkZSB3aGF0IGhhcHBlbnMgd2hlbiBleGVjdXRpbmcgbnVtcHkgdWZ1bmNzIG9uIGl0IGJ5Cm92ZXJyaWRpbmcgdGhlIGRlZmF1bHQgYGBuZGFycmF5Ll9fYXJyYXlfdWZ1bmNfX2BgIG1ldGhvZC4gVGhpcyBtZXRob2QgaXMKZXhlY3V0ZWQgKmluc3RlYWQqIG9mIHRoZSB1ZnVuYyBhbmQgc2hvdWxkIHJldHVybiBlaXRoZXIgdGhlIHJlc3VsdCBvZiB0aGUKb3BlcmF0aW9uLCBvciA6b2JqOmBOb3RJbXBsZW1lbnRlZGAgaWYgdGhlIG9wZXJhdGlvbiByZXF1ZXN0ZWQgaXMgbm90CmltcGxlbWVudGVkLgoKVGhlIHNpZ25hdHVyZSBvZiBgYF9fYXJyYXlfdWZ1bmNfX2BgIGlzOjoKCiAgICBkZWYgX19hcnJheV91ZnVuY19fKHVmdW5jLCBtZXRob2QsICppbnB1dHMsICoqa3dhcmdzKToKCiAgICAtICp1ZnVuYyogaXMgdGhlIHVmdW5jIG9iamVjdCB0aGF0IHdhcyBjYWxsZWQuCiAgICAtICptZXRob2QqIGlzIGEgc3RyaW5nIGluZGljYXRpbmcgaG93IHRoZSBVZnVuYyB3YXMgY2FsbGVkLCBlaXRoZXIKICAgICAgYGAiX19jYWxsX18iYGAgdG8gaW5kaWNhdGUgaXQgd2FzIGNhbGxlZCBkaXJlY3RseSwgb3Igb25lIG9mIGl0cwogICAgICA6cmVmOmBtZXRob2RzPHVmdW5jcy5tZXRob2RzPmA6IGBgInJlZHVjZSJgYCwgYGAiYWNjdW11bGF0ZSJgYCwKICAgICAgYGAicmVkdWNlYXQiYGAsIGBgIm91dGVyImBgLCBvciBgYCJhdCJgYC4KICAgIC0gKmlucHV0cyogaXMgYSB0dXBsZSBvZiB0aGUgaW5wdXQgYXJndW1lbnRzIHRvIHRoZSBgYHVmdW5jYGAKICAgIC0gKmt3YXJncyogY29udGFpbnMgYW55IG9wdGlvbmFsIG9yIGtleXdvcmQgYXJndW1lbnRzIHBhc3NlZCB0byB0aGUKICAgICAgZnVuY3Rpb24uIFRoaXMgaW5jbHVkZXMgYW55IGBgb3V0YGAgYXJndW1lbnRzLCB3aGljaCBhcmUgYWx3YXlzCiAgICAgIGNvbnRhaW5lZCBpbiBhIHR1cGxlLgoKQSB0eXBpY2FsIGltcGxlbWVudGF0aW9uIHdvdWxkIGNvbnZlcnQgYW55IGlucHV0cyBvciBvdXB1dHMgdGhhdCBhcmUKaW5zdGFuY2VzIG9mIG9uZSdzIG93biBjbGFzcywgcGFzcyBldmVyeXRoaW5nIG9uIHRvIGEgc3VwZXJjbGFzcyB1c2luZwpgYHN1cGVyKClgYCwgYW5kIGZpbmFsbHkgcmV0dXJuIHRoZSByZXN1bHRzIGFmdGVyIHBvc3NpYmxlCmJhY2stY29udmVyc2lvbi4gQW4gZXhhbXBsZSwgdGFrZW4gZnJvbSB0aGUgdGVzdCBjYXNlCmBgdGVzdF91ZnVuY19vdmVycmlkZV93aXRoX3N1cGVyYGAgaW4gYGBjb3JlL3Rlc3RzL3Rlc3RfdW1hdGgucHlgYCwgaXMgdGhlCmZvbGxvd2luZy4KCi4uIHRlc3Rjb2RlOjoKCiAgICBpbnB1dCBudW1weSBhcyBucAoKICAgIGNsYXNzIEEobnAubmRhcnJheSk6CiAgICAgICAgZGVmIF9fYXJyYXlfdWZ1bmNfXyhzZWxmLCB1ZnVuYywgbWV0aG9kLCAqaW5wdXRzLCAqKmt3YXJncyk6CiAgICAgICAgICAgIGFyZ3MgPSBbXQogICAgICAgICAgICBpbl9ubyA9IFtdCiAgICAgICAgICAgIGZvciBpLCBpbnB1dF8gaW4gZW51bWVyYXRlKGlucHV0cyk6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGlucHV0XywgQSk6CiAgICAgICAgICAgICAgICAgICAgaW5fbm8uYXBwZW5kKGkpCiAgICAgICAgICAgICAgICAgICAgYXJncy5hcHBlbmQoaW5wdXRfLnZpZXcobnAubmRhcnJheSkpCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIGFyZ3MuYXBwZW5kKGlucHV0XykKCiAgICAgICAgICAgIG91dHB1dHMgPSBrd2FyZ3MucG9wKCdvdXQnLCBOb25lKQogICAgICAgICAgICBvdXRfbm8gPSBbXQogICAgICAgICAgICBpZiBvdXRwdXRzOgogICAgICAgICAgICAgICAgb3V0X2FyZ3MgPSBbXQogICAgICAgICAgICAgICAgZm9yIGosIG91dHB1dCBpbiBlbnVtZXJhdGUob3V0cHV0cyk6CiAgICAgICAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZShvdXRwdXQsIEEpOgogICAgICAgICAgICAgICAgICAgICAgICBvdXRfbm8uYXBwZW5kKGopCiAgICAgICAgICAgICAgICAgICAgICAgIG91dF9hcmdzLmFwcGVuZChvdXRwdXQudmlldyhucC5uZGFycmF5KSkKICAgICAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgICAgICBvdXRfYXJncy5hcHBlbmQob3V0cHV0KQogICAgICAgICAgICAgICAga3dhcmdzWydvdXQnXSA9IHR1cGxlKG91dF9hcmdzKQogICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgb3V0cHV0cyA9IChOb25lLCkgKiB1ZnVuYy5ub3V0CgogICAgICAgICAgICBpbmZvID0ge30KICAgICAgICAgICAgaWYgaW5fbm86CiAgICAgICAgICAgICAgICBpbmZvWydpbnB1dHMnXSA9IGluX25vCiAgICAgICAgICAgIGlmIG91dF9ubzoKICAgICAgICAgICAgICAgIGluZm9bJ291dHB1dHMnXSA9IG91dF9ubwoKICAgICAgICAgICAgcmVzdWx0cyA9IHN1cGVyKEEsIHNlbGYpLl9fYXJyYXlfdWZ1bmNfXyh1ZnVuYywgbWV0aG9kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphcmdzLCAqKmt3YXJncykKICAgICAgICAgICAgaWYgcmVzdWx0cyBpcyBOb3RJbXBsZW1lbnRlZDoKICAgICAgICAgICAgICAgIHJldHVybiBOb3RJbXBsZW1lbnRlZAoKICAgICAgICAgICAgaWYgbWV0aG9kID09ICdhdCc6CiAgICAgICAgICAgICAgICBpZiBpc2luc3RhbmNlKGlucHV0c1swXSwgQSk6CiAgICAgICAgICAgICAgICAgICAgaW5wdXRzWzBdLmluZm8gPSBpbmZvCiAgICAgICAgICAgICAgICByZXR1cm4KCiAgICAgICAgICAgIGlmIHVmdW5jLm5vdXQgPT0gMToKICAgICAgICAgICAgICAgIHJlc3VsdHMgPSAocmVzdWx0cywpCgogICAgICAgICAgICByZXN1bHRzID0gdHVwbGUoKG5wLmFzYXJyYXkocmVzdWx0KS52aWV3KEEpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgb3V0cHV0IGlzIE5vbmUgZWxzZSBvdXRwdXQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgcmVzdWx0LCBvdXRwdXQgaW4gemlwKHJlc3VsdHMsIG91dHB1dHMpKQogICAgICAgICAgICBpZiByZXN1bHRzIGFuZCBpc2luc3RhbmNlKHJlc3VsdHNbMF0sIEEpOgogICAgICAgICAgICAgICAgcmVzdWx0c1swXS5pbmZvID0gaW5mbwoKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHNbMF0gaWYgbGVuKHJlc3VsdHMpID09IDEgZWxzZSByZXN1bHRzCgpTbywgdGhpcyBjbGFzcyBkb2VzIG5vdCBhY3R1YWxseSBkbyBhbnl0aGluZyBpbnRlcmVzdGluZzogaXQganVzdApjb252ZXJ0cyBhbnkgaW5zdGFuY2VzIG9mIGl0cyBvd24gdG8gcmVndWxhciBuZGFycmF5IChvdGhlcndpc2UsIHdlJ2QKZ2V0IGluZmluaXRlIHJlY3Vyc2lvbiEpLCBhbmQgYWRkcyBhbiBgYGluZm9gYCBkaWN0aW9uYXJ5IHRoYXQgdGVsbHMKd2hpY2ggaW5wdXRzIGFuZCBvdXRwdXRzIGl0IGNvbnZlcnRlZC4gSGVuY2UsIGUuZy4sCgo+Pj4gYSA9IG5wLmFyYW5nZSg1LikudmlldyhBKQo+Pj4gYiA9IG5wLnNpbihhKQo+Pj4gYi5pbmZvCnsnaW5wdXRzJzogWzBdfQo+Pj4gYiA9IG5wLnNpbihucC5hcmFuZ2UoNS4pLCBvdXQ9KGEsKSkKPj4+IGIuaW5mbwp7J291dHB1dHMnOiBbMF19Cj4+PiBhID0gbnAuYXJhbmdlKDUuKS52aWV3KEEpCj4+PiBiID0gbnAub25lcygxKS52aWV3KEEpCj4+PiBjID0gYSArIGIKPj4+IGMuaW5mbwp7J2lucHV0cyc6IFswLCAxXX0KPj4+IGEgKz0gYgo+Pj4gYS5pbmZvCnsnaW5wdXRzJzogWzAsIDFdLCAnb3V0cHV0cyc6IFswXX0KCk5vdGUgdGhhdCBhbm90aGVyIGFwcHJvYWNoIHdvdWxkIGJlIHRvIHRvIHVzZSBgYGdldGF0dHIodWZ1bmMsCm1ldGhvZHMpKCppbnB1dHMsICoqa3dhcmdzKWBgIGluc3RlYWQgb2YgdGhlIGBgc3VwZXJgYCBjYWxsLiBGb3IgdGhpcyBleGFtcGxlLAp0aGUgcmVzdWx0IHdvdWxkIGJlIGlkZW50aWNhbCwgYnV0IHRoZXJlIGlzIGEgZGlmZmVyZW5jZSBpZiBhbm90aGVyIG9wZXJhbmQKYWxzbyBkZWZpbmVzIGBgX19hcnJheV91ZnVuY19fYGAuIEUuZy4sIGxldHMgYXNzdW1lIHRoYXQgd2UgZXZhbHVsYXRlCmBgbnAuYWRkKGEsIGIpYGAsIHdoZXJlIGBgYmBgIGlzIGFuIGluc3RhbmNlIG9mIGFub3RoZXIgY2xhc3MgYGBCYGAgdGhhdCBoYXMKYW4gb3ZlcnJpZGUuICBJZiB5b3UgdXNlIGBgc3VwZXJgYCBhcyBpbiB0aGUgZXhhbXBsZSwKYGBuZGFycmF5Ll9fYXJyYXlfdWZ1bmNfX2BgIHdpbGwgbm90aWNlIHRoYXQgYGBiYGAgaGFzIGFuIG92ZXJyaWRlLCB3aGljaAptZWFucyBpdCBjYW5ub3QgZXZhbHVhdGUgdGhlIHJlc3VsdCBpdHNlbGYuIFRodXMsIGl0IHdpbGwgcmV0dXJuCmBOb3RJbXBsZW1lbnRlZGAgYW5kIHNvIHdpbGwgb3VyIGNsYXNzIGBgQWBgLiBUaGVuLCBjb250cm9sIHdpbGwgYmUgcGFzc2VkCm92ZXIgdG8gYGBiYGAsIHdoaWNoIGVpdGhlciBrbm93cyBob3cgdG8gZGVhbCB3aXRoIHVzIGFuZCBwcm9kdWNlcyBhIHJlc3VsdCwKb3IgZG9lcyBub3QgYW5kIHJldHVybnMgYE5vdEltcGxlbWVudGVkYCwgcmFpc2luZyBhIGBgVHlwZUVycm9yYGAuCgpJZiBpbnN0ZWFkLCB3ZSByZXBsYWNlIG91ciBgYHN1cGVyYGAgY2FsbCB3aXRoIGBgZ2V0YXR0cih1ZnVuYywgbWV0aG9kKWBgLCB3ZQplZmZlY3RpdmVseSBkbyBgYG5wLmFkZChhLnZpZXcobnAubmRhcnJheSksIGIpYGAuIEFnYWluLCBgYEIuX19hcnJheV91ZnVuY19fYGAKd2lsbCBiZSBjYWxsZWQsIGJ1dCBub3cgaXQgc2VlcyBhbiBgYG5kYXJyYXlgYCBhcyB0aGUgb3RoZXIgYXJndW1lbnQuIExpa2VseSwKaXQgd2lsbCBrbm93IGhvdyB0byBoYW5kbGUgdGhpcywgYW5kIHJldHVybiBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgYGBCYGAgY2xhc3MKdG8gdXMuIE91ciBleGFtcGxlIGNsYXNzIGlzIG5vdCBzZXQgdXAgdG8gaGFuZGxlIHRoaXMsIGJ1dCBpdCBtaWdodCB3ZWxsIGJlCnRoZSBiZXN0IGFwcHJvYWNoIGlmLCBlLmcuLCBvbmUgd2VyZSB0byByZS1pbXBsZW1lbnQgYGBNYXNrZWRBcnJheWBgIHVzaW5nCmBgX19hcnJheV91ZnVuY19fYGAuCgpBcyBhIGZpbmFsIG5vdGU6IGlmIHRoZSBgYHN1cGVyYGAgcm91dGUgaXMgc3VpdGVkIHRvIGEgZ2l2ZW4gY2xhc3MsIGFuCmFkdmFudGFnZSBvZiB1c2luZyBpdCBpcyB0aGF0IGl0IGhlbHBzIGluIGNvbnN0cnVjdGluZyBjbGFzcyBoaWVyYXJjaGllcy4KRS5nLiwgc3VwcG9zZSB0aGF0IG91ciBvdGhlciBjbGFzcyBgYEJgYCBhbHNvIHVzZWQgdGhlIGBgc3VwZXJgYCBpbiBpdHMKYGBfX2FycmF5X3VmdW5jX19gYCBpbXBsZW1lbnRhdGlvbiwgYW5kIHdlIGNyZWF0ZWQgYSBjbGFzcyBgYENgYCB0aGF0IGRlcGVuZGVkCm9uIGJvdGgsIGkuZS4sIGBgY2xhc3MgQyhBLCBCKWBgICh3aXRoLCBmb3Igc2ltcGxpY2l0eSwgbm90IGFub3RoZXIKYGBfX2FycmF5X3VmdW5jX19gYCBvdmVycmlkZSkuIFRoZW4gYW55IHVmdW5jIG9uIGFuIGluc3RhbmNlIG9mIGBgQ2BgIHdvdWxkCnBhc3Mgb24gdG8gYGBBLl9fYXJyYXlfdWZ1bmNfX2BgLCB0aGUgYGBzdXBlcmBgIGNhbGwgaW4gYGBBYGAgd291bGQgZ28gdG8KYGBCLl9fYXJyYXlfdWZ1bmNfX2BgLCBhbmQgdGhlIGBgc3VwZXJgYCBjYWxsIGluIGBgQmBgIHdvdWxkIGdvIHRvCmBgbmRhcnJheS5fX2FycmF5X3VmdW5jX19gYCwgdGh1cyBhbGxvd2luZyBgYEFgYCBhbmQgYGBCYGAgdG8gY29sbGFib3JhdGUuCgouLiBfYXJyYXktd3JhcDoKCmBgX19hcnJheV93cmFwX19gYCBmb3IgdWZ1bmNzIGFuZCBvdGhlciBmdW5jdGlvbnMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKUHJpb3IgdG8gbnVtcHkgMS4xMywgdGhlIGJlaGF2aW91ciBvZiB1ZnVuY3MgY291bGQgb25seSBiZSB0dW5lZCB1c2luZwpgYF9fYXJyYXlfd3JhcF9fYGAgYW5kIGBgX19hcnJheV9wcmVwYXJlX19gYC4gVGhlc2UgdHdvIGFsbG93ZWQgb25lIHRvCmNoYW5nZSB0aGUgb3V0cHV0IHR5cGUgb2YgYSB1ZnVuYywgYnV0LCBpbiBjb25zdHJhc3QgdG8KYGBfX2FycmF5X3VmdW5jX19gYCwgZGlkIG5vdCBhbGxvdyBvbmUgdG8gbWFrZSBhbnkgY2hhbmdlcyB0byB0aGUgaW5wdXRzLgpJdCBpcyBob3BlZCB0byBldmVudHVhbGx5IGRlcHJlY2F0ZSB0aGVzZSwgYnV0IGBgX19hcnJheV93cmFwX19gYCBpcyBhbHNvCnVzZWQgYnkgb3RoZXIgbnVtcHkgZnVuY3Rpb25zIGFuZCBtZXRob2RzLCBzdWNoIGFzIGBgc3F1ZWV6ZWBgLCBzbyBhdCB0aGUKcHJlc2VudCB0aW1lIGlzIHN0aWxsIG5lZWRlZCBmb3IgZnVsbCBmdW5jdGlvbmFsaXR5LgoKQ29uY2VwdHVhbGx5LCBgYF9fYXJyYXlfd3JhcF9fYGAgIndyYXBzIHVwIHRoZSBhY3Rpb24iIGluIHRoZSBzZW5zZSBvZgphbGxvd2luZyBhIHN1YmNsYXNzIHRvIHNldCB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuIHZhbHVlIGFuZCB1cGRhdGUKYXR0cmlidXRlcyBhbmQgbWV0YWRhdGEuICBMZXQncyBzaG93IGhvdyB0aGlzIHdvcmtzIHdpdGggYW4gZXhhbXBsZS4gIEZpcnN0CndlIHJldHVybiB0byB0aGUgc2ltcGxlciBleGFtcGxlIHN1YmNsYXNzLCBidXQgd2l0aCBhIGRpZmZlcmVudCBuYW1lIGFuZApzb21lIHByaW50IHN0YXRlbWVudHM6CgouLiB0ZXN0Y29kZTo6CgogIGltcG9ydCBudW1weSBhcyBucAoKICBjbGFzcyBNeVN1YkNsYXNzKG5wLm5kYXJyYXkpOgoKICAgICAgZGVmIF9fbmV3X18oY2xzLCBpbnB1dF9hcnJheSwgaW5mbz1Ob25lKToKICAgICAgICAgIG9iaiA9IG5wLmFzYXJyYXkoaW5wdXRfYXJyYXkpLnZpZXcoY2xzKQogICAgICAgICAgb2JqLmluZm8gPSBpbmZvCiAgICAgICAgICByZXR1cm4gb2JqCgogICAgICBkZWYgX19hcnJheV9maW5hbGl6ZV9fKHNlbGYsIG9iaik6CiAgICAgICAgICBwcmludCgnSW4gX19hcnJheV9maW5hbGl6ZV9fOicpCiAgICAgICAgICBwcmludCgnICAgc2VsZiBpcyAlcycgJSByZXByKHNlbGYpKQogICAgICAgICAgcHJpbnQoJyAgIG9iaiBpcyAlcycgJSByZXByKG9iaikpCiAgICAgICAgICBpZiBvYmogaXMgTm9uZTogcmV0dXJuCiAgICAgICAgICBzZWxmLmluZm8gPSBnZXRhdHRyKG9iaiwgJ2luZm8nLCBOb25lKQoKICAgICAgZGVmIF9fYXJyYXlfd3JhcF9fKHNlbGYsIG91dF9hcnIsIGNvbnRleHQ9Tm9uZSk6CiAgICAgICAgICBwcmludCgnSW4gX19hcnJheV93cmFwX186JykKICAgICAgICAgIHByaW50KCcgICBzZWxmIGlzICVzJyAlIHJlcHIoc2VsZikpCiAgICAgICAgICBwcmludCgnICAgYXJyIGlzICVzJyAlIHJlcHIob3V0X2FycikpCiAgICAgICAgICAjIHRoZW4ganVzdCBjYWxsIHRoZSBwYXJlbnQKICAgICAgICAgIHJldHVybiBzdXBlcihNeVN1YkNsYXNzLCBzZWxmKS5fX2FycmF5X3dyYXBfXyhzZWxmLCBvdXRfYXJyLCBjb250ZXh0KQoKV2UgcnVuIGEgdWZ1bmMgb24gYW4gaW5zdGFuY2Ugb2Ygb3VyIG5ldyBhcnJheToKCj4+PiBvYmogPSBNeVN1YkNsYXNzKG5wLmFyYW5nZSg1KSwgaW5mbz0nc3BhbScpCkluIF9fYXJyYXlfZmluYWxpemVfXzoKICAgc2VsZiBpcyBNeVN1YkNsYXNzKFswLCAxLCAyLCAzLCA0XSkKICAgb2JqIGlzIGFycmF5KFswLCAxLCAyLCAzLCA0XSkKPj4+IGFycjIgPSBucC5hcmFuZ2UoNSkrMQo+Pj4gcmV0ID0gbnAuYWRkKGFycjIsIG9iaikKSW4gX19hcnJheV93cmFwX186CiAgIHNlbGYgaXMgTXlTdWJDbGFzcyhbMCwgMSwgMiwgMywgNF0pCiAgIGFyciBpcyBhcnJheShbMSwgMywgNSwgNywgOV0pCkluIF9fYXJyYXlfZmluYWxpemVfXzoKICAgc2VsZiBpcyBNeVN1YkNsYXNzKFsxLCAzLCA1LCA3LCA5XSkKICAgb2JqIGlzIE15U3ViQ2xhc3MoWzAsIDEsIDIsIDMsIDRdKQo+Pj4gcmV0Ck15U3ViQ2xhc3MoWzEsIDMsIDUsIDcsIDldKQo+Pj4gcmV0LmluZm8KJ3NwYW0nCgpOb3RlIHRoYXQgdGhlIHVmdW5jIChgYG5wLmFkZGBgKSBoYXMgY2FsbGVkIHRoZSBgYF9fYXJyYXlfd3JhcF9fYGAgbWV0aG9kCndpdGggYXJndW1lbnRzIGBgc2VsZmBgIGFzIGBgb2JqYGAsIGFuZCBgYG91dF9hcnJgYCBhcyB0aGUgKG5kYXJyYXkpIHJlc3VsdApvZiB0aGUgYWRkaXRpb24uICBJbiB0dXJuLCB0aGUgZGVmYXVsdCBgYF9fYXJyYXlfd3JhcF9fYGAKKGBgbmRhcnJheS5fX2FycmF5X3dyYXBfX2BgKSBoYXMgY2FzdCB0aGUgcmVzdWx0IHRvIGNsYXNzIGBgTXlTdWJDbGFzc2BgLAphbmQgY2FsbGVkIGBgX19hcnJheV9maW5hbGl6ZV9fYGAgLSBoZW5jZSB0aGUgY29weWluZyBvZiB0aGUgYGBpbmZvYGAKYXR0cmlidXRlLiAgVGhpcyBoYXMgYWxsIGhhcHBlbmVkIGF0IHRoZSBDIGxldmVsLgoKQnV0LCB3ZSBjb3VsZCBkbyBhbnl0aGluZyB3ZSB3YW50ZWQ6CgouLiB0ZXN0Y29kZTo6CgogIGNsYXNzIFNpbGx5U3ViQ2xhc3MobnAubmRhcnJheSk6CgogICAgICBkZWYgX19hcnJheV93cmFwX18oc2VsZiwgYXJyLCBjb250ZXh0PU5vbmUpOgogICAgICAgICAgcmV0dXJuICdJIGxvc3QgeW91ciBkYXRhJwoKPj4+IGFycjEgPSBucC5hcmFuZ2UoNSkKPj4+IG9iaiA9IGFycjEudmlldyhTaWxseVN1YkNsYXNzKQo+Pj4gYXJyMiA9IG5wLmFyYW5nZSg1KQo+Pj4gcmV0ID0gbnAubXVsdGlwbHkob2JqLCBhcnIyKQo+Pj4gcmV0CidJIGxvc3QgeW91ciBkYXRhJwoKU28sIGJ5IGRlZmluaW5nIGEgc3BlY2lmaWMgYGBfX2FycmF5X3dyYXBfX2BgIG1ldGhvZCBmb3Igb3VyIHN1YmNsYXNzLAp3ZSBjYW4gdHdlYWsgdGhlIG91dHB1dCBmcm9tIHVmdW5jcy4gVGhlIGBgX19hcnJheV93cmFwX19gYCBtZXRob2QKcmVxdWlyZXMgYGBzZWxmYGAsIHRoZW4gYW4gYXJndW1lbnQgLSB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHRoZSB1ZnVuYyAtCmFuZCBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgKmNvbnRleHQqLiBUaGlzIHBhcmFtZXRlciBpcyByZXR1cm5lZCBieQp1ZnVuY3MgYXMgYSAzLWVsZW1lbnQgdHVwbGU6IChuYW1lIG9mIHRoZSB1ZnVuYywgYXJndW1lbnRzIG9mIHRoZSB1ZnVuYywKZG9tYWluIG9mIHRoZSB1ZnVuYyksIGJ1dCBpcyBub3Qgc2V0IGJ5IG90aGVyIG51bXB5IGZ1bmN0aW9ucy4gVGhvdWdoLAphcyBzZWVuIGFib3ZlLCBpdCBpcyBwb3NzaWJsZSB0byBkbyBvdGhlcndpc2UsIGBgX19hcnJheV93cmFwX19gYCBzaG91bGQKcmV0dXJuIGFuIGluc3RhbmNlIG9mIGl0cyBjb250YWluaW5nIGNsYXNzLiAgU2VlIHRoZSBtYXNrZWQgYXJyYXkKc3ViY2xhc3MgZm9yIGFuIGltcGxlbWVudGF0aW9uLgoKSW4gYWRkaXRpb24gdG8gYGBfX2FycmF5X3dyYXBfX2BgLCB3aGljaCBpcyBjYWxsZWQgb24gdGhlIHdheSBvdXQgb2YgdGhlCnVmdW5jLCB0aGVyZSBpcyBhbHNvIGFuIGBgX19hcnJheV9wcmVwYXJlX19gYCBtZXRob2Qgd2hpY2ggaXMgY2FsbGVkIG9uCnRoZSB3YXkgaW50byB0aGUgdWZ1bmMsIGFmdGVyIHRoZSBvdXRwdXQgYXJyYXlzIGFyZSBjcmVhdGVkIGJ1dCBiZWZvcmUgYW55CmNvbXB1dGF0aW9uIGhhcyBiZWVuIHBlcmZvcm1lZC4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nCmJ1dCBwYXNzIHRocm91Z2ggdGhlIGFycmF5LiBgYF9fYXJyYXlfcHJlcGFyZV9fYGAgc2hvdWxkIG5vdCBhdHRlbXB0IHRvCmFjY2VzcyB0aGUgYXJyYXkgZGF0YSBvciByZXNpemUgdGhlIGFycmF5LCBpdCBpcyBpbnRlbmRlZCBmb3Igc2V0dGluZyB0aGUKb3V0cHV0IGFycmF5IHR5cGUsIHVwZGF0aW5nIGF0dHJpYnV0ZXMgYW5kIG1ldGFkYXRhLCBhbmQgcGVyZm9ybWluZyBhbnkKY2hlY2tzIGJhc2VkIG9uIHRoZSBpbnB1dCB0aGF0IG1heSBiZSBkZXNpcmVkIGJlZm9yZSBjb21wdXRhdGlvbiBiZWdpbnMuCkxpa2UgYGBfX2FycmF5X3dyYXBfX2BgLCBgYF9fYXJyYXlfcHJlcGFyZV9fYGAgbXVzdCByZXR1cm4gYW4gbmRhcnJheSBvcgpzdWJjbGFzcyB0aGVyZW9mIG9yIHJhaXNlIGFuIGVycm9yLgoKRXh0cmEgZ290Y2hhcyAtIGN1c3RvbSBgYF9fZGVsX19gYCBtZXRob2RzIGFuZCBuZGFycmF5LmJhc2UKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCk9uZSBvZiB0aGUgcHJvYmxlbXMgdGhhdCBuZGFycmF5IHNvbHZlcyBpcyBrZWVwaW5nIHRyYWNrIG9mIG1lbW9yeQpvd25lcnNoaXAgb2YgbmRhcnJheXMgYW5kIHRoZWlyIHZpZXdzLiAgQ29uc2lkZXIgdGhlIGNhc2Ugd2hlcmUgd2UgaGF2ZQpjcmVhdGVkIGFuIG5kYXJyYXksIGBgYXJyYGAgYW5kIGhhdmUgdGFrZW4gYSBzbGljZSB3aXRoIGBgdiA9IGFyclsxOl1gYC4KVGhlIHR3byBvYmplY3RzIGFyZSBsb29raW5nIGF0IHRoZSBzYW1lIG1lbW9yeS4gIE51bVB5IGtlZXBzIHRyYWNrIG9mCndoZXJlIHRoZSBkYXRhIGNhbWUgZnJvbSBmb3IgYSBwYXJ0aWN1bGFyIGFycmF5IG9yIHZpZXcsIHdpdGggdGhlCmBgYmFzZWBgIGF0dHJpYnV0ZToKCj4+PiAjIEEgbm9ybWFsIG5kYXJyYXksIHRoYXQgb3ducyBpdHMgb3duIGRhdGEKPj4+IGFyciA9IG5wLnplcm9zKCg0LCkpCj4+PiAjIEluIHRoaXMgY2FzZSwgYmFzZSBpcyBOb25lCj4+PiBhcnIuYmFzZSBpcyBOb25lClRydWUKPj4+ICMgV2UgdGFrZSBhIHZpZXcKPj4+IHYxID0gYXJyWzE6XQo+Pj4gIyBiYXNlIG5vdyBwb2ludHMgdG8gdGhlIGFycmF5IHRoYXQgaXQgZGVyaXZlZCBmcm9tCj4+PiB2MS5iYXNlIGlzIGFycgpUcnVlCj4+PiAjIFRha2UgYSB2aWV3IG9mIGEgdmlldwo+Pj4gdjIgPSB2MVsxOl0KPj4+ICMgYmFzZSBwb2ludHMgdG8gdGhlIHZpZXcgaXQgZGVyaXZlZCBmcm9tCj4+PiB2Mi5iYXNlIGlzIHYxClRydWUKCkluIGdlbmVyYWwsIGlmIHRoZSBhcnJheSBvd25zIGl0cyBvd24gbWVtb3J5LCBhcyBmb3IgYGBhcnJgYCBpbiB0aGlzCmNhc2UsIHRoZW4gYGBhcnIuYmFzZWBgIHdpbGwgYmUgTm9uZSAtIHRoZXJlIGFyZSBzb21lIGV4Y2VwdGlvbnMgdG8gdGhpcwotIHNlZSB0aGUgbnVtcHkgYm9vayBmb3IgbW9yZSBkZXRhaWxzLgoKVGhlIGBgYmFzZWBgIGF0dHJpYnV0ZSBpcyB1c2VmdWwgaW4gYmVpbmcgYWJsZSB0byB0ZWxsIHdoZXRoZXIgd2UgaGF2ZQphIHZpZXcgb3IgdGhlIG9yaWdpbmFsIGFycmF5LiAgVGhpcyBpbiB0dXJuIGNhbiBiZSB1c2VmdWwgaWYgd2UgbmVlZAp0byBrbm93IHdoZXRoZXIgb3Igbm90IHRvIGRvIHNvbWUgc3BlY2lmaWMgY2xlYW51cCB3aGVuIHRoZSBzdWJjbGFzc2VkCmFycmF5IGlzIGRlbGV0ZWQuICBGb3IgZXhhbXBsZSwgd2UgbWF5IG9ubHkgd2FudCB0byBkbyB0aGUgY2xlYW51cCBpZgp0aGUgb3JpZ2luYWwgYXJyYXkgaXMgZGVsZXRlZCwgYnV0IG5vdCB0aGUgdmlld3MuICBGb3IgYW4gZXhhbXBsZSBvZgpob3cgdGhpcyBjYW4gd29yaywgaGF2ZSBhIGxvb2sgYXQgdGhlIGBgbWVtbWFwYGAgY2xhc3MgaW4KYGBudW1weS5jb3JlYGAuCgpTdWJjbGFzc2luZyBhbmQgRG93bnN0cmVhbSBDb21wYXRpYmlsaXR5Ci0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCldoZW4gc3ViLWNsYXNzaW5nIGBgbmRhcnJheWBgIG9yIGNyZWF0aW5nIGR1Y2stdHlwZXMgdGhhdCBtaW1pYyB0aGUgYGBuZGFycmF5YGAKaW50ZXJmYWNlLCBpdCBpcyB5b3VyIHJlc3BvbnNpYmlsaXR5IHRvIGRlY2lkZSBob3cgYWxpZ25lZCB5b3VyIEFQSXMgd2lsbCBiZQp3aXRoIHRob3NlIG9mIG51bXB5LiBGb3IgY29udmVuaWVuY2UsIG1hbnkgbnVtcHkgZnVuY3Rpb25zIHRoYXQgaGF2ZSBhIGNvcnJlc3BvbmRpbmcKYGBuZGFycmF5YGAgbWV0aG9kIChlLmcuLCBgYHN1bWBgLCBgYG1lYW5gYCwgYGB0YWtlYGAsIGBgcmVzaGFwZWBgKSB3b3JrIGJ5IGNoZWNraW5nCmlmIHRoZSBmaXJzdCBhcmd1bWVudCB0byBhIGZ1bmN0aW9uIGhhcyBhIG1ldGhvZCBvZiB0aGUgc2FtZSBuYW1lLiBJZiBpdCBleGlzdHMsIHRoZQptZXRob2QgaXMgY2FsbGVkIGluc3RlYWQgb2YgY29lcmNpbmcgdGhlIGFyZ3VtZW50cyB0byBhIG51bXB5IGFycmF5LgoKRm9yIGV4YW1wbGUsIGlmIHlvdSB3YW50IHlvdXIgc3ViLWNsYXNzIG9yIGR1Y2stdHlwZSB0byBiZSBjb21wYXRpYmxlIHdpdGgKbnVtcHkncyBgYHN1bWBgIGZ1bmN0aW9uLCB0aGUgbWV0aG9kIHNpZ25hdHVyZSBmb3IgdGhpcyBvYmplY3QncyBgYHN1bWBgIG1ldGhvZApzaG91bGQgYmUgdGhlIGZvbGxvd2luZzoKCi4uIHRlc3Rjb2RlOjoKCiAgICBkZWYgc3VtKHNlbGYsIGF4aXM9Tm9uZSwgZHR5cGU9Tm9uZSwgb3V0PU5vbmUsIGtlZXBkaW1zPUZhbHNlKToKICAgIC4uLgoKVGhpcyBpcyB0aGUgZXhhY3Qgc2FtZSBtZXRob2Qgc2lnbmF0dXJlIGZvciBgYG5wLnN1bWBgLCBzbyBub3cgaWYgYSB1c2VyIGNhbGxzCmBgbnAuc3VtYGAgb24gdGhpcyBvYmplY3QsIG51bXB5IHdpbGwgY2FsbCB0aGUgb2JqZWN0J3Mgb3duIGBgc3VtYGAgbWV0aG9kIGFuZApwYXNzIGluIHRoZXNlIGFyZ3VtZW50cyBlbnVtZXJhdGVkIGFib3ZlIGluIHRoZSBzaWduYXR1cmUsIGFuZCBubyBlcnJvcnMgd2lsbApiZSByYWlzZWQgYmVjYXVzZSB0aGUgc2lnbmF0dXJlcyBhcmUgY29tcGxldGVseSBjb21wYXRpYmxlIHdpdGggZWFjaCBvdGhlci4KCklmLCBob3dldmVyLCB5b3UgZGVjaWRlIHRvIGRldmlhdGUgZnJvbSB0aGlzIHNpZ25hdHVyZSBhbmQgZG8gc29tZXRoaW5nIGxpa2UgdGhpczoKCi4uIHRlc3Rjb2RlOjoKCiAgIGRlZiBzdW0oc2VsZiwgYXhpcz1Ob25lLCBkdHlwZT1Ob25lKToKICAgLi4uCgpUaGlzIG9iamVjdCBpcyBubyBsb25nZXIgY29tcGF0aWJsZSB3aXRoIGBgbnAuc3VtYGAgYmVjYXVzZSBpZiB5b3UgY2FsbCBgYG5wLnN1bWBgLAppdCB3aWxsIHBhc3MgaW4gdW5leHBlY3RlZCBhcmd1bWVudHMgYGBvdXRgYCBhbmQgYGBrZWVwZGltc2BgLCBjYXVzaW5nIGEgVHlwZUVycm9yCnRvIGJlIHJhaXNlZC4KCklmIHlvdSB3aXNoIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkgd2l0aCBudW1weSBhbmQgaXRzIHN1YnNlcXVlbnQgdmVyc2lvbnMgKHdoaWNoCm1pZ2h0IGFkZCBuZXcga2V5d29yZCBhcmd1bWVudHMpIGJ1dCBkbyBub3Qgd2FudCB0byBzdXJmYWNlIGFsbCBvZiBudW1weSdzIGFyZ3VtZW50cywKeW91ciBmdW5jdGlvbidzIHNpZ25hdHVyZSBzaG91bGQgYWNjZXB0IGBgKiprd2FyZ3NgYC4gRm9yIGV4YW1wbGU6CgouLiB0ZXN0Y29kZTo6CgogICBkZWYgc3VtKHNlbGYsIGF4aXM9Tm9uZSwgZHR5cGU9Tm9uZSwgKip1bnVzZWRfa3dhcmdzKToKICAgLi4uCgpUaGlzIG9iamVjdCBpcyBub3cgY29tcGF0aWJsZSB3aXRoIGBgbnAuc3VtYGAgYWdhaW4gYmVjYXVzZSBhbnkgZXh0cmFuZW91cyBhcmd1bWVudHMKKGkuZS4ga2V5d29yZHMgdGhhdCBhcmUgbm90IGBgYXhpc2BgIG9yIGBgZHR5cGVgYCkgd2lsbCBiZSBoaWRkZW4gYXdheSBpbiB0aGUKYGAqKnVudXNlZF9rd2FyZ3NgYCBwYXJhbWV0ZXIuCgrpAAAAACkD2ghkaXZpc2lvbtoPYWJzb2x1dGVfaW1wb3J02g5wcmludF9mdW5jdGlvbk4pBdoHX19kb2NfX9oKX19mdXR1cmVfX3ICAAAAcgMAAAByBAAAAKkAcgcAAAByBwAAAPpIL29wdC9hbHQvcHl0aG9uMzcvbGliNjQvcHl0aG9uMy43L3NpdGUtcGFja2FnZXMvbnVtcHkvZG9jL3N1YmNsYXNzaW5nLnB52gg8bW9kdWxlPu8CAABzAgAAAAQB
Base64 mode: content will be decoded on save.
Save
Close
Exit & Reset
Directory Contents
Dirs: 0 × Files: 13
Delete Selected
Select All
Select None
Sort:
Name
Size
Modified
Enable drag-to-move
Name
Size
Perms
Modified
Actions
basics.cpython-37.pyc
7.91 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
broadcasting.cpython-37.pyc
5.63 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
byteswapping.cpython-37.pyc
5.41 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
constants.cpython-37.pyc
7.69 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
creation.cpython-37.pyc
5.57 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
glossary.cpython-37.pyc
12.29 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
indexing.cpython-37.pyc
15.50 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
internals.cpython-37.pyc
9.64 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
misc.cpython-37.pyc
6.21 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
structured_arrays.cpython-37.pyc
11.38 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
subclassing.cpython-37.pyc
28.09 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
ufuncs.cpython-37.pyc
5.49 KB
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
__init__.cpython-37.pyc
865 B
lrw-r--r--
2023-04-24 19:38:36
Edit
Download
Rename
Chmod
Change Date
Delete
OK
Cancel
recursive
OK
Cancel
recursive
OK
Cancel
Zip Selected
If ZipArchive is unavailable, a
.tar
will be created (no compression).