crosshair-tool 0.0.95__cp310-cp310-macosx_10_9_universal2.whl → 0.0.97__cp310-cp310-macosx_10_9_universal2.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of crosshair-tool might be problematic. Click here for more details.

Files changed (46) hide show
  1. _crosshair_tracers.cpython-310-darwin.so +0 -0
  2. crosshair/__init__.py +1 -1
  3. crosshair/_tracers_test.py +5 -5
  4. crosshair/codeconfig.py +3 -2
  5. crosshair/condition_parser.py +1 -0
  6. crosshair/condition_parser_test.py +0 -2
  7. crosshair/core.py +8 -9
  8. crosshair/core_test.py +2 -3
  9. crosshair/diff_behavior_test.py +0 -2
  10. crosshair/dynamic_typing.py +3 -3
  11. crosshair/enforce.py +1 -0
  12. crosshair/examples/check_examples_test.py +1 -0
  13. crosshair/fnutil.py +2 -3
  14. crosshair/fnutil_test.py +1 -4
  15. crosshair/fuzz_core_test.py +9 -1
  16. crosshair/libimpl/arraylib.py +1 -1
  17. crosshair/libimpl/builtinslib.py +77 -24
  18. crosshair/libimpl/builtinslib_ch_test.py +15 -5
  19. crosshair/libimpl/builtinslib_test.py +38 -1
  20. crosshair/libimpl/collectionslib_test.py +4 -4
  21. crosshair/libimpl/datetimelib.py +1 -3
  22. crosshair/libimpl/datetimelib_ch_test.py +5 -5
  23. crosshair/libimpl/encodings/_encutil.py +11 -6
  24. crosshair/libimpl/functoolslib.py +8 -2
  25. crosshair/libimpl/functoolslib_test.py +22 -6
  26. crosshair/libimpl/relib.py +1 -1
  27. crosshair/libimpl/unicodedatalib_test.py +3 -3
  28. crosshair/main.py +5 -3
  29. crosshair/opcode_intercept.py +45 -17
  30. crosshair/path_cover.py +5 -1
  31. crosshair/pathing_oracle.py +40 -3
  32. crosshair/pathing_oracle_test.py +21 -0
  33. crosshair/register_contract.py +1 -0
  34. crosshair/register_contract_test.py +2 -4
  35. crosshair/simplestructs.py +10 -8
  36. crosshair/statespace.py +74 -19
  37. crosshair/statespace_test.py +16 -0
  38. crosshair/tools/generate_demo_table.py +2 -2
  39. crosshair/tracers.py +8 -6
  40. crosshair/util.py +6 -6
  41. {crosshair_tool-0.0.95.dist-info → crosshair_tool-0.0.97.dist-info}/METADATA +4 -5
  42. {crosshair_tool-0.0.95.dist-info → crosshair_tool-0.0.97.dist-info}/RECORD +46 -45
  43. {crosshair_tool-0.0.95.dist-info → crosshair_tool-0.0.97.dist-info}/WHEEL +0 -0
  44. {crosshair_tool-0.0.95.dist-info → crosshair_tool-0.0.97.dist-info}/entry_points.txt +0 -0
  45. {crosshair_tool-0.0.95.dist-info → crosshair_tool-0.0.97.dist-info}/licenses/LICENSE +0 -0
  46. {crosshair_tool-0.0.95.dist-info → crosshair_tool-0.0.97.dist-info}/top_level.txt +0 -0
crosshair/statespace.py CHANGED
@@ -46,7 +46,7 @@ from crosshair.util import (
46
46
  in_debug,
47
47
  name_of_type,
48
48
  )
49
- from crosshair.z3util import z3Aassert, z3Not, z3PopNot
49
+ from crosshair.z3util import z3Aassert, z3Not, z3Or, z3PopNot
50
50
 
51
51
 
52
52
  @functools.total_ordering
@@ -219,7 +219,7 @@ class StateSpaceCounter(Counter):
219
219
 
220
220
 
221
221
  class AbstractPathingOracle:
222
- def pre_path_hook(self, root: "RootNode") -> None:
222
+ def pre_path_hook(self, space: "StateSpace") -> None:
223
223
  pass
224
224
 
225
225
  def post_path_hook(self, path: Sequence["SearchTreeNode"]) -> None:
@@ -350,6 +350,7 @@ def solver_is_sat(solver, *exprs) -> bool:
350
350
  ret = solver.check(*exprs)
351
351
  if ret == z3.unknown:
352
352
  debug("Z3 Unknown satisfiability. Reason:", solver.reason_unknown())
353
+ debug("Call stack at time of unknown sat:", ch_stack())
353
354
  if solver.reason_unknown() == "interrupted from keyboard":
354
355
  raise KeyboardInterrupt
355
356
  if exprs:
@@ -427,7 +428,7 @@ class RootNode(SinglePathNode):
427
428
  )
428
429
  from crosshair.pathing_oracle import CoveragePathingOracle # circular import
429
430
 
430
- self.pathing_oracle = CoveragePathingOracle()
431
+ self.pathing_oracle: AbstractPathingOracle = CoveragePathingOracle()
431
432
  self.iteration = 0
432
433
 
433
434
 
@@ -704,6 +705,17 @@ def debug_path_tree(node, highlights, prefix="") -> List[str]:
704
705
  return [f"{prefix} -> {str(node)} {node.stats()}"]
705
706
 
706
707
 
708
+ def make_default_solver() -> z3.Solver:
709
+ """Create a new solver with default settings."""
710
+ smt_tactic = z3.Tactic("smt")
711
+ solver = smt_tactic.solver()
712
+ solver.set("mbqi", True)
713
+ # turn off every randomization thing we can think of:
714
+ solver.set("random-seed", 42)
715
+ solver.set("smt.random-seed", 42)
716
+ return solver
717
+
718
+
707
719
  class StateSpace:
708
720
  """Holds various information about the SMT solver's current state."""
709
721
 
@@ -717,18 +729,12 @@ class StateSpace:
717
729
  model_check_timeout: float,
718
730
  search_root: RootNode,
719
731
  ):
720
- smt_tactic = z3.Tactic("smt")
721
- self.solver = smt_tactic.solver()
732
+ self.solver = make_default_solver()
722
733
  if model_check_timeout < 1 << 63:
723
734
  self.smt_timeout: Optional[int] = int(model_check_timeout * 1000 + 1)
724
735
  self.solver.set(timeout=self.smt_timeout)
725
736
  else:
726
737
  self.smt_timeout = None
