FAILURE MAP
← Case archive

FA-79591 / Barcode symbology encoding / Open access

Empty batch numbers are accepted · case 01

A blank batch field yields an AI with no data followed by FNC1.

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

ROOT CAUSE

The variable-length check has no minimum length.

VERIFIED REPAIR

Require between 1 and the maximum length.

Unsuccessful approach: An exclusive maximum rejects values of exactly the maximum length.

Case contract

Assemble GS1-128 data from [AI, value] pairs; "#" stands for FNC1. The string starts with FNC1. Predefined fixed-length AIs: 00 (18), 01 and 02 (14), 11/13/15/17 (6), 3103 (6); variable-length AIs with maximum length: 10 and 21 (20), 30 and 37 (8), 400 (30). Numeric AIs: 00, 01, 02, 11, 13, 15, 17, 3103, 30, 37. Values use printable ASCII 33..126 except "#". A variable-length field is followed by FNC1 unless it is last. Errors: unknown-ai, bad-value.

Why this case matters

Retail, logistics, pharmacy and document workflows depend on encoders that produce exactly the module pattern, code-set switches, separators and quiet zones scanners expect; one misplaced module or separator makes a label unreadable or, worse, scan as different data.

1 / The failure

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

N = 1
observations = []
def solve(fields):
    fixed_len = {'00': 18, '01': 14, '02': 14, '11': 6, '13': 6, '15': 6, '17': 6, '3103': 6}
    var_max = {'10': 20, '21': 20, '30': 8, '37': 8, '400': 30}
    numeric = {'00', '01', '02', '11', '13', '15', '17', '3103', '30', '37'}
    out = '#'
    for idx, (ai, val) in enumerate(fields):
        if ai in fixed_len:
            if len(val) != fixed_len[ai]:
                return {'error': 'bad-value', 'ai': ai}
        elif ai in var_max:
            if not len(val) <= var_max[ai]:
                return {'error': 'bad-value', 'ai': ai}
        else:
            return {'error': 'unknown-ai', 'ai': ai}
        if ai in numeric and not all(c in '0123456789' for c in val):
            return {'error': 'bad-value', 'ai': ai}
        if not all(33 <= ord(c) <= 126 and c != '#' for c in val):
            return {'error': 'bad-value', 'ai': ai}
        out += ai + val
        if ai in var_max and idx < len(fields) - 1:
            out += '#'
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[['13', '149704'], ['30', ''], ['37', '48059']], {'error': 'bad-value', 'ai': '30'}], [[['400', 'X9B1-1X9--'], ['3103', '754725'], ['30', '31441746']], '#400X9B1-1X9--#31037547253031441746'], [[['17', '124248'], ['400', 'BAB1XXX/9BAB1B1XC1BCX'], ['30', '86711'], ['11', '769392']], '#17124248400BAB1XXX/9BAB1B1XC1BCX#3086711#11769392'], [[['00', '90045075234391735A']], {'error': 'bad-value', 'ai': '00'}], [[['30', '314304438']], {'error': 'bad-value', 'ai': '30'}], [[['30', '498926295']], {'error': 'bad-value', 'ai': '30'}], [[['400', '/111CAB9B19'], ['13', '210963'], ['30', '0326813'], ['01', '75824941622232']], '#400/111CAB9B19#13210963300326813#0175824941622232'], [[['10', ''], ['17', '708999'], ['10', '99'], ['400', 'B1B9AAA9-']], {'error': 'bad-value', 'ai': '10'}]], [[[['17', '905029'], ['400', '']], {'error': 'bad-value', 'ai': '400'}], [[['400', 'A/'], ['37', '81828391']], '#400A/#3781828391'], [[['11', '827833']], '#11827833'], [[['10', '999B9'], ['02', '83916947090792'], ['02', '6235977446030']], {'error': 'bad-value', 'ai': '02'}], [[['17', '194565'], ['3103', '606142'], ['11', '39946#'], ['13', '993221']], {'error': 'bad-value', 'ai': '11'}], [[['02', '50315475817306'], ['13', '780102'], ['30', '86357A'], ['21', '-9C/C9BB-']], {'error': 'bad-value', 'ai': '30'}], [[['15', '20240101'], ['01', '50134768665104']], {'error': 'bad-value', 'ai': '15'}], [[['400', ''], ['21', '1AAC/A1C9-X91B91-'], ['10', 'C1-XXA19ABA-']], {'error': 'bad-value', 'ai': '400'}]], [[[['400', 'C--BB-1BAAC1BA91191/'], ['02', '81613848231643'], ['30', ''], ['3103', '051747']], {'error': 'bad-value', 'ai': '30'}], [[['30', '20240101']], '#3020240101'], [[['15', '337921'], ['10', '99B9XB911A1XA91XB-/B'], ['30', ''], ['15', '970274']], {'error': 'bad-value', 'ai': '30'}], [[['400', '-']], '#400-'], [[['3103', '826746'], ['37', '0899595'], ['01', '55301929154724'], ['17', '991161']], '#3103826746370899595#015530192915472417991161'], [[['3103', '506096'], ['30', '1'], ['11', '465886']], '#3103506096301#11465886'], [[['3103', '']], {'error': 'bad-value', 'ai': '3103'}], [[['37', '']], {'error': 'bad-value', 'ai': '37'}]], [[[['01', '81954733451676'], ['01', '05145413336012'], ['30', '']], {'error': 'bad-value', 'ai': '30'}], [[['37', '70018996']], '#3770018996'], [[['15', '60641#'], ['13', '753605']], {'error': 'bad-value', 'ai': '15'}], [[['400', '-CA9C-XA1X-9A/CBA/91-']], '#400-CA9C-XA1X-9A/CBA/91-'], [[['15', '29986'], ['11', '20240101']], {'error': 'bad-value', 'ai': '15'}], [[['17', ''], ['11', ''], ['13', '934852']], {'error': 'bad-value', 'ai': '17'}], [[['11', '293752']], '#11293752'], [[['400', ''], ['01', '14756122304445'], ['01', '52175558443198']], {'error': 'bad-value', 'ai': '400'}]], [[[['15', '963083'], ['30', '463'], ['02', '29083156115606'], ['30', '']], {'error': 'bad-value', 'ai': '30'}], [[['10', '91C-BB1A9/19X/A-19-X'], ['15', '90580A'], ['15', '058920'], ['10', '19///-9AXCX1X-9A/XB--B']], {'error': 'bad-value', 'ai': '15'}], [[['15', '009908'], ['11', '813644']], '#1500990811813644'], [[['3103', '391395'], ['37', '67'], ['17', '083210'], ['00', '300168916917459102']], '#31033913953767#1708321000300168916917459102'], [[['01', '21550398685673'], ['15', '789070'], ['13', '754989']], '#01215503986856731578907013754989'], [[['11', '798565'], ['21', 'B-X1C/'], ['17', '896229']], '#1179856521B-X1C/#17896229'], [[['21', '/991AC-B19-'], ['00', '844941356003928549'], ['00', '31935944130684552 ']], {'error': 'bad-value', 'ai': '00'}], [[['30', ''], ['13', '195409']], {'error': 'bad-value', 'ai': '30'}]]]
labels = ["regression: variable-length bounds", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (labels[i % len(labels)], i), solve(args), expected)
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
regression: variable-length bounds 0#1314970430#3748059{'ai': '30', 'error': 'bad-value'}Failed
repair trap 1#400X9B1-1X9--#31037547253031441746#400X9B1-1X9--#31037547253031441746Passed
combined fault 2#17124248400BAB1XXX/9BAB1B1XC1BCX#3086711#11769392#17124248400BAB1XXX/9BAB1B1XC1BCX#3086711#11769392Passed
control 3{'ai': '00', 'error': 'bad-value'}{'ai': '00', 'error': 'bad-value'}Passed
control 4{'ai': '30', 'error': 'bad-value'}{'ai': '30', 'error': 'bad-value'}Passed
boundary 5{'ai': '30', 'error': 'bad-value'}{'ai': '30', 'error': 'bad-value'}Passed
boundary 6#400/111CAB9B19#13210963300326813#0175824941622232#400/111CAB9B19#13210963300326813#0175824941622232Passed
control 7#10#177089991099#400B1B9AAA9-{'ai': '10', 'error': 'bad-value'}Failed

