crosshair-tool 0.0.95__cp313-cp313-win32.whl → 0.0.97__cp313-cp313-win32.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.cp313-win32.pyd +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,78 +1,79 @@
1
- _crosshair_tracers.cp313-win32.pyd,sha256=_x93THw6WmhCm7ANHiWan-fUlNYQHUrw4B7R5XQwHuA,20480
2
- crosshair/__init__.py,sha256=XbBs-TqTx2QK4vO42Kpx0CAca6LT-IL1drYdNRiRj94,978
1
+ _crosshair_tracers.cp313-win32.pyd,sha256=cy2dQG1TrzqtVnfAznw6LeygUjSwsi0ED2Vex4cnmZI,20480
2
+ crosshair/__init__.py,sha256=htAmQZ0V85H_mIl9zJkZt60T5UH6Cdjj-hyTVbIwQEQ,978
3
3
  crosshair/__main__.py,sha256=i4pjsZlXvtieQHJTEB0sF3e40qJjLoOm1z5rm-u70Uo,260
4
4
  crosshair/_mark_stacks.h,sha256=IImygydFK9qethf41gUZDjySHR3WLXs-YsqWCHK9UFg,29468
5
5
  crosshair/_preliminaries_test.py,sha256=klkzKGpyyVDGctCXdvq1xyXbGa4PRnXda1jfgE-7LLY,522
6
6
  crosshair/_tracers.h,sha256=z1dln1ftrz9ofaBgiYLn1SZ13QNxpNYRE586XogsX_o,2268
7
7
  crosshair/_tracers_pycompat.h,sha256=KqJHbya8zi1Z4Qrk2S6P-FfmC_Ew5LYvTxbA-V9TWPw,14878
8
- crosshair/_tracers_test.py,sha256=l0WYk74xtr5tlT9ID0kq11jUmw_Ai-hevNX7eZHg4RY,3734
8
+ crosshair/_tracers_test.py,sha256=gj54QgYtcz2RwZv4Ae2rX9N7zDOJw5FMz53w2hS8vFk,3783
9
9
  crosshair/abcstring.py,sha256=Jvnnm7xsHGTcZvu5mbV_eL5IVEvbNNbeCauM6f7QYEI,6794
10
10
  crosshair/auditwall.py,sha256=RGnRqjUf-WokimDsEcX-3sUrra9jaqyGym2gYAulYgo,5328
11
11
  crosshair/auditwall_test.py,sha256=SKTy_7Q6xP0Den4i7HRHSaU0b37smi_Mb-arQnppFPI,2107
12
- crosshair/codeconfig.py,sha256=L0EmcEZlWA51sl32uBxvFPwbTmuglVDHNq8k35JkXw0,4071
12
+ crosshair/codeconfig.py,sha256=-7nd4a44jG7Lm9cQJ70_mydapq6kYjbfrVHQ47mWi0w,4072
13
13
  crosshair/codeconfig_test.py,sha256=n5kXtW60vG_CA0QlzLE3mS4k9caEwhB30bnhaGNh6Ww,3467
14
- crosshair/condition_parser.py,sha256=EBlBI2u-69etsqCpMJ2arHDRhC26zpcX25tHSIZylj0,43883
15
- crosshair/condition_parser_test.py,sha256=kosW60A4HnBBT3sOHxWCl_cixpbO1kmsjgNuNUgHCDE,16031
14
+ crosshair/condition_parser.py,sha256=iMQBZ4T1SFBJ4ARCqt_VJBNIWrLBKhDB_UI1zQefMFI,43921
15
+ crosshair/condition_parser_test.py,sha256=UldRWjTlecna5lKidIUnGawJmnd3siF4krH-14Eza4U,15997
16
16
  crosshair/conftest.py,sha256=JjUauvXnjERszuS46iskuBRHBx-0uHacwKHeQ-gEQ2c,683
17
17
  crosshair/copyext.py,sha256=_SRnS6UrUFl2-CHl8uRIOq-Y0MKYNQTFK132S3Ru34A,5044