727
- self.solver.set(mbqi=True)
728
- # turn off every randomization thing we can think of:
729
- self.solver.set("random-seed", 42)
730
- self.solver.set("smt.random-seed", 42)
731
- # self.solver.set('randomize', False)
732
738
  self.choices_made: List[SearchTreeNode] = []
733
739
  self.status_cap: Optional[VerificationStatus] = None
734
740
  self.heaps: List[List[Tuple[z3.ExprRef, Type, object]]] = [[]]
@@ -745,7 +751,7 @@ class StateSpace:
745
751
  self._deferred_assumptions = []
746
752
  assert search_root.iteration is not None
747
753
  search_root.iteration += 1
748
- search_root.pathing_oracle.pre_path_hook(search_root)
754
+ search_root.pathing_oracle.pre_path_hook(self)
749
755
 
750
756
  def add(self, expr) -> None:
751
757
  with NoTracing():
@@ -1012,7 +1018,7 @@ class StateSpace:
1012
1018
  ) -> object:
1013
1019
  with NoTracing():
1014
1020
  # TODO: needs more testing
1015
- for (curref, curtyp, curval) in self.heaps[snapshot]:
1021
+ for curref, curtyp, curval in self.heaps[snapshot]:
1016
1022
 
1017
1023
  # TODO: using unify() is almost certainly wrong; just because the types
1018
1024
  # have some instances in common does not mean that `curval` actually
@@ -1049,6 +1055,51 @@ class StateSpace:
1049
1055
  self.next_uniq += 1
1050
1056
  return "_{:x}".format(self.next_uniq)
1051
1057
 
