FAILURE MAP
← Case archive

FA-56636 / Auction allocation rules / Open access

Clock demand: round demand replay · case 01

Replayed clock-round submissions replace current demand again.

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

ROOT CAUSE

Replayed clock-round submissions replace current demand again.

VERIFIED REPAIR

Ignore old rounds while processing a genuinely new round.

Unsuccessful approach: The attempted repair uses x["old"]; the explicit regression cases demonstrate that this still violates the stipulated auction rule.

Case contract

One bounded clock-auction round maintains per-lot demand at posted prices. Demand reductions become binding only at accepted clock prices; exits cannot be undone; deferred reductions are reconsidered against the new price. Arrays are aligned by lot and values are nonnegative integers. Named decision round-demand-replay: Ignore old rounds while processing a genuinely new round.

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 = [min(o,r) if a else o for o,r,a in zip(x["old"],x["requested"],x["accepted"])]
    v1 = [0 if e else q for e,q in zip(x["exited"],x["requested"])]
    v2 = [p if a else old for p,old,a in zip(x["prices"],x["previous_prices"],x["accepted"])]
    v3 = [min(q,c) for q,c in zip(x["requested"],x["caps"])]
    v4 = [max(0,q-s) for q,s in zip(x["old"],x["supply"])]
    v5 = [i for i,(q,s) in enumerate(zip(x["old"],x["supply"])) if q>s]
    v6 = [d if p>=w else o for d,p,w,o in zip(x["deferred"],x["prices"],x["withdrawal_prices"],x["old"])]
    v7 = all(q<=s for q,s in zip(x["old"],x["supply"]))
    v8 = [a and p!=o for a,p,o in zip(x["accepted"],x["prices"],x["previous_prices"])]
    v9 = x["requested"]
    return {'accepted-reduction':v0,'irreversible-exit':v1,'posted-price-lock':v2,'demand-cap':v3,'excess-demand':v4,'clock-step-selection':v5,'deferred-exit-trigger':v6,'round-clearing-quiescence':v7,'price-change-ack':v8,'round-demand-replay':v9}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [('replayed round', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 1, 'last_round': 1}, [[5, 3], [10, 6], [15, 9], [20, 12], [25, 15]]), ('unequal demand caps / replayed round', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [1, 5], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 1, 'last_round': 1}, [[5, 3], [10, 6], [15, 9], [20, 12], [25, 15]]), ('normal contract', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('unequal demand caps', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [1, 5], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('balanced lots', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [5, 3], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('cross lot surplus', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 9], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('exit at trigger', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [9, 25], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('all accepted', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, True], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('none accepted', {'old': [5, 3], 'requested': [2, 4], 'accepted': [False, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('no exited lots', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, False], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('auction reopened', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': True, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]])]
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))['round-demand-replay'], 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
replayed round[2, 4][5, 3]Failed
unequal demand caps / replayed round[2, 4][5, 3]Failed
normal contract[2, 4][2, 4]Passed
unequal demand caps[2, 4][2, 4]Passed
balanced lots[2, 4][2, 4]Passed
cross lot surplus[2, 4][2, 4]Passed
exit at trigger[2, 4][2, 4]Passed
all accepted[2, 4][2, 4]Passed
none accepted[2, 4][2, 4]Passed
no exited lots[2, 4][2, 4]Passed
auction reopened[2, 4][2, 4]Passed

SHA-256 / 3087ed397e9c4c757169b5f53fd655bf3a1f6257b1a638f61a4c5db6a6a7c89e

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(x):
    v0 = [min(o,r) if a else o for o,r,a in zip(x["old"],x["requested"],x["accepted"])]
    v1 = [0 if e else q for e,q in zip(x["exited"],x["requested"])]
    v2 = [p if a else old for p,old,a in zip(x["prices"],x["previous_prices"],x["accepted"])]
    v3 = [min(q,c) for q,c in zip(x["requested"],x["caps"])]
    v4 = [max(0,q-s) for q,s in zip(x["old"],x["supply"])]
    v5 = [i for i,(q,s) in enumerate(zip(x["old"],x["supply"])) if q>s]
    v6 = [d if p>=w else o for d,p,w,o in zip(x["deferred"],x["prices"],x["withdrawal_prices"],x["old"])]
    v7 = all(q<=s for q,s in zip(x["old"],x["supply"]))
    v8 = [a and p!=o for a,p,o in zip(x["accepted"],x["prices"],x["previous_prices"])]
    v9 = x["old"]
    return {'accepted-reduction':v0,'irreversible-exit':v1,'posted-price-lock':v2,'demand-cap':v3,'excess-demand':v4,'clock-step-selection':v5,'deferred-exit-trigger':v6,'round-clearing-quiescence':v7,'price-change-ack':v8,'round-demand-replay':v9}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [('replayed round', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 1, 'last_round': 1}, [[5, 3], [10, 6], [15, 9], [20, 12], [25, 15]]), ('unequal demand caps / replayed round', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [1, 5], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 1, 'last_round': 1}, [[5, 3], [10, 6], [15, 9], [20, 12], [25, 15]]), ('normal contract', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('unequal demand caps', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [1, 5], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('balanced lots', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [5, 3], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('cross lot surplus', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 9], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('exit at trigger', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [9, 25], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('all accepted', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, True], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('none accepted', {'old': [5, 3], 'requested': [2, 4], 'accepted': [False, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('no exited lots', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, False], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('auction reopened', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': True, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]])]
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))['round-demand-replay'], 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
replayed round[5, 3][5, 3]Passed
unequal demand caps / replayed round[5, 3][5, 3]Passed
normal contract[5, 3][2, 4]Failed
unequal demand caps[5, 3][2, 4]Failed
balanced lots[5, 3][2, 4]Failed
cross lot surplus[5, 3][2, 4]Failed
exit at trigger[5, 3][2, 4]Failed
all accepted[5, 3][2, 4]Failed
none accepted[5, 3][2, 4]Failed
no exited lots[5, 3][2, 4]Failed
auction reopened[5, 3][2, 4]Failed

SHA-256 / 6dcb1f904846ade0f7ea440841c240a1ce8425f152d0815fc937ee31eabdd758

3 / The verified repair

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

N = 1
observations = []
def solve(x):
    v0 = [min(o,r) if a else o for o,r,a in zip(x["old"],x["requested"],x["accepted"])]
    v1 = [0 if e else q for e,q in zip(x["exited"],x["requested"])]
    v2 = [p if a else old for p,old,a in zip(x["prices"],x["previous_prices"],x["accepted"])]
    v3 = [min(q,c) for q,c in zip(x["requested"],x["caps"])]
    v4 = [max(0,q-s) for q,s in zip(x["old"],x["supply"])]
    v5 = [i for i,(q,s) in enumerate(zip(x["old"],x["supply"])) if q>s]
    v6 = [d if p>=w else o for d,p,w,o in zip(x["deferred"],x["prices"],x["withdrawal_prices"],x["old"])]
    v7 = all(q<=s for q,s in zip(x["old"],x["supply"]))
    v8 = [a and p!=o for a,p,o in zip(x["accepted"],x["prices"],x["previous_prices"])]
    v9 = x["old"] if x["round"]<=x["last_round"] else x["requested"]
    return {'accepted-reduction':v0,'irreversible-exit':v1,'posted-price-lock':v2,'demand-cap':v3,'excess-demand':v4,'clock-step-selection':v5,'deferred-exit-trigger':v6,'round-clearing-quiescence':v7,'price-change-ack':v8,'round-demand-replay':v9}
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [('replayed round', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 1, 'last_round': 1}, [[5, 3], [10, 6], [15, 9], [20, 12], [25, 15]]), ('unequal demand caps / replayed round', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [1, 5], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 1, 'last_round': 1}, [[5, 3], [10, 6], [15, 9], [20, 12], [25, 15]]), ('normal contract', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('unequal demand caps', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [1, 5], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('balanced lots', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [5, 3], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('cross lot surplus', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 9], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('exit at trigger', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [9, 25], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('all accepted', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, True], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('none accepted', {'old': [5, 3], 'requested': [2, 4], 'accepted': [False, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('no exited lots', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, False], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': False, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]]), ('auction reopened', {'old': [5, 3], 'requested': [2, 4], 'accepted': [True, False], 'exited': [False, True], 'prices': [10, 20], 'previous_prices': [8, 20], 'caps': [3, 3], 'supply': [4, 2], 'deferred': [1, 2], 'withdrawal_prices': [9, 25], 'reopened': True, 'round': 2, 'last_round': 1}, [[2, 4], [4, 8], [6, 12], [8, 16], [10, 20]])]
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))['round-demand-replay'], 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
replayed round[5, 3][5, 3]Passed
unequal demand caps / replayed round[5, 3][5, 3]Passed
normal contract[2, 4][2, 4]Passed
unequal demand caps[2, 4][2, 4]Passed
balanced lots[2, 4][2, 4]Passed
cross lot surplus[2, 4][2, 4]Passed
exit at trigger[2, 4][2, 4]Passed
all accepted[2, 4][2, 4]Passed
none accepted[2, 4][2, 4]Passed
no exited lots[2, 4][2, 4]Passed
auction reopened[2, 4][2, 4]Passed

SHA-256 / 906879d66cedbef4592cf966132bf4ec6050909f5382811700708bb04b9d5448

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:08.970342+00:00.

Case digest / 99695e5d06ce9db4777488de5d3fc5286697fe09e0b89f48fdd1056a634b43bf