18
18
  crosshair/copyext_test.py,sha256=VSIoVeqAf18g2RNuLTbyNWJiMBgzHeab7LNX1KHCWZU,2182
19
- crosshair/core.py,sha256=1aAptxDoCv-hYIxl5USINEE6eJsKKctoZf0k9wpX9v8,65928
19
+ crosshair/core.py,sha256=2MXhK3BW9pyJtNUGbUx7VR90yT_UPCzJ44zWYGhRleg,66011
20
20
  crosshair/core_and_libs.py,sha256=U9GDCBE9Ecxy7T7bmJT7IYiQTdY1C8qbcoIoMMocu5U,4112
21
21
  crosshair/core_regestered_types_test.py,sha256=3o1GrtjCEWSW-paPp5-yVdE2K1_ZIviGCff7KVZ0VS0,2181
22
- crosshair/core_test.py,sha256=2rKU1rUrUPeYLQ-I0UbddUx9henGAacRbmeeMd-2K14,34323
22
+ crosshair/core_test.py,sha256=D19dx1fImb0bmu2RH02UxNN9vSEzvNPfnFa2hUgzBuY,34332
23
23
  crosshair/diff_behavior.py,sha256=2T11J2Hk35Qp3RRp5ALtXyTgAl3v0W3KDNR_mSec-D4,11567
24
- crosshair/diff_behavior_test.py,sha256=TUmqPOj_Qij8a7NMLFYt0IskL5Q_CdDLD5pnxnomuJ0,7505
25
- crosshair/dynamic_typing.py,sha256=UspjP89YmX5CzkMrXrPRl6DL4eqmsuHMQv-zTpq4JcQ,13104
24
+ crosshair/diff_behavior_test.py,sha256=4ZKqulo0xjXwj0WwO5ky4QH3n0j9syqPd5OvOhz-Fug,7476
25
+ crosshair/dynamic_typing.py,sha256=fSh-iElFGTh_J61SSlXKmQsRuZAqqEKXyXX9EzKKzRA,13098
26
26
  crosshair/dynamic_typing_test.py,sha256=4z9s6j-u2oQqlrzFx9Mc2Mc0RBPGiCZ2mDqP0F4IFVA,6117
27
- crosshair/enforce.py,sha256=lIeDeqavEa06tVMlIk5ScibVGS04yHZ3xIpkTPK5QQw,10291
27
+ crosshair/enforce.py,sha256=FfddNF1c70gZ17u0Hg6ukfsChv7frXIfWq2LijoVY9k,10293
28
28
  crosshair/enforce_test.py,sha256=CvofUxa_Y-np5vhlBcjsrZ2CkpxNFbjv5U-rH027pw4,4847
29
- crosshair/fnutil.py,sha256=Fe77jLudjf7X_fNLExLoMTFElQWQ3wCpA_MC06JaOKk,13515
30
- crosshair/fnutil_test.py,sha256=I-jFcROrNFUs7xSGrLcGJk_cX8014g5h8ItwPSFpvLY,2264
31
- crosshair/fuzz_core_test.py,sha256=wWILaE5cpxfiRl89WgCWMpNIGS8BnWcQmgartQYCCJ8,17411
29
+ crosshair/fnutil.py,sha256=MmS1aIODQ3xhtM4HYDEpf2uJBQxIYfeLMRQy1nZ31Vo,13500
30
+ crosshair/fnutil_test.py,sha256=1BFFpVnCMM-rS9k_JdSSjX1pPXRpEkUKlmG5e_rFZ1I,2166
31
+ crosshair/fuzz_core_test.py,sha256=-KYDeNtql8ZPtPVWwvPFRDpuR5fYwK6E29ctiPByUfM,17959
32
32
  crosshair/lsp_server.py,sha256=Kl6z-Nudt2ZkzV0ojfzvGGa3cukXLOYKTCHYJUxzrRk,8920
33
33
  crosshair/lsp_server_test.py,sha256=yHp7JtJLpF2G049lwhNlgAYXnVM88CtsudVVHVY7Hs0,999