1058
+ @assert_tracing(False)
1059
+ def smt_fanout(
1060
+ self,
1061
+ exprs_and_results: Sequence[Tuple[z3.ExprRef, object]],
1062
+ desc: str,
1063
+ weights: Optional[Sequence[float]] = None,
1064
+ none_of_the_above_weight: float = 0.0,
1065
+ ):
1066
+ """Performs a weighted binary search over the given SMT expressions."""
1067
+ exprs = [e for (e, _) in exprs_and_results]
1068
+ final_weights = [1.0] * len(exprs) if weights is None else weights
1069
+ if CROSSHAIR_EXTRA_ASSERTS:
1070
+ if len(final_weights) != len(exprs):
1071
+ raise CrossHairInternal("inconsistent smt_fanout exprs and weights")
1072
+ if not all(0 < w for w in final_weights):
1073
+ raise CrossHairInternal("smt_fanout weights must be greater than zero")
1074
+ if not self.is_possible(z3Or(*exprs)):
1075
+ raise CrossHairInternal(
1076
+ "no smt_fanout option is possible: " + repr(exprs)
1077
+ )
1078
+ if self.is_possible(z3Not(z3Or(*exprs))):
1079
+ raise CrossHairInternal(
1080
+ "smt_fanout options are not exhaustive: " + repr(exprs)
1081
+ )
1082
+
1083
+ def attempt(start: int, end: int):
1084
+ size = end - start
1085
+ if size == 1:
1086
+ return exprs_and_results[start][1]
1087
+ mid = (start + end) // 2
1088
+ left_exprs = exprs[start:mid]
1089
+ left_weight = sum(final_weights[start:mid])
1090
+ right_weight = sum(final_weights[mid:end])
1091
+ if self.smt_fork(
1092
+ z3Or(*left_exprs),
1093
+ probability_true=left_weight / (left_weight + right_weight),
1094
+ desc=f"{desc}_fan_size_{size}",
1095
+ ):
1096
+ return attempt(start, mid)
1097
+ else:
1098
+ return attempt(mid, end)
1099
+
1100
+ return attempt(0, len(exprs))
1101
+
1102
+ @assert_tracing(False)
1052
1103
  def smt_fork(
1053
1104
  self,
1054
1105
  expr: Optional[z3.ExprRef] = None,
@@ -1062,6 +1113,14 @@ class StateSpace:
1062
1113
  def defer_assumption(self, description: str, checker: Callable[[], bool]) -> None:
1063
1114
  self._deferred_assumptions.append((description, checker))
1064
1115
 
1116
+ def extend_timeouts(
1117
+ self, constant_factor: float = 0.0, smt_multiple: Optional[float] = None
1118
+ ) -> None:
1119
+ self.execution_deadline += constant_factor
1120
+ if self.smt_timeout is not None and smt_multiple is not None:
1121
+ self.smt_timeout = int(self.smt_timeout * smt_multiple)
1122
+ self.solver.set(timeout=self.smt_timeout)
1123
+
1065
1124
  def detach_path(self, currently_handling: Optional[BaseException] = None) -> None:
1066
1125
  """
1067
1126
  Mark the current path exhausted.
@@ -1075,13 +1134,9 @@ class StateSpace:
1075
1134
  if self.is_detached:
1076
1135
  debug("Path is already detached")
1077
1136
  return
1078
- else:
1079
- # Give ourselves a time extension for deferred assumptions and
1080
- # (likely) counterexample generation to follow.
1081
- self.execution_deadline += 4.0
1082
- if self.smt_timeout is not None:
1083
- self.smt_timeout = self.smt_timeout * 2
1084
- self.solver.set(timeout=self.smt_timeout)
1137
+ # Give ourselves a time extension for deferred assumptions and
1138
+ # (likely) counterexample generation to follow.
1139
+ self.extend_timeouts(constant_factor=4.0, smt_multiple=2.0)
1085
1140
  for description, checker in self._deferred_assumptions:
1086
1141
  with ResumedTracing():
1087
1142
  check_ret = checker()
@@ -81,3 +81,19 @@ def test_model_value_to_python_AlgebraicNumRef():
81
81
  rt2 = z3.simplify(z3.Sqrt(2))
82
82
  assert type(rt2) == z3.AlgebraicNumRef
83
83
  model_value_to_python(rt2)
84
+
85
+
86
+ def test_smt_fanout(space: SimpleStateSpace):
87
+ option1 = z3.Bool("option1")
88
+ option2 = z3.Bool("option2")
89
+ space.add(z3.Xor(option1, option2)) # Ensure exactly one option can be set
90
+ exprs_and_results = [(option1, "result1"), (option2, "result2")]
91
+
92
+ result = space.smt_fanout(exprs_and_results, desc="choose_one")
93
+ assert result in ("result1", "result2")
94
+ if result == "result1":
95
+ assert space.is_possible(option1)
96
+ assert not space.is_possible(option2)
97
+ else:
98
+ assert not space.is_possible(option1)
99
+ assert space.is_possible(option2)
@@ -107,7 +107,7 @@ def divide_stdlib_module(
107
107
  modulename: str, items: list[tuple[str, str, str]]
108
108
  ) -> dict[str, list[tuple[str, str, str]]]:
109
109
  ret = defaultdict(list)
110
- for (name, color, src) in items:
110
+ for name, color, src in items:
111
111
  if name.endswith("_method"):
112
112
  name = name.removesuffix("_method")
113
113
  (classname, methodname) = name.split("_", 1)
@@ -120,7 +120,7 @@ def divide_stdlib_module(
120
120
 
121
121
 
122
122
  stdlib = {}
123
- for (modulename, items) in stdlib_demos().items():
123
+ for modulename, items in stdlib_demos().items():
124
124
  stdlib[modulename] = divide_stdlib_module(modulename, items)
125
125
 
126
126
 
crosshair/tracers.py CHANGED
@@ -156,12 +156,14 @@ _CALL_HANDLERS: Dict[int, Callable[[object], CallStackInfo]] = {
156
156
  CALL_KW: handle_call_kw,
157
157
  CALL_FUNCTION: handle_call_function,
158
158
  CALL_FUNCTION_KW: handle_call_function_kw,
159
- CALL_FUNCTION_EX: handle_call_function_ex_3_14
160
- if sys.version_info >= (3, 14)
161
- else (
162
- handle_call_function_ex_3_13
163
- if sys.version_info >= (3, 13)
164
- else handle_call_function_ex_3_6
159
+ CALL_FUNCTION_EX: (
160
+ handle_call_function_ex_3_14
161
+ if sys.version_info >= (3, 14)
162
+ else (
163
+ handle_call_function_ex_3_13
164
+ if sys.version_info >= (3, 13)
165
+ else handle_call_function_ex_3_6
166
+ )
165
167
  ),
166
168
  CALL_METHOD: handle_call_method,
167
169
  }
crosshair/util.py CHANGED
@@ -368,7 +368,7 @@ def format_boundargs_as_dictionary(bound_args: BoundArguments) -> str:
368
368
 
369
369
  def format_boundargs(bound_args: BoundArguments) -> str:
370
370
  arg_strings: List[str] = []
371
- for (name, param) in bound_args.signature.parameters.items():
371
+ for name, param in bound_args.signature.parameters.items():
372
372
  param_kind = param.kind
373
373
  vals = bound_args.arguments.get(name, param.default)
374
374
  if param_kind == Parameter.VAR_POSITIONAL:
@@ -503,9 +503,9 @@ class EvalFriendlyReprContext:
503
503
  oid = id(obj)
504
504
  typ = type(obj)
505
505
  if obj in instance_overrides:
506
- repr_fn: Callable[
507
- [Any], Union[str, ReferencedIdentifier]
508
- ] = instance_overrides[obj]
506
+ repr_fn: Callable[[Any], Union[str, ReferencedIdentifier]] = (
507
+ instance_overrides[obj]
508
+ )
509
509
  elif typ == float:
510
510
  if math.isfinite(obj):
511
511
  repr_fn = repr
@@ -543,7 +543,7 @@ class EvalFriendlyReprContext:
543
543
  counts = collections.Counter(re.compile(r"\b_ch_efr_\d+_\b").findall(output))
544
544
  assignment_remaps = {}
545
545
  nextvarnum = 1
546
- for (varname, count) in counts.items():
546
+ for varname, count in counts.items():
547
547
  if count > 1:
548
548
  assignment_remaps[varname + ":="] = f"v{nextvarnum}:="
549
549
  assignment_remaps[varname] = f"v{nextvarnum}"
@@ -625,7 +625,7 @@ class DynamicScopeVar(Generic[_T]):
625
625
 
626
626
  class AttributeHolder:
627
627
  def __init__(self, attrs: Mapping[str, object]):
628
- for (k, v) in attrs.items():
628
+ for k, v in attrs.items():
629
629
  self.__dict__[k] = v
630
630
 
631
631
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: crosshair-tool
3
- Version: 0.0.95
3
+ Version: 0.0.97
4
4
  Summary: Analyze Python code for correctness using symbolic execution.
5
5
  Home-page: https://github.com/pschanely/CrossHair
6
6
  Author: Phillip Schanely
@@ -8,7 +8,6 @@ Author-email: pschanely+vE7F@gmail.com
8
8
  License: MIT
9
9
  Classifier: Development Status :: 3 - Alpha
10
10
  Classifier: Intended Audience :: Developers
11
- Classifier: License :: OSI Approved :: MIT License
12
11
  Classifier: Operating System :: OS Independent
13
12
  Classifier: Programming Language :: Python :: 3
14
13
  Classifier: Programming Language :: Python :: 3.8
@@ -32,14 +31,14 @@ Requires-Dist: pygls>=1.0.0
32
31
  Requires-Dist: typeshed-client>=2.0.5
33
32
  Provides-Extra: dev
34
33
  Requires-Dist: autodocsumm<1,>=0.2.2; extra == "dev"
35
- Requires-Dist: black==22.3.0; extra == "dev"
34
+ Requires-Dist: black==25.9.0; extra == "dev"
36
35
  Requires-Dist: deal>=4.13.0; extra == "dev"
37
36
  Requires-Dist: icontract>=2.4.0; extra == "dev"
38
37
  Requires-Dist: isort==5.11.5; extra == "dev"
39
- Requires-Dist: mypy==0.990; extra == "dev"
38
+ Requires-Dist: mypy==1.18.1; extra == "dev"
40
39
  Requires-Dist: numpy==1.23.4; python_version < "3.12" and extra == "dev"
41
40
  Requires-Dist: numpy==1.26.0; (python_version >= "3.12" and python_version < "3.13") and extra == "dev"
42
- Requires-Dist: numpy==2.0.1; python_version >= "3.13" and extra == "dev"
41
+ Requires-Dist: numpy==2.3.3; python_version >= "3.13" and extra == "dev"
43
42
  Requires-Dist: pre-commit~=2.20; extra == "dev"
44
43
  Requires-Dist: pytest; extra == "dev"
45
44
  Requires-Dist: pytest-xdist; extra == "dev"
@@ -1,4 +1,4 @@
1
- _crosshair_tracers.cpython-310-darwin.so,sha256=JHV0bgakIST_adsQVyEyAFBTmYbwQIPLqpZfGbxr0l4,89680
1
+ _crosshair_tracers.cpython-310-darwin.so,sha256=-COSqVIuggpGq9yAE_o_GCOApHseOG4kVBkQQ-OpfZI,89680
2
2
  crosshair/_tracers_pycompat.h,sha256=6IYnbQxrYkhBsLDAHSX25DPOwo1oYHCZUVWZ8c7YCnQ,14356
3
3
  crosshair/pure_importer.py,sha256=-t4eowrZOQmfqK1N2tjI5POoaxRGavytwMmbRivelFg,878
4
4
  crosshair/options.py,sha256=htQNgnrpoRjSNq6rfLBAF8nos-NNIwmP6tQYyI8ugsM,6775
@@ -6,77 +6,78 @@ crosshair/lsp_server_test.py,sha256=7LO1Qqxkper3Xt2krgOlGqF1O_uDObo76o4FZbIqykY,
6
6
  crosshair/conftest.py,sha256=BkLszApkdy6FrvzaHO7xh8_BJrG9AfytFTse-HuQVvg,653
7
7
  crosshair/copyext_test.py,sha256=uJzdC9m2FqMjqQ-ITFoP0MZg3OCiO8paU-d533KocD8,2108
8
8
  crosshair/objectproxy.py,sha256=1cO_ApA0AKPfCRu6MIsxUOKUUEGn0b1U4IHxTC4nDGI,9790
9
+ crosshair/pathing_oracle_test.py,sha256=6k9-8kAbTFUvxhEKSE5NPntEW2qMWkQi4zac_U1kYxY,725
9
10
  crosshair/objectproxy_test.py,sha256=UJuO_jUt8_OEUtgQWyhlekPOdvtM8IQ5M9I_1AqXPWM,1081
10
11
  crosshair/stubs_parser.py,sha256=rlBTQus5BlZ3Ygg6Xzk5dbQbDtRpv6w9i2HQmGrPVmc,14240
11
12
  crosshair/_preliminaries_test.py,sha256=r2PohNNMfIkDqsnvI6gKlJTbwBaZA9NQJueQfJMN2Eo,504
12
13
  crosshair/dynamic_typing_test.py,sha256=8p4NOJ6i9q9mozgCYlZP3VCs-TFMDaE_7W-TyNEse4o,5907
13
- crosshair/enforce.py,sha256=FsZx3D-KtGrhb8xdAZbPUtwvVmEu8IAn7rwf7tmkrRY,10010
14
+ crosshair/enforce.py,sha256=YVze7uYfR_bM1jUvDlU-8cF4cphRRfe78exNZ1xXtuI,10011
14
15
  crosshair/path_search_test.py,sha256=7cqzAMXUYAtA00mq9XR5AaZChqeQyXyCfuuv53_51pk,1692
15
- crosshair/condition_parser.py,sha256=oquaht026eZUigh2lyaFLXYDbmENdBKjddszx0a-B3w,42647
16
- crosshair/util.py,sha256=sIfaKFvNHR5w5VCno2d15d_LyfwoewKqRzJ_3ZNV-Vc,22218
17
- crosshair/dynamic_typing.py,sha256=ANq42kxSQ5B0STZF3uwOEys_fLCj20cMCCcBH6dbXWo,12758
18
- crosshair/register_contract.py,sha256=EnDAxngJhKvJLFdw5kVgqaYDQ5hAZXKwAGBdXpot-AQ,10386
19
- crosshair/tracers.py,sha256=_jaSDgZ_pYdqacWE_msXn7W7CoSdQ_-7hlrxa891oHo,17139
16
+ crosshair/condition_parser.py,sha256=C7S_IogPTDSB-NPGRgJ_CzuWF9YCzGsm6mc37VBo6lY,42684
17
+ crosshair/util.py,sha256=pfBTBNhqMuaoUvAaFZal4LqVEMzWlzmcobHTxp_ZrlE,22214
18
+ crosshair/dynamic_typing.py,sha256=JMcEX5HMMm9u0_lLtZI1jrAw9HGZqXyq8IYGQP4KYSc,12752
19
+ crosshair/register_contract.py,sha256=4p99KAUhu1k-OctIT6WX2YFbVaMCV6BDEULNvQFONGE,10387
20
+ crosshair/tracers.py,sha256=UX-JKKjggQ0_EDh0AGNf4b_2ku9SD9pWgRyFcJDAVpc,17179
20
21
  crosshair/_tracers.h,sha256=QFBklLqMWmIpUzBIn_A4SKdpjwHs-N7ttx-F5jtWWCQ,2174
21
22
  crosshair/type_repo.py,sha256=x_eK-YlcHv_dxDKy6m7ty0zNO6y058o3r6QJ55RcG3s,4664
22
- crosshair/fnutil.py,sha256=X80bD2Lh4QAh-rF561r3JRxjxcuZepF3hJaxaj1GG9s,13123
23
+ crosshair/fnutil.py,sha256=Xs0xJPcQm0z3tWQDjd_I-ainWHTxcT61dv8A3CY3--8,13109
23
24
  crosshair/unicode_categories.py,sha256=g4pnUPanx8KkpwI06ZUGx8GR8Myruf_EpTjyti_V4z8,333519
24
25
  crosshair/copyext.py,sha256=GBGQP9YAHoezLXwb_M59Hh1VXSou5EQt4ZmmUA0T_og,4899
25
- crosshair/_tracers_test.py,sha256=KpCGspjOUeZuhwTYgn_RxI4M4wMbT5rldusFDgneQ6M,3596
26
- crosshair/__init__.py,sha256=nR2D8DuGMw_J17BMCTn9eHoipZzO7JmRusDfFoLt41k,936
27
- crosshair/core.py,sha256=7CHbmWvCVK2MlKXJUUe3eILPWGZniF8qXkBJNDkU4qg,64168
28
- crosshair/path_cover.py,sha256=wV0Vy8IPDzqXQ2VI8a94FxltS9p-Y1oF17OKePjvpgs,6710
26
+ crosshair/_tracers_test.py,sha256=7rrK0djASmRAlWcH4SiJqrWN7hk3oB_rYwhUG4gjxm4,3645
27
+ crosshair/__init__.py,sha256=7ph2S2-0_w1V5foTkyDqlkF63lSBFZ_QR10iQNgoKH0,936
28
+ crosshair/core.py,sha256=HqelePQQYES9SS36qR9mGEEeKcvEFrIHGg-8OG5i-Kg,64252
29
+ crosshair/path_cover.py,sha256=TCofZ9D5q7hpEIOnifp53BvY_YyPpZZC-heZw_NuTOQ,6838
29
30
  crosshair/enforce_test.py,sha256=C6CQ4P1FjkdIJeJg3aJynp1iLDCE6BFCEVtSqXbvmQk,4665
30
31
  crosshair/test_util.py,sha256=D9-f-DdzJemfAUkQL0cwKxPL8RZ-5gkVmghyRcKlBJI,10367
31
- crosshair/core_test.py,sha256=540ASl3zOQf3AnZORGJus4PMYHP5YM15zTWhNI16Dew,33009
32
- crosshair/codeconfig.py,sha256=GgF-ND8Ha3FysSTQ-JuezHjlhGVBbo5aCJov1Ps3VSE,3959
32
+ crosshair/core_test.py,sha256=P-r-qzHPZ2yLmSBZByYPccJZfxYi2ZCwn9o1mEfzRe8,33019
33
+ crosshair/codeconfig.py,sha256=TaIdOKxykpk6YeTtO_Xwsa3IDBTP6g3UGkFBt0PTDR4,3959
33
34
  crosshair/util_test.py,sha256=_KTQ0O4cLhF1pAeB8Y8Cyqbd0UyZf5KxJUaiA-ew-tE,4676
34
35
  crosshair/watcher_test.py,sha256=Ef1YSwy68wWPR5nPjwvEKPqxltI9pE9lTbnesmDy3Bk,2764
35
36
  crosshair/auditwall.py,sha256=sqOmfXQLgmGfWS7b8SmVv66eFM2owaGn-4Ppq453VLI,5138
36
37
  crosshair/simplestructs_test.py,sha256=6uDdrSISHLhwnFuESkR8mUGw7m1llM6vCNDFChkfSs8,8639
37
38
  crosshair/z3util_test.py,sha256=CZovn4S9mYcG_yQegcxm80VHrvUdvNei0gvGTF9TOrk,173
38
39
  crosshair/diff_behavior.py,sha256=_5X_pTN0_-rSPrh8dfpODJG_phFMn7fWc-_zLgO3UTk,11253
39
- crosshair/condition_parser_test.py,sha256=eUQYnVkHewn8qg-XbzcElb0mHkPxPJAX548dPVyxqqk,15532
40
+ crosshair/condition_parser_test.py,sha256=UcgxzqrBLUMScif_RrgHvrhjzWx1KUPgAQOEmfJw7lc,15500
40
41
  crosshair/pure_importer_test.py,sha256=Xjtlwn1mj7g-6VA87lrvzfUADCjlmn1wgHtbrnc0uuY,421
41
- crosshair/fnutil_test.py,sha256=wXtfIxAupRm0KUzKob8luEsNI4YegBQUfwz7msWbfHY,2186
42
+ crosshair/fnutil_test.py,sha256=cLHJ9uhQf797sTxuh4BGgQ0Fo5rcQFStkiPbzQPhIXA,2091
42
43
  crosshair/stubs_parser_test.py,sha256=0itTT0Udul_51RJXNv6KB97z44gYze6NZfKJL7yIDzA,1228
43
44
  crosshair/options_test.py,sha256=lzA-XtwEwQPa4wV1wwhCRKhyLOvIhThU9WK5QRaRbxQ,379
44
45
  crosshair/patch_equivalence_test.py,sha256=eoLaGRvrR9nGUO_ybZ9XsWhs5ejC4IEPd0k-ihG3Nsg,2580
45
46
  crosshair/abcstring.py,sha256=ROU8LzS7kfEU2L_D3QfhVxIjrYr1VctwUWfylC7KlCc,6549
46
47
  crosshair/_mark_stacks.h,sha256=j86qubOUvVhoR19d74iQ084RrTEq8M6oT4wJsGQUySY,28678
47
- crosshair/fuzz_core_test.py,sha256=q7WsZt6bj5OJrXaVsT3JaRYWWnL8X_1flSfty4Z7CcA,16903
48
+ crosshair/fuzz_core_test.py,sha256=bLzdHBROzX3P3cfBeDTY9bJbfhe-CCoeLOF4Mt31wm0,17443
48
49
  crosshair/unicode_categories_test.py,sha256=ZAU37IDGm9PDvwy_CGFcrF9Waa8JuUNdI4aq74wkB6c,739
49
- crosshair/statespace_test.py,sha256=LOblIarBbcB9oD_gVR5kK_4P2PWQymVGgJr3wNqP3Fs,2621
50
+ crosshair/statespace_test.py,sha256=Eq7LNpjradHyCoCKU91Fxmo9DUpK2Mk4PyxxiAEp-Yk,3211
50
51
  crosshair/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
52
  crosshair/lsp_server.py,sha256=j7SX4pdVwa2MrtkNIjajLilzl5CZTY6PrBQsa26cdNo,8670
52
53
  crosshair/path_search.py,sha256=wwZjp-3E4dENnJa6BlnSq8FARkIx0PyUYc7kvH32A2k,5588
53
54
  crosshair/auditwall_test.py,sha256=VPcw_OW3nl3BkOZY4wEEtVDyTamdgqD4IjRccI2p5vI,2030
54
55
  crosshair/smtlib_test.py,sha256=edzEn19u2YYHxSzG9RrMiu2HTiEexAuehC3IlG9LuJM,511
55
- crosshair/register_contract_test.py,sha256=DhvKIcF3LgQfHfUSCccoA11ctCdFaQR263Pc4YUuxyk,4970
56
- crosshair/statespace.py,sha256=TVjUhFZU0x72oLPN7-eRu7PoMh1OiQOy0uMASsFb_Qw,41236
56
+ crosshair/register_contract_test.py,sha256=9AWv9psiAredvcOlK2_pBpsgwIgBbecWyKEEvWiWBSI,4954
57
+ crosshair/statespace.py,sha256=D0Bptt3KMPG8RDzq_numy51sK1Pu_6QqcGKGfXC37s8,43440
57
58
  crosshair/opcode_intercept_test.py,sha256=Si3rJQR5cs5d4uB8uwE2K8MjP8rE1a4yHkjXzhfS10A,9241
58
59
  crosshair/main_test.py,sha256=2xpgNqog__XcYffGcwPeEEmr0Vy4EgVZE8GCAjQnE8U,14834
59
60
  crosshair/codeconfig_test.py,sha256=RnC-RnNpr6If4eHmOepDZ33MCmfyhup08dzHKCm5xWA,3350
60
61
  crosshair/watcher.py,sha256=kCCMlLe2KhW5MbEbMmixNRjRAvu5CypIAGd1V_YZ9QM,10048
61
62
  crosshair/test_util_test.py,sha256=_r8DtAI5b1Yn1ruv9o51FWHmARII3-WDkWWnnY1iaAw,943
62
- crosshair/opcode_intercept.py,sha256=z4Yb9prYE2UK21AxhjAeXyXAk5IriDuCSSCeNhbDu2A,21880
63
- crosshair/simplestructs.py,sha256=CiZSuHH_j_bYitaW-n7vWd_42xSyV6Jh8es3BQLlcHk,34221
63
+ crosshair/opcode_intercept.py,sha256=atmnEDG9oDP0zlkGjJRAsYhD0Aw_PORf4coZZz2JgWw,23060
64
+ crosshair/simplestructs.py,sha256=O236XDO0dWGM59jktMUp5RG9xYY5iqZV219DknKAXgc,34283
64
65
  crosshair/tracers_test.py,sha256=EBK_ZCy2MsxqmEaGjo0uw9zAztW9O6fhCW_0PJxyTS8,3270
65
66
  crosshair/smtlib.py,sha256=hh-P32KHoH9BCq3oDYGp2PfOeOb8CwDj8tTkgqroLD8,689
66
- crosshair/main.py,sha256=TkaOr39tMV9ZHQXgfJobKFEVW60XpHUqdY520nMIWw8,34659
67
+ crosshair/main.py,sha256=CY3PBcis302n0KvqoyDDoqtthNL4XASXHssO1I7DkJM,34707
67
68
  crosshair/path_cover_test.py,sha256=U46zw4-m7yAXhu8-3Xnhvf-_9Ov5ivfCAm5euGwpRFA,4089
68
69
  crosshair/__main__.py,sha256=zw9Ylf8v2fGocE57o4FqvD0lc7U4Ld2GbeCGxRWrpqo,252
69
- crosshair/pathing_oracle.py,sha256=3M93zXMorWr8m5c1KM2zGU5X1M3lcV-AIw0lX74eN00,9219
70
- crosshair/diff_behavior_test.py,sha256=ckK3HScFrmRRZdyq1iCmkwToksMJG2UVUjABnfnSwCM,7242
70
+ crosshair/pathing_oracle.py,sha256=qa-_OlyuCHpNHkK5xN8OvxRgOEOA56VpGf0jUIR8L-M,10513
71
+ crosshair/diff_behavior_test.py,sha256=nCpzOjrw0qsYgVhD2iCvKiNAt82SrfUWxWS5mPSE73w,7215
71
72
  crosshair/core_and_libs.py,sha256=8FGL62GnyX6WHOqKh0rqJ0aJ_He5pwZm_zwPXTaPqhI,3963
72
73
  crosshair/core_regestered_types_test.py,sha256=er3ianvu-l0RS-WrS46jmOWr4Jq06Cec9htAXGXJSNg,2099
73
74
  crosshair/z3util.py,sha256=AkslxCSfzgSni6oWXUckWihWn3LuceQycR0X3D3ZhD8,1759
74
- crosshair/tools/generate_demo_table.py,sha256=0SeO0xQdiT-mbLNHt4rYL0wcc2DMh0v3qtzBdoQonDk,3831
75
+ crosshair/tools/generate_demo_table.py,sha256=Z8gPUPQM8G_szPTgagBYzvsQeWDEEhGoZCU0z5FAS3E,3827
75
76
  crosshair/tools/check_help_in_doc.py,sha256=P21AH3mYrTVuBgWD6v65YXqBqmqpQDUTQeoZ10rB6TU,8235
76
77
  crosshair/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
77
78
  crosshair/tools/check_init_and_setup_coincide.py,sha256=kv61bXqKSKF_5J-kLNEhCrCPyszg7iZQWDu_Scnec98,3502
78
79
  crosshair/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
79
- crosshair/examples/check_examples_test.py,sha256=pFZRUi_yubIOaIZ_n7KkrG_qCKyHZnzcL5_y0NFqZKM,4062
80
+ crosshair/examples/check_examples_test.py,sha256=ieB2KBBPReQBOr5-AZCgrVyhN1YXGYyQMjHyQBQ4zTI,4063
80
81
  crosshair/examples/deal/__init__.py,sha256=Jp9ZnHBCuRzkgP8OIgEWWOzQiC0jLIYPd-rCqF5Xyrg,32
81
82
  crosshair/examples/PEP316/__init__.py,sha256=LdmvJx2cbzC3iip3NwtT0Ds2v99l3KXl1q9Kc0TmCWE,34
82
83
  crosshair/examples/PEP316/correct_code/chess.py,sha256=w29qVe-1oKMaHgZYhqyp2vQghXm2oohruFENljoVBCY,2081
@@ -105,22 +106,22 @@ crosshair/libimpl/unicodedatalib.py,sha256=q5LoCaEbHJrUwVWtUrlS3n_X21yp15xTS42l-
105
106
  crosshair/libimpl/datetimelib_test.py,sha256=v9Cg512AXIGy7_dsN2y_ZD7W7fqfSSz07eiCUZukM60,2659
106
107
  crosshair/libimpl/heapqlib_test.py,sha256=NdwTihD0xGy4qIDaS5a9-t3q437rP47GNdtceEBquNA,537
107
108
  crosshair/libimpl/binascii_test.py,sha256=LOBqLAJ77Kx8vorjVTaT3X0Z93zw4P5BvwUapMCiSLg,1970
108
- crosshair/libimpl/collectionslib_test.py,sha256=3h7XTToKWauMhjrEwLXVI0jT8FZKBlkvlw0oiPMmuKM,9164
109
+ crosshair/libimpl/collectionslib_test.py,sha256=0qmCRQbxfX8vMZLaok1GS68NIocR--RyTVVDqbtHalU,9185
109
110
  crosshair/libimpl/timelib.py,sha256=MXEFOZjFGa1-yLvmB3l3DFTLF9PSluOlmRK-ZJaA_oI,2409
110
111
  crosshair/libimpl/jsonlib_test.py,sha256=U40WJf-69dtflz75sIsl5zA3IV5R6Ltc4Z9jv_Fh-Fw,1382
111
- crosshair/libimpl/builtinslib.py,sha256=Mr3bDiM6pQhLh5lkMoa4UYM3Hi4A_xm0dLteYCohZzQ,171289
112
+ crosshair/libimpl/builtinslib.py,sha256=R6w3t-i1uJ3U8R-qHtrktZRTFm_K4SD0LjfeWBZbBDw,173362
112
113
  crosshair/libimpl/mathlib_test.py,sha256=QShLCXHdv3tx5PQxcSoR0MHeZ1huaiV6d3u7C2mGOn4,1861
113
114
  crosshair/libimpl/fractionlib.py,sha256=qdbiAHHC480YdKq3wYK_piZ3UD7oT64YfuNclypMUfQ,458
114
115
  crosshair/libimpl/binascii_ch_test.py,sha256=hFqSfF1Q8jl2LNBIWaQ6vBJIIshPOmSwrR0T1Ko4Leo,1009
115
116
  crosshair/libimpl/jsonlib.py,sha256=xFTvqGKzQcCgPme1WIpNMjBPfNHVZBMNuNx0uKMYXj0,28805
116
117
  crosshair/libimpl/typeslib_test.py,sha256=qCeUU_c-zmuvfwHEsaYqic9wdGzs9XbDZNr6bF2Xp58,1129
117
- crosshair/libimpl/builtinslib_test.py,sha256=Y_jRe5J6pPaJ_Nuk1lJ1biP5yczsfCj--NgNhwcbAfQ,90654
118
+ crosshair/libimpl/builtinslib_test.py,sha256=LYjvmVx0ndUK7YNMzNUaH39YesY_yrvIWb5XOwdnkDM,92255
118
119
  crosshair/libimpl/zliblib.py,sha256=XymJTKYbplpYJZ-P7GKVSY3V_8HPy5lqRFsCH1zezIk,357
119
120
  crosshair/libimpl/decimallib.py,sha256=zBKDrDZcg45oCKUkf6SIDuVpjA1Web7tD1MEQo5cjxI,177348
120
121
  crosshair/libimpl/relib_ch_test.py,sha256=zvSBF82mNQR5yEOMwwcaBOh8OpJkQeiVl85pgYVvJRA,5235
121
- crosshair/libimpl/functoolslib.py,sha256=LnMtmq2Sawde6XtPd6Yg_YOc6S5ai-pMpBWPQAkR3X4,783
122
+ crosshair/libimpl/functoolslib.py,sha256=YD0g9UnC4v_wZXR3ekQa2gLrKJnr6dHdYtT9qIMUIGM,1009
122
123
  crosshair/libimpl/collectionslib_ch_test.py,sha256=PYitnmXXEZfm25FzBodEX1hOpwqnDspbqt5aqzeVar0,5855
123
- crosshair/libimpl/builtinslib_ch_test.py,sha256=W4wWapqlxSjsC5XgREfgxS9e_iwKxgNQhbFE3umUfNI,30504
124
+ crosshair/libimpl/builtinslib_ch_test.py,sha256=UasixDc_qZHOEkmMkh_2r9l2NgItQBzwHpvs7dRfgvk,30857
124
125
  crosshair/libimpl/randomlib_test.py,sha256=KuEgrih9JvstsFDwrgAuHZrlVjIvaNUxS8ftiGPrwHI,3322
125
126
  crosshair/libimpl/weakreflib_test.py,sha256=CdGJhW32qJoxedn8QzPcMcKKmfl9Nv4FPDYebblIKmY,1812
126
127
  crosshair/libimpl/mathlib.py,sha256=ci_byDulWf1VOitpD3C-TwToL6CRYKkJUVMxjAYzUH8,4256
@@ -130,7 +131,7 @@ crosshair/libimpl/timelib_test.py,sha256=Ercmhw1Yc96CYnWhqIW7eu31R95uTGVZcgzxSiZ
130
131
  crosshair/libimpl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
131
132
  crosshair/libimpl/importliblib_test.py,sha256=DM8wWvPYbDTsdKVlS-JMrZ2cQpWSy4yXjZGPMQwF7Ss,1020
132
133
  crosshair/libimpl/relib_test.py,sha256=3raQ0JoU4vu8_NKfrjk7TkUIqVuuhR8mGCRPJPb0RI0,16085
133
- crosshair/libimpl/arraylib.py,sha256=vW0lvkYJx8B3hLnhwXhCc-ZwtWtEwZFLm7T8ahrrKgs,4877
134
+ crosshair/libimpl/arraylib.py,sha256=QL6QH9iHHsmKA2zzW9DKPB6AbaxRiZbD3ikSGQVgqxU,4875
134
135
  crosshair/libimpl/urlliblib.py,sha256=EaC-nWdi-IFG3ewZrzgCqbKc9Sf9wlUN0wvGjTU5TOM,614
135
136
  crosshair/libimpl/bisectlib_test.py,sha256=ZQtYmBYD0Pb1IiFelsgdvqyeUMKaqaDb1BRb87LTSbI,753
136
137
  crosshair/libimpl/itertoolslib.py,sha256=1bwV8voMV2j18KjXYMKkuNSC8p4VE_ZvY-74rAbWjB4,1245
@@ -142,21 +143,21 @@ crosshair/libimpl/codecslib_test.py,sha256=8K64njhxnTe7qLh-_onARNsm_qSG7BWM5dXgA
142
143
  crosshair/libimpl/jsonlib_ch_test.py,sha256=lLGnFq6Ti7l6aV_jDz-HEzKaPy5TIj_JA0sSnfI0Psc,1267
143
144
  crosshair/libimpl/iolib_test.py,sha256=VJRSQ3nnROfXvtqdy3yLx3eYmIh31qSmeuAiIa7ywKU,667
144
145
  crosshair/libimpl/codecslib.py,sha256=lB87T1EYSBh4JXaqzjSpQG9CMfKtgckwA7f6OIR0S-Q,2668
145
- crosshair/libimpl/datetimelib_ch_test.py,sha256=r_V9H34a4POlEeffi46mEtVI9ek80DHaEOiCTKON9Us,9283
146
+ crosshair/libimpl/datetimelib_ch_test.py,sha256=nevP0P8nkJ8DasvoVcD2tHiaZSFz5H8BHozzI-ZElhg,9288
146
147
  crosshair/libimpl/itertoolslib_test.py,sha256=MV-zSdfdeQi_UpZJdanKzHm2GRqrC7BMUoCd95ldMPw,1183
147
148
  crosshair/libimpl/copylib.py,sha256=icHJWeFK_tsPSdJhvlS5fVcBwlh0uJh0nzXsRJCGtzs,527
148
149
  crosshair/libimpl/hashliblib_test.py,sha256=HhPdm5CBTAeqrs41NpCxkexWYWyIf1JiA4cls72WQfM,406
149
150
  crosshair/libimpl/binasciilib.py,sha256=9w4C37uxRNOmz9EUuhJduHlMKn0f7baY5fwwdvx1uto,5070
150
151
  crosshair/libimpl/typeslib.py,sha256=5qWrHZZN8jQZoHPiQtkaFolR8qTYCQtJw3HRWCrCKQI,468
151
- crosshair/libimpl/datetimelib.py,sha256=kVWcoHMX-dPW-un7XoEIURfWlVOst6h_JFmjrhFiE1U,79168
152
- crosshair/libimpl/relib.py,sha256=3DhrbGqJcfpj5JNfcD8Pf4xsA4WEegxbukwgKoPLP3o,29256
152
+ crosshair/libimpl/datetimelib.py,sha256=3mdouYmzY5wIbByKcx_ehvzLYasiM4LDEn1-BB9edV0,79146
153
+ crosshair/libimpl/relib.py,sha256=ahS9f1_rhbVKZUhvYmuSTv0_ovmvH5NXShxDJu7aUhE,29272
153
154
  crosshair/libimpl/iolib.py,sha256=FbvqTfQRPaML5u0hHnrFZLrk3jYC-x4OO6eJujvFJaY,6983
154
155
  crosshair/libimpl/urlliblib_test.py,sha256=UcSmwRdJFkzXvkaV-jmrP6G4zhbu7X2NNjM7ePsYxRs,503
155
156
  crosshair/libimpl/heapqlib.py,sha256=TWH55dg-Hi5FRz2oZuXHcBU_xJzHjvhe9YQVvw7ZbfI,1311
156
- crosshair/libimpl/unicodedatalib_test.py,sha256=CJkAbiu8_2uhvjDIoYi3IJ8Nb_8sdjKVNvNhJCgPbZ0,1442
157
+ crosshair/libimpl/unicodedatalib_test.py,sha256=b0CHHHqDj5Ej_UEDnz3aUesILObcfLm00eEXQtfsgfM,1442
157
158
  crosshair/libimpl/encodings_ch_test.py,sha256=0qLsioOuFUZkOjP4J9Wct4CGBaBY8BnHx9paZHnIofI,2513
158
159
  crosshair/libimpl/hashliblib.py,sha256=Ki_cw28OnhZExgKbSoh5GaDbBfNRIOqH7O2aYQJGS3M,1234
159
- crosshair/libimpl/functoolslib_test.py,sha256=DswrS51n93EaxPvDGB-d3tZSLawEp38zQ5sNdYlbn50,1114
160
+ crosshair/libimpl/functoolslib_test.py,sha256=eaT_JWu-C3j8l9ekwDXd2dhPJvuB577T9DuXRohL0fc,1604
160
161
  crosshair/libimpl/iolib_ch_test.py,sha256=yibR3CbYjd9Sf2UaAIQaWO8QXbsZgyDc9w10VEtQN-A,3623
161
162
  crosshair/libimpl/weakreflib.py,sha256=By2JxeBHJCQP_Na5MBhE9YCc0O5NoKefKASoRBUNcW0,230
162
163
  crosshair/libimpl/decimallib_test.py,sha256=393MkVB9-LPcA7JJK6wGAbDyd-YejkjwrXRaEDaVhjM,2238
@@ -166,10 +167,10 @@ crosshair/libimpl/encodings/utf_8.py,sha256=BygLLIeI3_F2MpFVgaty8ebiuxp0YWz7IzXe
166
167
  crosshair/libimpl/encodings/ascii.py,sha256=Cz1xraTkXdQ5aBKDkorX4rAvrmf877_EqzC9hOmbItw,1416
167
168
  crosshair/libimpl/encodings/__init__.py,sha256=5LTEj1M-S00eZ4rfQWczAixg57vyh_9vZ5m5EKB5Ksc,680
168
169
  crosshair/libimpl/encodings/latin_1.py,sha256=ftUsPjUb9L7UKXKi9P7OAqOl9FkNP98M9jMAvseXBCQ,1242
169
- crosshair/libimpl/encodings/_encutil.py,sha256=nwVWqcGM1f7-hAC3Z46KnfrLzAjhfy4zaTa11uVBk6M,6828
170
- crosshair_tool-0.0.95.dist-info/RECORD,,
171
- crosshair_tool-0.0.95.dist-info/WHEEL,sha256=nc924w4TUhRiaM6-2LHWgVO2LgkOLXLUotVVlNPrJ7M,141
172
- crosshair_tool-0.0.95.dist-info/entry_points.txt,sha256=u5FIPVn1jqn4Kzg5K_iNnbP6L4hQw5FWjQ0UMezG2VE,96
173
- crosshair_tool-0.0.95.dist-info/top_level.txt,sha256=2jLWtM-BWg_ZYNbNfrcds0HFZD62a6J7ZIbcgcQrRk4,29
174
- crosshair_tool-0.0.95.dist-info/METADATA,sha256=zJ6FZW9znhqPs1H19hgRsMBx3-OoGpaM2uc4TjqT0fQ,6777
175
- crosshair_tool-0.0.95.dist-info/licenses/LICENSE,sha256=NVyMvNqn1pH6RSHs6RWRcJyJvORnpgGFBlF73buqYJ0,4459
170
+ crosshair/libimpl/encodings/_encutil.py,sha256=R0tLdyc83fN6C8c_tl5vetDCpayxeYaAT7UWwPQzX10,6982
171
+ crosshair_tool-0.0.97.dist-info/RECORD,,
172
+ crosshair_tool-0.0.97.dist-info/WHEEL,sha256=nc924w4TUhRiaM6-2LHWgVO2LgkOLXLUotVVlNPrJ7M,141
173
+ crosshair_tool-0.0.97.dist-info/entry_points.txt,sha256=u5FIPVn1jqn4Kzg5K_iNnbP6L4hQw5FWjQ0UMezG2VE,96
174
+ crosshair_tool-0.0.97.dist-info/top_level.txt,sha256=2jLWtM-BWg_ZYNbNfrcds0HFZD62a6J7ZIbcgcQrRk4,29
175
+ crosshair_tool-0.0.97.dist-info/METADATA,sha256=5ADW4j5TNenYaOjXs10_7udeVLv9eUlaIq9ZztZMXC8,6727
176
+ crosshair_tool-0.0.97.dist-info/licenses/LICENSE,sha256=NVyMvNqn1pH6RSHs6RWRcJyJvORnpgGFBlF73buqYJ0,4459