pax_global_header00006660000000000000000000000064151151075040014511gustar00rootroot0000000000000052 comment=deeba098d33d3d3bec414782e732ae3c766e6e5d pudb-2025.1.5/000077500000000000000000000000001511510750400126775ustar00rootroot00000000000000pudb-2025.1.5/.basedpyright/000077500000000000000000000000001511510750400154425ustar00rootroot00000000000000pudb-2025.1.5/.basedpyright/baseline.json000066400000000000000000023502721511510750400201320ustar00rootroot00000000000000{ "files": { "./debug_me.py": [ { "code": "reportUntypedNamedTuple", "range": { "startColumn": 8, "endColumn": 62, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 28, "endColumn": 61, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 16, "endColumn": 17, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 16, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 5, "lineCount": 1 } }, { "code": "reportUnusedVariable", "range": { "startColumn": 4, "endColumn": 5, "lineCount": 1 } }, { "code": "reportUnusedVariable", "range": { "startColumn": 4, "endColumn": 5, "lineCount": 1 } }, { "code": "reportUnusedVariable", "range": { "startColumn": 4, "endColumn": 5, "lineCount": 1 } }, { "code": "reportUnusedVariable", "range": { "startColumn": 4, "endColumn": 5, "lineCount": 1 } }, { "code": "reportUnusedVariable", "range": { "startColumn": 4, "endColumn": 5, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 11, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 11, "endColumn": 12, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 11, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 43, "lineCount": 1 } } ], "./examples/mpi4py-debug.py": [ { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 5, "lineCount": 1 } }, { "code": "reportUndefinedVariable", "range": { "startColumn": 12, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 11, "endColumn": 12, "lineCount": 1 } } ], "./examples/remote-debug.py": [ { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 5, "lineCount": 1 } }, { "code": "reportUndefinedVariable", "range": { "startColumn": 12, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 11, "endColumn": 12, "lineCount": 1 } } ], "./examples/shell.py": [ { "code": "reportUnknownParameterType", "range": { "startColumn": 15, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 15, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 49, "endColumn": 56, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 16, "endColumn": 27, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } } ], "./examples/stringifier.py": [ { "code": "reportUnknownParameterType", "range": { "startColumn": 12, "endColumn": 18, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 12, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 12, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 20, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 23, "endColumn": 58, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 4, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 21, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 21, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 61, "endColumn": 65, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 45, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 4, "endColumn": 5, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 13, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 19, "endColumn": 26, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 11, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 21, "endColumn": 24, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 21, "endColumn": 24, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 15, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 15, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 21, "endColumn": 24, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 15, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 15, "lineCount": 1 } } ], "./examples/theme.py": [ { "code": "reportUndefinedVariable", "range": { "startColumn": 0, "endColumn": 7, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 0, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUndefinedVariable", "range": { "startColumn": 15, "endColumn": 26, "lineCount": 1 } } ], "./manual-tests/test-api.py": [ { "code": "reportUndefinedVariable", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } }, { "code": "reportUnusedExpression", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } } ], "./manual-tests/test-postmortem.py": [ { "code": "reportUndefinedVariable", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } }, { "code": "reportUnusedExpression", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } } ], "./pudb/__init__.py": [ { "code": "reportUnknownMemberType", "range": { "startColumn": 50, "endColumn": 71, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 60, "endColumn": 71, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 26, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 50, "endColumn": 71, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 60, "endColumn": 71, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 26, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 20, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 25, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 25, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 25, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 25, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 25, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 25, "endColumn": 31, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 24, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnusedFunction", "range": { "startColumn": 4, "endColumn": 18, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 29, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 8, "endColumn": 11, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 34, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 24, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 34, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 24, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 43, "endColumn": 50, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 46, "endColumn": 50, "lineCount": 1 } }, { "code": "reportOptionalMemberAccess", "range": { "startColumn": 46, "endColumn": 50, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 19, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnreachable", "range": { "startColumn": 4, "endColumn": 28, "lineCount": 4 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 12, "endColumn": 22, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 12, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 38, "endColumn": 44, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 38, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 35, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 56, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 46, "endColumn": 67, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 56, "endColumn": 67, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 22, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 36, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 21, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 21, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 42, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 35, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 50, "endColumn": 71, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 60, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 22, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 58, "lineCount": 1 } } ], "./pudb/__main__.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } } ], "./pudb/_shtab.py": [ { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 43, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 37, "endColumn": 43, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 11, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 11, "endColumn": 17, "lineCount": 1 } } ], "./pudb/b.py": [ { "code": "reportPrivateUsage", "range": { "startColumn": 17, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 17, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 32, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 17, "endColumn": 21, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 17, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 32, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUndefinedVariable", "range": { "startColumn": 11, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 11, "endColumn": 48, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 22, "endColumn": 31, "lineCount": 1 } }, { "code": "reportOptionalMemberAccess", "range": { "startColumn": 41, "endColumn": 47, "lineCount": 1 } } ], "./pudb/debugger.py": [ { "code": "reportMissingTypeStubs", "range": { "startColumn": 7, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 35, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 29, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 22, "endColumn": 53, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 36, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 56, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 18, "endColumn": 24, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 33, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnreachable", "range": { "startColumn": 12, "endColumn": 36, "lineCount": 3 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 40, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 24, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnreachable", "range": { "startColumn": 16, "endColumn": 46, "lineCount": 6 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 29, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 48, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 34, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 21, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 32, "endColumn": 41, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 32, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 23, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 26, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUninitializedInstanceVariable", "range": { "startColumn": 13, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 39, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 27, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 40, "endColumn": 72, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 47, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 61, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 15, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 39, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 41, "endColumn": 43, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 41, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 38, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 45, "endColumn": 47, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 12, "endColumn": 15, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 28, "endColumn": 31, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 21, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUninitializedInstanceVariable", "range": { "startColumn": 13, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 28, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 39, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 19, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 31, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 33, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 38, "endColumn": 43, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 38, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 48, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 48, "endColumn": 72, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 48, "endColumn": 72, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 22, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 25, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 19, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 36, "endColumn": 61, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 42, "endColumn": 61, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 39, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 27, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 26, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 17, "endColumn": 21, "lineCount": 1 } }, { "code": "reportIncompatibleMethodOverride", "range": { "startColumn": 8, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 22, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 5, "endColumn": 22, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 9, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 31, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 20, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 34, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 20, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 26, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 27, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 27, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 27, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 27, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 21, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 19, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 38, "endColumn": 69, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 34, "endColumn": 65, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 42, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 44, "endColumn": 57, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 44, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 41, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 43, "endColumn": 52, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 43, "endColumn": 52, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 13, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 21, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 32, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 32, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 21, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 21, "endColumn": 22, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 21, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 30, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 42, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 42, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 63, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 15, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 12, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 39, "endColumn": 43, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 39, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 26, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 27, "endColumn": 59, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 33, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { "startColumn": 36, "endColumn": 80, "lineCount": 2 } }, { "code": "reportArgumentType", "range": { "startColumn": 49, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 58, "endColumn": 83, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 58, "endColumn": 83, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 29, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 16, "endColumn": 80, "lineCount": 3 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 25, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 39, "endColumn": 13, "lineCount": 7 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 30, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 30, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 20, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 16, "endColumn": 75, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 40, "endColumn": 73, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 16, "endColumn": 71, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 40, "endColumn": 69, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 16, "endColumn": 77, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 40, "endColumn": 75, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 21, "endColumn": 22, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 21, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 21, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 30, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 49, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 51, "endColumn": 52, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 51, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 51, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 54, "endColumn": 58, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 54, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 54, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 60, "endColumn": 63, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 60, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 60, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { "startColumn": 12, "endColumn": 40, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 12, "endColumn": 40, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 25, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 12, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 38, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 19, "endColumn": 58, "lineCount": 2 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 37, "lineCount": 2 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 39, "endColumn": 44, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 39, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 47, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 47, "endColumn": 65, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 65, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 27, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 27, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 45, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 45, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 29, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 32, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 32, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 38, "endColumn": 41, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 38, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 22, "endColumn": 53, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 36, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 40, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 57, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 40, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 44, "endColumn": 65, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 57, "endColumn": 75, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 57, "endColumn": 75, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 33, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 41, "endColumn": 59, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 22, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 23, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 47, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 28, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 34, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 41, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 37, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 43, "endColumn": 46, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 43, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 43, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 40, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 31, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 48, "endColumn": 59, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 45, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 45, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 44, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 43, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 49, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 56, "endColumn": 66, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 56, "endColumn": 66, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 59, "endColumn": 76, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 59, "endColumn": 76, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 65, "endColumn": 82, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 65, "endColumn": 82, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 39, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 36, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 23, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 47, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 28, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 22, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 35, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 38, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 51, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 34, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 42, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 76, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 51, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 62, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 38, "endColumn": 69, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 70, "endColumn": 79, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 70, "endColumn": 81, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 57, "endColumn": 66, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 39, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 39, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 39, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 46, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 42, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 48, "endColumn": 51, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 48, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 48, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 51, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 34, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 22, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 29, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 28, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 37, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 51, "lineCount": 1 } }, { "code": "reportOptionalMemberAccess", "range": { "startColumn": 46, "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 29, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 32, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 32, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 38, "endColumn": 41, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 38, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 38, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 37, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 44, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 40, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 46, "endColumn": 49, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 46, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 46, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 22, "endColumn": 52, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 35, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 44, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 44, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 53, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 53, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 38, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 38, "endColumn": 39, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 38, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 38, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 41, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 41, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 41, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 47, "endColumn": 50, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 47, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 47, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 48, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 31, "endColumn": 33, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 36, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 29, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 31, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 34, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 43, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 40, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 48, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 31, "endColumn": 33, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 36, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 27, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 27, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 31, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 31, "endColumn": 41, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 43, "endColumn": 17, "lineCount": 3 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 19, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 41, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 41, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 41, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 31, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 31, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 62, "endColumn": 69, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 62, "endColumn": 69, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 28, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 37, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 48, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 31, "endColumn": 33, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 36, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 31, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 31, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 62, "endColumn": 69, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 62, "endColumn": 69, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 37, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 33, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 33, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 33, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 33, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 33, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 17, "endColumn": 18, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 17, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 17, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 24, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 20, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 19, "endColumn": 20, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 19, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 19, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 22, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 28, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 17, "endColumn": 18, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 17, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 17, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 24, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 20, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportOptionalMemberAccess", "range": { "startColumn": 50, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportOptionalMemberAccess", "range": { "startColumn": 50, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 26, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 32, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 32, "endColumn": 35, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 40, "endColumn": 17, "lineCount": 3 } }, { "code": "reportOptionalMemberAccess", "range": { "startColumn": 54, "endColumn": 64, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 19, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 19, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 19, "endColumn": 20, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 19, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 19, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 22, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 28, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 28, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 37, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 39, "endColumn": 42, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 39, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 39, "endColumn": 42, "lineCount": 1 } }, { "code": "reportOptionalMemberAccess", "range": { "startColumn": 46, "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 22, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 28, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 78, "endColumn": 84, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 38, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 36, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 45, "endColumn": 69, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 50, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 76, "endColumn": 81, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 21, "endColumn": 22, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 21, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 21, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 30, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 21, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 19, "endColumn": 23, "lineCount": 1 } }, { "code": "reportOperatorIssue", "range": { "startColumn": 15, "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 30, "endColumn": 59, "lineCount": 3 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 32, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 56, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 35, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 50, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 16, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 24, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 51, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 54, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 31, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 23, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 35, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 26, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 35, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 38, "endColumn": 42, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 38, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 38, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 44, "endColumn": 47, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 44, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 44, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 50, "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 44, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 16, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 54, "endColumn": 82, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 31, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 35, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 37, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 37, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 27, "endColumn": 59, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 31, "endColumn": 59, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 23, "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 28, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 47, "endColumn": 74, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 74, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 45, "endColumn": 72, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 45, "endColumn": 72, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 48, "endColumn": 68, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 51, "endColumn": 73, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 50, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 49, "endColumn": 69, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 51, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 51, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 48, "endColumn": 68, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 64, "endColumn": 84, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 35, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 38, "endColumn": 42, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 38, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 44, "endColumn": 47, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 44, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 51, "endColumn": 55, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 39, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 45, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 45, "endColumn": 65, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 56, "endColumn": 78, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 25, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 36, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 42, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 29, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 29, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 29, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 29, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 29, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 29, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 46, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 39, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 31, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 40, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 40, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 47, "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 28, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 37, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 44, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 53, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 44, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 53, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 26, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 32, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 32, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 21, "endColumn": 24, "lineCount": 1 } }, { "code": "reportSelfClsParameterName", "range": { "startColumn": 25, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 41, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 43, "endColumn": 46, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 43, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 17, "endColumn": 18, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 17, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 17, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 24, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 20, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 22, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 22, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 40, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 27, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 30, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 36, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 35, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 17, "endColumn": 22, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 17, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 25, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 31, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 34, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 43, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 40, "endColumn": 43, "lineCount": 1 } }, { "code": "reportOptionalMemberAccess", "range": { "startColumn": 46, "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 29, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 29, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 29, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 48, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 29, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 17, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 61, "endColumn": 74, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 41, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 9, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 45, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 49, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 55, "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 40, "endColumn": 61, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 61, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 30, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { "startColumn": 8, "endColumn": 33, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 8, "endColumn": 33, "lineCount": 1 } }, { "code": "reportIndexIssue", "range": { "startColumn": 16, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 54, "endColumn": 69, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 37, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { "startColumn": 8, "endColumn": 33, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 8, "endColumn": 33, "lineCount": 1 } }, { "code": "reportIndexIssue", "range": { "startColumn": 16, "endColumn": 41, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 21, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 32, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 23, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 39, "endColumn": 44, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 39, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 19, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 19, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 22, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 21, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 20, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 12, "endColumn": 84, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 27, "endColumn": 18, "lineCount": 6 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 31, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 35, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 36, "endColumn": 49, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 36, "endColumn": 57, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 36, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 18, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 18, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 47, "endColumn": 53, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 47, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 55, "endColumn": 59, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 55, "endColumn": 59, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 55, "endColumn": 59, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 66, "endColumn": 70, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 66, "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 29, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 60, "endColumn": 64, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedImport", "range": { "startColumn": 19, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 21, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUninitializedInstanceVariable", "range": { "startColumn": 21, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 17, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUninitializedInstanceVariable", "range": { "startColumn": 17, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 25, "endColumn": 40, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { "startColumn": 25, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 41, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 40, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 51, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 20, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { "startColumn": 23, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 46, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 57, "endColumn": 58, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 17, "endColumn": 33, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 17, "endColumn": 33, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 30, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 50, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 43, "endColumn": 50, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 43, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 57, "endColumn": 68, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 57, "endColumn": 68, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 34, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 16, "endColumn": 55, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 30, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 33, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 41, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 19, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 36, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 33, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 33, "endColumn": 65, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 33, "endColumn": 74, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 39, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 58, "endColumn": 64, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 30, "lineCount": 1 } } ], "./pudb/forked.py": [ { "code": "reportMissingParameterType", "range": { "startColumn": 14, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 39, "endColumn": 48, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 39, "endColumn": 48, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 20, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 18, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 16, "endColumn": 21, "lineCount": 1 } } ], "./pudb/ipython.py": [ { "code": "reportAttributeAccessIssue", "range": { "startColumn": 20, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 31, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 9, "endColumn": 13, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 9, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 21, "lineCount": 1 } }, { "code": "reportPrivateImportUsage", "range": { "startColumn": 38, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 38, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 21, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 27, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 26, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 14, "endColumn": 18, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 20, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 13, "endColumn": 17, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 13, "endColumn": 17, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 19, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 21, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 9, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 0, "endColumn": 2, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 0, "endColumn": 12, "lineCount": 1 } } ], "./pudb/lowlevel.py": [ { "code": "reportMissingTypeArgument", "range": { "startColumn": 30, "endColumn": 51, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 25, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 25, "endColumn": 38, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 40, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnreachable", "range": { "startColumn": 8, "endColumn": 28, "lineCount": 3 } }, { "code": "reportArgumentType", "range": { "startColumn": 81, "endColumn": 82, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 19, "endColumn": 36, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 27, "endColumn": 35, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 30, "endColumn": 61, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 15, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 29, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 17, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUninitializedInstanceVariable", "range": { "startColumn": 17, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnnecessaryContains", "range": { "startColumn": 15, "endColumn": 36, "lineCount": 1 } } ], "./pudb/remote.py": [ { "code": "reportPrivateUsage", "range": { "startColumn": 13, "endColumn": 22, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 20, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 17, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUninitializedInstanceVariable", "range": { "startColumn": 17, "endColumn": 22, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 20, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 4, "endColumn": 11, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { "startColumn": 14, "endColumn": 25, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 14, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownLambdaType", "range": { "startColumn": 31, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 34, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownLambdaType", "range": { "startColumn": 34, "endColumn": 58, "lineCount": 1 } } ], "./pudb/run.py": [ { "code": "reportMissingImports", "range": { "startColumn": 15, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 25, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 26, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 37, "endColumn": 47, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 36, "endColumn": 44, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 26, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 11, "endColumn": 17, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 11, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 11, "endColumn": 17, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 11, "endColumn": 30, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 7, "endColumn": 25, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 19, "endColumn": 37, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 19, "endColumn": 40, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 19, "endColumn": 34, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 24, "endColumn": 44, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 30, "endColumn": 56, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 11, "endColumn": 15, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 4, "endColumn": 14, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 7, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 25, "endColumn": 34, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 18, "endColumn": 28, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 32, "endColumn": 46, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 22, "endColumn": 32, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 18, "endColumn": 28, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 32, "endColumn": 46, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 32, "endColumn": 46, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 32, "endColumn": 46, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 32, "endColumn": 46, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 32, "endColumn": 46, "lineCount": 1 } } ], "./pudb/settings.py": [ { "code": "reportMissingTypeStubs", "range": { "startColumn": 9, "endColumn": 14, "lineCount": 1 } }, { "code": "reportConstantRedefinition", "range": { "startColumn": 4, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 43, "endColumn": 57, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 11, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 69, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 37, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 28, "endColumn": 37, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 28, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 11, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 11, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 23, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 11, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 27, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 11, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 12, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { "startColumn": 15, "endColumn": 53, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 20, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 18, "lineCount": 1 } } ], "./pudb/shell.py": [ { "code": "reportMissingImports", "range": { "startColumn": 11, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 23, "lineCount": 1 } }, { "code": "reportConstantRedefinition", "range": { "startColumn": 4, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 42, "endColumn": 57, "lineCount": 1 } }, { "code": "reportConstantRedefinition", "range": { "startColumn": 4, "endColumn": 18, "lineCount": 1 } }, { "code": "reportConstantRedefinition", "range": { "startColumn": 4, "endColumn": 17, "lineCount": 1 } }, { "code": "reportMissingTypeArgument", "range": { "startColumn": 25, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 48, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 24, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 41, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 31, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 39, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 13, "lineCount": 1 } }, { "code": "reportCallIssue", "range": { "startColumn": 16, "endColumn": 28, "lineCount": 3 } }, { "code": "reportArgumentType", "range": { "startColumn": 12, "endColumn": 34, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 16, "endColumn": 27, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 12, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 48, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 53, "lineCount": 1 } }, { "code": "reportMissingImports", "range": { "startColumn": 11, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 20, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 16, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 19, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 28, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 28, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 15, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 41, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 6, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 9, "endColumn": 20, "lineCount": 1 } }, { "code": "reportMissingImports", "range": { "startColumn": 9, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 21, "lineCount": 2 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 39, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 39, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 41, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 43, "endColumn": 62, "lineCount": 1 } }, { "code": "reportMissingImports", "range": { "startColumn": 13, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 63, "endColumn": 87, "lineCount": 1 } }, { "code": "reportMissingImports", "range": { "startColumn": 13, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 52, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 10, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 9, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 37, "lineCount": 1 } }, { "code": "reportOptionalMemberAccess", "range": { "startColumn": 26, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 17, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 45, "lineCount": 1 } }, { "code": "reportOptionalOperand", "range": { "startColumn": 7, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 19, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 10, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 18, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 14, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 37, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 37, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 32, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 38, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 24, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 24, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 32, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 38, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 4, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 27, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 27, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 50, "endColumn": 61, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 50, "endColumn": 63, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 29, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 24, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 24, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 39, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 39, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 4, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 28, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 51, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 51, "endColumn": 64, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 29, "endColumn": 39, "lineCount": 1 } } ], "./pudb/source_view.py": [ { "code": "reportMissingTypeStubs", "range": { "startColumn": 7, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 19, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 19, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 54, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 32, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 22, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 36, "endColumn": 38, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 49, "endColumn": 61, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 4, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 4, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 25, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 25, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 47, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 47, "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 47, "endColumn": 73, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 25, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 23, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 23, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 23, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 26, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 26, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnusedImport", "range": { "startColumn": 11, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 25, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 32, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 53, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 55, "endColumn": 66, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 55, "endColumn": 66, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 70, "endColumn": 77, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 70, "endColumn": 77, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 17, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 52, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 59, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 28, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 48, "endColumn": 49, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 12, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 38, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 38, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 23, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 34, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 48, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 48, "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 24, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 12, "endColumn": 38, "lineCount": 1 } } ], "./pudb/test/test_lowlevel.py": [ { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 39, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 9, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 10, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 10, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 21, "endColumn": 57, "lineCount": 1 } }, { "code": "reportPossiblyUnboundVariable", "range": { "startColumn": 26, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 44, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 23, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnreachable", "range": { "startColumn": 8, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnreachable", "range": { "startColumn": 8, "endColumn": 23, "lineCount": 1 } } ], "./pudb/test/test_make_canvas.py": [ { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 30, "lineCount": 1 } } ], "./pudb/test/test_run.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 21, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 9, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 8, "endColumn": 9, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 38, "endColumn": 42, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 38, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 23, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 50, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 27, "lineCount": 1 } } ], "./pudb/test/test_settings.py": [ { "code": "reportUnusedImport", "range": { "startColumn": 7, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 10, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUntypedNamedTuple", "range": { "startColumn": 13, "endColumn": 71, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 54, "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 17, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 32, "lineCount": 1 } } ], "./pudb/test/test_source_code_providers.py": [ { "code": "reportUnusedImport", "range": { "startColumn": 7, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 36, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 42, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 32, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 36, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 42, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 36, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 44, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 44, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 36, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 49, "lineCount": 1 } } ], "./pudb/test/test_var_view.py": [ { "code": "reportPrivateLocalImportUsage", "range": { "startColumn": 4, "endColumn": 10, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 25, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 49, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 12, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 21, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 22, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 15, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 19, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 19, "endColumn": 30, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 8, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 15, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 22, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 22, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 36, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 8, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 23, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 23, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 58, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 19, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 11, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 43, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 25, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 50, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 4, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 4, "endColumn": 11, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUninitializedInstanceVariable", "range": { "startColumn": 13, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUninitializedInstanceVariable", "range": { "startColumn": 13, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 27, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 29, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 15, "endColumn": 49, "lineCount": 2 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 17, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 20, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 25, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 17, "endColumn": 34, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 35, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 43, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 32, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 32, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 32, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 46, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 40, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 36, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 36, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 47, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUninitializedInstanceVariable", "range": { "startColumn": 13, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 28, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 55, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 28, "endColumn": 48, "lineCount": 3 } }, { "code": "reportIndexIssue", "range": { "startColumn": 49, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 49, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 33, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 40, "endColumn": 54, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 50, "endColumn": 54, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 28, "endColumn": 48, "lineCount": 3 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 51, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 40, "endColumn": 45, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 59, "endColumn": 68, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 28, "endColumn": 48, "lineCount": 3 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 33, "endColumn": 38, "lineCount": 1 } }, { "code": "reportGeneralTypeIssues", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 44, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 39, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 38, "lineCount": 1 } } ], "./pudb/theme.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 14, "endColumn": 26, "lineCount": 1 } }, { "code": "reportMissingTypeArgument", "range": { "startColumn": 28, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 14, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingTypeArgument", "range": { "startColumn": 37, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 22, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnusedParameter", "range": { "startColumn": 16, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingTypeArgument", "range": { "startColumn": 72, "endColumn": 76, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 57, "endColumn": 64, "lineCount": 1 } }, { "code": "reportReturnType", "range": { "startColumn": 19, "endColumn": 23, "lineCount": 1 } }, { "code": "reportReturnType", "range": { "startColumn": 19, "endColumn": 23, "lineCount": 1 } } ], "./pudb/themes/agr_256.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } } ], "./pudb/themes/classic.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } } ], "./pudb/themes/dark_vim.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } } ], "./pudb/themes/gray_light_256.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } } ], "./pudb/themes/midnight.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } } ], "./pudb/themes/monokai.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } } ], "./pudb/themes/monokai_256.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } } ], "./pudb/themes/nord_dark_256.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } } ], "./pudb/themes/solarized.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } } ], "./pudb/themes/utils.py": [ { "code": "reportMissingTypeStubs", "range": { "startColumn": 7, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 16, "endColumn": 21, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 16, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 11, "endColumn": 16, "lineCount": 1 } } ], "./pudb/themes/vim.py": [ { "code": "reportUnknownVariableType", "range": { "startColumn": 30, "endColumn": 41, "lineCount": 1 } } ], "./pudb/ui_tools.py": [ { "code": "reportMissingTypeStubs", "range": { "startColumn": 7, "endColumn": 12, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 5, "endColumn": 10, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 15, "endColumn": 18, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 15, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 22, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 9, "endColumn": 22, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 9, "endColumn": 19, "lineCount": 1 } }, { "code": "reportPrivateUsage", "range": { "startColumn": 27, "endColumn": 43, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 17, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 35, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 21, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 12, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 37, "endColumn": 46, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 37, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 23, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 51, "endColumn": 73, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 25, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 43, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 19, "endColumn": 24, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 19, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 26, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 26, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 46, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 15, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 31, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 31, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 50, "endColumn": 59, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 39, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 41, "endColumn": 47, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 41, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 56, "endColumn": 65, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 67, "endColumn": 73, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 4, "endColumn": 11, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 35, "endColumn": 43, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 35, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 45, "endColumn": 55, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 45, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 23, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 35, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 18, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 19, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 19, "endColumn": 23, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 30, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 21, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 21, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 27, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 31, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 34, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 47, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 43, "endColumn": 49, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 25, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 34, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 34, "endColumn": 61, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 20, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUninitializedInstanceVariable", "range": { "startColumn": 20, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 35, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 35, "endColumn": 59, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 17, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUninitializedInstanceVariable", "range": { "startColumn": 17, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 35, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 47, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 47, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 54, "endColumn": 73, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 27, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 9, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 30, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 21, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 24, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 21, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 30, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 30, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 33, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 59, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 59, "lineCount": 1 } } ], "./pudb/var_view.py": [ { "code": "reportMissingTypeStubs", "range": { "startColumn": 7, "endColumn": 12, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 26, "endColumn": 36, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 42, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 57, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 62, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 38, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 53, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 58, "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 21, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 21, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 23, "endColumn": 28, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 42, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 30, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 19, "endColumn": 29, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 41, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 56, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 61, "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 38, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 53, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 58, "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 21, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 21, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 23, "endColumn": 28, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 42, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 19, "endColumn": 27, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 41, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 56, "endColumn": 57, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 61, "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 38, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 53, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 58, "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 34, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 49, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 54, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 28, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 28, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 55, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 21, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 21, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 23, "endColumn": 35, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 31, "endColumn": 35, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 27, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 49, "lineCount": 1 } }, { "code": "reportIndexIssue", "range": { "startColumn": 33, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 20, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 20, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 19, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 20, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 49, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 19, "endColumn": 43, "lineCount": 2 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 19, "endColumn": 43, "lineCount": 2 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 20, "endColumn": 27, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 19, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 15, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 18, "lineCount": 1 } }, { "code": "reportMissingTypeStubs", "range": { "startColumn": 17, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 35, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 37, "endColumn": 41, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 27, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 29, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 23, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 56, "endColumn": 67, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 31, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 74, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 4, "endColumn": 15, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 4, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 53, "endColumn": 60, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 53, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 62, "endColumn": 73, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 62, "endColumn": 73, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 57, "lineCount": 2 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 28, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 33, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 16, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 29, "endColumn": 49, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 54, "endColumn": 61, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 36, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 38, "endColumn": 43, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 38, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 45, "endColumn": 50, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 45, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 52, "endColumn": 59, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 52, "endColumn": 59, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 61, "endColumn": 66, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 61, "endColumn": 66, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 23, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 17, "endColumn": 35, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 20, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 46, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 37, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 57, "endColumn": 75, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 28, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 25, "endColumn": 31, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 25, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 38, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 40, "endColumn": 45, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 40, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 47, "endColumn": 54, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 47, "endColumn": 54, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 61, "endColumn": 72, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 61, "endColumn": 72, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 53, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 47, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 38, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 21, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 22, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 26, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 48, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 35, "lineCount": 1 } }, { "code": "reportArgumentType", "range": { "startColumn": 36, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 53, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 50, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 73, "endColumn": 78, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 35, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 24, "lineCount": 1 } }, { "code": "reportIncompatibleMethodOverride", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 53, "endColumn": 60, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 53, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 62, "endColumn": 73, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 62, "endColumn": 73, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 53, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 64, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 12, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 31, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 39, "endColumn": 50, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 39, "endColumn": 50, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 52, "endColumn": 62, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 52, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 35, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 24, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 23, "lineCount": 1 } }, { "code": "reportIncompatibleMethodOverride", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 53, "endColumn": 60, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 53, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 62, "endColumn": 73, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 62, "endColumn": 73, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 53, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 64, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 12, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 59, "endColumn": 64, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 31, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 35, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 30, "endColumn": 37, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 30, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 39, "endColumn": 43, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 39, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 16, "endColumn": 19, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 21, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 29, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 15, "endColumn": 38, "lineCount": 4 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 24, "endColumn": 29, "lineCount": 1 } }, { "code": "reportIncompatibleMethodOverride", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportImplicitOverride", "range": { "startColumn": 8, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 23, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 31, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 31, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 53, "endColumn": 60, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 53, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 62, "endColumn": 73, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 62, "endColumn": 73, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 11, "endColumn": 28, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 26, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 37, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 44, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 45, "endColumn": 52, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 45, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 15, "endColumn": 41, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 51, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 55, "endColumn": 61, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 63, "endColumn": 72, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 16, "endColumn": 25, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 27, "endColumn": 34, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 36, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 55, "endColumn": 60, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 51, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 53, "endColumn": 62, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 64, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 12, "endColumn": 23, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 31, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 36, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 4, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 18, "endColumn": 32, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 18, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 34, "endColumn": 40, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 34, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 42, "endColumn": 49, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 42, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 4, "endColumn": 8, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 16, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 4, "endColumn": 13, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 42, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 18, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 22, "endColumn": 44, "lineCount": 1 } }, { "code": "reportAny", "range": { "startColumn": 12, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 25, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 25, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 48, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 57, "endColumn": 63, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 27, "lineCount": 2 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 25, "endColumn": 39, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 41, "endColumn": 58, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 60, "endColumn": 70, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 34, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 34, "endColumn": 55, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 8, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 46, "endColumn": 66, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 11, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 16, "endColumn": 30, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 41, "endColumn": 53, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 12, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 40, "endColumn": 43, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 45, "endColumn": 56, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 13, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 7, "endColumn": 33, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 20, "endColumn": 46, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 7, "endColumn": 29, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 8, "endColumn": 14, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 18, "endColumn": 40, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 11, "endColumn": 17, "lineCount": 1 } }, { "code": "reportUnannotatedClassAttribute", "range": { "startColumn": 13, "endColumn": 27, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 8, "endColumn": 26, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 33, "endColumn": 42, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 33, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownParameterType", "range": { "startColumn": 44, "endColumn": 48, "lineCount": 1 } }, { "code": "reportMissingParameterType", "range": { "startColumn": 44, "endColumn": 48, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 12, "endColumn": 16, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 55, "lineCount": 1 } }, { "code": "reportAttributeAccessIssue", "range": { "startColumn": 24, "endColumn": 32, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 42, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 19, "endColumn": 64, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 43, "endColumn": 47, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 38, "lineCount": 1 } }, { "code": "reportUnknownMemberType", "range": { "startColumn": 19, "endColumn": 49, "lineCount": 1 } }, { "code": "reportUnknownVariableType", "range": { "startColumn": 19, "endColumn": 71, "lineCount": 1 } }, { "code": "reportUnknownArgumentType", "range": { "startColumn": 50, "endColumn": 54, "lineCount": 1 } } ] } }pudb-2025.1.5/.coveragerc000066400000000000000000000010211511510750400150120ustar00rootroot00000000000000[run] branch = True [report] # Regexes for lines to exclude from consideration exclude_lines = # Have to re-enable the standard pragma pragma: no cover # Don't complain about missing debug-only code: def __repr__ if self\.debug # Don't complain if tests don't hit defensive assertion code: raise AssertionError raise NotImplementedError # Don't complain if non-runnable code isn't run: if 0: if __name__ == .__main__.: ignore_errors = True [html] directory = coverage_html_reportpudb-2025.1.5/.editorconfig000066400000000000000000000010021511510750400153450ustar00rootroot00000000000000# https://editorconfig.org/ # https://github.com/editorconfig/editorconfig-vim # https://github.com/editorconfig/editorconfig-emacs root = true [*] indent_style = space end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true [*.py] indent_size = 4 [*.rst] indent_size = 4 [*.cpp] indent_size = 2 [*.hpp] indent_size = 2 # There may be one in doc/ [Makefile] indent_style = tab # https://github.com/microsoft/vscode/issues/1679 [*.md] trim_trailing_whitespace = false pudb-2025.1.5/.github/000077500000000000000000000000001511510750400142375ustar00rootroot00000000000000pudb-2025.1.5/.github/ISSUE_TEMPLATE/000077500000000000000000000000001511510750400164225ustar00rootroot00000000000000pudb-2025.1.5/.github/ISSUE_TEMPLATE/bug_report.md000066400000000000000000000011251511510750400211130ustar00rootroot00000000000000--- name: Bug report about: Create a report to help us improve title: '' labels: Bug assignees: '' --- **Describe the bug** A clear and concise description of what the bug is. **To Reproduce** Steps to reproduce the behavior: 1. Go to '...' 2. Click on '....' 3. Scroll down to '....' 4. See error **Expected behavior** A clear and concise description of what you expected to happen. **Screenshots** If applicable, add screenshots to help explain your problem. **Additional context** Add any other context about the problem here. **Versions** What version of pudb? What version of Python? pudb-2025.1.5/.github/ISSUE_TEMPLATE/config.yml000066400000000000000000000005531511510750400204150ustar00rootroot00000000000000blank_issues_enabled: true contact_links: - name: â“ Question url: https://github.com/inducer/pudb/discussions/categories/q-a about: Ask and answer questions about pudb on Discussions - name: 🔧 Troubleshooting url: https://github.com/inducer/pudb/discussions/categories/troubleshooting about: For troubleshooting help, see the Discussions pudb-2025.1.5/.github/ISSUE_TEMPLATE/feature_request.md000066400000000000000000000011341511510750400221460ustar00rootroot00000000000000--- name: Feature request about: Suggest an idea for this project title: '' labels: enhancement assignees: '' --- **Is your feature request related to a problem? Please describe.** A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] **Describe the solution you'd like** A clear and concise description of what you want to happen. **Describe alternatives you've considered** A clear and concise description of any alternative solutions or features you've considered. **Additional context** Add any other context or screenshots about the feature request here. pudb-2025.1.5/.github/dependabot.yml000066400000000000000000000002721511510750400170700ustar00rootroot00000000000000version: 2 updates: # Set update schedule for GitHub Actions - package-ecosystem: "github-actions" directory: "/" schedule: interval: "weekly" # vim: sw=4 pudb-2025.1.5/.github/workflows/000077500000000000000000000000001511510750400162745ustar00rootroot00000000000000pudb-2025.1.5/.github/workflows/autopush.yml000066400000000000000000000010221511510750400206620ustar00rootroot00000000000000name: Gitlab mirror on: push: branches: - main jobs: autopush: name: Automatic push to gitlab.tiker.net if: startsWith(github.repository, 'inducer/') runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - run: | curl -L -O https://tiker.net/ci-support-v0 . ./ci-support-v0 mirror_github_to_gitlab env: GITLAB_AUTOPUSH_KEY: ${{ secrets.GITLAB_AUTOPUSH_KEY }} # vim: sw=4 pudb-2025.1.5/.github/workflows/ci.yml000066400000000000000000000046471511510750400174250ustar00rootroot00000000000000name: CI on: push: branches: - main pull_request: paths-ignore: - 'doc/*.rst' schedule: - cron: '17 3 * * 0' concurrency: group: ${{ github.head_ref || github.ref_name }} cancel-in-progress: true jobs: ruff: name: Ruff runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - name: "Main Script" run: | pipx install ruff ruff check typos: name: Typos runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: crate-ci/typos@master basedpyright: runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: '3.x' - name: "Main Script" run: | curl -L -O https://tiker.net/ci-support-v0 . ./ci-support-v0 build_py_project_in_venv pip install basedpyright sudo apt update sudo apt -y install libopenmpi-dev pip install numpy pytest ipython ptpython mpi4py basedpyright pytest: name: Pytest on Py${{ matrix.python-version }} runs-on: ubuntu-latest strategy: matrix: python-version: ["3.8", "3.9", "3.x", "pypy3.8"] steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: ${{ matrix.python-version }} - name: "Main Script" run: | EXTRA_INSTALL="numpy" REQUIREMENTS_TXT=requirements.dev.txt curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/main/build-and-test-py-project.sh . ./build-and-test-py-project.sh docs: name: Documentation runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 - uses: actions/setup-python@v6 with: python-version: '3.x' - name: "Main Script" run: | EXTRA_INSTALL="numpy" curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/main/ci-support.sh . ci-support.sh build_py_project_in_venv build_docs # vim: sw=4 pudb-2025.1.5/.github/workflows/release.yml000066400000000000000000000064511511510750400204450ustar00rootroot00000000000000name: Publish Python ðŸ distribution 📦 to PyPI and TestPyPI on: push jobs: build: name: Build distribution 📦 runs-on: ubuntu-latest steps: - uses: actions/checkout@v6 with: persist-credentials: false - name: Set up Python uses: actions/setup-python@v6 with: python-version: "3.x" - name: Install pypa/build run: >- python3 -m pip install build --user - name: Build a binary wheel and a source tarball run: python3 -m build - name: Store the distribution packages uses: actions/upload-artifact@v5 with: name: python-package-distributions path: dist/ # only publish to PyPI on tag pushes starting with v publish-to-pypi: name: >- Publish Python ðŸ distribution 📦 to PyPI if: startsWith(github.ref, 'refs/tags/v') needs: - build runs-on: ubuntu-latest environment: name: pypi url: https://pypi.org/p/pudb permissions: id-token: write # IMPORTANT: mandatory for trusted publishing steps: - name: Download all the dists uses: actions/download-artifact@v6 with: name: python-package-distributions path: dist/ - name: Publish distribution 📦 to PyPI uses: pypa/gh-action-pypi-publish@release/v1 github-release: name: >- Sign the Python ðŸ distribution 📦 with Sigstore and upload them to GitHub Release needs: - publish-to-pypi runs-on: ubuntu-latest permissions: contents: write # IMPORTANT: mandatory for making GitHub Releases id-token: write # IMPORTANT: mandatory for sigstore steps: - name: Download all the dists uses: actions/download-artifact@v6 with: name: python-package-distributions path: dist/ - name: Sign the dists with Sigstore uses: sigstore/gh-action-sigstore-python@v3.1.0 with: inputs: >- ./dist/*.tar.gz ./dist/*.whl - name: Create GitHub Release env: GITHUB_TOKEN: ${{ github.token }} run: >- gh release create "$GITHUB_REF_NAME" --repo "$GITHUB_REPOSITORY" --notes "" - name: Upload artifact signatures to GitHub Release env: GITHUB_TOKEN: ${{ github.token }} # Upload to GitHub Release using the `gh` CLI. # `dist/` contains the built packages, and the # sigstore-produced signatures and certificates. run: >- gh release upload "$GITHUB_REF_NAME" dist/** --repo "$GITHUB_REPOSITORY" # only publish to test PyPI on tag pushes starting with 'testv' publish-to-testpypi: name: Publish Python ðŸ distribution 📦 to TestPyPI if: startsWith(github.ref, 'refs/tags/testv') needs: - build runs-on: ubuntu-latest environment: name: testpypi url: https://test.pypi.org/p/ptools permissions: id-token: write # IMPORTANT: mandatory for trusted publishing steps: - name: Download all the dists uses: actions/download-artifact@v6 with: name: python-package-distributions path: dist/ - name: Publish distribution 📦 to TestPyPI uses: pypa/gh-action-pypi-publish@release/v1 with: repository-url: https://test.pypi.org/legacy/ pudb-2025.1.5/.gitignore000066400000000000000000000002761511510750400146740ustar00rootroot00000000000000*.pyc *~ .*.sw[op] *.egg-info dist build distribute-*gz distribute-*egg setuptools-*gz setuptools-*egg traceback*txt .DS_Store .cache/ .coverage coverage.xml tags doc/_build doc/README.rst pudb-2025.1.5/.gitlab-ci.yml000066400000000000000000000012071511510750400153330ustar00rootroot00000000000000Python 3: script: - py_version=3 - curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/main/build-and-test-py-project.sh - export EXTRA_INSTALL="numpy" - export REQUIREMENTS_TXT=requirements.dev.txt - ". ./build-and-test-py-project.sh" tags: - python3 - linux except: - tags artifacts: reports: junit: test/pytest.xml ruff: script: - pipx install ruff - ruff check tags: - docker-runner except: - tags Documentation: script: - EXTRA_INSTALL="numpy mako" - curl -L -O -k https://gitlab.tiker.net/inducer/ci-support/raw/main/build-docs.sh - ". ./build-docs.sh" tags: - python3 pudb-2025.1.5/.mailmap000066400000000000000000000007521511510750400143240ustar00rootroot00000000000000# Prevent git from showing duplicate names with commands like "git shortlog" # See the manpage of git-shortlog for details. # The syntax is: # Name that should be used Bad name # # You can skip Bad name if it is the same as the one that should be used, and # is unique. # # This file is up-to-date if the command git log --format="%aN <%aE>" | sort # -u # gives no duplicates. Andreas Klöckner Andreas Kloeckner `_ * `PuDB Intro Screencast (2009) `_ Features -------- * Syntax-highlighted source, the stack, breakpoints and variables are all visible at once and continuously updated. This helps you be more aware of what's going on in your program. Variable displays can be expanded, collapsed and have various customization options. * Pre-bundled themes, including dark themes via "Ctrl-P". Could set a custom theme also. * Simple, keyboard-based navigation using single keystrokes makes debugging quick and easy. PuDB understands cursor-keys and Vi shortcuts for navigation. Other keys are inspired by the corresponding pdb commands. * Use search to find relevant source code, or use "m" to invoke the module browser that shows loaded modules, lets you load new ones and reload existing ones. * Breakpoints can be set just by pointing at a source line and hitting "b" and then edited visually in the breakpoints window. Or hit "t" to run to the line under the cursor. * Drop to a Python shell in the current environment by pressing "!". Or open a command prompt alongside the source-code via "Ctrl-X". * PuDB places special emphasis on exception handling. A post-mortem mode makes it easy to retrace a crashing program's last steps. * Ability to control the debugger from a separate terminal. * IPython integration (see `wiki `_) * Should work with Python 3.6 and newer. (Versions 2019.2 and older continue to support Python 2.7.) Links ----- `PuDB documentation `_ PuDB also has a `mailing list `_ that you may use to submit patches and requests for help. You can also send a pull request to the `GitHub repository `_ Development Version ------------------- You may obtain the development version using the `Git `_ version control tool.:: git clone https://github.com/inducer/pudb.git You may also `browse the code `_ online. pudb-2025.1.5/debug_me.py000066400000000000000000000022331511510750400150200ustar00rootroot00000000000000from collections import namedtuple Color = namedtuple("Color", ["red", "green", "blue", "alpha"]) class MyClass: def __init__(self, a, b): self.a = a self.b = b self._b = [b] mc = MyClass(15, MyClass(12, None)) from pudb import set_trace set_trace() def simple_func(x): x += 1 s = range(20) z = None # noqa: F841 w = () # noqa: F841 y = {i: i**2 for i in s} # noqa: F841 k = set(range(5, 99)) # noqa: F841 c = Color(137, 214, 56, 88) # noqa: F841 try: x.invalid # noqa: B018 except AttributeError: pass # import sys # sys.exit(1) return 2*x def fermat(n): """Returns triplets of the form x^n + y^n = z^n. Warning! Untested with n > 2. """ # source: "Fermat's last Python script" # https://web.archive.org/web/20200815095147/https://earthboundkid.jottit.com/fermat.py # :) for x in range(100): for y in range(1, x+1): for z in range(1, x**n+y**n + 1): if x**n + y**n == z**n: yield x, y, z print(f"SF {simple_func(10)}") for i in fermat(2): print(i) print("FINISHED") pudb-2025.1.5/doc/000077500000000000000000000000001511510750400134445ustar00rootroot00000000000000pudb-2025.1.5/doc/Makefile000066400000000000000000000012171511510750400151050ustar00rootroot00000000000000# Minimal makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build SPHINXPROJ = pudb SOURCEDIR = . BUILDDIR = _build # Put it first so that "make" without argument is like "make help". help: @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) .PHONY: help Makefile # Catch-all target: route all unknown targets to Sphinx using the new # "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). %: Makefile sed s,doc/images,images, ../README.rst > README.rst @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) pudb-2025.1.5/doc/conf.py000066400000000000000000000024361511510750400147500ustar00rootroot00000000000000import os import sys from urllib.request import urlopen _conf_url = \ "https://raw.githubusercontent.com/inducer/sphinxconfig/main/sphinxconfig.py" with urlopen(_conf_url) as _inf: exec(compile(_inf.read(), _conf_url, "exec"), globals()) sys.path.insert(0, os.path.abspath("..")) copyright = "2017-21, Andreas Kloeckner and contributors" author = "Andreas Kloeckner and contributors" ver_dic = {} with open("../pudb/__init__.py") as ver_file: ver_src = ver_file.read() exec(compile(ver_src, "../pudb/__init__.py", "exec"), ver_dic) version = ver_dic["VERSION"] # The full version, including alpha/beta/rc tags. release = version intersphinx_mapping = { "python": ("https://docs.python.org/3", None), "urwid": ("https://urwid.org/", None), "mpi4py": ("https://mpi4py.readthedocs.io/en/stable/", None), } sphinxconfig_missing_reference_aliases = { "MPI.Intracomm": "obj:mpi4py.MPI.Intracomm", } nitpick_ignore_regex = [ ["py:class", r"P"], ["py:class", r"P.args"], ["py:class", r"P.kwargs"], ["py:class", r"ResultT"], ["py:class", r"FrameType"], ["py:class", r"TracebackType"], ["py:class", r"OptExcInfo"], ] def setup(app) -> None: app.connect("missing-reference", process_autodoc_missing_reference) # noqa: F821 pudb-2025.1.5/doc/images/000077500000000000000000000000001511510750400147115ustar00rootroot00000000000000pudb-2025.1.5/doc/images/pudb-screenshot-dark.png000066400000000000000000002220771511510750400214550ustar00rootroot00000000000000‰PNG  IHDRó¹|*éJ pHYsÄÄ•+ IDATxœìÝypg~7ø§q_$A ’à}ˆ’,ÉÔ}ú>äñÜcg&™ÌÔ$»›÷ݤ6ÙJåÝTö­ÚI²3ÙIf×ëqÙžObÏÈ™ñ%Y²$J“’x‰§Ä¼÷EÜèý£m¦H@‘¢¾Ÿr¹€î~ºOw³õÃÓO?M…#Qš¦ã?Ð4MÓt4¥išséÒ¥M ’Ëìc_cX›d2{€í™=Àv€Ì`;`ç;/]¼xñÝwßmnnniiéîîv8jµšÃá$.ùÊ+¯\¹r¥¹¹¹­­mdd„Çãåää,›uëÖ­BH~~~2Ñôôôœ?¾©©©··×n·±ÙlfVww÷… ˜Y6›M£ÑÄf¥V*±áááÿ÷ÿôÓO“Y>eíííüñÕ«W»»»­Vk’{Þb± †umh``àõ×_onnnnnƒz½>¨ÑhôÿñY,–F£ÙìXVvŸ#œššzóÍ7€N§K²È}‹0µ;µR©¹téÒùóç÷íÛ—ÙÕn‘ƒâóù~ò“Ÿ…‚‚‚L­sE«?åÇh4¾úê«ÅÅÅYYY [ó:ŸÂÉ–Ï’H¡PøøãÓ4m2™ÚÛÛM&ÓK/½´faN×ÐÐîܹóþûï³X¬òòòøYápxhhè“O>a±X;wîL¼¶ááá?þ¸¼¼|×®]6›­³³Óëõ>ÿüóä󽤤¤¡¡Áf³uttØíö¯ýë)—J  ^¾|¹··—Ï篹ÒÔÖÖÖÔÔTYY¹gχÃÑÙÙét:׌05jµúÌ™3„?üp#Ö‹Åâ÷û6;ø dÊš×yœlÛÞg™=‡Ãa’òŠŠ ¹\~þüù©©©¢¢¢Ä…e2Sª®®î?þã?.]ºËìc³ª««ùË_öôô¬™Ù߸q#vU"„ðùüæææ¥¥%‘HÔÙÙYPPðÕ¯~•™%‹›ššl6›B¡H­T‚0>úè£ñññÓ§O{<ž¶¶¶Ä1§©···¨¨è¹çžc¾ …«W¯ú|>¡P˜ñmeee1Gä£>ÊøÊáAÑÐРP(òòò6;ø dÊš×yœlÛÞ ýì™ë‚Ùl^׊vïÞíñxL&Ó½³ Nçšk8xðà©S§b_‹ŠŠhš¶Z­„»ÝW‘ùÌÌJ­TÇŽûîw¿»k×®5Nß³Ï>ûôÓOǾÊårBˆ×ë½›†‡EQ:n#~:BÊpPà¾Áɰí­Ð¥›éç‡ !¯¼òŠN§{â‰'˜YF£ñ·¿ýíË/¿|oGÌ;vBœNç½N§S$­JiiiüW¿ßOa³Ùáp8s¹ÜجùùyBH0L¹TLz}äææÆáóùñôöö655iµÚØM‰˜îîî7n½^úôéØîîîfºì‹D"Fsüøñ5w>s”wìØÑÞÞîóùŠŠŠ{ì1™L–r½âWÈôõŒpµz%.µb½"‘Èo¼!bÇÚÚÚ®^½úÒK/)•ÊŸþô§ÌÄ?üáøÃ!‡NçÁ š¦oܸ188èp8x<ž^¯?zô¨D"I\¯ÕJƒÁÄ®v(S;^ï¿ÿ>óyïÞ½ÇÍZmÏ'¡Íf‹Åz½þÈ‘#é÷aëééiiiñù|fY½ü9¬Vê׿þ5‡Ãill¼páÂÒÒRMM͉'(Š" ÿRnݺÕÛÛër¹Á`8zôè½õ …B¿úÕ¯À÷¾÷=¡P˜ø ¬¶£6â l„5ÿ`ã«lµZ_{íµgŸ}¶ªªŠY2 þìg?;pàÀž={Ö >ñ•íÞ}¸æÕ&A¥ÚÛÛ‡H$*..Ž?Ê+nËét¾òÊ+%%%sss¹¹¹;wî¼páBQQÑ /¼àr¹V›Åœl«Q ‚F£×®]ëïï‡Ãåååé?~ÂÉ¿7Öõo l¢Úìgff!‰»¬Ü‹É¡C¡ó5‰øý~¯×ÛÝÝ=66ÖÐаÞÈzzzD"‘J¥ŠŸF›ššÎŸ?ŸÙR[ÁØØX__ß#<ÿŒïÀÀ€ßïb~±ÄÌÎÎÞ½{·±±±¦¦fhhèÂ… ÌôÎÎÎ .Èåò“'OVWWÿö·¿Mfëããã‹å™gž9}úôüüü»ï¾›fuÆÇÇ­Vë3Ͻ{÷n£ÑøÎ;ïD£ÑÄõZ­TâÊŽÓiíÌ™3+>¢½âžO&B‰Drâĉ²²²žžžßýîw)ìÕx³³³wîÜillܵk×äää²z%øsHP*·¶¶žMÓf³ùâÅ‹‰$Íçûûûûûû™Ï%%%ëíÜÒÜÜ<::úä“O²X¬Xæ´´´ôÞ{ïÍÌÌ0ÿBgªTFøýþeoú%„ðù|+©qENçG}”ŸŸ¿¬á­¡¡ÁåriµZ@?= þñÿqlå]]]@€Ïçwuu•––Æ:îËåòsçÎ-,,,û©s/÷ä“OB˜‡+Ο?o2™Òé‹Éãñ˜[=EEE^¯÷æÍ›L„‰ëµZ©õÒét×®]+++kjjb³ÙGŽ!„PU^^ΜJ¥2#©Ïàà`yyy¬÷—F£éîîöz½±Ñ*V¬W‚R "L|(S8^‰;à®¶çG¨V«_|ñEæ+ó‹Õjenߥ&ó›ßdš9™Æ×kµÓ&q©ùùùüà2™L«ÕÎÌÌ0wíì^³Ù¼gÏž'N0³ø|þ•+W\.—T*m±££ãÎ;?þxü¨_«”;*ãeƒ$øƒ]±Êƒ¡««+‰0í###r¹œ<-qð ®l N¶ÄW›µµµi4š^xù*‘H®\¹ât:e2ÙjÛbâ²²²’’’k×®éõúúúúË—/Ûl6&Œg'>£V ¾»»;>Œ+W®¬·‹ì2©l)ÿ››å³ÌÞãñüìg?c>Ëåò_|1¾K JJJöíÛ‰DL&ÓÍ›7ßÿ}¦fM@àܹs£££§Nª««‹M7™L¿üå/Ãáð׿þõìììe9zj¥2èÍ7ß¼÷Y‚»-­¨¹¹9?ÿüóË~ ”•••••Ý»¼F£‰-©Õj™Aurrrìv»Á`ðù|Ì,¥RIq8k^…ã(,,$«t¬J^|Y•JFNg¬÷ÑjõZ±Ôšõ:qâÄk¯½öî»ïÎÌÌ<ñÄ×…T,›L&ÇÃôÀÑh4ˆí[±^k–ºMÓ‰«|Ÿ×jîß¿?6¥¸¸8ý̾°°IÐc+Œ¯×j§MâRr¹œéÃf³¿ñoµvoìJ‡C¡ó³ÍëõÆ2û™™™«W¯ÖÕÕ-`Ń’›››òŽZïAÙ8«íùÕÎò²²[·nMMMéõzš¦Fcmmm2JpeK°S8{m6[|3JMML&ãóù Nlf+E1RÅœu±V¤Õf%>£V»è¹\®êêêø=ÓÞÞžÌ>LMj×^Ø‚>ËìE"ѳÏ>KQ”L&ËÎÎN½‰„iÅÑëõ‰ä£>Jf°¿ßÿÎ;ïØl¶¯~õ«ËâÈÏÏ?sæŒT*]–C§V*³ž{î9æÉ„xɧ8ÃÃÃUUUÉwm¿{."‰D"‘›7oÞ¼y3~áH$²æ ã»1+Œu¬JM|„ÌÊïÝ?I–Z³^YYY¸zõjAAA}}}:a'öøã¿ýöÛ¯¾úªV«-**ªªªŠïdŸÁRkVyÓaüïÿeýñÒ#ù&.%‹—-Ÿx÷F"‘7nôõõ¹\®Ø¬Ø¹P(ôÞ{ïq8œÓ§O/[íŠ%•ÚQÊ(ŠR*•ëúa¼ÚyXPP••5::ª×ë§§§}>_’ÝÄ\ÙìÃÎÞh4_J(2?]˜ÍeöÄN|F­vÑc:ìÅf­ùž“4¥ví€-è³?f6›f÷æÂ·bK?sÅœŸŸ_3³ÿðíVëK/½tosKiié™3gV|ÏTj¥2+w»„ÃáüüüL½:ª¾¾¾²²2~Jì b´dêk¸Ý r¹ü‡?üáÐÐÐÄÄD{{ûµkמ|òÉššš(E¶ï¡¼ÏV;+VÛ½MMM»víÒét<oaaáÚµk±e‚Á MÓ¡P¨··÷þŒ uß‚ïÿû™Z[iiéÈÈÈ©S§FGGE"‘Z­ÎÔš8‰Ï¨­"€ËÍÌ 3±¯ B˜Ñ$㻢Æ0w$ï톾ŒÑh;uêÔ²Ãáp8œ¼¼¼X‚Îô”åñx)—ÚR8ÓI Ml6›Åb …Â~¤ÅYfG¥Ù+ƒÖ¬—ÛíniiQ«Õ333===ñÍö,‹¢¨Øír§Ói6›—§´Þ`ªªªªªª¢Ñèŋϟ?¯×ëïmN¾ÔŠ–””$®òý<^«EÈf³ã23FjõZo©ÄgTMMM¬I~ÙE¢¨^x¡§§çÚµk%%%ñ÷ÙV ƒÍfoÄŽÊø‰š{¾¬¬¬««Ëd2ŽŽ–––Æÿ¾Zoðß‡Ì ¼Ïç›U«Õ|>?ãÇ+ñ• Âø06ôvMâ0Rû76ËÏwfggOOOÇ.Á“““«-ÙÙÙ)‹Wìé;00@‰ÔlEÃÃÃ"‘hÅQt²³³cãB˜ÏL_—ÔJŶøÚk¯}òÉ'‰Ûh.—ëÊ•+Ìˬ+BŠ¢ ÅèèhìGÔÐÐÐücf°£Äâ2³£ÒõrM™­×•+W8΋/¾XUUuíÚµX—P†T*µX,Ìç¶¶¶Ç9IRSSSkk+ó™ÅbG£Ñ¥¥¥ÄõZ³Ô½®Yåû|¼VŒP.—Ç_îýûJÁììl¬Ê÷ÖkµÓ&q©{%Þ½‘H$þ9Ñ©©©ø²"‘ˆÍf/ƒeѲA;ŠdôÄf¤p!JpjµZ>ŸëÖ-›ÍvoýuŸñ}ÈœñGöÎ;ï¾ûn Øˆã•øŒZ-B©TÆôôtʤ,S`³¬Ñf_SSóÁ¼óÎ;UUUf³yYfïp8‚ÁàÝ»w§¦¦žþùXà 3+ÏÏÏ÷ôôiµÚÄÛ2™Lb±xhh(~"óNÝ»w_¼xñìÙ³eee6›­££C§Ó1ãr¦VŠÑÕÕeµZ­VëáÇ—ùp?µ¶¶vvvö÷÷ÿÅ_üŲYëpß¾}çÎ{ûí·«««½^o{{{aa!ódÛ‚Ýn'Ÿ?=600Àf³cÿâòx<æ(ÛíöŽŽŽœœœ }Iaë511188øä“O ‚ãÇÿ⿸~ýúã?+[WW×ÜÜ|õêU¡PØÛۻ⃀Iâp8ׯ_w:ùùù§½½=77—y¤,A½Ö,µb„ ªLR:^‰O€ÄVŒ°¡¡áÒ¥Kï¾û®Á``þ¾ŠŠŠÒLX9Îo~ó›ÊÊJf…ËêµÚi“¸ÔŠì^N×ÝÝ-d2ÙìììŠIŒH$:yòä‡~Ø××{6tµƒ’`Geü ¤#… Q‚óÅb•””ܽ{—ËåÞÛâ»Þà3~²íÝ»÷üùó|ðAII‰ÍfkkkÓëõÌÏ’Õ¶•ò“ZÉœQ÷Ú¹sçµkט0îýÇw5 ΨÔN¶Ä"Ø‚ÖÈ쫪ªœNçíÛ·›ššÊÊÊ>?²ïäääää$—ËU*•Ï=÷\EEŲYl6;;;{÷î݇Z3”@ `³Ùb¯Ò`¼üòËB¡i’ïêêº|ù²H$ª­­=vìX:¥•••sss:nÓzBˆV«½sçΊWØõFÈ$mmm—.]âóùeeeGŽa~nõôôtuu1‹ŽŽŽŽŽ2 0S óóóoܸ±´´¤Õj{ì±ÌÔm™ªW$¹téRaa!3 ’D"9tèPSSS]]]ìɇG}Ôï÷÷õõÑ4]^^~òäÉ”Ã>tè›Íîïïïíí‰D:îØ±cñÝ V¬×š¥VŒ0Á¡$)¯Ä'@b+F¸{÷nŠ¢º»»WûûJS¯–––ëµÚi“¸ÔŠìÞÓ§O_¼x±µµ•ÇãUVV.»èÅTWW \¹r…$€¬~P쨌”t¤p!J|–••ݽ{W¯×ßûôçzƒÏøÉÆ\1ÚÚÚ†††x<^UUUl…ßV’gÔ2{÷î]ZZêïš*++;tèP2¥œQ©l‰/D°Q_¸¸Ù1À&[ö¦aØâp¼¶ ‡ð ¬Ye“Éôæ›o>ýôÓɳÌÞ½{?¿¹+$„ôôô´´´ø|>FóØcÉd²5ãïîîîîî¶Z­"‘H£Ñ?~\$Bhš¾qãÆàà Ãáàñxz½þèÑ£‰$V°···©©I«Õ2]}¶‡tÇÆár¹R©´ªªJ­VG"BHaa!EQcccl6›¢¨LÄ ™'“ÉD"Ó!žù¬“}KKËõë× NŸ>½sçÎ;wî¼÷Þ{ñeÃápkkëÉ“'÷ìÙÓÑÑa4ÉçÝâÏœ9Ãá,o=L¼ÂÙÙÙ;wî466îÚµkrròÝwß]3øÎÎÎ .Èåò“'OVWWÿö·¿m«¹¹¹¨¨èôéÓ»wï6ï¼óNü8~¿hhƒ|Àv’z›=£ººš¹Äw¼Q(‘Hd×®]‰$.,, 0½t`KQ©T±Ì>þñY³Ù¼gÏž'N0_ù|þ•+W\.—T*e¦ÌÏÏÿà?ÉdZ­vff& ’„Ýâ¯0ó›ßdÅbqSS“ÉdJÜS¿«««´´ô¹çžc¾ÊåòsçÎ-,,¨TªÁÁÁòòòS§N1³4Mww·×ëÍÊÊb¦444¸\.­V+ÒØy[Kº™½Ñh4›Í¹¹¹ÕÕÕ„&¹ …l6ÛãñŒŒŒdeeóùüööö Ä •ŸŸßÚÚJÓ´ÉdR(<™þüóÏ3Âáp(brb¯×Ëìår9Óa†ÍfãßXsC‰WÈÜðg(..njjr: 2{š¦ív»Á`ðù|Ì¥RIq8*•J,›L&ÇÃôÀÑh4&¾xYYYYYYR;àÁ‘nfïr¹\.×ììleeeuuµÕjõûý<ÏáptwwBL&S8®¨¨‰DL/|Ø:T*U8¶Ùlf³9~¼ËH$rãÆ¾¾>—Ë›?ØX,^׆¯0¾÷—Ë%„$¾Û‰D"‘ÈÍ›7oÞ¼¹l:!äñÇûí·_}õU­V[TTTUUßÉ`»J7³1Z­6//ojjŠÃáX­ÖØ,‹ÅB‹ÅÈì¶šüü|BÈüü¼Íf«¯¯Mojjêììܵk—N§ãñx ×®]‹/¸ÞGéÖ\a êëë+++ã§äääBärùøÃ¡¡¡‰‰‰ööök×®=ùä“555in`‹K1³§(J­V;f°KBH8&„°X,š¦cÃâÆ&ëÿû€û@"‘H$’ÉÉÉh4ÊdùŒþþþšššÓ§O3_™èÓ‘x…ñ_™.ûLËýjØl6‹ÅbÞ•¹ÚUUUUUUÑhôâÅ‹çÏŸ×ëõë½Ïð`Iqlš¦ CIIIl Ó¹ Ón·çææ²XŸ­<77—|>à=l5*•jjjŠ¢¨ø~í‘H$þéÒ©©©4·’x…³³³±ž9ããã„Ä£^R¥P(FGGc¥†††~üãÏÌÌBšššZ[[™é,«¸¸8Æ÷~íµ×>ùä“4+°¥¤ÞgrrÒ`0ÔÕÕÙív>Ÿ¯×ëÝn7Óñflllß¾}<òÈüü¼X,.**ZXXˆ=à[ŠJ¥U*•ñÍä:®»»[ Èd²ÙÙY&c^Ó‚Ýn'„Ð4m³ÙØl6ó¬jâr8œßüæ7•••6›­££#'''öò¬ÕV¸oß¾sçνýöÛÕÕÕ^¯·½½½°°yӇù~ýºÓéÌÏÏ÷x<ííí¹¹¹L+$£««ËjµZ­ÖÇcxØ6RÏìÇÆÆ"‘ˆZ­V©TÁ`Ðd2 2¿›ív{GG‡Á`(//…Bãããccc™‹2‰é„ÿø,!äôéÓ/^lmmåñx•••‡þÝï~·æªzzzººº˜Ï££££££|>ŸIį°°°0??¿¥¥eiiI«Õ>öØck®°¶¶–ÒÖÖvéÒ%fâ‘#G˜Þ¿‡b³Ùýýý½½½"‘H§Ó;v,¾cpeeåÜÜœN§CZÛ %É’nv °QΞ=»Ù!@&ÅQÅ|ÉØØ8ð`ùñ¼Ú¬¿ù›¿¹Ÿ‘@F Í`;C›=À6“ Í>űq`KAf° Ÿ=ÀCêòåË›¤.Ö-‡éŠCÐf°= ³ØÙlÈ춃´ž ÍÏÏ×ëõb±8 ™Íæ¡¡¡p8L9räˆP(\¶ð­[·G:›Û X,êÿúÓýçÚ§/ÞžÙÄ04µZuƒX˜zÍÖñÁ±?D"áØ\±Xüú믿öÚkW®\ÙÄ àáTVVVYY™••åóùfgg;::˜ô6Z꙽B¡¨¯¯·Z­ƒƒƒB¡P§ÓñùüÛ·oBîÞ½Ëf³cKªT*•J 3/’—SZSqÊd™ší å:M'êêÿ(¶@  „`‡ÀýWTTÔØØ899988(•J+++Áµk×6;.€‡B꙽Z­Ì ;Ñh´´´”Ëå2í÷ñKêt:·Û½´´”n°@!¤T·Ï᜻Ý÷!ó5 ô<žˆ¢"û·ÛÖÖÖÜÜLÓt4Ý·oßáÇ›šš:;;77fxHÔ××/..^½z•ù ßïßÜÀ©göF£Ñh4ÆÆÑt»Ý„@ …âÙÙÙÃÃÃéD ñFÆoúžØW›}†è‰D¤ˆÐn£ÑxòäÉo}ë[EýÙŸý™ßïïïï÷ù|›-31¿ù曃áèÑ£„ììì_|±©© i=dee ‚ÉÉÉùùy©TªV«ãçÊår6›ÿ]ò ƒßï·Z“ýçÒ‘ÖØ8„êêj•JEéëë›]6W$I¥Ò¡¡¡4·²A´¹’ÿý.›;02ç*ÎÏâsÙ„ƒUªþIû//Ö}hÑáûαRuŽxÚìí6ZY,в`_J>§O°-BH0aZúGç]YBîé]j!í .ÿ´ƒþÑ\eqßÀ'4%„ˆD¢þð‡×¯_onnöz½ý×}ëÖ­öövBH__ß­[·¾õ­oµ··¿ôÒKápøwÞYW`[ŠF£LC»Çãáp8yyyl6;ÖTg±X¸\®Çã¹·ñnM;wîÔh4---h³¸?ÒÍìF£ÙlÎÍÍ­®®&„,K vÅa˜~›;@ G¢ÿ÷Gw !Erd‚¾ ›XÀe–Y°û!J©`ÚìÍì¶ÓoügEY‚YëÚÛâpøu•å)Kî_™ïg&.--ýÃ?üƒÅb!„tuuýýßÿýàà`¬È¯~õ«Ÿþô§õWUQQñ‹_ü‚y4rñ÷Õ}>EQ</öŒ–Óét:ë]'Ç;xð F£immÉX¬Pº™½Ëår¹\³³³•••ÕÕÕV«5þ™üü|‡Ã±eŸàtù–÷hç°Xluª¡ðTCá²éß#‰.ûÌ嬽-.W°wç‹bav{Ïï-¶‰øYSSS±Ïñi=!Äf³ýçþç·¿ýíÑÑÑØ¨ð‹ †A>ïOQT:+äóù§OŸ–J¥—/_¾÷~>lœt3û£Ñ¨Õjóòò&''™)b±8++k`` S›È¸økY¼›ƒ‹·G-ñSæíé>'°Ú¶RS_õ„D¤¸Ùù¶Ëc^{é8ÌÅ:³ÁÄ;tèL&;þ¼ÍfÛìX.)föE©Õj‡ÃëÑÁŸûömBˆ\.¯««³X,SSSb±X«Õ²Ùì;wîd.lØŠ¸\îÞ½{ C(ÚìX:©göjµ:tttÐ4M‰F£¥¥¥\.7 ƒÁÎÎNf‡ÃQ©TÈì¶½ƒªÕê[·n‰D¢êêêÍàá’zfo4F#“»BÜn7!D „B!.—b³–––¸\.EQ±)°-uvvÞ¾}ÛétîÚµk³cxè¤þ­Çãñx<±¯999‘Hdii‰âp8²²²²²²!Eåçç;N¤õ[ EQƒ!6%''§¾¾^$Ŧ(ŠÚÚZN—ä:].—ÓéÌlœ¤tÇÆár¹R©´ªªJ­VG"BÈÔÔ”×ëݵk—T*­¯¯—H$ƒƒƒ™ˆ2†¦éÙÙY±X¬P(!\.W¥RÙl6¦Ž!—ËÙlvvv6›ÍÞ¼H )iC©®®V©T„¾¾¾ÙÙYfb$iooß»wocc#MÓ]]]v»=ÝH ÓÜn·Ãá(((p:4MÏÏÏÇ/`±X¸\®Çãaï`+K7³7f³977—yJ&–Ü+•J¡Pèñx$IAAÅbÁ¨—[ÐììlEE…^¯—H$ÓÓÓ±¬N§½kéöÆq¹\³³³]]]ÓÓÓÕÕÕ€²cÇŽšššééé–––ÎÎμ¼¼ŠŠŠLD  …L&“D"ñz½V«u³Ã€Ôeì´F£‘ÅbåååB***ÇÀÀMÓf³yxx¸¨¨(þqȬ3{Š¢4 3ú ƒ¹yÇb±(ŠÊÊʲX,±ÁpÌf3!D*•¦-d—ËÍËËóz½b±xÇŽ›¤.ÅÌž¦iƒÁPRR›¢T* !‡¦é`0Ÿô3Ÿ@z¡@æÒ4m4ív{~~>‡ó¥gðd2YEE…Z­Þ¬ð y©÷Æ™œœT©Tuuu¦´´´®®Îív[,BÈÔÔT^^^]]Z­.--­ªªb½Ï\ØYYYÙÙÙsss‘HdnnŽy MüJ¥R (•JŒz °õ¥>6ÎØØX$Q«Õ*•* šL¦ÁÁA¦ÎèèhlV(2›Í±Y°EPUXXèõzm6!$ -,,X­ÖØöv»]$¹ÝnŒz °õQ’,tضΞ=»Ú¬Ë—/ßÏH ³bíæ4M3Ÿ366l"döÛ2{€í™=Àv€Ì`;@f° ³ØÙlÈì¶N:…óóóõz½X,…Bf³yhh(3³ µZ­X,ƒ ÃÃñ·dÀöVTTÔØØÈårßzë­ÍŽà!’zf¯P(êëë­Vëàà P(Ôét|>ÿöíÛ„‚‚‚ÚÚZ‹Å2==-•Jõz=EQƒƒƒ™ ¶".—»wï^ƒÁ …6;€‡N꙽Z­Lc|4---år¹¡PH§Ó¹ÝîÎÎÎX;½V«Ã9ÀövðàAµZ}ëÖ-‘HT]]½Ùá<\Rïgo4ÛÛÛc¹»Ûí&„BˆX,6›Í±YóóóEÉd²´£€-­³³óƒ>Àz€M‘zfïñx<OìkNNN$YZZb±Xl6;Öážâ÷û !\.7@ ³ø|þÎ;åryl ‹Åª««ËËË‹MQ(µµµ:.Éuº\.§Ó™Ù8 IéŽÃår¥RiUU•Z­ŽD"4MÓ4Íb}±fæ3EQin 2(øýþø›êR©”Åbŧær¹œÍfggg³Ùì͈Ö!­±q!ÕÕÕ*•ŠÒ××7;;K¡iÚçóÅ_&Ð`kr:J¥’¢(¦­T*eÒýØ‹…Ëåz<žH$²ya@RÒÍìF£ÙlÎÍÍež’a’û¹¹¹ÒÒR½^???/‘HÊÊÊ2)dšÓéÌËË“H$n·›¢(©Tj³Ù–-€Þ5Št3{—Ëår¹fgg+++«««­V«ßï7B¡°¼¼¼¼¼œ277WPP‰h “–––B¡L&s»Ýb±˜Ãá xp¥›ÙÇF­V›——799Fûúú†††D"ÑÒÒ›ÍFf°59N©TJ‘J¥ápØëõnvD¢Ÿ ¥(J£ÑdeeŦ0ƒá0ËŠD">Ÿ G0d&¢Àät:y<žP(”Édh°x ¥˜ÙÓ4m0JJJbS”J%!„s×®]õõõ±Y …"6 ¶æéØÜÜ\>Ÿof/“É***Ôjõ¦Äë’zoœÉÉIƒÁPWWg·Ûù|¾^¯w»Ý‹…211QSS³{÷îÅÅE@ ÓéÌf3îîlA4M»\.¹\Fïm†S*•@ ÌÏÏãö;À—zf?66‰DÔjµJ¥ ƒ&“ipp3kff†¢Óé*++C¡ÐÌÌÌððpÆB€Œr:r¹ÜårE£Ñe³ìv»H$r»ÝHë¶>J’%Ýì`£œ={vµY—/_f>0#ÚMMM-ò¶2¦IùÀ|N÷´ð “J¥4MãñY€2{€‡L&óz½èoð CfðPãp8B¡ öÛ@ÆÞT¢p8ÜÓÓ³ÙQ@ Í`;@f° ³ØÙ?„<ö®Råš‹is%j¥ø>Ä[ ž }îÿð‰ .‡uwÊî&’ìHM~CÉŽßßœøCÿÂ} ¶‚ dö"‘èСC„‹/Æ&j4F#‹€Åb‡ÃëZm¥&ûGOVþô½þ “{Í…9lÖWêkuŠ(Mÿ¡á“Û3Él‚Åæì<ñ|~i5ŽuÝj½²®3‚b±žÿ¯?¾ÛrqèÖÊ[ÏÍþùÓU®¥à«ï &Në !ÿ~mÔмx@‰Ò-wM/ÀÚŠŠŠ¹\î[o½µÙ±û©QÀc¥Q?:ï2Ù}÷!H€.—»wï^ƒÁ ­ýÏdVº™=ÇS«Õñi=!D«Õ:ÎÎÎNæk0,//‹Å^¯7ÍÍ­¦\-›¶xÏwL³X”DÈÍr“)•«-s˜fn|B±X|¡„/’lPx)Û[–«Í‘¼za0™´žAröScY¡ìÌ£ºÿ÷üÀ††°ÌÁƒÕjõ­[·D"Quuõf‡ðpI÷ Z­VËb±L¦/uü‰D‹%ö•ù,oà“B>ÇëB¢QúÕ:G-k!„pù‚ ‰BG£7~ÿÆÌ`÷ÆE˜šG+rg,Þ;“öu•ò#×ûæ+ÔÙr ƒXQggç|088¸Ù<ŒÒj³g³ÙEEE&“)¾1žÅb±X¬Hä‹á2™ŒÂᬱ-‹znŸö‘²›ê·õOØâç¨Êk¬ÌË• ½þÐè¼ë½›“ˆ"âs(Šb³(6‹%p !4M/ÖèÓÏ)ŠÅb±£¬O(&„Ðt4äÿ¬ïоn¿®n_–"'àóZ¦ý×? ø>«àáoüY4¼u¥áÔWøBñÔÝξk ³²ûÓÿÕd”9ç&úÚvž|Á2=ÖúÁ[4%„*Û{D[³W$Íù}s£wúÿp>ôs¸¼gþ§ÿά¶êÀcU#„Äw¸ñ9Ū¬÷[§–ÿóŸÿ¼¯¯offæé§Ÿ===o¼ñ†ËåŠ_æö˜õ™½EUEÙËzÛï¯È}~¿ndÎùú'C‰w< ªªªx<Þ²‰ÃÃÃKKKÌg…BQXXèv»'&&’Yá²à~J+³×h4\.×h4æææ®¸EQååå:.™µ¯+8V—gÊÑ7a+Ü!zb&6ëpêÅúÛcÖæ;¦Rþ‘šü|…èÿüÏ^šÿå+uЬÏZ¦ÿ?ÚC±¸ÿðöí5¶õÒIåÌç§þì#„xÖO^ÿGBHqCcýñçg‡zÆ{nŠdŠ’†R¥êê¯ÿ•Ïz±Øœ²GŽô6½/Ï/ªl<µ89â²,BhB´_«>ôd4¸ñIݱgsuÓøPÅ£'*=5u÷öpÛU‘4»t÷aqöŽ–w_‹„Ãm¾E(ÖÞ§¿=3Ø=7ÒGqY¾HÄ™ñ+W|€¸¶¶–òoÿöojµúÛßþöŸþéŸþä'?‰_Àêò{üaRBÈ—2û]%JŸ]¯Wˆøœ5ÿÀ¶733Ãb}q¿  €ÍfÇw‘—Ëål6;;;›ÍfÇ7ÛÀ”zfOQ”N§³Z­N§sÅÌžÇãíܹS.—ONNjµÚ5WØX™g\p¿úñg]ÃÏ<ª+Pˆ˜Ï«Tý“ö_^f¾.:|ß9VªÎO›½¿já²Yguáýaë$!$Ž®¹­Žóo³9ÜÚ£ÏDÃá;ÍB¡ 3«¸¾qÁ8ÐöÑ¿3_=vóîÇ¿žWè0}6ÞŽ"_óÉëÿ´ä²›§Ç”j=‡ûYSÇüèù±»Õ‡ž4MOöµÕ{V"W𯇤JÕØíæÞk2‹…þڣϳ²}nÇìpÅbB\VÓìpß² ™¾4—ÿÞøÀ«¯¾J¹{÷nvvöóÏ?/‰bí+ ‹ÓŸ-YÞ ÓrwA.áÏ:‘Öùr»R©äñxSSSñ™½Åbár¹i=ÀÖ—zf_PP úûûWœ+•JY,V{{»Ïç[3³§(¢ÈâwŒ˜cSÆæ]Çêò™Y92Aß„élCY°û!J©`Úì5.¸ !þ`$Š %1Ã:;A ü‘Ppqr$. J"ß1?ÚÏtÑ!„¸­‹„qöŽXfï±[–\vBH4n>û BÓüOG£Ì“Ä4¥é(!„ÅâBÚ>ü5SÍá²¹\ŸÇEˆ³|nGâ <6Sµ{gÆøÏ,+''grr2~("ä-?¾=ã¶žqø2¡PXPP`·Ûm¶/ý3át:Îdÿy€Í•zf¯×ë½^¯Ëåâñxl6›Âãñb¿òU*•ÓéìêêòûýB¡pí8X,EBqÍí¡H46‹Í¢N5žj(\V$åàWÃb³)»lßñ²}Ç¿4ÅŽ},yÖ¹NNù¾ãÚê=Bivl"EQkdö—Í „–'÷ñ/`öù½½$¹lV(‰Û,K«Õ†B¡™™¤^[SŠ™=‹Å’H$„ãǿȀ?~ëÖ-æ¾Þââbwww4š±Ìòæàâí/x3o_Zmá4MöµÍ õÄOazÒ3– ñ¹¦Ú#O70vß\œŽ„‚ÙyêêCO$SyDX*â2Ö+KılÔ0£°ðùü‘‘t¹x ¥˜ÙÓ4ÝÞÞûZXXXPPÐÞÞîñx¢Ñh4u»Ý±´ž'ñ;hÃÑh”&\ÎÍð±ÏÌ,¯?œ|g›”E#: ú—â»è¤ISµ{êNgÏ•ß3_Ùœ/µOGiBÓ±§—Ä2EÖŽ¼ã!dκDQ+Ås¶uÿ†ásÙJ© mh1Ýè`»“ÉdJ¥rnnnÙóZðÀI±C MÓÖ8>Ÿ™Â¤ïKKKJ¥2¶0ó9ñkªhšØÜ²BYlJ‰J›µèðÕhå¬Ï{°Ôëwüë-Ve¥|âzyìfUqE}¶g µgþòŸvêR]%ÅfsB/Þ«T/Ûæ’Ë‘µ#ùR²ûоg_b>[\~§7T£U¤°Õj­œE‘±…åãêÔëûõ_=X¼b)xØp¹\Fãv»Wn ’Édjµú>)H÷´+šššªªªÚ½{·Éd‹ÅÌ:k¾€öÆ€éÙ}E?x¼¢ož¯ÆgùWzæ¾}´äÏŸ®êµH„Ücµùã&ÏøJÃA¦o¤ýú®Ç¿vð«:=ÐÍIJw²ÍMÚæ&×.¹2zqjD_·?ð-9íŠí½?&ï´W>zªæðSA¿WW»wn䋇’ÛGÌGkóå¾ÝX×VVåY\ãüòA…T©ò²…yÙÂsíS4 ›Ív¹\ÙÙ_< æñxbwÚ•J¥@ óóóè«°ÅmTfOÑh4•••Á`pfffhhí÷"5õÎIܽå9¥ÒÞqÛÇÓrºœ™Õ:´H9V—ÿ•z0Ü;aû°ujÝÝ“5y§ƒRºçpýñçBAÿÜhÿÝO?^oßúxÝ—ßpêÞ#áPpf°ûNó…ýÏýQüíW¹|¡¶z¡¨Ù¡Þ¾ÏÇÇ$„\ë›?P•÷Õƒú×. &Á¾òÜÒ|鯯ŽÞ[¤k̢͕`ÔK`Š¢ ¿4FÅððp,³·Ûí"‘Èív#­Øú(I–t³c€Dö•ç~ûhÉÕÞùßßœHfyCìGOVÍ:co€‡ÙÙ³gW›uùòåû dV¬é™¦iæó†´ÙCµ-ÊDܧ÷íòue$ñ{¸U«Î<ª›4{Þ¼´öMØNÙ?>éš]pøö—çÆÆø_ —úÞ?®}:¼Ö’°Í ³0ôŽÛz“xwlSÏÜ}¶ Ì¿Æî?döÛ2{€í™=Àv€Ì`;@f°°y|~š«‰DÇ/--‹Ÿž——·oß>ƒÁ°lúñØÑ¿ò³­Æò¢Ãû¿»´d÷x­)Ï:ÖøýJÃQƒþQƒþÑ¢‚Z_bsÌÄ^ –E±ž8þ_ µ9f7®²éH9B…\spïK\ßjŸJfùü¼òCûþˆÙ‡6Ïb›ÜèSÃb±kÊOÕUžÖía±Øö$6ºZ„Ç¿Ÿ%V.Z2ü’B„÷YYñ½ _U)KgMwiz+¾{Âvòµ¯}mµYF£ñ~F-mö:Ž¢¨ø)§¦¦¦¡¡ÅÚº÷XT,6šÅbÓiϲڧºú?êî?7¿8¬Ó쪫|lCâ~pd‰_š•—äòvÇ\WÿG]ýE£‘ ,MEuꂚə³u¼¬øÀyÑfG´Ü0/§´D·oØØ"dÕVœÞìpV€à•x<žZ­^Ö8][[›““s÷î]>Ÿ¯×ëÓÜÄ¡é(ÓÐÿÿtfù|®…ÅaBÈüâP$*ÑíýÔpߟêlASs½^ŸÃå^LryÀ½°è&„lñEJ…Öå2Œß ('âóD›Ñr[9B‰XQ_ùøÂâðØD«×kk¨}Æé6Ounv\_@„ðàJ·M]«Õ²X,“É?qhh¨¥¥ej*©>›%JG£t”F !t4šæ¬x&ó(!D"Vl\ü[MÓÛd0äÛì@2ŒÃá3•¢éhGÏïçLƒ›Ñr[9ÂJñP8Ð?x‰²`™™ë+Óàó%›×!<¸Òj³g³ÙEEE&“ÉëõÆO_ZZJ/ªûaYë{”ޤ9+ÓŸ„Ãæ1_‹ ë4ub‘<òY3ƒ#׃!›Í=}äd00 „Œ[F'Z !Ç¿o±Mõ ~Â,³C·§þ…›o;\ó„ý»¿†G'ZkËOñ¸‚Ù…Ñk4M3¥<^«¾h7›Í³Ø&î ]a’<Š¢JtûòsÊDÂìp$h±M Ž5ž»(q„ ÂÈÏ+ßYý³ÌøTçàèõØ:?‹pɪ×ìær…6ûôá+K>gÂc•â>L¡Ê˶z-¶É¡±OÃá !„ËPÅb±¢4›ÇBhš…ýéìCBˆ¦ ®T·Ãáǯժœ8òÄ®V/²Ê¡ð³Ž6~ßlÏ–æ»<æé¹Þšò“6ûÌíþö›‡Ãæ<ô£‘‰[c­ázkü¾@ ]6qC÷!lieö†ËåÆÜÜÜLtßD£Ñϳs&S§ÓœOž]@Yò9!ZõΪ²ã ‹ÃS³=BL§iÈ+[Ú†»ú?¢ÙYóô¼ihÁ „”êö—êöOÎöŒOwòùz×Þýí5ò IDAT¬¼æ¶·<{—L„+†Áô˜'„ÔW=qïj• -¡H÷óbQvyÉáݵÏ}Úö«Ä•Mm¦PåØ¶Ì–ñ©Ù±H®S7ˆEж®³„ƒ{¿K¶Nú!dÉç¸~ók[sfËòEBÙØd«D¬ÔªwRÔgÇkµ*'ÞQ "LP/ƽ‡ÒíµBM§ÚËKE£á‘ñ›•†£J…Îl_½Ê‘»ÃMìüЦ fz®ŸÏôNÏõ1?JÑ`ìytBH$r{̱¯«½™åY²y—ìy9¥±Ì^¹CG±Ø‹æ±ˆÃáQ„Z61 &~¾è ›Í}­,=Ìå }÷FDÛFê™=EQ:Îjµ:Î1³¿Òü óÁí1ÜôÓôg±XlWH(*[šoÐp{Ì.™¢-Üi¶™L—âõÙë*“eå9ݦ…ÅaŠbB<^ ÓG?yÙRÕõ›oøü.«}Zž]K"‘ÓÒosÌðx¢Rí>‡òsËÌ#w‡›˜ÅìŽMAŸ'Nð$MÓkF¸b‰{̇#Á¾Ï"$„ÔTœ–Jr\q©É½RÛ‡)T™Ù–Ã9×Ñû{æk à­0‘ˆ¯­ûÎy6›SYz4 ?%„D"á«"IìC›×Üû±Ak w2Ç+A•l.A„ êÅLYíŒ2YF-Æò’CÛäô\_¥á¨X˜èhb±M.,——Z0VŽDéèÐXsâÅXíìMP„É›9!„Íâp9|’DÞl2Ö³XlæöZž²dÉçøì—L¦#<´÷åÕZß”Šÿí¤U7ÒÞ»’¹ã”B„°m¤žÙ‚þþþ Fó@+PU¨*™Ï.÷"ÓNFQ”H”m²Œ2]#!Lc›H(Kœ¢­É»d÷ù]„h4ÒÖõnlzüj].¡(‘@êò˜ýA¯4+—Ï—0ÉÍ1›‘1"W #W\„vÇ!D$ÌNÙ§¼S¨2³­±‰¶Ø³m¢‚‹¯Íîœ#„„"ÁH8h±eæ1»s6vÁjŸÖªD©ÛkI­Ê«E˜¸^Ì”{¥P %„Ð4ÍdÉ4e>P,öšõ¹vxÿ÷v×>'Ï.ì¼J®CÈjgo‚"ñysyéáòÒÃ$‰¼Ùd-Ö>¢ÈV[l“EåìÐÏÌßÙ »úϱØË¯´ž%ëŠ ß+K’SQzxÞ48»pwƒ"€m#õÌ^¯×{½^—ËÅãñØl6!„Çã…B¡dqß–ÌÖñ‰éN}Ñ#ÙYy·:߉DÄŠbS«X»·X»7~aV¹QbÁàÊ3ÄÉ<Àbq!w†.ïÝùâÑýl±OÙÓs¦¡dÚÿR#hÜcÇÌ^bß“÷ÄKy¦Pef[Ñè-ñ‘Hˆ‰ë‘Yñ­þÌvY,NÆO›dê•¡LÀðŒŽß,/=ìtÍOÏõ%Yjµ³7&oæ²y»êž›œîZ°Œ’$òf‡k>ðä)K,¶I¹¬Ë,ZF7(Bï’}Ù¸À$‰»= 6‹³³úÉ@ÀÓ?t9™åS‹¶¯ø,K"‘BŽ?›xüøñ[·n9ŽÌ„ö  ¼ÛT0ä?ðÈwŠ ëǧ¿„nf®~ñK㓸=ɶح†&ëûå]²_¿õ†*Ç ThõšÝå%‡ú>I²0ƒa¤,…}¸AU¾o6â´I`%EÙè_úLÛ3%Nêóö62~“Çi !4M{–lyÊ’ØíxUŽá‰ãÿ³\V[ÞpKÄ;˜Ï:Í®†šg!K>§\VËrušQU”).ÚÃ|¦é¨Ù:μÆ(™²+F˜²øz):òù B«Iy¦Pe𦗖JÅ/meFñ.ÙÖWÉ{¬k&SåuÙ¸z­¦Òp4 wö¾7o,/9Äýü Ž{ï~l±M&_ÄjŸ ‡ÅEˆDÙÌ (6ˆÝ9g±M-ûoÍ6x?«¶â´Õ>5>Õ‘Á`T9†Ãû¾[]v"ƒë€­ý/3Ïí1/,Žk÷LÎvG"¡ñ©ŽÚÊÇöî|qÎ4Èã‰ôšÝç|üø™ù~ƒ¾±¢ôp0äÓäךÌ#„Ù…»õÕOîmxqna0K¢Ü!פU4)/9$Ê®O¢Óìr{,ñcç%°b„ ȲòD¢lBE±$"y~^9.|^* 1õ‹²uš]…y¼/A©ÔöajUžœí©*;¶§îy“eŒÒfŸŽ=fš²õîÃ5«¼^T¯)EªÜ²þÁOB!ÿÀÈõ#û‹ËK2oVÚ Ñhdva`]E˜{ùyÑHØš¡{#T[qŠË˜-ãªÜ²ØD‹m*Ég‘WSTX'+Äb۱%ñ«àA„Ì~CŒŒßP弬Sï›leÆÜÐkvW•‡&óÈÐXsü­ÿ±‰6.GP¨ª¦(jÞ<<0r2g dZu}¥áÈ‚ydÄx£¡6­–ò‘ñ–h4\˜_¥Î¯ —¬öÉÁÑ?$ÙaÅøÿÙ»óè6Îûnô¿™;¸oàp)š¤DÑZ,[–MÉ»“:Nì4ÎÒÞ¾isÒö6¹iNïioÓszîû¾=mϹ¾]nûæ´uN×i8i“Æ–#;ÞdK¦vJWp_@ì;0fî#AI,@‘¢¾Ÿã£Ì3ó<¿ÈóZ§köêØ[YÊïæwÊ3óHë{»ÚŽÆBóKWG&ßÏå*e¶Ñk˜õ”7j“Îk-–åºvóx—æ¯QTŽO}ÔÙ~t~ñJ!™l›}¢®¦ÓîšNˆÛîÇFù ÖíGS7~töOa™ýÒÊh‰±ÖéžEZ°#1zÃê[»6Ϫgël!£¾êþ_¼<üÆt_5@^}õÕtE'OæºìlCÉ!¿äÕyγ¸ÓUU´$ÉoØÙÀ]ª¦ªÕí]ˆÅ0/vdöp7RñÚc­Í1¹Õ î …ÛêWþóV‡@DB¯¿ýÿluÅ„1{€™=ÀN€Ì`'@f° ³Ø 8^¥*° ­V;00ÐÖÖ69ysý¸†††žžžÎÎÎÆÆFNçr¹’OÉÚrõµ]øâüâ•xBHn¼¯ÿs5U­K¶ÑMj´¼¬ñ_T*TN÷lQ*䕚GúƒX,ìõ-ç²ÿÇ¿lÐU®ÜX㯪Â|ô¾ßr8§#Ñ@æ†}bàÿ Ity ºHæ|fé>”t®º†ÛS£©§w÷ã»ÛŽ6šºuÚ2—gN’Ä­ ¶ÒóÏ?Ÿ®ÈjÅ“Úv”"ŒÙ›Íf†aR·ÔÔÔtww‡B¡‘‘›ÍÖØØØÓÓSxCÅŽú‰ˆç5J…º§óÑÊòfùm$âß¼F Úr…Be4Ôl^°Q;ïC©©jëî|$v_›xgÙ>ÑXßÛ»ûñ­ n“B׳çy¾¡¡aÕx|kk«Çã¹pá‚ü6·µµñÿÊæ5µó>”6óAwñüÐÏä·ñD´Ýr˜çµ‚ÚÚÀà6(4³onnfYvyy¹¦ææÀçøøx4M¾u¹\D¤×ëå[."Ù+5,Ë‘Z¥gV¡Pm꘽$I×ÌæÕyØÎŠA_:6:‡m|ê£ÔJ.÷ñÑÙW<¾¥¢_tapœòÑ£ÿ»¼O{Ëýí-÷ѸõÔÄôycS}o£©W§-‹ÅÂNÏüÈø»7‚gZÍëªvi5¥ñ„àpML~ ¨põÕÈzRòe÷£ …½É÷ßûùPÄwáÊÏÒ}(Y#$¢FSo›ù B¡Jý¼ò¸¼Qpü¡}Ÿb¡Éé–‡sŸ(¿â¸eʬR¡""QLäx8ÜÑ Êì•J¥Õj­®®Î°[CCƒ ^¯7Ã>·Y$êç•ZI‘ðúmj^ÏóZ" GüDÔf9Ôn9¼°<욙ר –Æ~­¦äã‹?NË²Š–¦{‡Çß.5ÖµYîs¸fVœV"’çë_¼ú ƒ¾²³õA¦“=?ôŸDäö,^¸òs"ÚÓõÄÚHÒeiê77õÛS6Ç„Q_Õn¹oS/Ⱥaˆbü•Ÿ3D{»Ÿ^².Ûlj(pȇ47ìíÚ5°¼26»pI£.17öt•§@DmæCmæC3 —¦æÎ©Tzsþ†š>þ~Þæq5‚A©U†a<ô¿[?œ˜>­Vëí®iJÿ¡dŽˆJKê´š’É™3z]esÃ^†¹þyåqy3ìOý×VóÁžÎGÚ,‡&§?^X¾šG‚Þ`ê‰ÅÂ^¿m£À(ÿÌža³Ùìt:½^o†Ì¾­­­ººúÊ•+Ûgm" Gü¼RM ãõ-—Ôï½1f "ƒ®jzîüµñwä=ãq¡³ý¨ZeHŽè—kßýè¥pÄçtÏ••ÖsœRÞžHĆFÞ$"—gžçµmÍ U<DýË+~"êÝýØÚHÒÕdêõxÏ^þ‰¼Ûîö‡ôúÊÍ» éÂX^c–ˆAÇòÊXê!Íõ{í«œQ0ìîÝýX‰¡Æë·ÕUw,ÛLJÇÞ–‹ÜžùFS¯Š×E¢þü*ÌãjBn’$µÊ àx"ÒiKY–ãy] è$¢tŠ$I"$"Çpñû7Ñ¥æú½ò…ÊïòfŒßuiøõñ©ÚÌïéh3´Î|<·t%÷ü¾Ýr_ueËе7±6À]"ÿµqL&“Z­žššJ·ƒB¡èëëkmm½víÚüü|Þ m†HÔÏóZµJïó¯pœB«1 BPN€.\ù™œÖs¬B©ÔÈ ½Z¥K ¹Ã‰bâã ?ZZ¹¾PfêȨÏg#†ÑªY#Y÷(†a4j£Ãus)F—gs/àFƒgF«-õ¼R#ÿ'gÌZM E„ ÑP­Réå]ž…KïG2Þ œ¡Âü®†(ÆÃŸFmÐjKCaVS¦Vé‰(*èf·w!™(;Ýs…|ʹ4 {._;ñîG/E¢þ®ŽcF}¦Ç’ Õ¾žO¶™ ýj~éJ.‡Àÿ˜½Åb ƒ>ŸçyŽãˆˆçùX,&Í+•Êýû÷kµÚsçÎ9Žl•Ýnáˆß¨¯Vp|8„A_¾qû,Ër­ÍêîQ« )GÜ\Ö3Ý2#©ƒ©¢” "–Í~y×=Ša8bQŒ§ì_u $‰ 3‹dm" ža8†a[š´4HÝβ]=y`ïg:ô[÷¬Ë3·hf_5?m…¹\uB.µÊ@Dv甩f·ü:rçrl:‰Äê0òþ”sl±¼´¡Í|¨´Ääñ.å²|“R©>°÷3:Méय़8\Ó9¶;@ž™=˲z½žˆ’NŸ>íñxˆ¨··W§Ó>}ÚïßÄgò‰øy¥F©TG£H4`ÐW%G”;ÛŽ67ì¿äpÏ$B‰¡vWë©ÇJ´-¦ÅâÑ÷Ï|wkc˜_¼²´2’ºÅpQ0ä~÷ôKµUí•åÍ–ÆþŽÖ#C×Þ\XλÂü‚.¶Œc¹™…K¦^ƒ¾*ñ'±¼+¼Í*Ë›Û̇ÊJëÝž…Á‹?ÎqŸ=]Oèµå{Űgßv<3{I’“oëëëM&Óàà`  ¢ªªªªªªk×®mÏ´žˆ"Q¿J¥WpʨŒFƒåe KWå¢úÚÝ ËÃWÇÞ’ßæ>¶ZD’” IJmºð0≘< .ãX%¥>…7}0"I’<õœˆ´š½®Âîœ"IbáÔI2©D1±hY´0 ÛÝq¼g÷£×tTåQ!Ã0ù]`ÈYYÖ¤Pª‚!W(ì©(kÌq*κ®ZvfS)8þ@ßgJŒµ.÷ÜÇ^uºçr<°ªÂRUa{i=À](Ïyö’$9S„ÃayK<'¢êêjAfg×Ïù¶ƒpįPðB,"ЉˆP(TÉy,«ˆÇnÞÚXQÚxûÓ$)ñU–7%·”—6¬ÚG£6ìn¨ªÂœc¡°§¬´>™­V”5J’ç´`Q8ê×ë*ä׿Æ}}ÝŸ$)rÕT¶&?\[ÕþÄÀ7ÊJLDÔÙv´¥éÞç"ÚS ÃÊ åQa.Wc] K£)Q«ô¡°7òT”6ƒ¹þ°6Â,ŠxB°;§NŸû·3I뉨¦²5 Ï.\N·CmUûƒóž]ÇŠ&l/›2 m4A¨­­MÝèp8b±í2"*H’äÉßò¿ÉÇT9]³õ½±x$ñ•ëÊJë l«ÄP£Õ–ðzmY]M‡$ŠòrŠÌ.^îh=roï36ǤAWQQÖ´j‡–¦ýM {ëk»N¾ÿ¹„1»pùÞ=ŸÚ¿÷ÓK¶ƒ¾²©aïÂÒÕDnÖç—®´[w¶=(ÄÂu=6û8MÍžíÙýؽŸY´ð¼ÖÒØïñ.ÉËí‹b¢£õˆFSâñ-«y½¹qŸ?à¤dÕ­0ëÕXW èR(øpÄ'Љ`Ø]]Õ¸1É>뇲n„·ÓøÔGye4TG£ÁÚêöÔ×lìÆòùMõ½:]¹NW>f=‹ç& Ø&6%³W(:nÏž=©“Sð·I’"B0"èÆb—É'w^=ÙÝyÜÒto"[²ŽYOíëùd!m5šzë{å×U•-U•-ñx4kf?5{ŽWjêºÊK–ãSõõÜ2lìpÏšjwÛì9†awN]ºúº¥©wûC‚š™;?2ùAŽÇNN¬T¨ëkïafÉ>&¯4¿t•ˆ,ý]»âñ¨Í>>:ù|ÿôøÔ)QŒ××u5Ôu BÈéž™x/uÙÓV˜õj¬+B(rQ0ä¡”…q²~(ëF¸ý)*­¶,ù.ÙGg_ñÜÈì—VFKŒµN÷,Òz€‡ÑrZ}¶Vmõ®¾î§?8ó=pÛ-4ÛÙ«¯¾š®èäÉ“·3(®ä°©$Iòëü׳‡Mu ï¹¾î§“o«ÊÍb"Šl£çøÀ¶² ¿@.lö‰®]wwwû–ÊŒu ¦îé¹ówЊp›!³ß¦fæ/°,×Tß[_w „&§ÏäwK%Ü%Ùo_S³g§fÏnupgÀ<{€™=ÀN€Ì`'@f° ³Ø 8^¥*° ­V;00ÐÖÖ699™ÜXWW×ÛÛÛÙÙÙÔÔ¤ÓéÜn·(Š6T\=ô5ʰâ´V”5=xè7C!w è,¤`zþùçÓY­ÖÛ l¶"ŒÙ›Íf†aR·”——ïÙ³'‹ŒŒ,..Ö××÷ööÞPq±LòÜ%–夂‹¶P¡ëÙó<ßÐÐ I·¤¸ ÑhôìÙ³òvQÛÚÚ”Je,¶¡*I¢$‰ò‹ä¿…l¡BÇì›››Y–µÙl©­Vëàà`2Ý÷ûýD¤V« l«¸DI%‘ˆäiBRÊd¡üжPAcöÇ555Ùl¶`0˜º=¤¾­ªªJ$¡P¨¶ŠnÕè»(% ,ØBÙ766*•Êt÷ß(•J£ÑØÕÕÕÐÐ066–Hl¯$XÅÙ¹œ©Kl!Fo0æy$Ã=z4 ¶···´´œ8q"u‡½{÷ÖÖÖÑÐÐÐÂÂB‚€ zõÕWÓuùKŸÏ·°°páÂ…¹¹¹{î¹g»ÝA °“ä™Ù³,«×ëu:ÝÀÀÀÀÀ€¼¤ýÀÀ@IIÉÚ­V+˲555…… iå9G’¤ÁÁÁäÛúúz“É488†ihhðx<òb—Dljˆe‹ðT,XWþ™½ÓéL¾-//OÝÒÞÞîr¹.^¼(¿­¬¬¤5Ka@ú ÚuÍÌÌ´··÷ööºÝn•Je±Xü~¿ÃáØŒ¶€6)³ŸœœL$ µµµ‚ Øl¶‘‘,ý°yŠ“Ù§n™žžžžž.JåîjØ ÙìÈìvdö;2{€™=ÀN€Ì`'@f° ³Ø Šð Z­V{äÈ":qâDîEPDE³7›Í Ãl´ЍÐÌžçù††I’6TÅUhfßÜÜ̲¬ÍfÛPWA™=ÇqMMM6›- æ^EWPfßØØ¨T*­V놊 èòÏì†1›ÍN§Óëõæ^›!ÿÌÞd2©Õê©©© ÀfÈ?³·X,Á`Ðçóñ<Ïqñ_º"ÇSX´°¾<3{I’“oëëëM&Óàà` ÈPTh°Fþ™½ÓéL¾-//OÝ’¡6C¡Oª€í™=ÀNçlœUÆÇÇÇÇÇ7ZÅ‚1{€™=ÀN€Ì`'@f° ³Ø ÙìÈìvdö;2{€€ãUª«Ðjµmmm“““ò–ýû÷÷öö¶¥0™L333G[LµO}Ó•F—'ùªæšÇ/ê˜M„¼[Ô–©{æÿä4Æèò„ªÚ\ýÈWWÜç "µiWõ#_1ì>’ú_ÔfM„ý·;D†5=ûÇ$I‚cvm¡B_Vóä×HLÎùÛÑ4tUÿmùL]™*°B¢,Á¯«¤ï‰ŠÃÏËah-} ]YÌ9'‰‰¼Ûªyü÷•ƪÈÒü@h¾ª¹êØ—Y¥:jŸÎõ˜ôW>]ŸØyžþùtEV«õvF›MQxf³™aI’R7ƒÁññ›9D</¼!Ø< Ã]%I ËÑ­Ÿ¦÷òI1ìK¾\·3¶\H×Ã.BU‚sÎ}æ5"*½÷׊P]D!â½ð beI®ý ²´ÆñÎw·6¤­¥4T²J•²´¶(µeîów¢B3{žç¤5ÿ§(Âòòr•Ãm#I"Iâõ7þMŠ®LÅ}ö­‰,Gâ:aç'ö‡Fˆ¨´ÿ…×V)—# Ï_‹Ü¥ýOñ•M¹úï<Á©óñ€+æ±¥¶Ì}àNTè<ûææf–em¶âü-l1!'Ç·ü{縞–å2YåÎY!"eIõV²¥$)º2% ¡âÔv‡÷y€µ ³ç8®©©Éf³ƒÁt;$Û.Ù2öÓ·$"]K¿®¥_ÞXyäó‰pÀöúßf:’a ¨:º2).DlVÿ•·‘€\¨µôé,} }E"ŒÚ¬¾+¿’âQ"ªyü÷£+Sžóÿ%寧i­¸ÿ³Žw¾+¸ˆ¨òè—¤DÜ?zª´ïI–ׄç®x/ÿRž 5ïÕµíWèÊÄh(²<é»ò¶\aj[¢Ž:f|Co‰Ñ›é޶y±÷¸`ŸvþqŽ×D’Dy÷sÊr2„±îyqcÍã¿YžäËëc^[hêBIß‚cÖuúGò)ëwݧ5ïå´FQˆD–Æ|CoKñ(£àë>ùM¹ZC׃†®‰È?üž䃛¡Èa¯vÍøyågÝ3´•Sð9q"b8…ÂPQýÈW܃ÿž»zý,|íÓßð¼œÌÚ–ÖÒgè|€Q¨¢+VïÅ7’ŸWæÞ÷;tíŽ_uTZ™¿)é;vº¯ƒ¦¡«ìÀ3ò>ñ3¾¡·’MÝŒ°í ËkÇŒç≠'ë•ϯÏlgeöJ¥ÒjµVW¯JÔét¤žhü IDATGÕh4ñxÜf³ oŸ?<3s-”ì{*æZM_T« »ø¯½s/e>ÐÐù€¡óHÐz.8~†Õô­ûùÒÚ•·þ™$Q×zoÉžG#ËAë…¡\׺_a¨p¾ÿr.ñ0œBß~È{éM¾Ü$ߟYžÐ6ï)Ý÷ddq,8qVa(×µôsZ£ëÃ#"¹­ðüµ õ¼BWªkݯ4VÙß~)Y¡¦±‹UªÔ¦V©c‘œ.Š˜g&Üòï ¬RÍòÚë;ÆÂrž5Œµç“§ôHR`ì#c÷ÃR"î¿ö^Iï#ªê–¨mÒÐyÄÐu$4;$ŒÎrZ£¾ý BWêüà)sŸy¦ìÀ§ÂóÑ…"ŠÝ:;HZoØ5Ãç•Ó5Y#]„ÚÊ%ø\ð D÷;ã~gÜïR×íJföêšV†e#‹cYÛâËë9]™ä¥±Z×ÚÏ0¬ëôèÆG™®÷ªª-Däþø§Jc•±çÓ÷¤|TÆ •öÊgèØ²u¿™o~PÕ´‘{ð§ }¹±{ üÐsö·þ)û•ÏØçîDùgö ØÍf§Óéõz×fö<Ï;ÎÑÑQ­VÛÞÞ.IÒ•+W µhb¾•˜o¥dïcñ ;¼0 aQÔ1+س¬Þ£iè /Žx/ß ŽYe§Ö%Â~]K¿à\p}øïr‘ {Ž) •qöÕ6”e¦•7ÿ1ò öi¾¢‘QðD¤ßuHpÌ%S¨DØ_Ò{œÓ•&‚]KdiÂýñOä¢xÀUÚÿ´²´6æ¹~cCÐzžÓ”DíÓ¹¦õDËÿõÿ^¿8Þ•Å×þçªÒÊ£_L¾^ùå·ã~'e cÝó"¢ÈÒXdiÜØýptÅš¾XÒûˆB_µM*Jª‚ƒÞË¿¼~ cÑ’ÞãœÆ˜û #İeDqŸCžz¾Š® ;Ãç•ãeY%C„ÚÊ|Z ±¼–Fi¬*é{" DW¦‰(²4ªµô3,'6«ëÚãA|#Dæ¶ï¼ù‡¤kég•*1ÍÜ{¥DLþÅIp̲j¡ã~ù¨ g¸:¶¼eÝn“ùæ)MFHD¥ûžT–Ôļ¶ÌW#sŸ¸åŸÙ›L&µZ._ÅbçÎE‘ˆ EKKËèèh,Ë»¹í  (Kk9µ^žW 8æÇÃpº²ðü‡É=#6«±ç˜ÂPžKfŸ¸ä7%1áüà_å úrÿüprŸðì•DÈ#Å¢r[‘ÅÑä º< ©Ð—%SêÈâhdq´8çLDDžó¿H. šù䳆±ö¼8m ‘$^_‡D’ä Ë‘<(KD §`8¥ñ«Ö'R–åÙ´ŸW¾2DXô¶ˆˆSëkŸþºü:p»>üw)#¢Èâ¨~×}|estÅJ £ªm Í\Ê¥BÁ9—™ŽÚgt­÷rÚRÑ·’¹÷¦þ–s/ÃpÚRÑ›éÖš ß”´;yìÚ¯CÖóòܼY_pΧ+eŒ`GÊ?³·X,Á`Ðçóñ<Ïqñ<‹Å$IbF¼15bee¥¥¥¥¤¤Äḳ—‹ö^x½âªûÝèÊ´à˜ Ï]•†å–•Ä›+{Jqˆ’£Ô™%¢«ïR`XŽ&uñrQEÇHÎ)YVßqXßqø–cXŽ6àZXµ6Ž|Ê™ÃX{^™1,§ï¸_ÛÜËi772L>QúÏ+o",z[D$FÃîÁŸ’$ÆCÞä6 ®ÅD$ 6µGW¬|E#Ë«#Kc¹T(OÖO}ÍpЬ½7µʯ.Ëÿndø¦¤ëØIí6D·Ü9}ý¼Ê WpçË3³gYV¯×ÑÀÀ@rãÀÀÀéÓ§=O$rË$AˆH¡(ÂÚùEÁp †U1 ñJ5ËñDÄr<£P%ïä[W<àZyóÕõªj‹®ý ¡{À{îç¡Ù¡BÚøBÚ¡éKá”OÊkêvᲄ±Áó2ö×µö­ç£+V)S–Õïy¨ðŠþyeˆp3ú†$&Ò='+²8®®m÷Ò uÝ.1*üù\ÅUÐÕÀºòùÊ3Û–$ipp0ù¶¾¾Þd2 "joo…B r©J¥"¢í3ÇÐuT^GkÙ«µì•7–~.ûÚ8D’˜Ï] Ï]eX¶dï%ýOGlVQI¢È°7/¦<Þ)}Jb²4¦Ð—ëÚDí³ò ˆ¡Ù¡²ý¿Vyä…ÐÜU¥±:§Ìž(0~¦´ÿ©²ÏD–'ú }Û¨mJÎWã§KûŸ®xàóṫ¬Z«o; ¸Rƒ×µìS*† ÿÕw  Ía–06*jŸÒšûD!œyùòz¾¢qա鈮#‰îQkÍ{# ÙîNÿye ,«SèʈˆXV¡¯Ð4tIbB¾#9S„ÙÚÚpðI¢]žÔ4vI‰øÚŸM6ÚV†Þ›§ôW#CÇΠÇBDR"&¿úr]ëþ˜×žzûlq¯<Àv¶)™½Ûí¾xñbKKËîÝ»A·Z­›ÑÐmæ~WJÄ5ͽZó1Œ®Lû®¼%O„Nž%IÒZúJö<*Fƒá™K¾+oËG…ç®rÚR]kIÏñðâˆoøÝòCŸÎÚVhæ1Œ¾í€ÚÔ)Å…ðüUßÐÛ7Š.‘®í`ÉžG¥x4²8ê»úNê|Œðü5e™IØÈª—yÈÆFy/¼QÒ÷„¾ý”ˆ…ç‡}Ãï”úLê±S ¯Ò6÷Ä®ù.ŸÌ\a†Ï+­y¯ÎÒ'¿V×µ©ëÚÄXtyq4s„YÛÚhðYE–F5]Q›5õ¾ØüÚÊÐ{ó“ájdèØdøPˆHpÎ îECç,¯ìÓžÓ¥dE¿òÛ£7³ïµÕ>õµðˆ÷â ¾ª¹òÈçᅵu={€íCYRSuì¿yÎþ¬÷pßÉV=ãÖzõÕWÓ<‰¿uî`Ò1DI’ä×Ûe½šÛÏsîòBéqŸÝ}æµøV¬-7UmIRdyb«€íâîÍì“ëcˆÑÐÆž ° ¨M»ç¼(„·:Ø.ò\¶«Òñeu9>  îwï˜=ÀKŒ_ûŸ[Ŷ`{ãï·:€ícö;2{€™=ÀN€Ì`'@f¿“i›÷˜žý…¾|CEÛº(ÀFq¼JU`Z­v`` ­­mrrr8®¤¤$‰ØJÑÕ>õ5NW]žä«škÿ½¨c6òf>¤æñßW«"Kãë3¬éÙ?&I³(ÚL†®£$‰þ‘6TTiN9Ã5Ìry7“ª¦µæ±¯FmÖDØ_²÷±²þ§ãgÒíÌW5Wû2«TGíÓ¹T˜KjSGåC¿I’$¸æsŠ8ßΖ6ø-ê¢¬í¢ Ë•ö=Yºïiý®ƒÄ)ÇÜ„µý.@VÏ?ÿ|º"«Õz;#€ÍV„1{³ÙÌ0ÌÚí ÃX,–‡~xÿþýëQðªjKxqtCE•ÒPÉ*UÊÒÚbÖi¬f•*eiMë\¿¡M~3¬ÛEµ–}Zóž õ\dyÒØuTUmޢ趩B׳çy¾¡¡A’¤UÛ†éëë«®®ž›››œœ\»l6umÃq‘õÒ÷ EUpê|<àŠylE¬30ö¡àZˆ¹ŠXçº6#øÍ°nUU[bîeÿµ÷ˆaY•ŽUé¶*<€í©Ð̾¹¹™eÙåååšš[†ÛÛÛ«««‡††6=Yu©M‰7æYÞPd'IÑ•©"W)&¢+·å7ñM~3¬ÛEY^- !""It}øo[À6VPfÏq\SS“Íf ƒ©ÛÕjµÅbYXXØži½±ç˜¾ý éZúu-ýòÆÊ#ŸO„¶×ÿ6ëáZKŸ¡óF¡Š®X½ß£!FÁ×}ò›r©¡ëAC׃Dä~Ï?òA†""ªyü÷£+Sq¿C×vå5‚cÆsñDÐCDÄ0†ŽÔ ]™"6«ÿÊÛ‰HàfÍ{Œ½Çû´ëô×ɰœº¶58}1Ç"­¥OgéSè+D!uÌø†Þ£!¹H¿ë>­y/§5ŠB$²4æz[ŠG¯_´£_’qÿè©Ò¾'Y^ž»â½üK†Sf8åt×ðf‘¹ÏÐy?«Ò ŽÙ›W#%ÂD4µY}W~%‡!_CÏùÿ’wSÕ´VÜÿYÇ;ß\ 7/oûA†ãoi‹aÝÚ¦†ã £‘¥±u?k†SV>ô›,¯¶¿õ/¢Ò4t•xF. ŒŸñ ½•zYs©p-]ë½%{•_§.x/¼¾öCI=å¼;[ºà3•™Ö¼W×¶_¡+£¡Èò¤ïÊ;±n𜶤æñß‹,Oòåõ1¯-4u¡¤ï Á1ë:ý#JùYome•jbXbXb9–×I¢‹¬jkmï]·‹rcæ0Öíóy_¨t_s…¡¢ú‘¯¸ÿ#ý ÿÈû‘SY/>ÀZeöJ¥ÒjµVWW§n¯¯¯gfrr’ã8Q·ÛTœðÌP̵P²ï©˜k!4}Qa¬2ì>â¿ö~̽”õX¾¼žÓ•ùG>P«u­ý úNÿHJÄÜg^#†);ð©ðüpda„ˆb>;e(’©jZˆÈ=øS…¾ÜØ=P~è9û[ÿDD†Î G‚ÖsÁñ3¬Æ oÝÏ—Ö®¼õÏ$‰òšÆ.V©R›:X¥:™âܬ¶º…Qð‘…uæÛ¬-’“Ëðüµ õ¼BWªkݯ4VÙß~‰ˆ G ]GB³CÂè,§5êÛ*t¥Î^IËp }û!ï¥7ùr“a÷‘¨Í±Mf>åu¯á-E£§úr]ëþäÕ#Œ,O­†r]ë~…¡ÂùþËY?/Uµ…ˆÜÿTi¬2öcúž”ÛÒ·Ô·ˆ,ODÇ•¥Õr–¶Vé¾'†rǻߗ‡ŠçœûÌkDTzﯭÚ3Ç ×Š.Oº#¯Qɾ§R·§;å¼;[ºà³vÑt´Í{J÷=Y NœUÊu-ýœÖ(¥gù¼$)0ö‘±ûa)÷_{¯¤÷UuKÔvóþûµ]´êØ—9­Q~]ûô׉(ô¬œøÊØ{ek»èõ³KFº>Ÿ÷…¢4_ó¸ß÷»Ôu»’™½º¦•aÙÈb®¬’fÏ0ŒÙlv:^¯wUf_^^žH$öíÛ§×ëEQ\^^¾víZ,+8ÚâˆùVb¾•’½ÅƒîðÂ/„ DQǬ`ŸÉz,£à7ÓkI×ÒÏ*Ub,^!†-#Šûá…‘›HRÚ"¹<•Ç›å¥6J÷=©,©‰ymš†®ðâˆ÷Ò y7Á1«³ìãÔºäZ+AëyNSµO¯Më‰H]ß!Fƒë.´²¶H×ÒYšpüùm<à*íZYZó,+Jª‚ƒÞË¿”‹ÄX´¤÷8§1&Â>y‹²Ì´òæ?&B^Á>ÍW42 >ë)§»†DÄpJç/Ëã¦b$`ì9&_ ]K¿à\p}øï×ÈŒ=džʸߑ惺qy±äåeÕ:CÇýr[ZK_j…ÆÞãJcÕªcu­û5÷x.¼s/Ê[a¿|:¥ýŸXµs.®+tǃn"*ÙûØ-­§?åü:[Úà³}^éèwsÉ¿ÊaIïqNWšzÒ/%bDY‹,»Ž®XCÓKzQèËS3ûµ]Ô=øS†S{S"á»ú+"’«¢Œ½WÞ²N%ÊF†>Ÿß…¢ô_óÈÒ¨ÖÒϰœ$&ˆH]×zâ¹ýµ°Vþkã˜L&µZ=5µÎœ]FÃq\ ¸pá‚Õj­­­Ý»woAn#‚s.9jµÏÃpÚÒ‚*L™I,8爈ӕQ"P–Örjýõ"Çœ{ð?R—PŒ,Ž®üòy/¾±N¥ £®m/ŽÑÚ_KÖ1 §+‹ûVX^+ÿ'C*ôeDä>óšœâ0œ‚å5bÄOD쨈(pÉ«…JbÂùÁ¿†ç‡³Ÿrúk(¸æ“ElÖëWƒa8]Yêìp¹HaȾÒyêï01÷òõ¶F¡-I­pí †|Eƒ±çXhúRhêBÖVr©pc 8åÛ„aúòÔ¥3óW\§$Å¢Ùƒ—Ä럲$É/–K­ymïœóÑ•))…Pte*º2%8çå3ô^YÚ.š&Œ¬}>龿‘ÅQVÉó•Íò¹¨jÛp_;"ÿ1{‹Å }>ÏóÇÏó±XL’$žç=ÏÅ‹‰Èf³ÅãñÎÎN­V …²ÕºÝI‰øª× WØ]Èbbu… %y/¼^ñÀ ÕýnteZp̄箦N²ÏLUÙĪ4ëOÅYSİòúŽÃúŽÃ·ìÊrr©¾ã~msor.¥®ašˆÞr‹E.2\Ã[Šâ1 ¥¡$®-â³·•zyÅ„ÜÃrÄ0·T˜H¤ÅpʲƒÏJ‰xò7“̲V¸Q…œòíqã”ož¦(„äi$ §($ø ½wÝ02ô^ÙF»hÖ>Ÿ4_sÁµ˜ˆÔ¦ö芕¯hdyuîwh¬•gVʲ¬^¯'¢äÆÓ§O{½^…Bát:“Ûétºm’Ù3œ‚aD Ãp¬RÍr<±Ï(TÉûÿ¶\<àZyóÕõªj‹®ý ¡{À{îç¡Ù¡\ŽU›:ÅXTpLç^š¾´j¸]û4ö×µö­ç£+V)S–Õïyè–#·ÙMEÁ(x–F¡Ô6ï ZÏmu8w— ½7t½÷º vÑì}¾¨"‹ãêÚv/P×í£¡ë¿Eä%ÏÌ^’¤ÁÁÁäÛúúz“É488$IJ$ò(¾LîÚ>«2t•ׯÑZöj-×§ •~.ǵqÒ’D’ˆnœ&§+Uª"Ë㙋R‡üY…Šˆ¤xìF}‰ðÜÕðÜU†eKö>QÒÿtÄfs€T›vE—Æ%QÌ¥H$I¢^w1DMSwhv(9çg?Pd¸é¥Ö/ñJñ˜$&$QdصEIbü–£rˆP>å[*\u”D®Ó?ÖZö»"ËYNœ½Â Ê|Êòyt¶ÌMn訧|ókÎò¾¼ApΉñh–à3ÊÐ{Ó…‘®÷æ'KŸ/¸c¯úšG–Fu-}ÊÒZu]{di|Gþ© ·Mžóì%Ir¦‡Ãò–x+/Œš*Ûÿkò5T«sÊì‰BSŒÝË*U|µyí>b4è½ü˲{?©mî Í\&"eYBWFDIJ }…¦¡Kò-Y+L÷y¥“ᔯŸÂ;[†à³V¸nðñ3¥ýO•x&²<¡ÐWèÛDmSrš.xN[’ù¬3ôÞt2ôÞüdíó½P”ákN$‰btyRÓØ%%âwÄCÄ`;Û”ÌÞívŸ={¶½½½££#‹MMMMNNf?ìÎ;Åð*ms/1LxášïòɬE‚s^p/:`y­`Ÿöܘà~WJÄ5ͽZó1Œ®Lû®¼•úK}xþš²Ì$¬YõRmêˆÚ¬É5s)’ÓV]ÛÁ’=JñhdqÔwõ¹-ï…7JúžÐ·’±ðü°oøòCŸ)üj¤sýjì^}5‚“gI’´–¾’=ŠÑ`xæ’ïÊÛׯÃÜUN[ªkí/é9^ñ ¿[~èÓÙc?ê´Ú¦^UUSxqÔ?üÞºG…g¯h껌=Ç£6k"К÷ê,}r‘º®M]×&Ƣˋ£¹T˜îóJ'Ã)_?… v¶ Ág­pÝàC3—ˆaômÔ¦N).„ç¯ú†ÞÎ1øt2ôÞt2ôÞüdíó½P”þk.‹,j»¢6kêäy`ôcö½v¢Ú§¾^ñ^<ÁW5Wù¼ãý—sYϾ¸V=?µp cUõñßvŸýÏðì•Ü‹`KpÃ)ãësTjŸþFxv(¹Œú]h§vѬ_seIMÕ±ÿæ9û³o‘بW_}5]ÑÉ“ÙÇ\`ÛJ> V’$ùuþëÙßé<ç~šºHDqŸÝ}æµñt©SÅèÒĆŠ`KèZï­|ø·ä›P9m Ë«åGVݵîÚ.ªªm#IŠ,ßu'E·)³qîÉå,ÄhhC“ÜÎÔ¦]éæ{d(‚-ž¿¦o¿¯ì೑¥q]K¿‹FvJ?ÌÏ]ÛEÕ¦]‚s^¶ËHpçº{3ûÉþö¿äQ["æYvüša÷ƒ%{û®^Íýad;ÒÝÙEY•Ž/«ó ½µÕÀNp÷γ¸`ž=ÀN…yö;2{€™=ÀN€Ì¾8ør“²´v«£€»2ûâеî¯|è7u­÷nu p—*ª—Z­öÈ‘#DtâÄ yËÑ£G5ͪÝNŸ>íñx o®XŠû ZϹŸcÑ’=Jb"4u¡ˆq䢙½Ùlf&¹ì s—|[[[[[[+Bámm[’(z/¾Á*U%{sq¿c«#€»K¡™=Ïó ©i=ÙíöÔ·f³Ùï÷‡B¡ÛÚþ¼ßPU›Kz;Oýp«c€»K¡óì›››Y–µÙlévP«Õ¥¥¥KKK6tGcÑÀÄ ªº…Óàù_p[4fÏq\SS“Íf ƒéö©««#¢åååB*.cÏ1}ûA"ÒµôëZúå•G>Ÿl¯ÿmÖõÍ{Œ½Çû´ëô×–†ç‡÷<¤ªmÅl{¸ ³ollT*•V«5Ã>uuu>Ÿo[MÅ Ï ¹Ï¼&Æ¢Q›Õ}æ5ÿµ÷‰Èí}ï…_är¸¦±‹UªÔ¦V©^[šzÄh˜/­+rÐåŸÙ3 c6›N§×ëM·V«5Ûm*NÌ·^!1ºÃ #QÇ,E³‘å‰\ZÏÇý® õ¼‹¬»C<èæ´˜·Uþ³qL&“Z­¾råJ†}jkki›MÅ)\dq4²8ša)e”ªÛ2fo±X‚Á Ïçãy^^ã’çy†aR÷©««óx<áp¸Ð0ï( §ñ­Žî.yŽÙ³,«×ë‰h`` ¹q`` õqT:Î`0\»v­ð(‹‹á « b†c•j–㉈åxF¡’âÑÂëgÕú˜gGýLÛ_ž™½$IƒƒƒÉ·õõõ&“ipp0$7nÃUqd†®£òÚ8ZË^­e¯¼±üðs9®“£àº²ÐÌåB£؈ü3{§Ó™|[^^¾j ÕÕÕ¹Ýîh´£àŲž,O”ü´à˜ L*KjJz{/ŸŒ¹r9\mê0ÞóPÔ>ã½øÆ:¥µmÄàœ-vÔ™ú¤ªt ƒN§Ûn«âÈâA·`Ÿ!)‘ˆøûLÌk#¢˜×&ä–ÙëZö) º–}ë®z©ké=‚c®ÈAd´Y™}mm­$IÛpáðfØ IDAT*NáÂó×ÄX4²8ºvÕKms/_Ùù`K€»YAÏ MϼeÇM_ M_\»]UÕ\Ò÷Ddy“ìàö+Nf'òœûE"ì#¢¸Ïî>óZÜg/¤6]K¿±÷‘˜{ÑýñkE `îÞÌ>²|ý'1 /ŒXÃ)ƒû‡ß•ÄDÁ¡lØÝ›ÙW`üôV‡wµÍºƒn'dö;2{€™=ÀN€Ì`'@f°aÕK­V{äÈ":qâDr£Éd²X,Z­V›Í666&ŠbámÀºŠÙ›Íf†a$IJn)++ëííu8³³³:®¹¹™ã¸«W¯Þ¬«ÐÌžçù†††Ô´žˆêëëA8w]¡PÔÖÖ"³Ø<…γonnfYÖf³¥nT*•Ñh4™î‡B!¥RÉ0Lm@:eöÇ555Ùl¶`0˜ºÝãñ ƒÁ@D ÃÔÕÕy½ÞUãúPDeöJ¥Òjµ®Ú>;; ÷íÛg4÷ìÙ£×ëGFF i2Ë?³gÆl6;N¯×»ª(‘H J’tøðáššš .¸ÝîÂâ€LòÏìM&“Z­žššZ·´²²R£Ñ†aL&Ëbá|€M”Âm±X‚Á Ïçãyžã8"ây^¾M¶¢¢¢»»{nnîÔ©SçΫ©©éìì,ZȰFž«^²,«×ë‰h`` ¹q``àôéÓ§³³Óãñ\»vM’$»Ý>66ÖÑÑ1== …Š5Ü*ÏÌ^’¤ÁÁÁäÛúúz“É488(O¿1 ÉÅpìv{GG‡ÑhDf°IòÏìNgòmyyyêAä%/eòëh4Z@œI¡Ï ]×ììl[[[oo¯ËåR«ÕÍÍÍ~¿ßãñlF[@›”ÙOLL$‰†††ÚÚÚX,f·ÛGFFð¤*€ÍSœÌ~|||||M€Û©ÐÌžçù†††Uãñf³Ùï÷Ÿ;w.¹½¹¹yrr2‹Ø\qu4”Ì9‚¿8;DzŒ^£4h”[Ñj'Ož\ZZšžžÞê@ŠìÀ®êæ*ý·ßI¦õDÔÛõxU¹yxô-•Joiº7uÿæú½^ßÒÙK?‘ßF…PgÛƒ:mY0äÎPDDÑ«ï[wÕ—|ê>óÿúŵÛu~[ Ð;h›››Y–µÙn™ê Óéìv{2­_ZZb¦¤¤¤À¶ŠN£R#1"EéÛ¯_;7áØêˆVEqhhÈï÷ou Ev_gõ¼#xuƺqdâ½Sƒ?˜Y¸´v­¶ÌîšI¾u¸¦‰H§-Ï\$ ‰w‡–:JËôªâžÀ¶RИ=ÇqMMM6›- &7²,Ëq\<On‰D"D¤Tn£q­JÁ0 Ç2ËêÔJ"’$)½óý]5‡w×T—hüáØÈ¼ç?ÏÌ$'‚ý׺c ñÍóóŸ}°U¯VŽÛ_ûp*à …â¯þꯂÁàŸýÙŸÉê<õÔS_øÂ¾õ­oMLLdˆððáÃð ¿þùÏþƒü Yô÷ÿ÷CCCóóóO?ý´Z­¾téÒK/½äóù²žõŸÿùŸÇb±×^{íw~çw Ãûï¿ÿÝï~W’$†a>ñ‰O TTTƒÁ³gϾüòËáp8s[ǽð >ø B¡øøãÏ;÷o|ã[ßúÖøø8?~üرc&“Éï÷ÿà?HF¨U)Zj ÿqfvUx¡°gݰYVÁ²œ˜¸Ù£J µD¤TðŠRk8?éüĦ®¦ÒU³íuV?sÈ<¾èý—7G³^=€m® 1ûÆÆF¥RiµZS7J’$IËÞ¬Y~Í0L!m×}º÷/~ã^sµ~W½ñ/~ãÞ¿ø{¿ùl¯\ô`wíg´øB±Ÿ|4}iÊy¨£úËv¦«äØc{ê|jêÝ¡¥£Ýµ]eŠÇãßùÎwÚÛÛzè!"*--ýÌg>óöÛogNë‰hddäÅ_|ñÅ×ÂÔÓÓÓÐÐðw÷w¯¼òJ__ßoÿöoçxâJ¥ò“Ÿüäw¾ó×_ýñÇß»w/=û쳟ûÜçÆÆÆ^z饓'OÞÿýßøÆ7²¶õÔSO=õÔS?øÁ¢ÑèsÏ=—<ä±Çûò—¿¼¼¼üÝï~÷ƒ>8pàÀÿñ';€¼å´-Ÿ"†ÝÝv´g÷£*rú"H¼±R¿jû¾ÖJ­ŠÛc)ת°HÜñòOh†1›ÍN§ÓëõVWW'·K’‡SçÞlÃy8ß{{\ɱŸ:lŽ'¤Ÿ™!"!.ÊEtÕZ—ýß~ýúœl_(ö©ûškÊ4Éû/›«õÿ÷/¸üÑñE_KA¥ä2·544túôé^xappð‹_üb<ÿá˜5B—ËuæÌ"úÝßýݵ¥ÑhôÛßþ6 —––>óÌ3Z­6 e­¶­­íë_ÿºÝnîììT«ÕDÔÔÔôúë¯ï{ß“÷ …B_úÒ—***œNg†¶Ž?>66ö—ù—òQ_úÒ—å×>úèùóçÿæo®/n³´´ôÕ¯~Õb±Èʳb¾HÖhWᕚ¾î§ËKfæÎ77î˱HæðFJõüª§†—Ëôª±oòç€;Wþcö&“I­VOMM­-Z\\¬ªª²X,jµº²²r×®]D¸)¬ËþÑoDH#±Ñïè‚wÊæ'"†¡ªuê 9#s"ª)Ñ$·Ø½—?JDñ„øÿý|øüdöÙùßûÞ÷”Jå7¿ùÍûï¿ÿ•W^)|Þ|êï$V«•eÙªªª\\ZZ²ÛíD‹Åþûÿï}ô½øâ‹rZÏó¼Á`p»ÝDTVV–¡-†a*++‡††’E×®]ÿ[ˆa˜ÚÚÚÙÙYà óóóDTSS#ï æ9"ÚèöFCõýû¿ ×U~|ñGSsçs,JŠÄ~õß±—¦\ÿãß.¼úuÝCî,ùÙ[,–`0èóùxžç8ŽˆxžÅb’$Y­VFÓÑÑÑÑÑAD‹‹‹&“©h!o&Ër,»1~ODÑx‚ˆRæ}á ¯ðãr¹~üãþ󟟘˜øÕ¯~Uxœ©·1ÈÓux~õ€ôº¼Þu–õT*•Ï<óÌÑ£G++o>69yfݶ ˲‚psyÊäk…BÁqÜ3Ï<óÌ3Ϥ¶¢P\ïlòåUrl4¶ä¾¶z—Ïg;å?ÿFm̱èæ9rlêÇ °óä™Ù³,«×ë‰h`` ¹q``àôéÓG^ÑettTž¶ÁqÜ’Ùç"¿Gnɉò–?®kݾð…/<öØco¾ùæÐÐP$iiiùÜç>W`C¿úÕ¯>üðÃÔ-sssò‹@$FDF­R~‘£‡õ•Ÿ‰â: d(J2h•óŽ`†îtyfö’$ &ßÖ××›L¦ÁÁÁ@ @DZ­6‘HD£QyW§ÓQ"±±Ù[".Š QR*nNR’Gë74º¼Vyyù³Ï>;::ÚÑÑñðÿýöÛ…ZTGŽyï½÷^zé%ùm.Ãÿñx\ÅÔ=“¯å"¿ßŸ:W'Õ¢3DD •ºEWöˆH㢘ðV’¹»BÁQ,.d(J­A¥ä*êGWrià•ç<{I’œ)Âá°¼Ež¹±oß¾={ö$w.//'"9éßæ$‰ìÞÈ®ú›·üv6”‘Í[ÐãK¿ô¥/Åb±¿þë¿>uêÔç>÷9ƒÁPh ÅÃ0ŒR©L½û¶««+ëQ’$9Žžžžä–Ý»w'‹ûûû“ë#Ú]7¾èK.Œ“‡žžžC‡}ûÛßßÿþ÷_|ñÅ_ÿõ_ÿ§ú§ÌGµ´´ÔÖÖ˲&“éðáÃñxüã?Î;Œt$IºråʱcÇ€ÝnßµkW2ÏìäÉ“/¼ðÂýÑ={¶±±±»»;Yô³Ÿýì«_ýêŸþ韞:uÊh4>ùä“ccccccÉÇíõÔ•éUîÀÿÏÞ7q¥ Ã?Ýjí›mÙ’lË–äÝò ¶1`ÂjaI€!“Cê&“›ùªò¥’ÌÜ;5Ã̽÷ªÉL¦’/o2™7/L¶IR„…5ð‚Á26^ðnË›$K²Ö–º¿?š4ÂYxÁ`ž_¥R­>½<²±ôôéçœö†s®ŽîËYé+ ó6ö¶ˆE‘º„¹fK'ó”ÙM¬EÕÝÛj=å‰A­Šª"„‡+;az<è¦%³gæBÑét™™™$Ivwwgu÷¹3u&š¦fª~R¢s¸É‹M__è·; â™gžinn>uêBhxxxÿþýÛ·o///=¥ýòåËKKK™å¹sçÎ;×årMGfÚ³gÏsÏ=·~ýz×sþ‡óŸ}öÙ+¯¼2î^‡–ÉdK–,ÉÌ̬¬¬Ü¿?; þéÓ§Bk׮ݹs§Ëíª¬¬üôÓOƒKüOM%Õ“‹ô»] gäAgÏ„Pb|®!u™—tu÷Ö]»~fÜ&Fqº2%VöQyËí'ª¹>¤UJ`ÖK̘D:ö\"Ü•ùóç¿ôÒK¿úկؑ²¡§+·-M.¯5<ß>}Q¥ÆÉ_X“ÙØccP›ýû÷ß©éĉ÷2ÀÔb»M™Å¢i곃]»vÙívöqTyyy^¯w` ÜQªä"îºy‰ ÿƒ“;i˜’ò‘,õƺŽÁ‘}ß5NùÁî7Ùƒ ª¬¬Ü¹s§ÓélnnNIIY¶lÙ‘#G¼Þ°êæßÖôô »ç§+ÉÀ´Ì4Ï%ðÓu¦Ã•]þé9>À}ªqÀÄ­[·nåÊ•QQQv»ýÌ™3Ÿþù1·)K²cç$+žo?S×7Ó±àÁ0ñ̾¨¨H¡P¯q¹\gΜa–Äb±×ëjjjòûý“ŠôGpð'éstQMŸ©ëûöR÷LG4šÁ`xå•WNœ8ñÉ'ŸÌt,SL!üÖì.ß{_^ NëU1)9+9ÞñSoÍ`xc†ññ©Ø\¢Pô¹úþ ŠIõÙ3O)b_²¹{BBBVVÖàà`WW—H$Òét"‘¨ªªjR‘>àJ2UóÓ•Ç/uGJøëŠÚûM=¶™êF,ëõú™dŠaÚ¾<Åç§Þ=\ow‘ÌJ‚ÃËL[ª‰Íöû}3[ˆ0½ÿûVó“…ú“½ßêž‘ð™TfïóùúúÆ(Ðjµ6›­ººšÝ,==],;Îɜ‘w 9Tuá8&r¥BîLG4Ú‰'L&S{{ûL2Åæ¥)µ1’÷Ž]cÓz„P®auL”®¾ñ$Ÿ/Ñ'ÎTl¡Ã Úÿ}kZ¼|ãÝÿ9Ò0#à2-#hE"ÑÐÐû’Y‹êá€B>áô!Š¢ß;ÚPÝ24î.÷EQF£ÑápÌt SlA†²{ÈyµÃ¼òZË™s•uô\™©¨Â Ãí œ6š24‘þ½ ¢)AËáp›µË8Žã8¼F.—#„â!­+â†qpŒƒãb!DÓ´Ë{£r©Ä Z˜©RÊ…7y­{øë‹l!øKOd“êÛKÝO-N–¸•̓_üÐöãS„Ç÷Æo¼ýöÛçÎcÖ…ÂÝ»w8pààÁƒ!"\¸pá‹/¾È,:tè£>b›Þyç£ÑØÝݽnÝ:@påÊ•½{÷Úíöqßõÿ÷“$ùÅ_üâ¿J¥ßÿýûï¿OÓ4†aëׯ_¾|¹B¡p:UUUü±Ûí}.‡³uëÖÅ‹QQQQ]]ýòË/ïÚµ‹)+--]±bE\\œÃᨯ¯ÿè£ØE|"I-ýêbç¨ð\îáqßBø‚øË_þât:ÿûß3Ïv^»víÓO?½k×®––f©Tº{÷î}ûö?~ü®Â¸tݼ~^¢!1bTµýü å†ùºæ^Ûÿý¶q ß \“곋ÅK–,Y¹reiiiNN‡Ãµ†aÙÙÙ“9˃î×?ÉýÓÏ uJIZ¼ìO?/üÓÏ _Ý”Ë4-ÎV?õH’ÝE<ß~¥ÍwôµÓ(UUU+W®$‚Í\PPÐßßßÕÕz/‹ÅrñâE„Ð/ùËÛ[½^ï{gª¯¯ˆˆØ°aƒH$r¹\ã¾ñ”””—^zipp°¾¾>##C  „=úÁ0Û¸\®;v( ³Ùâ\¥¥¥MMMþ󟙽vìØ‘À,¯ZµêÒ¥Ko½ucV“Éô /èõúÖÖV„SÄ2d÷Œí$Æ .lݺµ²²rûöí~¿ÿÓO?eš„B!ŽãB¡!Äãñ˜²4·ÛMQT˜²y"$¼Q+ÏÕ÷EJøM=6öþr“ÊìI’¬®®f‚ ’’’™:™L¶páBÇ+++Ýn÷Üٷö9B_ÀKƒæÃÁ0#|WÓî¹Ö5ŒhUò›™ý ÍcqxBþõ·Cõãž«¢¢âñÇ7 µµµ8ŽÏ™3çÔ©S“¿µ5xÇñ˜˜˜ŽŽŽqw4™Lƒƒƒ!’$ÿøÇ?2+ß|óMfÇãñù|«ÕŠŠŒŒd2û1ÏÕÙÙýý÷ß³M kÖ¬Aa¦V«+++¥R)ÓÔÝÝR©TÌ¡<BèÞL`ÿÁ¼ñƯ¾újFFÆ?þñvÄÂ믿}ã YÛ¶mÛ¶mBˆ-% ‡‡ y£ÿT¯´Y®´Y¦(vÌÏìF#†al¿ãÀÀ@RR’\.·X,!µZm³Ùjjj<Ó[ F!pœƒc¤ÿfÇ­×@wÌÛÝc”Ç„pýúu«ÕZXXX[[›‘‘!‘H&?Ùhðƒ˜rotÿñ˜l¶1¦õär¹6lX²d ›ì"„Øâ™1ÏEŽã>ßÍy!Ùe‚ 8Ά 6lØ|vPóãårp/9íɽÅb9pàÀ¶mÛZZZÊËËÙõo½õ—ˉD¯¾úê±cÇ***ÐW aârðà'cšxfïñÜRáÀ$[lF500pùòåðë À˜èfï°}UUÕܹs÷îÝ[PP`·Ûglxå˜Á?ýôÓ>úè·ß~k4=ORRÒ–-[&y¢òòò~ø!x [€4â!B2—Y˜nÌ%ʨ7ÎôÍ3wL&S}ýø÷^F‘ЏÝCÓÄ3ûÔÔT—ËÕÓs£˜„Ïç#„H’¤(Š¢(‡ÃÁ¦õLºÿ?ƒöv~Š P4—¸9ˆ™é­Ÿdï2Sj¯Óé ª««ïöÚ`º=òÈ#gΜٻw/ó2œî¿ßOQTð–ì2Óäp8ŒFã˜ûöš]!M´¸×2þÀ€IŠŠŠÚ´iSccczzú²eËÊÊʦä°|.'Z&¨h˜’£`›øÜ82™,))‰­£P«Õ4M3.—+¸Ö‚Y~˜S5&šFƒ6OZ¼œ]“¡‰@õÛ&õ´Ñºº:—ËõÄO¨Õêûí¹¿†q¹ÜàÑ·ƒaܽhšÊÉÉa×dff²M½½½8~ã_rqqñ§Ÿ~šžžÎ¼²{lN2[u·¡ÎÏP¾¶sÞ¿­J—;v$ùú믟;wnË–-lé?Ããñüío«­­½ÛH²´‘8†®÷žÞ'OõÛ§òŸ\”t·Àl5ñ>ûÖÖÖâââ‚‚‚¾¾>©TªÕjÛÛÛ™ŽùÎÎNƒÁÀLÌ"‹u:Ùl†Ìþvgëû7—è~±:ÃØnUF–dÇ6÷ÚÙá³jjjJJJ¼^ïz²GIJJR«Õ!Çãââ.\è÷û™rð©ÅÌž´bÅŠ‘‘‘ÁÁÁ´´46íĉ[·nýõ¯]UU•<ê7ß|ó /üîw¿;wîœL&[³fMSSSSS»AeóàÒœØH ß:â ?Ô‚ç”” ¹Ž0F;äääÌŸ?ÿ½÷ÞùðÃß|óÍŸýìg»wïf7 I2xpøTCvo«iô3J jU„P!<\Ù ÓãM¦ÏÞjµ^¾|™Çãeff*•Êææf¶¤»³³³¾¾^ dffªÕêîîîššš) xV9SgÚ¶-RÂÿI‰.?Iq±i`Ïñk“?,ÓU_[[<ê4„åË—¿øâ‹/¾ø"—Ë;wî‹/¾øïÿþï“cL{öì¹zõêúõë·nÛJ’ägŸ}Î^‡>tèPjjêöíÛÅbñþýûÙ¦Ó§Oÿýï—H$;wî\ýØêÊÊÊ¿þõ¯Á5H§Œ&2@=¹HÝMœgëûn’¦‘;Œyu‚xæ™gš››™™ˆ†‡‡÷ïß¿|ùò”””»9çŠÓ•)±²cÕ]·×TÕ\rûWÚ,Ö€I¤²™ŽL1N÷Úk¯½ûî»gΜ™éX¦Åüùó_zé¥_ýêWãNÕÏ(NWn[š\^k:x¾=ü³¼°&S,àþõ‹»®Ÿ™*©qòÖd6öØØ'À÷†Œrâĉ{ `j±]™4M3ËðôÊY(??Ÿ¢¨K—.Ít Sf×®]v»}U^^ž×ëwPéÅÆ¹ˆ»n^¢BÆÿàd³/Œ$•raº&â« íŽy’ÉRo\ ëÙ÷ÝŒÍn€ dö³PaaaccãÈÈÈL2e*++wîÜét:›››SRR–-[väȯ÷.êæ¿­éévÏOW’°fb]_œèp‘?4ÌØŒ4\?]g:\Ùå/`Èìg¹\žœœüñÇÏt S騱cA¬\¹rÉ’%v»ýàÁƒŸþùݤ¶ÍRöC[¿ø¡=R»Ï·º“²+½3uj<  Î˜Í Î€Ù êìpCiiéL‡¸k£žCJ™ø¬—€ûdöÌÙ0õ„<Îܔ虎L„V)ÑD‹g: `" Î€)¯?ÿX—Àë;­ž0a î+K²cç$+žo?S×7Ó±w‡Ããó'¶gQQQnnnJ¸¸¸ŽŽv•JU\\œššzýúõ)Š„…ààO-NÚº4eY^ÁÁ¯›ì3Ñhƒáµ×^‹Åuuu3ËSF_|Ÿ¯¯oŒÖ999111õõõ|>öeo÷¿t¼kÈy¤ª Ç1‰+rg:¢ÑNœ8a2™ÚÛÛg:)6/M©‘¼wì›Ö#„r «c¢tõ'ù|‰>±púÎÎçóûÛßVTTœ={–¦iТЋ‹/^\VVVWWw§¦êêêYFh¡)4Bû¿oM‹—o\ û?Gîe`Ü{555‘‘‘O=õŽã!‘HtòäI§Ó)À<ÓRgßØØØÔÔät:SSS§ãø 4!ŸpzH„EÑï½óŠ¢ŒFãLG1õd(»‡œW;¬Á+¯µœiÂÎŽ¸,iI%Ózv@ÐÚÚZZZºuëV Ã~ùË_z<žºº:·Û¢i¶†Ú¸¿·/pÚhZ[”)á[G¼÷8<î%«ÕϤõ¡¬¬,™LÆápf6*ÀÄLAfÏáp[† º\®ÉL€ˆO`ÆÁ1Ž‹\„MÓ.ƒja¦J):Üäµîá¯/v°ã;_z"› Pß^ê~jq²DÀ­lü⇶[ƒ0Ú;ï¼=zú—]»vhÝnáÂ…/¾ø"³|èС>ú(ø€F£±»»{ݺuàÊ•+{÷îµÛÇ$ðßÿýß$I~ñÅ¿øÅ/¤Ré÷ßÿþûïÓ4aØúõë—/_®P(œNgUUÕÇÌ$‘!ÎÅáp¶nݺxñb‚ ***ª««_~ùeö}•––®X±"..ÎápÔ××ôÑGl„">‘¤–~u±sTx.÷ð¸o!|Aüå/q:¿ÿýï™U¬]»öé§ŸÞµkWKKË?ÿùO„Ð/~ñ æ®ú+¯¼Â&Í!šÆýÉK¥ÒÝ»wïÛ·ïøñãÌš¸¸¸7Þxãí·ß>wî³F(îÞ½ûÀœ¦0B¸=ÂÐÂù¥\ºn^?/Ñq®¾?xýü å†ùºæ^Ûÿý¶1œspŸ“H$}}}Ìg&BH$¥§§#„|>ßo¼ÁlsæÌ™3gÎ „/^¼páBfå… jkkív»@ HMM]ºt)ÿÇ‘{µµµ•••ÃÃÃ"‘()))¸‰E’ä|àõzŸyæ¡PÈîXVV¦Õj7nÜ8ýo€YhR³^ŠÅâ%K–¬\¹²´´4''.ñgܯ’û§Ÿê”’´xÙŸ~^ø§Ÿ¾º)—iZœ­~ê‘$»‹úè#¯×ûä“O²»<úè£Ï>ûl__ßûï¿öìÙyóæýæ7¿a¾ BÌT‰íýŽ0cž¿ß¿oß>æK!±yóæ²²²––fƒ¢¢¢eË–½óÎ;¡gŸ}6xßMwû“ïííííí-,¼YÇ’——GDUUÕ½ cZ™íž?!Z2jýÜähŸ“§ñan10,X°Àl6=ztÔÐ8.—»qãÆ 6 „ ÃÆ7nÜÈ$ý¡sçÎ>}:..nÕªUùùùW¯^ýòË/™¦ÚÚÚ#GŽDFF–––fddÔÕÕ}ýõ×·Ÿ÷رcV«uãÆlZjhhðx<gºÞ0³Ú¤¾™x<žÙlnll‰D©©©4MϾ©N,”5s9øÆ…:€þæbBÈ秘¦EukŸƒ-α»È ´ªH!;@P«”ü¯Ok,os¯=)VÊçŽsvùòevyõêÕÑÑÑï¾û®Õj ± BÈb±\¼x!ôË_þòöV¯×ûÞ{ï!„êëë#""6lØ ‰Â¹”’’òÒK/ Ö××gdd„PbbâÑ£G?øàf—˵cÇ…Ba6›Cœ«´´´©©éÏþ3³×Ž;Ø!V­ZuéÒ¥·Þz‹yi2™^xá½^ßÚÚŠŠ”ðBCöiÿ62.\غukeeåöíÛý~ÿ§Ÿ~Ê4‰D¢çŸþôéÓgÏžu:ÿñÿqáÂ…ÊÊÊÐM!~B¡Çqæ{—Çã1u·n·›¢¨ªªª•+WÁdýýý]]]ÓFˆŸFˆ'ÿ£²y"$¼Q+ÏÕ÷EJøM=6ön4­V[ZZZVVÖÞÞ¾hÑ¢ÜÜýA†¥§§3JÑÑÑlNÏ,,,\±bó’ÏçŸÎà{ÁÌ%"7ºÇtL6ÛÓzr¹Ü 6,Y²$x<[<3湂ÀqMÓ$IÖÖÖÎ;wjâühâ‰xjjªËåêé¹QàÁÜhƒRœû“Ÿ¢Í%n˜fzë'Ù»\TTTZZú¯ý‹¾y_yä‘GΜ9³wï^æe8Ýÿ~¿Ÿ¢¨à-Ùe¦ÉápÜi¾Î^³ !¤‰÷Z¦}n¨¨¨¨M›6566¦§§/[¶¬¬¬lºÏ8&¦Ô^§ÓTWWO÷eÆ=Æçr¢e‚ŠÆ™€éÕÖÖ&‰T*óR­VÓ4ít:™ÌÇñàûó6›mpp0%%¥®®.;;›íwgo¸q8ǃÝîžžFÔÎc¶iÓ¦+W®œ:u*999¸ø0yŸG&“%%%±µ ÌgÁ˜E`ÆÑ4´yÒâo~€fh"Bý¶‰w´GEE=ÿüóuuuß|óÍ„8Õ0 ãr¹Áƒ/ ø{Ñ4=44”““îÉÌÌd›z{{ ØYŸ‹‹‹?ýôSvTÙÝcs’ÙÚ¨» u~†òµóþmUúø›þhÇŽ$I¾þúëçÎÛ²e [ú?M<Ïßþö·ÚÚÚQëëêê\.×O<¡V«ƒKqî½;E8YÚHC×ûFOv”§úíSùO.JšÂs0ƒÎž={ôèQöeww7Žãì™LÆÖÙVTT0sààA®l•†aQQQÁEwW¯^ýüóÏ™'O#„D"‘^¯_µj‡Ã9vìØ¨`šššvïÞýí·ßNå;àa2ñ>ûÖÖÖâââ‚‚‚¾¾>©TªÕjÛÛÛGÍ™îgëû7—è~±:ÃØnUF–dÇ6÷ÚÙá³ðüóÏ‹ÅâK—.-X°€]i4ÙÑœcJJJR«Õ!Çãââ.\è÷û™Úè©ÅÌÔ´bÅŠ‘‘‘ÁÁÁ´´´Q;Üɉ'¶nÝúë_ÿºªª*!!!;;›múæ›o^xá…ßýîwçΓÉdkÖ¬ijjjjjb7¨l\š{·Ï6*øqE©ëc´CNNÎüùóß{q‘‘?üðÍ7ßüÙÏ~¶{÷îðÏx·H’ UÌ 555%%%^¯wf=v§'c‘A5d÷¶šFO¨_bP«"„ªááÊN˜Ì_ýõ—_~©×뇆†ª««³³³ƒGÐæææž={¶¼¼\(ÖÖÖ2Eó:îòåË@.—÷ôôn™7oÞ‘#G¾þúëääd‹ÅRQQ¡×ëGõÍ‹D¢ÒÒÒo¾ùÆh4w¦ÔÔÔ˜Íf³Ù¼xñb˜€ ˜xfoµZ/_¾œ”””™™éóùš››ƒçµ÷›3u&š¦fª~R¢s¸É‹M__Ιâãã1 Û±cGðÊ]»v…Îì—/_^ZZÊ,Ï;wîܹ.—k:2{„О={ž{î¹õë×{¼žó?œÿì³Ï^yå•q÷:|ø°L&[²dIfffeeåþýûÙYðOŸ>Z»víÎ;]nWeeå§Ÿ~\‚rÊh*1¨ž\¤ß}ìZø…)gëûã"‰€ëc^‚ žyæ™ææf¦¤uxxxÿþýÛ·o///Ÿ‘š¨ªªª’’’ÚÚÚàadz@qº2%VöQyËí¿ÇšëCZ¥f½³†Á`p»Ý555ׯ_‹Å………K–, Þ`Á‚Çh4Ò4žžÎ|†¯Zµêøñã/^äñx™™™‹/þâ‹/˜í™y3+**y<žÁ`X¶lÙíçÍÊÊjhh8yò¤^¯—Hn<8"33³··W§ÓAZÀÄ`©l¦càþ5þü—^zéW¿ú;R6´âtå¶¥É嵦ƒçÛÃ?Ë k2Åî_¿˜Êb’{C§Ó½öÚkï¾ûîäç<½¤ÆÉ_X“ÙØccŸÿÀmÿþý3`*ØF©l¸Å®]»ìv;û8ª¼¼<¯×;0î0Ê‹rwݼD…ŒÿÁÉf_s&*åÂtMÄWÚ'ó ÊÏϧ(êÒ¥K3È”y$K½q®cpdßw30Õ÷Øk¯½v§¦ÿüÏÿ¼—‘¦döÜ¢²²rçÎN§³¹¹9%%eÙ²eGŽaÇ~…ãÛšž¾a÷üt%k*ôõʼnùCÃ9KaaaccãÈÈÈL2e¸~ºÎt¸²ËÞ¯€¤ïÌ2Ùp‹cÇŽ±råÊ%K–Øíöƒ~þùçw{Ú6KmØ)ýâ‡öH ï<ßjÊÉåòäää?þx¦™JeWzg:`‚ Î˜Í Î€Y樳‡Ïà;qâÄL‡˜86ÅgÒz4™'UîÙ0@fÀlp¿ÔÙ`6‰ŒŒT«Õ¡®®®Ù47.÷3ÏŸØžEEE¹¹¹)Aâââ:::˜VF““““‘‘‘ ‹-˨a¼£üô§?X`fuvvîÛ·ÏëõêtºQM@àøñãG­¨¨ “<—Çãùë_ÿ*‘H˜¯Š0›îtð!ÌÖ÷ÀC¢µµušŽ¬ÕjW¯^­Ñh4Mzzz¿Ó霦sÝIJJÊã?®×ë¯]»6±#p$ AêjÄLûC=ÕD¶ç‹Ž¡‰e–ákçð4®RÏþGD¨ý–n¦•ˆŒãÆgòÔ)DdÆQ®a2?wkR}öÌÓ|Ø—~¿ŸYP©TÙÙÙýýýb±X«Õòx¼Ë—/O*Rp_òx<}}}·7ÕÔÔÔÖÖ.\¸Ðn·Ÿ9s&>>^«ÕNæ\\.—ýøM÷‰:øfëûLR~~>B¨§§‡Ëå*•ÊÜÜÜï¾ûn¦ƒ÷íu’m7_S7ØÂ‘Åpã2öAÒÒƒñ„„"ãð|Ýu3å,5©ÌÞçó™Ò%''×ÔÔ0/ý~JJ Çóù|“9¸Í™3'**J¥RÝÞÔÞÞ®V«y䊢\.ׄ{kH’üì³ÏÒÒÒ †a†566Æüü|­V{§¦”””ɽ³©ñ@Âl}_€©"—ËB555n·[¡P$9Ó{‡øö1¬NDë(—Í×e¼±à*õXöC~8e„P<Ž›(j ¤ÞÜÜìõÞ¼oe±XB‰„Y³ †a·×á0<P(Dá8þä“ONø>ŸO¥RÕÔÔœ:uЦéC‡ñxŸO¯×¯ZµJ$…óîÜn÷[o½µråÊ‚‚‚q76›Í»wï~üñÇ ³Æçó½õÖ[%%% .¼÷ÁO¡¿ÿýï6›mÔÊ;vLß/¥¶¶¶¬¬L«Õnܸñ^¼CnB¡0//ÇñÜÜ\£ÑØÔÔÄ~¡ët:N×ÕÕuåÊ•¡¡p+Èy<ÞÖ­[Ù—?þ8³ðᇠò³³“’’¤R©Çãéïﯮ®v¹\L$O=õB諯¾***R*•ƒƒƒßÿ½V«-..6™Lr¹Üï÷_¸paáÂ…4M?~|ddðÜÜܤ¤$‰Dâóùz{{«ªªÜn·@ øÙÏ~ÆœZ.—ïܹ!TUUUW7^á†qUÉy,†cûà¨Òy"2ž‡óEt€¤œÃd3í'ƒZãˆÆáR®aŸ©‰ö¹B‚´…ÔˆÅ×{£ÐŸ#Qð´yÞÖ*Êm¿ý\¼„œMwŠŽ+¤- 8̸HF{FüÖ^^lzÀiõu×1Õê¡#!åuŠŒÃ¥\V&xŒ/¤Ì÷u_ ØúolŠs„ƒíþÁöo'"–§N 8­l7ü-p[‡ÃõóÄ8BÑN%Îç_ P [Íå. B½áåàñññ‰$111==]§Ó‰Åb³Ù<æ0Ùôôt.—zü Œ }àF“™™ÙÒÒ«×ë٦ݻwŸ>}ÚápØl¶‹/^¼x±±±±°°0ÄÑpW(çÏŸ—Éd*•jddäàÁƒ999sæÌa6hjj:}úôúõëÛÛÛÓÓÓÙ}ïÔTUUeµZù|þ¢E‹”Jå¥K—Ìfsfff8ïÎï÷_¼x1999..nÜE"QCCƒ×ëÍÈÈ`Ö477744”––ŠÅâ{¼×ëõ߆Ãá`¢)Ä EZZZæL&MÓ .d:à§ã}:ujhhÈl62€éÓÔÔÔÝÝ-‰¢££5MZZBÈjµRåõz###£££ÓÒÒ¢££“‚‡Æáp MÓlŸ=EQ4MF𦋋‹sss…B!Žã</***11±¹¹™¢(.—›’Ëår¹œÏçK¥Rçv»5 ‡Ãñx<ñññ###QQQ8ŽwwwçççÏ™3G à8Îår™666â8Îtµ0q@€¦éÞÞÞQ=·#¢µÜ=å´,݈Ã%"b1‚°öÒ~/¥áÆ¥S.[ÀÚC“"2—(Ö^„¡HÀÆ,½´ÏÍ‘«pqTÀÚÃ4Ñ>7›Ñâ<'B}ã€w>×ÂÃ8¡H }®€m€ˆŒC'0l" ´ËNûÜ!" õ– Oˆ¨9ØJ»íœˆXŽD°ö IÈU‡ËÖÕp¤1¹Êoj¢7®xªL Æù‥‹MЉˆXŒ/"¢4\u 7:ç‹Në˜Ãd¹êŒÃ%û[BGî ꣩ú|‡1r5—û3.ï1‚û­Ÿ<ÇŽ‡½3g6›E"Qjj*MÓ·_ §¤¤(•ʺººÐs『T*eÒµC‡jZ¿~½ßï?yò$AK–,Aá £Ôét§NJKK+++ãp8̾!¯×{ôèÑœœœ¬¬,@°ÿþŒŒ æ(DBˆÇã=öØc¡ÄÄD§Óyþüy¯×Ë9”×ë¥iš)'óûý!ÄçóCgÀ©©©555@€Ãá „š››###cbbîqð{÷î½S{ˆ¦LJJb—«««m6Ûºuë$Éô½¯9sæØív­Vú&`ª˜Íæ“'OFEEåååiµÚ¢¢¢œœœ‹/644466¦¦¦æää0SÜôôôœ9s&¸Úöv>ŸïÃ?D1Ýä‡b q9ó­qùòåÚÚZ…Bñè£J¥Ò„„„¶¶›£-m6ÛñãÇ™9÷ØžÆëׯ._¾Üd2]½zuݺu2™Œ¹€ª©©1jµzåÊ•2™,66¶§§çÃ?LIIY´h‘Íf;xð`˜? "2ŽrÙ|µ7^«S äFST|À1Ä÷¤|n^|&.”RnBa¸·ã2“¿Ò~/WŠ $”'Ô\Ÿ!Îå 8†¸ªdÊiñ[{¹êTŒ'?ÂPG øzB”s!ÄË`‚8‰Èx„áLÖΑFÓ>7å½Y[å·öp¹‚€ÓBnÉ1‚GXÉþŒ'ä*“x4bŽŒ£çH£}= 07ÎÔºÙ%6HÓú|G0òÿ).¯“¢ÚÆë»'I²ººšùÃ#"))©±±‘%CDNNŽR©lhhèîîž¾÷î7!Äçó™ëðw\±bÅîÝ»?ÿüóîîîÇ{Œ)ÓgµeËf<ä¤RiIIIyyy\\\^^^pSpF;jjüMÁåLoú¸÷¢˜ Øëõ8p °°É2ÇÍ€ãââ¤RiKK‹^¯ïêêr»Ý©©©÷>ø¨¨¨ÛoŽ17LB4Ëï÷ýõ׉dÕªUa?µï 0Ý0 KJJÊÍÍenÊ1C¤B‰$;;›ù@óûý“™â†ýÛgÇS1F}±§EQýýýYYYEEER©”=~è[¬¡`Â0:¸[“-Ç0„aDŒ–ˆ¹uúf ½%B4S\Žq&x®‰7‚OÍ„„qB”ÛN“^Ž4š±à"9Æá†3g¿¯·!Œ=f`ÄLÄè0¡”f.x8\ž6ç }W#0±ÊÔ»ñg‰sã)8§… ¼íõ6Ü:âaLL•‹™Ñ’ý»ÊÍÍ‹Å.\p8Æ»Àm&þ¹GÇ‹‹‹BçÏŸ¿ãiÑ4†ur³Ë4hš”óÝÌA]ãÎA!:€B…ð ë[8ö¹&fÜCŠðÇùjn\}QŽA"*H9ÒhÊaFhüšx®2‰ò¹Ù2Œà!„˜B|ŽDÁ‘*HS¤õÓ‡ð TG>'}×ïòÏL&“©ÕêÞÞ^æ¿Z­¦išéT*•>Ÿ¯³³sZB³3èvóæÍß~û-3”–-µ¿Çx<Þúõëï*—Õjµ|>ÿÂ… ‹%xÐ{)Ä‚‰ÝCp8GÕétÌ7â=ÀLª£ÕjGUþ¦ƒÛíq8—/_îïïn"I²¡¡áêÕ«Sõ”É‘‘¦[=''§®®N,¯\¹R"‘\¼x1ôìyw–ñŒŒŒÐ4­V«#""‚7F‰Åb¥R)‰˜ñ»¡2{DÓ¤G!tcD/.ЏÙäsq¤Ñä@+SÚΑÅðr¼mÕL76.’# cšpIBˆ™õ’&Ý·4‰"Ã8×ÄŒ!³†«L 8­¤©)xÏ["ß !pZQÀOD'b–Éd>ŸO­Vo?44 ›Múúú¬V+Bˆ¦i‹ÅÒÐÐÀáp&3ö±½½ýÚµkk֬˗/ÿÇ?þqúôéÕ«WO]ÈwÃádeeÝÕ.Ìíúúz.—{Wã†ïgGõx<ÉÉÉÁß»:nú®¸jjjÌf³Ùl^¼x1LÀ=ðÝwß*a|öÙgc®Ÿ0¦¤‡™Î˜ÑØétOŒsWìv»Óé‹ÅÌt[E‘$\3<<Ü××§V«×¬Yìioo}L¿µ—«Jæ%æRŽ!Œ/æˆÙD‘C¼øL¾6?`ëGP$P.åúqîyšâ'æìýOD(4”g„é–ö÷ñ4Y|휀­H873ûPçÂ8B£oüÒÔ8C’Ɖ!"2ã‹ ¾Ø?ÐzËl6TàF„<¡H`ƒG!šŒ˜9r¢ÛîŒy@ÿP__ÀOÌ Ø0¾˜P$øÍˆò#„pù½Ù-SAP#vp-˜¼‰OmµZ/_¾œ”””™™éóùš››[[[o” Äbñ¨RŠ .0WÏ`v¸råJMM ³ÌLbÀçó'œÙï¾û.>>>77!$‘Hy䑲²²ÜÜÜp Áïiiiõõõz½~ÖLÄÎ<¤âäÉ“Á+wìØ1}™}fffoo¯N§ƒ´€{ãNéûÔ¦õŒêêj·Ûžž.‘HH’ìíí­©©™pEQåååóçÏŒŒ¹téRnnî¨á@§OŸž7o^||| èêꪪª }L¿¹ãp9±qDÀ>D¶ñnLt6ù" \uMù)û 9p­N¡\6Êm'bt‡G9­¾û°¶~’+ ¢4\ujÀ>H¶² q.~ò<Œ;ú3ÐÛZúY­¡#Dì¸PpZGMRykðß­=úû G® ŒXÐmÅcrÙ|]uD´–«N¥ý$9Ðêê`š0œÀø"žæ–Ž3okí†Ì~Ê`©l¦c@¡ýû÷ÏtLVÿ¾}ûÖ­[ÇN ÷³'NÌtàŽLÉKÈö¶\¤¼N\$¿}jÊmGãuÛOÀ¨§äÞHøÉó|=õá¾;mf ;ë;3ì,éYà~ÐÚÚŠãxJJÊLà~Ç×Í¡ý$û`)Ž$ QŠô fvüû.Q 𦿙„2{¦Lsss||<”‘WÀ>ÈMãÒ)·Ê8‘q~s cÚñ{Œ#‹¡\6(…PLnŠ%ÀœN§Éd ~@p'~K7ÙבDñâÒ9R…°ì=ùÌŒÃ.”…ó€*pŸ€:{à!uö<Ðn¯³¿_2{L‡}gÙð@»=³‡jfÈì˜ ³`6€Ì€Ù`âóÙ)Šà5.—ëÌ™3Ìrll¬^¯‹Å$I666úýSÿà4©q²[•q®¾ï›ŠÎp¶Ÿ›½sÅé)Ë®˜¾¼Ð~§-3"^X“ùÆ—uíýŽ) ÀdH¥Òää䦦&—Ëb³ˆˆNÇ, ôööÞ‹àBÅÇǯ\¹òðáÃ!6Û¼y³Éd:wîÜ= ì~öè£ÆÆÆ¯q8@mÞ¼Y"‘ŒÚ~ÜïCkROªr:ÍÍÍìK6wŠŠÊËË3›Í×®] …:ŽÏç_ºtiR‘pgêH‘ˆÏIˆý—'­&ûÞïšBÛ—Ãôó0 9Îööv„PbbâLÇÂb³ÙjjjØ—$yãÙXçÏŸçr¹ìz­V«×ë½^nï1©ÌÞçóõõõݾ^£Ñx½Þªª*fþŠ¢RRR¸\.ûK`j«ï°yº‡œan?ìô]n5#„¶-M™Î¸Ì ’$‡‡‡dö¯×Ë\ŒÒÓÓüÒ`0X­V»Ý~ÂzÐLK}kkkee%;ŦÃá@ ‚é8!Ц»‡¸t€ûŽP(œéÂ% 1 ›é(À‰Åb¥RÙÖÖ6ÓÜ¿&ÕgÏàp8@ xÍÈÈHð˘˜˜@ º€;QEûTþû'›«[n<ÝšÏåüéçEÇ.u{©;tÅ|‰Aµ0S¥” ²Ådÿò|ÇÈxÙ?ŽcOk‹Òbv¥ÍR×n7B‚ þò—¿8Îßÿþ÷ÌíÚµkŸ~úé]»vµ´LäQáqqqo¼ñÆÛo¿ÍÖ_ …ÂÝ»w8pààÁƒ8 BèwÞ‰ŽŽµr×®]Áu0µD"‘Z­–Édmmmn·Û`0Øív‘Häv»ÍfsBBÂÈÈH{{;óÉ©P( ŸÏ÷ûý‡Ãd21Ù†a±±±QQQ†Ùl6›ÍÆß`08Ž®®.æe˜%øì¹ßïéííõûý8ާ¤¤øýþþþ~«ÕÊvPŽ Çñ‚‚‚ääd‡ÓÑÑÁÆÃHOOOKK“Ëå§¿¿¿²²Òãñ°­iiiyyy ¯¯ïüùóL5ª?¸pÿös-[¶,tѹD"Ù¼yswwwLLŒÅbijjZ°`A___yy9óCG8&&Âááᬬ,>ŸÏ/—Ë7nÜxæÌ™ÖÖVfK.—»eË–Ë—/×ÖÖ2kRSS‹ŠŠL&SyyùíG&"ÄÈL½^‚Ì>„Ieöb±xÉ’%B¡ù3¨¯¯Nñ¹\®P(Ôh4¦¡¡aTö@˜ú‡ÝýÞ]›Ù"fl· ó‹³Õ›Kô—®›Ï^íWÈøK²cc£D=Pú£zynܲܨ«ÃÆvK¼BôXa¸úýþ}ûöýö·¿]ºtiyyyDDÄæÍ›ËÊÊ&–Ö#„z{{{{{ Ùõ¼¼<‚ ªªª&v@„О={ø|>ûrûöí‰dhhh€Äb±Z­–J¥.—«­­Íf³ñx<„MÓqqq4M÷õõÅÇÇK¥R»Ý­Ñhìv»ÙlæóùÑÑÑ|>ÿúõ롘˜¥Ri·Ûm6›P(T«Õ“Œ9×ðð°ÙlæñxÑÑÑ ©©‰¢¨¦¦&•J• V«ûûû-K8ù}VVVVVVwwwgggTTT~~>Û”™™Y\\ÜÞÞÞØØ(‘H233#""¾ùæ¦5&&F*•ÖÖÖJ¥RƒÁ°bÅŠ¯¾újÂç ¦éººº‚‚‚@ pùòåyóæÅÅÅõôô„Ž0„¸¸8„Й3g¤Riaa!Ç{G˜—èâ¢DãGh4^¸paëÖ­•••Û·o÷ûýŸ~úéݿћªªªV®\Év]ô÷÷êº+—/_f—W¯^ýî»ïZ­ÖÉ ·“H$*•J*•:ÎÖÖÖQõÐ6›Ín·ÇÅÅ9³ÙÏt:DGG3Û3›‘$/<B¡nŠ‹›dyOtt´ÍfcKº½^obb¢H$r¹\^¯·³³³¿¿_©Tj4•J500`6›Cç÷iii'Nœ`^EFF2Ëééé]]]§Nb^ÚíöE‹) ³ÙŒâp8Çgîv»‹ŠŠ¢¢¢,–P÷ŠCœ+´ÎÎÎîîî‚‚‚ÞÞÞ¦¦¦yóæÉd²žžžÐ†@’$ÓýÄ ¹,))a‚ïììÌÈÈÀqœ¢(„PBB‚Ãáþºill‹Å&“)8­G “ÉTUU%“ÉæÌ™CÓô¨‰ƒ¤R©B¡˜L'×Ã`Ruö$IVWW÷õõµ¶¶¶µµi4šàÁË­­­F£±¿¿?+++>>~Ò¡‚‡×•6³€ÇI“#„p 3$FÔ¶S$ƒa(F.0Y\b—ù¯ÏêFEËB÷À0%å7õܼÕ{Ýî>ø€Ëå¾úê«%%%Ÿ|òÉ${***„B¡Á`@á8>gΜÊÊÊÉ•˜˜¸mÛ¶sçαsÔÀb²äÖÖÖæææÃišf2Z¦®Ïçl2ËLÒÏãñ‚›œ#áN–p'|>ßãñ?b*O˜[ ¯×ÛÕÕÕÐÐ@’¤F£ }!a˜D"1™Lìšþþ~¶I&“Y­VÁ˜A½R©”Ù`pp½f`ú@Ù¦»=׸Ø8»ÀápÆ0„àÔ``€Ý«³³“Ëå2}»†i4šÎÎ[&¤îèè8xðà… FÐçó}÷ÝwíííµµµF£1%%%øV3ú±gÌQ¶€5ñ>{£ÑˆasA†HJJ’Ëåìý}»Ýn·Û™=YYYf³yܲ-ÆÔ90bs’9ºÈkÝÃIj©˜O;ÆÉì çàØÊ9ñ+çÄZz/C¤Ÿb×*ÄöÁ,˶mÛÖÒÒ2fíà]¹~ýºÕj-,,¬­­ÍÈÈH$SÒKÁãñ^|ñE«ÕºgÏžÉ ng³Ù˜r—pz»†g!fÇñ;5Ms@•J¥R©F­~ÉÜy‹ÅN§3ôÌ~LÁu#lù1Žã8ŽçæææææïÂápFm‰~œ:œ B%f!Î51ãFBð/‚ ƒ ~ppÐår%&&öööªT*>Ÿ?*³ÓÙ³gƒÑ]]]¹¹¹ …"øAz½~```Ô`N0ÊÄ3ûQi:sKeÌ‘­­­Z­V¥RuttLøtàaF#dì°di£öŸmËÑE¸ý­}au¥Ÿ¿6p©å–Rr“uGr3_ Ạ¦éªªª¹sçîÝ»·  Àn·766Nþ°;vìˆýÃþàv»'4¸]OOÏàà R©Œ‹‹c«Y&™ŽO9³ÙÌtN³ØOE©TªR©$ÉÈÈÈõë×'_ÒÝÜÜ?õÙ÷­u£ 1F’'‹åënŸŸFH)ô»B>?µ0S™+#8xfbäúy‰=f×±ê®Ð{q |~†2!FÂ#8óÒbÒ5r©{þÚÀ°ó޽M¡œœœ­[·þóŸÿljjjjjZ³f\.¿té»ÁÅÚØ(¡:Rx¶¾ßçë®4MÓ‰‰‰ .ôz½{öìULy·|饗Ž?“ð£ááá½h€Ùá§?ýéšØ g¦EQ‡ƒé„މ‰±Ùl^¯—™ÅÒív«Õj‡ÃÁTbDGG …B‡©R©œN'›T( ¦)**J*‘r¹\³ÙÌ”¿+ ‰D‚aXTT”T*%‚i‰Db±X Èåræó“Ïç3— E±{Éd²ØØX·ÛÍLð222ºª~LA¤¦¦* .—›œœ' ›››].—ßïOKKS«ÕL²TPP`±X®\¹‚2 @@«Õr8½^Ÿ——7<<ÌÎc–ššÊ¤Î)))±±±€9`ˆsñx<.—KÜŠ¢(.—k0:;;ív{vvvOOÙlÎËËëíí!£¸¸8&&&:::xrsƒÁà÷ûµZ-Žãz½>7778xš¦###“’’ü~ÿùóçGõÙyÀ‘‘‘œœ¥RɼeƒÁP__ÏΙŸŸ_WW“5kâÕ8V«õòåËIII™™™>Ÿ¯¹¹™ý€¸~ýz Ðh4jµÚçóõ÷÷_»vmJŠÁì¶ÝRÝÐ5<ÂuA†²Äp£Ç"[™­tûWÚ*BBËrcR¢÷øüµí–o.v2ÿ CìUVÛ+pç¥Ç¤ÄÉjÛ,G«ºÆí'â™gžinnff Þ¿ÿöíÛËËËÙ‹gëûã"‰€ëöÝÅh§ªªª’’’ÚÚÚÛóï»=`||<†a;vì^¹k×.˜p?`26…Bï÷û­V+[288HDTT”D"±Ùl}}}Ì)!«ÕÊLHg³ÙL&Ûõÿ³wçñM\÷Þø¿3Ú¬Õ»¼ï6Þ0Áf‡‚Ù )$Ü4 )iò¤á¦K’.O{oÓûº¿þÚÞ'é}šÜÞä¦MÓÒ4…@CJ6BÖ˜Íàïxß7Y²%kyþ#„Ù–åóþ#/iÎÌ™ïXÓòÕè{Îq.Ï(ä÷åååD$L+ãp8„½ þÊ•+)))‘‘‘---%%%kÖ¬š„²³³—,Y"LÓ^TTä̈z{{{{{…•ª:;;Ï;'lohhP©T‹-jii)..vvèæ\<ðÀø_->ýôS÷«ÜGHDaaaã'©œ,xAKKKrrr{{ûø1¾vØÓÓsòäÉœœœ%K–˜Íæââbáàgú•zºÅ³+&TùÓmóvŸ¨¿X;éJ{·³g7e*$ÿ÷@ÙôILL|饗Þxã g¨ô Cø Ú¿ÿdMÎiÑᕘ˜¸zõê>úH§ÓiµÚñ™ôöözð+ĔƬ’;^HHÈ:§.‰pàlS°Jj±Í È>000%%eÏž=¾êîtUUU"‘(===55Õl6—••9Ç­Þ>äryXX˜¯–N‡A=€?C=€¿_gÕ£ü2{€ÌÀ ³ðÈìüç³^.Z´(44Ôu‹Éd³R¦B¡X¹r%}þù矦äÕ|öF£±®®ÎùvüB ‰‰‰ Ã8g䀛īÌÞjµvuuMÖ*•J…µ…½9LÇM¬³OHH`Y¶»»ûæ>ÈìE"Ñ„ããã»»»F£÷§÷¼ªÆQ*•ùùùr¹Ün·wwwWVV:¡)..N"‘444hµZ_Ä îxõÌ^*•šL¦’’’†††èèèÌÌLa;Ã0‰‰‰ýýýz½ÞAÀ¼zfo³Ù._¾Ìq‰Åâäääšš›ÍPQQᣠ` ž?³///?{ö¬ÖQOOQRR’Ñh4 R©T¨Â—J¥ Ãø"`˜€çÏìÍf³ë[«ÕJDb±˜eY•JEDk×®u¶®]»öüù󃃃ŸÜð<³OKK3™LíííÂ[™LFD6›çùÂÂBçn111ÑÑÑ………ÃÃÃ^Æ “ñ<³×h4‘‘‘ÂZT‘‘‘<Ïëõzžçûûû»…„„ŒÙ>çy}CCƒR©\°`AlllfffBBBss³Ýn÷ap0Mžgö:®¤¤D*•fffjµÚºººššFÓçÕ¬—]]]]]]î÷©«««««óæ,0%¯Vª€Û2{€ÌÀ ³ðÈìü2{€ÌÀ ³Ÿ‚\*ÊK ›í(ÀxG%hU±aÊ™6€ßój¥*¿ªÜyo†DÌV¶èÌVÇl‡w<ŸÜQùs£rSB?8×tºbì:qnšÀïyžÙ/Z´(44Ôu‹Éd:}ú´û¦›$++ëG?úѱcÇöîÝ;ÍCD"Ñž={Þ{ï½L¸ƒ6HþÝû³ &ë›V;“°«Ÿoï¼RQs,48~á][Ë*?ë쩚¢´s’⪔¡6»¥¯¿±ªþ´Ýn!¢ˆðÔ¼œÆt~îÒÞACçd±I%òùsïÖD™FK«†z4ªð‹¿ÙÖYQ^uÄýu¹‰pBjµú…^HKKëêêzã7ššš^~ùå'N¼ùæ›îÏåžÊd–/_þÜsÏ ¯<¸{÷n/;H$’§žzjáÂ…Ç>|øƒ>ðI·“™ðŽ"¢ˆðÔœŒ»E"éç'çº\ô¼ø˜yJE°Åjìh®©?cwX‰hÏÉz³Í±mE’ƒã *»]qÓ~Ï«göF£±®®ÎùÖn·O§éfˆU*•III¾êaè›kS­vîO+ &›s;Ë8ë—x–ñ×Þ„‡&ÍŸ{¿®µªî”B®IˆÍ ЖüÃy`uÝ©Ëó­qDçæì ±óƒ4‘åÕGSÏI^q©ôƒÐx"êr›£»p27nLMMýãÿ¸eË–Gy䥗^ÊÉÉ!¢óçÏOy.÷|ø¡TWW¿úê«Dô½ï}Ïûޜ֭[·zõê„……}ãߨ«««¨¨ðaÿ®&¼£Ä"iæœÕ±Qsívë˜ýãcæe§¯ïíoli/U*‚ãòò áŽrpüþ3 RÑCË“ê; ݺçQnšÀïy•Ù[­Ö®®‰ôwÓt3;v¬³³³©©ÉW.ž£MW½y¸Ú5­'"žçxž^8ÿKDñÑóL#ƒ…%ÿ¶«tŠ IDATX­#iù2©Òb5 ;ô 4û¦yv™T9b6ttW…Çj"ˆ(,8Án3÷ ´LyìdN&((¨··÷Ë/¿ÌÎÎNNN&¢œœ£Ñè}ŽëÃe``àÂ… Dôï|ÇûÞœæÍ›×ØØ¸ÿ~‘H¤Ñh}ØùÞQó²î I¬¬ùB&S%Å/tÝ?!f¾ÞÐy©tôg‹Õ”‘ºJ©6štDÄí?Ó0'&pë²Ä?ªr=ÐMø7?©³ç8®¼¼Ü‡.Ëжõ¯4}²ÎñÇs‰ˆçFóf¥"xPßáL£Û»*G,Cï›Ò|–…ÅvöÔL™¦»‰pšÄbqFFÆùóçoƒ÷ù‡âs …bhhˆˆÇË/¿|SÏ5áU]º–ùrØ40'yŸ؂Z oûšˆV)!BfOD#VÇ©òÎûÅ«dºa‹ë±nšÀù ³‰D“enšÆ{ýõ×ËËËÛÛÛ7mÚ¤V«+++ÿüç?÷ôô­¿øÅ/l6ÛžyæµZ}æÌ™¿þõ¯<Ï»©À:lkk»ÿþûJKKwíÚe0Þ~ûmaŸ‡~øá‡&"ׂ{…Lœ©þèÂÈÇ<wæîf˰FÁ0 ÏóDdµL§rfš‚£Y‘ØY.Ï0LJâ’¨ð9 yÝaíhª¾ú¥Å2ì>Âiš3gŽL&›N)Ã0>øàÒ¥KµZ­Ùb.+-{÷Ýwu:M^þÚk¯§¥¥577ñÅO?ýteeå+¯¼ÂqœûÀõëׯ[·.::zhh¨²²r÷î݃Áý!J¥’eY±Xìp8Ôj5qg4éÚmãcp×]wýë¿þë¿ýÛ¿ÕÕÕMvG {®Y³fÓ¦Mƒ¡¸¸øÝwß-†™ìŽ2 NËŠYVÄ9®×°ª#‰H"–ºîVtµóâø¬ø ñ%õnšÀ_y•Ù+•Êüü|¹\n·Û»»»+++y¼›&7æÍ›GD¯¿þzDDÄöíÛüãÿô§?re"’H$<ðÀ_þò—´´´mÛ¶•––»¯ÀJÆ_{íµØØØíÛ·ûÛßþíokµZ_}õU–eŸþù³gÏ e­­­Î£„y›º‡ÆwÈqܵŒYÈžGc»Ú|qqî¶œŒ Wj¾pp *‹eR‰\xm³›NÈî°J%Š™Z.×Øí– u„id°_7š¦&.MM\ÚÜ^ÚØzY&S%Ææ-VG|yñoüµGõF8³Ù¬ÑhBBBÂÃÃM&SJJJww÷tžµ?ôÐC=ôБ#G<rï½÷&%%ýô§?u8î?žç?þøãÇ{Ìjµîß¿ÿ‰'ž˜7o^II MuLhãÆO>ùä¹sçŽ=ªÕjï¹çž¸¸¸Ÿýìgîzùå—ÃÂF§ž|ë­·ˆ¨»»ûù矟òª'¼£ˆhÍš5;wî,,,<|øpTTÔ† ÂÃÃ_zé%á(7wÔ”†ÍHY™¿`|S¿Á00p``Àý‡RXXXTTôØc•••?~ü‰'žˆŒŒšÜßÚ°aCQQÑï~7:«Lggç³Ï>›””ÔÐÐàæ¨×^{M*•îØ±Ãf³ S÷X,ÓªZ™ìŽºÿþû«««…,ŸˆvìØ¡Õj…ßÜÜQîI%òܹ÷‡Å6·%Äåß¡OoRIÇowß~É«ÌÞf³]¾|Y¨ç‹ÅÉÉÉ5556›Í}“Î×555D¤Õj‰]gggoo¯Ðù¯~õ«éDèšÞ544°,ÞÜÜìþ¨©ˆˆf:Ýxs[±Nßž™šŸ“¹12|Nñ•O.ÕÕGGÌzáõˆeŠZ‘!c߉³o)åAf˰ƒ³/ž¿-48Îj3•Wíék0[µV&S 8ƒíƒí3 ÕUkkëw¿ûݨ¨¨þþ~›Íöâ‹/Î;W¯×ÿñ,**rsààà`RRRpp°PS]]]]]=3r'ÜÎbñè}èþa˜ÈÈÈÂÂB¡¢†ˆÚÚÚˆ(""Â}f/tn2™ÌfóŒLxGµ´´DEE;wÎÙtæÌ™ÞÞ^“É$¼õìŽÒ¨µ+=βâ‹%ï›Fôföf›C.øÅnšÀ/yþyy9Ã0ܵš===ÉÉÉ}}}nšÜ÷é:9¦ð5@&“9·èõú™9¾C©t꧘6;GDk±Í,3 õ\(Þ‘~Wæ=™©«+jŽ9›õÓŸ‡ˆ[hp¼Jª7t‡Ç•\9““‘²ª§¯áJͱÅó·­^úTŸ®e`°µ£»ÆYdï‹Å’ÛÐÐ0wîÜÿþïÿ^·nÝöíÛÝgöo½õÖÏþóßýîwåååUUUBŠï ÷7Àxb±X$mÙ²eË–-c¶{Éô#”J¥b±˜eY×/®CCC……×Ç¿zvGEjç ÝE˜‡äš ÷‘ˆX¡ó5€_ò<2›o(-°Z­t-£rÓä)KÆ}eØl#"B"¼˜©Îîµ2,%aqmCÕæá„â Ã$',ìío’JìkgOJ’›KDF“îÔù]‘áia! Iq ÒSV–WiïªôìD¹6oÞ\RR¢V«GFFÎ;³qãF÷Guuuýà?X¼xqNNÎ}÷Ý÷裾ùæ›7u=²Éœ8qâìÙ³®[\GMÜ<»£zúŠ+>á8w_Ô I[Ÿq¦Mà—<϶ÓÒÒL&S{ûhˆðlUxlé¦É=×êr¹œ¦]ýìŽãxžgÙÑu´Zmll¬ð”º£ßDD±aÊŽÓ4{ I´ÚL†¡Ñ‰\ ]Ä02™ÒãÌ>$(V*Uö4)åAïèè®îè®fvnúúœÌ }Mët£#+++((¨¬¬ÌYï>M6›­     @$=ýôÓ;wî,--õà§§™Þv»ã¸¡¡!N¯i³Ù\Ãpÿ£k‰Ä¹E­V§¥¥ÕÔÔóíÌôŽâ8;Ç9 Ã=δ^,–‘íÆ­dQ˜&àbÍÓ¹iÅN½Ë$4Mrr2Ã0ÂÛÈÈHžç…¬ÎM“{éééÂÀVº6MÊt&=ô Ïó}}}±±±ÂÛM›6ýà?^÷Ìz£mnBÈô{KKZ–“q·ómHP ñüdsNG”6ˆú'Zš*#5?ùÚªF<Ïõö72 +•*<>×Ò¥KyžŸirüøãoÞ¼Yxíp8JJJD"‘—‹=Íôày¾££cÁ‚ÎohK–,Ù·o_zzºÇ1ôôô¸†‘••5å!B®{®X±â'?ù‰R©ÞzpG™FÃCœoÃB‰ÈxãÀëì„`–¡«]L¹ã¦ ü•çÏì–,Y²`Á‚®®.µZ-Ìa"T!»irÏb±¼øâ‹QQQ÷Þ{oKKË”£]“““…'Í,ËFGG/_¾Ün·_¼xq:—pòäÉmÛ¶mß¾}hhhíÚµ®GÖõ®Î‰šþB?ÍmÅweoÊ»¹o I¥ MˆßÖuÅuíŒ0 žfê¶ÚF¬¶±X=/4$AXÑ–ãé)+åòÀACW€T•—74Ü7lì÷ì\,Ë.Y²¤±±qhhÈ`0ÈåòuëÖåääLùMÌn·?úè£Z­¶¾¾>88xÓ¦M---BŒÇÊd7€›?ùä“gŸ}öç?ÿyAAF£Ù´iSmmmmm-]›´~Ì)L&“û™NŸ>ýýï_#>>>;;{ʰ‰èÓO?ݹsçsÏ=W\\uß}÷•••¹~-™ùU’¾ná][»{땊àĸ¼þç2U‚¯eEô,  ÈvÓþÊóÌ^§Ó•””$''gffZ­Öºº:ç´!nšÜ«­­­¯¯ðÁ5MEEÅŸÿüç)kë×®]»~ýzáu^^^^^žÉdšffÿᇠóî3 sþüùwÞyÇÙt²¼sEVÄ?}-é­ÃÕÓ©îïè®–Häñ1ó´¡I«±©µ¸¶áËéÄ0¡Ðàx©TÞÖYNDí]Uá¡IYi«ÍÖá+5lj¨®±€ãì1QY±Qs­VS¿®¹ºþ´Çƒ²³³5ÍñãljèÌ™3¹¹¹O<ñ„N§Ûµk—ûÿþ÷¿[­ÖüüüÕ«Wëõúòòò={öaxü¡Lv¸éðÔ©SDtß}÷}ë[ß2˜ ÷íÛ'å:i½“°æ”› ÂÃÃ7nÜøÍo~óâÅ‹ï½÷ÞøÃ)#?qâ„ÆâÅ‹ÍfsAAÁž={\w˜éÕÒ^JDñ1ó²ÒÖXl¦¶ŽŠê«7ŒaX’®MÒì>Q?¾77MàÇ•zâ97n½1kκ%éÚí«SN”u~p®i¶cùJðù žž>~*¤úúzçÒ°·˜勤èÀg7eÖ´ëßü¬júMðÕ´ÿþÉšŽ;6YÜþœvyž^cºëI]¨é THî_ª‘½óEÞi„Iëo¾º£VfGn]–ØÜ;ü—£c/ÐMø=döî)nïYš®µ9ÖƒøäŽ’ˆÙSŸ¶ÚÇu⦠ü2û)”5”5L½ÀôxG/íð  üÞmTg>‡:{5¾ÎÞóùìàöÌÀ ³ðÈìü2{àù¬—‹- uÝb2™NŸ>=f7‘H¤V«=>LÉ«ùìFc]]ó­Ýnwme&111%%…a˜cÇŽ9çåŸó*³·Z­]]]61 “››«Õj[[[¯^½Š´঺YkЦ¥¥iµÚòòòööö›t pòÁZ‘H4fK@@@RRR{{;Òz€[ëgöJ¥2??_.—ÛíöîîîÊÊJ‡ÃAD111 Ã\½zU$q‡R€›Í«Ì^*•ö÷÷×ÔÔ(Š´´4žç+**ˆ($$Äápäåå©T*Žãºººªªªl6›b€±¼Êìm6ÛåË—9Ž#"±Xœœœ\SSc³Ùär¹H$®««S«ÕÉÉÉ2™¬°°ÐG1ÀXžgöååå Ãi=õôô$''öõõI¥ÒÁÁÁ’’"êîî¶Ûí …Âd2ù&j¸‘ç#hÍfóÈȈó­Õj%"±XÌ0ŒX,îïïw6õõõ‘R©ô"NpÇóÌ>---&&ÆùV&“‘ÍfãyÞáp¸N˜Ã0Œó¿p3xžÙk4šäädg¾Éó¼^¯'"N§ÕjYv´s­VKDCCC^G ó<³ohhP*• ,ˆÍÌÌLHHhnn¶ÛíDtõêU…B±hÑ¢øøøÌÌÌÔÔÔ®®.×Òð-‘T&óìH³Ù<<<ÐÔÔT__ïlšärykkkuu5fµ¸õ~øáÉšne$p³y5ëeWWWWWׄM}}}ÂÀY¸<¯Æ€Û2{€ÌÀ ³ðÈìü2{€ÌÀ ³‡KEy©aSî– Uņ)oA<àäÕJUð•ªÜyo†DÌV¶èÌV‡›=óçF妄~p®étÅÄ ™€ÏyžÙ/Z´(44Ôu‹Éd:}ú4åççËåò1ûŸ?~pppê€Dì?}-)'1„ãùÓ]GŠÚ<ŽpJYYY?úÑŽ;¶wïÞ›}”‰ä©§žZ¸p!Çq‡þàƒ|Ò팈D¢={ö¼÷Þ{˜pmü»÷gLÖ7?¬v¦õqÑ9 ±¹JyÅjìío¬¾zÚá°Ñž“õf›cÛŠ$ÇTvßºËø ó꙽Ñh¬««s¾µÛí‹ÊÊJ‘HäÜiµZ§ÓçŠÌˆ¥éÚϋڂU²ûÅ5uÕ¶ë½ ÒØØX¥R™””t Žrcݺu«W¯>pà@XXØ7¾ñºººŠŠ _uî Cß\›jµso|Zi0Ù„á©s3îîî­ki/Qȃãr¥REqÅA"rpüþ3 RÑCË“ê; ݺ‘Y à+Á«ÌÞjµvuMPnÑÛÛëú611qhhÈd2M§ÏôØÀÖ>ã¡K­,˨äµ\âM„î;v¬³³³©©é导yó÷ïß/‰4M`` ¯zö•Ås´ áª7W;Óz"JM\2¨ï(*ÿDxkwXÒ’–K¥ «ÕDD<Ñþ3 sb·.KüáªÙ‰à«ä¦×ÙÕÖÖNs¹Ll4Ûˆˆãø7?»¹!Çqååå·æ(7 ÅÐÐ9Ž—_~Ù‡=ûʲ m[ŸñJ³Îuc]ã9³eØùv@×FI¤R„ XG¿ÂX§Ê;ï[¬’é†-·4b€¯dö"‘Èá˜t׿àŽµ}cUŠ*@RX×{àl#Ï»;×òåËŸ{î9áõÁƒwïÞ=+usÔ믿^^^ÞÖÖvÿý÷”––îÚµË`0¸ïP©T²,+‹‡Z­&"ŽãŒF£Ðº~ýúuëÖEGG UVVîÞ½ÛÙá/~ñ ›ÍvàÀgžyF­VŸ9sæ¯ýkXXØk¯½V\\œ––ÖÜÜüÅ_<ýôÓ•••¯¼ò Çq ÃlÞ¼yíÚµ¡¡¡F£ñÒ¥K{öì xûí·…n~øá‡~˜ˆ\ î2qr¤ú£ -c‚ïékp}+ˈˆãn¸Š®öo^Ÿ4¦Ú~i†vËÒĺýŸÔ¸ÿÀ4y•Ù+•Ja°¬Ýnïî¬ŸâGEE †é”âüä¡y!j™ðúÿ<±ˆú –ÿo­š¹mEÒ•–Á‚ÊîðÀ€ü¹QÚ@ùë¯8•ˆØuwÅü£ 1Q«¾waluëà•Ý„gTWW¿úê«Dô½ï}oú×ëþ¨œœ"zíµ×bcc·oßþíoû·¿ý­û_~ùå°°ÑI$ßzë-"êîî~þùç‰hãÆO>ùä¹sçŽ=ªÕjï¹çž¸¸¸Ÿýìgüµ¯,‰äøË_þ’––¶mÛ¶ÒÒÒ¶¶6"âyþã?~ì±Ç¬VëþýûŸxâ‰yóæ•””<øàƒÛ¶m;sæLUUUhhè}÷Ýñë_ÿÚjµ¾úê«,Ë>ÿüógÏž½páµ¶¶:ƒæ¯lêr-±Ñ96Ûˆ~è† ¾ß`6ÛãÂTD7lÏK SÈDw%…(dbç—7ð†W™½T*íïﯩ©Q(iii<Ïú©P(4MMÍ´žË¾s¼N"b·.O´;øO.4‘ÕÎ M_ËŠlèrçL¶­Ë"‚åΡ™ ZÕ/÷ Yê: ÉQj™D4á)œ„ö;ßùÎô¯×ýQ‹åÍ7ß$¢ÊÊÊ   -[¶( ÷_i^{í5©TºcÇ›Í&Ì´c±ŒV­lذ¡¨¨èw¿ûð¶³³óÙgŸMJJjh}Ržššú /ôööVVVfddÛ ‹ŠŠ{ì±²²²ãÇ?ñÄ‘‘‘DÿÙgŸ½óÎ;Ân&“iÇŽ¡¡¡ýýý.\F<·µµ è*X%#¢>ƒÙÍ…¤%-Ó†%—WáynLSŸÞ¤’ŽÙXPÙ¬’Õ¶ë‘ÖøŠW™½Íf»|ù2ÇqD$‹“““kjjl¶ëƒ,…œr:¥8DÔÐ5DDf«ÃbsԸ̇Ã0p´¸Ý¹¥ºu–%D^Ïì{õæ! ÙÜÿ¬ôæ¢<æÌ¹…×,ˆ‡‡777»9DøÎc2™Ìf³kí>Ã0‘‘‘………B‰ Ïã#""œgéììF*Ûl¶_ýêWDNDÇ Ÿˆó…X,&"á×"’J¥2™L§ÓQppp¿ûë Šˆh² ìÅbÙ¼Ìa)•µ'Ú:'˜ÒÇlsÈ¥co³ÒÆÒÆ÷ç€ñ<³///gFȉ¨§§'99900°¯¯Ï¹OTTÔàààȈW“ŠYVÄ26ûõ‡Á»ƒˆ\ÌFlyk9'ý$"áëT:öYõ4‰Åb‘H´eË–-[¶ŒÙî|­×Ïl2P‰D²eË–üü|gý1 3åÂ_^"b-¶±É½D°xþ6¥<¨°ôƒ¾¦‰Ï+b]?;¸I<ÏìÍæÊ3„éê]SO¥R©V««ªnÅŒ‡¼û³w¦'Nœ={Öu‹kùûL/ùñÇ߸qã‘#GÊËËÍfsrrò£>:‡Í6"Ò($ WweÝ«R„œ»¼×0Ü;Ñ¡DDj…¤­Ï8£PÀžgöiii&“©½}´HF&“ѵgÕ‚éÏŠãžã/³Î-ÂÓúñý†Ýnç8nhhȇÓk®\¹òôéÓ»víÞŽù=ã8žçYvô¬Õjccc‹ŠŠˆ¨£ßDD±aÊŽÆ „‡&…‡&UÖw“ÖË$¢0MÀÅš_]L†z—Ih4šäädg9Gdd$Ïó®%"QQQ:Î9$Ôcùä“gŸ}öç?ÿyAAF£Ù´iSmmíôüC˜¶hݺuÃÃý½½sæÌÿ%áäɓ۶mÛ¾}ûÐÐÐÚµk]¯«°®wuNÔ˜§4j­ÅbŒÔ¦¹vÒ7Ðb³]ÿ\¾–Ñg°4tŽ×EVdD<"Hþia ¦Çð Ï3{NWRR’œœœ™™iµZëêê\'‡á{_Š#8]ÑÉóüò̈‡V$Ø.Ôö||Þ«ï k×®]¿~½ð://///Ïd2M™£{v”gN:ED÷Ýwß·¾õ-Óˆ©°°pß¾}Þ 'øÓŸþôío{óæÍf‹ùÜÙsÿûßô£¹îðᇠ0 sþüyçü˜Dt²¼sEVÄ?}-é­ÃÕÎ$b™B×NÎ]Ú;x-³_’®MÒì>Q?>èâ«} Zf½ð!F¥ÖÌv pX’®Ý¾:åDYç皦³Ztà³›2kÚõÎU`Vìß¿²¦cÇŽÝÊHÀ·œÏ|yž^{5Ÿ=|u\¨é THî_ª‘½óEÕíD–+³#·.KlîþËÑi-RÞCfÓu¤¸½kpdiºÖæ˜b~z‰˜=UÑùia«}ª=ÀWÙà ”5”McíØã¥· påù¬—pû`>;üùlÇÓ2f²DÞžÙøÔÙÏ&žÈê¸a C$ÍR43dçiÌøXKbf–¢øÊCf?›ôú¸ù†D^-á·&ÝóÉ”õ37üæsW(wW¨çki€7ÙϾ»B9­|ôõôÌ;-R\ÿr¬ •]³i4³¯×3Wt̰‘‹ùh%-ã$·qžÖad޵³÷Æsáîž7 1§;G/#+˜_>öYx×s²ƒÈå…Íæ“æ E)&À͇Âóô·:Ñü0n^Èt#Ÿò¯1ž£÷D)~±vtçžæp+»:š‹Wñj ©%.g¿s¾“€Óïÿ{½^ODb±8888777//ï&ëèÑ£ÕÕÕßÿþ÷}ÛmKKËrssóóó§yÇq¿ùÍoV­Zµ|ùrß0»ÄDT¯gÎv³ñ*>+˜3X™=c´±ëb7´r>?š#¢/;'þš¢·ÕA†è¶«!ñù‡2å_c< Ki|­ž™FR–ˆ¨RǨ$|œê¶ûs€Çsssív{MMÍ‘#GX–?þl5}}}f³¹««k¶˜}b"º¢c"äüêh!käb¦°—¶‘J2»±yK!¦OD“777$$$""b¶˜}bžÈ`cÕ×'kx•ä¶®Æñ†&.ƒ™u·Ï‡¢”P¼Š¯Ò1YA|Õ +f)5ðvü‹€OÄÄÄTUUÍv3Ã0LbbâlGp[s<ñ<‰\ÃÊDäZnQ«gêôŒÁʈøh%å…q–†mt Q£äûÌL°ŒŸÈŸïf#üêhÎ8y“p’ЦÞÀmŒTDqJ~AøhÂz ‘RP ”¯Ô±6Ž¢•ü- ""âyºÜÇ6Oñ*Tƒ¸):w†ó¯¡·2">BN ¯7Q½ž¹ÔÇF^Öî!7Š£wëGOYÒÇ–ô¹ÜneE å„ò绳ƒIÑð^>eÏæ ±u¦^Ϥò_…¯|_Yz½^¡P8ßîÞ½[,/_¾üðáÃ&“iîܹëÖ­c†ˆJJJJJJúûû E\\ÜÚµkž?¾¬¬Ì`0¤¥¥­^½Z&“9‘Íf{çw,Ë“O>)—Ëÿûß'&&†††ŽŒŒÄÇÇoܸ100PØY8×ÀÀ€R©LJJÊÏÏ:¬ªªú裄}/^¼víZgÿ®Z­Ö¤¤¤ 6( «ÕúÊ+¯ûœ>}úôéÓDä,¸çyþìÙ³ÕÕÕƒƒƒR©4))iõêÕ*•ÊÙmYYÙñãǶnÝêË¿;€L‘¦U2ç»Y¹ˆ†sñ*ªÓ3':®Âes]&檹+Œkf:ŒŒû¦²~¦¸  %ZnN ×8Äœré°ÃDz+³2ŠË ãÚÌùîѦ+:¦RÇ„ð Ã9 K%ýÞÖƒEçùÑœh¢ž& Cøk¨%´(œKRó-ÃÌí7ü›†«ƒZ†™1³Ôûˆ¥ühnUGDIêÑ«H¸ñ«Žƒ§+Ìâp>3ˆ«Ò1íF¯þ\a|¸œ¿ØÃÚyÊ ºãG_À‡Ãl6Æ’’’«W¯æææº¶Úíö .¬_¿~áÂ…—.]jhh ¢Ë—/>|888xýúõÙÙÙµµµï½÷ž°AAÁ©S§¢££7lØ0þü+W®|øá‡ãOzøðaN·uëV¹|tz¸ÆÆÆ¾¾¾Í›7oذ¡³³óý÷ß¶ çR©TëÖ­›3gNiié„¦ØØØ­[·nݺU,ž`®¿ÆÆÆþþþÍ›7ççç_½zõðáÃD$‘H¶nݺeË"ÊÊÊŠ‘„à¿üòËøøø 6,X° ¡¡aß¾}wýß¾ªª*³Ù\SSc6›=ÿ‹Ü4SÌzY3ÈhåüÚÑ›¼\Ì\êeõÖÑÇÉñ*>VÅõQ´’OÓð…=4d£@é¤MD¤³2Áü¢kÏÈ%,w©—5ÚI)&"3´,‚#¢98¸òÖÊ‘”¥:ý a\êe-^]¶û¢óɨdb•¼U‘FÊt±ýf&ôÚ=s‚x£"7qµ)†(A5º¨p ŒO˜èç‹>3³%Ñ¡’P„‚zFxûTÙ¸Õ1Áb)K̵?NV0ªƒIPóÊ;|èŒWQQQQQ!¼NII37Nggç3Ï<˜ÐÖÖfµZ‰¨¸¸855õë_ÿº°Oppð§Ÿ~ÚÕÕÙÛÛ»páÂuëÖ M2™ì‹/¾0 ÆÙç¥K—®\¹rÏ=÷DEE97J¥ÒM›6Q||<:t¨»»;""¢¸¸866vÛ¶mÂnJ¥òøñãýýý¡¡¡jµZHÊ<8þº¤Ré½÷Þ+th4Ï;g±Xd2Yzzº¬‡……9szAuuuzzúÝwß-¼‹‹+))1jµZØ’››k0fþ—¸éÜeö<ÑÐÕÞÑJžzÉ`e‚e<1ÌèT‡ fŽkâdMù×ÒbOvŽb"¢;£óDêò?“Pñ<mŒDÆÛ™dÍõ0"ä|¥î&ãœ,Œ!¯â,×žÇ ßa†l×÷Wññ·Á¼1 / ´1twìÔOÙ¶°Ã¶±O×IE…/üì_ø^JJÊ’%KGww÷¹sç>úè#á‘¶ 88X¨Š‰D<òñ<¯ÓéÒÒÒFFF„}ˆhpp022Òy¬Ýn·ÙlBNl4™}[[Û‰'æÍ›7fœndd¤óuLL éõz­V«Óé–.]êlJNNvföî¯ËuLmdd$ÇqB‡nQ*•ÝÝÝÃÃÃBN\\\\\œësæÌ™3gŽûóÌ"w™=Çwcµ·°Ž’Í‹Š ½Î޹љ1ºžKxmç'(:Ÿ°„Ƈ& ƒã©|€-¸agîöËwf¸þØÊ(Þ1.m’^ßR©cX†Z‡?˜1 ÆP©TÂcò¤¤$•JuðàÁ––a )•Ê1û;‡ÃqîܹsçÎÙ.ü÷ìÙ³åååƒÁÙÄ_ûWÆf³}øá‡b±xÆ cº‰®ÿÞ-Tרl6á\Éõ{„×6›mÊër-Ñ:·Ûíî¹çž{öîÝûæ›o&$$ÄÇÇgee¹ÙÜþnõ´—{ÙêA&=ˆVpb–úÍTÔw' ÉL äÕ7$Á®ðmb¦_|Ü/øÕ;Âô™™¥Üå^¶j]4%®à%<îììtfö 3ñ¿*wÝuWff¦ë–ððp":~üøåË—óòò¥RiWW×É“'ûX­Vžçm6[YYÙÍ[ËcÁÁÁ;w©ijj*,,¡‚_(vr>g¶Ñ •‰UÞ”À*…˜OÓðz+_¯gæ‡zuÀíL(@çÝÖ_ŠD"–eårù„sMVTTÌ;×ùH~Ìcr†a|ðÁÒÒÒ“'O¦¤¤8g¿³§PÍ/‘HD"‘H$r}BïlšùÅ]Dz,Ã0Ρ±z½¾··755U¸º¬¬¬¬¬,Žã>ÿüóC‡%%%ÿáàöÄ2D ßeºža71ÇÛY G ‘ZÂwº4u˜"Òxñ”ÚÁß0ºÔõ¼“aˆTâÂè™…µ’¢@ ß:|½v¨y˜y§VäLË0óQ{¡ÇÛÌ×͇⤔ðƒÖÑ*u¬ëC>4l£–a&3˜gÊâìÕé±P€ß&³wØ:Ã0!!!õõõÎ/555/½ôR[[9×Ñ¥---®Ç* aJ‘H$LVãÔÚÚêLµ‰(00a˜àààææfçnBÓ”EöSÒh4}}}Âë‹/ ø?~üÂ… ÂF–e“““9Ž3™LΣjkkßzë­#GŽxyv€›DLDÙÁüÙnöd£ä‡lT=ÈÆ(yµ„ˆ(=ˆ¿ØÃogãT¼ÁÆTé˜H(¥á©ËÛ&¥àk)˨$Ô;ÂôŒL먴@¾¨o4ŒA+Óišú"ê73„<XP\\Üßßßßß¿jÕ*L·!1‘°ª(wEÇ´ÙŸ¬á„~iÎââjõLa/ âS5|žweÖK"¸óÝì+f(IÃç†ñ':¦Î³ƒy³ƒo00Ý#L¼ŠŸÊŸœÆQuz¦öÚæ6#Ófd¤,ŧ:Ü7¹‘¢á‰¸Js±‡•°¯âsÃnX*QÍ÷™™Hïý¬—n>ÁÜÞÊñWõ OL‚ê†Å¶&äÁ%Û8ªÓ3©šë—“Ìne[†™ gÛ€;Qsssss³H$ Z°`ÁÊ•+§==}ýúõD´råJ‘HTQQQVV¦P(׬Yã:Ò 33³££#11i=Üž˜Ï>Û1|u ZèãfÑòH.îZ‰ép80 n½ÙÉì†ùîw¿k±Xþã?þcpppVbð-‡Ã±k×.…BñÄOTUUµ··ÏvDðÕ2;uö«V­JIIÙµk—¤õžçÿüç?›L¦;vÌv,ð•ÃQ||<ËNœâ{Ö4¥µk×655yvømËd2}öÙgóæÍ íXà«…•Ëå¿øÅ/^}õÕ5kÖˆD"×6Ïš¦¤T*ÓÓÓÏž=ëºQ,¿òÊ+¿üå/†¶Üwß}{÷îMMMõèº(::zß¾}+V¬py÷îÝ[·nõ¬C"zýõ×÷“––æºÏÙ³g†ÉÍÍõø,±¬¨°°P«ÕnÙ²%??ßjµ¶¶¶rGDv»Ýƒ¦)¥§§¯ZµêÀ}}}ÎÇuttlÙ²¥¿¿¿©©)((è‡?üáéÓ§=:44´|ùr¥RyáÂaËÂ… —/_þ׿þÕ`0xÖgGGGaaáùkÒÒÒX–ýàƒÌf³s£Ñ¸qãF“Éä¿HÀèᇞ¬©¡¡áVF7›H*“ „††nÙ²eÍš5v»½¹¹™ã8Ϛܟ233sÑ¢Eï½÷Þ˜)qzzzbcc×­[wâĉ'žx"<<ü·¿ý­ÕjõøÚBCCW¬Xñé§Ÿ !}ýë_øûßÿîq‡]]]í×äää,_¾üücMM͘Ý/^,‘H¾üòKOà+Èì¾:®Êwuuýáxá…úûûŸzꩤ¤$/›&£P(ˆÈd2ozçw$Éüã+VìÝ»whhÈ›k»xñ¢\.ÏÊÊ""–esss ½éÐ)>>~ûöí§OŸß:22"—Ë}r"€iºalVVÖ3Ï<3gΜÚÚZ×R›&$<†—J¥ã›þñdddÔ×ן8q“ rqõêUN·páB"ÊÈÈP©T—.]ò²O"’J¥Ï=÷œN§ûÓŸþ4Ù6›ÍûLßè|ö999=ôPFFFuuõ¯ýëòòrçž5¹!”¹MXï.Œ åyÞ›«ð<éÒ¥¼¼¼]»v-X°À`0Œ¯œñÀŽ;¢¢¢þýßÿ}²¶‚‚‚½?Àô‰årù‹/¾˜ššZYYùË_þòÊ•+Î6Ïš¦ÔÒÒBD‰‰‰Â W!!!>ø`MMMzzúš5kŽ?îÝÕÑ¥K—î¾ûîÄÄÄ \¾|Ùû/ ‹-Z¿~ý»ï¾[__?á'OžôòD3")))Ù½{wuuõ˜6Ïš¦ÔÝÝ­Óé,X0¾H}ÇŽ6›í?ÿó?Ÿ|òÉG}´°°ÐµÔ~Íš5?þø•+W^yå•iž«¢¢Âd2}ýë_ŒŒüÛßþ6¦u¦†„„ìܹ³¢¢â“O>™lŸ¼¼<†a<ø³xƒ%¢÷ß²LÔ³¦)9s&///,,ÌucNNÎÒ¥Kß}÷Ýááá¿ýíob±ø‘GqÝA˜ÅrñâÅÓ<‘Ãá(..^¶l™Åb_,4ÓwîÜ©T*‹ŠŠ–-[¶üµZíºÏÝwßÝÓÓ㓲€éópY/:tÈf³=õÔSÎu©Äbñ“O>YWW'Ô± îß¿íÚµ®+U;vLoÐó‡:tèë– .¬]»V­VÏhæ™ÎÎN"šp¾Ë™vø½ï}ÏMkvvöÓO?]\\|êÔ©é‡à³“ÙÑÉ“'ƒ‚‚yä­Vûúë¯[,–)‰ŠŠÊÉÉÙ½{÷ŒN4þ|Žã&\Ö³'´aÆ;vÔ××ÿ×ý—÷½ÌÔ¬eöDôᇶ··¯Y³fš Í>öØcz½~¦æ,\¸°¦¦fxxØWNH*•~öÙgï½÷f²€Y1›™=N]Ø·ß~;,,Ìl6O¿ÿÀÀÀ”””={öøªÃɃÅlu†6-ŒÛË0´ëhmIC¿—§¼5ŠX¦¹gx^bð£ùÉbsæJ——g¸]ÏìE,ó¿6¤+eâŽÓkŸ\1šíD¤ ïX›–ä«óݲMûŸ>¯~hERþÜȇV$5÷ ·ôN°X€¸^gŸ?7*2Xn±q<\-¤õDôô†ŒÌ¸ ÊÖÁ¡ß,­z‹;c[ŸÑ‡ç»õvêLMÝɪ¹ ÁÍ=(Èÿ4úÌ>>\ED}ó Ñ:«ñÜõ"Š Ç3{ð[£™}ˆZFD=zó¬s³tŽQ¨Z6ÛÜ,£™½LÂшÅ>«ÁÜ,#V;É$¢ÙàfÍìODñKÒú‰ˆ%"»ƒŸí@n–ÑTÞ`²QR:«ÁÜ,ÂuL~8„@0:7N—ÎDDÑ¡J±ˆµ;f0åƒË—eDt ˜Þ:\=löÁõ>ù.»t#>é à64úÌþj§Áæà%"f^bÈôÖ(¤«s¢d6)BµhN˜÷Ñø¼C"’IDYñÁDTÓ6è“nC£™½ÕÎÕ÷ц¼ËLó`³Õn½¶>ÔLôߺ‰hÝ]ÑR1;ƒùƒsMßX™¼f^Ë2ov-¸ÿÿÞ-šðøa‹*@¬7Ù®vÍèÄ· ÃyI!ß\“&b™ªÖÁ3W:gÔÀå†i. *»?¹ÐÂó”?7rEVÄ”3D¯L±Ìç—Û8ÞsJú°Ã`•ì©»Óe¶¶Ã°ëh­/¢¸}‰Ç¼?ZÒÞÖo¼{~ÌÙªî)Š•2q}‡a:;O‡;Ô [N•wšmŽÏ‹Ú8y=ø9F¥Öxs¼ˆe¤"£Ùg‹×ú¼C€¯²ýû÷OÖtìØ±[ ø­(…çyáµ·‹Î:8Þ·Y¸Ï;ø*ð6³€Û2{€ÌÀ ³ðÈìü2{€ÌÀ ³ðÈìü2{€ÌÀ ³ðÈìü2{€ÌÀ ³ðÈìü2{€ÌÀ ³ðÈìü2{€ÌÀ ³ðÈìü2{€ÌÀ ³ðÈìü2{€ÌÀ ³ðÈìü2{€ÌÀ ³ðÈìü2{€ÌÀ ³ðÈìü2{€ÌÀ ³ðÈìü2{€ÌÀ ³ðâ[y²»ï¾{²¦£GÞÊHÀ¥ýïf;„ÛŠ}¶€[ä–fö4Iï&ã€é@5€?@fàÙøƒ[]gp;[™¶<%$D)¶Øëº‡–u [ìD”ôÍ¥qÂ>Cfû¿\5«aLÏìFmÈÖnÍŠÐÈ$"&X!Yœü̪$†!"âxÞÎñn¶C˜žÙIEìšôp":ZÙs´ª'M«ú__KŒ HÓªj»‡K[õ¥­ú¬hÍÓ_K˜íH&ÆÑ= bWfGŠE<¿ÿ§¯%ω ¿ý[ëçÄ…)ozt¾¬<”¦’ºÙ'D%•‰Y":^ÝkwðUCŸ”v¯îµØïŒõåŤiU³Ì&±F!Ù+1rc•´Ÿ­ê¶]û­1;!xevÄÊ숆®¡Ã—۪ۇ奄楄V4ë_nk鞥ঢ”®Ï _”"bI*f÷^llO!­çxr¦ò§jû¦s –aÖd„寅)eÃ{CŸñÓ².ýˆˆ†îÎÔæ%‡($#6GM×ð'eCf;©Ä¿x “ˆþÍó¢’”-¦=Z…g*+Z³"5dEjHcŸéHewMþiø*ñ¬¤²U§‘Kã•YñAË2"x¢Ž~£ƒãû –ýHD".\¹hNxf|°ÁdëÕ›‰ÈhqD‡*âÃUË3#âµê>ƒYo´Ny²”””†††éoð@èŠGˆ(L%}நo,Š ‘[íÜÉÚ¾#Wºm~²£‚’¥É!<ёʞÉö WËò⃬vîdÍõ¤k^ôúL­:@,b¹T«¹Ð¨spüÆìˆ{æF(e"–edb6:(`nL๫W¸"[¯ahW0æ ÅÞÙŸC‘Dc·çLëèðT´2[¯f¨Që‹ðs™½Ý9}udfVHVRa.Þë ¯ dÀänùÝ¡˜YËdê“+²u%ÖÔ±[¶äÖþø"´ÉÌŸ ôG¿l¶[ÓTï)2h™’,}Û dÚ‡ýÃþ²¼´×ëò3ê‹fÒ%ùF¯ç>oCyÆ UÅ™ºTµ’ÅŸ\,!„€’"«²ups(ðó=ךÊ5ÊÄ9µ›W”äQ?ÛXµf-_Ý€Q?+Jr¿'â Ŷ¥2z•bá ·Gp{dúöÈôc.F–áÞD°s"¸+3õDuf†>)'M €•9mó™=I•Ɔò ƒ–€;_秤ÉÚ§¶=¿Ëª¤IY–»Ÿ¾´Ìá²ô½;ͤ˜ ®ïâB¡Eˆ²<+HÉ rÏE-6¯/òð’Ñ•QÒ÷Ÿ?qêxéÂë MJ¢ =ä…IDAT²<<=Xdz±l»IÃ(("ÑDÄžan57Å”4Y“k¨+2%nåqÇ ¡-„Š$všÊ3Œ) ¹ÂmöÉ $)©%Ûêž±j’hI†»Cþ¦6‡kš5¦$Õ—§Wš(’ˆ Ò•.WË=g”[É¡„Bhuñqé³_ú¤(4î١ߣoŸùÍæõ„bkwÓ¸ô@©(ËðÆ¾¬Òô”¹4Iü{ ¼\‰Ð¤ ÷çŸ+4ªJ–¡c"ØÜëu¹W·¯Îü¡NQ)N{:±O?à 5¶9œÁD[5õí†*†’d¸3àk¾ëðÌÌ&š>z­œ$€ãÅ–÷åNgtU÷B¡ÇÄ bs¯÷j¿o±®ÐX™­«ÈÒ]²Oït/5„K@ ¤H^” 6?MÃÐ=Îczv©QsÌ>ü¾G|0¹×«‰´þì-GûÄŒ(É4¤ë’V%ÀÈ7kÞªÍNV’ mc3{½ÞðþAmLtˆüáØTˆkls ¹8ïðEâ’tËhnw$‰3‡ãÅÖnו.Ö#„Ú°bq©Åæ½6à«ÍK;Xdó³ËtöGøX\bh²n§ñ7ÛT®I}¬ÌJ‘0è]®NÝáQVPÄ¡bÓ%Û”^­|ïÀJñC»sn`€å%YÎ7«-Zf5Ã[À1=¥;“Á‹½kXz„Úàh8ý«MXìtÑ,/~zöî¢Mûç¢×B¡†K—íS×ýË?À¥+vß‘óÑRË‘K¢ÞäF|,¼TaÝ›k €m}êxé,/~ò“-—Z|‡ŠLGK,GK,‰©¦Y¡c|†‹K3¬ S)Þ?˜ ’ œ Òµ1r‚øùyûò"„6=–ÉÑ—j´!„ÐÿË£d½M=–kò F ÃÆâƒÞèNI–€"ˆ…Uò4I(þ~wû…Nw„‹ïËK3¨œ ÙÝá¦O”àë›ã/WZ·§$XáB—ûp±I¥L^›ø)@„ÐæF?¼ B!´e\ð]XäÕ³çÚ&ϵM.:D¸Úï[ô…µãö‹‹ƒs_;Á¹Ïa.~ò»®Ç^/BÍ#ŸôB!„B«3{„B!„6ÌìB!„Ú Ö»Î¾¾¾~ïˆB!„ÐVð :YKi“9IEND®B`‚pudb-2025.1.5/doc/images/pudb-screenshot-light.png000066400000000000000000002205541511510750400216410ustar00rootroot00000000000000‰PNG  IHDRø¸O–Á pHYsÄÄ•+ IDATxœìÝyX×Úðw²‡$@d ²(«ì*› ¸/׫]l«­Ö*µÕ¶·¶joýºS­¶õvÑz­ôÖ*jkݰJ” ‚Š â†+kXBÈ:ßccŠ ‚øþž>}’™9gÞ33Ä7“sέN,B!„B¨¡õt!„B!ËÃD!„B¡>}„B!„ú LôB!„êƒèòIiiibbâš5kvïÞ½gϱX\YYéïïÏd2^¼xñ–-[vïÞ}øð᜜+++77·V«8púôi’$½½½;Љ'þûßÿ&%%8q¢²²200Á`P«Ž?¾iÓ¦¤¤¤´´´²²²€€}„¦•2îܹs}ôÑï¿ÿþÌ3Ïtf{“¥¤¤lܸqÛ¶mÇ/++ó÷÷g±XÆ‹,^¼øÎ;]ÚQVVÖÒ¥KwïÞ½{÷î–––ÐÐP3¢~lhµÚ矞N§ôt,m{Ľ÷Þ{r¹<$$¤“EY„¦]ئ•2ÍÏ?ÿüßÿþ÷Ÿÿü§e«í%'E&“½ôÒKÖÖÖü¸6Y{Á?ÊSùØÉËË{ë­·lgggd³?çM¸ØB/†þŸÏíµ×t:Ý­[·’““oݺµråJ‚ Œ—ž0aBssó©S§¾ýö[6lØ0ÃU*•*;;û矦ÓéãÇ7^Û¹sç~üñǨ¨¨‰'VTT9r¤±±ñÝwß±Xœ˜˜8tèÐñãÇWTT¤¤¤TUU}øá‡&—2B¡PlÙ²%--ËåvtÍ•œœ¼uëÖ#FL:µªªê?þH$FhšAƒ-]ºÖ­[×õ£Ç½{÷ärùÍ›7{:ôžd)~ÎãņÐåA¢Ïb±¨}ĈÎÎÎ7n¼|ùr‡÷ЍRqqqŸ~úéæÍ›£¢¢¨¯úU£Gþ÷¿ÿ––Öa¢¿wï^??¿eË–Qo­¬¬víÚÕØØhccsôèQŸ+VP«lll¶mÛV^^îââbZ)#aüðÃyyyñññuuu‡6³™Ž?ðÎ;ïPoÁ¶mÛd2™@ °ø¾ììì¨[A?üðƒÅ+G‹ñãÇ‹D¢öt è<)ÈR:üœÇ‹ ¡'JÛ}ô©ýÎ;¯ˆ ˆÉ“'×××·yŸÀ××·ªªªÃJž{î¹ùóçëß$YVVF’dEE…áOƒ€òòr“K1gΜ¯¾újâĉl¾%K–¼õÖ[ú·NNNÐØØøvžL4-$$¤;¾I"“áIA ^l=Qm.¥z±«T*X¼xqppð¢E‹¨Uyyy«V­Zµj•¯¯o«R®®®PSSãééÙj•D"±±±é0š°°0÷r¹œ F£Ñ¨Õj6›­_uýúuhnn6¹”ÎÎΆj) 0|›››Ëår©tŸ’–––””¤ÿÉBïøñã{öìinnúˆÉd>óÌ3›6m’J¥111óæÍ£.•ö/I’LKK«©©áñxsæÌy¸]J¥òÿþïÿärù×_-ŒŸ”öTwœ”î`äöá&—••-Y²äí·ßŽŽŽ¦¶T(óçÏŸ9sæ”)S: Þø'ÛÃǰÃO#JII©¬¬´±±2dˆáÕÛæ¾$ÉâÅ‹‡zõêÕŒ7.11100pÙ²eµµµí­¢ÑhF®(#ÁkµÚíÛ·§§§k4š¨¨¨ððp3O¢ ›áÑèÒ¿)¡^¢í;úW®\ãý[F¥ÔJ¥’z«ÑhäryccãñãÇ/\¸0a„®—––&Z}mÐjµ[·nݸq£eKõ.\8yòä?þñÃáÂYYYr¹<;;›ú£wõêÕÌÌÌgžy&&&æìÙ³›6m¢–=z411ÑÙÙù•W^5jTvvöªU«H’ìpïùùù÷îÝ{ûí·ããã¯_¿þå—_v¦”wïÞ]²dÉìÙ³/\¸ Ðx»Ú+Õ^» Æ‚ ®^½úçŸ@}}ý®]»ÆŽëããÃb±–.]Ju‹9räÒ¥K—.]ªCbš={öìÚµ+ >>~Ê”)yyy Z­Öx»Ú+e¶êÂ~úé§'MšTXXت]ÆÿÚ+¥V«<8þü©S§9räâÅ‹`ôðîÝ»÷×_õõõ?~|ffæÚµkuÓ¦MË–-Óßmï¤9P?)ݤ½#ßf“û÷ïïââ’““£ß,//O£Ñ„‡‡w¼ñO¶ö.6ãŸ6mJKKÛ¸q#u >üäÉ“ß~ûmgöEÄôéÓ 322žþùœœœüü|㫌_QíøðáäädŸ¹sçr8œ]»vuæLaÂÅfü›‚ê ÜÑ'IR&“étº»wï&&& …Âàà`jÔÿýgdddddP¯‡ 2iÒ¤.Õ³{÷îÜÜÜE‹ÑétNG-”J¥ß|óÍåË—§L™räÈK•²¹\®ß£ž••NïLq‰D²~ýzooïV·å&L˜PSSÌãñ —·´´¬]»–ªœ ˆcÇŽ577[YY=z4,,Lßé_$mذáæÍ›ÿÌÒ —Ë¥~·¡flܸñöíÛ­~pè6›­¯°±±qß¾}T„ÆÛÕ^)#í >|øöíÛ###“’’ ÆìÙ³€NeánnnÉ„²²²† ¶`Áê­¿¿¿X,nhhÐσÑf»Œ”2¡ñSiÂù2Þy·½#oþøc¦¯Ð°]í]6ÆK]»vmýúõ—/_nii£‡÷öíÛS¦L™7oµÊÊÊjëÖ­µµµ†³9räÔ©S¯½öšá5í#Êâ'¥›´wäÛkrddä±cÇ4 5Znn®“““»»;ÞÈ'›‘‹Íø§M›:äïï¿|ùrà «««ÛۛŀÈÈȰ°°;v„††Ž;ö—_~©¨¨ ~ÐnsÕ!CŒ_QíüøqÃ0¶nÝÚ¥þ´3íb3ùß„Poð ѯ¯¯×÷twvv~ÿý÷ ;½˜`èСÿüç?Õjõ­[·öíÛ÷Í7ßPSt¨¹¹yÆ ¹¹¹óçÏ3fŒ~ùÍ›7ß{ï=µZýÑG999µJÙM+eAË—/—H$­¶ÙÇ©M»víR©Tï¾ûn«/QQQQQQo?hÐ ý–AAAüñGuuµ‡‡Geeedd¤L&£VQÿüTVVvø¡l¸ŸŸTUU™“è{yyV®Ó骫«õ¶×®6KuØ®yóæ½ýöÛ_~ùeIIÉ믿Þ}ÝO…Baiii}}=Õ]Çßßßßßßpƒ6ÛÕa©‡‘$i¼Éø|µáSO=¥_B‡)/+7'Ñ÷óó£òu}…†íjï²1^J$988“Éüøã¡£Ã«ÿ¤R©TJ¥²_¿~P__¯OôKJJ’’’ÆŒ3nÜ8Ã0Ú<)ÔÕkÚêêIé>íùö®ÃÈÈÈ…††êtº .ÄÅÅufGF>ÙŒC®ÞŠŠŠ#Fè—ÄÄÄ8::ZYY¹°©¬4ºØô/4 µe{«Œ_Qí}èI$’Q£FéWùûû'''wæšÆ´Ï^„P/÷ ÑK–,¡ÑhŽŽŽN¬Ù}A[[ÛÀÀ@âoܸÑa¢¿nݺ²²²•+W>|3&<<üÝwßm³s¡i¥,«“wîÛ¤V«½½½-õ«1cÆŒ9Òp õ‹ùãÎx»¨>c&Aí$‘H´nݺììì‚‚‚ÇïØ±cÑ¢E111ÝQ úî©|ÄÚ»*Ú;¼IIIG8qbHH‡Ã)--ݱc‡~…B¡Óé”JeZZZW{$ör<ï›o¾±HUADDDäææ.X° ''ÇÚÚzРA©ùqdüŠêýðƒ¡ÇWÛ³îüm ÃðÖˆ‘»k÷îÝ{{û‡WQ·.îÂÞÊÅ‹/^¼¸`Á‚Vù:ƒÁ`2™ Ðçë …¨.˜¦•êUô= ÌÄ`0h4š@ 0á;›áY¦”™}·,¨ÃvÕÕÕíÙ³gРA%%%iiicÇŽÕ¯¢ÑhAèÇËVWWß½{·ÕLM]Âd2££££££µZmbbâÆÜá¤RFJµáСC7ùQž¯ö"¤Óé†TÔíO“þ,Öùvuµ”ñ+*###&&&>>žzÛêÞ0AË—/?~üøŽ; …kó¤0Œî8P¿°Mcä:ŒˆˆHMM½yóæùóçÃÃà ¿nu5x‹Cê0 ^&“]½zuРAÔÀ*Ëž/ãW”‘ ÃèÖsŒ‡aÚ¿)¡Þ íYw 999•””è?‘‹ŠŠÚÜŒ$É?þøÃÆÆ¦ÍÇpdee@‡U?wîœ@ xø¹ZA8;;ëg6€¼¼<øk^ ÓJQ²³³—,Yò¿ÿýÏx`Ý­¦¦fË–-Tx­t)B‚ \\\rssõߩΞ=;sæÌ’’’Ëže*ÃY>-βíÚ²e “Éü÷¿ÿ½cÇ}wRª¬½½=õ-’““ÿóŸÿ˜vRRÒ¡C‡¨×t:}È!Z­Öð¹m¶Ëx©6#ì°Éò|µ¡³³ó¥K—ô›€Kÿ®ÍÖÕÊ•+WôM¦*4lW{—ñRm¶¨½ÃK’¤Z­6rÚêCÏÚÚ:444>>žÉd¶šÝ¥Í“ÒMʲ6Å„"#×app°••Õ***ZõÛéjð?†ÔP\\¬_rêÔ©5kÖÈår‹ï«Ã+ª½ ø|ù²i˜ÃœSB½AÇwôcbb¾ÿþû„„„Q£Fݾ}»Õ'TuuuVV–B¡ÈÊÊ*..~÷Ýwõ·m¨UjµúÚµk'Nœ ì°ßέ[·„BáÙ³g Rö˜4iÒO?ý´zõêÈÈÈòòò”””*e7­%55µ¬¬¬¬¬lÖ¬Y­f“x”L+E9räõëמ3î >uê5¬•®FHå‡Þ¼y³••UddäìÙ³©#âÄ ±XLmvþüùóçÏ[YYé?åýüü|||öìÙ#•Jƒƒƒ_}õÕníïn©vi4šŸþÙ××—šÓC(>÷ÜsÔŒ(>>>TÙ§žzJ.—Ÿ}„B!„ú LôB!„êƒ0ÑG!„B¨¢üÉ'æ”ÏËËûý÷ß©§ˆK$OOOƒÑjµZ}ïÞ=[[[sv„B!Ó”––YûÊ+¯TUUéçBÍÏÏë­·ÍÙiQQÑ{ï½'—ËCBB:³ýâÅ‹ïܹñ𪬬¬¥K—îÞ½{÷îÝ---¡¡¡æ†Ð“£uRÞ%¥¥¥;wîôööŽŠŠª¯¯ÏÌÌ”Éd/¿ü²~NwêÔ©´´4N—@„Ù#„BÈ’<== ¿ ”––áééifµ÷îÝ“Ëå7oÞ4³4hÐÒ¥K`ݺuæ×†Ð“ìDÿܹs|>þüù4 ˜L¦X,V(\.´ZíöíÛ/_¾‡Y>B!Ô yzz&''k4ê7ùÒÒRggg+++3«?~¼H$8p ùÚÙÙÙÙÙÀ?ü`~m=9ÌJôãââÆŒCeù ‰ ¡¡JôSSS‹‹‹gΜ‰OFD!„z-///FsçÎê.þ7üüü̯–F£u²ÓB¨›˜•è;99¾½|ù2‹Å¢¾s766ž:u*,, ³|„B¨7óòò€ÒÒROOϦ¦&‰D2yòdjI’LKK«©©áñxsæÌ¡nçÀG}Äd2Ÿyæ™M›6I¥Ò˜˜˜yóæ‘••õÝwßQÛL›6mîܹú}¯Ž?¾wï^©Tðꫯvfœ€X,>~üxYY™µµu@@Àܹs­­­©}íÝ»÷Ì™3UUU'44ô¥—^ …ú‚iiiIIIAAAË–-3÷ "Ô+Y`Ö…BQVVvðàÁœœœ‰'²X,8þ¼V«3fŒZ­Öéðá»!„P/åàà`mmMuÓ§þO¥þ°wïÞ_ýÕ××7>>~üøñ™™™k×®5,«V«<8þü©S§9räâÅ‹ðW—ú¥K—2™ÌVû2^áÕ«W333Ÿ~úéI“&~ùå—$IþèÑ£‰‰‰ÎÎί¼òʨQ£²³³W­ZE•Ú³gÏ®]»âãã§L™’——— Õjõe³²²äryvv¶\.7ùè!Ô›™uGŸ²ÿþüü|0ì¥sãÆ ‹•””TUUÅd2ƒ‚‚¦OŸnø•!„B½„~<.5Wß±þöíÛS¦L™7oõÖÊÊjëÖ­µµµÔ¯÷píÚµõë×;88^¾|¹¥¥Œv©7^¡J¥úøã©.ÁB¡pëÖ­·oß0`€‘È=öÎ;ïPoE"ц nÞ¼éé陕•5lذ P«üýýÅbqCCƒ>ø &ÔÔÔóx>>uuu)))nnnúÝ¥¦¦–•••••Íš5 'ÞA}’¹OÆe2™999………</((hêÔ©Ôxù¼òÊ+©©©ÉÉÉ<oôèÑãÆ³PÌ!„²0ªÇŽa¿X¸pá¦M›:ÄápFŽ9kÖ¬¯¿þºÃªNœ8!‹©×çÏŸ?þ¼•••—¯ÐÏÏÏÇÇgÏž=R©4((èÕW_¥Æ©066>¼yóf++«ÈÈÈÙ³gS¥^xá&“yòäÉ?ÿüÓÆÆ&$$dΜ9†ƒ FŽyýúuœ^õa„F‹O³B!„ú2}–Œz¢XrÖ„B=^fΜÙުݻw?ÊHB‡wôB¡>ïè#ôd2}Ö„B!„P¯…‰>B!„B}öÑG!„ž\ÙJ—ž!Ô]ðŽ>B!„B}&ú!„BõA˜è#„B!Ôa¢B!„Pdî`ܼ¼¼ôôt‰DÂãñüüü¦NÊf³`Íš5õõõ­6~ã7ÜÝÝÍÜc#IÝííñ¶ƒŸ² žÖƒa$%%mÚ´©´´ÔÑÑq„ \.W¿¶±±ÑÃÃã»ï¾›7o^ÏňBè uéäá ©{*ïYÙ==k1“Åéé z☕藖–îܹÓÛÛ;**ª¾¾>33S&“½üòËðÔSO©T*ý–—.]ÊÏÏçñxæÆ‹ 99ù_ÿú×´iÓâããoܸ±iÓ&‰D²eËýTÒo˜ú#„BƵÜôcÿ[ã3xÜSõ•÷.ÛÝ,­ŸöÖç=BO³ýsçÎñùüùóçÓh4`2™b±X¡Pp¹\???Ã-O:%‰ìììÌ ýeíÚµQQQÛ¶m£Þ ‚5kÖH$>Ÿ?cÆŒiÓ¦=ûì³4N§ˆD"hhhhµYCCÃ;wBBBÌÙ%¡Œ IDAT2ôþûïõÕWú·£F"IòÚµk2™lðàÁ›7o Ôét¯¿þú¿þõ/6›-z0Z„BO”O/ûò;ú·nþC€$ëÊo÷`H=™Ìº£ïäädøöòåË,ëáÛö$I†††š³¯îPql5AcÚ†ü£öÌV­²‰ï9¼_ø, ]=)»–®–VÒÙ|Ž“Ÿ0ìy:G Ó(ïü¶ˆ*Û·¿!o?è;ëßÛ·œ# °þ µ¢üRÕ‰oE“?`Û{ÙUŠeãÒX|ŒÔ(¹.Aý"_¢s:ÈË[Ýž§¾\±X,GGÇ/¿üòË/¿ü׿þ•””äààpîÜ9*ËW©T#GŽ´µµMMM%6lØðᇊÅâððp‹W„BñåZ>KÀ¡_—4kt¤£€Ò_Àf<¸x§®¥°\fÏgE°éL…^CF¾m‘Ë€ÎdY6l„P‡,0ëŽB¡(++;xð`NNÎĉY¬ÖÉyyyýû÷ïývHº±è~‘³­ýÇIKŽ+Ê/€ôʉÚì$¦À±_Ä,ÞÀáò;ç«N|@ÒèL‡Ñ‹F/Þ€(‡Ñ‹F/æ¹w6Kns_ÐRQ¬j,wõšpÈ3ÍeùµÙ[»ÚФ¤$;;;ýW©ääämÛ¶%&&À;ïÜ¿§Âb±¾úꫜœœíÛ·@eeåêÕ«ç΋Y>B¡ê&•¬Eænà̯’ªòïÉ ×ÞkhQkÉŠF¥ZKšPù¥ôÃ\Ó_ ‹ê,sgÝ€ýû÷çççÀÌ™3ÎkkkËÊʦNjþŽºƒª¦´ÿôÕ ¾=ÇÉ¿¥êšNݲ+iV®¡TBLk§šÓ?«jo³ìð<ÂIRL[žG×Rä6÷ƒEýÀqòÓ¶46\JÑ©4fgÇÑ®Y³æèÑ£?üð“É©TúÖ[oÍž=û¹çž³µµ}î¹çžzê)êøÇÅÅ͘1ãÓO?ýÇ?þñᇲX¬O>ù¤KM@!Ô'1hÄ`7Øó™Jîjµ\­%™t‚Z;ÐŽ«Pi,ý’Î;½oó Y_]A£[ å@u‰þêbccýüüŠ‹‹8@DXX˜áÚüü|‚ ‚ƒƒÍßQw`œ|{ è çñËHR#«¶rªU6QÛ0m]@Ý$aÙ °ð¾€mP-«ß uš¦–Эà ¥Ré¢E‹Ž=úå—_¾ôÒKÔBkkëääd777˜0aÂü1|øp}‘Õ«W‡‡‡Ïš5ëìÙ³ëÖ­ëׯŸ9-B!Ô7Ør†¯IšUZ›¿ŠlØ"vWëT67ý±iÕ‹™cæ¾ó‹ÅŠê4 $ú......aaa‡Þ»w¯———­­­~mAA»»»PØKÚÓ¹Ö­–: ©Ó6¦4¦üm¹Vcñ}ÝG{p:H­ªí- Ô××Ϙ1ãÆ»ví;v¬áªÀÀ@ýkÃ,D"Ñ¿ÿýï?þ8<<|Μ9] !„PŸE#ܪ§ÑБ¦ôÒÑki’î^³¤¾òî3ËÖ‰27>„I,ù;Zlllfffqqñˆ#¨%‰¤¢¢bÚ´ž|°TGÚ¥À÷Åð·&–mÿnÚ—i.\xõêU±XÔ¥‚$IAtùçW„B¨“R6~VW~{ö§›ܽ{:„ž\¦§ž:îìÙ³ú%Ôjµ~ ÕoçñšX“ 1€ ÑÙ|®(Àð?:÷þTAA€NG½Õ4Õ4ßË‚Î$µÚNj:¾+o2±X,‹?ûì³®fù_}õÕ°aÃrrrôÓð#„Bt3ÿìÍü³£g-Æ,¡žez¢O£ÑRSSÓÒÒôKJJJÀÙÙY¿$??À€ÖÖítYé‚iíÜ|/Èû©|óó·¶ÍWV_ÓoÁàÙ©Ë©7ÒË©’Œ Àà;(«¯‘•j©ºÒ}1¦¤¤ØÙÙÍŸ?¿«W¬XÁáp~ûí·gŸ}öÓO?­««ëŽðBõ%Ê%µe²Ž7€kç3¸›Ð13º5*„P‡Ìêº}ìØ1:îééÙØØ˜‘‘!‰|||¨µ•••ÕÕÕ3f<~ç6“kNÿ\)^Ë¥k‘5^Ne;x±Ü–à{E7äd\ØEcóe×2¬Ü€ï9\’™X%þš7p˜ºþž¢ª¤û",((pttFëµóíÁ÷ Òâcu9¿Ò˜\žÛPÛ!Ï€A§v› ©:UsÓ,’$yáýÂgoà0¼FZ’V—»“ç& Q¾¡›"”J¥×¯__°`áB±Xl$ÑW©TË—/ˆˆ æçqvvþ¿ÿû¿>ø`Μ98•>B!#úÛ²šÕöüÎN¯©lnª¯¼›¼áo38¿øi"×}„)B£Õõt !„êFb±¸½UÙJ—G BèQ²ä<0!„B¡^}„B!„ú LôB!„êƒ0ÑG!„B¨ÂD!„B¡>}„B!„ú LôB!„êƒ0ÑG!„B¨ÂD!„B¡>ˆafù¼¼¼ôôt‰DÂãñüüü¦NÊf³©U/^LOO¯©©áóù“'Of0ÌÝB!„ ×ÏgûßUKó;¿œìéXzB™•y—––îܹÓÛÛ;**ª¾¾>33S&“½üòËpëÖ­ßÿÝ××wذa555§OŸV«ÕO?ý´…ÂF!„P/¥jiþsÛ÷—Ò“Y\^OÇ‚ÐͬDÿܹs|>þüù4 ˜L¦X,V(\.777×ÊÊjÞ¼yÔ*¥RYPP€‰>B!ÔçýñãÊ›gÇÍ[ÚT_“säמ¡'—Y‰~\\ܘ1c¨TD"444p¹Üææfkkký*¡PØÒÒ¢Õjétº™#„B¨7‹™µxÔs¯õsñÈÜØÓ± ôD3k0®“““£££þíåË—Y,–xxxTVVVTT€V«-((pssÃ,!„êUt$y¢¤6ãZ½~É IóÁüêúfµ~ɺ–#…’s·;Y§­“k? Šê: ̺£P(ÊÊÊ<˜““3qâD‹Ç···ßºukYYÙï¿ÿ^UU5eÊó÷…B! ¢DHA}³úvZÔº’J¹‡WhÅÔos¯¡E­%+•j-Ùs‘"„ºÌÓàìß¿???fΜN-d±X¯¾újbbâºuëh4Úœ9shþ¾B!dY–‹-»¸B.²a•7Ñ"ÀùoƒhÚq*­ƒ€Å¤=$BÈHôcccýüüŠ‹‹8@DXXµüÊ•+õõõÎÎÎUUU/^ôõõÅé5B¡^(ØEp¢¤öÜÍÆZ¹z°›€ÅøÛþ"¶È†ÝS±!„Lf®;...aaasæÌ‰ŠŠÚ»woCC\»vmß¾}‘‘‘K–,™7o^QQQJJŠùûB!„Åq˜4?'^­\-´bzôãöt8!˰ä“qcccµZmqq1¤¤¤¸¹¹MŸ> ˆAƒMœ8ñÌ™3µµµÜB!„,{ß#Ô÷˜žèëtº³gÏRóêP8¨Õj’$+++}}} â~g>’$ËËËÍ !„B×¢Ö]­’÷ã1õ£rB}€é‰>FKMMMKKÓ/)))ggg‚ x<^UU•~õ}€Ïç›*B!„ºÅ¥rFD ´qµå—ËUáÚŠF剒ڂ2YO…‡2Y£c£££;F§Ó===322D"‘ >\,ÿþûïlllÌÊʉD8«.B!Ô»Hdªòå`7‹N táW–ÔWÊ» ôܬU4)µMJ…¿3'ÞAè1bî“q™LfNNNaa!Ç š:u*õ4ܱcÇR« ¸\®¿¿¿~B!„z I”Éôcp9LÚ g^ay“G?Ž~*ýþ¶ì†fµ=§×Dè1Ch´ºŽ·B!„ÐcK,··*[éò(#A=Jx‹!„B¡>}„B!„ú LôB!„êƒ0ÑG!„B¨ÂD!„B¡>}„B!„ú LôB!„êƒ0ÑG!„B¨ÂD!„B¡>ˆafù¼¼¼ôôt‰DÂãñüüü¦NÊf³©U¹¹¹§OŸ¦V…„„Lœ8‘N§›0B!„×ÏgûßUKó;¿œìéXzB™•è—––îܹÓÛÛ;**ª¾¾>33S&“½üòËpñâÅÝ»wûúúFEE•••eddhµÚiÓ¦Y(l„BõRª–æ?·})=™Ååõt,=ÑÌJôÏ;ÇçóçÏŸO£Ñ€ÉdŠÅb…BÁårO:%‰æÏŸOqæÌ™qãÆq¹\ËŽB¡^éWÞ,8;nÞÒ¦úšœ#¿öt8=¹ÌꣷpáB*Ë‘H ‘Hüüü¨,BCCµZíÝ»wÍ‹!„B½]̬ÅsWþ2xÜÓ=BO:³îè;99¾½|ù2‹Å²³³Óh4*•Êðæ½ 477›³;„BYV“R{¢¤6ÌÝÚUÈ¡–htä…5~NV¾N÷;ÞÜ©k),—ÙóY‘l:S§­“kw…‹ê sã€B¡¨««ËÍÍÍÉÉ™6m‹Å"I’N§«Õjý6Z­H’4w!„²>›ÎgÓ+¥J}¢_-UéHÒÙ†­ßæ^C‹ZKV4*ÕZ’I'z(R„P—Y Ñß¿~~>Ìœ93<<‚ …eeeúmîܹcþŽB!dq"öÍZ…Ž$i•R%E·æ<ÈÚq*­ƒ€…Y>B $ú±±±~~~ÅÅÅ ",, † rüøñŒŒŒêêê£Gš¿#„BYœÈ†}­º¹¦Ií(`‘$TIUîý8­6ÜàG=.,軸¸¸¸¸„……>|xïÞ½^^^¶¶¶qqqõõõGŽIII!bÈ!.\0_!„²,¡“äUJ•ŽV­\­Òêœ1­G¨O°@¢¯›™™Y\\sæÌÉ“'×ÕÕÙÙÙ©T*LôB¡ÞÉÙš])U…ô‡J©’Í õã1{:"„˜>½¦N§;{ölEE…~ ‡Ãj nmmmSSŸÏwwwçñx˜Lüà@!„z‘ [¡Ò6*4•R¥“5 {â#Ô7˜žèÓh´ÔÔÔ´´4ý’’’pvv€­[·þúëƒgdܼyšŽ!„B½=ŸÅ¤ת›åJíÃÝñ+•'Jj Êd=BÈdfuÝ‰ŽŽ>vìN÷ôôlllÌÈȉD>>>0jÔ¨={ölÙ²%  ¡¡!##ÃßßßÁÁÁBa#„BÈbh8 Ø÷Zè4ÂÏjµöf­¢I©mR*üù8ñB³ý¸¸8&“™““SXXÈãñ‚‚‚¦NJ=(7""‚$ÉÌÌÌC‡q¹ÜÈÈÈI“&Y(f„BY˜³ û^C‹£€E§µNåûÛ²šÕÔ]ÿ‰ !dB£Õõt !„êFb±¸½UÙJêE£BsòjÝPwk7!§½BÓûè#„B¨Ï¨’) œ¬[÷ÛA=¾0ÑG!„T6ªúY1YtL ê;ðï!„zÒ)5ºúf5>' ¡>Æ’ÌB!„ÐãˆÍ Muìé(B†wôB!„êƒ0ÑG!„B¨ÂD!„B¡>ýdžT*Ý»wo‡›åææ<‚xB!„Po†‰þãáÒ¥KÆ [¶l™L&3¾ebbâØ±cM`!„B¨w²Ì¬;uuu_ý5¬^½Z¿0;;;;;["‘Ÿ)S¦°Ù]›·KQ~©êÄ·¢É°í½:ܘÔjjÏmSܽÍzÐ8›àtfZùGaÅÕJ)AúEû8t)B‹Ð‘ä)ű~ŽííýÚµk3fÌprrJMMÆkÛ°aƒ@ xï½÷˜Læ+¯¼Ò ñ"„B»~>ãØÿÖ¨ZšßùådOÇ‚ÐÊ2‰~zzºN§£Ñü>½oß¾Aƒ 6L"‘deeÕÕÕ-X°À"»k“ìÚɦ뙶!Ó4òÚú¼}lOŽs@‡¥.ܮ˻S?Ê×AªPŸ¼RÝ_h5О×}Aš@§Ó½öÚk\.wÿþýNNNnÏd2×®]+•Jßÿý#Føùù=‚ B!=UKóŸÛ¾¿”žÌâö®RzÒX ÑojjÊÍÍ5ÌòàôéÓîîîú;Ê %%E"‘88t×-ó–Š"¶‡mè ’Ôi[dÚ–º¸PJkä"nŒ¯£Ž$åJM³RÓMá™lçÎ.\عsgg²| AÿùÏÒÓÓ?øàƒ={ötkx!„P+ü¸òfÁÙqó–6Õ×äùµ§ÃAèÉe>úYYYZ­6((H¿„$Éššý___H$æï®=:U3Í‚ 9YÂÕ™R-j­‹4‚x!Ò#°¿M÷Eh𤤤I“&u©”µµõ믿ž––VVVÖM!„BmŠ™µxîÊ_{º§AèIgî}•JuæÌ™   {{{ýB­V«ÑhX,–~ÉÝ»w@©T¯$uõvËod‘:•{˜•ë`õ²«'e×ÒÕÒJ:›Ïqò†=Oç@§’“$Iê´ Ój•M@ÕÁÏ…-j­ŽŽÔÒÈf•hp˜tjí…ÛõîÔÕ6©¬Xt;Þ¸'+ÖýcµõôMˆöqH)(oViƒ]m'87*Ô?¤]õvä—Õ+œl8CÜ…G *<ì­f†¹§oÔäÝ©oT¨¹Lº¯³`¬¿3›ASit_½LU{òJõÉ+Õ`ØY¿¡¡áìÙ³Ÿ}öY«àƒƒƒccc ´~ýz¹\>vìØµkמxúé§RSS[õÔß¾}û|0zôèmÛ¶?D!„žâ˵Կƒ†Fû…VLêõº–Âr™=Ÿ9 S·Ãl\-"BÈ$æ&úÙÙÙ …"66¶¨¨¨Í t:Ý‘#GN:Õ™Ú¤ÅG¥ÅǸýC¬Ü†¨êï6äx°êʉºs;x¿8¬FZ"V5”¹Lý€(OþT#¯¥6»»ë_À8ºÎXc|_?eÜhT¨©×ߤ–€ÐŠõÆȹUw¬°"ÀÅ:Ì£_C³:çVmµ¬%~ÔƒÁyúFÍÄ QY½"ãjµ—Ϟς †{Û§]®bЈ?‡Ô¢Ê¹·#ÿÔUIúÕêWÛÞVR…úlimC³zv”“N<æF’ä¾ ÷]l‰¬ÀQð`Èr~~>DDD<ÿŸþ ?ÿüsqqñǬÑh¶oßn¸Á€ìììòòòZÜ»woccãáÇlmm%„B}^ˆ«@«#õo‹Ê›T÷¯;_p¯¡E­%+•j-ɤ=#BÈf%úZ­633ÓËËËÕÕµÍD_.—oß¾ýÖ­[ÑÑÑ™™™V(»šÎvðv³„z[—»SÕp¿ç‰ìJš•k¨ÃèEÔ[¦µSÍéŸUµ·Yv¢ê´êúÜß:Óvȳ@c°Ú¬ßÐŒ!®™ZTÁ ÑÆø;€þÃëü­:'ÁÓCݨ·v|Ö¡¼²ŠF…ȆK-)«W,Žó±µb°ãÝ­“«4:j¹Ÿ“ÀÇIv¹ÊÓ?Ä]˜ZTY/Wð«e-‘í&:S›±tqq¥T¡¶æ2ýEÖ:’Û_dÝ*HªãÍÀŽŸÇã­_¿FŽ)‘HþóŸÿH¥Rkë¿Õàééùp×ùóçß»w/&&³|„Bà$xðfi¢Y¥ênÍa>èÜ;ÐŽ«Pi,Ìòz¼˜•èçåå544<ûì³m®-++;sæŒZ­Žïׯ_lj>Ijäµ|Ïáú'_éåÔû«dÕVnC©ž9À´uu“„e7€íè ,+ƒÍu<ÓÅ­Ÿp˜tf8ÓIB\åç,ÐÿŽiÏg@½\¥OôûñY¶VL Óˆ‡ €†f5AuÔÑ¿ î‘<vÿ;ƒF«SkI‡MJ5—i>^ÿöüùóyyy ,ptt¤Óé ÃÅÅEŸåSóí2.AcA#µ*ýR£6\Egó;ß3Çdt‚ à2é|rVÁ½ÆWÛIA"ê­F«3\K#‚Ý_wøšU™ÒÇIPPPÐå†Ëåò›7oΞ=ÛÜèBõuÊ[µŠ_?ÓB¨0}}‚ | …Bj ‡Ã!ÂÎÎîÚµkú¯^½ <-‹ <;EE±~AKõUý*¦µsó½< ï§ÈÍwÎßÚ6_Y}íájÌD`Çg_«’‘eÞ%Ò•ÉEwëšM®S«Ó± ¦/¸U+oµ —)‘ÝŸ{4»´vÏù»Ôë:;;9rÄ„=zT§Ó1¢ÕòÇGFF.[¶Ì„:Bõ= µ.ï®ÌÏòv´jsƒŠF剒ڂ²N=‰!Ô{X¬_M+#FŒØ¿ÿ/¿ü(‘H²²²|||:|,®À7¦þžê?¿çº Q×—µT>Húm'לþ¹R¼–70J×"k¼œÊvðb;xwGðÃ=íç—m?{;¨¿\©É¾Yë*´r¶ýñ×ìùo×q™4.«¬¾ùN}ëï ¡®Âô«Õ'.WqYô‹wL¿ó /lܸñÞ½{®®]›–øçŸ0`À°aÃZ-ß¼yóÕ«W¯^½úá‡âÄ;!„òîJUZ“5«¼¡E¿ÐÏb1îß ¼Y«hRj›” g>N¼ƒÐc¤»}*¿<{öì¡C‡ø|~xxø”)S:,e0IÛ"“ßÈj©ºbå6Ô6tFuújßk$H‹ÕåüJcrynCm‡<ÓåÎòêf Ù¥µÇ +ØLú gë¸AŽæìjJ°(åRù™µ,-ÀÅ&ÎÏiwîà FúØ·h´ùwH DÖãÿšˆ^ýõÍ›7/[¶ì·ß~#:į¿þzúôé7>\äé§Ÿ>þB}¢ßß–ÝЬ¶çãôš=fˆVýÅQ/´cÇŽ7Þxã7ÞXµjUg¶?uêÔ³Ï>³k×®îŽ !„Pï'‹Û[•­ty”‘ „%Óûè£GæÅ_üè£6lØðâ‹/67w0Tà§Ÿ~zæ™g† ²eË–GB!„ê0Ñ<,]ºtûöíZ­¶Ãyñ[ZZ^ýõƒZY™>¨!„B=î°ëB!ÔÇaׄžLxG!„B¡>}„B!„ú LôB!„êƒ0ÑG!„B¨ÂD!„B¡>}„B!„ú Ë$úuuu+V¬X±bE«åEEE |ðEöba$Yéåݸb(3³*½¼['›³ªzøð 7÷ 7÷ wêðiÂç¤JÕ©H4š 7÷¦uë,Û>K25BÕ™3UA²5k:¹½âСûÇÐÍ]úùÊG¡iH•ªqù{U¡ƒ«† mZ·¾SeÚ‰°zøðÆåïõŠ-Ù×k+ÜÜk&M&ŠžŽ¥m!B¡Çeýôôtîoóñ+•Ê={ö$%%iµZ‹ìÂò‚Ôh¤J4šY«ØÑ#…?þh»áÎ?§Éþ¹qé²GÒ’ÞKsíšN*U_*ìäö¬ˆá? ü‘`³»5035oßÑüûïVsç²ãâd_­ÌÌêéˆZëå¶;Ö´~½`ùrmYYw|Ï1FˆB¨`˜_ESSSnn.ö·ï »víºråÊŒ3¤RiFF†ù{étƒú?ÝÌUtW7ÎÔ)À6àp›~øA°â}ºË“û,«_¤È ìäöt‘ˆ>Uðî»Ý–ÙgÄ2S IDAT”§2˜ÁÁ‚¥ï‚F£«­ÕÕÖôtD­õæ5×®7,y‡3u ÿ_o1|¼ë¾Æ æ-\ØÓq=€"„ê,pG?++K«Õ.œ2eÊÛo¿=|øpóëïFL&ÁdÁ þÏ4w•ÎäI@’šë×»-úÇÎ5ŠÖ¯_OÇaad£”&0ý¶náNŸÞÓµÖ›#”~ú)ÍÚÚæË/€3y²Õ¬Y²¯×j«ªz:®0B„B}ƒ¹‰¾J¥:sæLPP½½½ár;;;3+ïnƒTšÎ¤þÏ0sÕß*g±€”Ë©·ÍÛwÔL™Ré7¨zøð†wÞÑÕÖRk+ÜÜ+zÂ_Ým »q·ê½­• ?_Á[´H¶z5Áæ–.•~ú©2#ƒ×n“™LëÏêf¿ØüûïV/¼ «®–}ó­Õ¬YÌ!C€àó¾¾6¶²búûëß¶wõZÃÛ‹áåÕ’šÊ1ãþ~O¦“j5gâ„îˆlj"ÿ>Š h<´óéA±ùâ ²ùÁ([éÊÏuõ ´þý»#B„B}’Y‰¾V«ÍÌÌôòòruu}}§¼‹Ô ¦¿¿èîóW‘*•®®t:ÕÅ‹²µk™Ì€hÞšÄ7VøßÿR›1z6¼û®º°Ì™:4`øùRýû;Ou1ÏñTÝÕ•5b„êÜ9]óý_.×æë¯€5l˜VRÓôäLFŠC‡9S&[ž@mÆÕ¼}‡V"¡‹DíîƒNï0Â6Ã0ÞÛžàñlÖ~MEËßSïÊoÚ14¥ÉÍ[“Xáaýþº7Lwr”&|®¹váãm»n=ÙÒ"ýì3‚ͼÿ>\®‘ª:>†ds³Ý¯;î÷ yRu¾Œ4ÙÈÞŒDh¤]Ô’ö®(Îĉœqãd«W³G¶šõ‚ôÓO57o±ÛÍóØ£Fqþ1U¶z gÒ$iÂç“)xÿß(hÿê5R„J£ïÿ:ÑÒ¢“J¡i4gâyÒ6R­&˜Lh‹éùšmB„’ñãõß¾ôì`j¤”áW)ù/¿hï•Ù~û-uÛÞâ"„ê“ÌJôóòòž}öYKEó¸SìÛ§Ø·zÍ &&ètš[·8“&êêê¨U _ÐÞºm×”Þ`øx³"€f- ¬xìQÑTÕ9¬ˆý/ ¬Ãå¿ü¢¹{—9hiMn7B£íº¿‹‡N¥öÞ= ~¶¢FÛÓi÷³guÇSÇZò‰$6®~þUNŽÍW_Þ3Бö®^#E Óhéª/¤«¾€N¤ÑœI“šþ»Quæ {ôhÐj•iiÜçžë¦…6Je«…†·äS_¾,[õwÆ î³ÏtS„!„ú$³ýôôtGGG¹\®V«@.—s¹ÜV3ð<9Øqq¼W_•ÿø£:?ßnß>‚ÃR­¦é‡ M?l0ܘìDªd­QÔð€¿½ni›Õ«ëfÍ–DbŠf Æ™>½3wMÂi!‡ Æ'7ùšÐdj_Ô¹»¡• ·°¸¿í‹zÝÒbñ˦3í2áTAwv,y[ºê æ!V/¼ÐÉRí]½FPi´N&«_Ï›ÿ gÒ$èDÍ<˜îäÔ’*f­ÊÉÑ54Pývº#Bº—×ã Ï…dKKÃoÒœœlVÑ™íM‹!„PŸdz¢¯Ñhªªª !!A¿0!!á7Þpww·@h!º“{T4M(¬™2¥yÛ6Þ«¯êWY½ðçŸÿ4ܘ9¨³}ñÛCÐŒõÕ~cà@‡Œô–#GT§2å‰?IW¯±ýúëNÞ#´`&3ávS“™î¸lŒ°ø©$©Á¸F˜ºsOýôA8ÕÉɾ‚=a¼òøqXùyKª˜fgÇ ï¦ Nèuø›EúÙgš›7í÷ï#øüî‰!„PŸez¢O§ÓãããõoÏŸ?Ÿ——·`ÁGGGKöcr&Nlúï­^z‰àr &ètšPØnO:h4Rsÿ†Ÿöî]Í•«ìqc ›4¸g‘‡_,wÆ îŒ Ñ4®ø¿†åËÙ±1´¿Ï˜ÔùMãoíjj‚Žzº›| ¡ëM&˜L`0þ¡\×ùv)ÂvÃ0Þä.ê®vµO[YÙôý:VD¸*'·yçN«Y³ºiG&ãLœØ¼m»º°Hyü8gÜ8è¶Ÿ"©­v¦ëNËÑ£ÍÛwV¬`Ü=¡!„êËLÿ‡ B¡ZÂéÜïÑ}ÿÝwtµu÷gú£Ñžž-b±þ·û–#G*ÜÜ©iy‚î⢹v•z'ÿéõ¯½twwUNÎÿ³wçñMUéÿÀŸ{³5Ý÷ÒtßYZ¶²ÊÖ²"|Ýý©0#â2#322 ŽuÅœaPÜEq ­¥ÐB)ZBéNÛtKšýæ÷Ç…Û&M“”–òy¿|ñjî¹÷œçžœÌ<¹9÷\ºñ ^mÖ1£jzãMå† ×_…’ÔÒë¹Z¥d!B»™Ÿ—&=ˆÖ²·í9e–FFjÍÒÑ9BDÂè˜Îd+íÃO¹³ºè¼,ãoöùôSéìÙÍ+Wqõõ]Ôqw÷^»F2~¼í‡HÆŒa<<”ÿú—þòeÉÔ©]›xø0ɸ±­þë𠽡²²ñ¥¥’±cÜ9ôqkEýã5©©ËW8±N虜ðd\hKÔ¯ŸËô{”þãöøãŒ››û3‹–ü¥î¡‡¥sfsµuÊO>''‹“oþjïúÀÿ5ðaÓ[o³>>-_}årÏ=D$½nÃó/Ô=ô°tÎ}a¡æ×_ŒŠ‘ˆ›V½£¿Z*2ÄPU¥Ü´IÔ¯Ÿw¶¡ºü|ý•+DDz½¾ø’ê»ï‘Èt#•^?¯Ë—•›6 ûöåï´r”}}hß)»>þXÓ«¯ÉŸ|Òåî»õÅ—[6mmºcÕníÃO¹ÓtÍyµKs4C½÷¯Õï²ÞÞž¯¾rmBJóªw¼ÞYÕmñ±X:wnçŽ ]&NT}û-#•:ë—'j|i)ר(™8Iµw¯i£dÜ8ok¶¤å¿›õ/é/^òXúëååp˜Ðs!Ñï*K–ÔL¹[ùégîÏ?'?Ÿˆ?nzõ5ÆÃÝeÚ4¿-5Ÿ'àþÜs\S“jçNâ8—™3<_{ˆ¤sæJËZ¾ø¢é7\î™æñ׿ÔÿÑ¡ {ý+#‘´ìüZµ}; ;ÖcÅr§+´¡-_}Õ²y ÿ·æàÏšƒ?3}n¤¶âaÃDƒ+Ö­ãêê$cÆx­|›ŸÆmå(ûúоSv{òIF hÙ²µéµ°~~Òÿ›ï¹|¹-½d]gû°ÃSî¬.:¯¶Œ:]Ó+¯ˆ†u}à"b=–,izã ×à—Òï9\¦NU}û­dÂo½•ô—.’ÑØdvù»ÇÁDßeÖ½Ú¼<ÉØ±Èòz=Fohý€.umôhÉØqü:ßÝKWPP;íï?¼nѰÃ,ekd·2¸•îÐu0ˆHsè0 ŽÜYÐc!Ñ€;—zÿ~ñ°a¬·wwà|HôàÅÕÖêNŸv¹{JwÐ%p3.ÜjYYÝëï|µ¤»£è*¸¢Ð !Ñè…èôBHôz!$ú½s}¹\¾lÙ²eË–™o<~üøš5kV¬XñÎ;ïìÙ³G§Ó9¥-§P}½«2,ÜPQa¾±vöœú§t]£Ú¬¬ê‰Í«V9«BN.¯ W~þ¹û_=ºñ¥¥¦—š_~© ×<Ùñ‘z}eX¸bÝ:»Âì’ ;¼Uß ¶êީ嫯jïžZŸpí®1+^1ªTÝtç$úéééÇ™o9{öì®]»üüüî½÷ÞÄÄÄãÇïØ±Ã)m9… DFD\œkll|i©æÈ"2Ê嬬 Ÿ®¿pkjÒ9ÛuM@gõ¾7Eý¿ÿ5.ý› 2ÒóÕW]î¹§eË–†%Kº;(èNXG_¡Päää°ìï¾3:t(""â±Çã_J$’ƒ* wwwÇ[tœ@&#"N^G Ó²mëë#?ÞPW'èÊDßõ‘GQQ¢º® è¬Þ÷¦(ÖýS<,Ùgãø—¬‡{órµµ¬¿÷·˜®ègff †ÄÄDóS¦L™={¶éeLLŒÑh¬©©q¼9§`ƒƒ‰a8¹œ«ª""CU5éõÆæf,¸ [$ãÆ±¾¾]ØtV~StçÏ“ÁÐÙ£<–,ñL{ÃôR”Þ?×íÙņò åÇJ®únÝb:Ö¨Ñ(þ½Á3íuÝ©SÍ|(?A2i"iŽ%"ïõÿÔ5½õv£~™ÏljH<|¸Ï† DÔð§?µÄÒQŠ+?þX2i¢ËÝwëÎo~ÿƒ.ívÃ`\\|6l Ž«_¼X:k–ËôéD$LHàQ~þyÓ+¯ºÜ;Óõ±Ç ¥¥ÊO?Óùÿð1ŒbíÚæ5kÝ\ôô •UÊO?ÕåŸ Øÿ“ýv¾7„±±Dd¨¨0jµ5)©ý‹ûŸþd¨¬”¤¤å7Åz„D¤ÍÍÕ—”¸?ÿ¼¾¨HùŤ7ðï—ÝkeÆÝÝÿûïÿügãß^V¬YëþÜsÒÿ›ÏˆD6ÔŠjÛ6Ö×W””ÔÙàvçP¢o0222bbbBCC­$ú<þü¼yózÎ}"Èdœ\NF ¤Í;m”ˉa}ú‘®°ÐmÁSž¯½ÆïÉzx4¥¥**L3øµ§ò„†ŠïºK{ü8×¢ä·3R©×êw‰HüP}à ×{«¯G w‡¦îäåå544¤¦¦ZÚA­Vùå—?ÿüó¬Y³†îH[N'ɸ:¹¡ªJ4 ѨVëKKY>òÙ°Ïòj5W_Ïgÿܵk¦c…QQ‚ÐP"bÄb߯¾’Þ{/¿]4p iÑÀ$2ô¿Ÿ7Ò®öâ8Cy¹xì8S‘xäHOÙž0¬à8ý•+¢¾}9¹œÿOGD†+%DÄêΜå§ë‘xÄïukÁVo°R¡]½ÁH$‚ÐPCE¥þòeAD„þò®ªŠŒFaLl‡ÇZ!>Ü”7‹ïíлlad¤×ûï="7._¡?sÆ–£ŒÍÍõ ÿмvgÚë®<`Ë!ÐË8t/===00P&“)•J~™|¥R)•JùxZZZ>ùä“ÚÚÚ'Ÿ|2>>Þ9ñ: D¦;{ÖØÒÂÊ‚þþúsçMìZ­âŸëU;wÊËo`¶~(Ðnæ3¡¯ÿ­VwI»Gu:2—›EIë#…Ba|<ëãÓa¶èlðFŽôzÅúë?úýv-y­\)èáš±ã$ãÆŠGr™=[d=+ÚÔíÆÆòOKp™8Qµg¡¢‚Fm˱–ü. þo{ße[Ô;¦X·N›“+NNfm˜ÿÆ54È~XùŠïŸK&L°±èeìOôõz}uu5¥¥¥™6¦¥¥=ûì³áááD´mÛ¶k×®=ûì³ÁÖ¯ãvV&ãêå\Cƒ ¨¤;3Ño~ãMå矻>þ¸dü8ÆÕM—ŸßêJ ËtGÈ­±žž?ìÞ\|ÐeÖ,ó-¢¾ D$ŒŠ 8’®Þ·O{4C¹ñ㦕«¼W¯–λßî í#Œ5\.6ª5®ÿïñ–­[uçÎ d2ÆÕÕî o1ÍÑ£Š5kµÇ‹GŒðݺE2n\ÇÇ5¼ð'ýÅK~{¾õïßÕ@e¢/.\hz™›››——·`Á‚ÀÀ@"******š={vÏÌò‰H,3TUU*6(P¤=vL:_Ô²k—tÞý^o]_‰Åhó•W'bD"Ì›v< FêjÔhnV¨RcË“ bY£þúR†ÒR}Ño’‰©$°>>’qcÛoN,–Ι#3‡ôúÆeoxé%Iʄ뫹w¶B޳¯7„q±ÚÌL®±Q#ˆˆÐþš%Œ‰±åÀö#œ<ɦcÁ¨PÔ=ô°./OÃ0qf|||ø-...DTPPàææ6jÔ(ç…êdY°Q¡`½½‘ˆ âššLkk’VËzzšöÔfeuC|,+ Ñf½Æñã­v1”—7½þºæ—_l¬R©=q´V£&óW ááÉ0™Lá7þ•òãOêŸ~šXV­>pÀ´Ö»z߾ʰpí‰"jzãMå† 7JRSH¯çjkí¬Ð†Þhÿ”cãô%%†ª*AD¸02R›•Å߉kç)ßBŒ»»ËÄT¿Ý»üvl·=Ë'"õO?±¾¾n>jq‡¬IMm\¾Âa@ÏÕUkq”——{xxœùýƒqqq®=fÖ„ (ˆþF[AŸ "ˈˆFãÜÚ±ü_ó6½õ6ëãÓòÕW|ðîÏ,jXò—º‡–ΙÍÕÖ)?ùDœœ,NJDŒDÜ´êýÕRñ!†ª*å¦M¢~ý„f·jt¶Â{£]¸X£B! eÄbAT·¿éNÜß”v#¼•Ü_|ÑŽ£tg Ø€Õ¾}æ%ãÆ™îåhùïfýÅKú‹—<–¾Äzy9!P葺*ÑW«Õµµµ[·n5ßhš¾ß#‚À@6(ˆˆØ>}ˆ\.y½ývãËË”ÿùã*•Κåñ·¥õ ÿàHS-_}Õ²ùú2üšƒ?kþÌxxôé(qtÿ㸺:Õ×_ke»L›êñ—%õüÝEeÉØ1êo¾q™6ÍÆ0$'z¯[«Ü¸±éõ4ÖÏÏí©'=–-³ñX÷çžãššT;wǹ̜Á¯J$?Ÿˆ?nzõ5ÆÃÝeÚ4¿-%–%"¿þ•‘HZv~­Ú¾ Œë±b9_d_…öF»X//Öß_ED×ÿ½>u§Ã7¥Ý{>cs³¾¸¸áÙçÌ7ú»Ç”è»ÌºW›—';Y>@ïÆè \Ç{A ÞûCý3Ï<`þð&€8pÀRQ¶Fv+#€[É¡uô¡KÕ=ø`ýâŦ—šôtF*„…ucHp»Àó2{.—©S›^}­ÑËK<4Y{êd˶mnXx- ݉~Ïåö䓤Õ*ÿ»Yµc'ëïïþüóKì¹;î@˜£ÐËaŽ>À sôz!$ú½}€^‰>@/„D rN¢/—Ë—-[¶lÙ2óyyyk×®]±bÅÊ•+wïÞ­ÑhœÒ–ÓU1±Ë–‘&#³*&Výý^‡Šz ç$úééé÷»e:‹‹‹·mÛæææ6sæÌÁƒçæænÛ¶Í)m9 Ãõú벌Q«%–u¨ Çp³ ENNûû|÷øñãîîîO=õ¿]$8p@¥RI¥RÇ[tF ˆHÈÿ+p° ‡pÂÕèÌÌLƒÁ˜˜h¾155õü£)û&¢††Ç›s&‘ˆ ‰ˆòÿŠ-è½¢¯Õj³²²ýýýÍ·™¿<þ¼X,öóós°9çb„BâÓtÿ¯ÐÁ"€ÂÑ+úÙÙÙ*•*%%¥ÝR•JU^^þí·ßž8qbêÔ©b±ØÁæœL$bø‰7üµyÀÑ"€žÁ¡«Ñƒ!###&&&44´   íß|óÍéÓ§‰hþüùÆ s¤­®”wŠÿCÔ¯_péUÇ‹z‡ý¼¼¼†††yóæYÚ!%%%!!áܹs{öìa&99Ù‘æÀF%úééé2™L©Têt:"R*•R©Ôt®L&“ÉdÉÉÉßÿý®]»bbb¼½½5Xeÿ}½^_]]}íÚµ´´´´´´£Gr—––VVVÖvç””ƒÁpîÜ9B[ÙE_ ,\¸Ðô2777//oÁ‚Ç?~<""‚_U“ˆ\\\ˆˆ¿ê]ÍþDŸa˜¸¸8ÓËââbó-û÷yä‘Gø—………DÔ§OB[uÕðcÇŽýé§ŸAtttccã‘#G‚ƒƒÍ¿@×éªD?55U$8qâìÙ³nnn‰‰‰3fÌ0ݤ ]ŠÑ¸îŽºÐ,ekd·2¸•p‰ B¢Ð !Ñè…èôBHôz!$ú½}€^‰>@/„D :¥¹\¾zõj"Z¹r¥íEÐEœsE?==ã¸Î@qB¢¯P(rrrX¶ª¬@×qB ž™™i0;U]ÇÑD_«Õfee%&&úûûÛ^]ÊÑD?;;[¥R¥¤¤tªº”C‰¾Á`ÈÈȈ‰‰ µ½ºšC‰~^^^CCCjjj§Š «9”è§§§Êd2¥R©ÓéˆH©Tò‹iZ)€®Æè v&ßz½~ùòåm·?ûì³2™ÌRQxx¸}Í€}8`©([#»•‘À­d¢o4/^¼hz™›››——·`Á‚°°0‰Db©ÈÅÅÅÑ 3èÜ™„vÉ0L\\œéeqq±ù+EÐÕðÌZ€^‰>@/dÿ}Ã;mÅ IDAT¸-`Ž>À Wôz!$ú½}€^‰>@/„D B¢Ð !Ñè…èôBHôz!Á«¯½æx-r¹<--í矞zÅü¿Ñ1~Až’[¤3Ž|ûË ÷n[ZZ¯š¾öW±êå`CûÏ]{pãqþLUZèh_+¤Ž‚o×Ê‹–ì8óñÑ+Ÿ½²ûTEyƒzp˜—XØñ—sKmÍZŸu©F9>ÞßžèrKÝtB¡1Œˆò±ñK½aeÌô>ÅÅÅ–ŠÊ ·2¸•„N©%==ã8–ý] 0uêTÓK±Xì”¶ +0DzÎxýo†´Ž!Æ|‡'ÇyÞüá+½¥ñÙ@À0ZÇt¼cLJz­š›HD¯~wÎõÙÏS*úû= F2U)¶f—U)6=1Ô)çx›º\«lVë «š¯ªÃ1p»sB¢¯P(rrrZeùDäææ–””äxýpkXFÀ2ü¦MFFûÆôì‹í†mŸ@OÉ$Ï"zýûnÎü$BvR¿"šÜ/0ÌWúÆÞÂSWlÿM ÷™;Tæ+MrÎHëcàvç„9ú™™™ƒ!11Ññª  YFȲDtý_Ám–ôY†nß+Mì@D¯)º;îÄ2ÌÈ(_oW‘Sj»ÝÇ<€uŽ^Ñ×jµYYY‰‰‰þþíOüÕét"‘sþ_Ù‰Ö¼¸9»”ˆvæ”ïÌ)ç7.Ú|*ÀC²ï…»¬ÈŸf”<­¼Aí*ŒŠö}.5:ÀãúlõÝ'+¾9UqUÞâë&æ‹Ü$B"šµ>kD”ÏŠ}ùݲ.É_ØvúÓ'’“B<‰há'ÅBvÁØÈ·ö6¶è¦'õyqJ,Ë0Dôm^åWÇKËêU¾nâ»büžŸx½BS[%u-Þ®¢¡áÞšëc–ý|wºrÍÁ‹Ã"}Þ½ßÖ/`Bs#W¾ùo‡¬„ÑîyU7if­Ïëw¦¼)!È}ÎÙÊ}EÉÞïÎKdÆHôeÖÕoó*ª5Rá„xÿ&ƸI„-ZÄÕGøj7¤_Þ~™ˆMˆZ06Ò<~j“«Y¿ì`)B+mÙ¼-øÙù=w¥®eþ†ì7æôŸ6 ˆ/jÑ&±p\äƒÃC;lë›S›2®(4†ÑѾK§Å›Þ/ë£7ÊßmKvi‹¶õQ–Xïy+ÛÒÇaÿ¹kË¿)à÷ytdØŸ&ÇšÚâ#ŒôwÛš]Ú¨Ò%Gx¿<-AæíÒaÏÛ7ænŽ&úÙÙÙ*•*%%¥   UQMMͪU«êëë%Ibbâœ9szÎ4ýƒC¼ÞÚW˜â9{¬¸V¹ñÈå?ŽêÜÁ”€M%Ÿ½2/9äÑQך5ÛŽ—ž¯lþêÃ,³#§lõOÆÆúÝ?TV"Wm?QVR×ò¯GÛVÏ}™uõ¥»ãÏV4mCïò®jToÉ.-¯W¯x‹ˆ]57ÑHÆe» îî8±o Åþn*‘°½ÙVÞ/[ú¤-KZiË–àm‘_ÖHD¾®‘~®~®éEµ¦Dÿ×Ku:7!޿öòËšÊêUO‰¼T£Ü™S¦çŒ«ç%Ò·ÒÒèÍ.®'¢7çô¿tM¹îÐ%ý¾"þ(ke¹ç­ l^»ë7N+–ôæœþ¥rÕºC—þ²3ëFtØÖÇ<ÀíΡDß`0dddÄÄÄ„††¶Mô•JeppðôéÓkkk8À²ì¼yóiΉbÝbÝÞýé·Pé¤~Þ%""îÑÁìççª'ö xijÿrH¸×î“u m §äëÜò¡^>p=_ñw¯9xñrmK”¿k‡ñT4í^<*ØË%9ÒûÔÕ•Ö@D›]æ½zÞõûÜżXÑ –y»|[>.ÎoåÜ|Q¸¯ëëߟ/¬lîwã‹ÊýCeUMêá‘>6fùD´ÿűüqî'–§¶*ý×'Mï\42ÒÏ•ˆ: £Ýó"¢ ñãâüÖº4*Êwöà÷\¸*WÝCkŽ[2åúÅZw‰ðë›4Až’Iý œ‘ˆ¢Üøië­¸I„möò~ÙØ-­X‰ÐJ[o‰ÑhlhÑqFã¥åÊ‹üÝÅüj3)ñþ_Ÿ¬Ð8‘€%¢#¿Õ†úHù/QÖÛRi ÝøžÃ0´3§\¡Ñ»K„ÖG¯TÌò¿G ÷–+µŸf–ðGY‰ÜJoXØü–v‡õ'\ÅÂWf^ˆÞü¡ðBµ">ÈÝzoXó·;‡ý¼¼¼††Ké»T*}ê©§étºÃ‡OŸ>Ýյ㬷'ów—V5×4køIC¼‡„yg4–ÊUOŒ 4í9:Úw QIM‰~˜¯k°— ‰,•3KêT“ÇÞ¬pzR™·Ô]"àÛš`ºÄíïJDå *S†Ú7 µo'Ê-ŸÑWæu=ëã)¡§l=Œ¶çUÙ¨&"Ëð¿ °, †ˆôŽˆøK¶D¤ÑsjOÇk»—ò´ô~ÙÍJ„No‹ˆjÚ)fð‡ùH?ø¿."¥$|‘u5·¤aT´/g4f^’ÏØÇ– ‡y™®[‹ðÞ~¢¬²Aèf}ôöísó—®¾ÁœÑXÙ Ž r·Ò•OŠ¥mÚÒvØt¨ŸÙoqƒÂ¼ˆ¨¼^o5B€^Ï¡D?===00P&“)•JNGDJ¥R*•²,;þ|£ÑÈgùDÔ·oßC‡•••ÅÇÇ;!êî³ìž„Å[òîû×±Q¾C#¼§öäó½Á¨çŒ³5Î¥b©t[ªõsk=©Io0rF£ù¢éÞ®¢”"Òê9=güü×’Ï-1?Dg0Ú{ZK ñlµêÊÖÃh{^Öi Üg™%{OWU5©M9NËÒûe7+:½-"òv½5gËR°—‹Ì[jº”= Ä3ÀCräBí¨hß¼ÒÆ&•n|‚M«ãKD7G”D( "µžëpôšC±€å²Þ•OŠ¥mÒÙaCD"³{3øé0B€^ÏþD_¯×WWWQZZšicZZÚ³Ï>îíý»k™nnnD¤V«©gÐê9ž#"Áجַh DÔ¢5(5z7«Â|¥»:lñ!/¶púûe%®"Ûî“¡¢ñqþG«[:•ŽüVëã*rü1aÎåHoØñq€¶ìOôÁÂ… M/sssóòò,XHDû÷ï÷óóKNNæK›››‰H*í)OYú÷/Åüª;{NUì9UÁo\²#¿ÃUwˆH,`§ š6 HÏWýXôÆÞÂÑѾޮ"!ËhÌ."ò_¤"‰¬Fw³HmÃe~¡€aFkVa£J—_Ö4(ÌË]"`ÆK*²ýá ]йaì;S5#©Ïߦ]ÿÙG£ÿ]G±,Ã2ŒáÆþŠõ¥å¸8?ëu¶û~ùvþš±-Zi˾୘à¿ëdyQ•âÈ…Úqqþ¬YvÜÙ¶øÅg,^»Yú¤XضßOÒ–ùçK©1‘Ë œÞó· ûg&ÎŒ¿ÅÅÅ…ˆÊËË>Ìq×ÿß÷Ì™3 ,,Ì9Q;ìþä ñt¦$øoxtoå’)±ïܸ¯Ô’µ/þ÷ØUþo!ËÜãgàŒr¥Že˜0_éñËõ¦=ˉ(ÂÏ•ˆB|\òJM©FîÕ†#d&ÂÏõ¤Ùž?ž­^²#_¡ÖóEG/ÔrÆë*¬þÖáÓe¦ÖÌßýÎÿ~³¡3ìdKb$Ò8³l/·äwÅyJ.×¶ð/·/}y×YëuZz¿º"BëmÙ¼uÃ#}Ü%Â/²JJåªVS_:Û–õÑk+ŸKÛÈüóu¬¸ŽˆB|®_VpzÏÜ.œðdÜv¥¦¦nذá³Ï>8p`UUUffæ¸qãøï=A¨4ÔG*°ÓJ;ñAIÍ Ùõ‡Š+Ôdž5Íš¯Ž—ƺG¸ÑýCCÞÛaÉŽüññWëZ¶(KŽðæïeœžÔç•=çoÉ›–tñš2§¤Þz+¼GG…½±·pù7cãüKêZ¶f—ŽŠöåW&y|tøëߟ_¼%oÚ€ y‹nkviRˆ¿*?o×ÉŠ+u-WêZžI‰väB©u†Ñ) шHŸÝ§*<\„2oi~Yc^iëï ³oj© ×g 6iëñÒÃEµR±`ê€Àç']_ÕqæÀ>D´%ûêêýÜ%ÂÔÿÅ©1æ“7¦ô,¨hÕ‰å5íÐaõò= oï+Ú|¬T*ÜÝ?pqJôK_Ÿ1ßá‰1ÍýÞüJÎH“ûš–¹´ÄÊûeÅž¼ŠÝ'¯Oè:z¡îè…:w‰Ï­DØa[ ¾C) þ?TŠö5¿Ö¾¶¬Œ^ûXé +Û +o  õ óÜ”q¥¾E7<Òçå{Ìßc§÷<Àmá—5¼3M]“9©_ÀÒ©ñ¹% ‹6ŸÚðè×Ñè9~«V<òɉÌêçøíà·µVOž€¶8`©([#»•‘À­Ô…—{{¾3úò ´G¸­š›Ý«ÖØ-óbË0ãbq_)´ãŽNôM+oø¸Š:õ¼R€ž ý·ÚAa^žRQw=‘ý«î@7’+µç*šÆÇÛôœ,¸ÝÑsôpgÂ}€^‰>@/„D B¢Ð !Ñïå¾?]9ü­ÃWå-*è 0DáœD_.—/[¶lÙ²eí–êtº’’§4ä\S×d¾ûÓoD”[Ò0ü­Ã¹% 2k}Ö›?Z*5pÆáoÞ”q¥SE]êpQM”¿[¸¯k§ŠœÂÒ)[éCëÝÛ¥².ɇ¿uøLy½ûÓoS×dZÙ9·¤aâûG?:\lc…¶ø¥¨&õ½£›]µq»›¥à»kˆZÑvˆj Ü›?Nù0cêšÌO3»çUz`G´Ë9‰~zz:ǵ³L'Çqéééo¾ùæ'Ÿ|b4ÒØ®EkȾ\?±o;ϳRº\«lVë «šXçÅkJ…F_T­pbíêŠà»B»Ct÷ÉŠïò*ç%‡Üãûï_ŠO\©ï®ðz>'<W¡Päää°lëï ƒaóæÍçÏŸ9rdjj*Ã0Ž·’y±N«çRÚÉæ­A‡æ•…ùJ‚<œXçãw…'†x&†x:±ÎvuEð]¡Ý!zü²¼o°ÇÓ㣠œ±¾E'Wj»+<€žÏ ‰~ff¦Á`HJJ:{ö¬ùöýû÷Ÿ;wnþüùÆ s¼°Ãᢚ`/—„>î*‚± 32Ê×¹uŠì¨h'×Ù®®¾+´;D›Õzo©ˆˆ,³æÝÀíÁÑD_«Õfee%&&úûû›ooll4í9U±)£¤¾E;Ô¬7L^•·øº‰ùÞàÃàûpÅŒ¾ünY—ä/l;ýéÉI!ž|Q”¿Û–ìÒíïÚ2pƺôÙ*­ž›Ø7`|Üï°‰ZgxòóÜfµ~ó‚áÞ®¢ýç®-ÿ¦€/ztdØŸ&Çšö´±Â¶vä”­þéÿ÷Ü¡²e÷$´zSZ²ÝƒÍRðÖ²îÛ¼Ê¯Ž—–Õ«|ÝÄwÅø=?1Ú46Ú ¾²Q=k}Ö˜X¿3åM Aîs†ÈVî+JŽð~w^"kö£_Û!Ú¤ÖsœQÏõœ±¡EGD,Ëxºü®­¶£—, Ñê&•0,y»;ÊÒÇüJ]Ëü ÙoÌé?m@齘üAÆÂq‘O‰è°ó¬s4ÑÏÎÎV©T)))æÛsss Ãĉu:@ h;±§{ÍœâõÖ¾ÂÄÏÙƒdŵÊG.ÿq|TÿàŽç3ä—5•Õ«žy©F¹3§LÏWÏKt±«æ&ɸlwÁÝý'ö $¢˜@7"²RÄ;V,7éÍ9ýKåªu‡.ýegþÖ?Œ`ˆ6e”|rôʼäGGy\kÖl;^z¾²ù«? °×ó¡ýךÕúÃ…5Mj½)ã1É.®oÑڜӶˆÏ5'÷ ¼?9¤¢AµýDÙ¥å— †1D›Ž^Ùxäòô¤>Cïò®jToÉ.-¯W¯xéX­žû2ëêKwÇŸ­hÚxäòÈhß»b|­Ÿr»}h^ô䘈ÒzÕöe¦Þà#ëwÿPY‰\µýDYI]Ë¿Üáû•]\ODoÎééšrÝ¡Kú}E|[›³K·d—Žõ›ïÿÛ5ÅŽ\n÷ð·ö]­Sm||ˆ·«ˆˆ‡z­š›HD¯~w®Õž6VØÖ]1~«æJˆè­}¿»ÙÒ)Û=Ø,ßáµä»Ó•oþP˜’àÿàðйjgNYe£z탭ÏÈ2ôøèðõ‡.‰…ìÓã£Þ?páX±ü®?SÍm‡è£Ÿœ¨lTóOù0ƒˆB}¤ß,EVG/¯í p³†¥1owG‘…y¤Ÿk„ŸkzQ­)ÑÿõRÎÀMˆ·õ["€%úƒ!###&&&44´U¢éÒ%±Xüå—_VWW‹D¢ÄÄÄÙ³gK¥RÇ¢ušØ@·Ø@·wú-ÔG:©_€w‰ˆˆ††{'Gxwx¬JkøèF¶Í0´3§\¡Ñ»K„“ú8#E¸Mêw3AaÆRÏU,|ef_>"zó‡Â ÕŠø ÷çª'ö xij¿Ûp¯Ý'+êÚ@Ïëõï*«jRôi›åÑá¢_7ñÀÐvæ|·-ú:·|\œßʹø—á¾®¯¾°²¹_°ÇÅŃ#–L¹~õ×]"üðàÅê&MÐ0 *šv/ìå’é}êjƒJkèð”-õ!iô†=2œ¿¸ëï.^sð"ß_ç– õúðÆl ¾èrmK”«IÅ,±h¸·\©ý4³„o뛓æ~xðâ¥e«c·(ûßÙê¿OO »ÞWž’IžDôú÷­ï9±¥Âv…úHC}¤Dįebå”íl–‚ïðý²dó±«C¼WÏKâ_¸‹?úè„ òóó·lÙâH[=Çà0/Ó5õaÞœÑXÙ v¤Â~f?# ó"¢òzù»K «škš5|Ñ0ï7f÷7eùD”Ú7àëE#ÿ6-¾mœÑxôBmJ‚?Ûæè¶EœÑX*WŸ7´èøÿ¢ý]‰¨¼AED«æ&òFÏ5ªt|µ ©Â0_×`/" Ø=2xJÿÀOÙJ õ26:Ú—ï >ÂQ>¦ø¢’ºŽWXïÛçf÷ö öàÛâŒÆÊFµy…CÂZÇ;]Ö¸öàÅYƒ‚ïkoúS+¶TØ)Žœò­Á%uªa‘7OszRŸÕó’Ü%‚ƒ° ÿ.³, †ˆôμ涣wP¨×ˆ(w‰Ð[*å3"Êg`¨u4zy–†¨¥0:óv°ô1OIPjôüÚ¾œÑ˜yIž‚Ëùà$]ÑOOO ”ÉdJ¥R§Ó‘R©”J¥,Ë*ŠˆˆˆGy„ˆ’’’\\\öîÝ[[[Ûj*ÿíH"ºùíH"‘ZßÎÒ¢¶ nf3!kªpÙ= ‹·äÝ÷¯c#¢|‡FxOíh>Aߺ“WZtíÎÛi[¤7õœñó_K>ÿõw “ë F"Ò¸Ï2Köž®ªjºù}†3[+ÕÏMlcT&VúïžT|½ˆ°m‘Jgè°-±ÙQbkª3þ®Bó¿‰H­3¼¼ë¬D$XÚÞ÷¨¶:¬°³9å[ƒ?eóîõv¥$ø‘VÏ9¼•ÑÛnVF/¯³C´Ã1oKó!ž’#jGEûæ•66©tãnûÿ‘€ÂþD_¯×WWWQZZšicZZÚ³Ï>ªÑhbcoÞ§OD555=$Ñ×ê9ž#"Áجַh DÔ¢5(5zÓ­„Ý.ÌWºkñÈC…5Ç/×oÍ.]èÒ+3ûÎHêc˱‡ k=\„Ã"}l/š=8øîþAæ[øùk^Ú‘S6/9dd”¯«Xp®²©Õ³–z庩-ZƒÑH*ỼÊùÃBº;œ;‹•Ñk‰¥ÑËëìípÌ;C4>ÎÿèouK§Ò‘ßj}\EƒB½º¨-¸ÓØŸÔ ‚… š^ææææåå-X° 00eY±XÌ_ãçñÓê9ÏÌú÷/Åüª;{NUì9UÁo\²#߯Uw,aY†eÃK êK5Êqq~Ö‹4º›?(5"r¹q)T,`§ š6 HÏWýXôÆÞÂÑѾ¾]ž4ýRT36ÖOȶNpÚ- –a¼¤"ó¹&ûÎTÍHêcš ¤ÑÛzEÙÊ)[¡1ûy„ÿæ"d…FÈ2m‹¤"‰¬yªm¸lÌŸ²y…­Î‹e˜wç%îÉ«XøÒØ8?~â‡#v–õS&{›=Š?e­Y„*]~YÓ 0/w‰ÀzðVX½V°4zíc}ÌÛ9°-Ì'$øï:Y^T¥8r¡v\\;Óíìcÿì†aâÌøøøð[\\\ˆ(**ª  @¯×ó;Ÿ;wŽˆúô±éjô-prȆG‡xºSü7<:„Ÿ»dJì;7îç³Cä)¹\{}"òÖã¥/ï:ÛaQ^i£)i8V\GD!>R"Z{ðâ]å· Yæ®?g”+o~}:\X3Cö;ÿûÝœDTPÞt­YÓîSoÛ-b&ÂÏõè…ZîÆ7±C…5Ãß:|º¬ÑH¤5pf7ûò“‰ì +òËMa+–Qˆ”e˜0_éñË7ƒÊEø¹Qˆ‹yæ^í8B–a‚½\Ì+îáY%¥rU æí€ótÕ4•‰'nذáã?2dHMMͯ¿þ:hÐ _ßžò˜~¡€ ð˜VÚ‰òHrøGóYƒ‚7¹¼îg/WÑžS©fùŠ¥"©˜]¼%oZbÐU¹jÛñÒØ@·¸ w" Ùõ‡Š+Ôdž5Íš¯Ž—ƺGÜL•v¬¸R×r¥®å™”hó…w~)ªq Ú}ú’¥¢ÇG‡¿þýùÅ[ò¦ ’·è¶f—&…x%…x2D#"}vŸªðpʼ¥ùeymòWûzÉ}nëé»û^•«¶(3õÆýCCÞÛaÉŽüññWëZ¶(KŽðæ—Ü™žÔç•=çø>¼xM™SRßQ#DD÷ •­?t‰¯ðRâÄåvŽòuÿåî¸W¿=·7¿jæÀ>Dt¾²¹´^EDÎX"oÙeøóê°BKï—%VN™×ÙÁf%ø+l7øGG…½±·pù7cãüKêZ¶f—ŽŠöåŸ{`)xÓ™–X½–X½¶×`Ζ1ßÙŽ"Ës"²Ì˜X¿Ÿ ª]D‚·Ã³ÌàvÑU‰~ddä“O>¹ÿþ½{÷º¹¹?~òäÉ]ÔVòN#cÌ IDATĘˆf~o~%g¤ÉýM+ôY)ê5@æ¹)ãJ}‹nx¤ÏË÷$ð¿Ü/š%²?äW}—Wéë&åû§I1æ?ëOéXPÑ4<ªõòš‡‹jGEûº´7MÂRŸÅnɾºzÿw‰05Áqêõ¶^¾'áí}E›•JÅ‚»û.N‰~éë3Ž÷†%|o|’q¥¾E7,ÂÛÔ °ÌîSïï¿àã*š9°Ï “®/Ç8m@PeƒzgnùšƒSZjÃìGG†5(µ{ÏTå–4¤&¸ñxÚìþ÷$Ù^Ý¢¦Y£Öqa¾×§pLzÿèô}þ2%®{£êF½uˆvø1ÿ­ZñÈ''þ1«ŸwÛtÖ,ek:^AnSwôÕ£3úÎ,#¢è·Us£{ÅCjÖYfll;·Z)‚n±ýDÙcŸæh U6ª›ÔúPïžòP¹nqÇÑÌ‹u,ÃŒ»óNºTOYJ²[˜Êðquê!—=Ùᢚá‘>ž•k©ºÅäþÿ=VºlwÁ¸8ÿ9eîá¤~?n¬»c‡húoµƒÂ¼<¥¢îz•;îÿP{½- ‡ÛQÝ¢o·ïðŸ#—ßûé·H×þ/Éß½ÓOëMîÌ!*WjÏU4½0¹ã;X:厞£p'À}€;Ó=G ·B¢Ð !Ñè…è;ÍÙò¦¢*EwG@„D߉¶ç”=ñYÎŽœ²îÀIËkÊåòÕ«WÑÊ•+ù-«V­ª¯¯oµÛ³Ï>OÆ}íÞ~îáêŸ.YvîP,bÝÉ9‰~zz:Çq,{ó÷ûî»O«Õš^ž9sæôéÓnn½áѳ–Yfé´x…Zÿþþ C½£ü]»;"¸s9!ÑW(999æY>%$$˜¿yyy!!!=jÞÎŒÁ‰!^oí+L ñœ=HV\«ÜxäòÇGõö°åðýךÕúÃ…5Mj½§Kë> ñ–z»ŠÎW5wAà6q芾Á`ÈÈȈ‰‰ µ´O]]]yyùàÁƒiÈébÝ&õ  ØPé¤~Cý‰hh¸÷˜X›¾Ü?Táç:/9¤m–Ï ó‘V7©1@g8tE?//¯¡¡aÞ¼yVö9}ú4Ã0IIIŽ4ÔÓ¤ö Hí`e7‰P¡6ܲxZqèŠ~zzz`` L&S*•:Žˆ”J%Çqæûäç燇‡ûøø8æíF£ã\Dxtû¯èëõúêêj"JKK3mLKK3*VMMMeeå½÷Þë`”N§Õs=GD:ƒ±Y­oш¨EkPjôn',9Z«Ô$Ù4Ý +ØŸÔ ‚… š^ææææåå-X° 00д‘Ÿ·ÓÖü÷/Å›³K‰hÏ©Š=§*øKväxHö½p—ƒ•·h åõê{;%€½ìOô†‰‹‹3½,..nµ…ˆNŸ>éééi€]ãþä±qþK¿>34ÂûÁáa¿U7pàâ’)±‰2›B=\Xó¯_ЇEúümZ|ÛÒŒ‹uœÑ88ÜËÙQت ç‘WUU]»v­G-Ÿoê#MŽð ØIr„w|Åy$…Ú”ï:Yq¥®åëÜò&µ¾mé×¹å!ÞÒÁaÞNÀf]˜èŸ>}šeÙ^¶ÞoJÿ@w‰0µo@Ûå5÷æWºÚ°p\$Ó-‘‘ãÌ2™:uêÔ©S­oé5fž=¸)ø9%õ+÷‰õ›9°Ï­ ÀÄi‰þíhÅŒ¾Až"Šp[571:ÀÍ‘Úvæ”xðâ™Çʹœ €îèD\Üõçàú¸Š&õ³ö,[hô†‡‡.J‰ °‚>t³;:Ñw®GG…ww×áÚ3@/„D B¢Ð !Ñè…èôBHôz!ç,¯)—ËW¯^MD+W®4m}€[à sô333 Cbb¢ùÆ––OOOSöïãã£V« ƒãÍ@‡MôµZmVVVbb¢¿¿¿ùöˆˆˆªªªÊÊJ"2 ùùùaaaÀÁæÀŽ&úÙÙÙ*•*%%¥ÕöÑ£GûûûñÅåååÛ·o¯®®ž>}ºƒm€Jô CFFFLLLhhh«"±Xü‡?üA ¬[·îÌ™3=öXTT”#m€íJôóòòRSSÛ--**ª¯¯ïÓ§Ñh¾fÍ‘H´xñb†aˆ(==ýÇ|饗üüüŠ:éÀ–в5²[ ÜJö¯£/.\hz™›››——·`Á‚ÀÀ@£ÑXUU5iÒ$>Ë'¢~ýúíÛ·¯¢¢‰>À-`¢Ï0L\\œéeqq±ù77·êêjS)¿Î¦»»»ÝÍ€íœðdÜv=úÀÛ·oŠŠjllÌÌÌ Žˆˆè¢æÀ\W%ú“&M‰D'NœÈÏÏ—J¥ýúõ›1c†éA¹Ð¥ì¿n ¸à΄Kì½}€^‰>@/„D B¢Ð !Ñè…èôBHô¡›555íÚµ«‹*ÏÉÉÉÏÏï¢Êz2$úÐΜ93jÔ¨¿þõ¯ÍÍÍ]QÿÆ'Mš´qãÆ®¨ 'sN¢/—Ë—-[¶lÙ2ó999ëÖ­{å•WV­Zµoß>ƒÁà”¶œËhÐ×f}Vºã…Òn<³·»ÃiGFFFDDÄ믿ÞÝ8ß… æÌ™ãíí}ôèQÓö~ø!&&&((¨ÕþŸþù„ BBB† ò—¿üE¡PtXôÑG=þøãK—.ýì³ÏnÁôÎIôÓÓÓ9Ž3ßrêÔ©;wº¹¹Íœ93>>þÈ‘#ûöísJ[ÎÕ|áÅÅ „‰Ò¤ú¼ÝêªsÝQk………§OŸîî@œŒã¸§Ÿ~Z*•~óÍ7¡¡¡üF…BñÜsÏ=òÈ#Z­¶ÕþŸ}öÙŸÿüç   ·ß~{æÌ™_~ùåã?Þa‘H$zï½÷æÏŸÿòË/ݲ³èvBÇ«P(999,û»ï G ~ê©§†!"†a²²²&Ož,•Joщԕ¿ïAsŒFΠn6¨»d‰#ž|òɘ˜˜vw N¶mÛ¶“'OnÛ¶ÍüÊý¢E‹<øÞ{ïUUUýóŸÿ4ßãÆÃ† Û±cÿ200ð•W^¹páB\\œ•""bæý÷ßOOO_¾|ù×_}«Î ›9áŠ~ff¦Á`HLL4ßXSS“ÀgùD4hÐ ƒÁPZZêxsÎÅi[X‰;1 4ñÏn‘#»;¢ÖAjjªŸŸ_wâd_~ùåÀ§M›f¾1--íÈ‘# .lµ³Ñh,..ž8q¢iˤI“ˆèâÅ‹VŠL[<==-ZtèСòòò®8€ÈÑD_«Õfee%&&úûû›6êõz­Vk~ñÞËË‹ˆZZZlΉ8­Ò Q9ƒ‘34 ƒFÁi•¦Òæß~©øáõ’¯ž)Ûór]ö9ÊTTùÓʪï©« Ë÷,»ºýyù‰­d4ZiH«Õ>|Ê”)Æ»}ôÑG>>>999Ö#ܵk—÷ +V¬0/JJJzþùç?ú裾}û†……=ñĵµµ¶œõ´iÓfÏž‘‘‘œœùòË/ós®ŒFãš5k’““ƒ‚‚^|ñEÓݱVÚÒëõË—/‰‰ }æ™g¾ÿþ{ooï'Nð¥Ÿ}öÙ„ d2YRRÒ¢E‹Ì#lhh8vìØý÷ßß*¼èèèøøø¶ak4Fc>¢NžS^2kät?úŽxXS[Üpú[©,QbqjX,~÷Ýwï»ï¾Í›7?öØcUUU+W®|üñLJ f=ÂÑ£GñÅDôôÓO·-=|ø0mÚ´éܹs¯¾úª^¯ß¼y³-'®ÑhÖ®]ûÎ;ïäää¬Zµ*55uêÔ©ï¾ûîªU«xà_|±¬¬lýúõW®\ùæ›o¬·µ~ýú>úhêÔ©Ó§O?{öìÛo¿mjeãÆK—.½ï¾û,XPRR²aÆóçÏÿòË/ü<ü-Ç·%àVôzýk¯½öÑGuª(22ÒÏÏ///¯Õö]»v566~ÿý÷ ÞÞÞvÄÐ39”è †ŒŒ þ‚®y¢Ï0Œù4‰«W¯:ÒPWûGΠ«ÏùŠˆ¼‡Ì#"V(拚‹Ibƒ&þ™)zÉs·ë+E^ÁümmqÈì•Bw— ~êê œNm½­ÔÔÔ9sæüãÿ˜9sæŠ+Äbñk¯½Öa„2™löìÙDôÌ3Ï´-ussãg±3¦¦¦æý÷ßojjòôôì°ÚÜÜÜÜÜÜðððqãÆeee)•J":wîÜ¢E‹V®\Éïãééù÷¿ÿ½¼¼<$$ÄJ[ŸþùÈ‘#·oßÎõ÷¿ÿýüùóüß›6mš6mši­›ØØØgžyæôéÓƒ&"~lDEEum+µµµO<ñDVVÖ¢E‹6lØ`c/::ºíÔ§žzª¬¬l„ Èò —qhêN^^^CCCjjjÛ¢!C†9r¤¡¡á·ß~ûßÿþçHC]A' îψ]Y‰»4¸¿4¸¿$ –ˆÈhÔ7_“÷7í)•%‘®©Ò´Eè$t÷'"F ì3å¯n‘#:lnåÊ•jµú¡‡úúë¯ÿñøúú:?Ÿ1›þ6 6~›Š‰‰ '"‰Dòí·ßÎ;—ˆ¾øâ >ËW«Õr¹<88˜ˆªªª¬´Åq\iiiJJŠ©h̘1üÇ÷ï߿„"º|ù2¿?¯Æ–¯%æòóó'L˜PXX¸gϞŋÛXdâááÑj>Ý{ï½'Nœxï½÷: @ÏçÐýôôôÀÀ@™L¦T*ù‰:J¥R*•²,›ššZ__¿oß¾~øa˜!C†ð3§{>ãÿgï¾Ã¢¸Ö€ŸÝewY–²ô¢ôªª ÅÆŠAFÑ›`½úÙ5¹ ׆® ‚%*Ñ€Ѝ (( bA¬Témaû~L2n—•¥(¼¿Ç'ÏÌ93ç¼Þ9猀'ð $ ^B¡"„\6^B¢}Z†ŠÒÖÖ^¿~}hh¨­­mŒ§P(¶ÛÛÛ?~ø{êêê²ÙìðððS§N•••á…ø’©öÅápø|¾¬¬,^E¥R± ‡ÃårÃÃÃÃÃÃE{ÁÍÄÎjoo§Óé’ÄŒ¹xñâèÑ£ãââ†ÚáS˜*\{{»h´[÷}÷îÝ;„жmÛðÂmÛ¶-]ºTOOD"ùøø|ýõ×õõõªªªçKIô%Ó'!Ø|%¢þÒa!TÌæÍ›###-ZäîîN§Óóóó¥EW@@@‡é¶Ã† Ã6°©ÛÕÕÕ¢s¸»4eÊ”ØØXüã„„U¸êêê·J)ÀÇt?Ñ'‘H¢Ë Þ»wïÁƒ .ÔÐÐ@ÕÕÕQ©Tyyyyyyô÷z;d2Yê€{(C ’„ü÷/lðØ!"Y\Ù¥ÊÊÊ]»v9::æääÄÅÅáotúLœ={Ö××ÁÂbu1ë!D¡PH$’è‘ø6V¥¢¢":°GÔˆ#BÇïô€¨T*•Jµ¶¶ÆSyìÝ·ŠŠŠbªD[`2™¯^½òóó“¤;€ ûcô ‚©eee¬{úôiü`lp¶è«‘>_‚Œ‚F{åûWä²*!„ÈŠÚÒ´ºqãFYYÙ3gÎÌž=;,,¬¾¾^Ú8{ŽP(äp8¢³QoÞ¼ÙåYD"QWW733/¹uë^ejjšššŠ­¶„JLLd0999Ø®¡¡¡–––ä/K&†††xÉÕ«WB&&&bªD[HMMNNNZNJJ²··_³f„‘|)zà͸rqq¹pá‰'†ÞØØxãÆaÆu::ü3¤`æ^Ÿ{ºúÚ~šîh^sUó“+²šø’;Ý™™yéÒ¥ƒ*++ÿôÓO¶¶¶[·nÝ¿¿ø³òóó_¾|‰âóù%%%  eêÔ©Ýãc‚««ë‰' †žžÞÝ»wñŒ\¼ùó燅…ùúúzzz>~üøúõëxÕŠ+–,Y2mÚ4ŸšššÃ‡ÛÛÛÛÛ¿Ÿµìëë{äÈ‘²²²¡C‡JÒ׿þõ¯Õ«WÏ™3ÇÛÛûùóçGussÃÞ}+¦ wüøqGGÇÍFGG‡„„ÀÂ;Hz+Ñ·³³ …YYY‰‰‰4ÍÞÞ¾Ã;P?gŠ_Ä–ç×ësO“då•mæt»5‡³víZ;;»ï¾û!¤¥¥¼iÓ¦€€ñKéŸìhæÌ™÷î݃å50ðx|ALjK—.a+Ùã“nÅ;uêÔÒ¥K—.]úóÏ?÷^T7oÞœ={¶««ë¹sçz¯øœ¥§§¬ê[§/#ô%©ÖуÜ7ß|³`Á|÷êÕ«4M___ÂÓýýý7oÞáïïM×îqQQQ³fÍ=zô‰'z£}€ÏVo ݃——×úõë †½½}nnn\\Ü’%Käää$oaõêÕæææñññ½´Â=‹Å Ú´i“ø•7º¤rðàÁèè芊 55µ¹sçnذAF>=Àç†î08A¢ pè08Á} Hô€ Ñ`‚D "ÍÍÍ ý…¤òòò ú; |© уEaa¡££ãš5kZZZú;‰DFFNœ8122²¿ÀIª•£¢¢JJJDKTUU×­[‡mß¹sçÎ;555 ¦¦¦žžžƒ|-s!ŸWw7®½4ˆŠ_)Yy÷wDeeeùûûnÙ²¥¿céaÏŸ?Ÿ>}º¦¦fZZš‚‚^þǬX±¢µµõÝ»wý^§aDDD(((¬[·ŽL&‹¾˜ @Ò.y®®®îááïR(lãÎ;¿ýö›………££cMMMvvv}}ýÂ… ¥ìî‹Öò<³µ$‹a=•ǬkxðUÝHVkxõOŸ>mjjzøðaÒÃÁ?þH£Ñ.^¼¨©©‰¶¶¶nذ!>>^4ïï{b “É{öìinnÞ°aƒ“““¹¹y¿D€/”´‰>N·²²ú°üÖ­[zzzømH…?þø£¦¦F]]]Ê¿\¬Ê"ªª>cät¡PÀgµðYŸÝ’ [[[÷w =ììÙ³÷ïß?{ö,žå#„‚‚‚®\¹²gÏžªªªƒöWlâà {÷î½~ýú¦M›.\¸Ð/à Õ+cô…Bamm­©©)^bff†ª©©éî¾N‘*"ˆšVÒ ú;¢ŽH$’»»»ªªjÒÃNžÇÇñ „JKKBl6»Gºûâ8L>»U(à |>»•Ïnp˜xmKqfÅ[ßœY\viCÝ8·¯ªüsGUúÖ»§å—6¾ýuy}îi$Šé¨¸¸˜Á`œ?/immÕÐÐØ³gø ­²²²Z¾|yDD„………®®îüùókkk%¹ê)S¦L›6-++ËÆÆÆÀÀ`Æ !$ ÷íÛgcc£©©inn¾jÕ*|v¬˜¾x<Þ¦M›Œ‡ºxñ⤤$ƒ‘››‹ÕÆÄĸººêèèXYY‰FØØØ˜““3kÖ¬áaŸ?{‡Ã±³³›4i’ðïoPDD„²²r^^~L]]ƒÁè0¹V’0fΜ)ÒÒÒ:”ÇÇÇëëëôÄ` ‘vèNMMÍÎ;¨Tª¥¥åôéÓEó{„@ HNN¾yó¦”}Ñ*.‡ñ˜uØvé¹!¡Ów"„šŸ]­¿{Š6ÄZÁÌ×ü®ùéns•Ö¤µø¹B·©(EÅÞ]û²ñáï4KÚ­133355MNNöññÁJ®\¹Âáp¼¼¼ÄG8vìØØØX„Ð?þøaíµk×BÇüøqhh(Ç‹—äÂÙlöþýûùå—¼¼¼;wº»»{xxìÚµkçÎß~ûíªU«ÊÊÊ:ôúõë‹/ŠïëСCžžž=úÏþƒ÷¹nݺ3f,\¸ðÍ›7G}òäIff&@@aSììì$ ¸Û(Ê®]»f̘PUUµcÇŽyóæÙÚÚJ߸ªªêƒ:”'$$455%%%5662 é;À@"m¢Ïd2µµµ===kkkÓÓÓ‰DâìÙ³Ekããã_¿~=nܸ¬¬,)ûúr©ûAÀç6ä!ȌѳBD™¿>µ<Ë ª›hNX‰í’hJõ÷~å6U’•´±NíË!ÓvÈÈ«Éjc½{.à²Ä÷åååuüøq‡ƒ}âJII1446l˜ø³ttt¦M›†Z¼xñ‡µt:>îìì\SS³wïÞææfEEÅ./üÞ½{÷îÝÓÓÓsqq¹}û6“ÉD=~ü8((hÇŽØ1ŠŠŠÁÁÁåååC† Ó׉'~ýõWì¬ààà'Ož`ÛÇŸ2eJLL ¶kbb²xñ⇎5 !„x144ì2Z)¹»»OŸ>=,,ÌÛÛ;$$„B¡à‹µ´´ìÁ‹ÅjjjBÉËË“H$ 722úpèN```YY™««+dùø´Cwh4Z`` µµõ„ ÜÜÜòòòÚÚÚ°ªòòò¼{÷nÑ¢EãÆ“6Ò/UÔ¦=œ@‘#RåiÚÃiÚéê&!$òZªiÚï×Þ¡éX"„¸Í•x‰Œ‚¦Œ¼Bˆ@’Ñš´†n`/¾/ooï––ìcŸÏOKKëòv~—°Œßæóùoß¾•äDccc===„•Jýý÷ßgΜ‰ŠÅ²|‹U__¯­­ªªªÓ—@ (--uss뜱 @ðòåËáÇ×ý [æÕ«WØÍÍÍ!I>–HoÇŽ,kîܹ.\ SQQÁÊœœôõõ±K Õ××××׿ÿ¾ä-+((`"jêÔ©¹¹¹]ŽËÀà$Õ}¡Pˆß•´°°ÈÈÈ(++322B :4 €Á`444ô@°ŽPÀ øÒûÁN*BHÀ}?™Dû´ ÕÆÆFKK+%%e„ 999 Ò'ú¢Ã±°íöööþ^§‹,±ÙìðððS§N•••áq+¾ IDAT…ØðýõÅápø|¾¬¬,^…¿“Ãáp¹ÜðððððpÑ^8¶ÕÞÞN§Ó%‰YÚÚÚëׯ µµµ:Íf³›››ýüü‚‚‚¼½½B’·ÜÞÞ.zù]’*Ñï0`K¤X¬¿Æ– 6ì»ï¾“‘‘vtР÷iO]‚§§gJJÊîÝ»“““ÕÔÔúmy"±“à7oÞ¹hÑ"www:žŸŸ¿uëV); è0Ý­¤¦¦†ª®®Æ6z6›€ÃfÔÕÕ!„ŒŒŒºñ€«ººzà-{ €^%Už––¦ªªjccƒíbCi4‰D’‘‘ÑÑÑÁ³|l½Aþf܈2"IÈçà%!D$Kõ…òòòŠŽŽ.((HMM2eJ§Ùv?:{ö¬¯¯/>àÿd(…B!‘H¢GâÛX•ŠŠŠèÀQ#FŒ@ Þë¯'«¬¬Üµk—££cNNN\\ܼyóz¤Y&“ùêÕ+??¿i ƒ„T)`yyùµk×ðA………$IWW—@ ¨ªª>þ?²¸¸}d Ç F È(h´W>Æ XBdEmiZ?~¼¢¢â¾}û^¼xù|…B‡#ú,H’™ˆD¢®®nff&^rëÖ-¼ÊÔÔ455•Ïçc%‰‰‰ #''Û544ÔÒÒJNNþÔP»±xåÆeeeÏœ93{öì°°°úúzÑZyyùcÇŽM˜0áS#IMMNNNÊ“’’ìíí׬Yó© `0ꎾ»»ûÑ£Gcbb¬­­«ªª²³³]\\°‘ÄNNN/^Œ‰‰1bDMMMvv¶©©)$úR0s¯Ï=]}m?Mw4¯¹ªùÉYM |Éî!“É“'O¾páFûØ}îòóó_¾|‰âóù%%%  eêÔ©Ò„Ñ)àêêzâÄ ƒ¡§§w÷î]<#oþüùaaa¾¾¾žžž?¾~ý:^µbÅŠ%K–L›6ÍÇǧ¦¦æðáÃöööööïg-ûúú9r¤¬¬lèС’‡záÂlñÊêêj .ÏÌ̼téÒÁƒ•••úé'[[Û­[·îß¿?€J¥~ûí·’€;~ü¸££c‡òèèèââââââXxHuGßÀÀÀÏÏÉd&&&Mž<ù믿ƪg̘ÑÔÔ”˜˜XXXhkkûÝwßõDÀ¢ÅWªößñ˜õõ¹§™oòä5Ü—Kß,6wâĉÎà}úÖ­[ëׯï0î!4sæLEEÅ©S§B–€x|AÇz^aa¡‹‹ËÑ£G}}}û;–^qéÒ¥ùóçß¾}»ËW`N:µtéÒ¥K—þüóÏ’÷2kÖ¬ºº:Ñ!C}ìæÍ›³gÏvuu=wî\ÅÒÓÓ?Vu‡­Ó—‘úÒç5Mô”´´4‰äááÑßô˜o¾ùfÁ‚øîÕ«Wi4š¾¾¾„§ûûûoÞ¼9""ÂßßÕƒx%%%™™™sæÌéN¸=!**jÖ¬Y£G>qâDÅ€/¬}90%'';88(++÷w =ÆËËkýúõ ÃÞÞ>777..nÉ’%rrr’·°zõjssóøøx ‡3………©««ÿý÷Ý YZ,+((hÓ¦M°\º†î @ÕÕÕæææÛ·o_¶lYÇÒ“<]QQ¡¦¦6wîÜ 6ôê[ÊËËKKK?œ _ºÀà‰>0ÀA¢ÀàCw€ÁËZÑß!z LÆ`‚D€}zEsssBBBGº#//¯   ¿£¤‰>=¯°°ÐÑÑqÍš5---ý ød‘‘‘'NŒŒŒìï@©H•èGEE­ÿ§]»v‰PTT´mÛ¶M›6I$ødB>¯övLé¹¥çW6^îïp:‘••¥¯¯¿uëÖþ¤ç=þ|úôé ãæÍ› xùüall¬©©Ù14551ŒNß´%¦j †!F§ß”ˆˆˆyóæ­[·.&&¦¿ ÝºukãÆAAAG}± ŸÏ÷ññé©G”Ç_´hQ4è’´«î¨««‹¾~•B¡`l6;)))77W—žÕò<³µ$‹a=•ǬkxðUÝHVkxõOŸ>mjjzøðaÒÃÁ?þH£Ñ.^¼ˆ§­­­6lˆÍû{FÃÿ+yÕ@ £Sb¾)d2yÏž=ÍÍÍ6lprr277ï—è3ùùùÿýï---¿ÿþûwïÞ¥¤¤ÔÖÖ†„„ôw\iI;t‡N§[‰Àÿ"ž;wîÁƒÓ§Owrr’:HðÉX•ETU}ÆÈéªcІXóYŸÝ’ \¼x1**ª¿éagÏž½ÿþž={Do]¸paÏž=?þøc¯öÞÞÞîááqèСúúz"‘H"‘~ÿýw__ßÔÔT1U5 ñÄSÂÞ½{•””à$ ÒÓÓµ´´BBB¾úê+__߇666öw\iõÖ}OOÏÿûßcÇŽí¥öxN‘*"ˆšVÒ ú;¢ŽH$’»»»ªªjÒÃNžŸÝÊg· 8L¼¶¥8³â­oÎ,.»´¡îNœ€ÛŽWUþ¹£*}ëÝÓòKßþº¼>÷4 Å÷eeeÅø@nn®ø³ðƒ;<¶²²Z¾|yDD„………®®îüùókkk%¹ê)S¦L›6-++ËÆÆÆÀÀ`Æ !$ ÷íÛgcc£©©inn¾jÕ*|v¬˜¾x<Þ¦M›Œ‡ºxñ⤤$Ñ늉‰quuÕÑѱ²² °±±1''gÖ¬YÂ322233“äB$Áápììì&Mš$üû¡¬¬œ——§¡¡ñË/¿Ü¿ßßß!¤®®þèÑ£ØØXggg1U⿘ºº:ƒ!:?µ¸¸˜Á`œ?/immÕÐÐØ³gOï…!ƇŠ'É7eæÌ™ --­Cy||¼¾¾~@@€„}ð™SUU}ùò%þ+EQQÑÑÑQ^^žÅbùøøøúú"„Ξ=ëãã#:X_(^ºtiÅŠ~~~ÿú׿"##ÛÛßÿMÉÈÈX½zµ¿¿ÿ’%K¢¢¢D«pl6{õêÕAAA¢ëdddÌŸ?Ïž=½xÁ Ò&ú555;wî =wî‡Ãé‘°@·U\+=·‚]û’Uõ¤ôÜŠÒs+*’·cUÍÏ®ÖÝ9I¢)©ØúÒuÇ´–ܬÎ<$z®PÀm*JQ±÷SöUóÓ+í…âû ¡««K§ÓuuuÅŸ5vìXìøNço\»víéÓ§Ç ýóÏ?W®\)á…³Ùìýû÷ÿòË/ØL2ì}ï»víÚºu«ÝÞ½{,XpþüùyóæuÙסC‡"""lmmþùgyyùÿüç?ø)‘‘‘«V­222Ú¹sçœ9s’’’fÍš…ÿuĦØÙÙIs÷P(”]»våææÆÇÇ#„ªªªvìØ1oÞ<[[[ì€Ë—/ÇÅÅa)ïªU«DÏSõ©_y333SSÓääd¼äÊ•+ÇËË«/ÃèUªªª<èPžÐÔÔ”””cÀÀ0}úôòòò#GŽtø#N¡PV¯^ýOêìì¼zõêÕ«W;::bµ §OŸ633[´hѤI“²²²ðì<##ãÈ‘#ZZZ ,;vlffæÿûßû=vìXeeåš5kDŸéegg3™Ì;wî0™ÌO|iÌ1™LmmmOOÏÚÚÚôôt"‘8{öì‰ tú¸|nCÞ‰Ì=!D”ùk†t˳ ªº‰æ„¿2'M©þޯܦJ²’6V©}9dÚy5YÍa¬wÏ\–ø¾&Mš„o;v¬´´ôèÑ£ZZZâÏÒÑÑ™6mBhñâÅÖÒéôƒ"„œkjjöîÝÛÜܬ¨¨Øå…ß»wïÞ½{zzz...·o߯þB<~ü8((hÇŽØ1ŠŠŠÁÁÁåååC† Ó׉'~ýõWì¬ààà'Ož`ÛÇŸ2e ¾‹‰‰ÉâÅ‹>|8jÔ(„6ÆÃÐаËh¥äîî>}úô°°0ooï …²eˬª¹¹yùòå~~~sæÌa0sæÌ™1c–|‹©óÕhiiØý6‹ÕÔÔ„’——'‘H^^^Ççp8Ø,ü””CCÃaÆõFb¾b"”þKmddôáÐÀÀÀ²²2WWWƒ!}ô;++« ÄÆÆ|ûí·îîîX9‘Htttäóù!]]]<ÅǼyóÆÓÓsþüùØ®œœ\lll]]ªªjbbâ°aÃÖ®]‹U)++ÇÆÆVWWkhhà§'''ß¼yóÇ411mvòäɵµµVVVt:½×®€ÁBÚDŸF£bP¹\îµk×<==åääz"6ÐT S„P#EŽ(C¥i‹¬´#òZª•,½ðšŽ%º÷+·ù}¢/£ )#¯†"d´&­‘¼Ó¢¢¢-[¶àOx¥eÌø6ŸÏûö­¥¥e—'ëéé!„¨Têï¿ÿŽÆÆÆb,«­­M[[!TUU…%úö5|øðÒÒÒo¿ý¯rvv>|ø0BH ¼|ùÒËË«®®«ÂfŸ¿zõ kª¹¹!$ÉÇéíØ±ÃÖÖvîܹ999PQQÁÊ/_¾Œ=W™UFLúøWÞÉÉ©´´+ E¥§§ÛÙÙy{{ïÛ·/++k„ |>?-- ÓaˆùRˆ‰ð¿¨PPPÀ¾­¢¦N:uêTéàóñõ×_›››ÇÅÅ>|8''çÿþïÿ¨TªøSV¯^mp86›ýjhhPQQ©¬¬]ŠÃÕÕUCCC47xúôéÉ“''L˜ðÕW_uhÖÁÁÁÁá³›WÀJªDßÇÇG(â·Í,,,222ÊÊÊzp82è)BO(àH¼„ CE ¸l¼„DëN†Êb±.\¨¥¥.}œø ­øv§#;?Ôéœ6›~êÔ©²²2¼¾ÿ±¾8ŸÏV„ÿµãp8\.7<<¼Ã•â»±³ÚÛÛûàF”¶¶öúõëCCCmmm; 1b¾ÝaB¼˜ª}壣£Ùlvss³ŸŸ_PP··7BÈÂÂ!dcc£¥¥•’’2a„œœœ††üÆ|‡!†˜¥×ÞÞkƒAÂÈÈhË–-ÙÙÙ‡Šýá‡ÄÏårûí·ÌÌLѹ4€Çã Ñÿ—ìííñ]‡N¡P.\ØãW%U¢ßá±5–ܰX]Œ÷Ÿ±îÌÙØ¸qã‹/RSSû~áQDb'ÁoÞ¼922rÑ¢Eîîît:=??_úWtt˜n‹ VA©©©!„ª««±Þ†Í ½Ú v_{ˆadd4nÜ8¼Š@ xzz¦¤¤ìÞ½;99YMM­_îɉPzÕÕÕÖÖÖ=Ø Ÿ9ggçÒÒÒß~ûÍ××WüóÉ“'O¦¦¦zxxX[[ËÊʾ|ùòÔ©S’tÑÞÞ.ØlvFFF‡5Ê=KªD?--MUUÕÆÆÛÅÆÈöãp€¢ HòßO´ðØ!"¹‹‡³â]¾|9&&&,, ÿ1ø¬œ={Ö×ן&ɧP …B"‘DÄ·±*77·NÏÅnT Þë¯'«¬¬Üµk—££cNNN\\œè$ã¾äåå]PPšš:eÊ”N?n}¹˜Læ«W¯üüüú;z׃”””ðùE&&&B¡°±±Kô‰D"@ÀFê#„ª««KKKmllnܸáêꊯQ‹?Û”‘‘!‰¢óz[ZZŠ‹‹-,,°‚aíÚµW®\9uê” ¬Ñ@ï‘ê¯ryyùµk×ð………$©ËEW@ÿ d4Ú+㬊G!²¢v·›¬¨¨X¾|¹««ëŠ+z ž& 9Žès§›7ovy‘HÔÕÕÍÌÌÄKnݺ…W™šš¦¦¦âð FNN¶khh¨¥¥%º„º±\ãÆeeeÏœ93{öì°°°úúúOíô“ÈËË;vl„ Êǯ¨¨¸oß¾/^`cfúËÇ"”Fjjª@ øð­IIIööökÖ|Â<>gçÏŸ?zô(¾ûäÉ"‘ˆ¿õ@ ¨©©á /_¾¼wï^¡PÈårE‡)áÇëèè<~üþÏÍÍ›7wî܉¯¢£¨¨8räÈE‹‘ÉäcÇŽuæÎ;+W®üßÿþ×ÓW À`$Õ}ww÷£GÆÄÄX[[WUUegg»¸¸ÀxÖÏ–‚™{}îéêkûiº£yÍUÍO®ÈjZà3q»aùòå/^Ä ÝÝÝñ‰¡ÊÏÏùò%BˆÏç—””$$$P(”Þ˜ÚH \]]Oœ8Á`0ôôôîÞ½‹gäâÍŸ??,,Ì×××ÓÓóñãÇׯ_Ç«V¬X±dÉ’iÓ¦ùøøÔÔÔ>|ØÞÞ^t쩯¯ï‘#GÊÊʆ*y¨.\À–kì°*ÅÇdff^ºtéàÁƒÊÊÊ?ýô“­­íÖ­[÷ïß/yŸŠJ¥ŠNPÆ‘ÉäÉ“'_¸pF£}ìAGßøX„Ò8~ü¸A‡•FBÑÑÑÅÅÅÅÅÅ!!!°ð¾þúëýû÷ïÝ»wäÈ‘ååå)))nnn¢“q'L˜pîܹ¸¸8…«W¯:88++«ôôt:®¡¡ñìÙ³§OŸâÇO:õÈ‘#ûöí3fLEEÅåË—GŽÙá—›’’Òüùó<˜™™)úÛ#--­¼¼¼¼¼|îܹ°ðR’*Ñ700ðóóËÌÌLLL¤Óé“'Oîß¿ô@nÞ¼9{ölWW×sçÎõw,ôì‚€ÁFÚuôx¾ùæUUUü±ÃÕ«Wi4š¾¾¾„§ûûûWUUmß¾ýõë×QQQ’¼V¢¤¤$33sûöíݺÿ¤¥¥‘H$þ¤ÇDEEmÚ´i̘1'NœèïXèu>>>«:þ|_FèqèБ——×úõë †½½}nnn\\Ü’%K>é5p«W¯677—p4KXX˜ººú÷ßßÝûSrr²ƒƒþØ}`±XAAA›6mêò…A Í0€ÁÐ:qðàÁèè芊 55µ¹sçnذAF¦?————––~8éóóW]]mnn¾}ûöeË–õw,€‚¡; Nè$ú NŸÑП.õwÀäðñahwØ:} O ¨×X0è0A¢ÀôÑÀ@¢¡(«¯"‡z^ÝÚØÆéïptH¡[¶tû䨨¨sçÎ]‘ŸŸïììŒÕÞ½{÷üùó—/_ÎÍÍ­­­566&‘HbZ»Q\ÓíH@?*}’rÓ|NSßÒ¶CŸËMÙõgÔŽ¼”³|w¨Å()ûb·µî[à.ÏPÓ4´¼ê3ñE/Æ@½.’¡2-«*ç+ôR§ZŠc L4L4lôUÞÖ1›Ú¹½Ô×ÇŒÔeük¼ñ¥¼×õ}Ü5Ÿiïè«««‹¾“B¡`=JHH°´´;vlmmmvv6“Éô÷÷—²;ðª+Ånk}÷úÙ‡U3.^ÿcìôù-uï²ÎGꘌÐÑñÃÀ'‘¡PB2ÔNÞB%¦ê3ñE/Æ@½.€”Æ›©#„^Ô´ReˆC•åœMÕßÞyÓßA0¸H›èÓét++«Ë322ôõõ°]*•zåÊ•ÖÖVyyy){Ÿ›‘¦+kéjè›}XõæQ®–¹ó¬E>¿­¹¡­¹¡{]p9¬ó;VšÙ¹sšL ‰DbñÝkEY)ÖnÓô,m>Ve<ÆYº+ë_tðb ÔëôUy*Bèú³êVO›!ËáÁ{{èk%úÜ'OÈffHìКO2iÒ$EEE|רØ8==½¦¦ý‡@$ê[ÚuZÅjk‘UPBI¤™köt» n{›–¡ùƒ«—®Ÿ=, ’n'Siú–všœ˜ªnw׳¾èàŨ×À äb¦ÞÎáç¿mà „¢å3Ç ½õ¢¶ª‰Õ½fIDBˆ/6³¸ÍU}=h€°7ã [[ßÙÙUUå—/“›5 ÉHz›?**ŠÇã-^¼˜Ëå’Éd1G>~ü866véÒ¥zzz;^˜õÅyzûÊ刿æxØzÎuó[†W±˜-Bà·=kÈTÚÔåÛB"Q–.n$(ŸÇÝ8JWðßr ¡¼”³™§ù‡EjÇŽùó; 3“ä•Õw¢Ð袧wZ¹r–¾¥­êüä3V»¡µÃÄïWË)2$¹ºö–¦ˆÅž¿ÿ¿Ñ“fuyp}Å›èu~^K¶ sšŒ•pXmAžcg,pœö}ß߃"WÎj®­êPè©m2Ûîñë*¼~9óÔA½6ÓþýŸÞ¼2jÅǪŠÞò‰f$"¡…Å»õ¢6ÿM=ïït?Ä{Bèù»–›Ïk*Û%ìK–LZãÑÉ´œÉy!€Æ«Yê()Ó)L6¿´ž™ñ´º…ÅEÉSeVN2GEÞxñÕ0M]¹òÆößóË-´<,µ_Õ2Õä©\¾ õQ¥—µŽ@(<•óº±K  q&ê–C””ä(l.ÿEMëÕ'ï˜lž…ô“;†qåÉ»œµ^!D—WKJ¢ØØ4­ßPí2¾íÔi!WÒOÞ555;wî =wî‡Óùœú»wïÒéô!C†ôXàà30ÄÜú›?}³â'2¥CÕÉMó#{V¾xüöñ½ˆÅž‹=ãCŠo$CžøýÿU–^ÿ!Äl¬»•pÜÚm*žå?Ï»^xý²×â-¡´èݢ犩zS˜[WþÊkI˜Ëœ_æßJÞ%ÝEwNEG_E[¯äÞM¼äÕÃ>kbãÒÇÁsÚ™ì¶Öÿ„ø*1&-X‹}—±ŠjZdYš‚ªfï]×ÓÛWØm­Ïs¯³˜>è)­lÞ‰ìWÅïZdeªlfqM5ÇùÚëaÐ$iP(D|8€móBlòí šвd‘!G¶ʘçd€u‡›<\KUž*C$¨Ò]ÍÔ±B5yj‡§B§L=¤…ÅU–£8©!„\LÕ]Í5Tå©2D*c=”ñ½“!‘@"Äÿîö¯0ÿ|dÀ€÷×Í{cÆþ}ò«V2j i=p@~éÚܹ±÷éBL&S[[ÛÓÓ³¶¶6==H$Ξ=»Ã1W®\yòäÉìٳůº¾8 * ö¡”c?u¨òZ²…Ça_‹? C¦¸|„"K0#SßÒÎÜaÂ_›ÚŽ¿vê I†Œ‹b·µþù¿–.žÃœ'Sé ¿íYcá8ÁÄf¼ø*„™JóX´!¤;lt[SCNb,»­•*'n§) 9íL„Ãf·µ"„(²r¢¸÷N˜ØŽpå"ŸÇ%ÉB/îg14‡¨ 5êãàOlœ÷±ðbªÄ4h8Òß¾Ÿv¡¹¶êë yeµÞ»®Qg´Ô½Óa+þ §T6µŸË}«©(ëb¦n¡¥8i¸–“±ZÚãªÜ×õ÷ß6ŒÒUv2Q3Ѥ–\ IDAT7ÑQÓzé~Y;—/¦56¿#ù1úû@tÖËwÍ þ‘!mô•B7Š«³Kjµ•hþŽúÊr3M…¢Š&¼…:&;>çõH]†õPÿïL½°¼±¼¡ÝÇV÷u-3çe]à8#:{>€ºþ¬:»¤Ö@>×^_…N1T£¿¨iÝ‘üx¤.cêÈ!u­ì#™%½óÅà³öQ:2J{÷ȯZÙ¸|yÓ¦²¥%yÌñçÓh´ÀÀ@,ƒçr¹×®]óôô”“ûk$.‹Å:wîÜ“'O¾ùæ;»Î‡qƒiˆ™5Bˆ*'O–¥}l§Ü¿[q|íÜ‹ÿ]_þ¬ÀcÑš¼VN•“ÿ6ø ¢šBÈhÔXß͇‡šì² !¤ih.º-šk«ÔõLÄÄ š_?qýL’ !6µu½›_ú$ßÀÊ^(¼|xÛr¼Wß?uÙ6·ãƒ5Õ!â«$Qó¶äÆ™ˆaN“GŒûºW¯ËÔÎÕÔÎU¨=å]3ëB^©†¢ì·vzJ4²©†BQy_ ¼÷¦>ÿmÃ8SµñfÆêòò²2â}1”åÈD!”]RËËÚ^×2M5°i»¸‡¥Ø± ;„àïÛó!ˆ"œË}‹*kh…/kZk[Ùê T%Z·)$:Ççää´8ÀÉ»G±±!v5ÒÆÇÇG(â÷é-,,222ÊÊÊÌÌÌBmmmÿûßÿjkk,X€•Ð%yeu§×ÏDh·rõ­MpE³FñU$‘§RØ6Ö³ÛZ/ýwÃS[W$AB¬m4L^YíÅý,+û²gY­Íø¸¾ ^Y[ïÃÑ82YñU]âqØ—#¶Ð•Õ&-X#að={]€ÞF Ë!Œq&jX–ÜÊæaåJ4²“‰Ú(]e„—/àò»¿xEæ¯ç¢=‡wZŽaþÝu—BáÛú¶±Æj“†k)Ó)ø Ðí HÞ'úì›7[÷íçܽK±·W9}Šêâ"æ4 ƒñyt:!Äbýõ„îìÙ³ÕÕÕK—.ÕÖÖîјÁ'ÄÔö߯iìÎ}{KBHYKWwØh‰N#ŒÇŒ{q?kâ÷ÿ÷â~–œ"cˆY'+Ïö¶“›æl|Ž˜ª.›½ ¡ªlnè‘Óm‘@°Êp6US–£ „ÞÖ·Ý,®~UËT–£8›¨Yë2ˆ‡'¸óª.çEm§›·óEuXÞ§ÃÐyá§ ¤Ÿ5F×LKo[ê§{M0ðÈ „„­­usý¸PÆŽUýõ,ÅÉI“ÓÒÒTUUmll°Ý––„FC={öìÙ³gÓ¦Mƒ,|’Ö†šÛ—b†˜Y—^¿lå6µ¿#ú¦6ã^½TýºøE~¶ñèq‚¸1ý½›Ñ¡{!¦J¼çy×f\ÿíb|b4`À§Ê,g„ÝÅSǼY\󺎉U-q7!lž ïumÎ˺v©S|.ÿ¯¼{Wê~OÌ‹U¢‘±,ÿ÷åEåM¡p‘‹±–Òû•Øó² !D$¦Xj#„’ ?ºŒ Bˆ //;Á]1t3å‡Ñ———Œ=šH$"„ I$’®®.B¨¨¨ˆN§;::vÕÿ€Íßñ¿\‰ ¿qöˆ‰íx|˜~£ÈÊy.ý¤ÔVo„ UNþîåø†ªR7¿å½›ØìˆO­£¥¾úÏÿíÔakçí'E\Ÿàyîõ›çé ·ùjþê¾é€Á¬•ÍklãÔ397‹«ßÖ·‰V±y‚Ü×õw^Ö±º;(¿ƒÆ6/!LÔn•Ô*ÑÈ~úJ4òŸEUy¯ë»Ñ ùï1?Mm!ê«ÒÕþ1Ü¿¦•R”%U–S¤ÉŒÑWFèƒÁ䯡;ò«Vuãdww÷£GÆÄÄX[[WUUegg»¸¸ÈÊÊ"„ÊËË E755Åçé‚ êÕÓÆª2„@Ào¨|ûôö’ Yši”oå>»“á±h£¬¼¢»ÿòãk|oþztòÂõ=ò' ‘ÉÃ=>é"IÆp䨧·ÓÉY}KÛ^ ¬ýù¿,f‹ñ(§g9x¡¾•]ï}{põb}Å›úŠ7ã|~€…wègî¾åu6ò~ß•âNË»ÃÜ}Uïd¢æj¦áj¦6µsE—Üù$ LNs;W‘Fžçdˆ…l®@†ò~‰¿Úö›:¦¾*}¾³!Vò¤²Yº‹àK"é»±:e``àçç—™™™˜˜H§Ó'Ožìææ†U±X¬ÚÚÚÓ§O‹/þ…Yà‹Sx-éaÆ%lûE~ö‹ülªœ|·}>{56\Ûd„•«BˆÎPužµèÚéƒV"KéþLmÇ?½n`í C¡v}ô— ¾â  ¯: ZèI3é­DßÂñ«ª—OôFØ@–@ßøX6ß³Y>&ãé;&‡7FO™!Gaqù¯j™×ŸUw{P_ ¼p¯ôkKmuEÙ¦6εgÕÎ&j4Ê?Öûÿí~™Ç-#uy¾@Xü®åÊãw=q|½ñ¿q÷À›qÁPýæùÉMó¿ Á× €~'æÍ¸wØ:}  /õÃdA°WoˆDãQÎý;HôèI%÷n1³–•Wìï@0ØA¢@ikª¯|ùÄd̸þ@ºÉ¸QrJ*kâ²ú; „>«É¸è ééé«‚ɸ `0t€} Hô€ Ñ`’jÕ¨¨¨’’ÑUUÕuëÖaÛ<¸~ýzMM N777÷òò¢R©Òt€¬wO«3)˜¹)ž-ÉñÌ×wjnö‡{¨Ø|û±#Û+ ß]ý¯ö×›¨jÆ=+)¼*ÈIصÚ?,RÛd„˜ÃžÞ¾r9b ¶më9×ÍoYŸDÀgDÚå5ÕÕÕ=<<ð] …‚m¼|ùòìÙ³&&& YYY---ßÿ½”Ýð1ÜÆ §SÿFÂã©fêã— „j³£z3.ýcˆ¹õ7+~B%ÙÖß±Ð?¤Môétº••Õ‡åwïÞ•—— $‰!2™œžžÞÞÞN£Ñ¤ì€N)˜¹É(jRTô%<^FNYFß!T{ëxoÆ (¨h(Øk „RŽýÔß±Ð?zkŒ¾»»û?ü€eù!mmm„Pccc/u"iÚ#HTùþŽ@GÕož …_Æ{{jÞ–_F¨t©gÞŒËårÉd²h‰¦¦¦èî“'O(ŠªªjtnSeyâ&õq?Ð ±—UznÃú%+oñ£í[Š3[ž_ç6W‘¨ò²šæÊ6ß’dÄw' îŸg¾È xrz6rCGu!‡Ãqvvf0iii!’žžnkkÛK...¶··ŠŠòññÁJZ[[ŒŒÖ­[·fÍšn4ˆ²²²*--íP˜žžngg×½ K•%E·.F¿z˜óÍ¿Ö40Z5ÛhÔØŠ’" =Sk÷oÒcvë=íßÿ!‰¡‡— 2ë«ÞÒ•T ¬ìÇ»˜B£#„|þ³‡‹²Rø\®©«É¼ýÈ•³ô-m=mÄv%¾ÿ¾¯Ê74†®ÅhW¿erŠ «íÌö%rŠ ‡oæ÷5‘Dêµ/ }AÚD¿¦¦fçÎ T*ÕÒÒrúôéø0}„P{{{}}}^^^nnîÔ©SE«YI›¬¨ÕVš'úí…B¦;‰mßüìjýÝSt};sw^KmóÓtNc¹ŽW(B1Ý5?Nm~ü'mˆµœîhNCiãÃK]FH¡PvíÚ5cÆŒøøø€€€ªªª;vÌ›7¯{Y>BÈÌÌÌÔÔ499Oô¯\¹Âáp¼¼¼º× B(<<¼­­ ß ©¯¯×ÕÕívƒ FyqÁí‹1¯ ïjšO_µÃdŒKSmBˆ@ Ú{ùßøõˆ …â}úô°°0ooï …²eË–O¾N^^^Ççp8Ø'ä””CCÃaÆu»ÁI“&áÛÇŽ+--=zô¨–––4AÀ‡Êž>¸õ[ôÛÇ÷´‡Ï\³Ûh”“h­‰ÍxãÑN7~=b`eoå65#nCU©áHÇé¿é˜ZÍ\³;ŒÎPÍHÿÍx´óÔåÛ±]m½”c?½{]¬ih®¢£ï¹8Ôif`Îï'¯Äî½ýû ‡©VnS!Ý_"iÇèÓh´ÀÀ@kkë &¸¹¹ååå‰Þ2tss›3gŽ¥¥å¥K—îÝ»'e_`0“Ó#à¶³ªž!„PÐV^ §;º‹s„B^K5™1”ÏnÅþ‘:!nkMg1ëhÚÃñYM3 ƒÜ±c‹Åš;wî… ÂÂÂTTT$<±SÞÞÞ---YYY!>ŸŸ––&Íí|QEEE[¶lññññõõí‘@TòÑíU¯žÎ\³ÛkT‡,!D  DBˆ@$a|W(4¼+Ó·|OÐÀÊ!ÔPùV(4×V‰VéZt=¢R ¬/5]£ö–&ìŸê„Pcõû{: Í¡S~^¸çWÍ+'öV¿.–¦Gú‹Twô}||„B!éïleeeff%F::::::666III ÆÆÆ CÚÁ DU3$Ñmeù4¬êç6³ËD_(à ü¦G4=úãå|žø³P@ ½fF IzG[[{ýúõ¡¡¡¶¶¶žõ1666ZZZ)))&LÈÉÉihhè‘DŸÅb-\¸PKK+<<\úÖàC¦¶®ùé WNìµ÷~gåêM"wý[”Ïã ø<Êû÷í©²!«Ïã Ñ*Yª‘ÀX_wãî$Æý³œ+º[ú$?ç÷ØŠç…:¦– ªš€/T‰~‡¬N§#„X,Ö‡Gº¹¹eee=~üØÉ©ã'{$CÓÕ^öÙ×Vö€$« «n*Éiò&.tÑlÀO/ …!l>®”‚§§gJJÊîÝ»“““ÕÔÔº>­+7n|ñâEjjª‚B“’ {Ü¿[a3eÎĸkñûs~?aïíoí>M4SÿX¹y[8~%Z¢¦k„m¼y”{ûbLÙ³‡CÍGúlاo +€/•T‰~ZZšªªª ¶ÛÒÒ‚¢ÑhàîÝ»úúúتš!YYY„—ËýXStINwLKq&§þm{éÚÐQ¨«dš@”A"‰*/:§KØYB>/ò$ý¹­¬¬Üµk—££cNNN\\ܼyó$ï·S^^^ÑÑÑ©©©S¦LÁ׫í¶Ë—/ÇÄÄ„……áÿÛ@oPTÓš¸ÖqÚ÷w’⮟=œ“ç½t«’ºöÇŽ'ÉÈI2</á²ÛBYIF†@$ŠV‰n“dÈ<Îûߨ<öû*1}ˆDš¼Ò‡<‡Õv~Ç¿+_<Ö6zNðA½ác$¸V>_Rå ååå×®]ü½Ülaa!‰DÒÕÕ%‰iiiø‘OŸ>EÁ´? Y­aD2­©(™Ûò®ëú!¬¨ÕVöý½xsÛÛ{¯ãÙÕÏÅŸ%CWm¯|Œ°ª%š¹qãFYYÙ3gÎÌž=;,,¬¾¾^´6>>^__ÿ“†ôŒ?^QQqß¾}/^¼ðööîPû© VTT,_¾ÜÕÕuÅŠ’Çݦ ªñÕüÕÿ ¿0ÜÙC]×XÌ‘QYsè›GyxÉë»!em=¨¨¦%ZUöì!¾ÍÐRþì¡€ÏÇvKŸÜï2*¨¢­÷â~6¾^~qnæžïœË‹ (²r†#ÇÎÝ|äÛM‡ Ë€TwôÝÝÝ=cmm]UU•íââ‚ݼ7nÜŸþI"‘ŒŒŒšššnܸ¡­­mj*ÑX :E ’hC¬™¯ïd(¢7éÙu¯y-ïBHÈç5W1_ß!eäôlBJ#¾®½u¼*}ÝÐAÀjiz’FU7¦ª›ˆ?KÁ̵áþ…êkûiº£¹ 嬪DžÓQffæ¥K—<¨¬¬üÓO?ÙÚÚnݺuÿþýø.\hjjJJJª®®ÖÐФM2™…Ïja¾Èf½{&§;†1rzõõñq8œµk×ÚÙÙ}÷Ýw!--­àààM›6à ËÕÖÖ*))I~É^^^.\˜8q"öZÔ§6X\\, ƒƒƒE ÓÓÓ!Ñ|ÆLžM$füžqrŸœ’òˆñž®¾K°*[Ϲm-E7“KŸä›Úº:ÏZôûþ¿~• sšÜ\[•ŸžpíôA3[7çYÿ« ¯%=ÌøëE(/ò³_ägSåä±Dßr¼'B(/ålÆÉÿRhtÛñ.s‚ÈRÀ@Càñá=Ïà‹Á©[ñG˜šó"y£/rV÷¬Y³êêê233%?¥°°ÐÅÅåèÑ£.…ÙƒPzzúǪî°uú2@_‚¯àKÒ^Q€D¹!#û;î())ÉÌÌœ3gÎ'•––F"‘<<VÛÚÚš——Y>}¬wSðììl>ŸoiiÙ«½:è™DŸËå~XÈápnß¾mii©¦¦Ö#½$$íКšš;w644P©TKKËéÓ§ãÃôïܹÓÞÞîææVTT$uœ€O í}&“©ªªêïïïææ–ŸŸŸ˜˜ˆ•óùü¬¬,ccã¡C‡J$àÓH{GŸF£’H$„—˽víš§§§œœÜƒgÏžÝA>Twô}||þýïcY>BÈÂÂB(–••!„®_¿®¡¡¡££Ãd2±üL&S H1 KRÝÑg0¢»t:!Äb±x<Þ»wïBÛ¶mÃk·mÛ¶téR===izHBªD?--MUUÕÆÆÛmiiAÑh4‰´hÑ"ü°{÷î=xð`áÂ…ÒtT‰~yyyAAÁèÑ£±Wb’H$]]]`jjŠöòåË%€^%Õ}ww÷ÚÚÚ˜˜˜ÜÜܤ¤¤ììl'''YYÙž Ð=R%ú~~~L&311±¨¨hòäÉ_ýuOEè6+áYzzúǪî°uú2@_’ö…Y€Ï$ú @è0A¢À‰>$ú @è0A¢ßµæææ„„„þŽ ÒÿDååå|jHô»PXXèèè¸fÍš–––þŽ =ò9qâÄÈÈÈOªÀ "U¢µþŸvíÚÕeU/ÉÊÊÒ××ߺu«ä§ðx<ƒ±{÷îðüùóéÓ§3Œ›7o*(( „PXelÒ´q#Bˆ•]elÂJºŒÏJº\ë=µÊbXµ½CÓºõ¿39ÖŸVêêuøÇ½_Ll‚úú:_ß*S³šI“¹ŠBÜÇ+uõšÖ¬íâªÄFØ©ºººo¾ùFKKËÉÉ »üèÑ#ƒ±lÙ².úêJ7¾)“Àø[HHˆô bØlöòåËÍÌÌöìÙÓSÍ~L'?Q!„þøãcccMMÍÇŸ8qÂÕÕuÈ!£G^½zukk+V1oÞ¼uëÖÅÄÄt8EL)ÏWWW÷ððÀw)Š$U½áéÓ§MMM>ì©Á?þH£Ñ.^¼ø>#„<Þ_›D‚ÃAÄ¿>,±¯]kX²„â줸y3¿ô-3濼\åT<Þ bh(Içý›ÆIFFbzgžˆåæ?PÚõK롈–]»TNÆr²²B²Þ^]Äýñ?&***//ïÀáááÛ·o?þ|ff&Bhúôé]ôÕ•ü¦Œ;666!ôã?Jß.&&&>>~ݺu¥¥¥?ýô“««k¶/ªÓŸ¨ÖÖÖ 6ÄÇÇ‹æýxl«V­šýÿÛ»óø˜îýàï3ûd’ɾÊj%ACPÒ ¶Z*µU)µµ¢JÛ+µ¶¨^¿¢èBJƒÚBU©/UÍMˆTÄRbßJDBö}’YÏüþ8Œi$“ÈD¢ãõ||÷;s>ËyŸ™s¯÷œ¼ÏçÈdOÛô,Lœ8±Y³fõ5á®]»Î;·k×®J×Y>Ÿø""÷Ÿ|n{yô¯¯ct4·çèT²d ››Ësvæ:ˆ_ Ô:ëbssøžžÒ7ÞPŸ8©¹t‰ˆT‰Çy¶¶â=j[]„ÕÉÎÎööö5jTbbâùóç‰(!!ÁÎÎÎü”·¿¡C‡Ñ´iÓÌŸÍ !!¡C‡óæÍÓjµyyy¹¹¹õ8y%UžQááá‡^¹reVVÖš5kŒûGEEuêÔi÷îÝÜ[—Ï>ûìÖ­[-Z´ "†aV­ZõçŸ.X°`Ïž=ÆM4À‹Ãrjôù|~¯^½ëkÂmÛ¶0 rƒPÈDĸÿr›µii —æÖDÒaoد_OBa½£×hÔ§O‹ûõ3ÌoJ5Ö’Z­NJJ8p ÐìàëýK©wEEED$vïÞ=bĈg·¯*Ϩ%K–;vlÊ”)•:ëõú´´´Þ½{¶¼úê«D”’’bØ"—ËÃÃÃããã333+ 7Ñ/ˆúIô5Mšž0cÆŒµk×¶nÝÚÍÍmĈwïÞ5´0`èСÇ òõõ;w.˲d²z››022ÒßßßËËk„ yyyD¤P(ìì윜œˆhéÒ¥ÜXãbý¢¢¢S§N >üÉ €¸Ô™Ëƒ…3o¾»›æÒebYî-ÏÑQ2h Ïήö‡o‚æìY}E…ÔP·Ã²eß|“Û§oVËVÙ;}ô‘.;»Æk鯿þª¨¨¨MÝ˲˗/ïÖ­›»»{‹-ÂÃ󲲸¦ê¾”ôôt;;»Q£Fùùù½þúë{÷îõöö3fŒN§£šN6oÞêááÎ}˦åççkµZF“ŸŸŸŸŸ_TTÄ5qaz>|ØÎÎîÌ™3TýÅÙ¾}{·nÝÜÜÜþóŸÿßn[ÝÕ´iÓ–-[>žJ¥R©TR©Ô°åܹsDTRRbÜmذa,ËÆÆÆ>9ƒ‰&x˜[º“››»lÙ²ÂÂB±XÜ®]»°°0C-¾‰&âããõzýÆÓÒÒ.\øÖ[o%%%1 õªTªo¿ývùòågÏž]¶lY¯^½ú÷ïoºzûèÑ£D´iÓ¦k×®-\¸P«ÕFGGK$’­[·²,;qâÄáÇ¿þúëDÔºukÃ(®¬¼sçÎU„(2\1 w½œÿ°0Föþô‚1cŠ?™-_ú_F"yr[RÂp¯y¶¶Ä7UQÃȬÙü|݃ºŒ{ŒæâE¾($„k-ûöÛÒo¾•/œúžîA–âÇ5—.;Çþïáõþj"¬Žµµu^^Þýû÷ÓÓÓårù¹sçÖhƒ˜ IDATüüüzöìiz­X±bÅŠS¦L™1cÆýû÷ׯ_áÂ…ãÇ Ó_ ÇûðÃ/^,‘HæÏŸ?wîÜøøø¾}ûRM'@•¢¢¢fÏžýÆoLž<ùîÝ»ëׯ¿~ýzBB‚éQ!!!÷îÝã^7kÖŒˆüüü¸Ê%Óª<£ˆ(::zÆŒƒ OIIÙ°aý{÷~ùån”©3ª&Z­vÑ¢E‘‘‘O6ùúú:::^¸pᩚàE`n¢¯P(ÜÝݘ——Çãñ Å&šL°±±Y»v-uïÞˆf̘qåÊC­rrrrr²··wHHÈÉ“' ÕT½-“ɸÒçîÝ»çææ®Zµª¤¤D.—:T«Õ‘¿¿?7ÜWðàçç÷ä„®æ‚ÂÖ­Ý略‹{t—¾¸dɪãÇ­gýÇjÔ¨Jó‡=¾šë|ô¨ y3ŸƒÕÈ?ÿœÜ… m¿ýF:dˆlÊCÝNÅß$_“±„{+êÚ¥mÚ´‹/vèÐÁĨ 6(•ÊyóæI$’E‹‘ñåsª;£Ö¬YÓ­[·;vpÝÜÝÝçÏŸ÷î]2yF™–——7a„“'O†‡‡¯_¿þÉM›6­®>ÇDXŸODæèÑ£´²²2Ýd‚qrÖ¥K"ºsçŽ!ÏkÖ¬™··7‰Åâýû÷×&Bã ;tè ÓéÒÓÓÛµkgzW !—Ëk³ Ùĉ¢NKþûßâYÊC‡ì×­cŒrGÛËùž^Ük~jæxHЪ•ËéSÚÛ·ùîîŒX\0fŒ*éÏÑÑnÅ qŸWy®.šËWtÙÙ|WW"‹‚ƒŸ*Tc­[·¾zõjjjª‡‡‡D" ;v옳³ó·ß~[Å- F\]]/^¼˜••åææFDݺuëÖ­[möÈçó¹ƒÇãñx<2*ñ2}<‰eÙ´´´Aƒåççs[¸ufnß¾m:ÑïÚµ+ÙÚÚÊd²Úüù Ê3ªM›6)))Ÿ|òxñÓ7ß|ÓÇÇÇp Õ팺téRhh¨J¥ú¿ÿû?Ÿ*}›Jõ<µi‹gVþÈ‘#?üðCþ£Ê½^Ÿ‘‘aºÉ4ã@% •——¶8?ZÁ¦öŒë…¸×5Žâv]›ž•Ú9þ¼Ë.r­úXbÉ’%ÿˆä¥—Ä!=¸ÿcjqñ˜±²RŸ8Qúÿ¾¬øuŸ*é„ÝÚ5ÂV-K–.%"Û/¿$­6·GHá¤IЍ(ãýº±²²:vìØ¢E‹~þùçcÇŽmܸÑßߟ»ÎmÂ×_­Ñh:tè0zôèµk× ôÍaúx’Z­Öh4«W¯nöw«Z­6?˜*UyF©ÕjN'‹ MŽŽŽƒ ²··çÞÖíŒÚ·oŸ‹‹KBBBÈ£ª­'UTTHª*3ÝϬDßÎÎÎÇ‘L&#"¥RiºÉ¼š–„¯/Ü}º999u.}ýuÙ´iå;b]f® –-[·žôz¶°€‘ɤC†;s üüœýiûÕ ž½ƒ"jCN×n{öÖ}GD,Ë~÷Ýwz½>??ßÚÚzذaݺu«q­ÉfÍš%''¯Y³ÆÑÑqíÚµíÚµÛµk—9aÔÙ¸qãþê"}¨Û5`À€˜˜OOO}rrrª[×ÈDX<³òæØØØäädÃ[n®ÐÙD“iÆ?¸ç€ÖXíSg|>ŸÇãqë½ÑÝ»wcbb¸×mÛ¶%"î1±µ¤úóOî¶a‡öIJ¬벫ObssE¡¯TÙʈDÒ°0ÛU+]N´1¢è“OØZ,5S¤¤¤ììlãÅkI,9222òòåËo½õÖ|Pç_Gœ§=D"ŸÏwppèùOO>e¶öÄb±qµ¹ Ï…¡R© [ bbb +ù<í%‹Åbq`` á¯ܧQ©øG¡Pܾ}»ÊR4Mð"0+ÑÏÌÌßǧÎáUæÍ›w‹‰‰aYöå—_~rMð"0ëfÜ^½z­_¿~óæÍYYYIII!!!\M°‰&Ód2ÙСCGŽ™ššº~ýú6mÚÔxIòüùóiiiD¤ÓéRRRöîÝ+‰† R›C;vì²eË.\èàà°uëVãQ£G^·n]FF†é « ï͘Y.~åmJŠbó«#jS‹_5Nyèa»v<žƒ£¾¬¬|ÇNõñDž“1bQɲåÚô{¢ŽuYYŠM›„­[ ªZ޽v»Ò8p }ûöŽŽŽNNN¥¥¥[¶lIHHpqq1=P,þùçwïÞíÔ©Óýû÷×­[×¶m[2ãK©î01áÌ™3ßÿ}nTnnî÷ßLDEEE†¶¶¶¦×zóÍ7ß}÷]nÂk×®;v¬Æ°‰èƒ>øàƒ&OžÜ¯_¿”””ÈÈÈÞ½{ûýÒ{Ú3êÝwß5kÖ¨Q£|ëÖ­õë×÷ìÙ“{,®Á¦M›|}}¹‹+1Ñ/³}__ß1cÆ$$$8p@&“õë×ÏpIØD“iÁÁÁAAA_}õU~~þ+¯¼²zõjÓ«¡ѶmÛ K+ÆÄÄÄÄÄÈåòZ&úÿùÏŠ‹‹wîÜɲlXXØ—_~ih ÿñÇ#""~úé§c "iX[XX¾=Zu$žçì,›4ÉfÎìGUGu⛟oõÖh"’{C_²x1ÏÕÕvé‰È&"‚‹ËÙSñóÏ€B¢`èX ³VÝÙ°aCJJŠñGGÇÙ³gWê¦Ñhîß¿ïããcξ öÌ]^ÓÙÙ¹ÿþ†·"‘ȸ•eÙÄÄÄøøx–e—,YÂ0Œ™»€Ú07Ñ—ÉdU6étºèèèëׯwéÒ¥W¯^ÈòÌ3|`Vllìµk×FŽÙ©S§g·xRýÜŒ«Ñh*m)..NLL B–Ðð̽¢Ÿ››»lÙ²ÂÂB±XÜ®]»°°0®L?99Y§ÓõîÝ[£Ñðù|Ëû4s}…Báîî>pàÀ¼¼¼¸¸87bÄ"JMM‰DÛ¶mËÎÎ …íÚµ:t¨T*­˜ æ&úR©tÒ¤I|>Ÿˆ4ÍÑ£GheeUXX¨V«]]]ûö훕•uôèѲ²²)S¦ÔGÌP³ý‘#Gêõz.Ë'"ÿøøøŒŒŒ–-[–••ùøøŒ;–ˆ$ÉÁƒóòòœœœê!j0ɬÒy;;;{{{Ã[™LFDJ¥’eY•JÕ¼ysCSË–-‰(77לÝ@-™•èÇÆÆ&''Þ–––‘T*åñx"‘Èx)–e‰H¯×›³;¨%³ýÌÌÌ£GrI<]¾|™Ïç{yy‘ŸŸßÕ«WµZ-×tíÚ5"rss3/Z¨þÂE‹ê<ØÞÞþرcééé:îܹsIII=zôhÓ¦ ×”˜˜˜ššªÓéΟ?ÿçŸ×_äP+iiiÕ5eêl2hHŒVÇš3þÒ¥K ¹¹¹2™¬sçÎ={ö4Ü›û÷ßÇÆÆfggËd²:ôéÓG(ÖGÌðâââªk:­òhÈH !™›èÀs‰>À‹ ¬°@Hô,} „DÀ!Ѱ@Hô,} „DžNIIÉÞ½{kìvöìÙK—.5@<P%$úð._¾Üµk׈ˆˆÒÒRÓ=£¢¢^}õÕ¨¨¨† *˜3xÆ )))Æ[gÏžMDË–-+,,¬ÔúôéÞÞÞ5N«×ióÿÚ^qï<1<¹Û€ÁæiÚñãÇÇŽ;iÒ¤E‹=ëQ&¨TªˆˆˆC‡ñùü÷Þ{/""¢^¦}*Z­ÖÉÉiÁ‚Ÿ|òI•nݺæêêkccÃmܶmÛ?ü––æââÒ¯_¿%K–H¥R"ŠŒŒ´±±™={¶P(œ8qbÑ™‰>9;;÷ïßßðV$q/Þxã µZmØ~ùòå‹/Êd²ÚÌYz+¡,å¸]à­"¿ð¯b禷6fÆY7n_¼x±F™°yóæèèèÙ³gß»wï¿ÿýoçÎCCCëkòzÁ²ìÔ©S¥Ré¾}û\]]¹œ9sæ!C¦L™’ššúÃ?äæænÙ²…ˆ„BáÊ•+KJJæÎûòË/·jÕª1£xñ˜›èËd²€€€'·WJìÝÝÝk3§òÁU±£]û0½žÕ)KuʪDÌ1qâÄfÍš6À(:tè0oÞ<­V›———››[_3×—]»v;wn×®]†,ŸˆV®\Ù¥K—íÛ·somll–-[–››ëììLD ìZµêÏ?ÿ\°`Áž={'n€UCÔ襧§×>-fÕå<±51 ϵ÷G2ß.Ï.6>Ÿß«W¯Zþ1s” EEED$vïÞ=bĈúš¹¾lÛ¶-00pÀ€ÆçλbÅ ÃÛ½^ëÖ-ù\Ÿ™™Ùp±@}%úÆDë¥K—ôz}ûöíkœ‡U+tª2=«Ó³:ªL§*cÕ CkéÍ„û¿~÷§iÿ77ÿôvVSahzð¿/³âV*³odþß¼ôŸgœÙIz½é}íÝ»×î‘O?ý´ÆØj0cÆŒÈÈH//¯ &äååÕ8aQQQ~~¾V«Õh4ùùùùùùEEE†ÖÍ›7‡††zxx„‡‡O8`À€¡C‡?~<((È××wîܹ,˦§§ÛÙÙ5ÊÏÏïõ×_ß»w¯··÷˜1ct:éõúo¾ù&((ÈÕÕµU«Vü1wO­B¡°³³srr"¢¥K—rG÷ÕW_yêÔ©áÇW ~À€Æ_+¹¡|‹3lØ0–eccc+ŽŽöññ7n\Ô¹¥;¹¹¹Ü}·b±¸]»vaaa•ò<"ºpáB“&MjsýûþÁÅZE>÷úÞî™D$°qñ [FD%)øk‡´I MËžÚ’ì’‡5%Yn}ß6ªg5ÅWÿp£ÊK+º¸_êÑNÚÄÔߺuë¶uëV"š:ují×ô¨£GѦM›®]»¶páB­VmzÂ{÷îq¯›5kFD~~~çÏŸ'¢¨¨¨Ù³g¿ñÆ“'O¾{÷îúõë¯_¿žÀ0 ×_¥R}ûí·Ë—/?{öì²eËzõêÕºuk"âñx~øáâÅ‹%ÉüùóçÎß·oß+V,[¶ìÍ7ßüøã322Ö®]{çÎ}ûöI$’­[·²,;qâÄáÇ¿þúëDÄMÅáîFèܹ³écÙ¶m›££c¥_t¾¾¾ŽŽŽ.\¨ÔyïÞ½ÅÅÅ¿ýö[QQ‘é™ài™›è+ ww÷æååÅÅÅñx¼Je'ùùù™™™ƒ ªÍlÎ=ÞcušÂ³?1|¡]ÇDÄ<üÙPúw¼Ø¹¹k︷|©mAòÏšâB[wn‹:/­ÉÐ/ÖN×ÖÊì[¬Fiz_C‡%¢iÓ¦ÕþxM’ÉdkÖ¬!¢îÝ»çææ®Zµª¤¤D.—›˜pÆ J¥rÞ¼y‰„[Ç[µ†ˆ6mÚ4`À€Í›7so›7o>mÚ´‹/vèÐÛ’œœœœœìííròäI…âá_? Ô¿ÿÅ‹÷îÝ{üøñsçÎMMMíÛ·ïµk×ÂÃÿüòK®›\.Ÿ?~fff“&M†ªÕj‰Èßߟ;@c\៟Ÿ‰Y¶lYLLÌÚµk…Ba¥¦¦M›>Yº3iÒ¤ŒŒŒÐÐPdùÏ‚¹‰¾T*4iŸÏ'"FsôèÑZYY:\¼x‘a˜*oØ}’Ø¥‰¬x±ÔÝh¥½^[šcÛîñ¯©G;JþYSò8Ñظ ¬ˆˆá Üú6Âò”DdHÁ¹×:.==½]»v&†tíÚ•ˆlmme2YÏž= ÛY–MKK4hP~þÃ?qp÷7ß¾}Û°—fÍšqË•ŠÅâýû÷Qzz:ñù|îáñx<ÕVq‹ "¥RY^^îîîNDYYYMš41}\%%%DTÝ/–’’’iÓ¦ÅÄÄ,_¾üí·ß~²ƒ 7ƒ±!C† 2Äô~ ÎÌJôGŽ©×빜’ˆüýýããã322Z¶lièséÒ%ooo{{{sv¤gµzVÇð11±•a _jêÂyÃ0.[â^WTTTßݵZ­ÑhV¯^½zõêJÛ ¯¹ÅmjO¥R­^½zÇŽ†,ËÖ8P"‘QEEÅ“ ¤†……¥¦¦îÞ½ûÕW_­rxEE74³ýJE\¨T>®™ÉÍÍ}ðàAC]¸µÀ§üŽ7®Ò-°Æ¥óÜÕúÚûì³Ï¢¢¢¦L™Ò«W/™LvþüùÏ?ÿ¼6¹ûtsrr¸ÆÞ{ï½›7oÆÅÅ™øÃENNN=.E µaV¢ëèèĽå–p1”˜Ó£ºó“<†'`x|½îñÅlV«""žPlæÌÏ-‘HÄçóŒëyÌ´k׮ѣG¯\¹’{kü“Œˆø|>ÇãÖç!¢»wï^¿~[O³mÛ¶DtéÒ¥6mþñ䲸¸¸¸¸¸+V˜Èò ÅíÛ·ÇŒS_GµaÖUðÌÌÌ£Gj?._¾Ìçó½¼¼ .^¼èëëkúnÔZaKŃk† ÊûWˆH(w7wæçÇkÑ¢ELLŒ!ó>pà€Ý©S§ê6¡^¯W«ÕÆ„ILL4îÀ0Œ§§ç7¸·ßÿý;ï¼Ã½öóósss;tèP¥9ÿýwGGÇI“&™ØoLL ˲/¿ür¥í¿ýö[pppDDãÜM`ñ̺¢ß«W¯õë×oÞ¼9000+++)))$$ÄP•••““Vq’MË^gvæýVêÕQ[’Urý°ÄÕßp'nœ?>--ˆt:]JJÊÞ½{E"QUFuU73gÎ|ÿý÷‡:räÈÜÜÜï¿ÿ>88888¸n³1 ºeË;;;ooï¿þúëÉß cÇŽ]¶lÙÂ… ¶nÝj|\£G^·n]FF†§§§aã¥K—\\\¸û€ zõêÅ=ü‹³iÓ&___îžcc?þøãÍ›7oÞ¼ùé§Ÿbá€zgV¢ïëë;f̘„„„Èd²~ýú×™\¼x‘ÇãÕr½Éýû0 ¯ôÖŸgvò%rëfÝíƒF™3á¶mÛ +WÆÄÄÄÄÄÈåòSöºª®ÜeíÚµsæÌ±±±ü³Ï>;v¬q‡ÿüç?ÅÅÅ;wîdY6,,̰'…‡‡ÿøã?ýô“a!ÿ’’’”””É“'OgHôwîÜyâĉuëÖ† 6,99Ëk<#ŒVWó¢+D´cÇŽéÓ§OŸ>}éÒ¥µéŸ˜˜8bĈÐÐÐÝ»w?ëØÀ„¸¸¸êšN«<2hH¸R <#cÇŽýì³Ï"##ÇŽ[^^nºó† †Þ±cÇ-[¶4HtðHôá)Ìš5+::Z§ÓÕ¸.¾R© ß¿¿ñÓÓ Á tÀ¡tàÅ„+úˆÑêX?ôàßWô,} „DÀ™õd\ Àg•6Ê»J¡“RèØ(ÈT™îEÇ+mLu©gþ¿ÁÜ‹’dª ã-eï,Ûn½iÓ&>Ÿß·o߯ê)ddd(ŠÛ·o7v Ï1z—¢X·-µµRg»k ­ÔÙå"·ÆŽÐ,eL•éQx¬ÊÙòÎeâ&*¡}£\Î7áY|)5~U*”ùKÕ9¶å©…²6¶åiDT*ñÑò¤u‹žCÎÎÎ]»v%¢W^yeΜ9ñññÿ®D¿oß¾îîî~~~ÀóE@DB]O¯!¢BY=ÃWˆ=òl: X%Ë;¼gŽå‰J¥¾EžŸ/E!öÐðm„ºR™ê¼"ˆŠ¬Z5p Ð`Z¶l™””ÔØQ<ØØQ¡ãI…º2{ÅuÓMeWË.‹´%Œ^Çg•òŠÛ^ù‡«Æ]‹OóY‘^¢És/Läš\‹O[+ïñô¡NáZtJ +7óȹ‚u}õŸ@•a˜þ4l…]ùMF¯“h l*îš¡©àžá¾=Ã3~kàTrN¤-áéuRu¶¡Ö¿nJ¤MYF$ÐUQ¡ —ó,V«U(ÅÅŇ>wî\¿~ýŒ[5Íþýû'Mš4hРC‡?žˆbbb¢¸ó¢ IDAT¢¢ÜÜÜ&Nœrúôé¥K—êõz"Ú»wïÎ;[¶l9eÊ”¾}û?~|åÊ•Oîô‡~xðàADD„ ·åâÅ‹~øá”)SRRR–/_ÎMÈíËÎÎîwÞéÒ¥K||üŠ+¸!þþþ³fÍš5k–PXÅ_¼/]ºtïÞ½>úh̘1çÎûᇈH$Íš5ëã?&¢îÝ»sùÊ%"Ú³gÏîݻ۴i3eÊ”^¸paÉ’%:Î0gRR’B¡8}ú´B¡0÷sxÆjX^“ÑëlËSèa¥x;‰&¿IáQ¡®L¦Êä:”Jý”BG÷¢Är‘k‘Ìß+?V¨-U äÕ5qWĉ(ß: ÐºT•Ó¤0A¨+•ª² \Êü ¬ÛеEÞy1B]™D§ØÊTˆ¨Àº]¬­•úÁSU™W©Æ‚õ'ÃP ¹O#ß: PÖF¬-ð,ˆç>R‰±Œ@Ï𽎈tüº_Î7Mǧ¸¾Yãª;<Ó¡·¼"M^q[Ϙu·1ËŠ­šÚ+nhøÖ qs¦€çбcÇŽ{ø¯aÇŽ+­ºsëÖ­5kÖ8;;·mÛöúõëJ¥’ˆbbb‚‚‚¸t™ˆÜÝÝ###o߾ݴiÓ»wï8p„ \“••ÕÖ­[óóó¯d}èСÄÄÄ©S§6oþxõ<©T:mÚ4"jÓ¦ ­[·îîÝ»¾¾¾111­Zµš7o×ÍÞÞ~ëÖ­™žM<¹i×®]ûäq‰ÅbÄÅÅÅ¿þúkyy¹••U×®]¹ÜÝËËËâs’’’ºví:yòdîmëÖ­ãââŠŠŠ Á÷ë×//// @&“=õ аjHô…º2îJv¬žáUˆœËEn2U¦H[­ó¨g˜‡I䣫ã†kóU61DìCˆH)tÒ¯\ì¦ÈEÚb¡NaHôË$žD¤Ø=j*c!·âd¬­žá)ÄMÔ¹H[ò >Çž CÇsGW(k£gxJ¡“áÓà†°Œð¾}¨µ2]Í——J¼Ÿix5*‘úQ‰´i‰´©éž<½ÆP d,WÞ©XÚŒ{Í1z-Q]VÙ×S!t±W\w*9/Ò•r¿+÷y´/ýÃ}± é*…¡gžù£¾ž ãѧAͳ6îÉ<*Ý!¢r‘k¹ÈõYÇVO±0NÕkùé&÷<½F^žFDB]™µ2£LâU?!ÀóÁÎήmÛ¶DÔ¡C‡5kÖ\½z•ÛµVê¯Õju:ݾ}ûöíÛWi;i4š_ý5!!!//ÏÐIJÿ¡Q«Õ«W¯‰D†«æÁãÜE"©T*n_bñã¬C"‘÷‡ÓŒ'äj{Ôjµé!ï½÷Þ’%K>øàƒÀÀÀ6mÚôèÑø@àߥžŒkü8U=ë:Å|¾=ñØÚFyŠm½­ýÏòD·ÜÞ2ÑA^‘ÆÓk´|©@WaWþ7} Ö¹sg"JMM5$úL5õŸ½{÷îÞ½»ñooo"Ú¶m[LLLÿþý%IZZÚŽ; }***X–U©TñññÏîÉ\uæîîþÝwß>}úÒ¥K¿ýöÛŽ;¦M›ÚØqÔ…€ˆ­Ø¨gô:îêµmù-«,{5±\vËÓ댆<ýþtå\–ŸeÛ­Lê­'žw~ŒXShz”žø•Â0¾ˆÞ` FHuùD®ÿTmSqW-´+²jaN.nâKá½áþ´ÂÝÌë\’LD9òÎuÞcõôvŠ›D”#ïâZ|JªÎk ±ð€¥â.½.ÀWI ðx<›*µ|xÇŽAAA\QГ=+**ˆH, >Ÿ¯R©*5q×õëŒÇã1 c¸Ë6''çÞ½{AAAD$ {ôèÑ£GNµnݺ:¯DðoÁ#" ßš[ÃÑ^q!½Tí\rΡì O¯Ñð­¹òzÅF¯“ªs­ÔYD¤È븿GÕ/Z¾LOŒTS›R{-ߊ{á ¸ÊèuÆeñ I÷ærn{Å5FÏŠ´¥¾¹¿µÈÚe[~‹ëÀÓkšþi[‘ê\’l£L7s_Õ})\µÀ–ˆºr‰&O¦Ì°-Oán®wÖÊL¡®L÷VˆÝ¹rûr<Àbq‹èß#û$†a<<<Ξ=kø=pêÔ©‘#GÞ¸qC¯×k4ãU¯^½j€b´:”^X2WôN«ÌZžgÿ‚;>ài!Ѱ@Ÿè—””ìÝ»·±£¨gÏžåÊ Ðè9Ñ¿|ùr×®]#""JKK7óEEE½úê«QQQ@£.¯yëÖ­°°0WWרØX›FŒ¤^DFFÚØØÌž=[(Nœ8±±Ã€Z£­ºÃ²lŸ>}rrrŽ9âêêÚ(1Ô;½^ÿÞ{ï8pàØ±c­Zµjìpˆ°êÀ‹ªÑJwvíÚuîܹ•+WZL–OD ìZµÊÖÖvÁ‚ ¼Ð&úW¯^ÕétUö¨[S¶mÛ8`À€º nÉåòðððøøøÌÌÌÆŽ^\<"*++0`@§N¢££µZ­qsÝšjTTTtêÔ©áÇoT«Õ;wîÛ·¯^¯ç¶DFFÚÛÛŸ={¶.GFtóæM;;»_~ùÅ8f—•+WÖmB" °{™3gŒû 6ŒeÙØØØ:ïÀL<"²¶¶>räHppð‡~øÒK/mÙ²E­VsÍukªÑÅ‹‰¨sçÎÆE"ÑŠ+Μ9MDYYY_~ùåøñã;uêT·ckÙ²e‹-:dØrøðaµZ=hРºMHD«W¯ÞjÄËËK&“yyy÷ñõõutt¼páB÷`¦‡¥;-[¶üá‡Μ9ѱcÇ7r‰{ÝšLãÊZüüü*mïÕ«WXXØâÅ‹ ?ýôS‘H´hÑ"soРA\rϽýã?üüüZ·n]ç ûöí;ô‘¬¬¬{÷î­ZµÊÍÍ­R·¦M›¢tÑ?nÆmÚ´iddä¹sç<==#""¸ëîæ4U§¤¤„ˆärù“M_~ù¥R©|ë­·öìÙ³xñb‡ºÑàÁƒKKK?ND:.66ÖœËùÆ®^½ºhÑ¢‘#GŽ=úÉVîEåUw’’’fΜyúôéàààJ)ukª’D"!¢ŠŠŠ'›ÜÝÝçÌ™sêÔ©N:7î©蟂‚‚ÜÜÜþøã":uêTaaa½$úJ¥ròäÉnnn«W¯®²CEEwŒâq¢ôèÑ×^{mРA*•jß¾}±±±†Š”º5™àääDD999U¶r7ã2 cæ±q“ 8Kô:äääÔ¥Kó§7o^jjê¦M›ª{ÎWNNŽ£££ù;¨›‡«î¼úê«o¼ñŸÏÿí·ßþøã^½zqÍukªQÛ¶m‰èÒ¥KO6=xð`ÅŠ]»v=sæÌöíÛÍ?ÂAƒedd\ºt)&&fÀ€<ž¹8xðàæÍ›,XTe…BqûöívíÚ™¹#€:{¸êNß¾}cbb<bÜ\·¦ùùù¹¹¹¯‡c0oÞ<‰DòÓO?1bñâÅÆ­ÑÑÑ>>>OUÒóÊ+¯Èåòo¾ù&55uðàÁ•ZŸvÂû÷ïϘ1#44tæÌ™Õõ‰‰‰aYöå—_®}õ‹ÑêØFÙñâŋ׭[—œœìééiؘ¶fÍšqãÆeeeuêÔiøðáß~û­¡CXXXBBݼyÓÅÅ¥–ûš2eÊž={¤RéíÛ·+•Î?í„Ç_ºt©ñ}{õêe|ÓðÀïß¿þüùz©>0S\\\uM§U  4$sëXê,<<\,GDD¥V«?ùä“Î;¿ýöÛDäææ6þümÛ¶?0kÒ¤IÎÎÎ ÃØÚÚÖ~_Ü ¸¯¾úê“7È>í„7oÞÔëõóçÏŸl$55ÕÐaçÎ'Nœ˜3g²|hDvEŸˆvìØ1}úôéÓ§/]º´ö£†žŸŸÏ]†¯¥Ë—/‡„„¬_¿¾Ê¥0ë0auGŒº{÷nóg¨¸¢ðbj´+úD4vìØÏ>û,22rìØ±åååµ’’’’0jÔ¨§ÚQll,ŸÏïß¿}MX¥ 6 >¼cÇŽ[¶l16s4f¢OD³fÍŠŽŽÖétµ\u~ñâÅÎÎÎï¼óÎSíåСC]ºt±··¯¯ «¤T*ÃÃÃ÷ïßoeeeþlæhÌÒ:ÈÌ̼wï^×®]k?$''§U«V_|ñÅ|P/ü» tàÅô/Kôài!Ñx15ré< Hô,} Tu¢_^^¾}ûöåYˆ¿yófcGÐЪHôoܸñòË/Ϙ1ãðáà P=R(ï¿ÿ~÷îÝ·mÛÖØ±4¨Ê‰þÍ›7_{íµ;wîøúúÊårn#˲K—.µ···³³Û¿¿ù{m˜ ÕjõK/½¤ÑhfΜ¹qãFó÷ðoñD_­V7®°°°uëÖñññÁÁÁDTPP0räȯ¾úJ¯××Ë.lB{{û;wN:•ˆæÌ™sþüùzÙÀóï‰~TTÔßÿmeeõóÏ?;88pÇŽ{äÈ‘>}ú8;;×Ë.xÂeË–õèÑC§ÓÍ™3§^vðü{œèëõúõë×ÑÌ™3½½½ Û—/_>o޼ݻwK$’zÙeOÈ0ÌÊ•+‰è¯¿þJNN®—=<ç†WW®\ÉÈÈ`füøñÆ=ëq— ?¡¿¿çÎÏœ9T»x>=¾¢Ï•°ûùùyxXàÓ°»wïNŽÀâ=NôÓÓÓ‰¨E‹Ì3Ô²eKztŒïq¢_VVFD¶¶¶Ì3Ä-ZZZÚØ4„lj¾H$"¢ŠŠŠÆ æâŽK,7v áq¢ïêêJD÷ïßo¼`ž¡Уc°x}"ºzõªJ¥zª)æÍ›×¤I“~ýúåååÕKLõ>!q krÇ`ñ'ú/¿ü²D"Q*•¿ÿþ{íÇgee­[·N¡Püõ×_»wï6? zŸˆÊÊÊbcc‰¨W¯^õ2!Àsîq¢/•J‡ FD+W®Ôh4µokk+•J¹×|>ßü€ê}B"úî»ï***œœœ P/<çxÆo>ùä‰DríÚµE‹Õr¼T*ݳg››µmÛÖü€ê}ÂãÇýõ×ôèèÌŸàùÇhu¬ñûÍ›7üñÇDþùçŸ×f™š{÷îuìØÑÉÉéêÕ«õr ¾'€B¢`èX $ú‰>€B¢`èX $ú‰>€B¢`èX $ú‰>€B¢`èX $ú‰>€B¢`èX $ú‰>€B¢`èX $ú‰>€B¢`èX $ú‰>€B¢`èX $ú‰>€B¢`èX $ú‰>€B¢`èX $ú‰>€B¢`èX $ú‰>€B¢` ¼¿‘#GV×ôË/¿4d$`Á:/=ÚØ!uëÉôrµ®¡Â4Ëœ-;ûÚ7vð¼QvvöªU«ÔjõªU«>úè£ &H$®9&&fãÆ7nìÚµëìÙ³{÷îm¹oß¾}ûö 0`öìÙ/½ôRã„P;ÉÄ—}·wð‰ÿùo׫ë)ñ‰ˆÕë ™ýÎÓ÷j³ ÃŒïæÝ¯­‹§½´¨\s>½híÑ´ÜR×4©»Ï€v®î¶’2•ödZÁwGR j"r´Å|؈Æl83óÕfí½l¯Þ/Y¸ÿ:7ði…´pÔdDP“‹ÅïœJ+¨Ã$`IxDäêêûÚk¯eggÏ;·}ûö‘‘‘DÔ·oߨ¨¨V­Z:ujذa}úôùßÿþÇ\¾|¹‡‡GLLLïÞ½GuöìÙÆ<€'xÙKöÿuZ×°Ž*îǤ»ßNy;šÕ¯ùô^M[¸XK„|w[ÉÀ· ã;J…|"šÜÃgj¨Ÿ£•PÀs‰¸mÿR¥*ÿû6÷u² x|ì¹;ê )¥à³ý×nç•·÷´]óVûÍ‚z4w¬‡c€­‡¥;:tøé§Ÿ‡ ’““³`Á‚ÀÀÀ={öðùüQ£F|xaaaã xÌ篷Þ3­Ëöî µ.êØí!kO®KH+®ÐÔû¾ÄÞ°—šQÔ±ÛÝ—ý9iË9¥F×ÄNÒ‘Ç0ãºyÑÞ~ùË„v^dõz/ig¿ØÜÍ/²æäÿû\z‘–eë«×Ç\Éõ×¼_¯ÞÊ.k×Dþõ›Û'wjájmþ1À¿Ñ?nÆm×®ÝöíÛ?îåå•››û°–˜˜¸yóf‰DrñâÅ¿þú‹ˆD"ѤI“Î;7wî\":räHVVVÃ@%R`€aöžË²æÄ†Ä;¥Jí3Ú—§½TÀcôD[O¤ktìåÌâ3w ‰È×IÆ0ñËåé;/ì8}OËêOß.¸WNDnr‰ñ ¿]Ê"¢ß.>˜ºýü²?nš «×¾ž3vã™y¿^UiY7›À&¶æLÿ^ÿX^S§ÓýòË/«V­ºwﹸ¸šÊËË7oÞ¼fÍ¥RÉ0Œƒƒ·ýÞ½{ß|óMtt4YYYÉd²  jZ¾T©µ‘†vððx[NÜÍ(¬xFûâîßeˆ’æ†o—Šø:V!½øí®^õiîe/•ù\ùGéNA™ºã‘ ùÃ^òx»«·XÀÓWhȦ§€‡‰¾F£ùùçŸW­Zuûöm"êÖ­Ûœ9szöìID¥¥¥QQQßÿ}~~>Ç6lØìÙ³ýýýoß¾½zõê]»vi4™L6mÚ´3f8:¢_…F÷úÚ“£;{¾ì9´ƒûönÿ»š³9éwAýQëþQu£Õ±Dôÿ†µ méDDz"µŽò«X„ŸÕëë%™X0ªS“1Á^vVBV¯»–³ñø´\Eïàz™þe®ºÓ§Oî*~=æÌ™Â5'&&¾ýöÛÅÅÅ|>ÿÍ7ßœ5kVË–-¹¦N:ét:›™3gNŸ>ÝpàyP¦Òn<~gç_÷FuòÛÅëµv®ýÛºl;™y4­º!Üb;<†‘ùJŽˆF5q‰ŽÝÌ»‘UZÝ(¥†%"=Qϯ5ÿÌõÝä.Ë_tàzìÕl-«žÜ¹•Û3)šïäc¿bD;‰€Õëÿ¸’ýãñ;wòŸá¯xþ ˆÈÕÕÕÇǧiÓ¦sçÎíÖ­›qsûöíÅbñ˜1c"""š6mjÜdmm=uêÔ÷ßßÎήAC¨µrµnˉ»?ŸÉÔäí®^W2KLtÎ,R–«uV"þÛ]¼6Ÿ¸ÛÑËnV¿söŽ©¥&2‹*TZV,à½ó²÷¶én¶’5oµw³õ¿[Éw‹¸>Š”¬ž‚|ìüœ¬êóðŒÜÈ*ÕèØƒ—²~<~çÞ3«S€‘‡¥;{öì1¬oL.—_ºt©Ê¦¿ÿþ»ÊíÏ› nû©ôÝg3TZSkÚ(5º§ï½â;5ÔïÝW|¹Jú”Å…{ÅDôIÿa=¸2QÒÜÐ2¥¶ÿ7IåjÝOÝ›ð²ÏÔWü ‹cf•(ã®å”«uÙ%*W¹8j|G"Ò±ú2•V$x&¥/Si__{ÒôÀ åáÿÖ˜HÙ«kB–ÿ.µI‚£]dž-²IDATŽÝ^{ëv^9«§…:öZÎŒŸ.p5ôOÄç–Àñy†”ýû£i_N¹›_®Ö± uÌ•ìiÑŠ+4;gï•ëJÕZön~ùü}Wï)÷àÅÁhu ú? #Gެ®é—_~iÈHÀ‚u^z´±CxŽü¿àj—=­òhÈH !=“¿@ãB¢`èX $úèÿÑûÚšÕsIEND®B`‚pudb-2025.1.5/doc/index.rst000066400000000000000000000006541511510750400153120ustar00rootroot00000000000000Welcome to pudb's documentation! ================================ .. include:: README.rst Table of Contents ----------------- .. toctree:: :maxdepth: 2 :caption: Contents: starting usage shells misc 🚀 Github 💾 Download Releases Indices and Tables ------------------ * :ref:`genindex` * :ref:`modindex` * :ref:`search` pudb-2025.1.5/doc/misc.rst000066400000000000000000000026031511510750400151320ustar00rootroot00000000000000Installing ---------- Install PuDB using the command:: pip install pudb If you are using Python 2.5, PuDB version 2013.5.1 is the last version to support that version of Python. urwid 1.1.1 works with Python 2.5, newer versions do not. .. _faq: FAQ --- **Q: I navigated to the Variables/Stack/Breakpoints view. How do I get back to the source view?** A: Press your left arrow key. **Q: Where are breakpoints, PuDB settings file or shell history stored?** A: All PuDB information is stored in a location specified by the `XDG Base Directory Specification `_. Usually, it is ``~/.config/pudb``. Breakpoints are stored in a file called ``saved-breakpoints``. Also in this location are the shell history from the ``!`` shell (``shell-history``) and the PuDB settings (``pudb.cfg``). **Q: I killed PuDB and now my terminal is broken. How do I fix it?** A: Type the ``reset`` command (even if you cannot see what you are typing, it should work). If this happens on a regular basis, please report it as a bug. License and Dependencies ------------------------ PuDB is distributed under the MIT license. It relies on the following excellent pieces of software: * Ian Ward's `urwid `_ console UI library * Georg Brandl's `pygments `_ syntax highlighter .. include:: ../LICENSE pudb-2025.1.5/doc/shells.rst000066400000000000000000000062461511510750400155000ustar00rootroot00000000000000Shells ====== Internal shell -------------- At any point while debugging, press ``Ctrl-x`` to switch to the built in interactive shell. From here, you can execute Python commands at the current point of the debugger. Press ``Ctrl-x`` again to move back to the debugger. Keyboard shortcuts defined in the internal shell: +--------------------+--------------------+ |Enter |Execute the current | | |command | +--------------------+--------------------+ |Ctrl-v |Insert a newline | | |(for multiline | | |commands) | +--------------------+--------------------+ |Ctrl-n/p |Browse command | | |history | +--------------------+--------------------+ |Up/down arrow |Select history | +--------------------+--------------------+ |TAB |Tab completion | +--------------------+--------------------+ |+/- |grow/shrink the | | |shell (when a | | |history item is | | |selected) | +--------------------+--------------------+ |_/= |minimize/maximize | | |the shell (when a | | |history item is | | |selected) | +--------------------+--------------------+ External shells --------------- To open the external shell, press the ``!`` key while debugging. Unlike the internal shell, external shells close the debugger UI while the shell is active. Press ``Ctrl-d`` at any time to exit the shell and return to the debugger. To configure the shell used by PuDB, open the settings (``Ctrl-p``) and select the shell. PuDB supports the following external shells. - Internal (same as pressing ``Ctrl-x``). This is the default. - Classic (similar to the default ``python`` interactive shell) - `IPython `_ The `IPython` shell can also be used in a server-client fashion, which is enabled by selecting the shell `ipython_kernel` in the settings. When set, the ``!`` key will start an `IPython` kernel and wait for connection from, e.g., `qtconsole`. Like other shells, `ipython_kernel` blocks the debugger UI while it is active. Type `quit` or `exit` from a client to exit the kernel and return to the debugger. - `bpython `_ - `ptpython `_ Custom shells ------------- To define a custom external shell, create a file with a function ``pudb_shell(_globals, _locals)`` at the module level. Then, in the settings (``Ctrl-p``), select "Custom" under the shell settings, and add the path to the file. Here is an example custom shell file: .. literalinclude:: ../examples/shell.py :language: python Note, many shells do not allow passing in globals and locals dictionaries separately. In this case, you can merge the two with .. code-block:: python from pudb.shell import SetPropagatingDict ns = SetPropagatingDict([_locals, _globals], _locals) Here is more information on ``SetPropagatingDict``: .. autoclass:: pudb.shell.SetPropagatingDict pudb-2025.1.5/doc/starting.rst000066400000000000000000000134121511510750400160320ustar00rootroot00000000000000Starting the debugger --------------------- To start debugging, simply insert:: from pudb import set_trace; set_trace() A shorter alternative to this is:: import pudb; pu.db Or, if pudb is already imported, just this will suffice:: pu.db If you are using Python 3.7 or newer, you can add:: # Set breakpoint() in Python to call pudb export PYTHONBREAKPOINT="pudb.set_trace" in your ``~/.bashrc``. Then use:: breakpoint() to start pudb. Insert one of these snippets into the piece of code you want to debug, or run the entire script with:: python -m pudb my-script.py which is useful if you want to run PuDB in a version of Python other than the one you most recently installed PuDB with. Debugging from a separate terminal ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ It's possible to control the debugger from a separate terminal. This is useful if there are several threads running that are printing to stdout while you're debugging and messing up the terminal, or if you want to keep the original terminal available for any other reason. Open a new terminal. First, you need to get the path of the tty of the terminal you want to debug from. To do that, use the standard unix command ``tty``. It will print something like ``/dev/pts/3``. Then you need to make sure that your terminal doesn't have a shell actively reading and possibly capturing some of the input that should go to pudb. To do that run a placeholder command that does nothing, such as ``perl -MPOSIX -e pause``. Then set the PUDB_TTY environment variable to the path tty gave you, for example:: PUDB_TTY=/dev/pts/3 pudb my-script.py Now instead of using the current terminal, pudb will use this tty for its UI. You may want to use the internal shell in pudb, as others will still use the original terminal. Logging Internal Errors ^^^^^^^^^^^^^^^^^^^^^^^ Some kinds of internal exceptions encountered by pudb will be logged to the terminal window when the debugger is active. To send these messages to a file instead, use the ``--log-errors`` flag:: python -m pudb --log-errors pudberrors.log Remote debugging ^^^^^^^^^^^^^^^^ Rudimentary remote debugging is also supported. To break into the debugger, enabling you to connect via ``telnet``, use the following code:: from pudb.remote import set_trace set_trace(term_size=(80, 24)) The terminal size can be defined via the environment variable as well:: export PUDB_TERM_SIZE=80x24 The following precedence (from highest to lowest) is used to determine the terminal size: #. ``term_size`` keyword argument #. ``PUDB_TERM_SIZE`` environment variable #. Size of the terminal in which the debugged program is running (as returned by ``os.get_terminal_size()``) #. Default fallback value of ``(80, 20)`` At this point, the debugger will look for a free port and wait for a telnet connection:: pudb:6899: Please start a telnet session using a command like: telnet 127.0.0.1 6899 pudb:6899: Waiting for client... The host and port can be specified as keyword arguments to ``set_trace()``, or via the ``PUDB_RDB_HOST`` and ``PUDB_RDB_PORT`` env vars. To debug a function in a remote debugger (and examine any exceptions that may occur), use code like the following: .. literalinclude:: ../examples/remote-debug.py Upon running this, again, the debugger will wait for a telnet connection. The following programming interface is available for the remote debugger: .. automodule:: pudb.remote "Reverse" remote debugging ^^^^^^^^^^^^^^^^^^^^^^^^^^ In "reverse" remote debugging, pudb connects to a socket, rather than listening to one. First open the socket and listen using the netcat(``nc``), as below. Netcat of course is not a telnet client, so it can behave differently than a telnet client. By using the ```stty``` with "no echo: and "no buffering" input options, we can make a socket that nonetheless behave similarly:: stty -echo -icanon && nc -l -p 6899 When using the BSD version netcat that ships with MacOS, a server can be started like this:: stty -echo -icanon && nc -l 6899 Specify host and port in set_trace and set the *reverse* parameter to *True*:: from pudb.remote import set_trace set_trace(reverse=True) The "reverse" mode can also be enabled by setting the environment variable to a non-empty value (the keyword argument has priority over the env var):: export PUDB_RDB_REVERSE=1 Then watch the debugger connect to netcat:: pudb:9999: Now in session with 127.0.0.1:6899. Using the debugger after forking ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In a forked process, no TTY is usually attached to stdin/stdout, which leads to errors when debugging with standard pudb. E.g. consider this ``script.py``:: from multiprocessing import Process def f(name): # breakpoint was introduced in Python 3.7 breakpoint() print('hello', name) p = Process(target=f, args=('bob',)) p.start() p.join() Running it with standard pudb breaks:: PYTHONBREAKPOINT=pudb.set_trace python script.py However, on Unix systems, e.g. Linux & MacOS, debugging a forked process is supported using ``pudb.forked.set_trace``:: PYTHONBREAKPOINT=pudb.forked.set_trace python script.py Usage with pytest ^^^^^^^^^^^^^^^^^ To use PuDB with `pytest `_, consider using the `pytest-pudb `_ plugin, which provides a ``--pudb`` option that simplifies the procedure below. Alternatively, as of version 2017.1.2, pudb can be used to debug test failures in `pytest `_, by running the test runner like so:: $ pytest --pdbcls pudb.debugger:Debugger --pdb --capture=no Note the need to pass --capture=no (or its synonym -s) as otherwise pytest tries to manage the standard streams itself. (contributed by Antony Lee) pudb-2025.1.5/doc/upload-docs.sh000077500000000000000000000001201511510750400162060ustar00rootroot00000000000000#! /bin/sh rsync --verbose --archive --delete _build/html/ doc-upload:doc/pudb pudb-2025.1.5/doc/usage.rst000066400000000000000000000040671511510750400153110ustar00rootroot00000000000000Starting the debugger without breaking -------------------------------------- To start the debugger without actually pausing use:: from pudb import set_trace; set_trace(paused=False) at the top of your code. This will start the debugger without breaking, and run it until a predefined breakpoint is hit. You can also press ``b`` on a ``set_trace`` call inside the debugger, and it will prevent it from stopping there. Interrupt Handlers ------------------ ``set_trace`` sets ``SIGINT`` (i.e., ``Ctrl-c``) to run ``set_trace``, so that typing ``Ctrl-c`` while your code is running will break the code and start debugging. See the docstring of ``set_interrupt_handler`` for more information. Note that this only works in the main thread. Programming PuDB ---------------- At the programming language level, PuDB displays the same interface as Python's built-in `pdb module `_. Just replace ``pdb`` with ``pudb``. (One exception: ``run`` is called ``runstatement``.) Controlling How Values Get Shown -------------------------------- * Set a custom stringifer in the preferences. An example file might look like this:: def pudb_stringifier(obj): return "HI" * Add a method ``safely_stringify_for_pudb`` to the type. A stringifier is expected to *never* raise an exception. If an exception is raised, pudb will silently fall back to its built-in stringification behavior. A stringifier that takes a long time will further stall the debugger UI while it runs. Configuring PuDB ---------------- Overriding default key bindings ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - Configure in the settings file (see :ref:`faq`). - Add the bindings under mentioned section in the config file (see :ref:`urwid:keyboard-input`). - Only few actions are supported currently, coverage will increase with time. (Contributions welcome!) .. code-block:: ini [pudb] # window chooser bindings hotkeys_breakpoints = B hotkeys_code = C hotkeys_stack = S hotkeys_variables = V hotkeys_toggle_cmdline_focus = ctrl x pudb-2025.1.5/examples/000077500000000000000000000000001511510750400145155ustar00rootroot00000000000000pudb-2025.1.5/examples/mpi4py-debug.py000066400000000000000000000010341511510750400173730ustar00rootroot00000000000000#!/usr/bin/env python # This example demonstrates how to debug an mpi4py application. # Run this with 'mpirun -n 2 python mpi4py-debug.py'. # You can then attach to the debugger by running 'telnet 127.0.0.1 6899' # (when using the default pudb configuration) in another terminal. from mpi4py import MPI from pudb.remote import debug_remote_on_single_rank def debugged_function(x): y = x + fail # noqa: F821 return y # debug 'debugged_function' on rank 0 debug_remote_on_single_rank(MPI.COMM_WORLD, 0, debugged_function, 42) pudb-2025.1.5/examples/remote-debug.py000066400000000000000000000002361511510750400174470ustar00rootroot00000000000000def debugged_function(x): y = x + fail # noqa: F821 return y from pudb.remote import debugger dbg = debugger() dbg.runcall(debugged_function, 5) pudb-2025.1.5/examples/shell.py000066400000000000000000000034671511510750400162100ustar00rootroot00000000000000""" This file shows how you can define a custom shell for PuDB. This is the shell used when pressing the ! key in the debugger (it does not affect the Ctrl-x shell that is built into PuDB). To create a custom shell, create a file like this one with a function called pudb_shell(_globals, _locals) defined at the module level. Note that the file will be execfile'd. Then, go to the PuDB preferences window (type Ctrl-p inside of PuDB) and add the path to the file in the "Custom" field under the "Shell" heading. The example in this file """ # Define this a function with this name and signature at the module level. def pudb_shell(_globals, _locals): """ This example shell runs a classic Python shell. It is based on run_classic_shell in pudb.shell. """ # Many shells only let you pass in a single locals dictionary, rather than # separate globals and locals dictionaries. In this case, you can use # pudb.shell.SetPropagatingDict to automatically merge the two into a # single dictionary. It does this in such a way that assignments propagate # to _locals, so that when the debugger is at the module level, variables # can be reassigned in the shell. from pudb.shell import SetPropagatingDict ns = SetPropagatingDict([_locals, _globals], _locals) try: import readline import rlcompleter have_readline = True except ImportError: have_readline = False if have_readline: readline.set_completer( rlcompleter.Completer(ns).complete) readline.parse_and_bind("tab: complete") readline.clear_history() from code import InteractiveConsole cons = InteractiveConsole(ns) cons.interact("Press Ctrl-D to return to the debugger") # When the function returns, control will be returned to the debugger. pudb-2025.1.5/examples/stringifier.py000066400000000000000000000064351511510750400174240ustar00rootroot00000000000000#!/usr/bin/env python """ This file shows how you can define a custom stringifier for PuDB. A stringifier is a function that is called on the variables in the namespace for display in the variables list. The default is type()*, as this is fast and cannot fail. PuDB also includes built-in options for using str() and repr(). Note that str() and repr() will be slower than type(), which is especially noticeable when you have many variables, or some of your variables have very large string/repr representations. Also note that if you just want to change the type for one or two variables, you can do that by selecting the variable in the variables list and pressing Enter, or by pressing t, s, or r. To define a custom stringifier, create a file like this one with a function called pudb_stringifier() at the module level. pudb_stringifier(obj) should return a string value for an object (note that str() will always be called on the result). Note that the file will be execfile'd. Then, go to the PuDB preferences window (type Ctrl-p inside of PuDB), and add the path to the file in the "Custom" field under the "Variable Stringifier" heading. The example in this file returns the string value, unless it take more than 500 ms (1 second in Python 2.5-) to compute, in which case it falls back to the type. TIP: Run "python -m pudb.run example-stringifier.py and set this file to be your stringifier in the settings to see how it works. You can use custom stringifiers to do all sorts of things: callbacks, custom views on variables of interest without having to use a watch variable or the expanded view, etc. * - Actually, the default is a mix between type() and str(). str() is used for a handful of "safe" types for which it is guaranteed to be fast and not to fail. """ import signal import time class TimeOutError(Exception): pass def timeout(signum, frame, time): raise TimeOutError("Timed out after %d seconds" % time) def run_with_timeout(code, time, globals=None): """ Evaluate ``code``, timing out after ``time`` seconds. In Python 2.5 and lower, ``time`` is rounded up to the nearest integer. The return value is whatever ``code`` returns. """ # Set the signal handler and a ``time``-second alarm signal.signal(signal.SIGALRM, lambda s, f: timeout(s, f, time)) signal.setitimer(signal.ITIMER_REAL, time) r = eval(code, globals) signal.alarm(0) # Disable the alarm return r def pudb_stringifier(obj): """ This is the custom stringifier. It returns str(obj), unless it take more than a second to compute, in which case it falls back to type(obj). """ try: return run_with_timeout("str(obj)", 0.5, {"obj": obj}) except TimeOutError: return (type(obj), "(str too slow to compute)") # Example usage class FastString: def __str__(self): return "This was fast to compute." class SlowString: def __str__(self): time.sleep(10) # Return the string value after ten seconds return "This was slow to compute." fast = FastString() slow = SlowString() # If you are running this in PuDB, set this file as your custom stringifier in # the prefs (Ctrl-p) and run to here. Notice how fast shows the string value, # but slow shows the type, as the string value takes too long to compute. pudb-2025.1.5/examples/theme.py000066400000000000000000000017711511510750400161770ustar00rootroot00000000000000# Supported 16 color values: # 'h0' (color number 0) through 'h15' (color number 15) # or # 'default' (use the terminal's default foreground), # 'black', 'dark red', 'dark green', 'brown', 'dark blue', # 'dark magenta', 'dark cyan', 'light gray', 'dark gray', # 'light red', 'light green', 'yellow', 'light blue', # 'light magenta', 'light cyan', 'white' # # Supported 256 color values: # 'h0' (color number 0) through 'h255' (color number 255) # # 256 color chart: http://en.wikipedia.org/wiki/File:Xterm_color_chart.png # # "setting_name": (foreground_color, background_color), # See pudb/theme.py # (https://github.com/inducer/pudb/blob/main/pudb/theme.py) to see what keys # there are. # Note, be sure to test your theme in both curses and raw mode (see the bottom # of the preferences window). Curses mode will be used with screen or tmux. palette.update({ # noqa: F821 "source": (add_setting("black", "underline"), "dark green"), # noqa: F821 "comment": ("h250", "default") }) pudb-2025.1.5/manual-tests/000077500000000000000000000000001511510750400153145ustar00rootroot00000000000000pudb-2025.1.5/manual-tests/.not-actually-ci-tests000066400000000000000000000000001511510750400214500ustar00rootroot00000000000000pudb-2025.1.5/manual-tests/test-api.py000066400000000000000000000001161511510750400174120ustar00rootroot00000000000000def f(): fail # noqa: B018, F821 from pudb import runcall runcall(f) pudb-2025.1.5/manual-tests/test-postmortem.py000066400000000000000000000001721511510750400210540ustar00rootroot00000000000000def f(): fail # noqa: B018, F821 try: f() except Exception: from pudb import post_mortem post_mortem() pudb-2025.1.5/pudb/000077500000000000000000000000001511510750400136315ustar00rootroot00000000000000pudb-2025.1.5/pudb/__init__.py000066400000000000000000000272441511510750400157530ustar00rootroot00000000000000from __future__ import annotations __copyright__ = """ Copyright (C) 2009-2017 Andreas Kloeckner Copyright (C) 2014-2017 Aaron Meurer """ __license__ = """ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ import re import sys from importlib import metadata from typing import TYPE_CHECKING, Any, TypeVar from typing_extensions import ParamSpec from pudb.settings import load_config if TYPE_CHECKING: from collections.abc import Callable, Mapping, Sequence from types import TracebackType from pudb.debugger import Debugger P = ParamSpec("P") ResultT = TypeVar("ResultT") VERSION = metadata.version("pudb") _ver_match = re.match(r"^([0-9.]+)([a-z0-9]*?)$", VERSION) assert _ver_match NUM_VERSION = tuple(int(nr) for nr in _ver_match.group(1).split(".")) __version__ = VERSION class PudbShortcuts: @property def db(self): dbg = _get_debugger() import threading if isinstance(threading.current_thread(), threading._MainThread): set_interrupt_handler() dbg.set_trace(sys._getframe().f_back) return None @property def go(self): dbg = _get_debugger() import threading if isinstance(threading.current_thread(), threading._MainThread): set_interrupt_handler() dbg.set_trace(sys._getframe().f_back, paused=False) return None import builtins builtins.__dict__["pu"] = PudbShortcuts() def _tty_override(): import os return os.environ.get("PUDB_TTY") def _open_tty(tty_path: str): import io import os tty_file = io.TextIOWrapper(open(tty_path, "r+b", buffering=0)) term_size = os.get_terminal_size(tty_file.fileno()) return tty_file, term_size def _get_debugger(**kwargs): from pudb.debugger import Debugger if not Debugger._current_debugger: tty_path = _tty_override() if tty_path and ("stdin" not in kwargs or "stdout" not in kwargs): tty_file, term_size = _open_tty(tty_path) kwargs.setdefault("stdin", tty_file) kwargs.setdefault("stdout", tty_file) kwargs.setdefault("term_size", term_size) kwargs.setdefault("tty_file", tty_file) from pudb.debugger import Debugger dbg = Debugger(**kwargs) return dbg else: return Debugger._current_debugger[0] def _have_debugger(): try: from pudb.debugger import Debugger return bool(Debugger._current_debugger) except ImportError: # Import cycles may happen if function is called during early startup return False import signal # noqa DEFAULT_SIGNAL = signal.SIGINT del signal def runmodule(*args, **kwargs): kwargs["run_as_module"] = True runscript(*args, **kwargs) def runscript( mainpyfile: str, steal_output: bool = False, _continue_at_start: bool = False, args: Sequence[str] | None = None, pre_run: str = "", run_as_module: bool = False, ): try: dbg = _get_debugger( steal_output=steal_output, _continue_at_start=_continue_at_start, ) _runscript(mainpyfile, dbg, args=args, pre_run=pre_run, run_as_module=run_as_module) finally: dbg.__del__() def _runscript( mainpyfile: str, dbg: Debugger, args: Sequence[str] | None = None, pre_run: str = "", run_as_module: bool = False, ): # Note on saving/restoring sys.argv: it's a good idea when sys.argv was # modified by the script being debugged. It's a bad idea when it was # changed by the user from the command line. The best approach would be to # have a "restart" command which would allow explicit specification of # command line arguments. if args is not None: prev_sys_argv = sys.argv[:] if run_as_module: sys.argv = args else: sys.argv = [mainpyfile, *args] # replace pudb's dir with script's dir in front of module search path. from pathlib import Path prev_sys_path = sys.path[:] sys.path[0] = str(Path(mainpyfile).resolve().parent) import os cwd = os.getcwd() while True: # Script may have changed directory. Restore cwd before restart. os.chdir(cwd) if pre_run: from subprocess import call retcode = call(pre_run, close_fds=True, shell=True) if retcode: print("*** WARNING: pre-run process exited with code %d." % retcode) input("[Hit Enter]") status_msg = "" try: if run_as_module: try: dbg._runmodule(mainpyfile) except ImportError as e: print(e, file=sys.stderr) sys.exit(1) else: try: dbg._runscript(mainpyfile) except SystemExit: se = sys.exc_info()[1] status_msg = "The debuggee exited normally with " \ f"status code {se.code}.\n\n" except Exception: dbg.post_mortem = True dbg.interaction(None, sys.exc_info()) while True: import urwid pre_run_edit = urwid.Edit("", pre_run) if not load_config()["prompt_on_quit"]: return result = dbg.ui.call_with_ui(dbg.ui.dialog, urwid.ListBox(urwid.SimpleListWalker([urwid.Text( f"Your PuDB session has ended.\n\n{status_msg}" "Would you like to quit PuDB or restart your program?\n" "You may hit 'q' to quit."), urwid.Text("\n\nIf you decide to restart, this command " "will be run prior to actually restarting:"), urwid.AttrMap(pre_run_edit, "input", "focused input") ])), [ ("Restart", "restart"), ("Quit", "quit"), ], focus_buttons=True, bind_enter_esc=False, title="Finished", extra_bindings=[ ("q", "quit"), ]) if result == "quit": return if result == "restart": break pre_run = pre_run_edit.get_edit_text() dbg.restart() if args is not None: sys.argv = prev_sys_argv sys.path = prev_sys_path def runstatement( statement: str, globals: dict[str, Any] | None = None, locals: Mapping[str, Any] | None = None ): return _get_debugger().run(statement, globals, locals) def runeval(expression, globals=None, locals=None): return _get_debugger().runeval(expression, globals, locals) def runcall( func: Callable[P, ResultT], *args: P.args, **kwargs: P.kwargs ) -> ResultT | None: return _get_debugger().runcall(func, *args, **kwargs) def set_trace(paused: bool = True): """ Start the debugger If paused=False (the default is True), the debugger will not stop here (same as immediately pressing 'c' to continue). """ import sys dbg = _get_debugger() import threading if isinstance(threading.current_thread(), threading._MainThread): set_interrupt_handler() dbg.set_trace(sys._getframe().f_back, paused=paused) start = set_trace def _interrupt_handler(signum, frame): from pudb import _get_debugger _get_debugger().set_trace(frame, as_breakpoint=False) def set_interrupt_handler(interrupt_signal=None): """ Set up an interrupt handler, to activate PuDB when Python receives the signal `interrupt_signal`. By default it is SIGINT (i.e., Ctrl-c). To use a different signal, pass it as the argument to this function, like `set_interrupt_handler(signal.SIGALRM)`. You can then break your code with `kill -ALRM pid`, where `pid` is the process ID of the Python process. Note that PuDB will still use SIGINT once it is running to allow breaking running code. If that is an issue, you can change the default signal by hooking `pudb.DEFAULT_SIGNAL`, like >>> import pudb >>> import signal >>> pudb.DEFAULT_SIGNAL = signal.SIGALRM Note, this may not work if you use threads or subprocesses. Note, this only works when called from the main thread. """ if interrupt_signal is None: interrupt_signal = DEFAULT_SIGNAL import signal old_handler = signal.getsignal(interrupt_signal) if old_handler is not signal.default_int_handler \ and old_handler != signal.SIG_DFL and old_handler != _interrupt_handler: # Since we don't currently have support for a non-default signal handlers, # let's avoid undefined-behavior territory and just show a warning. from warnings import warn if old_handler is None: # This is the documented meaning of getsignal()->None. old_handler = "not installed from python" return warn("A non-default handler for signal %d is already installed (%s). " "Skipping pudb interrupt support." % (interrupt_signal, old_handler), stacklevel=2) import threading if not isinstance(threading.current_thread(), threading._MainThread): from warnings import warn # Setting signals from a non-main thread will not work return warn("Setting the interrupt handler can only be done on the main " "thread. The interrupt handler was NOT installed.", stacklevel=2) try: signal.signal(interrupt_signal, _interrupt_handler) except ValueError: import sys from traceback import format_exception from warnings import warn warn("setting interrupt handler on signal %d failed: %s" % (interrupt_signal, "".join(format_exception(*sys.exc_info()))), stacklevel=2) def post_mortem( tb: TracebackType | None = None, e_type: type[BaseException] | None = None, e_value: BaseException | None = None): if tb is None: import sys exc_info = sys.exc_info() else: assert e_type is not None assert e_value is not None exc_info = (e_type, e_value, tb) dbg = _get_debugger() dbg.reset() dbg.interaction(None, exc_info) def pm(): import sys exc_type, _exc_val, _tb = sys.exc_info() if exc_type is None: # No exception on record. Do nothing. return post_mortem() if __name__ == "__main__": print("You now need to type 'python -m pudb.run'. Sorry.") # vim: foldmethod=marker:expandtab:softtabstop=4 pudb-2025.1.5/pudb/__main__.py000066400000000000000000000023501511510750400157230ustar00rootroot00000000000000from __future__ import annotations __copyright__ = """ Copyright (C) 2009-2017 Andreas Kloeckner Copyright (C) 2014-2017 Aaron Meurer """ __license__ = """ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ if __name__ == "__main__": from pudb.run import main main() pudb-2025.1.5/pudb/_shtab.py000066400000000000000000000003051511510750400154410ustar00rootroot00000000000000from __future__ import annotations FILE = None DIRECTORY = DIR = None def add_argument_to(parser, *args, **kwargs): from argparse import Action Action.complete = None return parser pudb-2025.1.5/pudb/b.py000066400000000000000000000010631511510750400144240ustar00rootroot00000000000000from __future__ import annotations import sys from pudb import _get_debugger, set_interrupt_handler def __myimport__(name, *args, **kwargs): # noqa: N807 if name == "pudb.b": set_trace() return __origimport__(name, *args, **kwargs) # noqa: F821 # pylint: disable=undefined-variable # Will only be run on first import __builtins__["__origimport__"] = __import__ __builtins__["__import__"] = __myimport__ def set_trace(): dbg = _get_debugger() set_interrupt_handler() dbg.set_trace(sys._getframe().f_back.f_back) set_trace() pudb-2025.1.5/pudb/debugger.py000066400000000000000000003470241511510750400160010ustar00rootroot00000000000000from __future__ import annotations __copyright__ = """ Copyright (C) 2009-2017 Andreas Kloeckner Copyright (C) 2014-2017 Aaron Meurer """ __license__ = """ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ import bdb import gc import os import sys from abc import ABC, abstractmethod from collections import deque from dataclasses import dataclass from functools import partial from itertools import count from os.path import splitext from types import FrameType, ModuleType, TracebackType from typing import TYPE_CHECKING, Any, ClassVar, Mapping, TextIO, TypeVar, cast, final import urwid from typing_extensions import ParamSpec, TypeAlias, override from pudb.lowlevel import ConsoleSingleKeyReader, decode_lines, ui_log from pudb.settings import get_save_config_path, load_config, save_config if TYPE_CHECKING: from collections.abc import Callable, Sequence from pudb.source_view import SourceLine P = ParamSpec("P") ResultT = TypeVar("ResultT") ExcInfo: TypeAlias = "tuple[type[BaseException], BaseException, TracebackType]" OptExcInfo: TypeAlias = "ExcInfo | tuple[None, None, None]" CONFIG = load_config() save_config(CONFIG) HELP_HEADER = r""" Key Assignments: Use Arrow Down/Up or Page Down/Up to scroll. """ HELP_MAIN = rf""" Keys: Ctrl-p - edit preferences n - step over ("next") s - step into c - continue r/f - finish current function t - run to cursor J - jump to line e - show traceback [post-mortem or in exception state] b - set/clear breakpoint Ctrl-e - open file at current line to edit with $EDITOR H - move to current line (bottom of stack) u - move up one stack frame d - move down one stack frame o - show console/output screen m - open module j/k - down/up l/h - right/left Ctrl-f/b - page down/up Ctrl-d/u - page down/up G/g - end/home L - show (file/line) location / go to line / - search ,/. - search next/previous {CONFIG["hotkeys_variables"]} - focus variables {CONFIG["hotkeys_stack"]} - focus stack {CONFIG["hotkeys_breakpoints"]} - focus breakpoint list {CONFIG["hotkeys_code"]} - focus code F1/? - show this help screen q - quit Ctrl-r - reload breakpoints from saved-breakpoints file Ctrl-c - when in continue mode, break back to PuDB Ctrl-l - redraw screen Shell-related: ! - open the external shell (configured in the settings) {CONFIG["hotkeys_toggle_cmdline_focus"]} - toggle the internal shell focus +/- - grow/shrink inline shell (active in results scrollback) _/= - minimize/maximize inline shell (active in results scrollback) Ctrl-v - insert newline Ctrl-n/p, Arrow down/up - browse command history or clear/recall prompt Shift-Page down/up - browse in the results scrollback Tab - yes, there is (simple) tab completion """ HELP_SIDE = rf""" Sidebar-related (active in sidebar): +/- - grow/shrink sidebar width _/= - minimize/maximize sidebar width [/] - grow/shrink relative height of active sidebar box Keys in variables list: \/enter/space - expand/collapse h - collapse l - expand d/t/r/s/i/c - show default/type/repr/str/id/custom for this variable H - toggle highlighting @ - toggle repetition at top * - cycle attribute visibility: public/_private/__dunder__ m - toggle method visibility w - toggle line wrapping n/insert - add new watch expression delete - remove watch expression e - edit options Keys in stack list: enter - jump to frame Ctrl-e - open file at line to edit with $EDITOR Keys in breakpoints list: enter - jump to breakpoint b - toggle breakpoint d - delete breakpoint e - edit breakpoint Other keys: j/k - down/up l/h - right/left Ctrl-f/b - page down/up Ctrl-d/u - page down/up G/g - end/home {CONFIG["hotkeys_variables"]} - focus variables {CONFIG["hotkeys_stack"]} - focus stack {CONFIG["hotkeys_breakpoints"]} - focus breakpoint list {CONFIG["hotkeys_code"]} - focus code F1/? - show this help screen q - quit Ctrl-l - redraw screen """ HELP_LICENSE = r""" License: -------- PuDB is licensed to you under the MIT/X Consortium license: Copyright (c) 2009-16 Andreas Kloeckner and contributors Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ def mod_exists(mod: ModuleType): if not hasattr(mod, "__file__"): return False if mod.__file__ is None: return False filename = mod.__file__ base, ext = splitext(filename) ext = ext.lower() from os.path import exists if ext == ".pyc": return exists(base+".py") else: return ext == ".py" def pick_module(ui: DebuggerUI, w: urwid.Widget, _size: UrwidSize, _key: str): import sys new_mod_text = SelectableText("-- update me --") new_mod_entry = urwid.AttrMap(new_mod_text, None, "focused selectable") def build_filtered_mod_list(filt_string: str = ""): modules = sorted(name # mod_exists may change the size of sys.modules, # causing this to crash. Copy to a list. for name, mod in list(sys.modules.items()) if mod_exists(mod)) result = [urwid.AttrMap(SelectableText(mod), None, "focused selectable") for mod in modules if filt_string in mod] new_mod_text.set_text(f"<<< IMPORT MODULE '{filt_string}' >>>") result.append(new_mod_entry) return result def show_mod(mod: ModuleType): assert mod.__file__ is not None filename = ui.debugger.canonic(mod.__file__) base, ext = splitext(filename) if ext == ".pyc": ext = ".py" filename = base+".py" ui.set_source_code_provider( FileSourceCodeProvider(ui.debugger, filename)) ui.source_list.set_focus(0) class FilterEdit(urwid.Edit): @override def keypress(self, size: UrwidSize, key: str): # type ignore because of urwid annotation bug result = urwid.Edit.keypress(self, size, key) # pyright: ignore[reportArgumentType] if result is None: mod_list[:] = build_filtered_mod_list( self.get_edit_text()) return result filt_edit = FilterEdit([("label", "Filter: ")], ui.last_module_filter) mod_list = urwid.SimpleListWalker( build_filtered_mod_list(filt_edit.get_edit_text())) lb = urwid.ListBox(mod_list) w = urwid.Pile([ (urwid.PACK, urwid.AttrMap(filt_edit, "input", "focused input")), (1, urwid.SolidFill()), urwid.AttrMap(lb, "selectable")]) while True: result = ui.dialog(w, [ ("OK", True), ("Cancel", False), ("Reload", "reload"), ], title="Pick Module") ui.last_module_filter = filt_edit.get_edit_text() widget = cast("urwid.AttrMap[SelectableText]", lb.focus) if result is True: pos = lb.focus_position base_widget = widget.base_widget assert isinstance(base_widget, SelectableText) if widget is new_mod_entry: new_mod_name = filt_edit.get_edit_text() try: __import__(str(new_mod_name)) except Exception: from traceback import format_exception ui.message( "Could not import module '{}':\n\n{}".format( new_mod_name, "".join( format_exception(*sys.exc_info()))), title="Import Error") else: show_mod(__import__(str(new_mod_name))) break else: show_mod(sys.modules[cast("str", base_widget.get_text()[0])]) break elif result is False: break elif result == "reload": pos = lb.focus_position base_widget = widget.base_widget assert isinstance(base_widget, SelectableText) if widget is not new_mod_entry: mod_name = cast("str", base_widget.get_text()[0]) mod = sys.modules[mod_name] import importlib importlib.reload(mod) ui.message(f"'{mod_name}' was successfully reloaded.") if ui.source_code_provider is not None: ui.source_code_provider.clear_cache() assert ui.source_code_provider ui.set_source_code_provider(ui.source_code_provider, force_update=True) pos = ui.stack_list._w.focus_position ui.debugger.set_frame_index( ui.translate_ui_stack_index(pos)) # {{{ debugger interface class Debugger(bdb.Bdb): _current_debugger: ClassVar[list[Debugger]] = [] ui: DebuggerUI # FIXME: Explain the distinction between these two botframe: FrameType | None bottom_frame: FrameType | None enterframe: FrameType | None # pyright: ignore[reportUninitializedInstanceVariable] steal_output: bool _continue_at_start__setting: bool _tty_file: TextIO | None curindex: int # pyright: ignore[reportUninitializedInstanceVariable] current_line: SourceLine # pyright: ignore[reportUninitializedInstanceVariable] def __init__(self, stdin: TextIO | None = None, stdout: TextIO | None = None, term_size: tuple[int, int] | None = None, steal_output: bool = False, _continue_at_start: bool = False, tty_file: TextIO | None = None, **kwargs: Any): if Debugger._current_debugger: raise ValueError("a Debugger instance already exists") # Pass remaining kwargs to python debugger framework bdb.Bdb.__init__(self, **kwargs) self.ui = DebuggerUI(self, stdin=stdin, stdout=stdout, term_size=term_size) self.steal_output = steal_output self._continue_at_start__setting = _continue_at_start self._tty_file = tty_file self.setup_state() if steal_output: raise NotImplementedError("output stealing") from io import StringIO self.stolen_output = sys.stderr = sys.stdout = StringIO() sys.stdin = StringIO("") # avoid spurious hangs from pudb.settings import load_breakpoints for bpoint_descr in load_breakpoints(): self.set_break(*bpoint_descr) # Okay, now we have a debugger self._current_debugger.append(self) def __del__(self): # according to https://stackoverflow.com/a/1481512/1054322, the garbage # collector cannot be relied on to call this, so we call it explicitly # in a finally (see __init__.py:runscript). But then, the garbage # collector *might* call it, so it should tolerate being called twice. if self._current_debugger: assert self._current_debugger == [self] self._current_debugger.pop() if self._tty_file: self._tty_file.close() self._tty_file = None def set_jump(self, frame: FrameType, line: int): frame.f_lineno = line # pyright: ignore[reportAttributeAccessIssue] @override def set_trace(self, frame: FrameType | None = None, as_breakpoint: bool | None = None, paused: bool = True, ): """Start debugging from `frame`. If frame is not specified, debugging starts from caller's frame. Unlike Bdb.set_trace(), this does not call self.reset(), which causes the debugger to enter bdb source code. This also implements treating set_trace() calls as breakpoints in the PuDB UI. If as_breakpoint=True (the default), this call will be treated like a breakpoint in the UI (you can press 'b' on it to disable breaking here). If paused=False, the debugger will not break here. """ if as_breakpoint is None: if not paused: as_breakpoint = False else: as_breakpoint = True if frame is None: frame = sys._getframe().f_back assert frame is not None # See pudb issue #52. If this works well enough we should upstream to # stdlib bdb.py. # self.reset() self.enterframe = frame thisframe = frame while thisframe: thisframe.f_trace = self.trace_dispatch self.botframe = thisframe if sys.version_info >= (3, 13): # save trace flags, to be restored by set_continue self.frame_trace_lines_opcodes[thisframe] = ( # pylint: disable=no-member thisframe.f_trace_lines, thisframe.f_trace_opcodes) # We need f_trace_lines == True for the debugger to work thisframe.f_trace_lines = True thisframe = thisframe.f_back frame_info = (self.canonic(frame.f_code.co_filename), frame.f_lineno) if frame_info not in self.set_traces or self.set_traces[frame_info]: if as_breakpoint: self.set_traces[frame_info] = True if self.ui.source_code_provider is not None: self.ui.set_source_code_provider( self.ui.source_code_provider, force_update=True) if paused: self._set_stopinfo(frame, None) else: self.set_continue() sys.settrace(self.trace_dispatch) else: return def save_breakpoints(self): from pudb.settings import save_breakpoints save_breakpoints([ bp for fn, bp_lst in self.get_all_breaks().items() for lineno in bp_lst for bp in self.get_breaks(fn, lineno) if not bp.temporary]) def enter_post_mortem(self, exc_tuple): self.post_mortem = True def setup_state(self): self.bottom_frame = None self.mainpyfile = "" self._wait_for_mainpyfile = False self._continue_at_start = self._continue_at_start__setting self.current_bp = None self.post_mortem = False # Mapping of (filename, lineno) to bool. If True, will stop on the # set_trace() call at that location. self.set_traces = {} def restart(self): from linecache import checkcache checkcache() self.ui.set_source_code_provider(NullSourceCodeProvider()) self.setup_state() def do_clear(self, arg): self.clear_bpbynumber(int(arg)) def set_frame_index(self, index: int): self.curindex = index if index < 0 or index >= len(self.stack): return self.curframe, lineno = self.stack[index] filename = self.curframe.f_code.co_filename import linecache if not linecache.getlines(filename): code = cast("str | None", self.curframe.f_globals.get("_MODULE_SOURCE_CODE")) if code is not None: self.ui.set_current_line(lineno, DirectSourceCodeProvider( self.curframe.f_code.co_name, code)) else: self.ui.set_current_line(lineno, NullSourceCodeProvider()) else: self.ui.set_current_line(lineno, FileSourceCodeProvider(self, filename)) self.ui.update_var_view() self.ui.update_stack() self.ui.stack_list._w.set_focus(self.ui.translate_ui_stack_index(index)) @staticmethod def open_file_to_edit(filename, line_number): if not os.path.isfile(filename): raise FileNotFoundError(f"'{filename}' not found or is not a file.") if not line_number: line_number = 1 editor = os.environ.get("EDITOR", "nano") import subprocess subprocess.call([editor, f"+{line_number}", filename], shell=False) return filename def move_up_frame(self): if self.curindex > 0: self.set_frame_index(self.curindex-1) def move_down_frame(self): if self.curindex < len(self.stack)-1: self.set_frame_index(self.curindex+1) def get_shortened_stack(self, frame, tb): if tb is not None: frame = None stack, index = self.get_stack(frame, tb) for i, (s_frame, _lineno) in enumerate(stack): if s_frame is self.bottom_frame and index >= i: stack = stack[i:] index -= i return stack, index def interaction(self, frame: FrameType | None, exc_tuple: TracebackType | OptExcInfo | None = None, show_exc_dialog: bool = True): if exc_tuple is None: tb = None elif isinstance(exc_tuple, TracebackType): # For API compatibility with other debuggers, the second variable # can be a traceback object. In that case, we need to retrieve the # corresponding exception tuple. tb = exc_tuple exc, = (exc for exc in gc.get_referrers(tb) if getattr(exc, "__traceback__", None) is tb) exc_tuple = type(exc), exc, tb else: tb = exc_tuple[2] if frame is None: assert tb is not None walk_frame = tb.tb_frame else: walk_frame = frame found_bottom_frame = False while True: if walk_frame is self.bottom_frame: found_bottom_frame = True break if walk_frame is None: break walk_frame = walk_frame.f_back if not found_bottom_frame and not self.post_mortem: # We aren't supposed to be debugging this. return self.stack, index = self.get_shortened_stack(frame, tb) if self.post_mortem: index = len(self.stack)-1 self.set_frame_index(index) self.ui.call_with_ui(self.ui.interaction, exc_tuple, show_exc_dialog=show_exc_dialog) def get_stack_situation_id(self): return str(id(self.stack[self.curindex][0].f_code)) @override def user_call(self, frame: FrameType, argument_list: None): """This method is called when there is the remote possibility that we ever need to stop in this function.""" if self._wait_for_mainpyfile: return if self.stop_here(frame): self.interaction(frame) @override def user_line(self, frame: FrameType): """This function is called when we stop or break at this line.""" if self._waiting_for_mainpyfile(frame): return if self.get_break(self.canonic(frame.f_code.co_filename), frame.f_lineno): self.current_bp = ( self.canonic(frame.f_code.co_filename), frame.f_lineno) else: self.current_bp = None try: self.ui.update_breakpoints() self.interaction(frame) except Exception: self.ui.show_internal_exc_dlg(sys.exc_info()) def user_return(self, frame, return_value): """This function is called when a return trap is set here.""" if frame.f_code.co_name != "": frame.f_locals["__return__"] = return_value if self._waiting_for_mainpyfile(frame): return if "__exception__" not in frame.f_locals: self.interaction(frame) def _waiting_for_mainpyfile(self, frame): if self._wait_for_mainpyfile: if (self.mainpyfile != self.canonic(frame.f_code.co_filename) or frame.f_lineno <= 0): return True self._wait_for_mainpyfile = False self.bottom_frame = frame if self._continue_at_start: self._continue_at_start = False self.set_continue() return True return False def user_exception(self, frame, exc_info): """This function is called if an exception occurs, but only if we are to stop at or just below this level.""" exc_type, exc_value, _exc_traceback = exc_info frame.f_locals["__exception__"] = exc_type, exc_value if not self._wait_for_mainpyfile: self.interaction(frame, exc_info) # {{{ entrypoints def _runscript(self, filename): # Provide separation from current __main__, which is likely # pudb.__main__ run. Preserving its namespace is not important, and # having the script share it ensures that, e.g., pickle can find # types defined there: # https://github.com/inducer/pudb/issues/331 import __main__ __main__.__dict__.clear() __main__.__dict__.update({ "__name__": "__main__", "__file__": filename, "__builtins__": __builtins__, }) # When bdb sets tracing, a number of call and line events happens # BEFORE debugger even reaches user's code (and the exact sequence of # events depends on python version). So we take special measures to # avoid stopping before we reach the main script (see user_line and # user_call for details). self._wait_for_mainpyfile = True self.mainpyfile = self.canonic(filename) statement = f'exec(compile(open("{filename}").read(), "{filename}", "exec"))' # Set up an interrupt handler from pudb import set_interrupt_handler set_interrupt_handler() # Implicitly runs in the namespace of __main__. self.run(statement) def _runmodule(self, module_name): # This is basically stolen from the pdb._runmodule from CPython 3.8 # https://github.com/python/cpython/blob/a1d3be4623c8ec7069bd34ccdce336be9cdeb644/Lib/pdb.py#L1530 import runpy _mod_name, mod_spec, code = runpy._get_module_details(module_name) self.mainpyfile = self.canonic(code.co_filename) import __main__ __main__.__dict__.clear() __main__.__dict__.update({ "__name__": "__main__", "__file__": self.mainpyfile, "__spec__": mod_spec, "__builtins__": __builtins__, "__package__": mod_spec.parent, "__loader__": mod_spec.loader, }) self._wait_for_mainpyfile = True self.run(code) def runstatement(self, statement: str, globals: dict[str, Any] | None = None, locals: Mapping[str, Any] | None = None ): try: return self.run(statement, globals, locals) except Exception: self.post_mortem = True self.interaction(None, sys.exc_info()) raise @override def runeval(self, expression: str, globals: dict[str, Any] | None = None, locals: Mapping[str, Any] | None = None ): try: return super().runeval(expression, globals, locals) except Exception: self.post_mortem = True self.interaction(None, sys.exc_info()) raise @override def runcall(self, func: Callable[P, ResultT], *args: P.args, **kwargs: P.kwargs ) -> ResultT | None: try: return super().runcall(func, *args, **kwargs) except Exception: self.post_mortem = True self.interaction(None, sys.exc_info()) raise # }}} # }}} # UI stuff -------------------------------------------------------------------- from pudb.ui_tools import ( BreakpointFrame, EventListener, SearchController, SelectableText, SignalWrap, StackFrame, UrwidSize, focus_widget_in_container, labelled_value, make_hotkey_markup, ) from pudb.var_view import FrameVarInfoKeeper, VariableWidget, WatchExpression # {{{ display setup try: import curses except ImportError: curses = None from urwid.display.raw import Screen as RawScreen try: from urwid.display.curses import Screen as CursesScreen except ImportError: CursesScreen = None class ThreadsafeScreenMixin: """A Screen subclass that doesn't crash when running from a non-main thread.""" def signal_init(self): """Initialize signal handler, ignoring errors silently.""" try: super().signal_init() except ValueError: pass def signal_restore(self): """Restore default signal handler, ignoring errors silently.""" try: super().signal_restore() except ValueError: pass class ThreadsafeRawScreen(ThreadsafeScreenMixin, RawScreen): pass class ThreadsafeFixedSizeRawScreen(ThreadsafeScreenMixin, RawScreen): def __init__(self, **kwargs): self._term_size = kwargs.pop("term_size", None) super().__init__(**kwargs) def get_cols_rows(self): if self._term_size is not None: return self._term_size else: return 80, 24 if curses is not None: class ThreadsafeCursesScreen(ThreadsafeScreenMixin, RawScreen): pass # }}} # {{{ source code providers class SourceCodeProvider(ABC): @abstractmethod def identifier(self) -> str: ... @abstractmethod def get_source_identifier(self) -> str | None: ... @abstractmethod def clear_cache(self): ... @abstractmethod def get_lines(self, debugger_ui: DebuggerUI) -> Sequence[SourceLine]: ... class NullSourceCodeProvider(SourceCodeProvider): @override def __eq__(self, other: object): return type(self) is type(other) @override def identifier(self): return "" @override def get_source_identifier(self): return None @override def clear_cache(self): pass @override def get_lines(self, debugger_ui: DebuggerUI): from pudb.source_view import SourceLine return [ SourceLine(debugger_ui, ""), SourceLine(debugger_ui, ""), SourceLine(debugger_ui, "If this is generated code and you would " "like the source code to show up here,"), SourceLine(debugger_ui, "add it to linecache.cache, like"), SourceLine(debugger_ui, ""), SourceLine(debugger_ui, " import linecache"), SourceLine(debugger_ui, " linecache.cache[filename] = " "(size, mtime, lines, fullname)"), SourceLine(debugger_ui, ""), SourceLine(debugger_ui, "You can also set the attribute " "_MODULE_SOURCE_CODE in the module in which this function"), SourceLine(debugger_ui, "was compiled to a string containing " "the code."), ] class FileSourceCodeProvider(SourceCodeProvider): file_name: str def __init__(self, debugger: Debugger, file_name: str): self.file_name = debugger.canonic(file_name) @override def __eq__(self, other: object): c_other = cast("FileSourceCodeProvider", other) return type(self) is type(other) and self.file_name == c_other.file_name @override def identifier(self): return self.file_name @override def get_source_identifier(self): return self.file_name @override def clear_cache(self): from linecache import clearcache clearcache() @override def get_lines(self, debugger_ui: DebuggerUI): from pudb.source_view import SourceLine, format_source if self.file_name == "": return [SourceLine(debugger_ui, self.file_name)] breakpoints = debugger_ui.debugger.get_file_breaks(self.file_name)[:] breakpoints = [lineno for lineno in breakpoints if any(bp.enabled for bp in debugger_ui.debugger.get_breaks(self.file_name, lineno))] breakpoints += [i for f, i in debugger_ui.debugger.set_traces if f == self.file_name and debugger_ui.debugger.set_traces[f, i]] try: from linecache import getlines lines = getlines(self.file_name) return format_source( debugger_ui, list(decode_lines(lines)), set(breakpoints)) except Exception: from traceback import format_exception debugger_ui.message("Could not load source file '{}':\n\n{}".format( self.file_name, "".join(format_exception(*sys.exc_info()))), title="Source Code Load Error") return [SourceLine(debugger_ui, f"Error while loading '{self.file_name}'.")] @final class DirectSourceCodeProvider(SourceCodeProvider): def __init__(self, func_name: str, code: str): self.function_name = func_name self.code = code @override def __eq__(self, other: object): c_other = cast("DirectSourceCodeProvider", other) return ( type(self) is type(other) and self.function_name == c_other.function_name and self.code is c_other.code) @override def identifier(self) -> str: return f"" @override def get_source_identifier(self) -> str | None: return None @override def clear_cache(self): pass @override def get_lines(self, debugger_ui: DebuggerUI) -> Sequence[SourceLine]: from pudb.source_view import format_source lines = self.code.splitlines(True) return format_source(debugger_ui, list(decode_lines(lines)), set()) # }}} class StoppedScreen: def __init__(self, screen): self.screen = screen def __enter__(self): self.screen.stop() return self def __exit__(self, exc_type, exc_value, exc_traceback): self.screen.start() def press_key_to_return(self): with ConsoleSingleKeyReader() as key_reader: key_reader.get_single_key() class DebuggerUI(FrameVarInfoKeeper): debugger: Debugger search_controller: SearchController last_module_filter: str source_code_provider: SourceCodeProvider | None source: urwid.SimpleListWalker[SourceLine] show_count: int current_line: SourceLine | None quit_event_loop: object current_exc_tuple: OptExcInfo | None # pyright: ignore[reportUninitializedInstanceVariable] # {{{ constructor def __init__(self, dbg, stdin, stdout, term_size): FrameVarInfoKeeper.__init__(self) self.debugger = dbg from urwid import AttrMap from pudb.ui_tools import SearchController self.search_controller = SearchController(self) self.last_module_filter = "" # {{{ build ui # {{{ key bindings def move_up(w, size, key): w.keypress(size, "up") def move_down(w, size, key): w.keypress(size, "down") def move_left(w, size, key): w.keypress(size, "left") def move_right(w, size, key): w.keypress(size, "right") def page_up(w, size, key): w.keypress(size, "page up") def page_down(w, size, key): w.keypress(size, "page down") def move_home(w, size, key): w.keypress(size, "home") def move_end(w, size, key): w.keypress(size, "end") def add_vi_nav_keys(widget): widget.listen("k", move_up) widget.listen("j", move_down) widget.listen("h", move_left) widget.listen("l", move_right) widget.listen("ctrl b", page_up) widget.listen("ctrl f", page_down) widget.listen("ctrl u", page_up) widget.listen("ctrl d", page_down) widget.listen("g", move_home) widget.listen("G", move_end) def add_help_keys(widget, helpfunc): widget.listen("f1", helpfunc) widget.listen("?", helpfunc) # }}} # {{{ left/source column self.source = urwid.SimpleListWalker([]) self.source_list = urwid.ListBox(self.source) self.source_sigwrap = SignalWrap(self.source_list) self.source_attr = urwid.AttrMap(self.source_sigwrap, "source") self.source_hscroll_start = 0 self.cmdline_contents = urwid.SimpleFocusListWalker([]) self.cmdline_list = urwid.ListBox(self.cmdline_contents) import urwid_readline self.cmdline_edit = urwid_readline.ReadlineEdit([ ("command line prompt", ">>> ") ]) cmdline_edit_attr = urwid.AttrMap(self.cmdline_edit, "command line edit") self.cmdline_edit_sigwrap = SignalWrap( cmdline_edit_attr, is_preemptive=True) def clear_cmdline_history(btn): del self.cmdline_contents[:] # clear the command input text too, # but save it to be retrieved on cmdline_history_prev() self.cmdline_history_position = -1 cmdline_history_browse(1) def initialize_cmdline_history(path): dq = partial(deque, maxlen=5000) try: # Load global history if present with open(path) as histfile: return dq(histfile.read().splitlines()) except FileNotFoundError: return dq() self.cmdline_history_path = os.path.join(get_save_config_path(), "internal-cmdline-history.txt") self.cmdline_history = initialize_cmdline_history(self.cmdline_history_path) self.cmdline_saved_edit_text = "" self.cmdline_history_position = -1 self.cmdline_edit_bar = urwid.Columns([ self.cmdline_edit_sigwrap, (urwid.FIXED, 10, AttrMap( urwid.Button("Clear", clear_cmdline_history), "command line clear button", "command line focused button")) ]) self.cmdline_pile = urwid.Pile([ (urwid.FLOW, urwid.Text( f"Command line: [{CONFIG['hotkeys_toggle_cmdline_focus']}]")), (urwid.WEIGHT, 1, urwid.AttrMap( self.cmdline_list, "command line output")), (urwid.FLOW, self.cmdline_edit_bar), ]) self.cmdline_sigwrap = SignalWrap( urwid.AttrMap(self.cmdline_pile, None, "focused sidebar") ) self.cmdline_on = not CONFIG["hide_cmdline_win"] self.cmdline_weight = float(CONFIG.get("cmdline_height", 1)) self.lhs_col = urwid.Pile([ (urwid.WEIGHT, 5, self.source_attr), (urwid.WEIGHT, self.cmdline_weight if self.cmdline_on else 0, self.cmdline_sigwrap), ]) # }}} # {{{ right column self.locals = urwid.SimpleListWalker([]) self.var_list = SignalWrap( urwid.ListBox(self.locals)) self.stack_walker = urwid.SimpleListWalker([]) self.stack_list = SignalWrap( urwid.ListBox(self.stack_walker)) self.bp_walker = urwid.SimpleListWalker([]) self.bp_list = SignalWrap( urwid.ListBox(self.bp_walker)) self.rhs_col = urwid.Pile([ (urwid.WEIGHT, float(CONFIG["variables_weight"]), AttrMap(urwid.Pile([ (urwid.FLOW, urwid.Text(make_hotkey_markup("_Variables:"))), AttrMap(self.var_list, "variables"), ]), None, "focused sidebar"),), (urwid.WEIGHT, float(CONFIG["stack_weight"]), AttrMap(urwid.Pile([ (urwid.FLOW, urwid.Text(make_hotkey_markup("_Stack:"))), AttrMap(self.stack_list, "stack"), ]), None, "focused sidebar"),), (urwid.WEIGHT, float(CONFIG["breakpoints_weight"]), AttrMap(urwid.Pile([ (urwid.FLOW, urwid.Text(make_hotkey_markup("_Breakpoints:"))), AttrMap(self.bp_list, "breakpoint"), ]), None, "focused sidebar"),), ]) self.rhs_col_sigwrap = SignalWrap(self.rhs_col) def helpside(w, size, key): help(HELP_HEADER + HELP_SIDE + HELP_MAIN + HELP_LICENSE) add_vi_nav_keys(self.rhs_col_sigwrap) add_help_keys(self.rhs_col_sigwrap, helpside) # }}} self.columns = urwid.Columns( [ (urwid.WEIGHT, 1, self.lhs_col), (urwid.WEIGHT, float(CONFIG["sidebar_width"]), self.rhs_col_sigwrap), ], dividechars=1) self.caption = urwid.Text("") header = urwid.AttrMap(self.caption, "header") self.top = SignalWrap(urwid.Frame( urwid.AttrMap(self.columns, "background"), header)) # }}} def change_rhs_box(name, index, direction, w, size, key): from pudb.settings import save_config weight = self.rhs_col.contents[index][1][1] if direction < 0: if weight > 1/5: weight /= 1.25 else: if weight < 5: weight *= 1.25 CONFIG[name+"_weight"] = weight save_config(CONFIG) self.rhs_col.contents[index] = ( self.rhs_col.contents[index][0], (urwid.WEIGHT, weight)) self.rhs_col._invalidate() # {{{ variables listeners def get_inspect_info(id_path, read_only=False): return (self.get_frame_var_info(read_only) .get_inspect_info(id_path, read_only)) def collapse_current(var, pos, iinfo): if iinfo.show_detail: # collapse current variable iinfo.show_detail = False else: # collapse parent/container variable if var.parent is not None: p_iinfo = get_inspect_info(var.parent.id_path) p_iinfo.show_detail = False return self.locals.index(var.parent) return None def change_var_state(w, size, key): try: pos = self.var_list._w.focus_position except IndexError: return var = cast("VariableWidget | None", self.var_list._w.focus) # pyright: ignore[reportPrivateUsage] if var is None: return iinfo = get_inspect_info(var.id_path) focus_index = None if key == "enter" or key == "\\" or key == " ": iinfo.show_detail = not iinfo.show_detail elif key == "h": focus_index = collapse_current(var, pos, iinfo) elif key == "l": iinfo.show_detail = True elif key == "d": iinfo.display_type = "default" elif key == "t": iinfo.display_type = "type" elif key == "r": iinfo.display_type = "repr" elif key == "s": iinfo.display_type = "str" elif key == "i": iinfo.display_type = "id" elif key == "c": iinfo.display_type = CONFIG["custom_stringifier"] elif key == "H": iinfo.highlighted = not iinfo.highlighted elif key == "@": iinfo.repeated_at_top = not iinfo.repeated_at_top elif key == "*": levels = ["public", "private", "all", "public"] iinfo.access_level = levels[levels.index(iinfo.access_level)+1] elif key == "w": iinfo.wrap = not iinfo.wrap elif key == "m": iinfo.show_methods = not iinfo.show_methods elif key == "delete": fvi = self.get_frame_var_info(read_only=False) for i, watch_expr in enumerate(fvi.watches): if watch_expr is var.watch_expr: del fvi.watches[i] break self.update_var_view(focus_index=focus_index) def edit_inspector_detail(w, size, key): var = cast("VariableWidget | None", self.var_list._w.focus) # pyright: ignore[reportPrivateUsage] if var is None: return fvi = self.get_frame_var_info(read_only=False) iinfo = fvi.get_inspect_info(var.id_path, read_only=False) buttons = [ ("OK", True), ("Cancel", False), ] if var.watch_expr is not None: watch_edit = urwid.Edit([ ("label", "Watch expression: ") ], var.watch_expr.expression) id_segment = [ urwid.AttrMap(watch_edit, "input", "focused input"), urwid.Text(""), ] buttons.extend([None, ("Delete", "del")]) title = "Watch Expression Options" else: id_segment = [ labelled_value("Identifier Path: ", var.id_path), urwid.Text(""), ] title = "Variable Inspection Options" rb_grp_show = [] rb_show_default = urwid.RadioButton(rb_grp_show, "Default", iinfo.display_type == "default") rb_show_type = urwid.RadioButton(rb_grp_show, "Show type()", iinfo.display_type == "type") rb_show_repr = urwid.RadioButton(rb_grp_show, "Show repr()", iinfo.display_type == "repr") rb_show_str = urwid.RadioButton(rb_grp_show, "Show str()", iinfo.display_type == "str") rb_show_id = urwid.RadioButton(rb_grp_show, "Show id()", iinfo.display_type == "id") rb_show_custom = urwid.RadioButton( rb_grp_show, "Show custom (set in prefs)", iinfo.display_type == CONFIG["custom_stringifier"]) rb_grp_access = [] rb_access_public = urwid.RadioButton(rb_grp_access, "Public members", iinfo.access_level == "public") rb_access_private = urwid.RadioButton( rb_grp_access, "Public and private members", iinfo.access_level == "private") rb_access_all = urwid.RadioButton( rb_grp_access, "All members (including __dunder__)", iinfo.access_level == "all") wrap_checkbox = urwid.CheckBox("Line Wrap", iinfo.wrap) expanded_checkbox = urwid.CheckBox("Expanded", iinfo.show_detail) highlighted_checkbox = urwid.CheckBox("Highlighted", iinfo.highlighted) repeated_at_top_checkbox = urwid.CheckBox( "Repeated at top", iinfo.repeated_at_top) show_methods_checkbox = urwid.CheckBox( "Show methods", iinfo.show_methods) lb = urwid.ListBox(urwid.SimpleListWalker( id_segment + rb_grp_show + [urwid.Text("")] + rb_grp_access + [urwid.Text("")] + [ wrap_checkbox, expanded_checkbox, highlighted_checkbox, repeated_at_top_checkbox, show_methods_checkbox, ])) result = self.dialog(lb, buttons, title=title) if result is True: iinfo.show_detail = expanded_checkbox.get_state() iinfo.wrap = wrap_checkbox.get_state() iinfo.highlighted = highlighted_checkbox.get_state() iinfo.repeated_at_top = repeated_at_top_checkbox.get_state() iinfo.show_methods = show_methods_checkbox.get_state() if rb_show_default.get_state(): iinfo.display_type = "default" elif rb_show_type.get_state(): iinfo.display_type = "type" elif rb_show_repr.get_state(): iinfo.display_type = "repr" elif rb_show_str.get_state(): iinfo.display_type = "str" elif rb_show_id.get_state(): iinfo.display_type = "id" elif rb_show_custom.get_state(): iinfo.display_type = CONFIG["custom_stringifier"] if rb_access_public.get_state(): iinfo.access_level = "public" elif rb_access_private.get_state(): iinfo.access_level = "private" elif rb_access_all.get_state(): iinfo.access_level = "all" if var.watch_expr is not None: var.watch_expr = WatchExpression(watch_edit.get_edit_text()) # pyright: ignore[reportPossiblyUnboundVariable] elif result == "del": for i, watch_expr in enumerate(fvi.watches): if watch_expr is var.watch_expr: del fvi.watches[i] break self.update_var_view() def insert_watch(w, size, key): watch_edit = urwid.Edit([ ("label", "Watch expression: ") ]) if self.dialog( urwid.ListBox(urwid.SimpleListWalker([ urwid.AttrMap(watch_edit, "input", "focused input") ])), [ ("OK", True), ("Cancel", False), ], title="Add Watch Expression"): from pudb.var_view import WatchExpression we = WatchExpression(watch_edit.get_edit_text()) fvi = self.get_frame_var_info(read_only=False) fvi.watches.append(we) self.update_var_view() self.var_list.listen("\\", change_var_state) self.var_list.listen(" ", change_var_state) self.var_list.listen("h", change_var_state) self.var_list.listen("l", change_var_state) self.var_list.listen("d", change_var_state) self.var_list.listen("t", change_var_state) self.var_list.listen("r", change_var_state) self.var_list.listen("s", change_var_state) self.var_list.listen("i", change_var_state) self.var_list.listen("c", change_var_state) self.var_list.listen("H", change_var_state) self.var_list.listen("@", change_var_state) self.var_list.listen("*", change_var_state) self.var_list.listen("w", change_var_state) self.var_list.listen("m", change_var_state) self.var_list.listen("enter", change_var_state) self.var_list.listen("e", edit_inspector_detail) self.var_list.listen("n", insert_watch) self.var_list.listen("insert", insert_watch) self.var_list.listen("delete", change_var_state) self.var_list.listen("[", partial(change_rhs_box, "variables", 0, -1)) self.var_list.listen("]", partial(change_rhs_box, "variables", 0, 1)) # }}} # {{{ stack listeners def examine_frame(w, size, key): pos = self.stack_list._w.focus_position self.debugger.set_frame_index(self.translate_ui_stack_index(pos)) self.stack_list.listen("enter", examine_frame) def open_file_editor(file_name, line_number): file_changed = False try: original_modification_time = os.path.getmtime(file_name) with StoppedScreen(self.screen): filename_edited = self.debugger.open_file_to_edit(file_name, line_number) new_modification_time = os.path.getmtime(file_name) file_changed = new_modification_time - original_modification_time > 0 except Exception: from traceback import format_exception self.message("Exception happened when trying to edit the file:" "\n\n{}".format("".join(format_exception(*sys.exc_info()))), title="File Edit Error") return if file_changed: self.message("File is changed, but the execution is continued with" " the 'old' codebase.\n" f"Changed file: {filename_edited}\n\n" "Please quit and restart to see changes", title="File is changed") def open_editor_on_stack_frame(w, size, key): pos = self.stack_list._w.focus_position index = self.translate_ui_stack_index(pos) curframe, line_number = self.debugger.stack[index] file_name = curframe.f_code.co_filename open_file_editor(file_name, line_number) self.stack_list.listen("ctrl e", open_editor_on_stack_frame) def move_stack_top(w, size, key): self.debugger.set_frame_index(len(self.debugger.stack)-1) def move_stack_up(w, size, key): self.debugger.move_up_frame() def move_stack_down(w, size, key): self.debugger.move_down_frame() self.stack_list.listen("H", move_stack_top) self.stack_list.listen("u", move_stack_up) self.stack_list.listen("d", move_stack_down) self.stack_list.listen("[", partial(change_rhs_box, "stack", 1, -1)) self.stack_list.listen("]", partial(change_rhs_box, "stack", 1, 1)) # }}} # {{{ breakpoint listeners def set_breakpoint_source(bp: bdb.Breakpoint): bp_source_identifier = \ self.source_code_provider.get_source_identifier() if (bp.file and bp_source_identifier == bp.file and bp.line-1 < len(self.source)): self.source[bp.line-1].set_breakpoint(bp.enabled) def save_breakpoints(w, size, key): self.debugger.save_breakpoints() def handle_delete_breakpoint(w, size, key): bp_list = self._get_bp_list() if bp_list: pos = self.bp_list._w.focus_position bp = bp_list[pos] delete_breakpoint(bp) def delete_breakpoint(bp): err = self.debugger.clear_break(bp.file, bp.line) if err: self.message("Error clearing breakpoint:\n" + err) else: bp.enabled = False self.update_breakpoints() set_breakpoint_source(bp) def enable_disable_breakpoint(w, size, key): pos = self.bp_list._w.focus_position bp_entry = self.bp_list._w.focus if bp_entry is None: return bp = self._get_bp_list()[pos] bp.enabled = not bp.enabled self.update_breakpoints() set_breakpoint_source(bp) def examine_breakpoint(w, size, key): pos = self.bp_list._w.focus_position bp_entry = self.bp_list._w.focus if bp_entry is None: return bp = self._get_bp_list()[pos] if bp.cond is None: cond = "" else: cond = str(bp.cond) enabled_checkbox = urwid.CheckBox( "Enabled", bp.enabled) cond_edit = urwid.Edit([ ("label", "Condition: ") ], cond) ign_count_edit = urwid.IntEdit([ ("label", "Ignore the next N times: ") ], bp.ignore) lb = urwid.ListBox(urwid.SimpleListWalker([ labelled_value("File: ", bp.file), labelled_value("Line: ", bp.line), labelled_value("Hits: ", bp.hits), urwid.Text(""), enabled_checkbox, urwid.AttrMap(cond_edit, "input", "focused input"), urwid.AttrMap(ign_count_edit, "input", "focused input"), ])) result = self.dialog(lb, [ ("OK", True), ("Cancel", False), None, ("Delete", "del"), ("Location", "loc"), ], title="Edit Breakpoint") if result is True: bp.enabled = enabled_checkbox.get_state() bp.ignore = int(ign_count_edit.value()) cond = cond_edit.get_edit_text() if cond: bp.cond = cond else: bp.cond = None elif result == "loc": self.show_line(bp.line, FileSourceCodeProvider(self.debugger, bp.file)) self.columns.focus_position = 0 elif result == "del": delete_breakpoint(bp) self.update_breakpoints() set_breakpoint_source(bp) def show_breakpoint(w, size, key): pos = self.bp_list._w.focus_position bp_entry = self.bp_list._w.focus if bp_entry is not None: bp = self._get_bp_list()[pos] self.show_line(bp.line, FileSourceCodeProvider(self.debugger, bp.file)) self.columns.focus_position = 0 self.bp_list.listen("enter", show_breakpoint) self.bp_list.listen("d", handle_delete_breakpoint) self.bp_list.listen("s", save_breakpoints) self.bp_list.listen("e", examine_breakpoint) self.bp_list.listen("b", enable_disable_breakpoint) self.bp_list.listen("H", move_stack_top) self.bp_list.listen("[", partial(change_rhs_box, "breakpoints", 2, -1)) self.bp_list.listen("]", partial(change_rhs_box, "breakpoints", 2, 1)) # }}} # {{{ source listeners def end(): self.debugger.save_breakpoints() self.quit_event_loop = True def next_line(_w: urwid.Widget, _size: UrwidSize, _key: str): if self.debugger.post_mortem: self.message("Post-mortem mode: Can't modify state.") else: self.debugger.set_next(self.debugger.curframe) end() def step(w, size, key): if self.debugger.post_mortem: self.message("Post-mortem mode: Can't modify state.") else: self.debugger.set_step() end() def finish(w, size, key): if self.debugger.post_mortem: self.message("Post-mortem mode: Can't modify state.") else: self.debugger.set_return(self.debugger.curframe) end() def cont(w, size, key): if self.debugger.post_mortem: self.message("Post-mortem mode: Can't modify state.") else: self.debugger.set_continue() end() def run_to_cursor(w, size, key): if self.debugger.post_mortem: self.message("Post-mortem mode: Can't modify state.") else: pos = self.source.focus lineno = pos+1 bp_source_identifier = \ self.source_code_provider.get_source_identifier() if bp_source_identifier is None: self.message( "Cannot currently set a breakpoint here--" "source code does not correspond to a file location. " "(perhaps this is generated code)") return from pudb.lowlevel import get_breakpoint_invalid_reason invalid_reason = get_breakpoint_invalid_reason( bp_source_identifier, lineno) if invalid_reason is not None: self.message( "Cannot run to the line you indicated, " "for the following reason:\n\n" + invalid_reason) else: err = self.debugger.set_break( bp_source_identifier, pos+1, temporary=True) if err: self.message("Error dealing with breakpoint:\n" + err) self.debugger.set_continue() end() def jump_to_cursor(w, size, key): if self.debugger.post_mortem: self.message("Post-mortem mode: Can't modify state.") else: pos = self.source.focus lineno = pos+1 bp_source_identifier = \ self.source_code_provider.get_source_identifier() if bp_source_identifier is None: self.message( "Cannot jump here--" "source code does not correspond to a file location. " "(perhaps this is generated code)") return from pudb.lowlevel import get_breakpoint_invalid_reason invalid_reason = get_breakpoint_invalid_reason( bp_source_identifier, lineno) if invalid_reason is not None: self.message( "Cannot jump to the line you indicated, " "for the following reason:\n\n" + invalid_reason) else: try: self.debugger.set_jump( self.debugger.curframe, lineno) self.debugger.stack[self.debugger.curindex] = \ self.debugger.stack[self.debugger.curindex][0], lineno self.debugger.set_step() except ValueError as e: self.message(f"""\ Error with jump. Note that jumping only works on the topmost stack frame. (The error was: {e.args[0]})""") # Update UI. end() will run past the line assert self.source_code_provider is not None self.set_current_line(lineno, self.source_code_provider) self.update_stack() def go_to_line(w, size, key): line = self.source.focus lineno_edit = urwid.IntEdit([ ("label", "Go to Line :") ], None) if self.dialog( urwid.ListBox(urwid.SimpleListWalker([ labelled_value("File :", self.source_code_provider.identifier()), labelled_value("Current Line :", line+1), urwid.AttrMap(lineno_edit, "input", "focused input") ])), [ ("OK", True), ("Cancel", False), ], title="Go to Line Number"): value = lineno_edit.value() if value: lineno = min(max(0, int(value)-1), len(self.source)-1) self.source_list.focus_position = lineno def scroll_left(w, size, key): self.source_hscroll_start = max( 0, self.source_hscroll_start - 4) for sl in self.source: sl._invalidate() def scroll_right(w, size, key): self.source_hscroll_start += 4 for sl in self.source: sl._invalidate() def search(w, size, key): self.search_controller.open_search_ui() def search_next(w, size, key): self.search_controller.perform_search(dir=1, update_search_start=True) def search_previous(w, size, key): self.search_controller.perform_search(dir=-1, update_search_start=True) def toggle_breakpoint(w, size, key): bp_source_identifier = \ self.source_code_provider.get_source_identifier() if bp_source_identifier: pos = self.source_list.focus_position sline = self.source[pos] lineno = pos+1 existing_breaks = self.debugger.get_breaks( bp_source_identifier, lineno) if existing_breaks: err = None for bp in existing_breaks: if not bp.enabled: bp.enable() sline.set_breakpoint(True) # Unsure about this. Are multiple breakpoints even # possible? break else: err = self.debugger.clear_break(bp_source_identifier, lineno) sline.set_breakpoint(False) else: file_lineno = (bp_source_identifier, lineno) if file_lineno in self.debugger.set_traces: self.debugger.set_traces[file_lineno] = \ not self.debugger.set_traces[file_lineno] sline.set_breakpoint(self.debugger.set_traces[file_lineno]) return from pudb.lowlevel import get_breakpoint_invalid_reason invalid_reason = get_breakpoint_invalid_reason( bp_source_identifier, pos+1) if invalid_reason is not None: do_set = not self.dialog( urwid.ListBox( urwid.SimpleListWalker([ urwid.Text( "The breakpoint you just set may be " "invalid, for the following reason:\n\n" + invalid_reason), ])), [ ("Cancel", True), ("Set Anyway", False), ], title="Possibly Invalid Breakpoint", focus_buttons=True) else: do_set = True if do_set: err = self.debugger.set_break(bp_source_identifier, pos+1) sline.set_breakpoint(True) else: err = None if err: self.message("Error dealing with breakpoint:\n" + err) self.update_breakpoints() else: self.message( "Cannot currently set a breakpoint here--" "source code does not correspond to a file location. " "(perhaps this is generated code)") def helpmain(w, size, key): help(HELP_HEADER + HELP_MAIN + HELP_SIDE + HELP_LICENSE) self.source_sigwrap.listen("n", next_line) self.source_sigwrap.listen("s", step) self.source_sigwrap.listen("f", finish) self.source_sigwrap.listen("r", finish) self.source_sigwrap.listen("c", cont) self.source_sigwrap.listen("t", run_to_cursor) self.source_sigwrap.listen("J", jump_to_cursor) self.source_sigwrap.listen("L", go_to_line) self.source_sigwrap.listen("/", search) self.source_sigwrap.listen(",", search_previous) self.source_sigwrap.listen(".", search_next) self.source_sigwrap.listen("b", toggle_breakpoint) self.source_sigwrap.listen("m", partial(pick_module, self)) self.source_sigwrap.listen("H", move_stack_top) self.source_sigwrap.listen("u", move_stack_up) self.source_sigwrap.listen("d", move_stack_down) # left/right scrolling have to be handled specially, normal vi keys # don't cut it self.source_sigwrap.listen("h", scroll_left) self.source_sigwrap.listen("l", scroll_right) add_vi_nav_keys(self.source_sigwrap) add_help_keys(self.source_sigwrap, helpmain) # }}} # {{{ command line listeners def cmdline_get_namespace(): curframe = self.debugger.curframe from pudb.shell import SetPropagatingDict return SetPropagatingDict( [curframe.f_locals, curframe.f_globals], curframe.f_locals) def cmdline_tab_complete(w, size, key): try: from jedi import Interpreter except ImportError: self.add_cmdline_content( "Tab completion requires jedi to be installed. ", "command line error") return try: from packaging.version import parse as LooseVersion # noqa: N812 except ImportError: from distutils.version import LooseVersion import jedi if LooseVersion(jedi.__version__) < LooseVersion("0.16.0"): self.add_cmdline_content( "jedi 0.16.0 is required for Tab completion", "command line error") text = self.cmdline_edit.edit_text pos = self.cmdline_edit.edit_pos chopped_text = text[:pos] suffix = text[pos:] try: completions = Interpreter( chopped_text, [cmdline_get_namespace()]).complete() except Exception as e: # Jedi sometimes produces errors. Ignore them. self.add_cmdline_content( f"Could not tab complete (Jedi error: '{e}')", "command line error") return full_completions = [i.name_with_symbols for i in completions] chopped_completions = [i.complete for i in completions] def common_prefix(a, b): for i, (a_i, b_i) in enumerate(zip(a, b)): if a_i != b_i: return a[:i] return a[:max(len(a), len(b))] common_compl_prefix = None for completion in chopped_completions: if common_compl_prefix is None: common_compl_prefix = completion else: common_compl_prefix = common_prefix( common_compl_prefix, completion) completed_chopped_text = common_compl_prefix if completed_chopped_text is None: return if ( len(completed_chopped_text) == 0 and len(completions) > 1): self.add_cmdline_content( " ".join(full_completions), "command line output") return self.cmdline_edit.edit_text = \ chopped_text+completed_chopped_text+suffix self.cmdline_edit.edit_pos = ( len(chopped_text) + len(completed_chopped_text)) def cmdline_append_newline(w, size, key): self.cmdline_edit.insert_text("\n") def cmdline_exec(w, size, key): cmd = self.cmdline_edit.get_edit_text() if not cmd: # blank command -> refuse service return self.add_cmdline_content(">>> " + cmd, "command line input") if not self.cmdline_history or cmd != self.cmdline_history[-1]: self.cmdline_history.append(cmd) self.cmdline_history_position = -1 self.cmdline_saved_edit_text = "" prev_sys_stdin = sys.stdin prev_sys_stdout = sys.stdout prev_sys_stderr = sys.stderr from io import StringIO sys.stdin = None sys.stderr = sys.stdout = StringIO() try: eval(compile(cmd, "", "single"), cmdline_get_namespace()) except Exception: tp, val, tb = sys.exc_info() import traceback tblist = traceback.extract_tb(tb) del tblist[:1] tb_lines = traceback.format_list(tblist) if tb_lines: tb_lines.insert(0, "Traceback (most recent call last):\n") tb_lines[len(tb_lines):] = traceback.format_exception_only(tp, val) self.add_cmdline_content("".join(tb_lines), "command line error") else: self.cmdline_edit.set_edit_text("") finally: if sys.stdout.getvalue(): self.add_cmdline_content(sys.stdout.getvalue(), "command line output") sys.stdin = prev_sys_stdin sys.stdout = prev_sys_stdout sys.stderr = prev_sys_stderr def cmdline_history_browse(direction): # Browsing the command line history can be illustrated by moving up/down # in the following table (no wrap-around). # The first column shows what is written in the command input text field, # the second one the corresponding value of self.cmdline_history_position # The actual index into the history list is given by the last column. # | history | history # command line text | position | list index # ----------------------------|----------|----------- # oldest_command | 2 | 0 # medium_command | 1 | 1 # recent_command | 0 | 2 # | -1 | # | -1 | def pos_text(pos, text): if pos == -1: if text: # currently editing a command, save it to return to it later self.cmdline_saved_edit_text = text if direction > 0: # clear command to be able to write a different one return -1, "" if direction < 0 and not text and self.cmdline_saved_edit_text: # return to last saved command return -1, self.cmdline_saved_edit_text max_hist_index = len(self.cmdline_history) - 1 pos = max(-1, min(pos - direction, max_hist_index)) if pos == -1: return -1, self.cmdline_saved_edit_text return pos, self.cmdline_history[max_hist_index - pos] self.cmdline_history_position, self.cmdline_edit.edit_text = pos_text( self.cmdline_history_position, self.cmdline_edit.edit_text) self.cmdline_edit.edit_pos = len(self.cmdline_edit.edit_text) def cmdline_history_prev(w, size, key): cmdline_history_browse(-1) def cmdline_history_next(w, size, key): cmdline_history_browse(1) def toggle_cmdline_focus(w, size, key): focus_widget_in_container(self.columns, self.lhs_col) if self.lhs_col.focus is self.cmdline_sigwrap: if CONFIG["hide_cmdline_win"]: self.set_cmdline_state(False) focus_widget_in_container( self.lhs_col, self.search_controller.search_AttrMap if self.search_controller.search_box else self.source_attr) else: if CONFIG["hide_cmdline_win"]: self.set_cmdline_state(True) focus_widget_in_container(self.cmdline_pile, self.cmdline_edit_bar) focus_widget_in_container(self.lhs_col, self.cmdline_sigwrap) self.cmdline_edit_sigwrap.listen("tab", cmdline_tab_complete) self.cmdline_edit_sigwrap.listen("ctrl v", cmdline_append_newline) self.cmdline_edit_sigwrap.listen("enter", cmdline_exec) self.cmdline_edit_sigwrap.listen("down", cmdline_history_next) self.cmdline_edit_sigwrap.listen("up", cmdline_history_prev) self.cmdline_edit_sigwrap.listen("ctrl n", cmdline_history_next) self.cmdline_edit_sigwrap.listen("ctrl p", cmdline_history_prev) self.cmdline_edit_sigwrap.listen("esc", toggle_cmdline_focus) self.top.listen(CONFIG["hotkeys_toggle_cmdline_focus"], toggle_cmdline_focus) # {{{ command line sizing def set_cmdline_default_size(weight: float): from pudb.settings import save_config self.cmdline_weight = weight CONFIG["cmdline_height"] = weight save_config(CONFIG) self.set_cmdline_size() def max_cmdline(w, size, key): set_cmdline_default_size(5) def min_cmdline(w, size, key): set_cmdline_default_size(1/2) def grow_cmdline(w, size, key): weight = self.cmdline_weight if weight < 5: weight *= 1.25 set_cmdline_default_size(weight) def shrink_cmdline(w, size, key): weight = self.cmdline_weight if weight > 1/2: weight /= 1.25 set_cmdline_default_size(weight) def cmdline_results_scroll(w, size, key): size = self.cmdline_pile.get_item_size(size, 1, True) self.cmdline_list.keypress(size, key.lstrip("shift ")) self.cmdline_sigwrap.listen("=", max_cmdline) self.cmdline_sigwrap.listen("+", grow_cmdline) self.cmdline_sigwrap.listen("_", min_cmdline) self.cmdline_sigwrap.listen("-", shrink_cmdline) for key in ("page up", "page down"): self.cmdline_sigwrap.listen("shift " + key, cmdline_results_scroll) # }}} # }}} # {{{ sidebar sizing def _set_sidebar_weight(weight: float) -> None: from pudb.settings import save_config CONFIG["sidebar_width"] = weight save_config(CONFIG) self.columns.contents[1] = ( self.columns.contents[1][0], self.columns.options("weight", weight)) def max_sidebar(w, size, key): _set_sidebar_weight(5) def min_sidebar(w, size, key): _set_sidebar_weight(1/5) def grow_sidebar(w, size, key): _widget, (_weight_literal, weight, _flag) = self.columns.contents[1] assert weight is not None if weight < 5: weight *= 1.25 _set_sidebar_weight(weight) def shrink_sidebar(w, size, key): _widget, (_weight_literal, weight, _flag) = self.columns.contents[1] assert weight is not None if weight > 1/5: weight /= 1.25 _set_sidebar_weight(weight) self.rhs_col_sigwrap.listen("=", max_sidebar) self.rhs_col_sigwrap.listen("+", grow_sidebar) self.rhs_col_sigwrap.listen("_", min_sidebar) self.rhs_col_sigwrap.listen("-", shrink_sidebar) # }}} # {{{ top-level listeners def show_output(w, size, key): with StoppedScreen(self.screen) as s: s.press_key_to_return() def reload_breakpoints_and_redisplay(): reload_breakpoints() curr_line = self.current_line assert self.source_code_provider self.set_source_code_provider(self.source_code_provider, force_update=True) if curr_line is not None: self.current_line = self.source[int(curr_line.line_nr)-1] self.current_line.set_current(True) def reload_breakpoints(): self.debugger.clear_all_breaks() from pudb.settings import load_breakpoints for bpoint_descr in load_breakpoints(): dbg.set_break(*bpoint_descr) self.update_breakpoints() def show_traceback(w, size, key): if self.current_exc_tuple is not None: from traceback import format_exception result = self.dialog( urwid.ListBox(urwid.SimpleListWalker([urwid.Text( "".join(format_exception(*self.current_exc_tuple)))])), [ ("Close", "close"), ("Location", "location") ], title="Exception Viewer", focus_buttons=True, bind_enter_esc=False) if result == "location": self.debugger.set_frame_index(len(self.debugger.stack)-1) else: self.message("No exception available.") def run_external_cmdline(w, size, key): with StoppedScreen(self.screen): curframe = self.debugger.curframe import pudb.shell as shell if CONFIG["shell"] == "ipython" and shell.have_ipython(): runner = shell.run_ipython_shell elif CONFIG["shell"] == "ipython_kernel" and shell.have_ipython(): runner = shell.run_ipython_kernel elif CONFIG["shell"] == "bpython" and shell.HAVE_BPYTHON: runner = shell.run_bpython_shell elif CONFIG["shell"] == "ptpython" and shell.HAVE_PTPYTHON: runner = shell.run_ptpython_shell elif CONFIG["shell"] == "ptipython" and shell.HAVE_PTIPYTHON: runner = shell.run_ptipython_shell elif CONFIG["shell"] == "classic": runner = shell.run_classic_shell else: def fallback(error_message): fallback_message = "Falling back to classic shell." message = f"{error_message} {fallback_message}" ui_log.error(message) return partial(shell.run_classic_shell, message=message) try: if not shell.custom_shell_dict: # Only execfile once from os.path import expanduser, expandvars cshell_fname = expanduser(expandvars(CONFIG["shell"])) with open(cshell_fname) as inf: exec(compile(inf.read(), cshell_fname, "exec"), shell.custom_shell_dict, shell.custom_shell_dict) except FileNotFoundError: runner = fallback( "Unable to locate custom shell file {!r}." .format(CONFIG["shell"]) ) except Exception: runner = fallback("Error when importing custom shell.") else: if "pudb_shell" not in shell.custom_shell_dict: runner = fallback( "{} does not contain a function named pudb_shell at " "the module level.".format(CONFIG["shell"]) ) else: runner = shell.custom_shell_dict["pudb_shell"] runner(curframe.f_globals, curframe.f_locals) self.update_var_view() def run_cmdline(w, size, key): if CONFIG["shell"] == "internal": return toggle_cmdline_focus(w, size, key) else: return run_external_cmdline(w, size, key) def focus_code(w, size, key): focus_widget_in_container(self.columns, self.lhs_col) focus_widget_in_container(self.lhs_col, self.source_attr) class RHColumnFocuser: def __init__(self, idx): self.idx = idx def __call__(subself, w, size, key): # noqa # pylint: disable=no-self-argument focus_widget_in_container(self.columns, self.rhs_col_sigwrap) self.rhs_col.focus_position = subself.idx def quit(w, size, key): with open(self.cmdline_history_path, "w") as history: history.write("\n".join(self.cmdline_history)) self.debugger.set_quit() end() def do_edit_config(w, size, key): self.run_edit_config() def redraw_screen(w, size, key): self.screen.clear() def help(pages): self.message(pages, title="PuDB - The Python Urwid Debugger") def edit_current_frame(w, size, key): pos = self.source.focus source_identifier = \ self.source_code_provider.get_source_identifier() if source_identifier is None: self.message( "Cannot edit the current file--" "source code does not correspond to a file location. " "(perhaps this is generated code)") open_file_editor(source_identifier, pos+1) self.top.listen("o", show_output) self.top.listen("ctrl r", lambda w, size, key: reload_breakpoints_and_redisplay()) self.top.listen("!", run_cmdline) self.top.listen("e", show_traceback) self.top.listen(CONFIG["hotkeys_code"], focus_code) self.top.listen(CONFIG["hotkeys_variables"], RHColumnFocuser(0)) self.top.listen(CONFIG["hotkeys_stack"], RHColumnFocuser(1)) self.top.listen(CONFIG["hotkeys_breakpoints"], RHColumnFocuser(2)) self.top.listen("q", quit) self.top.listen("ctrl p", do_edit_config) self.top.listen("ctrl l", redraw_screen) self.top.listen("ctrl e", edit_current_frame) # }}} # {{{ setup want_curses_display = ( CONFIG["display"] == "curses" or ( CONFIG["display"] == "auto" and not ( os.environ.get("TERM", "").startswith("xterm") or os.environ.get("TERM", "").startswith("rxvt") ))) if (want_curses_display and not (stdin is not None or stdout is not None) and CursesScreen is not None): self.screen = ThreadsafeCursesScreen() else: screen_kwargs = {} if stdin is not None: screen_kwargs["input"] = stdin if stdout is not None: screen_kwargs["output"] = stdout if term_size is not None: screen_kwargs["term_size"] = term_size if screen_kwargs: self.screen = ThreadsafeFixedSizeRawScreen(**screen_kwargs) else: self.screen = ThreadsafeRawScreen() del want_curses_display if curses: try: curses.setupterm() except Exception: # Something went wrong--oh well. Nobody will die if their # 256 color support breaks. Just carry on without it. # https://github.com/inducer/pudb/issues/78 pass else: color_support = curses.tigetnum("colors") if color_support == 256 and isinstance(self.screen, RawScreen): self.screen.set_terminal_properties(256) self.setup_palette(self.screen) self.show_count = 0 self.source_code_provider = None self.current_line = None self.quit_event_loop = False # }}} # }}} # {{{ UI helpers def add_cmdline_content(self, s, attr): s = s.rstrip("\n") from pudb.ui_tools import SelectableText self.cmdline_contents.append( urwid.AttrMap(SelectableText(s), attr, "focused "+attr)) # scroll to end of last entry self.cmdline_list.set_focus_valign("bottom") self.cmdline_list.set_focus(len(self.cmdline_contents) - 1, coming_from="above") # Force the commandline to be visible self.set_cmdline_state(True) def reset_cmdline_size(self): self.lhs_col.contents[-1] = ( self.lhs_col.contents[-1][0], (urwid.WEIGHT, self.cmdline_weight if self.cmdline_on else 0)) def set_cmdline_size(self, weight=None): if weight is None: weight = self.cmdline_weight self.lhs_col.contents[-1] = ( self.lhs_col.contents[-1][0], (urwid.WEIGHT, weight)) self.lhs_col._invalidate() def set_cmdline_state(self, state_on): if state_on != self.cmdline_on: self.cmdline_on = state_on self.set_cmdline_size(None if state_on else 0) def translate_ui_stack_index(self, index): # note: self-inverse if CONFIG["current_stack_frame"] == "top": return len(self.debugger.stack)-1-index elif CONFIG["current_stack_frame"] == "bottom": return index else: raise ValueError("invalid value for 'current_stack_frame' pref") def message(self, msg: str, title: str = "Message", extra_bindings: Sequence[ tuple[str, str | EventListener[urwid.Widget]]] | None = None, ): return self.call_with_ui(self.dialog, urwid.ListBox(urwid.SimpleListWalker([urwid.Text(msg)])), [("OK", True)], title=title, extra_bindings=extra_bindings) def run_edit_config(self): from pudb.settings import edit_config, save_config edit_config(self, CONFIG) save_config(CONFIG) def dialog(self, content: urwid.Widget, buttons_and_results: Sequence[tuple[str, object] | None], title: str | None = None, bind_enter_esc: bool = True, focus_buttons: bool = False, extra_bindings: Sequence[ tuple[str, str | EventListener[urwid.Widget]]] | None = None, ) -> object: if extra_bindings is None: extra_bindings = [] Attr = urwid.AttrMap # noqa if bind_enter_esc: content = SignalWrap(content) def enter(w, size, key): self.quit_event_loop = (True,) def esc(w, size, key): self.quit_event_loop = (False,) content.listen("enter", enter) content.listen("esc", esc) # Results get wrapped in tuples because the main loop considers the truthiness # of the value. Once wrapped in a tuple, (False,) is still truthy. button_widgets: list[urwid.Widget] = [] for btn_descr in buttons_and_results: if btn_descr is None: button_widgets.append(urwid.Text("")) else: btn_text, btn_result = btn_descr button_widgets.append( Attr(urwid.Button(btn_text, OnButtonEventLoopResultSetter(self, (btn_result,))), "button", "focused button")) w = urwid.Columns([ content, (urwid.FIXED, 15, urwid.ListBox(urwid.SimpleListWalker(button_widgets))), ], dividechars=1) if focus_buttons: w.focus_position = 1 if title is not None: w = urwid.Pile([ (urwid.FLOW, urwid.AttrMap( urwid.Text(title, align="center"), "dialog title")), (urwid.FIXED, 1, urwid.SolidFill()), w]) w = SignalWrap(w) for key, binding in extra_bindings: if callable(binding): w.listen(key, binding) else: w.listen(key, ResultSettingEventHandler(self, (binding,))) w = urwid.LineBox(w) w = urwid.Overlay(w, self.top, align="center", valign="middle", width=("relative", 75), height=("relative", 75), ) w = Attr(w, "background") return cast("tuple[object]", self.event_loop(w))[0] @staticmethod def setup_palette(screen): may_use_fancy_formats = not hasattr(urwid.escape, "_fg_attr_xterm") from pudb.theme import get_palette palette = get_palette(may_use_fancy_formats, CONFIG["theme"]) if palette: screen.register_palette(palette) def show_exception_dialog(self, exc_tuple: OptExcInfo): from traceback import format_exception desc = ( "The program has terminated abnormally because of an exception.\n\n" "A full traceback is below. You may recall this traceback at any " "time using the 'e' key. The debugger has entered post-mortem mode " "and will prevent further state changes." ) tb_txt = "".join(format_exception(*exc_tuple)) self._show_exception_dialog( description=desc, error_info=tb_txt, title="Program Terminated for Uncaught Exception", exit_loop_on_ok=True, ) def show_internal_exc_dlg(self, exc_tuple: OptExcInfo): try: self._show_internal_exc_dlg(exc_tuple) except Exception: ui_log.exception("Error while showing error dialog") def _show_internal_exc_dlg(self, exc_tuple: OptExcInfo): from traceback import format_exception from pudb import VERSION desc = ( "Pudb has encountered and safely caught an internal exception.\n\n" "The full traceback and some other information can be found " "below. Please report this information, along with details on " "what you were doing at the time the exception occurred, at: " "https://github.com/inducer/pudb/issues" ) error_info = ( "python version: {python}\n" "pudb version: {pudb}\n" "urwid version: {urwid}\n" "{tb}\n" ).format( python=sys.version.replace("\n", " "), pudb=VERSION, urwid=".".join(map(str, urwid.version.version)), tb="".join(format_exception(*exc_tuple)) ) self._show_exception_dialog( description=desc, error_info=error_info, title="Pudb Internal Exception Encountered", ) def _show_exception_dialog(self, description: str, error_info: str, title: str, exit_loop_on_ok: bool = False): res = self.dialog( urwid.ListBox(urwid.SimpleListWalker([urwid.Text( "\n\n".join([description, error_info]) )])), title=title, buttons_and_results=[ ("OK", exit_loop_on_ok), ("Save traceback", "save"), ], ) if res == "save": self._save_traceback(error_info) def _save_traceback(self, error_info: str): try: from os.path import exists filename = next( fname for n in count() for fname in ["traceback-%d.txt" % n if n else "traceback.txt"] if not exists(fname) ) with open(filename, "w") as outf: outf.write(error_info) self.message(f"Traceback saved as {filename}.", title="Success") except Exception: from traceback import format_exception io_tb_txt = "".join(format_exception(*sys.exc_info())) self.message( "An error occurred while trying to write " "the traceback:\n\n" + io_tb_txt, title="I/O error") # }}} # {{{ UI enter/exit def _show(self): if self.show_count == 0: self.screen.start() self.show_count += 1 def _hide(self): self.show_count -= 1 if self.show_count == 0: self.screen.stop() def call_with_ui(self, f: Callable[P, ResultT], *args: P.args, **kwargs: P.kwargs ): import warnings def myshowwarning( message, category, filename, lineno, file=None, line=None ) -> None: msg = warnings.formatwarning( message=message, category=category, filename=filename, lineno=lineno, line=line) self.add_cmdline_content(msg, "command line error") with warnings.catch_warnings(): warnings.resetwarnings() warnings.showwarning = myshowwarning self._show() try: return f(*args, **kwargs) finally: self._hide() # }}} # {{{ event loop def event_loop(self, toplevel: urwid.Widget | None = None) -> object: prev_quit_loop = self.quit_event_loop try: import pygments # noqa except ImportError: if not hasattr(self, "pygments_message_shown"): self.pygments_message_shown = True self.message("Package 'pygments' not found. " "Syntax highlighting disabled.") WELCOME_LEVEL = "e056" # noqa if CONFIG["seen_welcome"] < WELCOME_LEVEL: CONFIG["seen_welcome"] = WELCOME_LEVEL from pudb import VERSION self.message(f"Welcome to PudB {VERSION}!\n\n" "PuDB is a full-screen, console-based visual debugger for " "Python. Its goal is to provide all the niceties of modern " "GUI-based debuggers in a more lightweight and " "keyboard-friendly package. " "PuDB allows you to debug code right where you write and test " "it--in a terminal. If you've worked with the excellent " "(but nowadays ancient) DOS-based Turbo Pascal or C tools, " "PuDB's UI might look familiar.\n\n" "If you're new here, welcome! The help screen " "(invoked by hitting '?' after this message) should get you " "on your way.\n" "\nChanges in version 2025.1.5:\n\n" "- No changes; 2025.1.4 released via trusted publishing\n" "\nChanges in version 2025.1.4:\n\n" "- Work around compatibility break in urwid 3.0.4 " "(reported by Marc Salat)\n" "\nChanges in version 2025.1.3:\n\n" "- Actually fix module picking\n" "- Fix bugs introduced by typing improvements\n" "\nChanges in version 2025.1.2:\n\n" "- Fix module picking\n" "- Work towards improved type checking coverage\n" "\nChanges in version 2025.1.1:\n\n" "- Fix a call to format_exception (Lumír 'Frenzy' Balhar)\n" "- Fix set_trace(paused=False) (Aaron Meurer)\n" "- Expose post_mortem in pudb.remote (Gabriel Pettier)\n" "- Work towards improved type checking coverage\n" "\nChanges in version 2025.1:\n\n" "- Fix compatibility with Urwid 3\n" "- Allow leaving output screen with single key press " "(Gerhard Sittig)\n" "\nChanges in version 2024.1.3:\n\n" "- Switch to hatchling build system\n" "- Fix compatibility with Python 3.13\n" "- Fix startup without write permissions (Fergal Armstrong)\n" "\nChanges in version 2024.1.2:\n\n" "- Fix separate-terminal debugging (Matt Rixman)\n" "\nChanges in version 2024.1.1:\n\n" "- Fix some urwid.util deprecation warnings\n" "- Redirect pudb warnings to console\n" "- Catch IndexError on empty Variables state " "(Michael van der Kamp)\n" "\nChanges in version 2024.1:\n\n" "- Control remote debugging via env vars (Max Arnold)\n" "- Adapt to, depend on urwid 2.4\n" "- Make compatible with Python 3.13 (Will Shanks)\n" "- Use co_lines mechanism for line finding executable lines" "when available\n" "\nChanges in version 2023.1:\n\n" "- Add nord-256 theme (Jorge Gomez, Michael van der Kamp)\n" "- Reorganize themes, add light gray theme " "(Michael van der Kamp)\n" "- Improve command line history handling (raphTec)\n" "- Implement jump command (Aaron Meurer)\n" "- Drop support for Python 3.6, 3.7\n" "- Improve sidebar help (kwmiebach)\n" "- Bug fixes\n" "\nChanges in version 2022.1.3:\n\n" "- Fix finding executable lines for Python 3.11 (Lumir Balhar)\n" "- Fix the midnight theme (Aaron Meurer)\n" "- Add a --continue flag (Michael van der Kamp)\n" "- Various fixes\n" "\nChanges in version 2022.1.2:\n\n" "- Various fixes\n" "\nChanges in version 2022.1.1:\n\n" "- Fix ptpython shell invocation with nonempty argv (gh-510)\n" "- Make some key bindings configurable (Cibin Mathew)\n" "- Various cleanups (Michael van der Kamp)\n" "\nChanges in version 2022.1:\n\n" "- Add debug_remote_on_single_rank " "(PR #498 by Matthias Diener)\n" "- Improve remote debugging usability\n" "- Bug fixes\n" "\nChanges in version 2021.2:\n\n" "- Remaster themes (Michael van der Kamp)\n" "- Add more internal shell shortcuts (Huy Nguyen Quang)\n" "- Save internal shell history between sessions " "(Diego Velazquez)\n" "- Various bug fixes\n" "\nChanges in version 2021.1:\n\n" "- Add shortcut to edit files in source and stack view " "(Gábor Vecsei)\n" "- Major improvements to the variable view " "(Michael van der Kamp)\n" "- Better internal error reporting (Michael van der Kamp)\n" "\nChanges in version 2020.1:\n\n" "- Add vi keys for the sidebar (Asbjørn Apeland)\n" "- Add -m command line switch (Elias Dorneles)\n" "- Debug forked processes (Jonathan Striebel)\n" "- Robustness and logging for internal errors " "(Michael Vanderkamp)\n" "- 'Reverse' remote debugging (jen6)\n" "\nChanges in version 2019.2:\n\n" "- Auto-hide the command line (Mark Blakeney)\n" "- Improve help and add jump to breakpoint (Mark Blakeney)\n" "- Drop Py2.6 support\n" "- Show callable attributes in var view\n" "- Allow scrolling sidebar with j/k\n" "- Fix setting breakpoints in Py3.8 (Aaron Meurer)\n" "\nChanges in version 2019.1:\n\n" "- Allow 'space' as a key to expand variables (Enrico Troeger)\n" "- Have a persistent setting on variable visibility \n" " (Enrico Troeger)\n" "- Enable/partially automate opening the debugger in another \n" " terminal (Anton Barkovsky)\n" "- Make sidebar scrollable with j/k (Clayton Craft)\n" "- Bug fixes.\n" "\nChanges in version 2018.1:\n\n" "- Bug fixes.\n" "\nChanges in version 2017.1.4:\n\n" "- Bug fixes.\n" "\nChanges in version 2017.1.3:\n\n" "- Add handling of safely_stringify_for_pudb to allow custom \n" " per-type stringification.\n" "- Add support for custom shells.\n" "- Better support for 2-wide characters in the var view.\n" "- Bug fixes.\n" "\nChanges in version 2017.1.2:\n\n" "- Bug fixes.\n" "\nChanges in version 2017.1.1:\n\n" "- IMPORTANT: 2017.1 and possibly earlier versions had a \n" " bug with exponential growth of shell history for the \n" " 'classic' shell, which (among other problems) could lead\n" " to slow startup of the classic shell. Check the file\n\n" " ~/.config/pudb/shell-history\n\n" " for size (and useful content) and delete/trim as needed.\n" "\nChanges in version 2017.1:\n\n" "- Many, many bug fixes (thank you to all who contributed!)\n" "\nChanges in version 2016.2:\n\n" "- UI improvements for disabled breakpoints.\n" "- Bug fixes.\n" "\nChanges in version 2016.1:\n\n" "- Fix module browser on Py3.\n" "\nChanges in version 2015.4:\n\n" "- Support for (somewhat rudimentary) remote debugging\n" " through a telnet connection.\n" "- Fix debugging of generated code in Python 3.\n" "\nChanges in version 2015.3:\n\n" "- Disable set_trace lines from the UI (Aaron Meurer)\n" "- Better control over attribute visibility (Ned Batchelder)\n" "\nChanges in version 2015.2:\n\n" "- ptpython support (P. Varet)\n" "- Improved rxvt support (Louper Rouch)\n" "- More keyboard shortcuts in the command line" "(Alex Sheluchin)\n" "\nChanges in version 2015.1:\n\n" "- Add solarized theme (Rinat Shigapov)\n" "- More keyboard shortcuts in the command line" "(Alexander Corwin)\n" "\nChanges in version 2014.1:\n\n" "- Make prompt-on-quit optional (Mike Burr)\n" "- Make tab completion in the built-in shell saner\n" "- Fix handling of unicode source\n" " (reported by Morten Nielsen and Buck Golemon)\n" "\nChanges in version 2013.5.1:\n\n" "- Fix loading of saved breakpoint conditions " "(Antoine Dechaume)\n" "- Fixes for built-in command line\n" "- Theme updates\n" "\nChanges in version 2013.5:\n\n" "- Add command line window\n" "- Uses curses display driver when appropriate\n" "\nChanges in version 2013.4:\n\n" "- Support for debugging generated code\n" "\nChanges in version 2013.3.5:\n\n" "- IPython fixes (Aaron Meurer)\n" "- Py2/3 configuration fixes (Somchai Smythe)\n" "- PyPy fixes (Julian Berman)\n" "\nChanges in version 2013.3.4:\n\n" "- Don't die if curses doesn't like what stdin/out are\n" " connected to.\n" "\nChanges in version 2013.3.3:\n\n" "- As soon as pudb is loaded, you can break to the debugger by\n" " evaluating the expression 'pu.db', where 'pu' is a new \n" " 'builtin' that pudb has rudely shoved into the interpreter.\n" "\nChanges in version 2013.3.2:\n\n" "- Don't attempt to do signal handling if a signal handler\n" " is already set (Fix by Buck Golemon).\n" "\nChanges in version 2013.3.1:\n\n" "- Don't ship {ez,distribute}_setup at all.\n" " It breaks more than it helps.\n" "\nChanges in version 2013.3:\n\n" "- Switch to setuptools as a setup helper.\n" "\nChanges in version 2013.2:\n\n" "- Even more bug fixes.\n" "\nChanges in version 2013.1:\n\n" "- Ctrl-C will now break to the debugger in a way that does\n" " not terminate the program\n" "- Lots of bugs fixed\n" "\nChanges in version 2012.3:\n\n" "- Python 3 support (contributed by Brad Froehle)\n" "- Better search box behavior (suggested by Ram Rachum)\n" "- Made it possible to go back and examine state from " "'finished' window. (suggested by Aaron Meurer)\n" "\nChanges in version 2012.2.1:\n\n" "- Don't touch config files during install.\n" "\nChanges in version 2012.2:\n\n" "- Add support for BPython as a shell.\n" "- You can now run 'python -m pudb script.py' on Py 2.6+.\n" " '-m pudb.run' still works--but it's four " "keystrokes longer! :)\n" "\nChanges in version 2012.1:\n\n" "- Work around an API change in IPython 0.12.\n" "\nChanges in version 2011.3.1:\n\n" "- Work-around for bug in urwid >= 1.0.\n" "\nChanges in version 2011.3:\n\n" "- Finer-grained string highlighting " "(contributed by Aaron Meurer)\n" "- Prefs tweaks, instant-apply, top-down stack " "(contributed by Aaron Meurer)\n" "- Size changes in sidebar boxes (contributed by Aaron Meurer)\n" "- New theme 'midnight' (contributed by Aaron Meurer)\n" "- Support for IPython 0.11 (contributed by Chris Farrow)\n" "- Support for custom stringifiers " "(contributed by Aaron Meurer)\n" "- Line wrapping in variables view " "(contributed by Aaron Meurer)\n" "\nChanges in version 2011.2:\n\n" "- Fix for post-mortem debugging (contributed by 'Sundance')\n" "\nChanges in version 2011.1:\n\n" "- Breakpoints saved between sessions\n" "- A new 'dark vim' theme\n" "(both contributed by Naveen Michaud-Agrawal)\n" "\nChanges in version 0.93:\n\n" "- Stored preferences (no more pesky IPython prompt!)\n" "- Themes\n" "- Line numbers (optional)\n") from pudb.settings import save_config save_config(CONFIG) self.run_edit_config() try: if toplevel is None: toplevel = self.top self.size = self.screen.get_cols_rows() self.quit_event_loop = False while not self.quit_event_loop: canvas = toplevel.render(self.size, focus=True) self.screen.draw_screen(self.size, canvas) keys = self.screen.get_input() for k in keys: # pylint: disable=not-an-iterable if k == "window resize": self.size = self.screen.get_cols_rows() else: try: toplevel.keypress(self.size, k) except Exception: self.show_internal_exc_dlg(sys.exc_info()) return self.quit_event_loop finally: self.quit_event_loop = prev_quit_loop # }}} # {{{ debugger-facing interface def interaction(self, exc_tuple: OptExcInfo | None, show_exc_dialog: bool = True): self.current_exc_tuple = exc_tuple from pudb import VERSION caption = [(None, f"PuDB {VERSION} - ?:help n:next s:step into b:breakpoint " "!:python command line")] if self.debugger.post_mortem: if show_exc_dialog and exc_tuple is not None: self.show_exception_dialog(exc_tuple) caption.extend([ (None, " "), ("header warning", "[POST-MORTEM MODE]") ]) elif exc_tuple is not None: caption.extend([ (None, " "), ("header warning", "[PROCESSING EXCEPTION - hit 'e' to examine]") ]) self.caption.set_text(caption) self.event_loop() def set_source_code_provider(self, source_code_provider: SourceCodeProvider, force_update: bool = False): if self.source_code_provider != source_code_provider or force_update: self.source[:] = source_code_provider.get_lines(self) self.source_code_provider = source_code_provider self.current_line = None def show_line(self, line, source_code_provider=None): """Updates the UI so that a certain line is currently in view.""" changed_file = False if source_code_provider is not None: changed_file = self.source_code_provider != source_code_provider self.set_source_code_provider(source_code_provider) line -= 1 if line >= 0 and line < len(self.source): self.source_list.focus_position = line if changed_file: self.source_list.set_focus_valign("middle") def set_current_line(self, line: int, source_code_provider: SourceCodeProvider): """Updates the UI to show the line currently being executed.""" if self.current_line is not None: self.current_line.set_current(False) self.show_line(line, source_code_provider) line -= 1 if line >= 0 and line < len(self.source): self.current_line = self.source[line] self.current_line.set_current(True) def update_var_view(self, locals=None, globals=None, focus_index=None): if locals is None: locals = self.debugger.curframe.f_locals if globals is None: globals = self.debugger.curframe.f_globals from pudb.var_view import make_var_view self.locals[:] = make_var_view( self.get_frame_var_info(read_only=True), locals, globals) if focus_index is not None: # Have to set the focus _after_ updating the locals list, as there # appears to be a brief moment while resetting the list when the # list is empty but urwid will attempt to set the focus anyway, # which causes problems. try: self.var_list._w.focus_position = focus_index except IndexError: # sigh oh well we tried pass def _get_bp_list(self): return [bp for fn, bp_lst in self.debugger.get_all_breaks().items() for lineno in bp_lst for bp in self.debugger.get_breaks(fn, lineno) if not bp.temporary] def _format_fname(self, fname): from os.path import basename, dirname name = basename(fname) if name == "__init__.py": name = "..."+dirname(fname)[-10:]+"/"+name return name def update_breakpoints(self): self.bp_walker[:] = [ BreakpointFrame(self.debugger.current_bp == (bp.file, bp.line), self._format_fname(bp.file), bp) for bp in self._get_bp_list()] def update_stack(self): def make_frame_ui(i, frame_lineno): frame, lineno = frame_lineno code = frame.f_code class_name = None if code.co_argcount and code.co_varnames[0] == "self": try: class_name = frame.f_locals["self"].__class__.__name__ except Exception: from pudb.lowlevel import ui_log message = "Failed to determine class name" ui_log.exception(message) class_name = f"!! {message} !!" return StackFrame(i == self.debugger.curindex, code.co_name, class_name, self._format_fname(code.co_filename), lineno) frame_uis = [make_frame_ui(i, fl) for i, fl in enumerate(self.debugger.stack)] if CONFIG["current_stack_frame"] == "top": frame_uis = frame_uis[::-1] elif CONFIG["current_stack_frame"] == "bottom": pass else: raise ValueError("invalid value for 'current_stack_frame' pref") self.stack_walker[:] = frame_uis def update_cmdline_win(self): self.set_cmdline_state(not CONFIG["hide_cmdline_win"]) # }}} @dataclass(frozen=True) class OnButtonEventLoopResultSetter: ui: DebuggerUI res: object def __call__(self, btn: urwid.Button): self.ui.quit_event_loop = self.res @dataclass(frozen=True) class ResultSettingEventHandler: ui: DebuggerUI res: object def __call__(self, w: urwid.Widget, size: UrwidSize, key: str): self.ui.quit_event_loop = self.res # vim: foldmethod=marker:expandtab:softtabstop=4 pudb-2025.1.5/pudb/forked.py000066400000000000000000000022561511510750400154620ustar00rootroot00000000000000from __future__ import annotations import os import sys from pudb.debugger import Debugger def set_trace(paused=True, frame=None, term_size=None): """Set a breakpoint in a forked process on Unix system, e.g. Linux & MacOS. In- and output will be redirected to /dev/stdin & /dev/stdout. You can call pudb.forked.set_trace() directly or use it with python's built-in breakpoint(): PYTHONBREAKPOINT=pudb.forked.set_trace python … """ if frame is None: frame = sys._getframe().f_back if term_size is None: term_size = os.environ.get("PUDB_TERM_SIZE") if term_size is not None: term_size = tuple(map(int, term_size.split("x"))) if len(term_size) != 2: raise ValueError("PUDB_TERM_SIZE should have two dimensions") else: try: # Getting terminal size s = os.get_terminal_size() term_size = (s.columns, s.lines) except Exception: term_size = (80, 24) Debugger( stdin=open("/dev/stdin"), stdout=open("/dev/stdout", "w"), term_size=term_size, ).set_trace(frame, paused=paused) pudb-2025.1.5/pudb/ipython.py000066400000000000000000000022501511510750400156740ustar00rootroot00000000000000from __future__ import annotations import os import sys from IPython import get_ipython from IPython.core.magic import register_line_magic def pudb(line): """ Debug a script (like %run -d) in the IPython process, using PuDB. Usage: %pudb test.py [args] Run script test.py under PuDB. """ # Get the running instance if not line.strip(): print(pudb.__doc__) return from IPython.utils.process import arg_split args = arg_split(line) path = os.path.abspath(args[0]) args = args[1:] if not os.path.isfile(path): from IPython.core.error import UsageError raise UsageError(f"%pudb: file {path} does not exist") from pudb import runscript runscript(path, args) register_line_magic(pudb) def debugger(self, force=False): """Call the PuDB debugger.""" from logging import error if not (force or self.call_pdb): return if not hasattr(sys, "last_traceback"): error("No traceback has been produced, nothing to debug.") return from pudb import pm with self.readline_no_record: pm() ip = get_ipython() ip.__class__.debugger = debugger pudb-2025.1.5/pudb/lowlevel.py000066400000000000000000000272401511510750400160410ustar00rootroot00000000000000from __future__ import annotations __copyright__ = """ Copyright (C) 2009-2017 Andreas Kloeckner Copyright (C) 2014-2017 Aaron Meurer Copyright (C) 2024 Gerhard Sittig """ __license__ = """ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ import logging import sys from datetime import datetime from enum import Enum, auto from typing import TYPE_CHECKING, TypeVar, cast from typing_extensions import override if TYPE_CHECKING: from collections.abc import Iterable, Iterator, Sequence from types import CodeType logfile: list[str | None] = [None] def getlogfile(): return logfile[0] def setlogfile(destfile: str): logfile[0] = destfile with open(destfile, "a") as openfile: openfile.write( f"\n*** Pudb session error log started at {datetime.now()} ***\n") # once we've dropped Py3.8 support, use this instead: # class TerminalOrStreamHandler(logging.StreamHandler[TextIOWrapper]): class TerminalOrStreamHandler(logging.StreamHandler): """ Logging handler that sends errors either to the terminal window or to stderr, depending on whether the debugger is active. """ @override def emit(self, record: logging.LogRecord): from pudb import _get_debugger, _have_debugger logfile = getlogfile() self.acquire() try: if logfile is not None: message = self.format(record) with open(logfile, "a") as openfile: openfile.write(f"\n{message}\n") elif _have_debugger(): dbg = _get_debugger() message = self.format(record) dbg.ui.add_cmdline_content(message, "command line error") else: super().emit(record) finally: self.release() def _init_loggers(): ui_handler = TerminalOrStreamHandler() ui_formatter = logging.Formatter( fmt="*** Pudb UI Exception Encountered: %(message)s ***\n" ) ui_handler.setFormatter(ui_formatter) ui_log = logging.getLogger("ui") ui_log.addHandler(ui_handler) settings_handler = TerminalOrStreamHandler() settings_formatter = logging.Formatter( fmt="*** Pudb Settings Exception Encountered: %(message)s ***\n" ) settings_handler.setFormatter(settings_formatter) settings_log = logging.getLogger("settings") settings_log.addHandler(settings_handler) return ui_log, settings_log ui_log, settings_log = _init_loggers() # {{{ breakpoint validity def generate_executable_lines_for_code(code: CodeType) -> Iterable[int]: if sys.version_info >= (3, 10): for _start, _end, lineno in code.co_lines(): if lineno is not None: yield lineno else: lineno = code.co_firstlineno yield lineno # See https://github.com/python/cpython/blob/master/Objects/lnotab_notes.txt for line_incr in code.co_lnotab[1::2]: # NB: This code is specific to Python 3.6 and higher # https://github.com/python/cpython/blob/v3.6.0/Objects/lnotab_notes.txt if line_incr >= 0x80: line_incr -= 0x100 lineno += line_incr yield lineno def get_executable_lines_for_codes_recursive(codes: Sequence[CodeType]): codes = list(codes) from types import CodeType execable_lines: set[int] = set() while codes: code = codes.pop() execable_lines |= set(generate_executable_lines_for_code(code)) codes.extend(const for const in code.co_consts # pyright: ignore[reportAny] if isinstance(const, CodeType)) return execable_lines def get_executable_lines_for_file(filename: str): # inspired by rpdb2 from linecache import getlines codes = [compile("".join(getlines(filename)), filename, "exec", dont_inherit=1)] return get_executable_lines_for_codes_recursive(codes) def get_breakpoint_invalid_reason(filename: str, lineno: int): # simple logic stolen from pdb import linecache line = linecache.getline(filename, lineno) if not line: return "Line is beyond end of file." try: executable_lines = get_executable_lines_for_file(filename) except SyntaxError: return "File failed to compile." if lineno not in executable_lines: return "No executable statement found in line." def lookup_module(filename: str): """Helper function for break/clear parsing -- may be overridden. lookupmodule() translates (possibly incomplete) file or module name into an absolute file name. """ # stolen from pdb import os import sys if os.path.isabs(filename) and os.path.exists(filename): return filename f = os.path.join(sys.path[0], filename) if os.path.exists(f): # and self.canonic(f) == self.mainpyfile: return f _root, ext = os.path.splitext(filename) if ext == "": filename = filename + ".py" if os.path.isabs(filename): return filename for dirname in sys.path: while os.path.islink(dirname): dirname = os.readlink(dirname) fullname = os.path.join(dirname, filename) if os.path.exists(fullname): return fullname return None # }}} # {{{ file encoding detection # the main idea stolen from Python 3.1's tokenize.py, by Ka-Ping Yee import re cookie_re = re.compile(br"^\s*#.*coding[:=]\s*([-\w.]+)") from codecs import BOM_UTF8, lookup StrOrBytesT = TypeVar("StrOrBytesT", str, bytes, "str | bytes") def detect_encoding( line_iter: Iterator[StrOrBytesT] ) -> tuple[str | None, Sequence[StrOrBytesT]]: """ The detect_encoding() function is used to detect the encoding that should be used to decode a Python source file. It requires one argument, line_iter, an iterator on the lines to be read. It will read a maximum of two lines, and return the encoding used (as a string) and a list of any lines (left as bytes) it has read in. It detects the encoding from the presence of a utf-8 bom or an encoding cookie as specified in pep-0263. If both a bom and a cookie are present, but disagree, a SyntaxError will be raised. If the encoding cookie is an invalid charset, raise a SyntaxError. If no encoding is specified, then the default of 'utf-8' will be returned. """ bom_found = False def read_or_stop(): try: return next(line_iter) except StopIteration: return "" def find_cookie(line: bytes): try: line_string = line except UnicodeDecodeError: return None matches = cookie_re.findall(line_string) if not matches: return None encoding = matches[0].decode() try: codec = lookup(encoding) except LookupError as err: # This behaviour mimics the Python interpreter raise SyntaxError("unknown encoding: " + encoding) from err if bom_found and codec.name != "utf-8": # This behaviour mimics the Python interpreter raise SyntaxError("encoding problem: utf-8") return encoding first = read_or_stop() if isinstance(first, str): return None, [first] if first.startswith(BOM_UTF8): bom_found = True first = first[3:] if not first: return "utf-8", [] encoding = find_cookie(first) if encoding: return encoding, [first] second = read_or_stop() if not second: return "utf-8", [first] encoding = find_cookie(cast("bytes", second)) if encoding: return encoding, [first, second] return "utf-8", [first, second] def decode_lines(lines: Iterable[bytes | str]) -> Iterable[str]: line_iter = iter(lines) source_enc, detection_read_lines = detect_encoding(line_iter) from itertools import chain for line in chain(detection_read_lines, line_iter): if hasattr(line, "decode") and source_enc is not None: yield line.decode(source_enc) else: yield cast("str", line) # }}} # {{{ get single key press from console outside of curses class KeyReadImpl(Enum): INPUT = auto() GETCH = auto() SELECT = auto() _keyread_impl = KeyReadImpl.INPUT if sys.platform in ("emscripten", "wasi"): pass elif sys.platform in ("win32",): _keyread_impl = KeyReadImpl.GETCH else: _keyread_impl = KeyReadImpl.SELECT class ConsoleSingleKeyReader: """ Get a single key press from a terminal without a prompt. Eliminates the necessity to press ENTER before other input also becomes available. Avoids the accumulation of prompts on the screen as was the case with Python's input() call. Is used in situations where urwid is disabled and curses calls are not available. Supports major desktop platforms with special cases (msvcrt getch(), termios and select). Transparently falls back to Python's input() method. Call sites remain simple and straight forward. """ def __enter__(self): if _keyread_impl == KeyReadImpl.SELECT: import termios import tty self.prev_settings = termios.tcgetattr(sys.stdin) tty.setcbreak(sys.stdin.fileno()) return self def __exit__(self, type, value, traceback): if _keyread_impl == KeyReadImpl.SELECT: import termios termios.tcsetattr(sys.stdin, termios.TCSADRAIN, self.prev_settings) def get_single_key(self): if _keyread_impl == KeyReadImpl.GETCH: import msvcrt # https://docs.python.org/3/library/msvcrt.html#msvcrt.getch # Most keys are returned in the first getch() call. Some # special keys (function keys, cursor, keypad) require # another call when the first returned '\0' or '\xe0'. c = msvcrt.getch() if c in ("\x00", "\xe0"): c = msvcrt.getch() return c elif _keyread_impl == KeyReadImpl.SELECT: import select rset, _, _ = select.select([sys.stdin], [], [], None) assert sys.stdin in rset return sys.stdin.read(1) # Strictly speaking putting the fallback here which requires # pressing ENTER is not correct, this is the "non buffered" # console support code. But it simplifies call sites. And is # easy to tell by users because a prompt is provided. This is # the most portable approach, and backwards compatible with # earlier PuDB releases. It's a most appropriate default for # otherwise unsupported platforms. Or when users choose to # not accept single key presses, or keys other than ENTER. else: input("Hit Enter to return:") return None # }}} # vim: foldmethod=marker pudb-2025.1.5/pudb/remote.py000066400000000000000000000265151511510750400155070ustar00rootroot00000000000000""" .. autoclass:: RemoteDebugger .. autofunction:: set_trace .. autofunction:: debugger .. autofunction:: debug_remote_on_single_rank .. autofunction:: post_mortem .. autofunction:: pm """ from __future__ import annotations __copyright__ = """ Copyright (C) 2009-2017 Andreas Kloeckner Copyright (C) 2014-2017 Aaron Meurer Copyright (C) 2020-2020 Son Geon """ __license__ = """ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ # mostly stolen from celery.contrib.rdb import atexit import errno import os import socket import sys from typing import ( TYPE_CHECKING, Callable, ClassVar, TextIO, TypeVar, ) from typing_extensions import ParamSpec from pudb.debugger import Debugger, OptExcInfo if TYPE_CHECKING: from types import FrameType, TracebackType from mpi4py import MPI P = ParamSpec("P") ResultT = TypeVar("ResultT") __all__ = [ "PUDB_RDB_HOST", "PUDB_RDB_PORT", "PUDB_RDB_REVERSE", "debug_remote_on_single_rank", "debugger", "default_port", "pm", "post_mortem", "set_trace", ] default_port = 6899 PUDB_RDB_HOST = os.environ.get("PUDB_RDB_HOST") or "127.0.0.1" PUDB_RDB_PORT = int(os.environ.get("PUDB_RDB_PORT") or default_port) PUDB_RDB_REVERSE = bool(os.environ.get("PUDB_RDB_REVERSE")) #: Holds the currently active debugger. _current = [None] _frame = sys._getframe NO_AVAILABLE_PORT = """\ {self.ident}: Couldn't find an available port. Please specify one using the PUDB_RDB_PORT environment variable. """ BANNER = """\ {self.ident}: Please start a telnet session using a command like: telnet {self.host} {self.port} {self.ident}: Waiting for client... """ SESSION_STARTED = "{self.ident}: Now in session with {self.remote_addr}." SESSION_ENDED = "{self.ident}: Session with {self.remote_addr} ended." CONN_REFUSED = """\ Cannot connect to the reverse telnet client {self.host} {self.port}. Try to open reverse client by running stty -echo -icanon && nc -l -p 6899 # Linux stty -echo -icanon && nc -l 6899 # BSD/MacOS Please specify one using the PUDB_RDB_PORT environment variable. """ class TelnetCharacters: """Collection of characters from the telnet protocol RFC 854 This format for the telnet characters was adapted from the telnetlib module which was removed from the C Python standard library in version 3.13. Only the characters needed by pudb have been copied here. Additional characters can be found by looking in the telnetlib code in Python 3.12 or in the telnet RFC. .. note:: This class is not intended to be instantiated. """ # Telnet protocol characters IAC: ClassVar[bytes] = b"\xff" # "Interpret As Command" DO: ClassVar[bytes] = b"\xfd" WILL: ClassVar[bytes] = b"\xfb" # Telnet protocol options codes # These ones all come from arpa/telnet.h ECHO: ClassVar[bytes] = b"\x01" # echo SGA: ClassVar[bytes] = b"\x03" # suppress go ahead class RemoteDebugger(Debugger): """ .. automethod:: __init__ """ me: ClassVar[str] = "pudb" _sock: socket.socket | None = None _client: socket.socket _prev_handles: tuple[TextIO, TextIO] out: TextIO _handle: TextIO remote_addr: str host: str # pyright: ignore[reportUninitializedInstanceVariable] port: int # pyright: ignore[reportUninitializedInstanceVariable] def __init__( self, host: str = PUDB_RDB_HOST, port: int = PUDB_RDB_PORT, port_search_limit: int = 100, out: TextIO = sys.stdout, term_size: tuple[int, int] | None = None, reverse: bool = PUDB_RDB_REVERSE, ): """ :arg term_size: A two-tuple ``(columns, rows)``, or *None*. If *None*, try to determine the terminal size automatically. Currently, this uses a heuristic: It uses the terminal size of the debuggee as that for the debugger. The idea is that you might be running both in two tabs of the same terminal window, hence using terminals of the same size. """ self.out = out if term_size is None: term_size_str = os.environ.get("PUDB_TERM_SIZE") if term_size_str is not None: term_size_tup = tuple(map(int, term_size_str.split("x"))) if len(term_size_tup) != 2: raise ValueError("PUDB_TERM_SIZE should have two dimensions") term_size = term_size_tup else: try: s = os.get_terminal_size() term_size = (s.columns, s.lines) except Exception: term_size = (80, 24) self._prev_handles = sys.stdin, sys.stdout self._client, (address, port) = self.get_client( host=host, port=port, search_limit=port_search_limit, reverse=reverse ) self.remote_addr = ":".join(str(v) for v in address) self.say(SESSION_STARTED.format(self=self)) # makefile ignores encoding if there's no buffering. raw_sock_file = self._client.makefile("rwb", 0) import codecs sock_file = codecs.StreamReaderWriter( raw_sock_file, codecs.getreader("utf-8"), codecs.getwriter("utf-8")) self._handle = sys.stdin = sys.stdout = sock_file # nc negotiation doesn't support telnet options if not reverse: tn = TelnetCharacters raw_sock_file.write(tn.IAC + tn.WILL + tn.SGA) resp = raw_sock_file.read(3) assert resp == tn.IAC + tn.DO + tn.SGA raw_sock_file.write(tn.IAC + tn.WILL + tn.ECHO) resp = raw_sock_file.read(3) assert resp == tn.IAC + tn.DO + tn.ECHO Debugger.__init__( self, stdin=self._handle, stdout=self._handle, term_size=term_size ) def get_client(self, host: str, port: int, search_limit: int = 100, reverse: bool = False ) -> tuple[socket.socket, tuple[str, int]]: if reverse: self.host, self.port = host, port client, address = self.get_reverse_socket_client(host, port) self.ident = f"{self.me}:{self.port}" else: self._sock, conn_info = self.get_socket_client( host, port, search_limit=search_limit, ) self.host, self.port = conn_info self.ident = f"{self.me}:{self.port}" self.say(BANNER.format(self=self)) client, address = self._sock.accept() client.setblocking(True) return client, (address, self.port) def get_reverse_socket_client(self, host: str, port: int): sock = socket.socket() try: sock.connect((host, port)) sock.setblocking(True) except OSError as exc: if exc.errno == errno.ECONNREFUSED: raise ValueError(CONN_REFUSED.format(self=self)) from exc raise exc return sock, sock.getpeername() def get_socket_client(self, host: str, port: int, search_limit: int): sock, this_port = self.get_avail_port(host, port, search_limit) sock.setblocking(True) sock.listen(1) return sock, (host, this_port) def get_avail_port(self, host: str, port: int, search_limit: int = 100): this_port = None for i in range(search_limit): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) this_port = port + i try: sock.bind((host, this_port)) except OSError as exc: if exc.errno in [errno.EADDRINUSE, errno.EINVAL]: continue raise else: return sock, this_port else: raise Exception(NO_AVAILABLE_PORT.format(self=self)) def say(self, m: str): print(m, file=self.out) def close_remote_session(self): sys.stdin, sys.stdout = self._prev_handles self._handle.close() self._client.close() if self._sock: self._sock.close() self.say(SESSION_ENDED.format(self=self)) def debugger( term_size: tuple[int, int] | None = None, host=PUDB_RDB_HOST, port=PUDB_RDB_PORT, reverse=PUDB_RDB_REVERSE ): """Return the current debugger instance (if any), or creates a new one.""" rdb = _current[0] if rdb is None: rdb = _current[0] = RemoteDebugger( host=host, port=port, term_size=term_size, reverse=reverse ) atexit.register(lambda e: e.close_remote_session(), rdb) return rdb def set_trace( frame: FrameType | None = None, term_size: tuple[int, int] | None = None, host: str = PUDB_RDB_HOST, port: int = PUDB_RDB_PORT, reverse: bool = PUDB_RDB_REVERSE ): """Set breakpoint at current location, or a specified frame""" if frame is None: frame = _frame().f_back return debugger( term_size=term_size, host=host, port=port, reverse=reverse ).set_trace(frame) def post_mortem( exc_tuple: OptExcInfo | TracebackType | None = None, term_size: tuple[int, int] | None = None, host: str = PUDB_RDB_HOST, port: int = PUDB_RDB_PORT, reverse: bool = PUDB_RDB_REVERSE ): """Start a debugger on a given traceback object.""" dbg = debugger(term_size=term_size, host=host, port=port, reverse=reverse) dbg.reset() dbg.interaction(None, exc_tuple or sys.exc_info()) pm = post_mortem def debug_remote_on_single_rank( comm: MPI.Intracomm, rank: int, func: Callable[P, ResultT], *args: P.args, **kwargs: P.kwargs) -> None: """Run a remote debugger on a single rank of an ``mpi4py`` application. *func* will be called on rank *rank* running in a :class:`RemoteDebugger`, and will be called normally on all other ranks. :param comm: an ``mpi4py`` ``Comm`` object. :param rank: the rank to debug. All other ranks will spin until this rank exits. :param func: the callable to debug. :param args: the arguments passed to ``func``. :param kwargs: the kwargs passed to ``func``. """ if comm.rank == rank: debugger().runcall(func, *args, **kwargs) else: try: func(*args, **kwargs) finally: from time import sleep while True: sleep(1) pudb-2025.1.5/pudb/run.py000066400000000000000000000063761511510750400150230ustar00rootroot00000000000000from __future__ import annotations COMMAND = {"zsh": "{_command_names -e}"} PREAMBLE = { "zsh": """\ _script_args() { # pudb -m if (($words[(I)-m] == $#words - 1)); then _python_modules # pudb -m XXX elif (($words[(I)-m])); then _files # pudb else _arguments -S -s '(-)1:script_args:_files -g "*.py"' '*: :_files' fi } """, } SCRIPT_ARGS = {"zsh": "_script_args"} def get_argparse_parser(): import argparse import os import sys try: import shtab except ImportError: from . import _shtab as shtab from pudb import VERSION version_info = "%(prog)s v" + VERSION if sys.argv[1:] == ["-v"]: print(version_info % {"prog": "pudb"}) sys.exit(os.EX_OK) parser = argparse.ArgumentParser( "pudb", usage="%(prog)s [options] [-m] SCRIPT-OR-MODULE-TO-RUN [SCRIPT_ARGS]", epilog=version_info ) shtab.add_argument_to(parser, preamble=PREAMBLE) # dest="_continue_at_start" needed as "continue" is a python keyword parser.add_argument( "-c", "--continue", action="store_true", dest="_continue_at_start", help="Let the script run until an exception occurs or a breakpoint is hit", ) parser.add_argument("-s", "--steal-output", action="store_true") # note: we're implementing -m as a boolean flag, mimicking pdb's behavior, # and makes it possible without much fuss to support cases like: # python -m pudb -m http.server -h # where the -h will be passed to the http.server module parser.add_argument("-m", "--module", action="store_true", help="Debug as module or package instead of as a script") parser.add_argument("-le", "--log-errors", nargs=1, metavar="FILE", help="Log internal errors to the given file" ).complete = shtab.FILE parser.add_argument("--pre-run", metavar="COMMAND", help="Run command before each program run", default="").complete = COMMAND parser.add_argument("--version", action="version", version=version_info) parser.add_argument("script_args", nargs=argparse.REMAINDER, help="Arguments to pass to script or module" ).complete = SCRIPT_ARGS return parser def main(**kwargs): import sys parser = get_argparse_parser() options = parser.parse_args() args = options.script_args if options.log_errors: from pudb.lowlevel import setlogfile setlogfile(options.log_errors[0]) options_kwargs = { "pre_run": options.pre_run, "steal_output": options.steal_output, "_continue_at_start": options._continue_at_start, } if len(args) < 1: parser.print_help() sys.exit(2) mainpyfile = args[0] sys.argv = args if options.module: from pudb import runmodule runmodule(mainpyfile, **options_kwargs) else: from os.path import exists if not exists(mainpyfile): print(f"Error: {mainpyfile} does not exist", file=sys.stderr) sys.exit(1) from pudb import runscript runscript(mainpyfile, **options_kwargs) if __name__ == "__main__": main() pudb-2025.1.5/pudb/settings.py000066400000000000000000000565251511510750400160600ustar00rootroot00000000000000from __future__ import annotations __copyright__ = """ Copyright (C) 2009-2017 Andreas Kloeckner Copyright (C) 2014-2017 Aaron Meurer """ __license__ = """ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ import os import sys from configparser import ConfigParser from functools import partial from typing import TYPE_CHECKING, Literal, TypedDict, cast from pudb.lowlevel import get_breakpoint_invalid_reason, lookup_module, settings_log if TYPE_CHECKING: from bdb import Breakpoint from collections.abc import Sequence from urwid import CheckBox from pudb.debugger import DebuggerUI from pudb.var_view import Stringifier, VarAccessLevel class ConfDict(TypedDict): shell: str theme: str line_numbers: bool seen_welcome: str sidebar_width: float variables_weight: float stack_weight: float breakpoints_weight: float current_stack_frame: Literal["top", "bottom"] stringifier: Stringifier custom_theme: str custom_stringifier: str custom_shell: str wrap_variables: bool default_variables_access_level: VarAccessLevel display: str prompt_on_quit: bool hide_cmdline_win: bool cmdline_height: float hotkeys_code: str hotkeys_variables: str hotkeys_stack: str hotkeys_breakpoints: str hotkeys_toggle_cmdline_focus: str # see https://github.com/inducer/pudb/pull/453 for context _home = os.environ.get("HOME", os.path.expanduser("~")) XDG_CONF_RESOURCE = "pudb" XDG_CONFIG_HOME = os.environ.get( "XDG_CONFIG_HOME", os.path.join(_home, ".config") if _home else None) if XDG_CONFIG_HOME: XDG_CONFIG_DIRS = [XDG_CONFIG_HOME] else: XDG_CONFIG_DIRS = os.environ.get("XDG_CONFIG_DIRS", "/etc/xdg").split(":") def get_save_config_path(): # This may not raise, as it is called during import. if not XDG_CONFIG_HOME: return None path = os.path.join(XDG_CONFIG_HOME, XDG_CONF_RESOURCE) try: os.makedirs(path, mode=0o700, exist_ok=True) except Exception: settings_log.exception("Failed to make config dir") return path CONF_SECTION = "pudb" CONF_FILE_NAME = "pudb.cfg" SAVED_BREAKPOINTS_FILE_NAME = "saved-breakpoints-%d.%d" % sys.version_info[:2] BREAKPOINTS_FILE_NAME = "breakpoints-%d.%d" % sys.version_info[:2] _config_: list[ConfDict | None] = [None] def load_config(): # This may not raise, as it is called during import. # Only ever do this once if _config_[0] is not None: return _config_[0] from os.path import isdir, join cparser = ConfigParser() conf_dict: ConfDict = {} # pyright: ignore[reportAssignmentType] try: cparser.read([ join(cdir, XDG_CONF_RESOURCE, CONF_FILE_NAME) for cdir in XDG_CONFIG_DIRS if isdir(cdir)]) if cparser.has_section(CONF_SECTION): conf_dict.update(cast("ConfDict", cast("object", dict(cparser.items(CONF_SECTION))))) except Exception: settings_log.exception("Failed to load config") conf_dict.setdefault("shell", "internal") conf_dict.setdefault("theme", "classic") conf_dict.setdefault("line_numbers", False) conf_dict.setdefault("seen_welcome", "a") conf_dict.setdefault("sidebar_width", 0.5) conf_dict.setdefault("variables_weight", 1) conf_dict.setdefault("stack_weight", 1) conf_dict.setdefault("breakpoints_weight", 1) conf_dict.setdefault("current_stack_frame", "top") conf_dict.setdefault("stringifier", "default") conf_dict.setdefault("custom_theme", "") conf_dict.setdefault("custom_stringifier", "") conf_dict.setdefault("custom_shell", "") conf_dict.setdefault("wrap_variables", True) conf_dict.setdefault("default_variables_access_level", "public") conf_dict.setdefault("display", "auto") conf_dict.setdefault("prompt_on_quit", True) conf_dict.setdefault("hide_cmdline_win", False) # hotkeys conf_dict.setdefault("hotkeys_code", "C") conf_dict.setdefault("hotkeys_variables", "V") conf_dict.setdefault("hotkeys_stack", "S") conf_dict.setdefault("hotkeys_breakpoints", "B") conf_dict.setdefault("hotkeys_toggle_cmdline_focus", "ctrl x") def normalize_bool_inplace(name: str): try: if conf_dict[name].lower() in ["0", "false", "off"]: # pyright: ignore[reportUnknownMemberType] conf_dict[name] = False else: conf_dict[name] = True except Exception: settings_log.exception("Failed to process config") normalize_bool_inplace("line_numbers") normalize_bool_inplace("wrap_variables") normalize_bool_inplace("prompt_on_quit") normalize_bool_inplace("hide_cmdline_win") _config_[0] = conf_dict return conf_dict def save_config(conf_dict: ConfDict): # This may not raise, as it is called during import. from os.path import join cparser = ConfigParser() cparser.add_section(CONF_SECTION) for key in sorted(conf_dict): cparser.set(CONF_SECTION, key, str(conf_dict[key])) try: save_path = get_save_config_path() if not save_path: return outf = open(join(save_path, CONF_FILE_NAME), "w") cparser.write(outf) outf.close() except Exception: settings_log.exception("Failed to save config") def edit_config(ui: DebuggerUI, conf_dict: ConfDict): import urwid old_conf_dict = conf_dict.copy() def _update_theme(): ui.setup_palette(ui.screen) ui.screen.clear() def _update_line_numbers(): for sl in ui.source: sl._invalidate() # pyright: ignore[reportPrivateUsage] def _update_prompt_on_quit(): pass def _update_hide_cmdline_win(): ui.update_cmdline_win() def _update_current_stack_frame(): ui.update_stack() def _update_stringifier(): import pudb.var_view pudb.var_view.custom_stringifier_dict = {} ui.update_var_view() def _update_default_variables_access_level(): ui.update_var_view() def _update_wrap_variables(): ui.update_var_view() def _update_config( check_box: CheckBox, new_state: bool, option_newvalue: tuple[str, str | None] ): option, newvalue = option_newvalue new_conf_dict: ConfDict = cast("ConfDict", cast("object", {option: newvalue})) if option == "theme": # only activate if the new state of the radio button is 'on' if new_state: if newvalue is None: # Select the custom theme entry dialog lb.set_focus(lb_contents.index(theme_edit_list_item)) return conf_dict.update({"theme": newvalue}) _update_theme() elif option == "line_numbers": new_conf_dict["line_numbers"] = not check_box.get_state() conf_dict.update(new_conf_dict) _update_line_numbers() elif option == "prompt_on_quit": new_conf_dict["prompt_on_quit"] = not check_box.get_state() conf_dict.update(new_conf_dict) _update_prompt_on_quit() elif option == "hide_cmdline_win": new_conf_dict["hide_cmdline_win"] = not check_box.get_state() conf_dict.update(new_conf_dict) _update_hide_cmdline_win() elif option == "current_stack_frame": # only activate if the new state of the radio button is 'on' if new_state: conf_dict.update(new_conf_dict) _update_current_stack_frame() elif option == "stringifier": # only activate if the new state of the radio button is 'on' if new_state: if newvalue is None: lb.set_focus(lb_contents.index(stringifier_edit_list_item)) return conf_dict["stringifier"] = cast("Stringifier", newvalue) _update_stringifier() elif option == "default_variables_access_level": # only activate if the new state of the radio button is 'on' if new_state: conf_dict.update( default_variables_access_level=cast("VarAccessLevel", newvalue)) _update_default_variables_access_level() elif option == "wrap_variables": new_conf_dict["wrap_variables"] = not check_box.get_state() conf_dict.update(new_conf_dict) _update_wrap_variables() heading = urwid.Text("This is the preferences screen for PuDB. " "Hit Ctrl-P at any time to get back to it.\n\n" "Configuration settings are saved in " "$HOME/.config/pudb or $XDG_CONFIG_HOME/pudb " "environment variable. If both variables are not set " "configurations settings will not be saved.\n") cb_line_numbers = urwid.CheckBox("Show Line Numbers", bool(conf_dict["line_numbers"]), on_state_change=partial( _update_config, option_newvalue=("line_numbers", None))) cb_prompt_on_quit = urwid.CheckBox("Prompt before quitting", bool(conf_dict["prompt_on_quit"]), on_state_change=partial( _update_config, option_newvalue=("prompt_on_quit", None))) hide_cmdline_win = urwid.CheckBox("Hide command line" f"({conf_dict['hotkeys_toggle_cmdline_focus']}) window " "when not in use", bool(conf_dict["hide_cmdline_win"]), on_state_change=partial( _update_config, option_newvalue=("hide_cmdline_win", None))) # {{{ shells shell_info = urwid.Text("This is the shell that will be " "used when you hit '!'.\n") shells = ["internal", "classic", "ipython", "ipython_kernel", "bpython", "ptpython", "ptipython"] known_shell = conf_dict["shell"] in shells shell_edit = urwid.Edit(edit_text=conf_dict["custom_shell"]) shell_edit_list_item = urwid.AttrMap(shell_edit, "input", "focused input") shell_rb_group = [] shell_rbs = [ urwid.RadioButton(shell_rb_group, name, conf_dict["shell"] == name) for name in shells]+[ urwid.RadioButton(shell_rb_group, "Custom:", not known_shell, on_state_change=partial( _update_config, option_newvalue=("shell", None))), shell_edit_list_item, urwid.Text("\nTo use a custom shell, see examples/shell.py " "in the pudb distribution. Enter the full path to a " "file like it in the box above. '~' will be expanded " "to your home directory. The file should contain a " "function called pudb_shell(_globals, _locals) " "at the module level. See the PuDB documentation for " "more information."), ] # }}} # {{{ themes from pudb.themes import THEMES known_theme = conf_dict["theme"] in THEMES theme_rb_group = [] theme_edit = urwid.Edit(edit_text=conf_dict["custom_theme"]) theme_edit_list_item = urwid.AttrMap(theme_edit, "input", "focused input") theme_rbs = [ urwid.RadioButton(theme_rb_group, name, conf_dict["theme"] == name, on_state_change=partial( _update_config, option_newvalue=("theme", name))) for name in THEMES]+[ urwid.RadioButton(theme_rb_group, "Custom:", not known_theme, on_state_change=partial( _update_config, option_newvalue=("theme", None))), theme_edit_list_item, urwid.Text("\nTo use a custom theme, see examples/theme.py in the " "pudb distribution. Enter the full path to a file like it in " "the box above. '~' will be expanded to your home directory. " "Note that a custom theme will not be applied until you close " "this dialog."), ] # }}} # {{{ stack stack_rb_group = [] stack_opts = ["top", "bottom"] stack_info = urwid.Text("Show the current stack frame at the\n") stack_rbs = [ urwid.RadioButton(stack_rb_group, name, conf_dict["current_stack_frame"] == name, on_state_change=partial( _update_config, option_newvalue=("current_stack_frame", name))) for name in stack_opts ] # }}} # {{{ stringifier from pudb.var_view import STRINGIFIERS stringifier_opts = list(STRINGIFIERS.keys()) known_stringifier = conf_dict["stringifier"] in stringifier_opts stringifier_rb_group = [] stringifier_edit = urwid.Edit(edit_text=conf_dict["custom_stringifier"]) stringifier_info = urwid.Text( "This is the default function that will be called on variables in the " "variables list. You can also change this on a per-variable basis by " "selecting a variable and typing 'e' to edit the variable's display " "settings, or by typing one of d/t/r/s/i/c. Note that str and repr will " "be slower than the default, type, or id stringifiers.\n") stringifier_edit_list_item = urwid.AttrMap(stringifier_edit, "input", "focused input") stringifier_rbs = [ urwid.RadioButton(stringifier_rb_group, name, conf_dict["stringifier"] == name, on_state_change=partial( _update_config, option_newvalue=("stringifier", name))) for name in stringifier_opts ]+[ urwid.RadioButton(stringifier_rb_group, "Custom:", not known_stringifier, on_state_change=partial( _update_config, option_newvalue=("stringifier", None))), stringifier_edit_list_item, urwid.Text("\nTo use a custom stringifier, see " "examples/stringifier.py in the pudb distribution. Enter the " "full path to a file like it in the box above. " "'~' will be expanded to your home directory. " "The file should contain a function called pudb_stringifier() " "at the module level, which should take a single argument and " "return the desired string form of the object passed to it. " "Note that if you choose a custom stringifier, the variables " "view will not be updated until you close this dialog."), ] # }}} # {{{ variables access level default_variables_access_level_opts = ["public", "private", "all"] default_variables_access_level_rb_group = [] default_variables_access_level_info = urwid.Text( "Set the default attribute visibility " "of variables in the variables list.\n" "\nNote that you can change this option on " "a per-variable basis by selecting the " "variable and pressing '*'.") default_variables_access_level_rbs = [ urwid.RadioButton(default_variables_access_level_rb_group, name, conf_dict["default_variables_access_level"] == name, on_state_change=partial( _update_config, option_newvalue=("default_variables_access_level", name))) for name in default_variables_access_level_opts ] # }}} # {{{ wrap variables cb_wrap_variables = urwid.CheckBox("Wrap variables", bool(conf_dict["wrap_variables"]), on_state_change=partial( _update_config, option_newvalue=("wrap_variables", None))) wrap_variables_info = urwid.Text("\nNote that you can change this option on " "a per-variable basis by selecting the " "variable and pressing 'w'.") # }}} # {{{ display display_info = urwid.Text("What driver is used to talk to your terminal. " "'raw' has the most features (colors and highlighting), " "but is only correct for " "XTerm and terminals like it. 'curses' " "has fewer " "features, but it will work with just about any terminal. 'auto' " "will attempt to pick between the two based on availability and " "the $TERM environment variable.\n\n" "Changing this setting requires a restart of PuDB.") displays = ["auto", "raw", "curses"] display_rb_group = [] display_rbs = [ urwid.RadioButton(display_rb_group, name, conf_dict["display"] == name) for name in displays] # }}} lb_contents = ( [heading, urwid.AttrMap( urwid.Text("General:\n"), "group head"), cb_line_numbers, cb_prompt_on_quit, hide_cmdline_win, urwid.AttrMap( urwid.Text("\nShell:\n"), "group head"), shell_info, *shell_rbs, urwid.AttrMap( urwid.Text("\nTheme:\n"), "group head"), *theme_rbs, urwid.AttrMap( urwid.Text("\nStack Order:\n"), "group head"), stack_info, *stack_rbs, urwid.AttrMap( urwid.Text("\nVariable Stringifier:\n"), "group head"), stringifier_info, *stringifier_rbs, urwid.AttrMap( urwid.Text("\nVariables Attribute Visibility:\n"), "group head"), default_variables_access_level_info, *default_variables_access_level_rbs, urwid.AttrMap( urwid.Text("\nWrap Variables:\n"), "group head"), cb_wrap_variables, wrap_variables_info, urwid.AttrMap( urwid.Text("\nDisplay driver:\n"), "group head"), display_info, *display_rbs] ) lb = urwid.ListBox(urwid.SimpleListWalker(lb_contents)) if ui.dialog(lb, [ ("OK", True), ("Cancel", False), ], title="Edit Preferences"): # Only update the settings here that instant-apply (above) doesn't take # care of. # if we had a custom theme, it wasn't updated live if theme_rb_group[-1].state: newvalue = theme_edit.get_edit_text() conf_dict.update(theme=newvalue, custom_theme=newvalue) _update_theme() # Ditto for custom stringifiers if stringifier_rb_group[-1].state: newvalue = stringifier_edit.get_edit_text() conf_dict.update( stringifier=cast("Stringifier", newvalue), custom_stringifier=newvalue) _update_stringifier() if shell_rb_group[-1].state: newvalue = shell_edit.get_edit_text() conf_dict.update(shell=newvalue, custom_shell=newvalue) else: for shell, shell_rb in zip(shells, shell_rbs): if shell_rb.get_state(): conf_dict["shell"] = shell for display, display_rb in zip(displays, display_rbs): if display_rb.get_state(): conf_dict["display"] = display else: # The user chose cancel, revert changes conf_dict.update(old_conf_dict) _update_theme() # _update_line_numbers() is equivalent to _update_theme() _update_current_stack_frame() _update_stringifier() # {{{ breakpoint saving def parse_breakpoints(lines): # b [ (filename:lineno | function) [, "condition"] ] breakpoints = [] for arg in lines: if not arg: continue arg = arg[1:] filename = None lineno = None cond = None comma = arg.find(",") if comma > 0: # parse stuff after comma: "condition" cond = arg[comma+1:].lstrip() arg = arg[:comma].rstrip() colon = arg.rfind(":") funcname = None if colon > 0: filename = arg[:colon].strip() f = lookup_module(filename) if not f: continue else: filename = f arg = arg[colon+1:].lstrip() try: lineno = int(arg) except ValueError: continue else: continue if get_breakpoint_invalid_reason(filename, lineno) is None: breakpoints.append((filename, lineno, False, cond, funcname)) return breakpoints def get_breakpoints_file_name(): from os.path import join save_path = get_save_config_path() if not save_path: return None else: return join(save_path, SAVED_BREAKPOINTS_FILE_NAME) def load_breakpoints(): """ Loads and check saved breakpoints out from files Returns: list of tuples """ from os.path import isdir, join file_names = [] for cdir in XDG_CONFIG_DIRS: if isdir(cdir): for name in [SAVED_BREAKPOINTS_FILE_NAME, BREAKPOINTS_FILE_NAME]: file_names.append(join(cdir, XDG_CONF_RESOURCE, name)) lines = [] for fname in file_names: try: rc_file = open(fname) except OSError: pass else: lines.extend([line.strip() for line in rc_file.readlines()]) rc_file.close() return parse_breakpoints(lines) def save_breakpoints(bp_list: Sequence[Breakpoint]): """ :arg bp_list: a list of `bdb.Breakpoint` objects """ save_path = get_breakpoints_file_name() if not save_path: return histfile = open(get_breakpoints_file_name(), "w") bps = {(bp.file, bp.line, bp.cond) for bp in bp_list} for bp in bps: line = "b %s:%d" % (bp[0], bp[1]) if bp[2]: line += f", {bp[2]}" line += "\n" histfile.write(line) histfile.close() # }}} # vim:foldmethod=marker pudb-2025.1.5/pudb/shell.py000066400000000000000000000203541511510750400153160ustar00rootroot00000000000000from __future__ import annotations try: import bpython # Access a property to verify module exists in case # there's a demand loader wrapping module imports # See https://github.com/inducer/pudb/issues/177 bpython.__version__ # noqa: B018 except ImportError: HAVE_BPYTHON = False else: HAVE_BPYTHON = True try: from ptpython.ipython import embed as ptipython_embed except ImportError: HAVE_PTIPYTHON = False else: HAVE_PTIPYTHON = True try: from ptpython.repl import embed as ptpython_embed, run_config except ImportError: HAVE_PTPYTHON = False else: HAVE_PTPYTHON = True # {{{ combined locals/globals dict class SetPropagatingDict(dict): """ Combine dict into one, with assignments affecting a target dict The source dicts are combined so that early dicts in the list have higher precedence. Typical usage is ``SetPropagatingDict([locals, globals], locals)``. This is used for functions like ``rlcompleter.Completer`` and ``code.InteractiveConsole``, which only take a single dictionary. This way, changes made to it are propagated to locals. Note that assigning to locals only actually works at the module level, when ``locals()`` is the same as ``globals()``, so propagation doesn't happen at all if the debugger is inside a function frame. """ def __init__(self, source_dicts, target_dict): dict.__init__(self) for s in source_dicts[::-1]: self.update(s) self.target_dict = target_dict def __setitem__(self, key, value): dict.__setitem__(self, key, value) self.target_dict[key] = value def __delitem__(self, key): dict.__delitem__(self, key) del self.target_dict[key] # }}} custom_shell_dict = {} SHELL_FIRST_TIME = [True] def run_classic_shell(globals, locals, message=""): if SHELL_FIRST_TIME: banner = "Hit Ctrl-D to return to PuDB." SHELL_FIRST_TIME.pop() else: banner = "" if message: banner = f"{message}\n{banner}" ns = SetPropagatingDict([locals, globals], locals) from os.path import join from pudb.settings import get_save_config_path hist_file = join( get_save_config_path(), "shell-history") try: import readline import rlcompleter have_readline = True except ImportError: have_readline = False if have_readline: readline.set_completer( rlcompleter.Completer(ns).complete) readline.parse_and_bind("tab: complete") readline.clear_history() try: readline.read_history_file(hist_file) except OSError: pass from code import InteractiveConsole cons = InteractiveConsole(ns) cons.interact(banner) if have_readline: readline.write_history_file(hist_file) def run_bpython_shell(globals, locals): ns = SetPropagatingDict([locals, globals], locals) import bpython bpython.embed(args=[], locals_=ns) # {{{ ipython def have_ipython(): # IPython has started being obnoxious on import, only import # if absolutely needed. # https://github.com/ipython/ipython/issues/9435 try: import IPython # Access a property to verify module exists in case # there's a demand loader wrapping module imports # See https://github.com/inducer/pudb/issues/177 IPython.core # noqa: B018 except (ImportError, ValueError): # Old IPythons versions (0.12?) may fail to import with # ValueError: fallback required, but not specified # https://github.com/inducer/pudb/pull/135 return False else: return True def ipython_version(): if have_ipython(): from IPython import version_info return version_info else: return None def run_ipython_shell_v10(globals, locals): """IPython shell from IPython version 0.10""" if SHELL_FIRST_TIME: banner = "Hit Ctrl-D to return to PuDB." SHELL_FIRST_TIME.pop() else: banner = "" # avoid IPython's namespace litter ns = locals.copy() from IPython.Shell import IPShell IPShell(argv=[], user_ns=ns, user_global_ns=globals) \ .mainloop(banner=banner) def _update_ipython_ns(shell, globals, locals): """Update the IPython 0.11 namespace at every visit""" shell.user_ns = locals.copy() try: shell.user_global_ns = globals except AttributeError: class DummyMod: """A dummy module used for IPython's interactive namespace.""" pass user_module = DummyMod() user_module.__dict__ = globals shell.user_module = user_module shell.init_history() shell.init_user_ns() shell.init_completer() def run_ipython_shell_v11(globals, locals): """IPython shell from IPython version 0.11""" if SHELL_FIRST_TIME: banner = "Hit Ctrl-D to return to PuDB." SHELL_FIRST_TIME.pop() else: banner = "" try: # IPython 1.0 got rid of the frontend intermediary, and complains with # a deprecated warning when you use it. from IPython.terminal.interactiveshell import TerminalInteractiveShell from IPython.terminal.ipapp import load_default_config except ImportError: from IPython.frontend.terminal.interactiveshell import TerminalInteractiveShell from IPython.frontend.terminal.ipapp import load_default_config # XXX: in the future it could be useful to load a 'pudb' config for the # user (if it exists) that could contain the user's macros and other # niceities. config = load_default_config() shell = TerminalInteractiveShell.instance(config=config, banner2=banner) # XXX This avoids a warning about not having unique session/line numbers. # See the HistoryManager.writeout_cache method in IPython.core.history. shell.history_manager.new_session() # Save the originating namespace old_locals = shell.user_ns old_globals = shell.user_global_ns # Update shell with current namespace _update_ipython_ns(shell, globals, locals) args = [] if ipython_version() < (5, 0, 0): args.append(banner) else: print(banner) # XXX Quick and dirty way to fix issues with IPython 8.0.0+, introduced # by commit 08d54c0e367b535fd88aca5273fd09e5e70d08f8. # Setting _atexit_once_called = True will prevent call to # IPython.core.interactiveshell.InteractiveShell._atexit_once() from inside # IPython.terminal.interactiveshell.TerminalInteractiveShell.mainloop() # This allows us to repeatedly re-call mainloop() and the whole # run_ipython_shell_v11() function shell._atexit_once_called = True shell.mainloop(*args) del shell._atexit_once_called # Restore originating namespace _update_ipython_ns(shell, old_globals, old_locals) def run_ipython_shell(globals, locals): import IPython if have_ipython() and hasattr(IPython, "Shell"): return run_ipython_shell_v10(globals, locals) else: return run_ipython_shell_v11(globals, locals) def run_ipython_kernel(globals, locals): from IPython import embed_kernel class DummyMod: pass user_module = DummyMod() user_module.__dict__ = globals embed_kernel(module=user_module, local_ns=locals) # }}} def get_ptpython_history_file(): from argparse import ArgumentParser from ptpython.entry_points.run_ptpython import ( get_config_and_history_file, ) parser = ArgumentParser() parser.add_argument("--history_file") parser.add_argument("--config_file") return get_config_and_history_file(parser.parse_args([]))[1] def run_ptpython_shell(globals, locals): # Use the default ptpython history history_filename = get_ptpython_history_file() ptpython_embed(globals=globals.copy(), locals=locals.copy(), history_filename=history_filename, configure=run_config) def run_ptipython_shell(globals, locals): # Use the default ptpython history history_filename = get_ptpython_history_file() ptipython_embed(globals=globals.copy(), locals=locals.copy(), history_filename=history_filename, configure=run_config) # vim: foldmethod=marker pudb-2025.1.5/pudb/source_view.py000066400000000000000000000317021511510750400165400ustar00rootroot00000000000000from __future__ import annotations __copyright__ = """ Copyright (C) 2009-2017 Andreas Kloeckner Copyright (C) 2014-2017 Aaron Meurer """ __license__ = """ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ from dataclasses import dataclass from typing import TYPE_CHECKING, ClassVar import urwid from typing_extensions import override if TYPE_CHECKING: from bdb import Breakpoint from collections.abc import Collection, Sequence from pudb.debugger import DebuggerUI TABSTOP = 8 @dataclass(eq=False) class SourceLine(urwid.Widget): _sizing: ClassVar[frozenset[urwid.Sizing]] = frozenset([urwid.Sizing.FLOW]) dbg_ui: DebuggerUI text: str line_nr: str = "" attr: Sequence[tuple[str, int | None]] | None = None has_breakpoint: bool = False is_current: bool = False highlight: bool = False @override def selectable(self): return True def set_current(self, is_current: bool): self.is_current = is_current self._invalidate() def set_highlight(self, highlight: bool): self.highlight = highlight self._invalidate() def set_breakpoint(self, has_breakpoint: bool): self.has_breakpoint = has_breakpoint self._invalidate() @override def rows(self, size, focus=False): return 1 @override def render(self, size: tuple[int, int], focus: bool = False): from pudb.debugger import CONFIG render_line_nr = CONFIG["line_numbers"] maxcol = size[0] hscroll = self.dbg_ui.source_hscroll_start # attrs is a list of words like "focused" and "breakpoint" attrs: list[str] = [] if self.is_current: crnt = ">" attrs.append("current") else: crnt = " " if self.has_breakpoint: bp = "*" attrs.append("breakpoint") else: bp = " " if focus: attrs.append("focused") elif self.highlight: if not self.has_breakpoint: attrs.append("highlighted") text = self.text if not attrs and self.attr is not None: attr = [*self.attr, ("source", None)] else: attr = [(" ".join([*attrs, "source"]), None)] from urwid.util import apply_target_encoding, trim_text_attr_cs # build line prefix --------------------------------------------------- line_prefix = "" line_prefix_attr = [] if render_line_nr and self.line_nr: line_prefix_attr = [("line number", len(self.line_nr))] line_prefix = self.line_nr line_prefix = crnt+bp+line_prefix line_prefix_attr = [ ("current line marker", 1), ("breakpoint marker", 1), *line_prefix_attr] # assume rendered width is same as len line_prefix_len = len(line_prefix) encoded_line_prefix, line_prefix_cs = apply_target_encoding(line_prefix) assert len(encoded_line_prefix) == len(line_prefix) # otherwise we'd have to adjust line_prefix_attr... :/ # shipout, encoding --------------------------------------------------- cs = [] encoded_text_segs = [] encoded_attr = [] i = 0 for seg_attr, seg_len in attr: if seg_len is None: # means: gobble up remainder of text and rest of line # and fill with attribute rowlen = hscroll+maxcol remaining_text = text[i:] encoded_seg_text, seg_cs = apply_target_encoding( remaining_text + rowlen*" ") encoded_attr.append((seg_attr, len(remaining_text)+rowlen)) else: unencoded_seg_text = text[i:i+seg_len] encoded_seg_text, seg_cs = apply_target_encoding(unencoded_seg_text) adjustment = len(encoded_seg_text) - len(unencoded_seg_text) encoded_attr.append((seg_attr, seg_len + adjustment)) i += seg_len encoded_text_segs.append(encoded_seg_text) cs.extend(seg_cs) encoded_text = b"".join(encoded_text_segs) encoded_text, encoded_attr, cs = trim_text_attr_cs( encoded_text, encoded_attr, cs, hscroll, hscroll+maxcol-line_prefix_len) encoded_text = encoded_line_prefix + encoded_text encoded_attr = line_prefix_attr + encoded_attr cs = line_prefix_cs + cs return urwid.TextCanvas([encoded_text], [encoded_attr], [cs], maxcol=maxcol) def keypress(self, size, key): return key class ParseState: """States for the ArgumentParser class""" idle = 1 found_function = 2 found_open_paren = 3 class ArgumentParser: """Parse source code tokens and identify function arguments. This parser implements a state machine which accepts Pygments tokens, delivered sequentially from the beginning of a source file to its end. parse_token() processes each token (and its associated string) and returns None if that token does not require modification. When it finds a token which represents a function argument, it returns the correct token type for that item (the caller should then replace the associated item's token type with the returned type) """ def __init__(self, pygments_token): self.t = pygments_token self.state = ParseState.idle self.paren_level = 0 def parse_token(self, token, s): """Parse token. Return None or replacement token type""" if self.state == ParseState.idle: if token in (self.t.Name.Function, self.t.Name.Function.Magic): self.state = ParseState.found_function self.paren_level = 0 elif self.state == ParseState.found_function: if token is self.t.Punctuation and s == "(": self.state = ParseState.found_open_paren self.paren_level = 1 else: if (token is self.t.Name): return self.t.Token.Argument elif token is self.t.Punctuation and s == ")": self.paren_level -= 1 elif token is self.t.Punctuation and s == "(": self.paren_level += 1 if self.paren_level == 0: self.state = ParseState.idle return None try: import pygments # noqa except ImportError: def format_source( debugger_ui: DebuggerUI, lines: Sequence[str], breakpoints: Collection[int], ) -> list[SourceLine]: lineno_format = "%%%dd " % (len(str(len(lines)))) return [ SourceLine( debugger_ui, line.rstrip("\n\r").expandtabs(TABSTOP), lineno_format % (i+1), None, has_breakpoint=i+1 in breakpoints, ) for i, line in enumerate(lines) ] else: import pygments.token as t from pygments import highlight from pygments.formatter import Formatter from pygments.lexers import PythonLexer argument_parser = ArgumentParser(t) # NOTE: Tokens of the form t.Token. are not native # Pygments token types; they are user defined token # types. # # t.Token is a Pygments token creator object # (see http://pygments.org/docs/tokens/) # # The user defined token types get assigned by # one of several translation operations at the # beginning of add_snippet(). # ATTR_MAP = { t.Token: "source", t.Keyword.Namespace: "namespace", t.Token.Argument: "argument", t.Token.Dunder: "dunder", t.Token.Keyword2: "keyword2", t.Keyword: "keyword", t.Literal: "literal", t.Name: "name", t.Name.Exception: "exception", t.Name.Function: "function", t.Name.Function.Magic: "magic", t.Name.Class: "class", t.Name.Builtin: "builtin", t.Name.Builtin.Pseudo: "pseudo", t.Name.Variable.Magic: "magic", t.Punctuation: "punctuation", t.Operator: "operator", t.String: "string", t.String.Double: "doublestring", t.String.Single: "singlestring", t.String.Backtick: "backtick", t.String.Doc: "docstring", t.Comment: "comment", } # Token translation table. Maps token types and their # associated strings to new token types. ATTR_TRANSLATE = { t.Keyword: { "class": t.Token.Keyword2, "def": t.Token.Keyword2, "exec": t.Token.Keyword2, "lambda": t.Token.Keyword2, "print": t.Token.Keyword2, }, t.Operator: { ".": t.Token, }, } class UrwidFormatter(Formatter[str]): result: list[SourceLine] current_line: str current_attr: list[tuple[str, int]] debugger_ui: DebuggerUI lineno_format: str breakpoints: Sequence[Breakpoint] def __init__(self, debugger_ui, lineno_format, breakpoints, **options): Formatter.__init__(self, **options) self.current_line = "" self.current_attr = [] self.lineno = 1 self.result = [] self.debugger_ui = debugger_ui self.lineno_format = lineno_format self.breakpoints = breakpoints def add_snippet(self, ttype, s): if not s: return # Find function arguments. When found, change their # ttype to t.Token.Argument new_ttype = argument_parser.parse_token(ttype, s) if new_ttype: ttype = new_ttype # Translate tokens if ttype in ATTR_TRANSLATE: if s in ATTR_TRANSLATE[ttype]: ttype = ATTR_TRANSLATE[ttype][s] # Translate dunder method tokens # NOTE: leaves "Magic" name tokens alone if (ttype == t.Name.Function and s.startswith("__") and s.endswith("__")): ttype = t.Token.Dunder while ttype not in ATTR_MAP: if ttype.parent is not None: ttype = ttype.parent else: raise RuntimeError( f"untreated token type: {ttype!s}") attr = ATTR_MAP[ttype] self.current_line += s self.current_attr.append((attr, len(s))) def shipout_line(self): self.result.append( SourceLine( self.debugger_ui, self.current_line, self.lineno_format % self.lineno, self.current_attr, has_breakpoint=self.lineno in self.breakpoints, )) self.current_line = "" self.current_attr = [] self.lineno += 1 def format(self, tokensource, outfile): for ttype, value in tokensource: while True: newline_pos = value.find("\n") if newline_pos == -1: self.add_snippet(ttype, value) break else: self.add_snippet(ttype, value[:newline_pos]) self.shipout_line() value = value[newline_pos+1:] if self.current_line: self.shipout_line() def format_source( debugger_ui: DebuggerUI, lines: Sequence[str], breakpoints: Collection[int], ) -> list[SourceLine]: lineno_format = "%%%dd " % (len(str(len(lines)))) formatter = UrwidFormatter(debugger_ui, lineno_format, breakpoints) highlight( "".join(line.expandtabs(TABSTOP) for line in lines), PythonLexer(stripnl=False), formatter, ) return formatter.result pudb-2025.1.5/pudb/test/000077500000000000000000000000001511510750400146105ustar00rootroot00000000000000pudb-2025.1.5/pudb/test/__init__.py000066400000000000000000000000001511510750400167070ustar00rootroot00000000000000pudb-2025.1.5/pudb/test/test_lowlevel.py000066400000000000000000000055441511510750400200620ustar00rootroot00000000000000import sys from pudb.lowlevel import decode_lines, detect_encoding def test_detect_encoding_nocookie(): lines = ["Test Проверка"] lines = [line.encode("utf-8") for line in lines] encoding, _ = detect_encoding(iter(lines)) assert encoding == "utf-8" def test_detect_encoding_cookie(): lines = [ "# coding=utf-8", "Test", "Проверка" ] lines = [line.encode("utf-8") for line in lines] encoding, _ = detect_encoding(iter(lines)) assert encoding == "utf-8" def test_decode_lines(): unicode_lines = [ "# coding=utf-8", "Test", "Проверка", ] lines = [line.encode("utf-8") for line in unicode_lines] assert unicode_lines == list(decode_lines(iter(lines))) # {{{ remove common indentation def _remove_common_indentation(code, require_leading_newline=True): if "\n" not in code: return code if require_leading_newline and not code.startswith("\n"): return code lines = code.split("\n") while lines[0].strip() == "": lines.pop(0) while lines[-1].strip() == "": lines.pop(-1) if lines: base_indent = 0 while lines[0][base_indent] in " \t": base_indent += 1 for line in lines[1:]: if line[:base_indent].strip(): raise ValueError("inconsistent indentation") return "\n".join(line[base_indent:] for line in lines) # }}} def test_executable_lines(): def get_exec_lines(src): code = compile( _remove_common_indentation(test_code), "", "exec") from pudb.lowlevel import get_executable_lines_for_codes_recursive return get_executable_lines_for_codes_recursive([code]) test_code = """ def main(): import pudb; pu.db conf = ''. \\ replace('', '') conf_tpl = '' # <-- impossible to set breakpoint here main() """ expected = {1, 2, 3, 4, 6, 8} if sys.version_info >= (3, 11): # See https://github.com/python/cpython/pull/94562 and # https://peps.python.org/pep-0626/ expected |= {0} assert get_exec_lines(test_code) == expected test_code = "a = 3*5\n" + 333 * "\n" + "b = 15" expected = { 1, 335 } if sys.version_info < (3, 10): # if co_lines is unavailable, we appear to see these expected.update([ 128, # bogus, 255, # bogus, ]) if sys.version_info >= (3, 11): # See https://github.com/python/cpython/pull/94562 and # https://peps.python.org/pep-0626/ expected |= {0} assert get_exec_lines(test_code) == expected if __name__ == "__main__": if len(sys.argv) > 1: exec(sys.argv[1]) else: from pytest import main main([__file__]) pudb-2025.1.5/pudb/test/test_make_canvas.py000066400000000000000000000033041511510750400204710ustar00rootroot00000000000000from pudb.ui_tools import make_canvas def test_simple(): text = "aaaaaa" canvas = make_canvas( txt=[text], attr=[[("var value", len(text))]], maxcol=len(text) + 5 ) content = list(canvas.content()) assert content == [ [("var value", None, b"aaaaaa"), (None, None, b" " * 5)] ] def test_multiple(): canvas = make_canvas( txt=["Return: None"], attr=[[("return label", 8), ("return value", 4)]], maxcol=100 ) content = list(canvas.content()) assert content == [ [("return label", None, b"Return: "), ("return value", None, b"None"), (None, None, b" " * 88)] ] def test_boundary(): text = "aaaaaa" canvas = make_canvas( txt=[text], attr=[[("var value", len(text))]], maxcol=len(text) ) assert list(canvas.content()) == [[("var value", None, b"aaaaaa")]] def test_byte_boundary(): text = "aaaaaaé" canvas = make_canvas( txt=[text], attr=[[("var value", len(text))]], maxcol=len(text) ) assert list(canvas.content()) == [[("var value", None, b"aaaaaa\xc3\xa9")]] def test_wide_chars(): text = "data: '中文'" canvas = make_canvas( txt=[text], attr=[[("var label", 6), ("var value", 4)]], maxcol=47, ) assert list(canvas.content()) == [[ ("var label", None, b"data: "), ("var value", None, "'中文'".encode()), (None, None, b" "*(47 - 12)), # 10 chars, 2 of which are double width ]] if __name__ == "__main__": import sys if len(sys.argv) > 1: exec(sys.argv[1]) else: from pytest import main main([__file__]) pudb-2025.1.5/pudb/test/test_run.py000066400000000000000000000021621511510750400170260ustar00rootroot00000000000000#!/usr/bin/env python3 import os import pytest from pudb.run import main def csv(x): return "('" + "', '".join(x) + "',)" main_version_scenarios = [ ("-v",), ("--version",), ("--version", "dont_look_at_me.py"), ] @pytest.mark.parametrize( "argv", [pytest.param(s, id=csv(s)) for s in main_version_scenarios], ) def test_main_version(capsys, mocker, argv): mocker.patch("sys.argv", [os.path.basename(main.__code__.co_filename), *argv]) with pytest.raises(SystemExit) as ex: main() assert ex.value == 0 captured = capsys.readouterr() assert "pudb v" in captured.out def test_main_v_with_args(capsys, mocker): """ This will fail, because args is not only ``-v``, and that's reserved for future use ... """ mocker.patch("sys.argv", [ os.path.basename(main.__code__.co_filename), "-v", "dont_look_at_me.py" ]) with pytest.raises(SystemExit) as ex: main() assert ex.value == 2 captured = capsys.readouterr() assert "error: unrecognized arguments: -v" in captured.err assert not captured.out pudb-2025.1.5/pudb/test/test_settings.py000066400000000000000000000025401511510750400200620ustar00rootroot00000000000000import builtins import collections import pytest # noqa: F401 from pudb.settings import load_breakpoints, save_breakpoints def test_load_breakpoints(mocker): fake_data = ["b /home/user/test.py:41"], ["b /home/user/test.py:50"] mock_open = mocker.mock_open() mock_open.return_value.readlines.side_effect = fake_data mocker.patch.object(builtins, "open", mock_open) mocker.patch("pudb.settings.lookup_module", mocker.Mock(return_value="/home/user/test.py")) mocker.patch("pudb.settings.get_breakpoint_invalid_reason", mocker.Mock(return_value=None)) result = load_breakpoints() expected = [("/home/user/test.py", 41, False, None, None), ("/home/user/test.py", 50, False, None, None)] assert result == expected def test_save_breakpoints(mocker): MockBP = collections.namedtuple("MockBreakpoint", "file line cond") mock_breakpoints = [MockBP("/home/user/test.py", 41, None), MockBP("/home/user/test.py", 50, None)] mocker.patch("pudb.settings.get_breakpoints_file_name", mocker.Mock(return_value="saved-breakpoints")) mock_open = mocker.mock_open() mocker.patch.object(builtins, "open", mock_open) save_breakpoints(mock_breakpoints) # pyright: ignore[reportArgumentType] mock_open.assert_called_with("saved-breakpoints", "w") pudb-2025.1.5/pudb/test/test_source_code_providers.py000066400000000000000000000025271511510750400226160ustar00rootroot00000000000000import pytest # noqa: F401 from pudb.debugger import ( DirectSourceCodeProvider, FileSourceCodeProvider, NullSourceCodeProvider, ) from pudb.source_view import SourceLine class TestNullSourceCodeProvider: def test_get_lines(self, mocker): provider = NullSourceCodeProvider() result = provider.get_lines(mocker.Mock()) assert len(result) == 10 assert isinstance(result[0], SourceLine) class TestFileSourceCodeProvider: def test_string_file_name(self, mocker): mock_debugger = mocker.Mock() mock_debugger.canonic = mocker.Mock(return_value="") provider = FileSourceCodeProvider(mock_debugger, "test file name") result = provider.get_lines(mocker.MagicMock()) assert len(result) == 1 assert isinstance(result[0], SourceLine) def test_get_lines(self, mocker): provider = FileSourceCodeProvider(mocker.Mock(), "test file name") result = provider.get_lines(mocker.MagicMock()) assert len(result) == 1 assert isinstance(result[0], SourceLine) class TestDirectSourceCodeProvider: def test_get_lines(self, mocker): provider = DirectSourceCodeProvider(mocker.Mock(), "test code") result = provider.get_lines(mocker.Mock()) assert len(result) == 1 assert isinstance(result[0], SourceLine) pudb-2025.1.5/pudb/test/test_var_view.py000066400000000000000000000273751511510750400200610ustar00rootroot00000000000000import contextlib import itertools import string import unittest from pudb.var_view import ( STRINGIFIERS, BasicValueWalker, FrameVarInfo, InspectInfo, PudbCollection, PudbMapping, PudbSequence, ValueWalker, get_stringifier, ui_log, ) class A: pass class A2: pass def test_get_stringifier(): try: import numpy as np except ImportError: numpy_values = [] else: numpy_values = [np.float32(5), np.zeros(5)] for value in [ A, A2, A(), A2(), "lól".encode(), "lól", 1233123, ["lól".encode(), "lól"], *numpy_values]: for display_type in STRINGIFIERS: iinfo = InspectInfo() iinfo.display_type = display_type strifier = get_stringifier(iinfo) s = strifier(value) assert isinstance(s, str) class FrameVarInfoForTesting(FrameVarInfo): def __init__(self, paths_to_expand=None): super().__init__() if paths_to_expand is None: paths_to_expand = set() self.paths_to_expand = paths_to_expand def get_inspect_info(self, id_path, read_only): iinfo = super().get_inspect_info( id_path, read_only) iinfo.access_level = "all" iinfo.display_type = "repr" iinfo.show_methods = True if id_path in self.paths_to_expand: iinfo.show_detail = True return iinfo class Reasonable: def __init__(self): self.x = 42 def bar(self): return True @property def red(self): return "red" @classmethod def blue(cls): return "blue" @staticmethod def green(): return "green" def _private(self): return "shh" def __magicsomething__(self): return "amazing" def method_factory(method_name): def method(self, *args, **kwargs): func = getattr(self.__internal_dict__, method_name) try: return func(*args, **kwargs) except KeyError: # Classes without __iter__ are expected to raise IndexError in this # sort of case. Frustrating, I know. if (method_name == "__getitem__" and args and isinstance(args[0], int)): raise IndexError from None raise return method def generate_containerlike_class(): methods = { "__contains__", "__getitem__", "__iter__", "__len__", "__reversed__", "count", "get", "index", "items", "keys", "values", } # Deliberately starting from 0 for r in range(0, len(methods) + 1): for selected_methods in sorted( map(sorted, itertools.combinations(methods, r))): class ContainerlikeClass: def __init__(self, iterable): self.__internal_dict__ = dict(iterable) @classmethod def name(cls): return "ContainerlikeClass:{}".format( ":".join(selected_methods)) # noqa: B023 for method in selected_methods: func = method_factory(method) setattr(ContainerlikeClass, method, func) yield ContainerlikeClass class BaseValueWalkerTestCase(unittest.TestCase): """ There are no actual tests defined in this class, it provides utilities useful for testing the variable view in various ways. """ EMPTY_ITEM = (ValueWalker.EMPTY_LABEL, None) MOD_STR = " [all+()]" def setUp(self): self.values_to_expand = [] self.class_counts = { "mappings": 0, "sequences": 0, "collections": 0, "other": 0, } def value_string(self, obj, expand=True): if expand and obj in self.values_to_expand: return repr(obj) + self.MOD_STR return repr(obj) def walked_values(self): return [(w.var_label, w.value_str) for w in self.walker.widget_list] def expected_attrs(self, obj): """ `dir()` the object and return (label, value string) pairs for each attribute. Should match the order that these attributes would appear in the var_view. """ return [("." + str(label), self.value_string(getattr(obj, label), expand=False)) for label in sorted(dir(obj))] @contextlib.contextmanager def patched_logging(self): """ Context manager that patches ui_log.exception such that the test will fail if it is called. """ def fake_exception_log(*args, **kwargs): self.fail("ui_log.exception was unexpectedly called") old_logger = ui_log.exception ui_log.exception = fake_exception_log try: yield finally: ui_log.exception = old_logger def assert_walks_contents(self, container, label="xs"): expand_paths = {label} self.values_to_expand = [container] self.walker = BasicValueWalker(FrameVarInfoForTesting(expand_paths)) # Build out list of expected view contents according to container type. expected = [(label, self.value_string(container))] if isinstance(container, PudbMapping): expected.extend([(f"[{key!r}]", repr(container[key])) for key in container.keys()] or [self.EMPTY_ITEM]) self.class_counts["mappings"] += 1 elif isinstance(container, PudbSequence): expected.extend([(f"[{index!r}]", repr(entry)) for index, entry in enumerate(container)] or [self.EMPTY_ITEM]) self.class_counts["sequences"] += 1 elif isinstance(container, PudbCollection): expected.extend([("[]", repr(entry)) for entry in container] or [self.EMPTY_ITEM]) self.class_counts["collections"] += 1 else: self.class_counts["other"] += 1 expected.extend(self.expected_attrs(container)) with self.patched_logging(): self.walker.walk_value(parent=None, label=label, value=container) received = self.walked_values() self.assertListEqual(expected, received) def assert_class_counts_equal(self, seen=None): """ This is kinda weird since at first it looks like its testing the test code, but really it's testing the `isinstance` checks. But it is also true that it tests the test code, kind of like a sanity check. """ expected = { "mappings": 0, "sequences": 0, "collections": 0, "other": 0, } if seen is not None: expected.update(seen) self.assertDictEqual(expected, self.class_counts) class ValueWalkerTest(BaseValueWalkerTestCase): def test_simple_values(self): self.walker = BasicValueWalker(FrameVarInfoForTesting()) values = [ # numbers 0, 1, -1234567890412345243, 4.2, float("inf"), complex(1.3, -1), # strings "", "a", "foo bar", " lots\tof\nspaces\r ", "♫", # other False, True, None, ] for label, value in enumerate(values): with self.patched_logging(): self.walker.walk_value(parent=None, label=str(label), value=value) expected = [(str(label_), repr(x)) for label_, x in enumerate(values)] received = self.walked_values() self.assertListEqual(expected, received) def test_simple_values_expandable(self): """ Simple values like numbers and strings are now expandable so we can peak under the hood and take a look at their attributes. Make sure that's working properly. """ values = [ # numbers 0, 1, -1234567890412345243, 4.2, float("inf"), complex(1.3, -1), # strings "", "a", "foo bar", # " lots\tof\nspaces\r ", # long, hits continuation item "♫", # other False, True, None, ] for value in values: self.assert_walks_contents(value) def test_set(self): self.assert_walks_contents({ 42, "foo", None, False, (), ("a", "tuple") }) self.assert_class_counts_equal({"collections": 1}) def test_frozenset(self): self.assert_walks_contents(frozenset([ 42, "foo", None, False, (), ("a", "tuple") ])) self.assert_class_counts_equal({"collections": 1}) def test_dict(self): self.assert_walks_contents({ 0: 42, "a": "foo", "": None, True: False, frozenset(range(3)): "abc", (): "empty tuple", (1, 2, "c", ()): "tuple", }) self.assert_class_counts_equal({"mappings": 1}) def test_list(self): self.assert_walks_contents([ 42, "foo", None, False, (), ("a", "tuple") ]) self.assert_class_counts_equal({"sequences": 1}) def test_tuple(self): self.assert_walks_contents(( 42, "foo", None, False, (), ("a", "tuple") )) self.assert_class_counts_equal({"sequences": 1}) def test_containerlike_classes(self): class_count = 0 for cls_idx, containerlike_class in enumerate( generate_containerlike_class()): label = containerlike_class.name() value = containerlike_class(zip(string.ascii_lowercase, range(3, 10))) self.assert_walks_contents(container=value, label=label) class_count = cls_idx + 1 self.assert_class_counts_equal({ "mappings": 256, "sequences": 256, "collections": 256, "other": 1280, }) walked_total = (self.class_counts["mappings"] + self.class_counts["sequences"] + self.class_counts["collections"] + self.class_counts["other"]) # +1 here because enumerate starts from 0, not 1 self.assertEqual(class_count, walked_total) def test_empty_frozenset(self): self.assert_walks_contents(frozenset()) def test_empty_set(self): self.assert_walks_contents(set()) def test_empty_dict(self): self.assert_walks_contents({}) def test_empty_list(self): self.assert_walks_contents([]) def test_reasonable_class(self): """ Are the class objects themselves expandable? """ self.assert_walks_contents(Reasonable, label="Reasonable") self.assert_class_counts_equal({"other": 1}) def test_maybe_unreasonable_classes(self): """ Are class objects, that might look like containers if we're not careful, reasonably expandable? """ for containerlike_class in generate_containerlike_class(): self.assert_walks_contents( container=containerlike_class, label=containerlike_class.name() ) # This effectively makes sure that class definitions aren't considered # containers. self.assert_class_counts_equal({"other": 2048}) pudb-2025.1.5/pudb/theme.py000066400000000000000000000242661511510750400153170ustar00rootroot00000000000000from __future__ import annotations __copyright__ = """ Copyright (C) 2009-2017 Andreas Kloeckner Copyright (C) 2014-2017 Aaron Meurer """ __license__ = """ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ from dataclasses import astuple, dataclass, replace from pudb.lowlevel import ui_log from pudb.themes import THEMES from pudb.themes.utils import ( add_setting, inheritance_overrides, link, reset_inheritance_overrides, ) @dataclass class PaletteEntry: name: str foreground: str = "default" background: str = "default" mono: str | None = None foreground_high: str | None = None background_high: str | None = None def handle_256_colors(self): if self.foreground.lower().strip().startswith("h"): self.foreground_high = self.foreground self.foreground = "default" if self.background.lower().strip().startswith("h"): self.background_high = self.background self.background = "default" # ------------------------------------------------------------------------------ # Reference for some palette items: # # "namespace" : "import", "from", "using" # "operator" : "+", "-", "=" etc. # NOTE: Does not include ".", which is assigned the type "source" # "argument" : Function arguments # "builtin" : "range", "dict", "set", "list", etc. # "pseudo" : "self", "cls" # "dunder" : Class method names of the form ____ within # a class definition # "magic" : Subset of "dunder", methods that the python language assigns # special meaning to. ("__str__", "__init__", etc.) # "exception" : Exception names # "keyword" : All keywords except those specifically assigned to "keyword2" # ("from", "and", "break", "is", "try", "True", "None", etc.) # "keyword2" : "class", "def", "exec", "lambda", "print" # ------------------------------------------------------------------------------ # {{{ style inheritance BASE_STYLES = { "background": None, "selectable": None, "focused selectable": None, "highlighted": None, "hotkey": None, } # Map styles to their parent. If a style is not defined, use the parent style # recursively. # focused > highlighted > current > breakpoint line/disabled breakpoint INHERITANCE_MAP = { # {{{ general ui "label": "background", "header": "background", "dialog title": "header", "group head": "header", "focused sidebar": "header", "input": "selectable", "focused input": "focused selectable", "button": "input", "focused button": "focused input", "value": "input", "fixed value": "label", "warning": "highlighted", "header warning": "warning", "search box": "focused input", "search not found": "warning", # }}} # {{{ source view "source": "selectable", "focused source": "focused selectable", "highlighted source": "highlighted", "current source": "source", "current focused source": "focused source", "current highlighted source": "current source", "breakpoint source": "source", "breakpoint focused source": "focused source", "current breakpoint source": "current source", "current breakpoint focused source": "current focused source", "line number": "source", "breakpoint marker": "line number", "current line marker": "breakpoint marker", # }}} # {{{ sidebar "sidebar one": "selectable", "sidebar two": "selectable", "sidebar three": "selectable", "focused sidebar one": "focused selectable", "focused sidebar two": "focused selectable", "focused sidebar three": "focused selectable", # }}} # {{{ variables view "variables": "selectable", "variable separator": "background", "var value": "sidebar one", "var label": "sidebar two", "focused var value": "focused sidebar one", "focused var label": "focused sidebar two", "highlighted var label": "highlighted", "highlighted var value": "highlighted", "focused highlighted var label": "focused var label", "focused highlighted var value": "focused var value", "return label": "var label", "return value": "var value", "focused return label": "focused var label", "focused return value": "focused var value", # }}} # {{{ stack "stack": "selectable", "frame name": "sidebar one", "frame class": "sidebar two", "frame location": "sidebar three", "focused frame name": "focused sidebar one", "focused frame class": "focused sidebar two", "focused frame location": "focused sidebar three", "current frame name": "frame name", "current frame class": "frame class", "current frame location": "frame location", "focused current frame name": "focused frame name", "focused current frame class": "focused frame class", "focused current frame location": "focused frame location", # }}} # {{{ breakpoints view "breakpoint": "sidebar two", "disabled breakpoint": "sidebar three", "current breakpoint": "breakpoint", "disabled current breakpoint": "disabled breakpoint", "focused breakpoint": "focused sidebar two", "focused current breakpoint": "focused breakpoint", "focused disabled breakpoint": "focused sidebar three", "focused disabled current breakpoint": "focused disabled breakpoint", # }}} # {{{ shell "command line edit": "source", "command line output": "source", "command line prompt": "source", "command line input": "source", "command line error": "warning", "focused command line output": "focused source", "focused command line input": "focused source", "focused command line error": "focused source", "command line clear button": "button", "command line focused button": "focused button", # }}} # {{{ Code syntax "comment": "source", "keyword": "source", "literal": "source", "name": "source", "operator": "source", "punctuation": "source", "argument": "name", "builtin": "name", "exception": "name", "function": "name", "pseudo": "builtin", "class": "function", "dunder": "function", "magic": "dunder", "namespace": "keyword", "keyword2": "keyword", "string": "literal", "doublestring": "string", "singlestring": "string", "docstring": "string", "backtick": "string", # }}} } def set_style(palette_dict: dict, style_name: str, inheritance_overrides: dict) -> PaletteEntry: """ Recursively search up the style hierarchy for the first style which has been defined, and add it to the palette_dict under the given style_name. """ try: style = palette_dict[style_name] if not isinstance(style, PaletteEntry): style = PaletteEntry(style_name, *style) style.handle_256_colors() palette_dict[style_name] = style return style except KeyError: parent_name = inheritance_overrides.get( style_name, INHERITANCE_MAP[style_name], ) style = replace( set_style(palette_dict, parent_name, inheritance_overrides), name=style_name ) palette_dict[style_name] = style return style # }}} # {{{ get palette def get_palette(may_use_fancy_formats: bool, theme: str = "classic") -> list: """ Load the requested theme and return a list containing all palette entries needed to highlight the debugger UI, including syntax highlighting. """ reset_inheritance_overrides() try: palette_dict = THEMES[theme] except KeyError: # {{{ custom try: # {{{ base styles palette_dict = { "background": ("black", "light gray"), "hotkey": (add_setting("black", "underline"), "light gray"), "selectable": ("black", "dark cyan"), "focused selectable": ("black", "dark green"), "input": (add_setting("yellow", "bold"), "dark blue"), "warning": (add_setting("white", "bold"), "dark red"), "highlighted": ("white", "dark cyan"), "source": ("white", "dark blue"), } # }}} symbols = { "palette": palette_dict, "add_setting": add_setting, "link": link, } from os.path import expanduser, expandvars fname = expanduser(expandvars(theme)) with open(fname) as inf: exec(compile(inf.read(), fname, "exec"), symbols) except FileNotFoundError: ui_log.error(f"Unable to locate custom theme file {theme!r}" ) return None except Exception: ui_log.exception("Error when importing theme:") return None # }}} # Apply style inheritance for style_name in set(INHERITANCE_MAP.keys()).union(BASE_STYLES.keys()): set_style(palette_dict, style_name, inheritance_overrides) palette_list = [ astuple(entry) for entry in palette_dict.values() if isinstance(entry, PaletteEntry) ] return palette_list # }}} # vim: foldmethod=marker pudb-2025.1.5/pudb/themes/000077500000000000000000000000001511510750400151165ustar00rootroot00000000000000pudb-2025.1.5/pudb/themes/__init__.py000066400000000000000000000014601511510750400172300ustar00rootroot00000000000000from .agr_256 import palette_dict as agr256 from .classic import palette_dict as classic from .dark_vim import palette_dict as darkvim from .gray_light_256 import palette_dict as graylight256 from .midnight import palette_dict as midnight from .mono import palette_dict as mono from .monokai import palette_dict as monokai from .monokai_256 import palette_dict as monokai256 from .nord_dark_256 import palette_dict as norddark256 from .solarized import palette_dict as solarized from .vim import palette_dict as vim THEMES = { "classic": classic, "vim": vim, "dark vim": darkvim, "midnight": midnight, "monokai": monokai, "solarized": solarized, "mono": mono, "agr-256": agr256, "gray-light-256": graylight256, "monokai-256": monokai256, "nord-dark-256": norddark256, } pudb-2025.1.5/pudb/themes/agr_256.py000066400000000000000000000053171511510750400166430ustar00rootroot00000000000000from pudb.themes.utils import add_setting, link # Give the colors some comprehensible names black = "h235" blacker = "h233" dark_cyan = "h24" dark_gray = "h241" dark_green = "h22" dark_red = "h88" dark_teal = "h23" light_blue = "h111" light_cyan = "h80" light_gray = "h252" light_green = "h113" light_red = "h160" medium_gray = "h246" salmon = "h223" orange = "h173" white = "h255" yellow = "h192" link("focused breakpoint", "focused selectable") link("current breakpoint", "current frame name") link("focused current breakpoint", "focused current frame name") palette_dict = { # {{{ base styles "background": (black, light_gray), "selectable": (white, blacker), "focused selectable": (yellow, dark_cyan), "hotkey": (add_setting(black, "underline"), light_gray), "highlighted": (white, dark_green), # }}} # {{{ general ui "focused sidebar": (dark_cyan, light_gray), "group head": (add_setting(dark_cyan, "bold"), light_gray), "dialog title": (add_setting(light_gray, "bold"), black), "warning": (add_setting(white, "bold"), dark_red), "fixed value": (add_setting(white, "bold"), dark_gray), "button": (add_setting(white, "bold"), black), "focused button": (add_setting(yellow, "bold"), dark_cyan), # }}} # {{{ source view "line number": (dark_gray, black), "current line marker": (add_setting(yellow, "bold"), black), "breakpoint marker": (add_setting(light_red, "bold"), black), "source": (white, black), "breakpoint source": (add_setting(white, "bold"), dark_red), "current source": (add_setting(light_gray, "bold"), dark_teal), # }}} # {{{ sidebar "sidebar two": (light_blue, blacker), "focused sidebar two": (light_gray, dark_cyan), "sidebar three": (medium_gray, blacker), "focused sidebar three": (salmon, dark_cyan), # }}} # {{{ variables view "highlighted var label": (light_gray, dark_green), "return label": (light_green, blacker), "focused return label": (add_setting(light_gray, "bold"), dark_cyan), # }}} # {{{ stack "current frame name": (yellow, blacker), "focused current frame name": (add_setting(yellow, "bold"), dark_cyan), # }}} # {{{ shell "command line prompt": (add_setting(yellow, "bold"), black), "command line output": (light_cyan, black), "command line error": (light_red, black), # }}} # {{{ Code syntax "comment": (medium_gray, black), "exception": (orange, black), "function": (yellow, black), "keyword": (light_blue, black), "literal": (orange, black), "operator": (yellow, black), "pseudo": (medium_gray, black), "punctuation": (salmon, black), "string": (light_green, black), # }}} } # vim: foldmethod=marker pudb-2025.1.5/pudb/themes/classic.py000066400000000000000000000042471511510750400171200ustar00rootroot00000000000000from pudb.themes.utils import add_setting, link link("current breakpoint", "current frame name") link("focused current breakpoint", "focused current frame name") palette_dict = { # {{{ base styles "background": ("black", "light gray"), "selectable": ("black", "dark cyan"), "focused selectable": ("black", "light cyan"), "highlighted": ("dark blue", "yellow"), "hotkey": (add_setting("black", "underline"), "light gray"), # }}} # {{{ general ui "header": ("dark blue", "light gray"), "dialog title": (add_setting("white", "bold"), "dark blue"), "warning": (add_setting("white", "bold"), "dark red"), # }}} # {{{ source view "source": ("yellow", "dark blue"), "current source": ("dark blue", "dark green"), "breakpoint source": (add_setting("yellow", "bold"), "dark red"), "line number": ("light gray", "dark blue"), "breakpoint marker": (add_setting("dark red", "bold"), "dark blue"), # }}} # {{{ sidebar "sidebar two": ("dark blue", "dark cyan"), "sidebar three": ("dark gray", "dark cyan"), "focused sidebar two": ("dark blue", "light cyan"), "focused sidebar three": ("dark gray", "light cyan"), # }}} # {{{ variables view "return label": ("white", "dark blue"), "focused return label": ("light gray", "dark blue"), # }}} # {{{ stack "current frame name": (add_setting("white", "bold"), "dark cyan"), "focused current frame name": (add_setting("black", "bold"), "light cyan"), # }}} # {{{ shell "command line output": ("light cyan", "dark blue"), "command line prompt": (add_setting("white", "bold"), "dark blue"), "command line error": (add_setting("light green", "bold"), "dark blue"), "command line clear button": (add_setting("white", "bold"), "dark blue"), "command line focused button": ("dark blue", "dark cyan"), # }}} # {{{ Code syntax "keyword": (add_setting("white", "bold"), "dark blue"), "function": ("light cyan", "dark blue"), "literal": (add_setting("light green", "bold"), "dark blue"), "punctuation": ("light gray", "dark blue"), "comment": ("dark cyan", "dark blue"), # }}} } # vim: foldmethod=marker pudb-2025.1.5/pudb/themes/dark_vim.py000066400000000000000000000036031511510750400172660ustar00rootroot00000000000000from pudb.themes.utils import add_setting, link link("current breakpoint", "current frame name") link("focused current breakpoint", "focused current frame name") palette_dict = { # {{{ base styles "background": ("black", "light gray"), "selectable": ("white", "dark gray"), "focused selectable": (add_setting("white", "bold"), "light blue"), "highlighted": ("black", "dark green"), "hotkey": (add_setting("dark blue", "underline"), "light gray"), # }}} # {{{ general ui "header": ("dark blue", "light gray"), "dialog title": (add_setting("white", "bold"), "black"), "warning": (add_setting("light red", "bold"), "black"), "header warning": (add_setting("light red", "bold"), "light gray"), # }}} # {{{ source view "source": ("white", "black"), "current source": (add_setting("white", "bold"), "dark gray"), "line number": (add_setting("dark gray", "bold"), "black"), "breakpoint marker": (add_setting("light red", "bold"), "black"), "breakpoint source": (add_setting("white", "bold"), "dark red"), # }}} # {{{ sidebar "sidebar two": ("yellow", "dark gray"), "focused sidebar two": ("light cyan", "light blue"), "sidebar three": ("light gray", "dark gray"), "focused sidebar three": ("yellow", "light blue"), # }}} # {{{ stack "current frame name": ( add_setting("white", "bold"), "dark gray"), # }}} # {{{ shell "command line output": (add_setting("yellow", "bold"), "black"), # }}} # {{{ Code syntax "keyword": ("yellow", "black"), "literal": ("light magenta", "black"), "function": (add_setting("light cyan", "bold"), "black"), "punctuation": ("yellow", "black"), "comment": ("dark cyan", "black"), "exception": ("light red", "black"), "builtin": ("light green", "black"), "pseudo": ("dark green", "black"), # }}} } # vim: foldmethod=marker pudb-2025.1.5/pudb/themes/gray_light_256.py000066400000000000000000000023741511510750400202230ustar00rootroot00000000000000from pudb.themes.utils import add_setting palette_dict = { # {{{ base styles "background": ("h232", "h248"), "selectable": ("h232", "h252"), "focused selectable": ("h232", "h251"), "highlighted": (add_setting("h234", "bold, underline"), "h252"), "hotkey": (add_setting("h232", "underline"), "h248"), # }}} # {{{ general ui "focused sidebar": (add_setting("h232", "bold"), "h248"), "warning": (add_setting("h232", "bold"), "h253"), "group head": (add_setting("h232", "bold"), "h248"), "dialog title": (add_setting("h232", "underline, bold"), "h248"), # }}} # {{{ source view "source": ("h235", "h253"), "current source": (add_setting("h232", "underline"), "h253"), "line number": ("h244", "h253"), # }}} # {{{ sidebar "sidebar two": (add_setting("h234", "bold"), "h252"), "focused sidebar two": (add_setting("h234", "bold"), "h251"), "sidebar three": ("h239", "h252"), "focused sidebar three": ("h239", "h251"), # }}} # {{{ Code syntax "exception": (add_setting("h236", "underline"), "h253"), "class": (add_setting("h234", "bold, underline"), "h253"), "keyword": (add_setting("h234", "bold"), "h253"), "comment": ("h244", "h253"), # }}} } pudb-2025.1.5/pudb/themes/midnight.py000066400000000000000000000073731511510750400173050ustar00rootroot00000000000000from pudb.themes.utils import add_setting, link # Based on XCode's midnight theme # Looks best in a console with green text against black background link("current breakpoint", "current frame name") link("focused current breakpoint", "focused current frame name") palette_dict = { # {{{ base styles "background": ("black", "light gray"), "selectable": ("white", "black"), "focused selectable": ("white", "dark blue"), "hotkey": (add_setting("black", "underline, italics"), "light gray"), "highlighted": ("black", "dark green"), # }}} # {{{ general ui "input": ("light green", "black"), "focused input": ("light green", "black"), "warning": (add_setting("white", "bold"), "dark red"), "dialog title": (add_setting("white", "bold"), "dark blue"), "group head": (add_setting("dark blue", "bold"), "light gray"), "button": (add_setting("white", "bold"), "dark blue"), "focused button": ("white", "black"), "focused sidebar": ("black", "white"), "value": (add_setting("yellow", "bold"), "dark blue"), # }}} # {{{ source view "source": ("light green", "black"), "highlighted source": ("black", "dark green"), "current source": ("black", "brown"), "current focused source": (add_setting("yellow", "bold"), "dark blue"), "breakpoint source": (add_setting("yellow", "bold"), "dark red"), "current breakpoint source": ("black", "dark red"), "line number": ("light gray", "black"), "current line marker": ("dark red", "black"), "breakpoint marker": ("dark red", "black"), # }}} # {{{ sidebar "sidebar two": ("light blue", "black"), "sidebar three": ("light cyan", "black"), # }}} # {{{ variables view "return label": ("white", "dark blue"), "return value": ("black", "dark cyan"), "focused return label": ("light gray", "dark blue"), # }}} # {{{ stack "current frame name": (add_setting("white", "bold"), "black"), "current frame class": (add_setting("light blue", "bold"), "black"), "current frame location": (add_setting("light cyan", "bold"), "black"), "focused current frame name": (add_setting("white", "bold"), "dark blue"), "focused current frame class": (add_setting("white", "bold"), "dark blue"), "focused current frame location": (add_setting("white", "bold"), "dark blue"), # }}} # {{{ breakpoints view "breakpoint": ("white", "black"), "disabled breakpoint": ("dark gray", "black"), "focused disabled breakpoint": ("light gray", "dark blue"), "current breakpoint": (add_setting("white", "bold"), "black"), "disabled current breakpoint": (add_setting("dark gray", "bold"), "black"), "focused current breakpoint": (add_setting("white", "bold"), "dark blue"), "focused disabled current breakpoint": ( add_setting("light gray", "bold"), "dark blue"), # }}} # {{{ shell "command line edit": ("white", "black"), "command line prompt": (add_setting("white", "bold"), "black"), "command line input": ("white", "black"), "command line error": (add_setting("light red", "bold"), "black"), "command line clear button": (add_setting("white", "bold"), "black"), "command line focused button": ("white", "dark blue"), # }}} # {{{ Code syntax "keyword": ("dark magenta", "black"), "operator": ("dark green", "black"), "pseudo": ("light magenta", "black"), "function": (add_setting("light blue", "bold"), "black"), "builtin": ("dark gray", "black"), "literal": ("dark cyan", "black"), "string": ("dark red", "black"), "docstring": ("yellow", "black"), "backtick": ("dark green", "black"), "punctuation": ("white", "black"), "comment": ("white", "black"), "exception": ("dark green", "black"), # }}} } # vim: foldmethod=marker pudb-2025.1.5/pudb/themes/mono.py000066400000000000000000000002721511510750400164410ustar00rootroot00000000000000palette_dict = { "background": ("standout",), "selectable": (), "focused selectable": ("underline",), "highlighted": ("bold",), "hotkey": ("underline, standout",), } pudb-2025.1.5/pudb/themes/monokai.py000066400000000000000000000051731511510750400171330ustar00rootroot00000000000000from pudb.themes.utils import add_setting, link link("current breakpoint", "current frame name") link("focused current breakpoint", "focused current frame name") palette_dict = { # {{{ base styles "background": ("black", "light gray"), "selectable": ("white", "black"), "focused selectable": ("white", "dark gray"), "highlighted": ("black", "dark green"), "hotkey": (add_setting("black", "underline"), "light gray"), # }}} # {{{ general ui "input": ("white", "black"), "button": (add_setting("white", "bold"), "black"), "focused button": (add_setting("white", "bold"), "dark gray"), "focused sidebar": ("dark blue", "light gray"), "warning": (add_setting("white", "bold"), "dark red"), "group head": (add_setting("black", "bold"), "light gray"), "dialog title": (add_setting("white", "bold"), "black"), # }}} # {{{ source view "current source": ("black", "dark cyan"), "breakpoint source": (add_setting("white", "bold"), "dark red"), "line number": ("dark gray", "black"), "current line marker": (add_setting("dark cyan", "bold"), "black"), "breakpoint marker": (add_setting("dark red", "bold"), "black"), # }}} # {{{ sidebar "sidebar two": ("light cyan", "black"), "focused sidebar two": ("light cyan", "dark gray"), "sidebar three": ("light magenta", "black"), "focused sidebar three": ("light magenta", "dark gray"), # }}} # {{{ variables view "return label": ("light green", "black"), "focused return label": ("light green", "dark gray"), # }}} # {{{ stack "current frame name": ("light green", "black"), "focused current frame name": ("light green", "dark gray"), # }}} # {{{ shell "command line prompt": (add_setting("yellow", "bold"), "black"), "command line output": ("light cyan", "black"), "command line error": ("yellow", "black"), "focused command line output": ("light cyan", "dark gray"), "focused command line error": (add_setting("yellow", "bold"), "dark gray"), # }}} # {{{ Code syntax "literal": ("light magenta", "black"), "builtin": ("light cyan", "black"), "exception": ("light cyan", "black"), "keyword2": ("light cyan", "black"), "function": ("light green", "black"), "class": (add_setting("light green", "underline"), "black"), "keyword": ("light red", "black"), "operator": ("light red", "black"), "comment": ("dark gray", "black"), "docstring": ("dark gray", "black"), "argument": ("brown", "black"), "pseudo": ("brown", "black"), "string": ("yellow", "black"), # }}} } # vim: foldmethod=marker pudb-2025.1.5/pudb/themes/monokai_256.py000066400000000000000000000057341511510750400175320ustar00rootroot00000000000000from pudb.themes.utils import add_setting, link # Give the colors some comprehensible names black = "h236" blacker = "h234" dark_gray = "h240" dark_green = "h28" dark_red = "h124" dark_teal = "h30" dark_magenta = "h141" light_blue = "h111" light_cyan = "h51" light_gray = "h252" light_green = "h155" light_red = "h160" light_magenta = "h198" medium_gray = "h243" orange = "h208" white = "h255" yellow = "h228" link("current breakpoint", "current frame name") link("focused current breakpoint", "focused current frame name") palette_dict = { # {{{ base styles "background": (black, light_gray), "selectable": (white, blacker), "focused selectable": (white, dark_gray), "highlighted": (white, dark_green), "hotkey": (add_setting(black, "underline"), light_gray), # }}} # {{{ general ui "input": (white, black), "button": (add_setting(white, "bold"), black), "focused button": (add_setting(white, "bold"), dark_gray), "focused sidebar": (dark_teal, light_gray), "warning": (add_setting(white, "bold"), dark_red), "group head": (add_setting(black, "bold"), light_gray), "dialog title": (add_setting(white, "bold"), blacker), # }}} # {{{ source view "source": (white, black), "current source": (add_setting(light_gray, "bold"), dark_teal), "breakpoint source": (add_setting(white, "bold"), dark_red), "line number": (dark_gray, black), "current line marker": (add_setting(light_cyan, "bold"), black), "breakpoint marker": (add_setting(light_red, "bold"), black), # }}} # {{{ sidebar "sidebar two": (light_cyan, blacker), "focused sidebar two": (light_cyan, dark_gray), "sidebar three": (dark_magenta, blacker), "focused sidebar three": (dark_magenta, dark_gray), # }}} # {{{ variables view "highlighted var label": (light_gray, dark_green), "return label": (light_green, blacker), "focused return label": (light_green, dark_gray), # }}} # {{{ stack "current frame name": (light_green, blacker), "focused current frame name": (light_green, dark_gray), # }}} # {{{ shell "command line prompt": (add_setting(yellow, "bold"), black), "command line output": (light_cyan, black), "command line error": (orange, black), "focused command line output": (light_cyan, dark_gray), "focused command line error": (add_setting(orange, "bold"), dark_gray), # }}} # {{{ Code syntax "literal": (dark_magenta, black), "builtin": (light_cyan, black), "exception": (light_cyan, black), "keyword2": (light_cyan, black), "function": (light_green, black), "class": (add_setting(light_green, "underline"), black), "keyword": (light_magenta, black), "operator": (light_magenta, black), "comment": (medium_gray, black), "docstring": (medium_gray, black), "argument": (orange, black), "pseudo": (orange, black), "string": (yellow, black), # }}} } # vim: foldmethod=marker pudb-2025.1.5/pudb/themes/nord_dark_256.py000066400000000000000000000120221511510750400200240ustar00rootroot00000000000000from pudb.themes.utils import add_setting, link # ------------------------------------------------------------------------------ # Colors are approximations of https://www.nordtheme.com/docs/colors-and-palettes # ------------------------------------------------------------------------------ # ------------------------------------------------------------------------------ # Polar Night is made up of four darker colors (nord 0, nord1, nord2, and nord3) # that are commonly used for base elements like backgrounds or text color in # bright ambiance designs. # ------------------------------------------------------------------------------ # nord0 is the origin color or the Polar Night palette. nord0 = "h236" # nord1 is a brighter shade color based on nord0. nord1 = "h238" # nord2 is an even more brighter shade color of nord0. nord2 = "h239" # nord3 is the brightest shade color based on nord0. nord3 = "h243" # ------------------------------------------------------------------------------ # Snow Storm is made up of three bright colors that are commonly used for text # colors or base UI elements in bright ambiance designs. # ------------------------------------------------------------------------------ # nord4 is the origin color or the Snow Storm palette. nord4 = "h253" # nord5 is a brighter shade color of nord4. nord5 = "h254" # nord6 is the brightest shade color based on nord4. nord6 = "h255" # ------------------------------------------------------------------------------ # Frost can be described as the heart palette of Nord, a group of four bluish # colors that are commonly used for primary UI component and text highlighting # and essential code syntax elements. # ------------------------------------------------------------------------------ # nord7 is a calm and highly contrasted color reminiscent of # frozen polar water. nord7 = "h109" # nord8 is a bright and shiny primary accent color reminiscent of pure # and clear ice. nord8 = "h110" # nord9 is a more darkened and less saturated color reminiscent of # arctic waters. nord9 = "h111" # nord10 is a dark and intensive color reminiscent of the deep arctic ocean. nord10 = "h67" # ------------------------------------------------------------------------------ # Aurora consists of five colorful components reminiscent of the "Aurora # borealis", sometimes referred to as polar lights or northern lights. # ------------------------------------------------------------------------------ # nord11 is a reddish color. nord11 = "h138" # nord12 is an orangey color. nord12 = "h174" # nord13 is a yellowy color. nord13 = "h216" # nord14 is a greenish color. nord14 = "h150" # nord15 is a purplish color. nord15 = "h139" link("current breakpoint", "current frame name") link("focused current breakpoint", "focused current frame name") palette_dict = { # {{{ base styles "background": (nord0, nord7), "selectable": (nord4, nord1), "focused selectable": (nord4, nord2), "highlighted": (nord14, nord1), "hotkey": (add_setting(nord0, "underline"), nord7), # }}} # {{{ general ui "input": (nord4, nord0), "button": (add_setting(nord4, "bold"), nord0), "focused button": (add_setting(nord4, "bold"), nord2), "focused sidebar": (nord0, nord7), "warning": (nord12, nord2), "group head": (add_setting(nord0, "bold"), nord7), "dialog title": (add_setting(nord4, "bold"), nord1), # }}} # {{{ source view "source": (nord4, nord0), "current source": (nord13, nord1), "current focused source": (nord13, nord2), "breakpoint source": (nord12, nord0), "line number": (nord2, nord0), "current line marker": (add_setting(nord13, "bold"), nord0), "breakpoint marker": (add_setting(nord13, "bold"), nord0), # }}} # {{{ sidebar "sidebar two": (nord7, nord1), "focused sidebar two": (nord7, nord2), "sidebar three": (nord10, nord1), "focused sidebar three": (nord10, nord2), # }}} # {{{ variables view "highlighted var label": (nord14, nord1), "focused highlighted var label": (nord14, nord2), "focused highlighted var value": (nord14, nord2), "return label": (nord0, nord8), "focused return label": (nord0, nord8), # }}} # {{{ stack "current frame name": (nord14, nord1), "focused current frame name": (nord14, nord2), # }}} # {{{ shell "command line prompt": (add_setting(nord5, "bold"), nord0), "command line output": (nord7, nord0), "command line error": (nord12, nord0), "focused command line output": (nord7, nord2), "focused command line error": (nord12, nord2), # }}} # {{{ Code syntax "literal": (nord15, nord0), "builtin": (add_setting(nord7, "bold"), nord0), "pseudo": (nord7, nord0), "exception": (nord11, nord0), "function": (nord7, nord0), "class": (add_setting(nord9, "underline"), nord0), "keyword": (nord8, nord0), "keyword2": (nord9, nord0), "operator": (nord8, nord0), "comment": (nord3, nord0), "string": (nord14, nord0), # }}} } # vim: foldmethod=marker pudb-2025.1.5/pudb/themes/solarized.py000066400000000000000000000037461511510750400174760ustar00rootroot00000000000000from pudb.themes.utils import add_setting palette_dict = { # {{{ base styles "background": ("light green", "light gray"), "selectable": ("light green", "white"), "focused selectable": ("white", "dark blue"), "highlighted": ("white", "dark cyan"), "hotkey": (add_setting("black", "underline"), "light gray"), # }}} # {{{ general ui "dialog title": (add_setting("white", "bold"), "dark cyan"), "warning": (add_setting("light red", "bold"), "white"), "header warning": (add_setting("light red", "bold"), "light gray"), "focused sidebar": ("dark red", "light gray"), "group head": (add_setting("yellow", "bold"), "light gray"), # }}} # {{{ source view "source": ("yellow", "white"), "breakpoint source": ("light red", "light gray"), "current source": ("light gray", "light blue"), "line number": ("light blue", "white"), "current line marker": (add_setting("light blue", "bold"), "white"), "breakpoint marker": (add_setting("light red", "bold"), "white"), # }}} # {{{ sidebar "sidebar two": ("dark blue", "white"), "sidebar three": ("light cyan", "white"), "focused sidebar three": ("light gray", "dark blue"), # }}} # {{{ variables view "return label": ("white", "yellow"), "focused return label": ("white", "yellow"), # }}} # {{{ stack "current frame name": (add_setting("light green", "bold"), "white"), "focused current frame name": (add_setting("white", "bold"), "dark blue"), # }}} # {{{ shell "command line output": ("light green", "white"), # }}} # {{{ Code syntax "namespace": ("dark red", "white"), "exception": ("light red", "white"), "keyword": ("brown", "white"), "keyword2": ("dark magenta", "white"), "function": ("dark green", "white"), "literal": ("dark cyan", "white"), "builtin": ("dark blue", "white"), "comment": ("light cyan", "white"), "pseudo": ("light cyan", "white"), # }}} } # vim: foldmethod=marker pudb-2025.1.5/pudb/themes/utils.py000066400000000000000000000005751511510750400166370ustar00rootroot00000000000000import urwid may_use_fancy_formats = not hasattr(urwid.escape, "_fg_attr_xterm") def add_setting(color, setting): if may_use_fancy_formats: return f"{color}, {setting}" return color inheritance_overrides = {} def link(child: str, parent: str): inheritance_overrides[child] = parent def reset_inheritance_overrides(): inheritance_overrides.clear() pudb-2025.1.5/pudb/themes/vim.py000066400000000000000000000045041511510750400162660ustar00rootroot00000000000000from pudb.themes.utils import add_setting, link link("current breakpoint", "current frame name") link("focused current breakpoint", "focused current frame name") palette_dict = { # {{{ base styles "background": ("black", "light gray"), "selectable": ("black", "dark cyan"), "focused selectable": ("black", "light cyan"), "hotkey": (add_setting("black", "bold, underline"), "light gray"), "highlighted": ("black", "yellow"), # }}} # {{{ general ui "header": (add_setting("black", "bold"), "light gray"), "group head": ("dark blue", "light gray"), "dialog title": (add_setting("white", "bold"), "dark blue"), "input": ("black", "dark cyan"), "focused input": ("black", "light cyan"), "warning": (add_setting("dark red", "bold"), "white"), "header warning": (add_setting("dark red", "bold"), "light gray"), # }}} # {{{ source view "source": ("black", "white"), "current source": ("black", "dark cyan"), "breakpoint source": ("dark red", "light gray"), "line number": ("dark gray", "white"), "current line marker": ("dark red", "white"), "breakpoint marker": ("dark red", "white"), # }}} # {{{ sidebar "sidebar one": ("black", "dark cyan"), "sidebar two": ("dark blue", "dark cyan"), "sidebar three": ("dark gray", "dark cyan"), "focused sidebar one": ("black", "light cyan"), "focused sidebar two": ("dark blue", "light cyan"), "focused sidebar three": ("dark gray", "light cyan"), # }}} # {{{ variables view "highlighted var label": ("dark blue", "yellow"), "return label": ("white", "dark blue"), "focused return label": ("light gray", "dark blue"), # }}} # {{{ stack "current frame name": (add_setting("white", "bold"), "dark cyan"), "focused current frame name": (add_setting("black", "bold"), "light cyan"), # }}} # {{{ shell "command line output": ( add_setting("dark gray", "bold"), "white"), # }}} # {{{ Code syntax "keyword2": ("dark magenta", "white"), "namespace": ("dark magenta", "white"), "literal": ("dark red", "white"), "exception": ("dark red", "white"), "comment": ("dark gray", "white"), "function": ("dark blue", "white"), "pseudo": ("dark gray", "white"), "builtin": ("light blue", "white"), # }}} } # vim: foldmethod=marker pudb-2025.1.5/pudb/ui_tools.py000066400000000000000000000262441511510750400160500ustar00rootroot00000000000000from __future__ import annotations from typing import Callable, ClassVar, Hashable, Literal, Sequence, TypeVar import urwid from typing_extensions import TypeAlias, override from urwid import Widget, calc_text_pos, calc_width # generic urwid helpers ------------------------------------------------------- def text_width(txt): """Return the width of the text in the terminal. :arg txt: A Unicode text object. Use this instead of len() whenever txt could contain double- or zero-width Unicode characters. """ return calc_width(txt, 0, len(txt)) def encode_like_urwid(s: str): from urwid.display import escape from urwid.util import _target_encoding # Consistent with # https://github.com/urwid/urwid/blob/2cc54891965283faf9113da72202f5d405f90fa3/urwid/util.py#L126-L128 s = s.replace(escape.SI+escape.SO, "") # remove redundant shifts return s.encode(_target_encoding, "replace") def make_canvas( txt: Sequence[str], attr: Sequence[Sequence[tuple[Hashable | None, int]]], maxcol: int, fill_attr: str | None = None ): processed_txt: list[bytes] = [] processed_attr: list[list[tuple[Hashable | None, int]]] = [] processed_cs: list[list[tuple[Literal["U", "0"] | None, int]]] = [] for line, line_attr in zip(txt, attr): # filter out zero-length attrs line_attr = [(aname, la) for aname, la in line_attr if la > 0] diff = maxcol - text_width(line) if diff > 0: line += " "*diff line_attr.append((fill_attr, diff)) else: from urwid.util import rle_subseg line = line[:calc_text_pos(line, 0, len(line), maxcol)[0]] line_attr = rle_subseg(line_attr, 0, maxcol) from urwid.util import apply_target_encoding encoded_line, line_cs = apply_target_encoding(line) # line_cs contains byte counts as requested by TextCanvas, but # line_attr still contains column counts at this point: let's fix this. def get_byte_line_attr(line, line_attr): i = 0 for label, column_count in line_attr: byte_count = len(encode_like_urwid(line[i:i+column_count])) i += column_count yield label, byte_count line_attr = list(get_byte_line_attr(line, line_attr)) processed_txt.append(encoded_line) processed_attr.append(line_attr) processed_cs.append(line_cs) return urwid.TextCanvas( processed_txt, processed_attr, processed_cs, maxcol=maxcol) def make_hotkey_markup(s): import re match = re.match(r"^([^_]*)_(.)(.*)$", s) assert match is not None return [ (None, match.group(1)), ("hotkey", match.group(2)), (None, match.group(3)), ] def labelled_value(label, value): return urwid.AttrMap(urwid.Text([ ("label", label), str(value)]), "fixed value", "fixed value") def find_widget_in_container(container, widget) -> int: for i, (w, _) in enumerate(container.contents): if w == widget: return i raise ValueError(f"Widget not found in '{type(container).__name__}': {widget!r}") def focus_widget_in_container(container, widget) -> None: container.focus_position = find_widget_in_container(container, widget) class SelectableText(urwid.Text): @override def selectable(self): return True @override def keypress(self, size: UrwidSize, key: str): return key UrwidSize: TypeAlias = "tuple[()] | tuple[int] | tuple[int, int]" WrappedWidget = TypeVar("WrappedWidget", bound=Widget, covariant=True) EventListener: TypeAlias = Callable[ ["SignalWrap[WrappedWidget]", UrwidSize, str], "str | None"] # pyright ignore to paper over variance disagreement with urwid class SignalWrap(urwid.WidgetWrap[WrappedWidget]): # pyright: ignore[reportInvalidTypeArguments] event_listeners: list[tuple[str | None, EventListener[WrappedWidget]]] is_preemptive: bool def __init__(self, w: WrappedWidget, is_preemptive: bool = False): super().__init__(w) self.event_listeners = [] self.is_preemptive = is_preemptive def listen(self, mask: str | None, handler: EventListener[WrappedWidget]): self.event_listeners.append((mask, handler)) @override def keypress(self, size: UrwidSize, key: str): result = key if self.is_preemptive: for mask, handler in self.event_listeners: if mask is None or mask == key: result = handler(self, size, key) break if result is not None: result = self._w.keypress(size, key) if result is not None and not self.is_preemptive: for mask, handler in self.event_listeners: if mask is None or mask == key: return handler(self, size, key) return result # {{{ debugger-specific stuff class StackFrame(urwid.Widget): _sizing: ClassVar[frozenset[urwid.Sizing]] = frozenset([urwid.Sizing.FLOW]) is_current: bool name: str class_name: str | None filename: str line: int def __init__(self, is_current: bool, name: str, class_name: str | None, filename: str, line: int): super().__init__() self.is_current = is_current self.name = name self.class_name = class_name self.filename = filename self.line = line @override def selectable(self): return True @override def rows(self, size: UrwidSize, focus: bool = False): return 1 @override def render(self, size: UrwidSize, focus: bool = False): assert size # FIXME? maxcol = size[0] if focus: apfx = "focused " else: apfx = "" if self.is_current: apfx += "current " crnt_pfx = ">> " else: crnt_pfx = " " text = crnt_pfx+self.name attr = [(apfx+"frame name", 4+len(self.name))] if self.class_name is not None: text += f" [{self.class_name}]" attr.append((apfx+"frame class", len(self.class_name)+2)) loc = " %s:%d" % (self.filename, self.line) text += loc attr.append((apfx+"frame location", len(loc))) return make_canvas([text], [attr], maxcol, apfx+"frame location") @override def keypress(self, size: UrwidSize, key: str): return key class BreakpointFrame(urwid.Widget): _sizing = frozenset([urwid.Sizing.FLOW]) def __init__(self, is_current, filename, breakpoint): super().__init__() self.is_current = is_current self.filename = filename self.breakpoint = breakpoint self.line = breakpoint.line # Starts at 1 self.enabled = breakpoint.enabled self.hits = breakpoint.hits def selectable(self): return True def rows(self, size, focus=False): return 1 def render(self, size, focus=False): maxcol = size[0] if focus: apfx = "focused " else: apfx = "" bp_pfx = "" if not self.enabled: apfx += "disabled " bp_pfx += "X" if self.is_current: apfx += "current " bp_pfx += ">>" bp_pfx = bp_pfx.ljust(3) hits_label = "hits" if self.hits != 1 else "hit" loc = f" {self.filename}:{self.line} ({self.hits} {hits_label})" text = bp_pfx+loc attr = [(apfx+"breakpoint", len(text))] return make_canvas([text], [attr], maxcol, apfx+"breakpoint") def keypress(self, size, key): return key class SearchController: def __init__(self, ui): self.ui = ui self.highlight_line = None self.search_box = None self.last_search_string = None def cancel_highlight(self): if self.highlight_line is not None: self.highlight_line.set_highlight(False) self.highlight_line = None def cancel_search(self): self.cancel_highlight() self.hide_search_ui() def hide_search_ui(self): self.search_box = None del self.ui.lhs_col.contents[0] self.ui.lhs_col.set_focus(self.ui.lhs_col.widget_list[0]) def open_search_ui(self): lhs_col = self.ui.lhs_col if self.search_box is None: _, self.search_start = self.ui.source.get_focus() self.search_box = SearchBox(self) self.search_AttrMap = urwid.AttrMap( self.search_box, "search box") lhs_col.item_types.insert( 0, ("flow", None)) lhs_col.widget_list.insert(0, self.search_AttrMap) self.ui.reset_cmdline_size() self.ui.columns.set_focus(lhs_col) lhs_col.set_focus(self.search_AttrMap) def perform_search(self, dir, s=None, start=None, update_search_start=False): self.cancel_highlight() # self.ui.lhs_col.set_focus(self.ui.lhs_col.widget_list[1]) if s is None: s = self.last_search_string if s is None: self.ui.message("No previous search term.") return False else: self.last_search_string = s if start is None: start = self.search_start case_insensitive = s.lower() == s if start > len(self.ui.source): start = 0 i = (start+dir) % len(self.ui.source) if i >= len(self.ui.source): i = 0 while i != start: sline = self.ui.source[i].text if case_insensitive: sline = sline.lower() if s in sline: sl = self.ui.source[i] sl.set_highlight(True) self.highlight_line = sl self.ui.source.set_focus(i) if update_search_start: self.search_start = i return True i = (i+dir) % len(self.ui.source) return False class SearchBox(urwid.Edit): def __init__(self, controller): urwid.Edit.__init__(self, [("label", "Search: ")], "") self.controller = controller def keypress(self, size, key): result = urwid.Edit.keypress(self, size, key) txt = self.get_edit_text() if result is not None: if key == "esc": self.controller.cancel_search() return None elif key == "enter": if txt: self.controller.hide_search_ui() self.controller.perform_search(dir=1, s=txt, update_search_start=True) else: self.controller.cancel_search() return None else: if self.controller.perform_search(dir=1, s=txt): self.controller.search_AttrMap.set_attr_map({None: "search box"}) else: self.controller.search_AttrMap.set_attr_map( {None: "search not found"}) return result # }}} pudb-2025.1.5/pudb/var_view.py000066400000000000000000000636151511510750400160400ustar00rootroot00000000000000from __future__ import annotations __copyright__ = """ Copyright (C) 2009-2017 Andreas Kloeckner Copyright (C) 2014-2017 Aaron Meurer """ __license__ = """ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ # {{{ constants and imports import inspect import warnings from abc import ABC, abstractmethod from collections.abc import Callable, Sized from dataclasses import dataclass from typing import TYPE_CHECKING, ClassVar, Literal, cast import urwid from typing_extensions import TypeAlias, override from pudb.lowlevel import ui_log from pudb.ui_tools import text_width if TYPE_CHECKING: import numpy HAVE_NUMPY = 1 else: try: import numpy HAVE_NUMPY = 1 except ImportError: HAVE_NUMPY = 0 # }}} # {{{ abstract base classes for containers class PudbCollection(ABC): # noqa: B024 @classmethod def __subclasshook__(cls, c): if cls is PudbCollection: try: return all([ any("__contains__" in b.__dict__ for b in c.__mro__), any("__iter__" in b.__dict__ for b in c.__mro__), ]) except Exception: pass return NotImplemented @classmethod def entries(cls, collection, label: str): """ :yield: ``(label, entry, id_path_ext)`` tuples for each entry in the collection. """ assert isinstance(collection, cls) try: for count, entry in enumerate(collection): yield None, entry, f"[{count:d}]" except Exception as error: ui_log.error(f"Object {label!r} appears to be a collection, but does " f"not behave like one: {error}") @classmethod def length(cls, collection): return len(collection) class PudbSequence(ABC): # noqa: B024 @classmethod def __subclasshook__(cls, c): if cls is PudbSequence: try: return all([ any("__getitem__" in b.__dict__ for b in c.__mro__), any("__iter__" in b.__dict__ for b in c.__mro__), ]) except Exception: pass return NotImplemented @classmethod def entries(cls, sequence, label: str): """ :yield: ``(label, entry, id_path_ext)`` tuples for each entry in the sequence. """ assert isinstance(sequence, cls) try: for count, entry in enumerate(sequence): yield str(count), entry, f"[{count:d}]" except Exception as error: ui_log.error(f"Object {label!r} appears to be a sequence, but does " f"not behave like one: {error}") @classmethod def length(cls, sequence): return len(sequence) class PudbMapping(ABC): # noqa: B024 @classmethod def __subclasshook__(cls, c): if cls is PudbMapping: try: return all([ any("__getitem__" in b.__dict__ for b in c.__mro__), any("__iter__" in b.__dict__ for b in c.__mro__), any("keys" in b.__dict__ for b in c.__mro__), ]) except Exception: pass return NotImplemented @classmethod def _safe_key_repr(cls, key): try: return repr(key) except Exception: return f"!! repr error on key with id: {id(key):#x} !!" @classmethod def entries(cls, mapping, label: str): """ :yield: ``(label, entry, id_path_ext)`` tuples for each entry in the mapping. """ assert isinstance(mapping, cls) try: for key in mapping.keys(): key_repr = cls._safe_key_repr(key) yield (key_repr, mapping[key], f"[{key_repr}]") except Exception as error: ui_log.error(f"Object {label!r} appears to be a mapping, but does " f"not behave like one: {error}") @classmethod def length(cls, mapping): return len(mapping.keys()) # Order is important here- A mapping without keys could be viewed as a # sequence, and they're both collections. CONTAINER_CLASSES = ( PudbMapping, PudbSequence, PudbCollection, ) # }}} # {{{ data class FrameVarInfo: def __init__(self): self.id_path_to_iinfo = {} self.watches = [] def get_inspect_info(self, id_path, read_only): if read_only: return self.id_path_to_iinfo.get( id_path, InspectInfo()) else: return self.id_path_to_iinfo.setdefault( id_path, InspectInfo()) VarAccessLevel: TypeAlias = Literal["private", "public"] Stringifier: TypeAlias = Literal[ "default", "type", "repr", "str", "id", ] IdPath: TypeAlias = "tuple[str, ...]" class InspectInfo: show_detail: bool display_type: Stringifier highlighted: bool repeated_at_top: bool access_level: VarAccessLevel show_methods: bool wrap: bool def __init__(self): # Do not globalize: cyclic import from pudb.debugger import CONFIG self.show_detail = False self.display_type = CONFIG["stringifier"] self.highlighted = False self.repeated_at_top = False self.access_level = CONFIG["default_variables_access_level"] self.show_methods = False self.wrap = CONFIG["wrap_variables"] @dataclass(frozen=True) class WatchExpression: expression: str class WatchEvalError: def __str__(self): return "" # }}} # {{{ widget class VariableWidget(urwid.Widget): _sizing: ClassVar[frozenset[str]] = frozenset([urwid.Sizing.FLOW]) PREFIX: ClassVar[str] = "| " parent: VariableWidget | None nesting_level: int var_label: str | None value_str: str | None id_path: IdPath attr_prefix: str watch_expr: WatchExpression | None wrap: bool def __init__(self, parent: VariableWidget | None, var_label: str | None, value_str: str | None, id_path: IdPath, attr_prefix: str | None = None, watch_expr: WatchExpression | None = None, iinfo: InspectInfo | None = None ): super().__init__() assert isinstance(id_path, str) self.parent = parent self.nesting_level = 0 if parent is None else parent.nesting_level + 1 self.prefix = self.PREFIX * self.nesting_level self.var_label = var_label self.value_str = value_str self.id_path = id_path self.attr_prefix = attr_prefix or "var" self.watch_expr = watch_expr if iinfo is None: # Do not globalize: cyclic import from pudb.debugger import CONFIG self.wrap = CONFIG["wrap_variables"] else: self.wrap = iinfo.wrap def __str__(self): return (f"VariableWidget: {self.value_str}, level {self.nesting_level}, " f"at {self.id_path}") def selectable(self): return True def _get_wrapped_lines(self, maxcol: int) -> list[str]: """ :param maxcol: the number of columns available to this widget :return: list of string lines, including prefixes, wrapped to fit in the available space """ maxcol -= len(self.prefix) # self.prefix is padding var_label = self.var_label or "" value_str = self.value_str or "" alltext = var_label + ": " + value_str # The first line is not indented firstline = self.prefix + alltext[:maxcol] if not alltext[maxcol:]: return [firstline] fulllines, rest = divmod(text_width(alltext) - maxcol, maxcol - 2) restlines = [alltext[(maxcol - 2)*i + maxcol:(maxcol - 2)*i + 2*maxcol - 2] for i in range(fulllines + bool(rest))] return [firstline] + [self.prefix + " " + i for i in restlines] @override def rows(self, size: tuple[int], focus: bool = False) -> int: """ :param size: (maxcol,) the number of columns available to this widget :param focus: True if this widget or one of its children is in focus :return: The number of rows required for this widget """ if self.wrap: return len(self._get_wrapped_lines(size[0])) if len(self._get_wrapped_lines(size[0])) > 1: return 2 else: return 1 @override def render(self, size: tuple[int], focus: bool = False) -> urwid.Canvas: """ :param size: (maxcol,) the number of columns available to this widget :param focus: True if this widget or one of its children is in focus :return: A Canvas subclass instance containing the rendered content of this widget """ from pudb.ui_tools import make_canvas maxcol = size[0] if focus: apfx = "focused "+self.attr_prefix+" " else: apfx = self.attr_prefix+" " var_label = self.var_label or "" if self.wrap: text = self._get_wrapped_lines(maxcol) extralabel_full, extralabel_rem = divmod( text_width(var_label[maxcol:]), maxcol) totallen = sum(text_width(i) for i in text) labellen = ( len(self.prefix) # Padding of first line + (len(self.prefix) + 2) # Padding of subsequent lines * (extralabel_full + bool(extralabel_rem)) + text_width(var_label) + 1 # for ":" ) attr_ = [(apfx+"label", labellen), (apfx+"value", totallen - labellen)] from urwid.util import rle_subseg fullcols, rem = divmod(totallen, maxcol) attr = [rle_subseg(attr_, i*maxcol, (i + 1)*maxcol) for i in range(fullcols + bool(rem))] return make_canvas(text, attr, maxcol, apfx+"value") lprefix = len(self.prefix) if self.value_str is not None: if self.var_label is not None: if len(self._get_wrapped_lines(maxcol)) > 1: # label too long? generate separate value line text = [self.prefix + self.var_label + ":", self.prefix+" " + self.value_str] attr = [ [(apfx+"label", lprefix+text_width(self.var_label))], [(apfx+"value", lprefix+3+text_width(self.value_str))] ] else: text = [self.prefix + self.var_label + ": " + self.value_str] attr = [[ (apfx+"label", lprefix+text_width(self.var_label)+1), (apfx+"value", text_width(self.value_str)+1), ]] else: text = [self.prefix + self.value_str] attr = [[ (apfx+"label", len(self.prefix)), (apfx+"value", text_width(self.value_str)), ]] else: assert self.var_label is not None text = [self.prefix + self.var_label] attr = [[(apfx+"label", lprefix + text_width(self.var_label)), ]] # Ellipses to show text was cut off # encoding = urwid.util.detected_encoding for i in range(len(text)): if text_width(text[i]) > maxcol: text[i] = text[i][:maxcol-3] + "..." return make_canvas(text, attr, maxcol, apfx+"value") def keypress(self, size, key): return key # }}} # {{{ stringifiers BASIC_TYPES = ( type(None), int, str, float, complex, ) # {{{ safe types def get_str_safe_types(): import types return ( *[ getattr(types, s) for s in ("BuiltinFunctionType BuiltinMethodType ClassType " "CodeType FileType FrameType FunctionType GetSetDescriptorType " "LambdaType MemberDescriptorType MethodType ModuleType " "SliceType TypeType TracebackType UnboundMethodType XRangeType" ).split() if hasattr(types, s)], WatchEvalError) STR_SAFE_TYPES = get_str_safe_types() # }}} def default_stringifier(value: object): if isinstance(value, BASIC_TYPES): return repr(value) if HAVE_NUMPY and isinstance(value, numpy.ndarray): return f"{type(value).__name__}({value.dtype}) {value.shape}" elif HAVE_NUMPY and isinstance(value, numpy.number): return str(f"{value} ({value.dtype})") elif isinstance(value, STR_SAFE_TYPES): try: return str(value) except Exception: message = "string safe type stringifier failed" ui_log.exception(message) return f"!! {message} !!" elif hasattr(type(value), "safely_stringify_for_pudb"): try: # (E.g.) Mock objects will pretend to have this # and return nonsense. result = cast("str", value.safely_stringify_for_pudb()) # pyright: ignore[reportUnknownMemberType, reportAttributeAccessIssue] except Exception: message = "safely_stringify_for_pudb call failed" ui_log.exception(message) result = f"!! {message} !!" if isinstance(result, str): return str(result) elif isinstance(value, Sized): try: # Example: numpy arrays with shape == () raise on len() obj_len = len(value) except TypeError: pass else: return f"{type(value).__name__} ({obj_len})" return str(type(value).__name__) def type_stringifier(value: object): return str(type(value).__name__) def id_stringifier(obj: object): return f"{id(obj):#x}" def error_stringifier(_: object) -> str: return "ERROR: Invalid custom stringifier file." custom_stringifier_dict = {} STRINGIFIERS: dict[Stringifier, Callable[[object], str]] = { "default": default_stringifier, "type": type_stringifier, "repr": repr, "str": str, "id": id_stringifier, } def get_stringifier(iinfo: InspectInfo) -> Callable[[object], str]: """ :return: a function that turns an object into a Unicode text object. """ try: return STRINGIFIERS[iinfo.display_type] except KeyError: if "" == iinfo.display_type.strip(): return lambda _: "ERROR: custom stringifier is not set" try: if not custom_stringifier_dict: # Only execfile once from os.path import expanduser, expandvars custom_stringifier_fname = expanduser(expandvars(iinfo.display_type)) with open(custom_stringifier_fname) as inf: exec(compile(inf.read(), custom_stringifier_fname, "exec"), custom_stringifier_dict, custom_stringifier_dict) except FileNotFoundError: ui_log.error( "Unable to locate custom stringifier file " f"{iinfo.display_type!r}" ) return error_stringifier except Exception: ui_log.exception("Error when importing custom stringifier") return error_stringifier else: if "pudb_stringifier" not in custom_stringifier_dict: ui_log.error(f"{iinfo.display_type} does not contain a function " "named pudb_stringifier at the module level.") return lambda value: str( "ERROR: Invalid custom stringifier file: " "pudb_stringifier not defined.") else: return (lambda value: str(custom_stringifier_dict["pudb_stringifier"](value))) # }}} # {{{ tree walking class ValueWalker(ABC): EMPTY_LABEL = "" CONTINUATION_LABEL = "[...]" def __init__(self, frame_var_info): self.frame_var_info = frame_var_info @abstractmethod def add_item(self, parent, var_label, value_str, id_path, attr_prefix=None): pass def add_continuation_item(self, parent: VariableWidget, id_path: str, count: int, length: int) -> bool: """ :arg length: the total length of the container. Negative if not known. :returns: True if a continuation item ("[...]") was added, else False. If a continuation item was added, no further entries in the container should be added. If no continuation item was added, continue adding entries from the container. """ cont_id_path = "%s.cont-%d" % (id_path, count) if not self.frame_var_info.get_inspect_info( cont_id_path, read_only=True).show_detail: if length > 0: omitted = f"{length - count}" else: omitted = "some" self.add_item(parent, self.CONTINUATION_LABEL, f"<{omitted} items omitted, expand to see more>", id_path=cont_id_path) return True return False def walk_container(self, parent: VariableWidget, label: str, value, id_path: str | None = None): try: container_cls = next(cls for cls in CONTAINER_CLASSES if isinstance(value, cls)) except StopIteration: # Not recognized as a container return False is_empty = True for count, (entry_label, entry, id_path_ext) in enumerate( container_cls.entries(value, label)): is_empty = False if count > 0 and count % 10 == 0: try: length = container_cls.length(value) except Exception: length = -1 if self.add_continuation_item(parent, id_path, count, length): return True entry_id_path = f"{id_path}{id_path_ext}" self.walk_value(parent, "[{}]".format(entry_label if entry_label else ""), entry, entry_id_path) if is_empty: self.add_item(parent, self.EMPTY_LABEL, None, id_path=f"{id_path}{self.EMPTY_LABEL}") return True def walk_attributes(self, parent, label, value, id_path, iinfo): try: keys = dir(value) except Exception: ui_log.exception(f"Failed to look up attributes on {label}") return for key in sorted(keys): if iinfo.access_level == "public": if key.startswith("_"): continue elif iinfo.access_level == "private": if key.startswith("__") and key.endswith("__"): continue try: with warnings.catch_warnings(): warnings.simplefilter("ignore") attr_value = getattr(value, key) if inspect.isroutine(attr_value) and not iinfo.show_methods: continue except Exception: attr_value = WatchEvalError() self.walk_value(parent, f".{key}", attr_value, f"{id_path}.{key}") def walk_value(self, parent, label, value, id_path=None, attr_prefix=None): if id_path is None: id_path = label assert isinstance(id_path, str) iinfo = self.frame_var_info.get_inspect_info(id_path, read_only=True) try: displayed_value = get_stringifier(iinfo)(value) except Exception: # Unfortunately, anything can happen when calling str() or # repr() on a random object. displayed_value = type_stringifier(value) \ + f" (!! {iinfo.display_type} error !!)" ui_log.exception("stringifier failed") if iinfo.show_detail: marker = iinfo.access_level[:3] if iinfo.show_methods: marker += "+()" displayed_value += f" [{marker}]" new_parent_item = self.add_item(parent, label, displayed_value, id_path, attr_prefix) if iinfo.show_detail: if isinstance(value, CONTAINER_CLASSES): self.walk_container(new_parent_item, label, value, id_path) self.walk_attributes(new_parent_item, label, value, id_path, iinfo) class BasicValueWalker(ValueWalker): def __init__(self, frame_var_info): ValueWalker.__init__(self, frame_var_info) self.widget_list = [] def add_item(self, parent, var_label, value_str, id_path, attr_prefix=None): iinfo = self.frame_var_info.get_inspect_info(id_path, read_only=True) if iinfo.highlighted: attr_prefix = "highlighted var" new_item = VariableWidget(parent, var_label, value_str, id_path, attr_prefix, iinfo=iinfo) self.widget_list.append(new_item) return new_item class WatchValueWalker(ValueWalker): def __init__(self, frame_var_info, widget_list, watch_expr): ValueWalker.__init__(self, frame_var_info) self.widget_list = widget_list self.watch_expr = watch_expr def add_item(self, parent, var_label, value_str, id_path, attr_prefix=None): iinfo = self.frame_var_info.get_inspect_info(id_path, read_only=True) if iinfo.highlighted: attr_prefix = "highlighted var" new_item = VariableWidget(parent, var_label, value_str, id_path, attr_prefix, watch_expr=self.watch_expr, iinfo=iinfo) self.widget_list.append(new_item) return new_item class TopAndMainVariableWalker(ValueWalker): def __init__(self, frame_var_info): ValueWalker.__init__(self, frame_var_info) self.main_widget_list = [] self.top_widget_list = [] self.top_id_path_prefixes = [] @staticmethod def _should_repeat_at_top(id_path, tipp) -> bool: """ :return: True if the id_path is a child path of tipp """ if id_path is None: return False if id_path == tipp: return True # Perhaps it's a child of the top-level path before, sep, after = id_path.partition(tipp) return (before == "" and sep == tipp and len(after) > 0 and after[0] in ".<[") def add_item(self, parent, var_label, value_str, id_path, attr_prefix=None): iinfo = self.frame_var_info.get_inspect_info(id_path, read_only=True) if iinfo.highlighted: attr_prefix = "highlighted var" repeated_at_top = iinfo.repeated_at_top if repeated_at_top and id_path is not None: self.top_id_path_prefixes.append(id_path) for tipp in self.top_id_path_prefixes: if self._should_repeat_at_top(id_path, tipp): repeated_at_top = True if repeated_at_top: self.top_widget_list.append(VariableWidget(parent, var_label, value_str, id_path, attr_prefix, iinfo=iinfo)) new_item = VariableWidget(parent, var_label, value_str, id_path, attr_prefix, iinfo=iinfo) self.main_widget_list.append(new_item) return new_item # }}} # {{{ top level SEPARATOR = urwid.AttrMap(urwid.Text(""), "variable separator") def make_var_view(frame_var_info, locals, globals): vars = list(locals.keys()) vars.sort(key=str.lower) tmv_walker = TopAndMainVariableWalker(frame_var_info) ret_walker = BasicValueWalker(frame_var_info) watch_widget_list = [] for watch_expr in frame_var_info.watches: try: value = eval(watch_expr.expression, globals, locals) except Exception: value = WatchEvalError() WatchValueWalker(frame_var_info, watch_widget_list, watch_expr) \ .walk_value(None, watch_expr.expression, value) if "__return__" in vars: ret_walker.walk_value(None, "Return", locals["__return__"], attr_prefix="return") for var in vars: if not (var.startswith("__") and var.endswith("__")): tmv_walker.walk_value(None, var, locals[var]) result = tmv_walker.main_widget_list if watch_widget_list: result = ([*watch_widget_list, SEPARATOR, *result]) if tmv_walker.top_widget_list: result = ([*tmv_walker.top_widget_list, SEPARATOR, *result]) if ret_walker.widget_list: result = (ret_walker.widget_list + result) return result class FrameVarInfoKeeper: def __init__(self): self.frame_var_info = {} def get_frame_var_info(self, read_only, ssid=None): if ssid is None: # self.debugger set by subclass ssid = self.debugger.get_stack_situation_id() if read_only: return self.frame_var_info.get(ssid, FrameVarInfo()) else: return self.frame_var_info.setdefault(ssid, FrameVarInfo()) # }}} # vim: foldmethod=marker pudb-2025.1.5/pyproject.toml000066400000000000000000000072311511510750400156160ustar00rootroot00000000000000[build-system] requires = ["hatchling"] build-backend = "hatchling.build" [project] name = "pudb" version = "2025.1.5" description = "A full-screen, console-based Python debugger" readme = "README.rst" license = "MIT" requires-python = "~=3.8" authors = [ { name = "Andreas Kloeckner", email = "inform@tiker.net" }, ] classifiers = [ "Development Status :: 4 - Beta", "Environment :: Console", "Environment :: Console :: Curses", "Intended Audience :: Developers", "Natural Language :: English", "Operating System :: POSIX", "Operating System :: Unix", "Programming Language :: Python", "Programming Language :: Python :: 3", "Topic :: Software Development", "Topic :: Software Development :: Debuggers", "Topic :: Software Development :: Quality Assurance", "Topic :: System :: Recovery Tools", "Topic :: System :: Software Distribution", "Topic :: Terminals", "Topic :: Utilities", ] dependencies = [ "jedi>=0.18,<1", "packaging>=20.0", # https://github.com/inducer/pudb/issues/710 "pygments>=2.19", "urwid>=2.4", # https://github.com/inducer/pudb/issues/707#issuecomment-3468269346 "urwid>=2.5.1", "urwid_readline", "typing_extensions >= 4.13", ] [project.optional-dependencies] completion = [ "shtab", ] [project.scripts] pudb = "pudb.run:main" [tool.hatch.build.targets.sdist] exclude = [ "/.github", "/.gitlab-ci.yml", "/.mailmap", "*~", "/.basedpyright", "/.coveragerc", "/.editorconfig", ] [tool.ruff] preview = true [tool.ruff.lint] extend-select = [ "B", # flake8-bugbear "C", # flake8-comprehensions "E", # pycodestyle "F", # pyflakes "I", # flake8-isort "N", # pep8-naming "NPY", # numpy "Q", # flake8-quotes "W", # pycodestyle "TC", "RUF", "UP", ] extend-ignore = [ "C90", # McCabe complexity "E221", # multiple spaces before operator "E226", # missing whitespace around arithmetic operator "E241", # multiple spaces after comma "E242", # tab after comma "E402", # module level import not at the top of file "N818", # error suffix in exception names # TODO "UP031", # format specifiers instead of % format ] [tool.ruff.lint.flake8-quotes] docstring-quotes = "double" inline-quotes = "double" multiline-quotes = "double" [tool.ruff.lint.isort] combine-as-imports = true known-local-folder = [ "pudb", ] lines-after-imports = 2 required-imports = ["from __future__ import annotations"] [tool.ruff.lint.per-file-ignores] "pudb/themes/*.py" = ["I002"] "debug_me.py" = ["I002"] "doc/conf.py" = ["I002"] "examples/*.py" = ["I002"] "pudb/test/*.py" = ["I002"] "manual-tests/*.py" = ["I002"] [tool.pytest.ini_options] addopts = [ "--ignore=pudb/b.py", "--ignore=pudb/ipython.py", ] [tool.typos.default] extend-ignore-re = [ "(?Rm)^.*(#|//)\\s*spellchecker:\\s*disable-line$" ] [tool.typos.default.extend-words] # Ned Batchelder, person Ned = "Ned" [tool.typos.files] extend-exclude = [ ] [tool.basedpyright] reportImplicitStringConcatenation = "none" reportUnnecessaryIsInstance = "none" reportUnusedCallResult = "none" reportExplicitAny = "none" # This reports even cycles that are qualified by 'if TYPE_CHECKING'. Not what # we care about at this moment. # https://github.com/microsoft/pyright/issues/746 reportImportCycles = "none" ignore = [ "doc/conf.py", ] pythonVersion = "3.8" pythonPlatform = "All" [[tool.basedpyright.executionEnvironments]] root = "examples" reportUnknownArgumentType = "hint" reportUnknownMemberType = "hint" reportUnknownVariableType = "hint" reportMissingImports = "hint" reportMissingTypeStubs = "hint" pudb-2025.1.5/requirements.dev.txt000066400000000000000000000000741511510750400167410ustar00rootroot00000000000000coverage Pygments pytest pytest-cov pytest-mock urwid numpy pudb-2025.1.5/try-the-debugger.sh000077500000000000000000000001601511510750400164110ustar00rootroot00000000000000#! /bin/sh if test "$1" = ""; then PYINTERP="python3" else PYINTERP="$1" fi $PYINTERP -m pudb debug_me.py