34
- crosshair/main.py,sha256=2kiGrmjNeLYkgzPnrc-zyfWPJqCi2km_SSZ0IDhm-_Q,35630
34
+ crosshair/main.py,sha256=JRhCLZZYWOBjMgYV8DOEKbIB5FS1dUYmYLfoWfCZ3xs,35680
35
35
  crosshair/main_test.py,sha256=BQvSEE_hkyIOW_n9-SIkG29k1ZFuB6j8LgftVvNmXAU,15377
36
36
  crosshair/objectproxy.py,sha256=P-i5DK2e_uIK1bYbo9B3KCskAd5TdPeeu5L9GzvmqXI,10166
37
37
  crosshair/objectproxy_test.py,sha256=tYLehy10sFFeJczZj7jiRFdnDlAdK80rE8F8yi-YfdU,1122
38
- crosshair/opcode_intercept.py,sha256=RGcwx4f5-KKjY2C3Do4mBm4S8rEpn6nWtOQvaSKQnoM,22453
38
+ crosshair/opcode_intercept.py,sha256=_A6AiozgTg7EMkWEhG3yQ2-o048BWCb4xK6BixIWfcY,23661
39
39
  crosshair/opcode_intercept_test.py,sha256=giJ9HK0jJ4r41epJMZ4PPT6-qn8nqDjS-900ULxIlLM,9545
40
40
  crosshair/options.py,sha256=y3lYP5AfwkHFXjF7zl0kUrTH1_C5u1DMo_yAH_mivm8,6993
41
41
  crosshair/options_test.py,sha256=eTlaTqNb29I3ZyyV0yCq_kEeE441l4xh-jKF_W6cWqs,389
42
42
  crosshair/patch_equivalence_test.py,sha256=2obUF4jZWlF_HBawn6uOb53XuD7qNRiX6f8Y1A5-fUI,2655
43
- crosshair/path_cover.py,sha256=rHWsTLVr-LR5rEBu18xRSJbpWk3ZTl11OG_QOkgRrxI,6915
43
+ crosshair/path_cover.py,sha256=MGTfQ5IO9HOBDbb7pDa9UsMfmYCpwQP-3YJJvCU0Anw,7047
44
44
  crosshair/path_cover_test.py,sha256=DFB_fIC2d1waNfyUAP4wVv-hdbNkHAKRxgBcftxcKLY,4227
45
45
  crosshair/path_search.py,sha256=5gsiY41aMcTnO5XONgjsnVulWbRIw0mYcpmRYedqORo,5749
46
46
  crosshair/path_search_test.py,sha256=xhY7qmLRaDMnueFgokJaDKOufs2fhJdqU6okM4hWgF4,1744
47
- crosshair/pathing_oracle.py,sha256=XmCva1sjBbQfzeQZ01UozNP-Mbdak3PepaPqQPIuylM,9453
47
+ crosshair/pathing_oracle.py,sha256=r0_a6P1fWfjo6C4L0fOOsRwWs3wDrYRAUbpDuEABRnQ,10784
48
+ crosshair/pathing_oracle_test.py,sha256=vAl83ynTFxnee35Z8_6CKaT4zvMHRNwJYMDq8Az8dzE,746
48
49
  crosshair/pure_importer.py,sha256=yA1HkM3Jykt2w00OQALwxi5Gt_FFa-NU9JRiBcDS2DM,905
49
50
  crosshair/pure_importer_test.py,sha256=Tp4RitGWUhtLhNxOlJkdz43WyXZLynARbCcY4lzG7Bk,437
50
51
  crosshair/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
51
- crosshair/register_contract.py,sha256=PcwWLn6Hv6Rm8xbZhalNJwYUnjzxoRcw_SZ_QmYCfbs,10658
52
- crosshair/register_contract_test.py,sha256=WUDcRHSdZr3m4ZmDLkfdeZlWid-tdeBGqAHe0-_-Ycw,5162
53
- crosshair/simplestructs.py,sha256=DQu4LVS5KLEIH3-z_DEg0LU3VxovKE_JRjHvBdGCzb4,35380
52
+ crosshair/register_contract.py,sha256=_KenbA6cH7An088gOCwY1-tibap8ppDsoxH0I1q3_ZQ,10660
53
+ crosshair/register_contract_test.py,sha256=XPFnUu_d-QdPc77SRzF5A-fa_ehwSFhAL-9gLE31ygg,5144
54
+ crosshair/simplestructs.py,sha256=oyPrOi2VqvF_A7zePSSWJTZZAv5c7rWFit3HosizR1U,35444
54
55
  crosshair/simplestructs_test.py,sha256=XizES1bMUx3PAMsGw6zZIzhu-ZHaP1HUVorTI1w21_s,8922
