From 2e9b64441bbbeeb73f4ba3d42b9763f6056f9d13 Mon Sep 17 00:00:00 2001 From: Implementer Date: Mon, 12 Oct 2026 21:54:01 +0200 Subject: [PATCH] Takes design v0.151.0 This re-pin moves @robertblust/design from v0.150.0 to v0.151.0. The chat widget draws a use case's three pictures: the actor's mark, an outlined figure for someone who is not one of us, joins the marks, the pictures are captioned Use case, Scenario and Requirements, Anwendungsfall, Szenario and Anforderungen in German, and each has its reading line in both languages. This instance holds no use case, so the host refuses the shapes and the chat answers in words; the widget is ready for the day it does. The model and parser pins stay where they are. npm run design rewrote chat.js and chat.css; the pages, the cards and the sitemap followed. Verified: the lockfile resolves @robertblust/design to 65b78c6, the tag's commit; npm run design, pages, pictures, pages, og and sitemap ran; the checks of pins.json's verify list passed locally, and npm run verify with the link check against a server on its own port passed when run alone, after a first run in which the served check asked before the server listened. Process: Delivery Phase: Implement Track: Code Co-Authored-By: Claude Fable 5.1 --- api/og.sha | 2 +- billing/og.sha | 2 +- chat.css | 5 ++++- chat.js | 12 +++++++----- model/og.sha | 2 +- og.sha | 2 +- package-lock.json | 6 +++--- package.json | 2 +- principles/og.sha | 2 +- privacy/og.sha | 2 +- problems/og.sha | 2 +- processes/og.sha | 2 +- processes/pictures/answering.sha | 2 +- processes/pictures/contribution.sha | 2 +- processes/pictures/deciding.sha | 2 +- processes/pictures/delivery.sha | 2 +- processes/pictures/feature-request.sha | 2 +- processes/pictures/narrating.sha | 2 +- surfaces/og.sha | 2 +- talks/intro/og.sha | 2 +- talks/og.sha | 2 +- 21 files changed, 32 insertions(+), 27 deletions(-) diff --git a/api/og.sha b/api/og.sha index 81749f6..bd39cb7 100644 --- a/api/og.sha +++ b/api/og.sha @@ -1 +1 @@ -f7bccbe8fca84fb81dfcd8d6069ac8865948f2bb9a7e42658ba7a2ac8920481b +b0dc13542dc3d646d3d60af1a29989be66feb93c4f8ab7ab4b7328797cd84b92 diff --git a/billing/og.sha b/billing/og.sha index 2c91ee1..eab1465 100644 --- a/billing/og.sha +++ b/billing/og.sha @@ -1 +1 @@ -a66d59955dc65fbc07fb3d8a1bebee0ace48754c9fad4c6b8fa971a0844ce010 +16ce5f5d2457f0ace4463a8eabe20c76cd6e9a337e65a80d5ea9ad99274259f5 diff --git a/chat.css b/chat.css index 19768ad..f78c782 100644 --- a/chat.css +++ b/chat.css @@ -213,12 +213,15 @@ html[data-chat-waiting]::after{content:"ask \00b7 " attr(data-chat-waiting);pos sized to the text; a person's mark is the firm brightness and an agent's the mid, as the Processes page draws them, and both beat the linked label's own color; a system's element mark is the firm brightness too, since a system is a thing and not an agent. An open position is a - dashed box with no fill, and the frame the agents of a group stand in is shaded. */ + dashed box with no fill, as is a scenario's extension, and the frame the agents of a group + stand in is shaded. */ .rbchat-diagram-box svg .label-icon{width:1.15em;height:1.15em;vertical-align:-.2em;margin-right:.3em} .rbchat-diagram-box svg .rbchat-mark.human{color:var(--c-firm,var(--ink))!important} .rbchat-diagram-box svg .rbchat-mark.agent{color:var(--c-mid)!important} +.rbchat-diagram-box svg .rbchat-mark.actor{color:var(--c-firm,var(--ink))!important} .rbchat-diagram-box svg .rbchat-mark.element{color:var(--c-firm,var(--ink))!important} .rbchat-diagram-box svg .node.open rect{fill:none!important} +.rbchat-diagram-box svg .node.ext rect{fill:none!important} .rbchat-diagram-box svg .cluster.agents rect{fill:var(--press)!important} .rbchat-diagram-reading{margin:.35rem .1rem 0;font-size:.8rem;line-height:1.4;color:var(--dim)} /* A page's own picture is a preview: fitted to the column, never past its own size, and diff --git a/chat.js b/chat.js index e8e2aee..23b70db 100644 --- a/chat.js +++ b/chat.js @@ -129,7 +129,7 @@ github: "{title} on GitHub", commit: "commit {sha}", modalClose: "Close \u00b7 Esc", ask: { from: "The link you opened asks:", label: "A question from the link you opened", send: "Send", edit: "Edit", discard: "Discard" }, - diagram: { concepts: "Concepts", process: "Process", neighborhood: "Connections", schema: "Meta-model", context: "Context map", aggregate: "Aggregate", flow: "Flow", lifecycle: "Lifecycle", organization: "Organization", system: "Landscape", holds: "Data held", reading: { context: "One-way arrows run from upstream to downstream; each arrow names the pattern between the two contexts.", aggregate: "The root holds what the diamonds join; the dashed arrows are the events it emits.", flow: "Solid arrows are commands sent to the aggregate, dashed arrows the events it emits; a box names the condition of each branch.", lifecycle: "Each arrow is a step from one state to the next, labeled with the command that takes it where there is one.", organization: "Solid arrows run from a lead to the leads below; a dashed line joins staff to the head they serve; a dashed box is an open position, beside a lead the search for a successor; agents stand in the shaded frame, and a dotted arrow from a person to an agent says who directs it, where an agent with no arrow is directed by everyone in the frame.", system: "Solid arrows run from the system the data comes from to the one that takes it, labeled with the interface, what is carried and how; a dotted line joins a system to what it runs on; a rounded box is a service the system provides; a cylinder is data it holds, by a heavy arrow where its copy leads, a solid one where it writes and a dotted one where it only reads.", holds: "Each cylinder is data kept of the concept named under it; a heavy arrow marks the system whose copy leads, a solid one a system that writes a copy of its own, a dotted one a system that only reads." }, expand: "Open full screen", shut: "Close full screen", zoomIn: "Zoom in", zoomOut: "Zoom out", fit: "Fit", fitTip: "Fit to the screen", failed: "The diagram could not be drawn; this is its source." }, + diagram: { concepts: "Concepts", process: "Process", neighborhood: "Connections", schema: "Meta-model", context: "Context map", aggregate: "Aggregate", flow: "Flow", lifecycle: "Lifecycle", organization: "Organization", system: "Landscape", holds: "Data held", usecase: "Use case", scenario: "Scenario", requirements: "Requirements", reading: { context: "One-way arrows run from upstream to downstream; each arrow names the pattern between the two contexts.", aggregate: "The root holds what the diamonds join; the dashed arrows are the events it emits.", flow: "Solid arrows are commands sent to the aggregate, dashed arrows the events it emits; a box names the condition of each branch.", lifecycle: "Each arrow is a step from one state to the next, labeled with the command that takes it where there is one.", organization: "Solid arrows run from a lead to the leads below; a dashed line joins staff to the head they serve; a dashed box is an open position, beside a lead the search for a successor; agents stand in the shaded frame, and a dotted arrow from a person to an agent says who directs it, where an agent with no arrow is directed by everyone in the frame.", system: "Solid arrows run from the system the data comes from to the one that takes it, labeled with the interface, what is carried and how; a dotted line joins a system to what it runs on; a rounded box is a service the system provides; a cylinder is data it holds, by a heavy arrow where its copy leads, a solid one where it writes and a dotted one where it only reads.", holds: "Each cylinder is data kept of the concept named under it; a heavy arrow marks the system whose copy leads, a solid one a system that writes a copy of its own, a dotted one a system that only reads.", usecase: "The actor stands outside the frame, which is the use case's scope; a dashed arrow runs from a use case to one its steps include, a solid one to a feature it asks something of; a hexagon is a requirement it is held to, with a heavy border where it must and a dashed one where it may.", scenario: "The rounded box is the trigger; each box is a step, in order, with who acts; a dashed box is an extension, the condition first and what happens then.", requirements: "A hexagon is a requirement, with a heavy border where it must and a dashed one where it may, in a frame for its kind; an arrow runs to what it applies to, a dotted one to a rule it follows." }, expand: "Open full screen", shut: "Close full screen", zoomIn: "Zoom in", zoomOut: "Zoom out", fit: "Fit", fitTip: "Fit to the screen", failed: "The diagram could not be drawn; this is its source." }, refusal: { too_long: "That message is over 1,000 characters.", too_much: "The conversation has grown too long to send; start a new one.", @@ -177,7 +177,7 @@ github: "{title} auf GitHub", commit: "Commit {sha}", modalClose: "Schliessen \u00b7 Esc", ask: { from: "Der Link, den Sie geöffnet haben, enthält diese Frage:", label: "Eine Frage aus dem Link, den Sie geöffnet haben", send: "Senden", edit: "Bearbeiten", discard: "Verwerfen" }, - diagram: { concepts: "Konzepte", process: "Prozess", neighborhood: "Verbindungen", schema: "Meta-Modell", context: "Context Map", aggregate: "Aggregat", flow: "Ablauf", lifecycle: "Lebenszyklus", organization: "Organisation", system: "Landschaft", holds: "Datenbestand", reading: { context: "Einfache Pfeile laufen vom Upstream- zum Downstream-Kontext; jeder Pfeil nennt das Muster zwischen den beiden Kontexten.", aggregate: "Die Wurzel des Aggregats hält, was die Rauten verbinden; die gestrichelten Pfeile sind die Ereignisse, die sie auslöst.", flow: "Durchgezogene Pfeile sind Befehle an das Aggregat, gestrichelte die Ereignisse, die es auslöst; ein Kasten nennt die Bedingung jedes Zweigs.", lifecycle: "Jeder Pfeil ist ein Schritt von einem Zustand zum nächsten, beschriftet mit dem Befehl, der ihn auslöst, wo es einen gibt.", organization: "Durchgezogene Pfeile laufen von einer Führungskraft zu den Führungskräften darunter; eine gestrichelte Linie verbindet eine Stabsstelle mit der Leitung, der sie zuarbeitet; ein gestrichelter Kasten ist eine offene Stelle, neben einer Führungskraft die Suche nach ihrer Nachfolge; Software-Agenten stehen im farbig hinterlegten Rahmen, und ein gepunkteter Pfeil von einer Person zu einem Agenten sagt, wer ihn steuert; ein Agent ohne Pfeil wird von allen im Rahmen gesteuert.", system: "Durchgezogene Pfeile laufen vom System, aus dem die Daten stammen, zum System, das sie übernimmt, beschriftet mit der Schnittstelle und mit dem, was übertragen wird und wie; eine gepunktete Linie verbindet ein System mit dem, worauf es läuft; ein abgerundeter Kasten ist ein Service, den das System bereitstellt; ein Zylinder ist ein Datenbestand, den es hält – mit einem dicken Pfeil, wo seine Kopie führend ist, einem durchgezogenen, wo es schreibt, und einem gepunkteten, wo es nur liest.", holds: "Jeder Zylinder ist ein Datenbestand zum darunter genannten Konzept; ein dicker Pfeil markiert das System, dessen Kopie führend ist, ein durchgezogener ein System, das eine eigene Kopie schreibt, ein gepunkteter ein System, das nur liest." }, expand: "Im Vollbild öffnen", shut: "Vollbild schliessen", zoomIn: "Vergrössern", zoomOut: "Verkleinern", fit: "Einpassen", fitTip: "Auf den Bildschirm einpassen", failed: "Das Diagramm konnte nicht gezeichnet werden; dies ist seine Quelle." }, + diagram: { concepts: "Konzepte", process: "Prozess", neighborhood: "Verbindungen", schema: "Meta-Modell", context: "Context Map", aggregate: "Aggregat", flow: "Ablauf", lifecycle: "Lebenszyklus", organization: "Organisation", system: "Landschaft", holds: "Datenbestand", usecase: "Anwendungsfall", scenario: "Szenario", requirements: "Anforderungen", reading: { context: "Einfache Pfeile laufen vom Upstream- zum Downstream-Kontext; jeder Pfeil nennt das Muster zwischen den beiden Kontexten.", aggregate: "Die Wurzel des Aggregats hält, was die Rauten verbinden; die gestrichelten Pfeile sind die Ereignisse, die sie auslöst.", flow: "Durchgezogene Pfeile sind Befehle an das Aggregat, gestrichelte die Ereignisse, die es auslöst; ein Kasten nennt die Bedingung jedes Zweigs.", lifecycle: "Jeder Pfeil ist ein Schritt von einem Zustand zum nächsten, beschriftet mit dem Befehl, der ihn auslöst, wo es einen gibt.", organization: "Durchgezogene Pfeile laufen von einer Führungskraft zu den Führungskräften darunter; eine gestrichelte Linie verbindet eine Stabsstelle mit der Leitung, der sie zuarbeitet; ein gestrichelter Kasten ist eine offene Stelle, neben einer Führungskraft die Suche nach ihrer Nachfolge; Software-Agenten stehen im farbig hinterlegten Rahmen, und ein gepunkteter Pfeil von einer Person zu einem Agenten sagt, wer ihn steuert; ein Agent ohne Pfeil wird von allen im Rahmen gesteuert.", system: "Durchgezogene Pfeile laufen vom System, aus dem die Daten stammen, zum System, das sie übernimmt, beschriftet mit der Schnittstelle und mit dem, was übertragen wird und wie; eine gepunktete Linie verbindet ein System mit dem, worauf es läuft; ein abgerundeter Kasten ist ein Service, den das System bereitstellt; ein Zylinder ist ein Datenbestand, den es hält – mit einem dicken Pfeil, wo seine Kopie führend ist, einem durchgezogenen, wo es schreibt, und einem gepunkteten, wo es nur liest.", holds: "Jeder Zylinder ist ein Datenbestand zum darunter genannten Konzept; ein dicker Pfeil markiert das System, dessen Kopie führend ist, ein durchgezogener ein System, das eine eigene Kopie schreibt, ein gepunkteter ein System, das nur liest.", usecase: "Der Rahmen ist der Geltungsbereich des Anwendungsfalls, und der Akteur steht ausserhalb; ein gestrichelter Pfeil läuft von einem Anwendungsfall zu einem anderen, den seine Schritte einbinden, ein durchgezogener zu einem Feature, von dem er etwas verlangt; ein Sechseck ist eine Anforderung, die für den Anwendungsfall gilt, mit dickem Rand, wo sie «muss» sagt, und gestricheltem, wo sie «darf» sagt.", scenario: "Der abgerundete Kasten ist der Auslöser; die Kästen sind die Schritte in ihrer Reihenfolge, und jeder nennt, wer handelt; ein gestrichelter Kasten ist eine Erweiterung: zuerst die Bedingung, dann, was geschieht.", requirements: "Ein Sechseck ist eine Anforderung, mit dickem Rand, wo sie «muss» sagt, und gestricheltem, wo sie «darf» sagt; der Rahmen um sie nennt ihre Art; ein Pfeil läuft zu dem, wofür sie gilt, ein gepunkteter zu einer Regel, der sie folgt." }, expand: "Im Vollbild öffnen", shut: "Vollbild schliessen", zoomIn: "Vergrössern", zoomOut: "Verkleinern", fit: "Einpassen", fitTip: "Auf den Bildschirm einpassen", failed: "Das Diagramm konnte nicht gezeichnet werden; dies ist seine Quelle." }, refusal: { too_long: "Diese Nachricht ist länger als 1’000 Zeichen.", too_much: "Das Gespräch ist zu lang geworden, um es zu senden; beginnen Sie ein neues.", @@ -787,10 +787,11 @@ }; } // Where Mermaid put a node in its SVG: a group whose id ends in the node's name and a number, - // after `classId` in a class diagram and `flowchart` in a flowchart. The one place that knows + // after `classId` in a class diagram and `flowchart` in a flowchart; a scenario's step is `s0` + // and on and is listed where its actor is a seat. The one place that knows // it, so a Mermaid release that names them otherwise is fixed here and nowhere else. function nodeElement(svg, node){ - if (!svg || !/^n\d+$/.test(String(node))) return null; + if (!svg || !/^[ns]\d+$/.test(String(node))) return null; var re = new RegExp("-(?:classId|flowchart)-" + node + "-\\d+$"), all = svg.querySelectorAll("g[id]"); for (var i = 0; i < all.length; i++) if (re.test(all[i].id)) return all[i]; return null; @@ -926,6 +927,7 @@ var MARKS = { human: '', agent: '', + actor: '', "application-component": '', node: '', "system-software": '', @@ -936,7 +938,7 @@ function withMarks(m){ if (m && typeof m.registerIconPacks === "function" && !m.rbMarks) { var icons = {}; - Object.keys(MARKS).forEach(function(k){ icons[k] = { body: '' + MARKS[k] + "" }; }); + Object.keys(MARKS).forEach(function(k){ icons[k] = { body: '' + MARKS[k] + "" }; }); m.registerIconPacks([{ name: "fak", icons: { prefix: "fak", width: 16, height: 16, icons: icons } }]); m.rbMarks = true; } diff --git a/model/og.sha b/model/og.sha index 7f2adbd..dda8516 100644 --- a/model/og.sha +++ b/model/og.sha @@ -1 +1 @@ -25216fd5d867f5943a11c39b43e570c2defbba6566610ddf40a58efc044a9de1 +f8fee0c7609393753f7c4c1e9d1bae034abae9b0a2d8a97d26f1bb9e1fd00dc9 diff --git a/og.sha b/og.sha index d71b7dd..cc6025b 100644 --- a/og.sha +++ b/og.sha @@ -1 +1 @@ -215f61fd4358b2e227f2c1a75f9b88811e4201c98491703665a0b3a364b40db6 +c319fa53115f3372ea844e5448f8063d9a864e14a0d2e785bd8f271d1bb20029 diff --git a/package-lock.json b/package-lock.json index 0d2aa17..942c3f8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,7 +11,7 @@ "companygraph-meta-model": "github:companygraph/meta-model#v0.88.0" }, "devDependencies": { - "@robertblust/design": "github:robertblust/design#v0.150.0", + "@robertblust/design": "github:robertblust/design#v0.151.0", "companygraph-mcp-server": "github:companygraph/mcp-server#v0.62.0", "pdf-lib": "^1.17.1", "playwright": "^1.63.0", @@ -96,8 +96,8 @@ } }, "node_modules/@robertblust/design": { - "version": "0.150.0", - "resolved": "git+ssh://git@github.com/robertblust/design.git#63044b26ec57d169d7bb91a5de8fd12ee4b78881", + "version": "0.151.0", + "resolved": "git+ssh://git@github.com/robertblust/design.git#65b78c6310af99370e594d48de0f8bff6a682448", "dev": true, "license": "Apache-2.0", "bin": { diff --git a/package.json b/package.json index fa17f67..b0ae402 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "pin:check": "node pin-check.mjs" }, "devDependencies": { - "@robertblust/design": "github:robertblust/design#v0.150.0", + "@robertblust/design": "github:robertblust/design#v0.151.0", "companygraph-mcp-server": "github:companygraph/mcp-server#v0.62.0", "pdf-lib": "^1.17.1", "playwright": "^1.63.0", diff --git a/principles/og.sha b/principles/og.sha index 49a3add..a63f273 100644 --- a/principles/og.sha +++ b/principles/og.sha @@ -1 +1 @@ -64bae13fbbc0037a9dd139b09e83dd6a6d05ff0df08e7ed8560f971c21e0de37 +78cc3731f6a85a95229672c8f3f6833fb1aa40f364003f493f239cfd3d32280e diff --git a/privacy/og.sha b/privacy/og.sha index 4db797e..408bd3a 100644 --- a/privacy/og.sha +++ b/privacy/og.sha @@ -1 +1 @@ -aa1304aa5ee6eaf56c3f02a09172435c0021b402a13ecf5aa36409244f2a631e +4e07d23c9d4042a4e4af4a83bc76527ef6bc38ce258ec40a71924d65a68e0f3e diff --git a/problems/og.sha b/problems/og.sha index df60f61..6ece32c 100644 --- a/problems/og.sha +++ b/problems/og.sha @@ -1 +1 @@ -ae868e5c7ec7ad8a7c3dafec9938e7f3bfdf44fa352011a247199195e7b27787 +797956323f454d2d46aceea23f0ac5aba64efa23585a626f5b8c828e8e68fa33 diff --git a/processes/og.sha b/processes/og.sha index 911dc0f..7b88536 100644 --- a/processes/og.sha +++ b/processes/og.sha @@ -1 +1 @@ -d8a7402ea8878547c0fdc86eef1d45fa7e1d1085befea5f86b8af25e95bc7e4f +e74a58c5d224c5c9fbad1ab7d084baa753b0aaabc7c05943eeedb2391d63271c diff --git a/processes/pictures/answering.sha b/processes/pictures/answering.sha index 48781cc..c62283d 100644 --- a/processes/pictures/answering.sha +++ b/processes/pictures/answering.sha @@ -1 +1 @@ -4decf2a5b45e907bf64043674e33cd19047a7ef89a294ce8abb2ba4e553efa00 +983410cae0321568b610f7252d21bd21e4d93de12c4d14389e5ffb89d5145dfc diff --git a/processes/pictures/contribution.sha b/processes/pictures/contribution.sha index 3dfdabe..a1a3fb5 100644 --- a/processes/pictures/contribution.sha +++ b/processes/pictures/contribution.sha @@ -1 +1 @@ -5fdaef5728d298b9e5c0320cfb0373807be3f0b904cb14c368a7f8494a679198 +78d09e1d6debb1904f328b93ec472f198fbe22ff267105273990614443ff6ffa diff --git a/processes/pictures/deciding.sha b/processes/pictures/deciding.sha index a84afa2..f89395a 100644 --- a/processes/pictures/deciding.sha +++ b/processes/pictures/deciding.sha @@ -1 +1 @@ -e3226dd3d40cc2a7a28c09569d4633a40c5cc41e4038d8fab4613964dacb6b76 +6024f02525d1b1fc6ede83faaf6f321418626e0f6e1fa3b69bf4b2811716c02c diff --git a/processes/pictures/delivery.sha b/processes/pictures/delivery.sha index d7bf7d2..8a254dc 100644 --- a/processes/pictures/delivery.sha +++ b/processes/pictures/delivery.sha @@ -1 +1 @@ -04839431a9ead9aa3e9abf4a055eee1282eb4abcedfcffcdb46cf00415ae87ac +9fc548f92799b2c56496b006b9a28ccebda77270a21fe9d79527d58fdb6d41e4 diff --git a/processes/pictures/feature-request.sha b/processes/pictures/feature-request.sha index c371046..5713ccf 100644 --- a/processes/pictures/feature-request.sha +++ b/processes/pictures/feature-request.sha @@ -1 +1 @@ -f670be16664807ea7e53578d92d4b66ed19d063265d30c4759e31c143d3b34eb +337ff9900eefd9efaa1cdb1cc5b4888979794a81abe9dbb592de0ec84123b2b7 diff --git a/processes/pictures/narrating.sha b/processes/pictures/narrating.sha index 5075ed3..8b466f6 100644 --- a/processes/pictures/narrating.sha +++ b/processes/pictures/narrating.sha @@ -1 +1 @@ -f71b67aa8227a5d4d4b5cab392cd7b58e50beb7bf505a20805d64acd55158632 +30559298d12eb70970269433e9b7223ee58d9ce05153597db19e40615681232b diff --git a/surfaces/og.sha b/surfaces/og.sha index 20fc375..c6a9634 100644 --- a/surfaces/og.sha +++ b/surfaces/og.sha @@ -1 +1 @@ -0541992bc43a0687660fb77fd8c47cb5c314e7ee2b75c6b1bd8b6e56b39c4548 +07eccf18ba72fb7772c8386a0e5efa869b5c7087c92bece0930350288582f4c8 diff --git a/talks/intro/og.sha b/talks/intro/og.sha index afbfcbc..b4b89e9 100644 --- a/talks/intro/og.sha +++ b/talks/intro/og.sha @@ -1 +1 @@ -64e4851d50b4f69802e78976c80bef9e5f63c573f02e2d87062178c73083048c +0b812afbe64876220d33988e12a731d557c2a7524a4eb2ee4faeb178de00f943 diff --git a/talks/og.sha b/talks/og.sha index 6b3ffc0..18f9939 100644 --- a/talks/og.sha +++ b/talks/og.sha @@ -1 +1 @@ -455ab5896f92b993f5a29b5d3cfd2c9f11dfd91e40cbef69c998d44ededd9b92 +122feefde01e742aec5e0b2a4d2211e7408fd66d037b5cf122bd61f0428e9058