SHA-256 / f6c4c2c0e9f8a480e34051b796e0be09728d135865039f9b6127ec1b3a2c8d9f

2 / The unsuccessful fix

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

N = 1
observations = []
def solve(fields):
    fixed_len = {'00': 18, '01': 14, '02': 14, '11': 6, '13': 6, '15': 6, '17': 6, '3103': 6}
    var_max = {'10': 20, '21': 20, '30': 8, '37': 8, '400': 30}
    numeric = {'00', '01', '02', '11', '13', '15', '17', '3103', '30', '37'}
    out = '#'
    for idx, (ai, val) in enumerate(fields):
        if ai in fixed_len:
            if len(val) != fixed_len[ai]:
                return {'error': 'bad-value', 'ai': ai}
        elif ai in var_max:
            if not 1 <= len(val) < var_max[ai]:
                return {'error': 'bad-value', 'ai': ai}
        else:
            return {'error': 'unknown-ai', 'ai': ai}
        if ai in numeric and not all(c in '0123456789' for c in val):
            return {'error': 'bad-value', 'ai': ai}
        if not all(33 <= ord(c) <= 126 and c != '#' for c in val):
            return {'error': 'bad-value', 'ai': ai}
        out += ai + val
        if ai in var_max and idx < len(fields) - 1:
            out += '#'
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[['13', '149704'], ['30', ''], ['37', '48059']], {'error': 'bad-value', 'ai': '30'}], [[['400', 'X9B1-1X9--'], ['3103', '754725'], ['30', '31441746']], '#400X9B1-1X9--#31037547253031441746'], [[['17', '124248'], ['400', 'BAB1XXX/9BAB1B1XC1BCX'], ['30', '86711'], ['11', '769392']], '#17124248400BAB1XXX/9BAB1B1XC1BCX#3086711#11769392'], [[['00', '90045075234391735A']], {'error': 'bad-value', 'ai': '00'}], [[['30', '314304438']], {'error': 'bad-value', 'ai': '30'}], [[['30', '498926295']], {'error': 'bad-value', 'ai': '30'}], [[['400', '/111CAB9B19'], ['13', '210963'], ['30', '0326813'], ['01', '75824941622232']], '#400/111CAB9B19#13210963300326813#0175824941622232'], [[['10', ''], ['17', '708999'], ['10', '99'], ['400', 'B1B9AAA9-']], {'error': 'bad-value', 'ai': '10'}]], [[[['17', '905029'], ['400', '']], {'error': 'bad-value', 'ai': '400'}], [[['400', 'A/'], ['37', '81828391']], '#400A/#3781828391'], [[['11', '827833']], '#11827833'], [[['10', '999B9'], ['02', '83916947090792'], ['02', '6235977446030']], {'error': 'bad-value', 'ai': '02'}], [[['17', '194565'], ['3103', '606142'], ['11', '39946#'], ['13', '993221']], {'error': 'bad-value', 'ai': '11'}], [[['02', '50315475817306'], ['13', '780102'], ['30', '86357A'], ['21', '-9C/C9BB-']], {'error': 'bad-value', 'ai': '30'}], [[['15', '20240101'], ['01', '50134768665104']], {'error': 'bad-value', 'ai': '15'}], [[['400', ''], ['21', '1AAC/A1C9-X91B91-'], ['10', 'C1-XXA19ABA-']], {'error': 'bad-value', 'ai': '400'}]], [[[['400', 'C--BB-1BAAC1BA91191/'], ['02', '81613848231643'], ['30', ''], ['3103', '051747']], {'error': 'bad-value', 'ai': '30'}], [[['30', '20240101']], '#3020240101'], [[['15', '337921'], ['10', '99B9XB911A1XA91XB-/B'], ['30', ''], ['15', '970274']], {'error': 'bad-value', 'ai': '30'}], [[['400', '-']], '#400-'], [[['3103', '826746'], ['37', '0899595'], ['01', '55301929154724'], ['17', '991161']], '#3103826746370899595#015530192915472417991161'], [[['3103', '506096'], ['30', '1'], ['11', '465886']], '#3103506096301#11465886'], [[['3103', '']], {'error': 'bad-value', 'ai': '3103'}], [[['37', '']], {'error': 'bad-value', 'ai': '37'}]], [[[['01', '81954733451676'], ['01', '05145413336012'], ['30', '']], {'error': 'bad-value', 'ai': '30'}], [[['37', '70018996']], '#3770018996'], [[['15', '60641#'], ['13', '753605']], {'error': 'bad-value', 'ai': '15'}], [[['400', '-CA9C-XA1X-9A/CBA/91-']], '#400-CA9C-XA1X-9A/CBA/91-'], [[['15', '29986'], ['11', '20240101']], {'error': 'bad-value', 'ai': '15'}], [[['17', ''], ['11', ''], ['13', '934852']], {'error': 'bad-value', 'ai': '17'}], [[['11', '293752']], '#11293752'], [[['400', ''], ['01', '14756122304445'], ['01', '52175558443198']], {'error': 'bad-value', 'ai': '400'}]], [[[['15', '963083'], ['30', '463'], ['02', '29083156115606'], ['30', '']], {'error': 'bad-value', 'ai': '30'}], [[['10', '91C-BB1A9/19X/A-19-X'], ['15', '90580A'], ['15', '058920'], ['10', '19///-9AXCX1X-9A/XB--B']], {'error': 'bad-value', 'ai': '15'}], [[['15', '009908'], ['11', '813644']], '#1500990811813644'], [[['3103', '391395'], ['37', '67'], ['17', '083210'], ['00', '300168916917459102']], '#31033913953767#1708321000300168916917459102'], [[['01', '21550398685673'], ['15', '789070'], ['13', '754989']], '#01215503986856731578907013754989'], [[['11', '798565'], ['21', 'B-X1C/'], ['17', '896229']], '#1179856521B-X1C/#17896229'], [[['21', '/991AC-B19-'], ['00', '844941356003928549'], ['00', '31935944130684552 ']], {'error': 'bad-value', 'ai': '00'}], [[['30', ''], ['13', '195409']], {'error': 'bad-value', 'ai': '30'}]]]
labels = ["regression: variable-length bounds", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (labels[i % len(labels)], i), solve(args), expected)
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
regression: variable-length bounds 0{'ai': '30', 'error': 'bad-value'}{'ai': '30', 'error': 'bad-value'}Passed
repair trap 1{'ai': '30', 'error': 'bad-value'}#400X9B1-1X9--#31037547253031441746Failed
combined fault 2#17124248400BAB1XXX/9BAB1B1XC1BCX#3086711#11769392#17124248400BAB1XXX/9BAB1B1XC1BCX#3086711#11769392Passed
control 3{'ai': '00', 'error': 'bad-value'}{'ai': '00', 'error': 'bad-value'}Passed
control 4{'ai': '30', 'error': 'bad-value'}{'ai': '30', 'error': 'bad-value'}Passed
boundary 5{'ai': '30', 'error': 'bad-value'}{'ai': '30', 'error': 'bad-value'}Passed
boundary 6#400/111CAB9B19#13210963300326813#0175824941622232#400/111CAB9B19#13210963300326813#0175824941622232Passed
control 7{'ai': '10', 'error': 'bad-value'}{'ai': '10', 'error': 'bad-value'}Passed