55
56
  crosshair/smtlib.py,sha256=WJnOtT4xSDsllQ7o-WEL_-eqJrujB9KMkMO9cVNa5YA,713
56
57
  crosshair/smtlib_test.py,sha256=uR_X_32tqPjCp9gzExY_5AZIqw8wdOrIJ9vGONJmmOg,525
57
- crosshair/statespace.py,sha256=gkbYlMuJwQU7UuzIJoZom3Hs50OMTkfdVGoenwRCDzY,42377
58
- crosshair/statespace_test.py,sha256=Z9YENLVeEMEc0SvDt1gGYvNZuleu4lOMq4kC9kaagaw,2704
58
+ crosshair/statespace.py,sha256=blM9tJQUN3VaIVJwF9VUs-o-C6oDcNHhddmhUGHk_7o,44636
59
+ crosshair/statespace_test.py,sha256=hqUXSxfDUGpDvJveMnoQ57LnNmzhRaZm8sbURGd1-xw,3310
59
60
  crosshair/stubs_parser.py,sha256=tJwChs8--UZjCtkshijzA-1K2tiZ2-mgpea_hJIdVJI,14592
60
61
  crosshair/stubs_parser_test.py,sha256=eUIy8E7LoR7tmUy3dkZEOQqDWFq7hoqbIBdJ_nwkeIE,1271
61
62
  crosshair/test_util.py,sha256=jtFZdNMR9cp-7sGmhDDfzeeIrWQAenyF4QRDE-kXdwA,10696
62
63
  crosshair/test_util_test.py,sha256=6S3BfmWB4YM4z6D7rhc4cCtV7VAstN7L_STP1iT0QgU,969
63
- crosshair/tracers.py,sha256=kMUixlsd5zMjfXt_eNn7HS86yIu6c5tP45Cold76yWs,17662
64
+ crosshair/tracers.py,sha256=dfKUSCO13mhkh54BWwiku273jkMmROcI9WivA3H6oPI,17704
64
65
  crosshair/tracers_test.py,sha256=73lIgNCVf4QhJo5uzoonH55vKWoYDffeYb8AdCZEQHw,3424
65
66
  crosshair/type_repo.py,sha256=9gmajt6r1XYm4OAObA4yYh2FsZIRDbxFVSa95CF3Hyg,4815
66
67
  crosshair/unicode_categories.py,sha256=JWGv47BSq1Cj-uYSWBQ4kYlsIPlmcPvaUxO6YG8d9I0,334108
67
68
  crosshair/unicode_categories_test.py,sha256=KZ2OKOSMALmFp1BQbWj1-x6Ek5Iv2byxF4ytx2mN7LU,766
68
- crosshair/util.py,sha256=UlZYLXChOyUpjuMWQxr_nLDLwhOrDo0Lxkco06IG2m4,22954
69
+ crosshair/util.py,sha256=5LYXkiFdRzScetseFCsbSjqPZCrbZstHTBAJi0YsObA,22950
69
70
  crosshair/util_test.py,sha256=fIc3TeMbyu9nI430_gGbUrqXhPJ5wl9TxWAtIGgEL4s,4849
70
71
  crosshair/watcher.py,sha256=A8ywSNPUY6Y4BHVO51dGM18nQcwGYx_kbBEwIOMTzF4,10355
71
72
  crosshair/watcher_test.py,sha256=TCOdXmdGZ3NJ59X_w7SRVqiJY-BL2tUqyXK-3ql1d6s,2871
72
73
  crosshair/z3util.py,sha256=_NcVbYhvSt24vhkpiXdEh4o2VRSIjb4g8Xpq49sJsGg,1835
