FAILURE MAP
← Case archive

FA-57321 / Auction allocation rules / Open access

Bid disclosure: withdrawn demand statistic · case 01

Public live demand includes withdrawn auction offers.

Verified by executionVariant 1 · 11 checks per implementationDownload source bundle ↓JSON ↗

ROOT CAUSE

Public live demand includes withdrawn auction offers.

VERIFIED REPAIR

For withdrawn demand statistic, apply the stipulated decision sum(r[1] for r in x["records"] if r[0] not in x["withdrawn"]).

Unsuccessful approach: The attempted repair uses sum(r[1] for r in x["records"] if r[0] in x["withdrawn"]); the explicit regression cases demonstrate that this still violates the stipulated auction rule.

Case contract

Toy auction disclosure views distinguish bidder self-view, public preclose statistics, anonymized postclose results, and auditor-only linkage. List records have fields [bidder, quantity, value]; suppression thresholds count distinct bidders, not submitted records. Named decision withdrawn-demand-statistic: For withdrawn demand statistic, apply the stipulated decision sum(r[1] for r in x["records"] if r[0] not in x["withdrawn"]).

Why this case matters

Offline administrative auction model for software failure analysis.

1 / The failure

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    v0 = [r for r in x["records"] if r[0]==x["viewer"]]
    v1 = [r[2] for r in x["records"]] if x["closed"] else []
    v2 = len({r[0] for r in x["records"]})>=x["threshold"]
    v3 = [[x["aliases"].get(r[0],"anonymous"),r[1]] for r in x["records"]]
    v4 = x["aliases"] if x["auditor"] else {}
    v5 = [r[0] for r in x["records"] if r[0] in x["consenting"] and r[0] not in x["revoked"]]
    v6 = sum(r[1] for r in x["records"])
    v7 = [{k:r[i] for k,i in (("quantity",1),("value",2)) if k in x["published_fields"]} for r in x["records"]]
    v8 = x["winner"] if x["closed"] and not x["embargo"] else None
    v9 = x["records"] if x["appeal_open"] or x["auditor"] else []
    return {'self-view-scope':v0,'preclose-value-embargo':v1,'distinct-bidder-suppression':v2,'alias-result-view':v3,'auditor-linkage':v4,'consent-qualified-disclosure':v5,'withdrawn-demand-statistic':v6,'field-projection':v7,'embargo-final-result':v8,'appeal-audit-retention':v9}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [('normal contract', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('closed', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': True, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('no withdrawn bids', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': [], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [6, 12, 18, 24, 30]), ('closed / no withdrawn bids', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': True, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': [], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [6, 12, 18, 24, 30]), ('auditor view', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': True, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('outsider view', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'z', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('threshold met', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 2, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('all consent', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a', 'b'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('embargo active', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': True, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('no appeal', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': False, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('all revoked', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a', 'b']}, [3, 6, 9, 12, 15])]
def vary(value):
 if type(value) is int: return value*N
 if isinstance(value,list): return [vary(v) for v in value]
 if isinstance(value,dict): return {k:(v if k in ['count', 'delivery_index', 'disputed', 'maximum_set', 'minimum_set', 'stage', 'threshold', 'waived'] else vary(v)) for k,v in value.items()}
 return value
for label, request, expected in fixtures:
 check(label, solve(vary(request))['withdrawn-demand-statistic'], expected[N-1])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
normal contract63Failed
closed63Failed
no withdrawn bids66Passed
closed / no withdrawn bids66Passed
auditor view63Failed
outsider view63Failed
threshold met63Failed
all consent63Failed
embargo active63Failed
no appeal63Failed
all revoked63Failed

SHA-256 / 154be810b196710919610ad8764d1854cd53303b56eaf91203b9a62f892e3d75

2 / The unsuccessful fix

Exit 1
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    v0 = [r for r in x["records"] if r[0]==x["viewer"]]
    v1 = [r[2] for r in x["records"]] if x["closed"] else []
    v2 = len({r[0] for r in x["records"]})>=x["threshold"]
    v3 = [[x["aliases"].get(r[0],"anonymous"),r[1]] for r in x["records"]]
    v4 = x["aliases"] if x["auditor"] else {}
    v5 = [r[0] for r in x["records"] if r[0] in x["consenting"] and r[0] not in x["revoked"]]
    v6 = sum(r[1] for r in x["records"] if r[0] in x["withdrawn"])
    v7 = [{k:r[i] for k,i in (("quantity",1),("value",2)) if k in x["published_fields"]} for r in x["records"]]
    v8 = x["winner"] if x["closed"] and not x["embargo"] else None
    v9 = x["records"] if x["appeal_open"] or x["auditor"] else []
    return {'self-view-scope':v0,'preclose-value-embargo':v1,'distinct-bidder-suppression':v2,'alias-result-view':v3,'auditor-linkage':v4,'consent-qualified-disclosure':v5,'withdrawn-demand-statistic':v6,'field-projection':v7,'embargo-final-result':v8,'appeal-audit-retention':v9}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [('normal contract', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('closed', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': True, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('no withdrawn bids', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': [], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [6, 12, 18, 24, 30]), ('closed / no withdrawn bids', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': True, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': [], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [6, 12, 18, 24, 30]), ('auditor view', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': True, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('outsider view', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'z', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('threshold met', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 2, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('all consent', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a', 'b'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('embargo active', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': True, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('no appeal', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': False, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('all revoked', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a', 'b']}, [3, 6, 9, 12, 15])]
def vary(value):
 if type(value) is int: return value*N
 if isinstance(value,list): return [vary(v) for v in value]
 if isinstance(value,dict): return {k:(v if k in ['count', 'delivery_index', 'disputed', 'maximum_set', 'minimum_set', 'stage', 'threshold', 'waived'] else vary(v)) for k,v in value.items()}
 return value
for label, request, expected in fixtures:
 check(label, solve(vary(request))['withdrawn-demand-statistic'], expected[N-1])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
normal contract33Passed
closed33Passed
no withdrawn bids06Failed
closed / no withdrawn bids06Failed
auditor view33Passed
outsider view33Passed
threshold met33Passed
all consent33Passed
embargo active33Passed
no appeal33Passed
all revoked33Passed

SHA-256 / fe4beb253c88439356f8f3f33b2736d0da67dc0fc2c92f0c9f3773b40631d5c9

3 / The verified repair

Exit 0
"""Failure Map reference implementation. Python standard library only."""
import json

N = 1
observations = []
def solve(x):
    v0 = [r for r in x["records"] if r[0]==x["viewer"]]
    v1 = [r[2] for r in x["records"]] if x["closed"] else []
    v2 = len({r[0] for r in x["records"]})>=x["threshold"]
    v3 = [[x["aliases"].get(r[0],"anonymous"),r[1]] for r in x["records"]]
    v4 = x["aliases"] if x["auditor"] else {}
    v5 = [r[0] for r in x["records"] if r[0] in x["consenting"] and r[0] not in x["revoked"]]
    v6 = sum(r[1] for r in x["records"] if r[0] not in x["withdrawn"])
    v7 = [{k:r[i] for k,i in (("quantity",1),("value",2)) if k in x["published_fields"]} for r in x["records"]]
    v8 = x["winner"] if x["closed"] and not x["embargo"] else None
    v9 = x["records"] if x["appeal_open"] or x["auditor"] else []
    return {'self-view-scope':v0,'preclose-value-embargo':v1,'distinct-bidder-suppression':v2,'alias-result-view':v3,'auditor-linkage':v4,'consent-qualified-disclosure':v5,'withdrawn-demand-statistic':v6,'field-projection':v7,'embargo-final-result':v8,'appeal-audit-retention':v9}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [('normal contract', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('closed', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': True, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('no withdrawn bids', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': [], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [6, 12, 18, 24, 30]), ('closed / no withdrawn bids', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': True, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': [], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [6, 12, 18, 24, 30]), ('auditor view', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': True, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('outsider view', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'z', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('threshold met', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 2, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('all consent', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a', 'b'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('embargo active', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': True, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('no appeal', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': False, 'winner': 'b', 'revoked': ['a']}, [3, 6, 9, 12, 15]), ('all revoked', {'records': [['a', 2, 7], ['b', 3, 9], ['a', 1, 6]], 'viewer': 'a', 'closed': False, 'auditor': False, 'consenting': ['a'], 'threshold': 3, 'aliases': {'a': 'X', 'b': 'Y'}, 'withdrawn': ['b'], 'embargo': False, 'published_fields': ['quantity'], 'appeal_open': True, 'winner': 'b', 'revoked': ['a', 'b']}, [3, 6, 9, 12, 15])]
def vary(value):
 if type(value) is int: return value*N
 if isinstance(value,list): return [vary(v) for v in value]
 if isinstance(value,dict): return {k:(v if k in ['count', 'delivery_index', 'disputed', 'maximum_set', 'minimum_set', 'stage', 'threshold', 'waived'] else vary(v)) for k,v in value.items()}
 return value
for label, request, expected in fixtures:
 check(label, solve(vary(request))['withdrawn-demand-statistic'], expected[N-1])
print(json.dumps({"observations": observations, "passed": all(x["passed"] for x in observations)}, ensure_ascii=False))
raise SystemExit(0 if all(x["passed"] for x in observations) else 1)
Boundary fixtureActualExpectedOutcome
normal contract33Passed
closed33Passed
no withdrawn bids66Passed
closed / no withdrawn bids66Passed
auditor view33Passed
outsider view33Passed
threshold met33Passed
all consent33Passed
embargo active33Passed
no appeal33Passed
all revoked33Passed

SHA-256 / 31124d82445125e4c97c00f387bdc6fc8a97575ea4edc8dd6e30399d50c41ab3

Verification & scope

Stipulated toy auction rules, not a venue specification, financial advice, optimization claim, or live trading implementation. Nonnegative integer inputs and internally aligned list fields only. This reproducer isolates one failure mechanism. Results cover the supplied fixtures. Variants within a family share a test contract and should remain grouped when constructing evaluation splits. Related mechanisms with a shared evaluation_group must also remain together; these controlled models are not independent production incidents.

Observations recorded using Python 3.12.14 at 2026-09-29T14:46:15.657725+00:00.

Case digest / 1c5d98f195f738627d87f40444ec7b41b44fcb1c38aedff8f0ebd93f49978969