SHA-256 / 46f5aad66bb484d6d1c3eb36f67ab61709ccabce6868fbb4e05455d20788787c

3 / The verified repair

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

N = 1
observations = []
def solve(fields):
    fixed_len = {'00': 18, '01': 14, '02': 14, '11': 6, '13': 6, '15': 6, '17': 6, '3103': 6}
    var_max = {'10': 20, '21': 20, '30': 8, '37': 8, '400': 30}
    numeric = {'00', '01', '02', '11', '13', '15', '17', '3103', '30', '37'}
    out = '#'
    for idx, (ai, val) in enumerate(fields):
        if ai in fixed_len:
            if len(val) != fixed_len[ai]:
                return {'error': 'bad-value', 'ai': ai}
        elif ai in var_max:
            if not 1 <= len(val) <= var_max[ai]:
                return {'error': 'bad-value', 'ai': ai}
        else:
            return {'error': 'unknown-ai', 'ai': ai}
        if ai in numeric and not all(c in '0123456789' for c in val):
            return {'error': 'bad-value', 'ai': ai}
        if not all(33 <= ord(c) <= 126 and c != '#' for c in val):
            return {'error': 'bad-value', 'ai': ai}
        out += ai + val
        if ai in var_max and idx < len(fields) - 1:
            out += '#'
    return out