73
74
  crosshair/z3util_test.py,sha256=9_6fhpTphEQlg4QY29bGzN0KxfktsT8wYveNgbfqueg,184
74
75
  crosshair/examples/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
75
- crosshair/examples/check_examples_test.py,sha256=0xoBSAVt3cLJdmvPVvSXsN8Szot16kPyihWG8iToi_4,4207
76
+ crosshair/examples/check_examples_test.py,sha256=HXt9Je99TuyvC4pJ0Jkuxjf7a-bi8RasZNEjwUVxXdA,4209
76
77
  crosshair/examples/PEP316/__init__.py,sha256=39eVIMt1avfS9HXte7nzP9LbVlFo97Q4-YL1CQXM1JM,35
77
78
  crosshair/examples/PEP316/bugs_detected/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
78
79
  crosshair/examples/PEP316/bugs_detected/getattr_magic.py,sha256=PyaKiAVHnlaPTEpaupKmGQcyK24HGiq1eKU2t-mHJFo,335
@@ -95,23 +96,23 @@ crosshair/examples/icontract/correct_code/__init__.py,sha256=47DEQpj8HBSa-_TImW-
95
96
  crosshair/examples/icontract/correct_code/arith.py,sha256=fImqdDCzE523ijM5TZnFJMGpq7otdLoNoM3uu66vUus,1559
96
97
  crosshair/examples/icontract/correct_code/showcase.py,sha256=UlVhUWU1KKf285tL41DP_z-Uywid4kh1U2kUwje5mZ8,3181
97
98
  crosshair/libimpl/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
98
- crosshair/libimpl/arraylib.py,sha256=Wo6XSvJz3SgSmfpyvrdlCNJHlDhFxQCBqUTX3Q0LCpI,5038
99
+ crosshair/libimpl/arraylib.py,sha256=Sj5tRcOuplo2xAYlhAEZ2evbn7rCz6GNmID2onsEgEU,5036
99
100
  crosshair/libimpl/binascii_ch_test.py,sha256=qWAYU1Sid3muwYL8pvVoCsMQtm5t3J8jFtolygvdghQ,1039
100
101
  crosshair/libimpl/binascii_test.py,sha256=Yg37_B-eywcLq7EbsJZR3BUYYF6A1PGxE4qsmeBMyXg,2037
101
102
  crosshair/libimpl/binasciilib.py,sha256=kBFH5-W_q1gCTC-wusSq0cAsUsB_xOUpcW0XQbLzkSQ,5220
102
103
  crosshair/libimpl/bisectlib_test.py,sha256=rVpcalZ4g3xr_b6z1Bv2FU1N07vPZyWhU9_CPzC8sBk,776
103
- crosshair/libimpl/builtinslib.py,sha256=8MFc8BRqY-ifuzLP7wiH5t__mLgOvLiOs0muCB8r9CU,176369
104
- crosshair/libimpl/builtinslib_ch_test.py,sha256=Do8kWNgfosLfI3yzZvTZ3ceuKTF0axN1ckkNZyn4ozE,31685
105
- crosshair/libimpl/builtinslib_test.py,sha256=yqNE0027NV7-5l9JI-YdsZ8_TPx4F6kOrYxA5Czu2XQ,94322
104
+ crosshair/libimpl/builtinslib.py,sha256=bd3a9KGauy0X35TiBkLHVUeLpUZZ_0hpj1eOl-CLUxM,178495
105
+ crosshair/libimpl/builtinslib_ch_test.py,sha256=I_gtmttBYvnG1QeOTMf3gJ2BNg5uazN_IFUKc0_clZY,32048
106
+ crosshair/libimpl/builtinslib_test.py,sha256=aopEctVJq5ozRKDvt0Z3FCzMSykAKXl2mVX-dnkspBk,95960
106
107
  crosshair/libimpl/codecslib.py,sha256=cvpCbieFRB4BdfLqmKeJzpvm35qZ0ONqtilXPmN8OWI,2754
107
108
  crosshair/libimpl/codecslib_test.py,sha256=3_uqcxEYK3BONdga0skZ1BkSPkIHRCgdoMB8NM3oUVY,2622
108
109
  crosshair/libimpl/collectionslib.py,sha256=ltywQks-W56CkxvUawvcGZwsBcm6t2u5JLbA56nzqPs,8847
109
110
  crosshair/libimpl/collectionslib_ch_test.py,sha256=A6-qeCU1zTcvuS6HkmF48Q45F3SvQJkh-BTUc2DKxJo,6107
110
- crosshair/libimpl/collectionslib_test.py,sha256=Wm67Bw1Lg6ts5DF2ii98SUr4f8YZa0zzK0IiwhdFExg,9496
111
+ crosshair/libimpl/collectionslib_test.py,sha256=jO2Syys4-jTy-3uG6lIHCPSkxiXUc7uYhnz900nZTwQ,9517
111
112
  crosshair/libimpl/copylib.py,sha256=s2q6jMCT2bvzyq5kQyT40TsmOeeJmLI4Corz4qWDZyE,550
112
113
  crosshair/libimpl/copylib_test.py,sha256=BnQgUSd5Oiw68jk2fRrhPRlIt9HaBXxUeroZPZj64yM,723
113
- crosshair/libimpl/datetimelib.py,sha256=Hqq9Ksm4z-pHxyw8ngnkm4eUmFQmo_yxiFAzaCHHYQg,81716
114
- crosshair/libimpl/datetimelib_ch_test.py,sha256=NpZjUJgM08gB04d2gXkbrm7Y7Pdh3aso9GYb9iZtq6o,9632
114
+ crosshair/libimpl/datetimelib.py,sha256=xhJK1o7jrPOtyjkUaol-hm12npWQZMQafp1ANel2kO8,81692
115
+ crosshair/libimpl/datetimelib_ch_test.py,sha256=Sbboze4U0ajUyyGb-k_aBP5Xe7FmorVtS_EdbybBCTI,9637
115
116
  crosshair/libimpl/datetimelib_test.py,sha256=q27sPMNNJr3kBcIIkigsQbxslt-2qYhFUxc9PRVVf9E,2771
116
117
  crosshair/libimpl/decimallib.py,sha256=PP1ZznK1e2xtuvC3Fo8GODr6O5oz6Sq9a043QExpbnE,182605
117
118
  crosshair/libimpl/decimallib_ch_test.py,sha256=8iQpb1c0-TNqtY4EznYkgAGnBV2uOitFj0vILscDGNk,2458
@@ -119,8 +120,8 @@ crosshair/libimpl/decimallib_test.py,sha256=gbLoEtgpkq6Xod-9Am18mTpVH1VY_cZHvktS
119
120
  crosshair/libimpl/encodings_ch_test.py,sha256=jZM2XqiGd-40kDiC1YSlDoQafRrbtx6BBBeHTIRx3TE,2596
120
121
  crosshair/libimpl/fractionlib.py,sha256=lGqUcl5S9lPC18pKP8Ihzirmgn8hf2QNPvdZejzK8IM,474
121
122
  crosshair/libimpl/fractionlib_test.py,sha256=gl9PIZFoKyA10KMhfmA4SSK1i1y2yUO_IDvxIr-8lBc,2437
122
- crosshair/libimpl/functoolslib.py,sha256=szPJ4ZB0CevfCxMBvVfD_3RX-BwDp0Sv5YchWncmnu4,811
123
- crosshair/libimpl/functoolslib_test.py,sha256=OSeY-C9zYhFMfDHJ9QNaXxx6sVJ-CLOgrYIyXBl-vvk,1154
123
+ crosshair/libimpl/functoolslib.py,sha256=z8DnDm5WJqpS040U6XkyNYV_mY-KuqjLZVV125fVfDs,1043
124
+ crosshair/libimpl/functoolslib_test.py,sha256=KTbBFmOmOxnsqUmeZDathDgEPDtNSfRpMMuPUVLqX7w,1660
124
125
  crosshair/libimpl/hashliblib.py,sha256=0s4yx2l-hNkqWEd1Xbmxf-2w_E3LmjHn0SShni_r_-8,1264