def check(label, actual, expected):
    observations.append({"check": label, "actual": actual, "expected": expected, "passed": actual == expected})
fixtures = [[[[['13', '149704'], ['30', ''], ['37', '48059']], {'error': 'bad-value', 'ai': '30'}], [[['400', 'X9B1-1X9--'], ['3103', '754725'], ['30', '31441746']], '#400X9B1-1X9--#31037547253031441746'], [[['17', '124248'], ['400', 'BAB1XXX/9BAB1B1XC1BCX'], ['30', '86711'], ['11', '769392']], '#17124248400BAB1XXX/9BAB1B1XC1BCX#3086711#11769392'], [[['00', '90045075234391735A']], {'error': 'bad-value', 'ai': '00'}], [[['30', '314304438']], {'error': 'bad-value', 'ai': '30'}], [[['30', '498926295']], {'error': 'bad-value', 'ai': '30'}], [[['400', '/111CAB9B19'], ['13', '210963'], ['30', '0326813'], ['01', '75824941622232']], '#400/111CAB9B19#13210963300326813#0175824941622232'], [[['10', ''], ['17', '708999'], ['10', '99'], ['400', 'B1B9AAA9-']], {'error': 'bad-value', 'ai': '10'}]], [[[['17', '905029'], ['400', '']], {'error': 'bad-value', 'ai': '400'}], [[['400', 'A/'], ['37', '81828391']], '#400A/#3781828391'], [[['11', '827833']], '#11827833'], [[['10', '999B9'], ['02', '83916947090792'], ['02', '6235977446030']], {'error': 'bad-value', 'ai': '02'}], [[['17', '194565'], ['3103', '606142'], ['11', '39946#'], ['13', '993221']], {'error': 'bad-value', 'ai': '11'}], [[['02', '50315475817306'], ['13', '780102'], ['30', '86357A'], ['21', '-9C/C9BB-']], {'error': 'bad-value', 'ai': '30'}], [[['15', '20240101'], ['01', '50134768665104']], {'error': 'bad-value', 'ai': '15'}], [[['400', ''], ['21', '1AAC/A1C9-X91B91-'], ['10', 'C1-XXA19ABA-']], {'error': 'bad-value', 'ai': '400'}]], [[[['400', 'C--BB-1BAAC1BA91191/'], ['02', '81613848231643'], ['30', ''], ['3103', '051747']], {'error': 'bad-value', 'ai': '30'}], [[['30', '20240101']], '#3020240101'], [[['15', '337921'], ['10', '99B9XB911A1XA91XB-/B'], ['30', ''], ['15', '970274']], {'error': 'bad-value', 'ai': '30'}], [[['400', '-']], '#400-'], [[['3103', '826746'], ['37', '0899595'], ['01', '55301929154724'], ['17', '991161']], '#3103826746370899595#015530192915472417991161'], [[['3103', '506096'], ['30', '1'], ['11', '465886']], '#3103506096301#11465886'], [[['3103', '']], {'error': 'bad-value', 'ai': '3103'}], [[['37', '']], {'error': 'bad-value', 'ai': '37'}]], [[[['01', '81954733451676'], ['01', '05145413336012'], ['30', '']], {'error': 'bad-value', 'ai': '30'}], [[['37', '70018996']], '#3770018996'], [[['15', '60641#'], ['13', '753605']], {'error': 'bad-value', 'ai': '15'}], [[['400', '-CA9C-XA1X-9A/CBA/91-']], '#400-CA9C-XA1X-9A/CBA/91-'], [[['15', '29986'], ['11', '20240101']], {'error': 'bad-value', 'ai': '15'}], [[['17', ''], ['11', ''], ['13', '934852']], {'error': 'bad-value', 'ai': '17'}], [[['11', '293752']], '#11293752'], [[['400', ''], ['01', '14756122304445'], ['01', '52175558443198']], {'error': 'bad-value', 'ai': '400'}]], [[[['15', '963083'], ['30', '463'], ['02', '29083156115606'], ['30', '']], {'error': 'bad-value', 'ai': '30'}], [[['10', '91C-BB1A9/19X/A-19-X'], ['15', '90580A'], ['15', '058920'], ['10', '19///-9AXCX1X-9A/XB--B']], {'error': 'bad-value', 'ai': '15'}], [[['15', '009908'], ['11', '813644']], '#1500990811813644'], [[['3103', '391395'], ['37', '67'], ['17', '083210'], ['00', '300168916917459102']], '#31033913953767#1708321000300168916917459102'], [[['01', '21550398685673'], ['15', '789070'], ['13', '754989']], '#01215503986856731578907013754989'], [[['11', '798565'], ['21', 'B-X1C/'], ['17', '896229']], '#1179856521B-X1C/#17896229'], [[['21', '/991AC-B19-'], ['00', '844941356003928549'], ['00', '31935944130684552 ']], {'error': 'bad-value', 'ai': '00'}], [[['30', ''], ['13', '195409']], {'error': 'bad-value', 'ai': '30'}]]]
labels = ["regression: variable-length bounds", "repair trap", "combined fault", "control", "control", "boundary", "boundary", "control"]
for i, (args, expected) in enumerate(fixtures[N-1]):
    check("%s %d" % (labels[i % len(labels)], i), solve(args), expected)
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
regression: variable-length bounds 0{'ai': '30', 'error': 'bad-value'}{'ai': '30', 'error': 'bad-value'}Passed
repair trap 1#400X9B1-1X9--#31037547253031441746#400X9B1-1X9--#31037547253031441746Passed
combined fault 2#17124248400BAB1XXX/9BAB1B1XC1BCX#3086711#11769392#17124248400BAB1XXX/9BAB1B1XC1BCX#3086711#11769392Passed
control 3{'ai': '00', 'error': 'bad-value'}{'ai': '00', 'error': 'bad-value'}Passed
control 4{'ai': '30', 'error': 'bad-value'}{'ai': '30', 'error': 'bad-value'}Passed
boundary 5{'ai': '30', 'error': 'bad-value'}{'ai': '30', 'error': 'bad-value'}Passed
boundary 6#400/111CAB9B19#13210963300326813#0175824941622232#400/111CAB9B19#13210963300326813#0175824941622232Passed
control 7{'ai': '10', 'error': 'bad-value'}{'ai': '10', 'error': 'bad-value'}Passed

SHA-256 / d2425dfa5a6f97d0776c8fb823fc1ee05124145eb43424a3ed3c0e2433497a3f

Verification & scope

A deterministic bounded teaching model with a stipulated contract; it makes no claim of conformance to any published specification. 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:49:45.934643+00:00.

Case digest / edf88685d46c64c82ee7b5e1b79c661d0ec1c51d81a4b6cfb525428d3d8b87ac