125
126
  crosshair/libimpl/hashliblib_test.py,sha256=Ub8LyD8-YcvQVj2h62ofEpWpQD06BJKyJ69N5HBbkC0,424
126
127
  crosshair/libimpl/heapqlib.py,sha256=bKULrqXgl-LpX59BdBQus-1_fWPz1bWWTkwpQDSGtNo,1358
@@ -143,7 +144,7 @@ crosshair/libimpl/oslib.py,sha256=hbpVYfxMUfU9vHjc026Lz9cHHRMko2G_7yEodljwwR8,13
143
144
  crosshair/libimpl/pathliblib_test.py,sha256=ySRzUBzLlb7fDJaPNJSUk8Rg5sf71_fegyyRKSA8UIo,262
144
145
  crosshair/libimpl/randomlib.py,sha256=yjQmgnwjF6UxffVtBiBi6CFln1CtSse947BtaPIvYn4,6338
145
146
  crosshair/libimpl/randomlib_test.py,sha256=szLn-O2No5JN83AE6UC5p9rm27nLKTpttXsV_DQjAig,3442
146
- crosshair/libimpl/relib.py,sha256=oqAKNC_RiXbH5cRwVBRhG1UAaqQLclt3_UAFDt6UzhY,30102
147
+ crosshair/libimpl/relib.py,sha256=tOpQOA_JpsQpG_-g6OEBMjQcvWtn8oqQKSwgVW82dGw,30118
147
148
  crosshair/libimpl/relib_ch_test.py,sha256=o-u9iHMcw3QIl99fP42BkrWtoC0rfv8C72OsiuO55nM,5404
148
149
  crosshair/libimpl/relib_test.py,sha256=f-xqNpOZKbp6kg0VyrkXANt0gglF2ykwAeG8uGQHSuI,16578
149
150
  crosshair/libimpl/timelib.py,sha256=mP7hYp2ULlUU8eb5Z2nlrKMMgnBwqIuUX8gLG1q2hO4,2481
@@ -151,7 +152,7 @@ crosshair/libimpl/timelib_test.py,sha256=LP1jJh9EvbG58Zc7JjDj0yiYPXOXOtt549sV1bf
151
152
  crosshair/libimpl/typeslib.py,sha256=PKkmXx_fyseiP3gNvQ5BIg6psHHCcW_blVPUSuMNzLs,483
152
153
  crosshair/libimpl/typeslib_test.py,sha256=zrUTmYsiL18VV_qN1LOl7TDSP82uq4Oa9ndbUFpWMQQ,1165
153
154
  crosshair/libimpl/unicodedatalib.py,sha256=WoDGPGs2bpoiO0pnnnBOBmHfxVgzOF4XjehqImn7Pt4,3178
154
- crosshair/libimpl/unicodedatalib_test.py,sha256=wlB_KtsA63iHvTAIuwFZPEaXKLsMK6vwe6N-l0Tlw3w,1484
155
+ crosshair/libimpl/unicodedatalib_test.py,sha256=tMDWbHSQpYT-QDC-42ucWErL6xftoKRzBvLGZXpKURE,1484
155
156
  crosshair/libimpl/urlliblib.py,sha256=wF5gsDb8ss4ra8VDo3hE2c_pr1j28UumVmZPQWlJU-Q,637
156
157
  crosshair/libimpl/urlliblib_test.py,sha256=cO5CGpTnQkdbS2eGXxiB8COQFH5DZnR0waYALvZVUt8,522
157
158
  crosshair/libimpl/weakreflib.py,sha256=07_EoNvN0ZR7sygF1uEiyaXLI-Q39lcd5yz3WjxJfDg,243
@@ -159,17 +160,17 @@ crosshair/libimpl/weakreflib_test.py,sha256=1ld2-TlYshkIcXGKUY0Ox-dnpn9AA9Nualp_
159
160
  crosshair/libimpl/zliblib.py,sha256=bpOYrRzLU9b1l3w_P3YDyrdrxaCAqwU3qQ4R_jLyjOY,372
160
161
  crosshair/libimpl/zliblib_test.py,sha256=JoaxxdOu3spYm68tmRw70kdrXdf9njkFOILhpWcX1xg,401
161
162
  crosshair/libimpl/encodings/__init__.py,sha256=VKUh56DNBLSFZEGVvKddivDAooo2pCh9o3hHA8OkYTI,703
162
- crosshair/libimpl/encodings/_encutil.py,sha256=Rz5Ov62QaH14SzguSeoIlJ_DN-R8EdRny_HbT9V-fXw,7010
163
+ crosshair/libimpl/encodings/_encutil.py,sha256=jE7B2N8eQFGYvZNpawI4Sa52NOeb_D3bqDthnZiHM9Y,7169
163
164
  crosshair/libimpl/encodings/ascii.py,sha256=2EmYZTk51OaKx3kiv-ZDUYU3N5k3-OT0CrS8zr24M5A,1460
164
165
  crosshair/libimpl/encodings/latin_1.py,sha256=BfgfxYvhzrk6lmDSOEhr85GXPo4_nHq0YCDGKJXZie8,1282
165
166
  crosshair/libimpl/encodings/utf_8.py,sha256=hEUknu2B5Gt6exPTWK9KowywDd14eTTmqEqXSC2shzU,3266
166
167
  crosshair/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
168
  crosshair/tools/check_help_in_doc.py,sha256=An-2EJ0_Xr-Szo431AoEgJafoFWwnPl8HoT4bi86dd8,8499
168
169
  crosshair/tools/check_init_and_setup_coincide.py,sha256=f4TvPg1Q3C_BQYtGgPfY_fqxo_ZTeU7QCy7WwQjaIlA,3621
169
- crosshair/tools/generate_demo_table.py,sha256=qm4ZUXjUBKkVZ3bVVK9h6dJMDKYme8zMl-7at_aG7b0,3958
170
- crosshair_tool-0.0.95.dist-info/licenses/LICENSE,sha256=qQLSJN48eqvalILMr3uzkg0p74FtK7WSwkux-0twy-s,4552
171
- crosshair_tool-0.0.95.dist-info/METADATA,sha256=DUdd1DL9enYXFn3T4SWDsdgLTjrVkfXm37XQjl3QqKY,6923
172
- crosshair_tool-0.0.95.dist-info/WHEEL,sha256=0ABLuJ37exXk5N_efmYNs2NU9NK1K2Qlod_6bYkofEA,97
173
- crosshair_tool-0.0.95.dist-info/entry_points.txt,sha256=u5FIPVn1jqn4Kzg5K_iNnbP6L4hQw5FWjQ0UMezG2VE,96
174
- crosshair_tool-0.0.95.dist-info/top_level.txt,sha256=2jLWtM-BWg_ZYNbNfrcds0HFZD62a6J7ZIbcgcQrRk4,29
175
- crosshair_tool-0.0.95.dist-info/RECORD,,
170
+ crosshair/tools/generate_demo_table.py,sha256=0WvJHPGkzqm_Y6ohYjy3OC9Gmj32DpzyrDYlWs6l2PQ,3954
171
+ crosshair_tool-0.0.97.dist-info/licenses/LICENSE,sha256=qQLSJN48eqvalILMr3uzkg0p74FtK7WSwkux-0twy-s,4552
172
+ crosshair_tool-0.0.97.dist-info/METADATA,sha256=-KGLXGA9Hx1PlzHyiR0sxSddG2npKoiOJBqSiJQHbg4,6872
173
+ crosshair_tool-0.0.97.dist-info/WHEEL,sha256=0ABLuJ37exXk5N_efmYNs2NU9NK1K2Qlod_6bYkofEA,97
174
+ crosshair_tool-0.0.97.dist-info/entry_points.txt,sha256=u5FIPVn1jqn4Kzg5K_iNnbP6L4hQw5FWjQ0UMezG2VE,96
175
+ crosshair_tool-0.0.97.dist-info/top_level.txt,sha256=2jLWtM-BWg_ZYNbNfrcds0HFZD62a6J7ZIbcgcQrRk4,29
176
+ crosshair_tool-0.0.97.dist-info/RECORD,,