PageSourceSearch

https://www.metaengine.eu/chunk-KGCFED2W.js

js metaengine.eu collected 2026-10-05 06:32:32 UTC 123,149 bytes, 366 lines download raw bytes

1import{b as be,c as dt}from"./chunk-VU6P7SGR.js";import{b as pt,e as xe}from"./chunk-2VRUALZU.js";import{$a as $e,Cb as st,Hb as z,Ja as U,Ka as I,La as R,M as F,Ma as nt,Na as it,Oa as O,P as ue,Pa as M,Qa as P,R as C,Ra as f,Sa as y,Ta as B,Ua as u,V as Xe,Va as d,W as et,Wa as G,Xb as De,Ya as rt,Za as at,_ as me,ab as _,ca as Re,cc as lt,dc as ct,ia as tt,ka as ge,kb as Q,la as fe,lb as l,mb as b,nb as E,oa as c,ob as K,pb as Be,qb as ot,wa as $,wb as ze}from"./chunk-UDT6HCOH.js";import{a as S,b as W,h as he}from"./chunk-WWX6BADO.js";var jt=(n,e)=>e.id;function Wt(n,e){if(n&1&&(u(0,"a",9),l(1),d()),n&2){let t=_().$implicit;at("href",t.evidenceUrl,fe),c(),E(" ",t.evidenceLabel," \u2197 ")}}function Ht(n,e){if(n&1&&(u(0,"section",6)(1,"div",7)(2,"span",8),l(3),d()(),u(4,"p"),l(5),d(),I(6,Wt,2,2,"a",9),d()),n&2){let t=e.$implicit,i=_();U("data-classification",t.classification),c(3),b(i.classificationLabel(t.classification)),c(2),b(t.statement),c(),R(t.evidenceUrl&&t.evidenceLabel?6:-1)}}var ye=class n{receipts=z.required();classificationLabel(e){switch(e){case"shipped":return"Shipped";case"measured":return"Measured";case"proposal":return"Research"}}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=$({type:n,selectors:[["app-article-evidence-rail"]],inputs:{receipts:[1,"receipts"]},decls:10,vars:0,consts:[["aria-labelledby","receipts-title",1,"rail"],[1,"rail-heading"],["aria-hidden","true",1,"bar"],["id","receipts-title"],[1,"rail-intro"],[1,"claims"],[1,"claim"],[1,"claim-topline"],[1,"classification"],["target","_blank","rel","noopener",3,"href"]],template:function(t,i){t&1&&(u(0,"aside",0)(1,"div",1),G(2,"span",2),u(3,"h2",3),l(4,"Receipts"),d()(),u(5,"p",4),l(6,"What this note rests on \u2014 and what is still research."),d(),u(7,"div",5),O(8,Ht,7,4,"section",6,jt),d()()),t&2&&(c(8),M(i.receipts()))},styles:[".rail[_ngcontent-%COMP%]{position:sticky;top:calc(var(--nav-height) + 32px);padding-left:24px;border-left:1px solid var(--line-2)}.rail-heading[_ngcontent-%COMP%]{display:flex;align-items:center;gap:10px}.bar[_ngcontent-%COMP%]{width:16px;height:1px;background:var(--accent)}h2[_ngcontent-%COMP%]{margin:0;color:var(--ink-1);font-family:var(--font-mono);font-size:10px;font-weight:500;letter-spacing:.1em;text-transform:uppercase}.rail-intro[_ngcontent-%COMP%]{margin:14px 0 22px;color:var(--ink-3);font-size:12px;line-height:1.55}.claims[_ngcontent-%COMP%]{display:grid;gap:20px}.claim[_ngcontent-%COMP%]{padding-bottom:20px;border-bottom:1px solid var(--line-1)}.claim-topline[_ngcontent-%COMP%]{display:flex;align-items:baseline;justify-content:space-between;gap:10px;margin-bottom:9px;font-family:var(--font-mono);font-size:9px;letter-spacing:.06em;text-transform:uppercase}.classification[_ngcontent-%COMP%]{color:var(--accent)}.claim[data-classification=measured][_ngcontent-%COMP%]   .classification[_ngcontent-%COMP%]{color:var(--cool)}.claim[data-classification=proposal][_ngcontent-%COMP%]   .classification[_ngcontent-%COMP%]{color:var(--ink-3)}.claim[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{margin:0;overflow-wrap:anywhere;color:var(--ink-1);font-size:12.5px;line-height:1.55}.claim[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]{min-height:44px;display:inline-flex;align-items:center;margin-top:9px;color:var(--ink-0);font-family:var(--font-mono);font-size:9.5px;text-decoration-color:var(--accent-line);text-underline-offset:3px}@media (max-width: 940px){.rail[_ngcontent-%COMP%]{position:static;padding:28px 0 0;border-top:1px solid var(--line-2);border-left:0}.claims[_ngcontent-%COMP%]{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (max-width: 680px){.claims[_ngcontent-%COMP%]{grid-template-columns:1fr;gap:16px}}"]})};var Le=class n{document=C(me);platformId=C(tt);mode(){if(!De(this.platformId))return"server";let e=this.browserWindow();return typeof e.matchMedia!="function"||e.matchMedia("(prefers-reduced-motion: reduce)").matches?"manual":"automatic"}schedule(e){let t=this.browserWindow(),i=t.setInterval(e,5600);return()=>t.clearInterval(i)}browserWindow(){if(!De(this.platformId))throw new Error("Article playback cannot be scheduled without a browser window.");let e=this.document.defaultView;
1if(e===null)throw new Error("The browser platform did not provide a window for article playback.");return e}static \u0275fac=function(t){return new(t||n)};static \u0275prov=F({token:n,factory:n.\u0275fac,providedIn:"root"})},ht=new ue("Article playback scheduler",{providedIn:"root",factory:()=>C(Le)});var mt=(n,e)=>e.name,Ut=(n,e)=>e.owner+e.name,ut=(n,e)=>e.parameter,Gt=(n,e)=>e.destination,Zt=(n,e)=>e.parameterIndex;function Qt(n,e){if(n&1&&(u(0,"div",40)(1,"span"),l(2),d(),u(3,"strong"),l(4),d(),l(5),d()),n&2){let t=e.$implicit,i=e.$index,r=e.$count,a=_(2);Q("is-active",t.name===a.currentRound().parameter),c(2),E("",t.type,"\xA0"),c(2),b(t.name),c(),E("",i===r-1?"":","," ")}}function Yt(n,e){if(n&1&&(u(0,"div",39),l(1),d()),n&2){let t=e.$implicit;c(),b(t)}}function Jt(n,e){if(n&1&&(u(0,"div",9)(1,"div")(2,"b"),l(3,"public class"),d(),l(4),d(),u(5,"div",35),l(6,"{"),d(),u(7,"div",36)(8,"b"),l(9,"public"),d(),l(10),d(),O(11,Qt,6,5,"div",37,mt),u(13,"div",36),l(14,") : "),u(15,"b"),l(16),d()(),u(17,"div",38),l(18,"{"),d(),O(19,Yt,2,1,"div",39,it),u(21,"div",38),l(22,"}"),d(),u(23,"div",35),l(24,"}"),d()()),n&2){let t=e;c(4),K(" ",t.derivedType," : ",t.baseType),c(6),E(" ",t.derivedType,"("),c(),M(t.parameters),c(5),b(t.baseCall),c(3),M(t.assignments)}}function Vt(n,e){if(n&1&&(u(0,"div",41)(1,"span",42),l(2),d(),u(3,"code")(4,"span",15),l(5),d(),l(6),d()()),n&2){let t=e.$implicit;Q("is-sentinel",t.sentinel),c(2),b(t.name),c(3),b(t.sentinel?"\u25C6 ":""),c(),b(t.value)}}function Kt(n,e){if(n&1&&(u(0,"div",43)(1,"span")(2,"strong"),l(3),d(),u(4,"small"),l(5),d()(),u(6,"code"),l(7),d()()),n&2){let t=e.$implicit;Q("is-match",t.matched)("is-base",t.base),c(3),b(t.name),c(2),K("",t.owner,"",t.base?" \xB7 direct base"
1:""),c(2),b(t.value)}}function Xt(n,e){if(n&1){let t=rt();u(0,"button",44),$e("click",function(){let r=Xe(t).$index,a=_();return et(a.selectRound(r))}),u(1,"span"),l(2),d(),l(3),d()}if(n&2){let t=e.$implicit,i=e.$index,r=_();Q("is-active",r.currentIndex()===i),U("aria-pressed",r.currentIndex()===i),c(2),E("0",i+1),c(),E("",t.parameter," ")}}function en(n,e){if(n&1&&G(0,"span"),n&2){let t=e.$index,i=_();Q("is-complete",t<=i.currentIndex())}}function tn(n,e){if(n&1&&(u(0,"li")(1,"span",45),l(2,"\u2192"),d(),u(3,"span",46)(4,"strong"),l(5),d(),u(6,"small"),l(7),d()()()),n&2){let t=e.$implicit,i=_();c(5),K("",i.currentRound().parameter," \u2192 ",t.destination),c(2),K("Confidence: ",t.confidence," \xB7 Provenance: ",t.provenance)}}function nn(n,e){if(n&1&&(u(0,"li",48)(1,"span",45),l(2),d(),u(3,"span",46)(4,"strong"),l(5),d(),u(6,"small"),l(7),d(),u(8,"small"),l(9),d()()()),n&2){let t=e.$implicit,i=_();Q("is-inferred",t.outcome==="Inferred"),c(2),b(t.outcome==="Inferred"?"\u2192":"?"),c(3),E("Direct-base outcome: ",i),c(2),ot(" ",t.outcome==="Inferred"?"Base parameter":"Candidate parameter"," [",t.parameterIndex,"] ",t.parameterName," via ",t.correlatedProperty," "),c(2),Be(" Outcome: ",t.outcome," \xB7 Confidence: ",t.confidence," \xB7 Provenance: ",t.provenance," ")}}function rn(n,e){if(n&1&&O(0,nn,10,11,"li",47,Zt),n&2){let t=_();M(t.currentRound().directBaseCandidates)}}function an(n,e){if(n&1&&(u(0,"div",34)(1,"code"),l(2),d(),G(3,"span",49),u(4,"strong"),l(5),d(),u(6,"small"),l(7),d()()),n&2){let t=e.$implicit;c(2),b(t.parameter),c(3),b(t.destination),c(2),K("",t.confidence," \xB7 ",t.provenance)}}var ke=class n{exhibit=z.required();playback=C(ht);cancelPlayback;currentIndex=Re(0);isPlaying=Re(!1);currentRound=st(()=>this.exhibit().rounds[this.currentIndex()]);ngOnInit(){this.playback.mode()==="automatic"&&this.play()}ngOnDestroy(){this.stopPlayback()}selectRound(e){this.pause(),this.currentIndex.set(e)}togglePlayback(){this.isPlaying()?this.pause():this.play()}play(){this.stopPlayback(),this.isPlaying.set(!0),this.cancelPlayback=this.playback.schedule(()=>{this.currentIndex.update(e=>(e+1)%this.exhibit().rounds.length)})}pause(){this.stopPlayback(),this.isPlaying.set(!1)}stopPlayback(){this.cancelPlayback?.(),this.cancelPlayback=void 0}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=$({type:n,selectors:[["app-constructor-flow-exhibit"]],inputs:{exhibit:[1,"exhibit"]},decls:74,vars:11,consts:[["aria-labelledby","constructor-flow-title",1,"flow-exhibit"],[1,"exhibit-header"],[1,"exhibit-kicker"],["id","constructor-flow-title"],["aria-live","polite","aria-atomic","true",1,"flow-status"],["aria-hidden","true",1,"status-pulse"],[1,"flow-stage"],["aria-labelledby","source-panel-title",1,"source-panel"],["id","source-panel-title"],["aria-label","C sharp constructor under analysis",1,"source-code"],["aria-labelledby","probe-panel-title",1,"probe-panel"],["id","probe-panel-title"],[1,"argument-list"],[1,"argument-row",3,"is-sentinel"],[1,"probe-action"],["aria-hidden","true"],["aria-labelledby","property-panel-title",1,"property-panel"],["id","property-panel-title"],[1,"property-list"],[1,"property-row",3,"is-match","is-base"],[1,"exhibit-controls"],["type","button",1,"playback-button",3,"click"],["role","group","aria-label","Select constructor argument round",1,"round-controls"],["type","button",1,"round-button",3,"is-active"],["aria-hidden","true",1,"round-progress"],[3,"is-complete"],["aria-labelledby","mapping-output-title",1,"mapping-output"],[1,"mapping-label"],["id","mapping-output-title"],[1,"mapping-list"],["aria-labelledby","resolved-flow-title",1,"resolved-flow"],[1,"resolved-heading"],["id","resolved-flow-title"],[1,"resolved-paths"],[1,"resolved-path"],[1,"brace"],[1,"indent"],[1,"indent-2","parameter-line",3,"is-active"],[1,"indent","brace"],[1,"indent-2"],[1,"indent-2","parameter-line"],[1,"argument-row"],[1,"row-name"],[1,"property-row"],["type","button",1,"round-button",3,"click"],["aria-hidden","true",1,"mapping-arrow"],[1,"mapping-detail"],[1,"direct-base-candidate",3,"is-inferred"],[1,"direct-base-candidate"],["aria-hidden","true",1,"path-line"]],template:function(t,i){if(t&1&&(u(0,"figure",0)(1,"header",1)(2,"div")(3,"span",2),l(4,"Figure 1 \xB7 Interactive"),d(),u(5,"h2",3),l(6),d(),u(7,"p"),l(8),d()(),u(9,"div",4),G(10,"span",5),l(11),d()(),u(12,"div",6)(13,"section",7)(14,"h3",8)(15,"span"),l(16,"01"),d(),l(17," Constructor"),d(),I(18,Jt,25,4,"div",9),d(),u(19,"section",10)(20,"h3",11)(21,"span"),l(22,"02"),d(),l(23," Probe arguments"),d(),u(24,"div",12),O(25,Vt,7,5,"div",13,mt),d(),u(27,"div",14)(28,"span",15),l(29,"\u2193"),d(),u(30,"strong"),l(31,"Instantiate once"),d(),u(32,"small"),l(33,"then inspect public values"),d()()(),u(34,"section",16)(35,"h3",17)(36,"span"),l(37,"03"),d(),l(38," Observed landing points"),d(),u(39,"div",18),O(40,Kt,8,8,"div",19,Ut),d()()(),u(42,"div",20)(43,"button",21),$e("click",function(){return i.togglePlayback()}),u(44,"span",15),l(45),d(),l(46),d(),u(47,"div",22),O(48,Xt,4,5,"button",23,ut),d(),u(50,"div",24),O(51,en,1,2,"span",25,ut),d()(),u(53,"section",26)(54,"div")(55,"span",27),l(56),d(),u(57,"h3",28),l(58,"Distinct value, matching destinations"),d()(),u(59,"ul",29),O(60,tn,8,4,"li",null,Gt),I(62,rn,2,0),d()(),u(63,"section",30)(64,"div",31)(65,"span"),l(66,"Exact property mappings"),d(),u(67,"h3",32),l(68,"Observed flow, kept apart from base attribution"),d()(),u(69,"div",33),O(70,an,8,4,"div",34,nt),d()(),u(72,"figcaption"),l(73," Sentinel text is one run's distinctive values, so the argument labels differ on every run. Every property mapping shown here is Exact with ExactSentinel provenance. The direct-base rows are a separate result: BaseEntity's get-only properties let the analyzer report both forwarded arguments as Inferred base parameters. "),d()()),t&2){let r,a;c(6),b(i.exhibit().title),c(2),b(i.exhibit().description),c(3),Be(" Round ",i.currentIndex()+1," of ",i.exhibit().rounds.length," \xB7 ",i.currentRound().parameter," "),c(7),R((r=i.exhibit().source)?18:-1,r),c(7),M(i.currentRound().arguments),c(15),M(i.currentRound().properties),c(3),U("aria-label",i.isPlaying()?"Pause constructor flow":"Play constructor flow"),c(2),b(i.isPlaying()?"\u2161":"\u25B6"),c(),E(" ",i.isPlaying()?"Pause":"Play"," "),c(2),M(i.exhibit().rounds),c(3),M(i.exhibit().rounds),c(5),E("Parameter outcome \xB7 ",i.currentRound().outcome),c(4),M(i.currentRound().propertyMappings),c(2),R((a=i.currentRound().directBaseOutcome)?62:-1,a),c(8),M(i.exhibit().resolvedPaths)}},styles:[".flow-exhibit[_ngcontent-%COMP%]{margin:48px 0 0;overflow:hidden;border:1px solid var(--line-2);border-radius:var(--r-4);background:var(--bg-1);box-shadow:var(--shadow-2)}.exhibit-header[_ngcontent-%COMP%]{display:flex;align-items:flex-start;justify-content:space-between;gap:32px;
1padding:28px 30px;border-bottom:1px solid var(--line-2)}.exhibit-kicker[_ngcontent-%COMP%], .mapping-label[_ngcontent-%COMP%], .resolved-heading[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{color:var(--accent);font-family:var(--font-mono);font-size:9px;font-weight:500;letter-spacing:.1em;text-transform:uppercase}.exhibit-header[_ngcontent-%COMP%]   h2[_ngcontent-%COMP%]{margin:8px 0 7px;color:var(--ink-0);font-family:var(--font-display);font-size:clamp(27px,3vw,38px);font-weight:400;letter-spacing:-.025em;line-height:1.08}.exhibit-header[_ngcontent-%COMP%]   p[_ngcontent-%COMP%]{max-width:620px;margin:0;overflow-wrap:anywhere;color:var(--ink-2);font-size:13px;line-height:1.6}.flow-status[_ngcontent-%COMP%]{flex:0 0 auto;display:flex;align-items:center;gap:8px;min-height:28px;padding:0 11px;border:1px solid var(--accent-line);border-radius:999px;color:var(--ink-2);font-family:var(--font-mono);font-size:9.5px;white-space:nowrap}.status-pulse[_ngcontent-%COMP%]{width:6px;height:6px;border-radius:50%;background:var(--accent);box-shadow:0 0 0 0 var(--accent-glow);animation:_ngcontent-%COMP%_sentinel-pulse 2.4s ease-out infinite}.flow-stage[_ngcontent-%COMP%]{display:grid;grid-template-columns:1.05fr .9fr 1fr;background:var(--line-2);gap:1px}.flow-stage[_ngcontent-%COMP%]   section[_ngcontent-%COMP%]{min-width:0;padding:22px;background:var(--bg-0)}.flow-stage[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{display:flex;align-items:center;gap:8px;margin:0 0 18px;color:var(--ink-3);font-family:var(--font-mono);font-size:9px;font-weight:500;letter-spacing:.08em;text-transform:uppercase}.flow-stage[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--accent)}.source-code[_ngcontent-%COMP%]{color:var(--ink-2);font-family:var(--font-mono);font-size:10.5px;line-height:1.72;white-space:nowrap}.source-code[_ngcontent-%COMP%]   b[_ngcontent-%COMP%]{color:var(--syn-keyword);font-weight:500}.source-code[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ink-0);font-weight:500}.source-code[_ngcontent-%COMP%]   .indent[_ngcontent-%COMP%]{padding-left:13px}.source-code[_ngcontent-%COMP%]   .indent-2[_ngcontent-%COMP%]{margin-left:26px;padding:0 4px;border-left:2px solid transparent}.source-code[_ngcontent-%COMP%]   .parameter-line[_ngcontent-%COMP%]{transition:color .18s ease,background .18s ease,border-color .18s ease}.source-code[_ngcontent-%COMP%]   .parameter-line.is-active[_ngcontent-%COMP%]{border-left-color:var(--accent);background:var(--accent-dim);color:var(--ink-0)}.argument-list[_ngcontent-%COMP%], .property-list[_ngcontent-%COMP%]{display:grid;gap:8px}.argument-row[_ngcontent-%COMP%], .property-row[_ngcontent-%COMP%]{min-width:0;display:flex;align-items:center;justify-content:space-between;gap:12px;min-height:44px;padding:8px 10px;border:1px solid var(--line-1);border-radius:var(--r-2);background:var(--bg-1);transition:border-color .18s ease,background .18s ease,transform .18s ease}.argument-row[_ngcontent-%COMP%]   code[_ngcontent-%COMP%], .property-row[_ngcontent-%COMP%]   code[_ngcontent-%COMP%]{overflow:hidden;color:var(--ink-3);font-family:var(--font-mono);font-size:9.5px;text-overflow:ellipsis;white-space:nowrap}.row-name[_ngcontent-%COMP%], .property-row[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ink-1);font-family:var(--font-mono);font-size:10px;font-weight:500}.argument-row.is-sentinel[_ngcontent-%COMP%]{border-color:var(--accent-line);background:var(--accent-dim);transform:translate(3px)}.argument-row.is-sentinel[_ngcontent-%COMP%]   code[_ngcontent-%COMP%]{color:var(--accent)}.probe-action[_ngcontent-%COMP%]{display:grid;justify-items:center;gap:4px;margin-top:14px;padding:12px 8px;border:1px dashed var(--line-2);border-radius:var(--r-2);color:var(--ink-3);font-family:var(--font-mono);text-align:center}.probe-action[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{color:var(--accent)}.probe-action[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ink-1);font-size:9.5px;font-weight:500;text-transform:uppercase}.probe-action[_ngcontent-%COMP%]   small[_ngcontent-%COMP%]{font-size:8.5px}.property-row[_ngcontent-%COMP%] > span[_ngcontent-%COMP%]{min-width:0;display:grid;gap:2px}.property-row[_ngcontent-%COMP%]   small[_ngcontent-%COMP%]{color:var(--ink-3);font-family:var(--font-mono);font-size:8.5px}.property-row.is-base[_ngcontent-%COMP%]{border-left:2px solid var(--cool)}.property-row.is-match[_ngcontent-%COMP%]{border-color:var(--ok-line);background:var(--ok-bg);transform:translate(-3px)}.property-row.is-match[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%], .property-row.is-match[_ngcontent-%COMP%]   code[_ngcontent-%COMP%]{color:var(--ok)}
1.exhibit-controls[_ngcontent-%COMP%]{display:grid;grid-template-columns:auto minmax(0,1fr) minmax(80px,.4fr);align-items:center;gap:12px;padding:14px 18px;border-top:1px solid var(--line-2);border-bottom:1px solid var(--line-2);background:var(--bg-2)}.playback-button[_ngcontent-%COMP%], .round-button[_ngcontent-%COMP%]{min-height:44px;border:1px solid var(--line-2);border-radius:var(--r-2);background:var(--bg-0);color:var(--ink-2);font-family:var(--font-mono);font-size:9.5px;cursor:pointer}.playback-button[_ngcontent-%COMP%]{display:inline-flex;align-items:center;gap:8px;padding:0 13px}.playback-button[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--accent);font-size:9px}.round-controls[_ngcontent-%COMP%]{display:flex;gap:6px}.round-button[_ngcontent-%COMP%]{flex:1 1 0;display:inline-flex;align-items:center;justify-content:center;gap:7px;padding:0 10px}.round-button[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--ink-4)}.round-button.is-active[_ngcontent-%COMP%]{border-color:var(--ink-0);background:var(--ink-0);color:var(--bg-0)}.round-button.is-active[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{color:var(--accent-hi)}.playback-button[_ngcontent-%COMP%]:focus-visible, .round-button[_ngcontent-%COMP%]:focus-visible{outline:2px solid var(--accent);outline-offset:2px}.round-progress[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,1fr);gap:4px}.round-progress[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]{height:2px;border-radius:1px;background:var(--line-3)}.round-progress[_ngcontent-%COMP%]   span.is-complete[_ngcontent-%COMP%]{background:var(--accent)}.mapping-output[_ngcontent-%COMP%]{display:grid;grid-template-columns:.75fr 1.25fr;gap:28px;padding:22px 30px;background:var(--terminal-bg);color:var(--terminal-ink)}.mapping-output[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%], .resolved-heading[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{margin:6px 0 0;color:inherit;font-family:var(--font-display);font-size:20px;font-weight:400}.mapping-list[_ngcontent-%COMP%]{min-width:0;display:grid;align-content:center;gap:8px;margin:0;padding:0;list-style:none}.mapping-list[_ngcontent-%COMP%]   li[_ngcontent-%COMP%]{display:flex;gap:9px;color:var(--terminal-ink);font-family:var(--font-mono);font-size:10.5px}.direct-base-candidate.is-inferred[_ngcontent-%COMP%]   .mapping-arrow[_ngcontent-%COMP%], .direct-base-candidate.is-inferred[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ok)}.mapping-detail[_ngcontent-%COMP%]{min-width:0;overflow-wrap:anywhere;display:grid;gap:3px}.mapping-detail[_ngcontent-%COMP%]   small[_ngcontent-%COMP%]{color:var(--ink-3);font-size:8.5px;line-height:1.5}.resolved-flow[_ngcontent-%COMP%]{display:grid;grid-template-columns:.7fr 1.3fr;gap:28px;padding:26px 30px;border-bottom:1px solid var(--line-2);background:var(--bg-0)}.resolved-heading[_ngcontent-%COMP%]   h3[_ngcontent-%COMP%]{color:var(--ink-0)}.resolved-paths[_ngcontent-%COMP%]{display:grid;gap:10px}.resolved-path[_ngcontent-%COMP%]{min-width:0;overflow-wrap:anywhere;display:grid;grid-template-columns:minmax(68px,auto) minmax(24px,1fr) minmax(130px,auto);align-items:center;gap:10px;min-height:38px}.resolved-path[_ngcontent-%COMP%]   code[_ngcontent-%COMP%]{color:var(--accent);font-family:var(--font-mono);font-size:10px}.resolved-path[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ink-1);font-family:var(--font-mono);font-size:10px;font-weight:500}.resolved-path[_ngcontent-%COMP%]   small[_ngcontent-%COMP%]{min-width:0;grid-column:3;color:var(--ink-3);font-family:var(--font-mono);font-size:8px;letter-spacing:.05em;text-transform:uppercase}.path-line[_ngcontent-%COMP%]{height:1px;background:linear-gradient(90deg,var(--accent-line),var(--ok-line))}.flow-exhibit[_ngcontent-%COMP%]   figcaption[_ngcontent-%COMP%]{padding:15px 30px;color:var(--ink-3);font-size:11px;line-height:1.6}@keyframes _ngcontent-%COMP%_sentinel-pulse{0%{box-shadow:0 0 0 0 var(--accent-glow)}65%,to{box-shadow:0 0 0 8px transparent}}@media (max-width: 900px){.flow-stage[_ngcontent-%COMP%]{grid-template-columns:1fr 1fr}.source-panel[_ngcontent-%COMP%]{grid-column:1/-1}.source-code[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));column-gap:24px;white-space:normal}.source-code[_ngcontent-%COMP%]   .brace[_ngcontent-%COMP%]{display:none}.source-code[_ngcontent-%COMP%]   .indent[_ngcontent-%COMP%], .source-code[_ngcontent-%COMP%]   .indent-2[_ngcontent-%COMP%]{margin:0;padding-left:4px}
1.exhibit-controls[_ngcontent-%COMP%]{grid-template-columns:auto 1fr}.round-progress[_ngcontent-%COMP%]{grid-column:1/-1}}@media (max-width: 620px){.flow-exhibit[_ngcontent-%COMP%]{margin-top:34px;border-right:0;border-left:0;border-radius:0;box-shadow:none}.exhibit-header[_ngcontent-%COMP%]{flex-direction:column;padding:22px 20px}.flow-status[_ngcontent-%COMP%]{align-self:flex-start}.flow-stage[_ngcontent-%COMP%]{grid-template-columns:1fr}.source-panel[_ngcontent-%COMP%]{grid-column:auto}.source-code[_ngcontent-%COMP%]{display:block;overflow-x:auto;white-space:nowrap}.source-code[_ngcontent-%COMP%]   .brace[_ngcontent-%COMP%]{display:block}.source-code[_ngcontent-%COMP%]   .indent[_ngcontent-%COMP%]{padding-left:13px}.source-code[_ngcontent-%COMP%]   .indent-2[_ngcontent-%COMP%]{margin-left:26px}.flow-stage[_ngcontent-%COMP%]   section[_ngcontent-%COMP%]{padding:20px}.exhibit-controls[_ngcontent-%COMP%]{grid-template-columns:1fr;padding:14px 20px}.playback-button[_ngcontent-%COMP%]{justify-content:center}.round-controls[_ngcontent-%COMP%]{overflow-x:auto;padding:2px}.round-button[_ngcontent-%COMP%]{min-width:116px}.round-progress[_ngcontent-%COMP%]{grid-column:auto}.mapping-output[_ngcontent-%COMP%], .resolved-flow[_ngcontent-%COMP%]{grid-template-columns:1fr;padding:22px 20px}.resolved-path[_ngcontent-%COMP%]{grid-template-columns:minmax(0,.65fr) minmax(16px,.25fr) minmax(0,1fr)}.flow-exhibit[_ngcontent-%COMP%]   figcaption[_ngcontent-%COMP%]{padding:14px 20px}}@media (prefers-reduced-motion: reduce){.status-pulse[_ngcontent-%COMP%]{animation:none;box-shadow:none}.argument-row[_ngcontent-%COMP%], .property-row[_ngcontent-%COMP%], .source-code[_ngcontent-%COMP%]   .parameter-line[_ngcontent-%COMP%]{transition:none}}"]})};function on(n,e){if(n&1&&B(0,"app-constructor-flow-exhibit",0),n&2){let t=_();P("exhibit",t.exhibit())}}var ve=class n{exhibit=z.required();static \u0275fac=function(t){return new(t||n)};static \u0275cmp=$({type:n,selectors:[["app-article-exhibit-outlet"]],inputs:{exhibit:[1,"exhibit"]},decls:1,vars:1,consts:[[3,"exhibit"]],template:function(t,i){if(t&1&&I(0,on,1,1,"app-constructor-flow-exhibit",0),t&2){let r;R((r=i.exhibit().kind)==="constructor-flow"?0:-1)}},dependencies:[ke],encapsulation:2})};var sn=(n,e)=>e.label;function ln(n,e){if(n&1&&(u(0,"li")(1,"span",5),l(2),d(),u(3,"div")(4,"strong"),l(5),d(),u(6,"p"),l(7),d()()()),n&2){let t=e.$implicit,i=e.$index;c(2),E("0",i+1),c(3),b(t.label),c(2),b(t.description)}}var we=class n{beats=z.required();static \u0275fac=function(t){return new(t||n)};static \u0275cmp=$({type:n,selectors:[["app-article-reading-map"]],inputs:{beats:[1,"beats"]},decls:11,vars:0,consts:[["aria-labelledby","reading-map-title",1,"reading-map"],[1,"map-heading"],["aria-hidden","true",1,"map-line"],[1,"map-kicker"],["id","reading-map-title"],[1,"beat-number"]],template:function(t,i){t&1&&(u(0,"section",0)(1,"div",1),G(2,"span",2),u(3,"div")(4,"span",3),l(5,"Field guide"),d(),u(6,"h2",4),l(7,"Read this note in three passes"),d()()(),u(8,"ol"),O(9,ln,8,3,"li",null,sn),d()()),t&2&&(c(9),M(i.beats()))},styles:[".reading-map[_ngcontent-%COMP%]{display:grid;grid-template-columns:.72fr 1.8fr;gap:42px;margin-top:34px;padding:22px 0;border-top:1px solid var(--line-2);border-bottom:1px solid var(--line-2)}.map-heading[_ngcontent-%COMP%]{display:flex;align-items:flex-start;gap:12px}.map-line[_ngcontent-%COMP%]{width:18px;height:1px;margin-top:7px;background:var(--accent)}.map-kicker[_ngcontent-%COMP%]{color:var(--accent);font-family:var(--font-mono);font-size:8.5px;letter-spacing:.1em;text-transform:uppercase}.map-heading[_ngcontent-%COMP%]   h2[_ngcontent-%COMP%]{margin:5px 0 0;color:var(--ink-1);font-family:var(--font-display);font-size:18px;font-weight:400;line-height:1.2}ol[_ngcontent-%COMP%]{display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:20px;margin:0;padding:0;list-style:none}li[_ngcontent-%COMP%]{display:grid;grid-template-columns:auto 1fr;gap:10px}.beat-number[_ngcontent-%COMP%]{color:var(--ink-4);font-family:var(--font-mono);font-size:8.5px}strong[_ngcontent-%COMP%]{display:block;color:var(--ink-1);font-family:var(--font-mono);font-size:10px;font-weight:500;letter-spacing:.04em;text-transform:uppercase}p[_ngcontent-%COMP%]{margin:6px 0 0;color:var(--ink-3);font-size:11px;line-height:1.45}@media (max-width: 760px){.reading-map[_ngcontent-%COMP%]{grid-template-columns:1fr;gap:20px}}@media (max-width: 540px){ol[_ngcontent-%COMP%]{grid-template-columns:1fr;gap:14px}li[_ngcontent-%COMP%]{padding-bottom:14px;border-bottom:1px solid var(--line-1)}li[_ngcontent-%COMP%]:last-child{padding-bottom:0;border-bottom:0}}"]})};function cn(n,e){n&1&&B(0,"app-article-exhibit-outlet",1),n&2&&P("exhibit",e)}var Ce=class n{beats=z.required();exhibit=z();static \u0275fac=function(t){return new(t||n)};static \u0275cmp=$({type:n,selectors:[["app-article-interlude"]],inputs:{beats:[1,"beats"],exhibit:[1,"exhibit"]},decls:2,vars:2,consts:[[3,"beats"],[3,"exhibit"]],template:function(t,i){if(t&1&&(B(0,"app-article-reading-map",0),I(1,cn,1,1,"app-article-exhibit-outlet",1)),t&2){let r;P("beats",i.beats()),c(),R((r=i.exhibit())?1:-1,r)}},dependencies:[ve,we],encapsulation:2})};var _e=new ue("ARTICLE_BODIES");var ee=class n{bodies=C(_e);require(e){let t=this.bodies[e];
1if(t===void 0)throw new Error(`Article body '${e}' is not registered.`);return t}static \u0275fac=function(t){return new(t||n)};static \u0275prov=F({token:n,factory:n.\u0275fac})};var gt=/^## (.+)$/,te=class n{split(e,t){let i=e.split(`
2`),r=i.findIndex(o=>gt.exec(o)?.[1]===t);if(r===-1)throw new Error(`Article body has no '## ${t}' section to place the interlude after.`);let a=i.slice(r+1).findIndex(o=>gt.test(o));if(a===-1)throw new Error(`Section '${t}' is the last one, so nothing follows the interlude.`);let s=r+1+a;return{lead:i.slice(0,s).join(`
3`).trim(),rest:i.slice(s).join(`
4`).trim()}}static \u0275fac=function(t){return new(t||n)};static \u0275prov=F({token:n,factory:n.\u0275fac})};function je(){return{async:!1,breaks:!1,extensions:null,gfm:!0,hooks:null,pedantic:!1,renderer:null,silent:!1,tokenizer:null,walkTokens:null}}var V=je();function Ct(n){V=n}var Y={exec:()=>null};function ne(n){let e=[];return t=>{let i=Math.max(0,Math.min(3,t-1)),r=e[i];return r||(r=n(i),e[i]=r),r}}function x(n,e=""){let t=typeof n=="string"?n:n.source,i={replace:(r,a)=>{let s=typeof a=="string"?a:a.source;return s=s.replace(T.caret,"$1"),t=t.replace(r,s),i},getRegex:()=>new RegExp(t,e)};return i}var pn=((n="")=>{try{return!!new RegExp("(?<=1)(?<!1)"+n)}catch{return!1}})(),T={codeRemoveIndent:/^(?: {1,4}| {0,3}\t)/gm,outputLinkReplace:/\\([\[\]])/g,indentCodeCompensation:/^(\s+)(?:```)/,beginningSpace:/^\s+/,endingHash:/#$/,startingSpaceChar:/^ /,endingSpaceChar:/ $/,nonSpaceChar:/[^ ]/,newLineCharGlobal:/\n/g,tabCharGlobal:/\t/g,multipleSpaceGlobal:/\s+/g,blankLine:/^[ \t]*$/,doubleBlankLine:/\n[ \t]*\n[ \t]*$/,blockquoteStart:/^ {0,3}>/,blockquoteSetextReplace:/\n {0,3}((?:=+|-+) *)(?=\n|$)/g,blockquoteSetextReplace2:/^ {0,3}>[ \t]?/gm,listReplaceNesting:/^ {1,4}(?=( {4})*[^ ])/g,listIsTask:/^\[[ xX]\] +\S/,listReplaceTask:/^\[[ xX]\] +/,listTaskCheckbox:/\[[ xX]\]/,anyLine:/\n.*\n/,hrefBrackets:/^<(.*)>$/,tableDelimiter:/[:|]/,tableAlignChars:/^\||\| *$/g,tableRowBlankLine:/\n[ \t]*$/,tableAlignRight:/^ *-+: *$/,tableAlignCenter:/^ *:-+: *$/,tableAlignLeft:/^ *:-+ *$/,startATag:/^<a /i,endATag:/^<\/a>/i,startPreScriptTag:/^<(pre|code|kbd|script)(\s|>)/i,endPreScriptTag:/^<\/(pre|code|kbd|script)(\s|>)/i,startAngleBracket:/^</,endAngleBracket:/>$/,pedanticHrefTitle:/^([^'"]*[^\s])\s+(['"])(.*)\2/,unicodeAlphaNumeric:/[\p{L}\p{N}]/u,escapeTest:/[&<>"']/,escapeReplace:/[&<>"']/g,escapeTestNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/,escapeReplaceNoEncode:/[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/g,caret:/(^|[^\[])\^/g,percentDecode:/%25/g,findPipe:/\|/g,splitPipe:/ \|/,slashPipe:/\\\|/g,carriageReturn:/\r\n|\r/g,spaceLine:/^ +$/gm,notSpaceStart:/^\S*/,endingNewline:/\n$/,listItemRegex:n=>new RegExp(`^( {0,3}${n})((?:[	 ][^\\n]*)?(?:\\n|$))`),nextBulletRegex:ne(n=>new RegExp(`^ {0,${n}}(?:[*+-]|\\d{1,9}[.)])((?:[ 	][^\\n]*)?(?:\\n|$))`)),hrRegex:ne(n=>new RegExp(`^ {0,${n}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`)),fencesBeginRegex:ne(n=>new RegExp(`^ {0,${n}}(?:\`\`\`|~~~)`)),headingBeginRegex:ne(n=>new RegExp(`^ {0,${n}}#`)),htmlBeginRegex:ne(n=>new RegExp(`^ {0,${n}}<(?:[a-z].*>|!--)`,"i")),blockquoteBeginRegex:ne(n=>new RegExp(`^ {0,${n}}>`))},dn=/^(?:[ \t]*(?:\n|$))+/,hn=/^((?: {4}| {0,3}\t)[^\n]+(?:\n(?:[ \t]*(?:\n|$))*)?)+/,un=/^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/,pe=/^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/,mn=/^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/,We=/ {0,3}(?:[*+-]|\d{1,9}[.)])/,_t=/^(?!bull |blockCode|fences|blockquote|heading|html|table)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html|table))+?)\n {0,3}(=+|-+) *(?:\n+|$)/,Et=x(_t).replace(/bull/g,We).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/\|table/g,"").getRegex(),gn=x(_t).replace(/bull/g,We).replace(/blockCode/g,/(?: {4}| {0,3}\t)/).replace(/fences/g,/ {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g,/ {0,3}>/).replace(/heading/g,/ {0,3}#{1,6}(?:\s|$)/).replace(/html/g,/ {0,3}<[^\n>]+>\n/).replace(/table/g,/ {0,3}\|?(?:[:\- ]*\|)+[\:\- ]*\n/).getRegex(),He=/^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table|[ \t]+\n)[^\n]+)*)/,fn=/^[^\n]+/,Ue=/(?!\s*\])(?:\\[\s\S]|[^\[\]\\])+/,xn=x(/^ {0,3}\[(label)\]: *(?:\n[ \t]*)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n[ \t]*)?| *\n[ \t]*)(title))? *(?:\n+|$)/).replace("label",Ue).replace("title",/(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(),bn=x(/^(bull)([ \t][^\n]*?)?(?:\n|$)/).replace(/bull/g,We).getRegex(),Oe="address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul",Ge=/<!--(?:-?>|[\s\S]*?(?:-->|$))/,yn=x("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n*|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>[^\\n]*\\n*|$)|<![A-Z][\\s\\S]*?(?:>[^\\n]*\\n*|$)|<!\\[CDATA\\[[\\s\\S]*?(?:\\]\\]>[^\\n]*\\n*|$)|</?(tag)(?: +|\\n|/?>
4)[\\s\\S]*?(?:(?:\\n[ 	]*)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ 	]*)+\\n|$)|</(?!script|pre|style|textarea)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n[ 	]*)+\\n|$))","i").replace("comment",Ge).replace("tag",Oe).replace("attribute",/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(),Pt=n=>x(He).replace("hr",pe).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("|table","").replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list",n).replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",Oe).getRegex(),kn=Pt(/ {0,3}(?:[*+-]|1[.)])[ \t]+[^ \t\n]/),vn=Pt(/ {0,3}(?:[*+-]|\d{1,9}[.)])(?:[ \t]|\n|$)/),wn=x(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph",vn).getRegex(),Ze={blockquote:wn,code:hn,def:xn,fences:un,heading:mn,hr:pe,html:yn,lheading:Et,list:bn,newline:dn,paragraph:kn,table:Y,text:fn},ft=x("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr",pe).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("blockquote"," {0,3}>").replace("code","(?: {4}| {0,3}	)[^\\n]").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",Oe).getRegex(),Cn=W(S({},Ze),{lheading:gn,table:ft,paragraph:x(He).replace("hr",pe).replace("heading"," {0,3}#{1,6}(?:\\s|$)").replace("|lheading","").replace("table",ft).replace("blockquote"," {0,3}>").replace("fences"," {0,3}(?:`{3,}(?=[^`\\n]*(?:\\n|$))|~~~)[^\\n]*(?:\\n|$)").replace("list"," {0,3}(?:[*+-]|1[.)])[ \\t]+[^ \\t\\n]").replace("html","</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|textarea|!--)").replace("tag",Oe).getRegex()}),_n=W(S({},Ze),{html:x(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)|<tag(?:"[^"]*"|'[^']*'|\\s[^'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment",Ge).replace(/tag/g,"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(),def:/^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,heading:/^(#{1,6})(.*)(?:\n+|$)/,fences:Y,lheading:/^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/,paragraph:x(He).replace("hr",pe).replace("heading",` *#{1,6} *[^
5]`).replace("lheading",Et).replace("|table","").replace("blockquote"," {0,3}>").replace("|fences","").replace("|list","").replace("|html","").replace("|tag","").getRegex()}),En=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,Pn=/^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,St=/^( {2,}|\\)\n(?!\s*$)/,Sn=/^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\<!\[`*_]|\b_|$)|[^ ](?= {2,}\n)))/,H=/[\p{P}\p{S}]/u,re=/[\s\p{P}\p{S}]/u,de=/[^\s\p{P}\p{S}]/u,On=x(/^((?![*_])punctSpace)/,"u").replace(/punctSpace/g,re).getRegex(),Mn=/[\p{Pi}\p{Ps}"']/u,Ot=/(?!~)[\p{P}\p{S}]/u,Tn=/(?!~)[\s\p{P}\p{S}]/u,An=/(?:[^\s\p{P}\p{S}]|~)/u,In=x(/link|precode-code|html/,"g").replace("link",/\[(?:[^\[\]`]|(?<a>`+)[^`]+\k<a>(?!`))*?\]\((?:\\[\s\S]|[^\\\(\)]|\((?:\\[\s\S]|[^\\\(\)])*\))*\)/).replace("precode-",pn?"(?<!`)()":"(^^|[^`])").replace("code",/(?<b>`+)[^`]+\k<b>(?!`)/).replace("html",/<(?! )[^<>]*?>/).getRegex(),Mt=/^(?:\*+(?:((?!\*)punct)|([^\s*]))?)|^_+(?:((?!_)punct)|([^\s_]))?/,Rn=x(Mt,"u").replace(/punct/g,H).getRegex(),$n=x(Mt,"u").replace(/punct/g,Ot).getRegex(),Bn=/^(?:\*+(?:((?!\*)(?!openQuote)punct)|([^\s*]))?)|^_+(?:((?!_)(?!openQuote)punct)|([^\s_]))?/,zn=x(Bn,"u").replace(/openQuote/g,Mn).replace(/punct/g,H).getRegex(),Tt="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)punctSpace(\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|notPunctSpace(\\*+)(?=notPunctSpace)",Dn=x(Tt,"gu").replace(/notPunctSpace/g,de).replace(/punctSpace/g,re).replace(/punct/g,H).getRegex(),Ln=x(Tt,"gu").replace(/notPunctSpace/g,An).replace(/punctSpace/g,Tn).replace(/punct/g,Ot).getRegex(),Nn="^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)punct(\\*+)(?=[\\s]|$)|notPunctSpace(\\*+)(?!\\*)(?=punctSpace|$)|(?!\\*)[\\s](\\*+)(?=notPunctSpace)|[\\s](\\*+)(?!\\*)(?=punct)|(?!\\*)punct(\\*+)(?!\\*)(?=punct)|(?:(?!\\*)punct|notPunctSpace)(\\*+)(?!\\*)(?=notPunctSpace)",qn=x(Nn,"gu").replace(/notPunctSpace/g,de).replace(/punctSpace/g,re).replace(/punct/g,H).getRegex(),Fn=x("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)punctSpace(_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)","gu").replace(/notPunctSpace/g,de).replace(/punctSpace/g,re).replace(/punct/g,H).getRegex(),jn="^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)punct(_+)(?=[\\s]|$)|notPunctSpace(_+)(?!_)(?=punctSpace|$)|(?!_)[\\s](_+)(?=notPunctSpace)|[\\s](_+)(?!_)(?=punct)|(?!_)punct(_+)(?!_)(?=punct)|(?:(?!_)punct|notPunctSpace)(_+)(?!_)(?=notPunctSpace)",Wn=x(jn,"gu").replace(/notPunctSpace/g,de).replace(/punctSpace/g,re).replace(/punct/g,H).getRegex(),Hn=x(/^~~?(?:((?!~)punct)|[^\s~])/,"u").replace(/punct/g,H).getRegex(),Un="^[^~]+(?=[^~])|(?!~)punct(~~?)(?=[\\s]|$)|notPunctSpace(~~?)(?!~)(?=punctSpace|$)|(?!~)punctSpace(~~?)(?=notPunctSpace)|[\\s](~~?)(?!~)(?=punct)|(?!~)punct(~~?)(?!~)(?=punct)|notPunctSpace(~~?)(?=notPunctSpace)",Gn=x(Un,"gu").replace(/notPunctSpace/g,de).replace(/punctSpace/g,re).replace(/punct/g,H).getRegex(),Zn=x(/\\(punct)/,"gu").replace(/punct/g,H).getRegex(),Qn=x(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme",/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email",/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(),Yn=x(Ge).replace("(?:-->|$)","-->").getRegex(),Jn=x("^comment|^</[a-zA-Z][\\w:-]*\\s*>|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^<![a-zA-Z]+\\s[\\s\\S]*?>|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>").replace("comment",Yn).replace("attribute",/\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(),Pe=/(?:\[(?:\\[\s\S]|[^\[\]\\])*\]|\\[\s\S]|`+(?!`)[^`]*?`+(?!`)|``+(?=\])|[^\[\]\\`])*?/,Vn=x(/^!?\[(label)\]\(\s*(href)(?:(?:[ \t]+(?:\n[ \t]*)?|\n[ \t]*)(title))?\s*\)/).replace("label",Pe).replace("href",/<(?:\\.|[^\n<>\\])+>|[^ \t\n\x00-\x1f]+|(?=\))/).replace("title",/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(),At=x(/^!?\[(label)\]\[(ref)\]/).replace("label",Pe).replace("ref",Ue).getRegex(),It=x(/^!?\[(ref)\](?:\[\])?/).replace("ref",Ue).getRegex(),Kn=x("reflink|nolink(?!\\()","g").replace("reflink",At).replace("nolink",It).getRegex(),xt=/[hH][tT][tT][pP][sS]?|[fF][tT][pP]/,Qe={_backpedal:Y,anyPunctuation:Zn,autolink:Qn,blockSkip:In,br:St,code:Pn,del:Y,delLDelim:Y,delRDelim:Y,emStrongLDelim:Rn,emStrongRDelimAst:Dn,emStrongRDelimUnd:Fn,escape:En,link:Vn,nolink:It,punctuation:On,reflink:At,reflinkSearch:Kn,tag:Jn,text:Sn,url:Y},Xn=W(S({},Qe),{emStrongLDelim:zn,emStrongRDelimAst:qn,emStrongRDelimUnd:Wn,link:x(/^!?\[(label)\]\((.*?)\)/).replace("label",Pe).getRegex(),reflink:x(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label",Pe).getRegex()}),Ne=W(S({},Qe),{emStrongRDelimAst:Ln,emStrongLDelim:$n,delLDelim:Hn,delRDelim:Gn,url:x(/^((?:protocol):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/).replace("protocol",xt).replace("email",/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(),_backpedal:/(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/,del:/^(~~?)(?=[^\s~])((?:\\[\s\S]|[^\\])*?(?:\\[\s\S]|[^\s~\\]))\1(?=[^~]|$)/,text:x(/^(`+|~+|[^`~])(?:(?=[`~])|(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\<!\[`*~_]|\b_|protocol:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)))/).replace("protocol",xt).getRegex()}),ei=W(S({},Ne),{br:x(St).replace("{2,}","*").getRegex(),text:x(Ne.text).replace("\\b_","\\b_| {2,}\\n").replace(/\{2,\}/g,"*").getRegex()}
vendor: 25,798 bytes, lines 5-67
5),Ee={normal:Ze,gfm:Cn,pedantic:_n},le={normal:Qe,gfm:Ne,breaks:ei,pedantic:Xn},ti={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},bt=n=>ti[n];function j(n,e){if(e){if(T.escapeTest.test(n))return n.replace(T.escapeReplace,bt)}else if(T.escapeTestNoEncode.test(n))return n.replace(T.escapeReplaceNoEncode,bt);return n}function yt(n){try{n=encodeURI(n).replace(T.percentDecode,"%")}catch{return null}return n}function kt(n,e){let t=n.replace(T.findPipe,(a,s,o)=>{let h=!1,p=s;for(;--p>=0&&o[p]==="\\";)h=!h;return h?"|":" |"}),i=t.split(T.splitPipe),r=0;if(i[0].trim()||i.shift(),i.length>0&&!i.at(-1)?.trim()&&i.pop(),e)if(i.length>e)i.splice(e);else for(;i.length<e;)i.push("");for(;r<i.length;r++)i[r]=i[r].trim().replace(T.slashPipe,"|");return i}function Z(n,e,t){let i=n.length;if(i===0)return"";let r=0;for(;r<i;){let a=n.charAt(i-r-1);if(a===e&&!t)r++;else if(a!==e&&t)r++;else break}return n.slice(0,i-r)}function vt(n){let e=n.split(`
6`),t=e.length-1;for(;t>=0&&T.blankLine.test(e[t]);)t--;return e.length-t<=2?n:e.slice(0,t+1).join(`
7`)}function ni(n,e){if(n.indexOf(e[1])===-1)return-1;let t=0;for(let i=0;i<n.length;i++)if(n[i]==="\\")i++;else if(n[i]===e[0])t++;else if(n[i]===e[1]&&(t--,t<0))return i;return t>0?-2:-1}function ii(n,e=0){let t=e,i="";for(let r of n)if(r==="	"){let a=4-t%4;i+=" ".repeat(a),t+=a}else i+=r,t++;return i}function wt(n,e,t,i,r){let a=e.href,s=e.title||null,o=n[1].replace(r.other.outputLinkReplace,"$1"),h=n[0].charAt(0)==="!";i.state.inLink=!0;let p=i.state.linkEmitted,g=i.state.inRawBlock;i.state.linkEmitted=!1;let m=i.inlineTokens(o),k=i.state.linkEmitted;if(i.state.linkEmitted=p,i.state.inLink=!1,!h){if(k){i.state.inRawBlock=g;return}i.state.linkEmitted=!0}return{type:h?"image":"link",raw:t,href:a,title:s,text:o,tokens:m}}function ri(n,e,t){let i=n.match(t.other.indentCodeCompensation);if(i===null)return e;let r=i[1];return e.split(`
8`).map(a=>{let s=a.match(t.other.beginningSpace);if(s===null)return a;let[o]=s;return o.length>=r.length?a.slice(r.length):a}).join(`
9`)}var Se=class{options;rules;lexer;constructor(n){this.options=n||V}space(n){let e=this.rules.block.newline.exec(n);if(e&&e[0].length>0)return{type:"space",raw:e[0]}}code(n){let e=this.rules.block.code.exec(n);if(e){let t=this.options.pedantic?e[0]:vt(e[0]),i=t.replace(this.rules.other.codeRemoveIndent,"");return{type:"code",raw:t,codeBlockStyle:"indented",text:i}}}fences(n){let e=this.rules.block.fences.exec(n);if(e){let t=e[0],i=ri(t,e[3]||"",this.rules);return{type:"code",raw:t,lang:e[2]?e[2].trim().replace(this.rules.inline.anyPunctuation,"$1"):e[2],text:i}}}heading(n){let e=this.rules.block.heading.exec(n);if(e){let t=e[2].trim();if(this.rules.other.endingHash.test(t)){let i=Z(t,"#");(this.options.pedantic||!i||this.rules.other.endingSpaceChar.test(i))&&(t=i.trim())}return{type:"heading",raw:Z(e[0],`
10`),depth:e[1].length,text:t,tokens:this.lexer.inline(t)}}}hr(n){let e=this.rules.block.hr.exec(n);if(e)return{type:"hr",raw:Z(e[0],`
11`)}}blockquote(n){let e=this.rules.block.blockquote.exec(n);if(e){let t=Z(e[0],`
12`).split(`
13`),i="",r="",a=[];for(;t.length>0;){let s=!1,o=[],h;for(h=0;h<t.length;h++)if(this.rules.other.blockquoteStart.test(t[h]))o.push(t[h]),s=!0;else if(!s)o.push(t[h]);else break;t=t.slice(h);let p=o.join(`
14`),g=p.replace(this.rules.other.blockquoteSetextReplace,`
15    $1`).replace(this.rules.other.blockquoteSetextReplace2,"");i=i?`${i}
16${p}`:p,r=r?`${r}
17${g}`:g;let m=this.lexer.state.top;if(this.lexer.state.top=!0,this.lexer.blockTokens(g,a,!0),this.lexer.state.top=m,t.length===0)break;let k=a.at(-1);if(k?.type==="code")break;if(k?.type==="blockquote"){let A=k,w=t.join(`
18`),q=A.raw+`
19`+w.replace(this.rules.other.blockquoteSetextReplace2,""),oe=this.blockquote(q);a[a.length-1]=oe,i=`${i}
20${w}`,r=r.substring(0,r.length-A.text.length)+oe.text;break}else if(k?.type==="list"){let A=k,w=A.raw+`
21`+t.join(`
22`),q=this.list(w);a[a.length-1]=q,i=i.substring(0,i.length-k.raw.length)+q.raw,r=r.substring(0,r.length-A.raw.length)+q.raw,t=w.substring(a.at(-1).raw.length).split(`
23`);continue}}return{type:"blockquote",raw:i,tokens:a,text:r}}}list(n){let e=this.rules.block.list.exec(n);if(e){let t=e[1].trim(),i=t.length>1,r={type:"list",raw:"",ordered:i,start:i?+t.slice(0,-1):"",loose:!1,items:[]};t=i?`\\d{1,9}\\${t.slice(-1)}`:`\\${t}`,this.options.pedantic&&(t=i?t:"[*+-]");let a=this.rules.other.listItemRegex(t),s=!1;for(;n;){let h=!1,p="",g="";if(!(e=a.exec(n))||this.rules.block.hr.test(n))break;p=e[0],n=n.substring(p.length);let m=ii(e[2].split(`
24`,1)[0],e[1].length),k=n.split(`
25`,1)[0],A=!m.trim(),w=0;if(this.options.pedantic?(w=2,g=m.trimStart()):A?w=e[1].length+1:(w=m.search(this.rules.other.nonSpaceChar),w=w>4?1:w,g=m.slice(w),w+=e[1].length),A&&this.rules.other.blankLine.test(k)&&(p+=k+`
26`,n=n.substring(k.length+1),h=!0),!h){let q=this.rules.other.nextBulletRegex(w),oe=this.rules.other.hrRegex(w),Ve=this.rules.other.fencesBeginRegex(w),Ke=this.rules.other.headingBeginRegex(w),qt=this.rules.other.htmlBeginRegex(w),Ft=this.rules.other.blockquoteBeginRegex(w);for(;n;){let Ie=n.split(`
27`,1)[0],se;if(k=Ie,this.options.pedantic?(k=k.replace(this.rules.other.listReplaceNesting,"  "),se=k):se=k.replace(this.rules.other.tabCharGlobal,"    "),Ve.test(k)||Ke.test(k)||qt.test(k)||Ft.test(k)||q.test(k)||oe.test(k))break;if(se.search(this.rules.other.nonSpaceChar)>=w||!k.trim())g+=`
28`+se.slice(w);else{if(A||m.replace(this.rules.other.tabCharGlobal,"    ").search(this.rules.other.nonSpaceChar)>=4||Ve.test(m)||Ke.test(m)||oe.test(m))break;g+=`
29`+k}A=!k.trim(),p+=Ie+`
30`,n=n.substring(Ie.length+1),m=se.slice(w)}}r.loose||(s?r.loose=!0:this.rules.other.doubleBlankLine.test(p)&&(s=!0)),r.items.push({type:"list_item",raw:p,task:!!this.options.gfm&&this.rules.other.listIsTask.test(g),loose:!1,text:g,tokens:[]}),r.raw+=p}let o=r.items.at(-1);if(o)o.raw=o.raw.trimEnd(),o.text=o.text.trimEnd();else return;r.raw=r.raw.trimEnd();for(let h of r.items)if(this.lexer.state.top=!1,h.tokens=this.lexer.blockTokens(h.text,[]),!r.loose){let p=h.tokens.filter(m=>m.type==="space"),g=p.length>0&&p.some(m=>this.rules.other.anyLine.test(m.raw));r.loose=g}for(let h of r.items){let p=h.tokens[0];if(h.task&&(p?.type==="text"||p?.type==="paragraph")){h.text=h.text.replace(this.rules.other.listReplaceTask,""),p.raw=p.raw.replace(this.rules.other.listReplaceTask,""),p.text=p.text.replace(this.rules.other.listReplaceTask,"");for(let m=this.lexer.inlineQueue.length-1;m>=0;m--)if(this.rules.other.listIsTask.test(this.lexer.inlineQueue[m].src)){this.lexer.inlineQueue[m].src=this.lexer.inlineQueue[m].src.replace(this.rules.other.listReplaceTask,"");break}let g=this.rules.other.listTaskCheckbox.exec(h.raw);if(g){let m={type:"checkbox",raw:g[0]+" ",checked:g[0]!=="[ ]"};h.checked=m.checked,r.loose?h.tokens[0]&&["paragraph","text"].includes(h.tokens[0].type)&&"tokens"in h.tokens[0]&&h.tokens[0].tokens?(h.tokens[0].raw=m.raw+h.tokens[0].raw,h.tokens[0].text=m.raw+h.tokens[0].text,h.tokens[0].tokens.unshift(m)):h.tokens.unshift({type:"paragraph",raw:m.raw,text:m.raw,tokens:[m]}):h.tokens.unshift(m)}}else h.task&&(h.task=!1)}if(r.loose)for(let h of r.items){h.loose=!0;for(let p of h.tokens)p.type==="text"&&(p.type="paragraph")}return r}}html(n){let e=this.rules.block.html.exec(n);if(e){let t=vt(e[0]);return{type:"html",block:!0,raw:t,pre:e[1]==="pre"||e[1]==="script"||e[1]==="style",text:t}}}def(n){let e=this.rules.block.def.exec(n);if(e){let t=e[1].toLowerCase().replace(this.rules.other.multipleSpaceGlobal," "),i=e[2]?e[2].replace(this.rules.other.hrefBrackets,"$1").replace(this.rules.inline.anyPunctuation,"$1"):"",r=e[3]?e[3].substring(1,e[3].length-1).replace(this.rules.inline.anyPunctuation,"$1"):e[3];return{type:"def",tag:t,raw:Z(e[0],`
31`),href:i,title:r}}}table(n){let e=this.rules.block.table.exec(n);if(!e||!this.rules.other.tableDelimiter.test(e[2]))return;let t=kt(e[1]),i=e[2].replace(this.rules.other.tableAlignChars,"").split("|"),r=e[3]?.trim()?e[3].replace(this.rules.other.tableRowBlankLine,"").split(`
32`):[],a={type:"table",raw:Z(e[0],`
33`),header:[],align:[],rows:[]};if(t.length===i.length){for(let s of i)this.rules.other.tableAlignRight.test(s)?a.align.push("right"):this.rules.other.tableAlignCenter.test(s)?a.align.push("center"):this.rules.other.tableAlignLeft.test(s)?a.align.push("left"):a.align.push(null);for(let s=0;s<t.length;s++)a.header.push({text:t[s],tokens:this.lexer.inline(t[s]),header:!0,align:a.align[s]});for(let s of r)a.rows.push(kt(s,a.header.length).map((o,h)=>({text:o,tokens:this.lexer.inline(o),header:!1,align:a.align[h]})));return a}}lheading(n){let e=this.rules.block.lheading.exec(n);if(e){let t=e[1].trim();return{type:"heading",raw:Z(e[0],`
34`),depth:e[2].charAt(0)==="="?1:2,text:t,tokens:this.lexer.inline(t)}}}paragraph(n){let e=this.rules.block.paragraph.exec(n);if(e){let t=e[1].charAt(e[1].length-1)===`
35`?e[1].slice(0,-1):e[1];return{type:"paragraph",raw:e[0],text:t,tokens:this.lexer.inline(t)}}}text(n){let e=this.rules.block.text.exec(n);if(e)return{type:"text",raw:e[0],text:e[0],tokens:this.lexer.inline(e[0])}}escape(n){let e=this.rules.inline.escape.exec(n);if(e)return{type:"escape",raw:e[0],text:e[1]}}tag(n){let e=this.rules.inline.tag.exec(n);if(e)return!this.lexer.state.inLink&&this.rules.other.startATag.test(e[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&this.rules.other.endATag.test(e[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&this.rules.other.startPreScriptTag.test(e[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&this.rules.other.endPreScriptTag.test(e[0])&&(this.lexer.state.inRawBlock=!1),{type:"html",raw:e[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,block:!1,text:e[0]}}link(n){let e=this.rules.inline.link.exec(n);if(e){let t=e[2].trim();if(!this.options.pedantic&&this.rules.other.startAngleBracket.test(t)){if(!this.rules.other.endAngleBracket.test(t))return;let a=Z(t.slice(0,-1),"\\");if((t.length-a.length)%2===0)return}else{let a=ni(e[2],"()");if(a===-2)return;if(a>-1){let s=(e[0].indexOf("!")===0?5:4)+e[1].length+a;e[2]=e[2].substring(0,a),e[0]=e[0].substring(0,s).trim(),e[3]=""}}let i=e[2],r="";if(this.options.pedantic){let a=this.rules.other.pedanticHrefTitle.exec(i);a&&(i=a[1],r=a[3])}else r=e[3]?e[3].slice(1,-1):"";return i=i.trim(),this.rules.other.startAngleBracket.test(i)&&(this.options.pedantic&&!this.rules.other.endAngleBracket.test(t)?i=i.slice(1):i=i.slice(1,-1)),wt(e,{href:i&&i.replace(this.rules.inline.anyPunctuation,"$1"),title:r&&r.replace(this.rules.inline.anyPunctuation,"$1")},e[0],this.lexer,this.rules)}}reflink(n,e){let t;if((t=this.rules.inline.reflink.exec(n))||(t=this.rules.inline.nolink.exec(n))){let i=(t[2]||t[1]).replace(this.rules.other.multipleSpaceGlobal," "),r=e[i.toLowerCase()];if(!r){let a=t[0].charAt(0);return{type:"text",raw:a,text:a}}return wt(t,r,t[0],this.lexer,this.rules)}}emStrong(n,e,t=""){let i=this.rules.inline.emStrongLDelim.exec(n);if(!(!i||!i[1]&&!i[2]&&!i[3]&&!i[4]||i[4]&&t.match(this.rules.other.unicodeAlphaNumeric))&&(!(i[1]||i[3])||!t||this.rules.inline.punctuation.exec(t))){let r=[...i[0]].length-1,a,s,o=r,h=0,p=i[0][0],g=t===p,m=p==="*"?this.rules.inline.emStrongRDelimAst:this.rules.inline.emStrongRDelimUnd;for(m.lastIndex=0,e=e.slice(-1*n.length+r);(i=m.exec(e))!==null;){if(a=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!a)continue;if(s=[...a].length,i[3]||i[4]){o+=s;continue}else if(i[5]||i[6]){if(r%3&&!((r+s)%3)){h+=s;continue}if(g)break}if(o-=s,o>0)continue;s=Math.min(s,s+o+h);let k=[...i[0]][0].length,A=n.slice(0,r+i.index+k+s);if(Math.min(r,s)%2){let q=A.slice(1,-1);return{type:"em",raw:A,text:q,tokens:this.lexer.inlineTokens(q)}}let w=A.slice(2,-2);return{type:"strong",raw:A,text:w,tokens:this.lexer.inlineTokens(w)}}}}codespan(n){let e=this.rules.inline.code.exec(n);if(e){let t=e[2].replace(this.rules.other.newLineCharGlobal," "),i=this.rules.other.nonSpaceChar.test(t),r=this.rules.other.startingSpaceChar.test(t)&&this.rules.other.endingSpaceChar.test(t);return i&&r&&(t=t.substring(1,t.length-1)),{type:"codespan",raw:e[0],text:t}}}br(n){let e=this.rules.inline.br.exec(n);if(e)return{type:"br",raw:e[0]}}del(n,e,t=""){let i=this.rules.inline.delLDelim.exec(n);if(i&&(!i[1]||!t||this.rules.inline.punctuation.exec(t))){let r=[...i[0]].length-1,a,s,o=r,h=this.rules.inline.delRDelim;for(h.lastIndex=0,e=e.slice(-1*n.length+r);(i=h.exec(e))!==null;){if(a=i[1]||i[2]||i[3]||i[4]||i[5]||i[6],!a||(s=[...a].length,s!==r))continue;if(i[3]||i[4]){o+=s;continue}if(o-=s,o>0)continue;s=Math.min(s,s+o);let p=[...i[0]][0].length,g=n.slice(0,r+i.index+p+s),m=g.slice(r,-r);return{type:"del",raw:g,text:m,tokens:this.lexer.inlineTokens(m)}}}}autolink(n){let e=this.rules.inline.autolink.exec(n);if(e){let t,i;return e[2]==="@"?(t=e[1],i="mailto:"+t):(t=e[1],i=t),{type:"link",raw:e[0],text:t,href:i,tokens:[{type:"text",raw:t,text:t}]}}}url(n){let e;if(e=this.rules.inline.url.exec(n)){let t,i;if(e[2]==="@")t=e[0],i="mailto:"+t;else{let r;do r=e[0],e[0]=this.rules.inline._backpedal.exec(e[0])?.[0]??"";while(r!==e[0]);t=e[0],e[1]==="www."?i="http://"+e[0]:i=e[0]}return{type:"link",raw:e[0],text:t,href:i,tokens:[{type:"text",raw:t,text:t}]}}}inlineText(n){let e=this.rules.inline.text.exec(n);if(e){let t=this.lexer.state.inRawBlock;return{type:"text",raw:e[0],text:e[0],escaped:t}}}},L=class qe{tokens;options;state;inlineQueue;tokenizer;constructor(e){this.tokens=[],this.tokens.links=Object.create(null),this.options=e||V,this.options.tokenizer=this.options.tokenizer||new Se,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,linkEmitted:!1,top:!0};let t={other:T,block:Ee.normal,inline:le.normal};this.options.pedantic?(t.block=Ee.pedantic,t.inline=le.pedantic):this.options.gfm&&(t.block=Ee.gfm,this.options.breaks?t.inline=le.breaks:t.inline=le.gfm),this.tokenizer.rules=t}static get rules(){return{block:Ee,inline:le}}static lex(e,t){return new qe(t).lex(e)}static lexInline(e,t){return new qe(t).inlineTokens(e)}lex(e){e=e.replace(T.carriageReturn,`
36`),this.blockTokens(e,this.tokens);for(let t=0;t<this.inlineQueue.length;t++){let i=this.inlineQueue[t];this.inlineTokens(i.src,i.tokens)}return this.inlineQueue=[],this.tokens}blockTokens(e,t=[],i=!1){this.tokenizer.lexer=this,this.options.pedantic&&(e=e.replace(T.tabCharGlobal,"    ").replace(T.spaceLine,""));let r=1/0;for(;e;){if(e.length<r)r=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}let a;if(this.options.extensions?.block?.some(o=>(a=o.call({lexer:this},e,t))?(e=e.substring(a.raw.length),t.push(a),!0):!1))continue;if(a=this.tokenizer.space(e)){e=e.substring(a.raw.length);let o=t.at(-1);a.raw.length===1&&o!==void 0?o.raw+=`
37`:t.push(a);continue}if(a=this.tokenizer.code(e)){e=e.substring(a.raw.length);let o=t.at(-1);o?.type==="paragraph"||o?.type==="text"?(o.raw+=(o.raw.endsWith(`
38`)?"":`
39`)+a.raw,o.text+=`
40`+a.text,this.inlineQueue.at(-1).src=o.text):t.push(a);continue}if(a=this.tokenizer.fences(e)){e=e.substring(a.raw.length),t.push(a);continue}if(a=this.tokenizer.heading(e)){e=e.substring(a.raw.length),t.push(a);continue}if(a=this.tokenizer.hr(e)){e=e.substring(a.raw.length),t.push(a);continue}if(a=this.tokenizer.blockquote(e)){e=e.substring(a.raw.length),t.push(a);continue}if(a=this.tokenizer.list(e)){e=e.substring(a.raw.length),t.push(a);continue}if(a=this.tokenizer.html(e)){e=e.substring(a.raw.length),t.push(a);continue}if(a=this.tokenizer.def(e)){e=e.substring(a.raw.length);let o=t.at(-1);o?.type==="paragraph"||o?.type==="text"?(o.raw+=(o.raw.endsWith(`
41`)?"":`
42`)+a.raw,o.text+=`
43`+a.raw,this.inlineQueue.at(-1).src=o.text):this.tokens.links[a.tag]||(this.tokens.links[a.tag]={href:a.href,title:a.title},t.push(a));continue}if(a=this.tokenizer.table(e)){e=e.substring(a.raw.length),t.push(a);continue}if(a=this.tokenizer.lheading(e)){e=e.substring(a.raw.length),t.push(a);continue}let s=e;if(this.options.extensions?.startBlock){let o=1/0,h=e.slice(1),p;this.options.extensions.startBlock.forEach(g=>{p=g.call({lexer:this},h),typeof p=="number"&&p>=0&&(o=Math.min(o,p))}),o<1/0&&o>=0&&(s=e.substring(0,o+1))}if(this.state.top&&(a=this.tokenizer.paragraph(s))){let o=t.at(-1);i&&o?.type==="paragraph"?(o.raw+=(o.raw.endsWith(`
44`)?"":`
45`)+a.raw,o.text+=`
46`+a.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=o.text):t.push(a),i=s.length!==e.length,e=e.substring(a.raw.length);continue}if(a=this.tokenizer.text(e)){e=e.substring(a.raw.length);let o=t.at(-1);o?.type==="text"?(o.raw+=(o.raw.endsWith(`
47`)?"":`
48`)+a.raw,o.text+=`
49`+a.text,this.inlineQueue.pop(),this.inlineQueue.at(-1).src=o.text):t.push(a);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return this.state.top=!0,t}inline(e,t=[]){return this.inlineQueue.push({src:e,tokens:t}),t}linkInText(e){if(!e.includes("["))return!1;let t=this.tokenizer.rules.inline.link;for(let i of e.matchAll(this.tokenizer.rules.inline.blockSkip))if(t.test(i[0])&&e.charAt(i.index-1)!=="!")return!0;for(let i of e.matchAll(this.tokenizer.rules.inline.reflinkSearch)){let r=i[0],a=r.lastIndexOf("[");if(!(r.charAt(0)==="!"||!Object.hasOwn(this.tokens.links,r.slice(a+1,-1)))&&!(a>1&&this.linkInText(r.slice(1,a-1))))return!0}return!1}inlineTokens(e,t=[]){this.tokenizer.lexer=this;let i=e;if(this.tokens.links&&e.includes("[")){let o=this.tokenizer.rules.inline.reflinkSearch,h=p=>{let g=p.lastIndexOf("[");if(!Object.hasOwn(this.tokens.links,p.slice(g+1,-1)))return p;if(g>1&&p.charAt(0)!=="!"){let m=p.slice(1,g-1);if(this.linkInText(m))return"["+m.replace(o,h)+"]["+"a".repeat(p.length-g-2)+"]"}return"["+"a".repeat(p.length-2)+"]"};i=i.replace(o,h)}i=i.replace(this.tokenizer.rules.inline.anyPunctuation,o=>"+".repeat(o.length)),i=i.replace(this.tokenizer.rules.inline.blockSkip,(o,h,p)=>{let g=p?p.length:0;return o.slice(0,g)+"["+"a".repeat(o.length-g-2)+"]"}),i=this.options.hooks?.emStrongMask?.call({lexer:this},i)??i;let r=!1,a="",s=1/0;for(;e;){if(e.length<s)s=e.length;else{this.infiniteLoopError(e.charCodeAt(0));break}r||(a=""),r=!1;let o;if(this.options.extensions?.inline?.some(p=>(o=p.call({lexer:this},e,t))?(e=e.substring(o.raw.length),t.push(o),!0):!1))continue;if(o=this.tokenizer.escape(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.tag(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.link(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.reflink(e,this.tokens.links)){e=e.substring(o.raw.length);let p=t.at(-1);o.type==="text"&&p?.type==="text"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(o=this.tokenizer.emStrong(e,i,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.codespan(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.br(e)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.del(e,i,a)){e=e.substring(o.raw.length),t.push(o);continue}if(o=this.tokenizer.autolink(e)){e=e.substring(o.raw.length),t.push(o);continue}if(!this.state.inLink&&(o=this.tokenizer.url(e))){e=e.substring(o.raw.length),t.push(o);continue}let h=e;if(this.options.extensions?.startInline){let p=1/0,g=e.slice(1),m;this.options.extensions.startInline.forEach(k=>{m=k.call({lexer:this},g),typeof m=="number"&&m>=0&&(p=Math.min(p,m))}),p<1/0&&p>=0&&(h=e.substring(0,p+1))}if(o=this.tokenizer.inlineText(h)){e=e.substring(o.raw.length),o.raw.slice(-1)!=="_"&&(a=o.raw.slice(-1)),r=!0;let p=t.at(-1);p?.type==="text"?(p.raw+=o.raw,p.text+=o.text):t.push(o);continue}if(e){this.infiniteLoopError(e.charCodeAt(0));break}}return t}infiniteLoopError(e){let t="Infinite loop on byte: "+e;if(this.options.silent)console.error(t);else throw new Error(t)}},ie=class{options;parser;constructor(n){this.options=n||V}space(n){return""}code({text:n,lang:e,escaped:t}){let i=(e||"").match(T.notSpaceStart)?.[0],r=n.replace(T.endingNewline,"")+`
50`;return i?'<pre><code class="language-'+j(i)+'">'+(t?r:j(r,!0))+`</code></pre>
51`:"<pre><code>"+(t?r:j(r,!0))+`</code></pre>
52`}blockquote({tokens:n}){return`<blockquote>
53${this.parser.parse(n)}</blockquote>
54`}html({text:n}){return n}def(n){return""}heading({tokens:n,depth:e}){return`<h${e}>${this.parser.parseInline(n)}</h${e}>
55`}hr(n){return`<hr>
56`}list(n){let e=n.ordered,t=n.start,i="";for(let s=0;s<n.items.length;s++){let o=n.items[s];i+=this.listitem(o)}let r=e?"ol":"ul",a=e&&t!==1?' start="'+t+'"':"";return"<"+r+a+`>
57`+i+"</"+r+`>
58`}listitem(n){return`<li>${this.parser.parse(n.tokens)}</li>
59`}checkbox({checked:n}){return"<input "+(n?'checked="" ':"")+'disabled="" type="checkbox"> '}paragraph({tokens:n}){return`<p>${this.parser.parseInline(n)}</p>
60`}table(n){let e="",t="";for(let r=0;r<n.header.length;r++)t+=this.tablecell(n.header[r]);e+=this.tablerow({text:t});let i="";for(let r=0;r<n.rows.length;r++){let a=n.rows[r];t="";for(let s=0;s<a.length;s++)t+=this.tablecell(a[s]);i+=this.tablerow({text:t})}return i&&(i=`<tbody>${i}</tbody>`),`<table>
61<thead>
62`+e+`</thead>
63`+i+`</table>
64`}tablerow({text:n}){return`<tr>
65${n}</tr>
66`}tablecell(n){let e=this.parser.parseInline(n.tokens),t=n.header?"th":"td";return(n.align?`<${t} align="${n.align}">`:`<${t}>`)+e+`</${t}>
67`}strong({tokens:n}){return`<strong>${this.parser.parseInline(n)}</strong>`}em({tokens:n}){return`<em>${this.parser.parseInline(n)}</em>`}codespan({text:n}){return`<code>${j(n,!0)}</code>`}br(n){return"<br>"}del({tokens:n}){return`<del>${this.parser.parseInline(n)}</del>`}link({href:n,title:e,tokens:t}){let i=this.parser.parseInline(t),r=yt(n);if(r===null)return i;n=r;let a='<a href="'+n+'"';return e&&(a+=' title="'+j(e)+'"'),a+=">"+i+"</a>",a}image({href:n,title:e,text:t,tokens:i}){i&&(t=this.parser.parseInline(i,this.parser.textRenderer));let r=yt(n);if(r===null)return j(t);n=r;let a=`<img src="${n}" alt="${j(t)}"`;return e&&(a+=` title="${j(e)}"`),a+=">",a}text(n){return"tokens"in n&&n.tokens?this.parser.parseInline(n.tokens):"escaped"in n&&n.escaped?n.text:j(n.text)}},Ye=class{strong({text:n}){return n}em({text:n}){return n}codespan({text:n}){return n}del({text:n}){return n}html({text:n}){return n}text({text:n}){return n}link({text:n}){return""+n}image({text:n}){return""+n}br(){return""}checkbox({raw:n}){return n}},N=class Fe{options;renderer;textRenderer;constructor(e){this.options=e||V,this.options.renderer=this.options.renderer||new ie,this.renderer=this.options.renderer,this.renderer.options=this.options,this.renderer.parser=this,this.textRenderer=new Ye}static parse(e,t){return new Fe(t).parse(e)}static parseInline(e,t){return new Fe(t).parseInline(e)}parse(e){this.renderer.parser=this;let t="";for(let i=0;i<e.length;i++){let r=e[i];if(this.options.extensions?.renderers?.[r.type]){let s=r,o=this.options.extensions.renderers[s.type].call({parser:this},s);if(o!==!1||!["space","hr","heading","code","table","blockquote","list","checkbox","html","def","paragraph","text"].includes(s.type)){t+=o||"";continue}}let a=r;switch(a.type){case"space":{t+=this.renderer.space(a);break}case"hr":{t+=this.renderer.hr(a);break}case"heading":{t+=this.renderer.heading(a);break}case"code":{t+=this.renderer.code(a);break}case"table":{t+=this.renderer.table(a);break}case"blockquote":{t+=this.renderer.blockquote(a);break}case"list":{t+=this.renderer.list(a);break}case"checkbox":{t+=this.renderer.checkbox(a);break}case"html":{t+=this.renderer.html(a);break}case"def":{t+=this.renderer.def(a);break}case"paragraph":{t+=this.renderer.paragraph(a);break}case"text":{t+=this.renderer.text(a);break}default:{let s='Token with "'+a.type+'" type was not found.';if(this.options.silent)return console.error(s),"";throw new Error(s)}}}return t}parseInline(e,t=this.renderer){this.renderer.parser=this;let i="";for(let r=0;r<e.length;r++){let a=e[r];if(this.options.extensions?.renderers?.[a.type]){let o=this.options.extensions.renderers[a.type].call({parser:this},a);if(o!==!1||!["escape","html","link","image","checkbox","strong","em","codespan","br","del","text"].includes(a.type)){i+=o||"";continue}}let s=a;switch(s.type){case"escape":{i+=t.text(s);break}case"html":{i+=t.html(s);break}case"link":{i+=t.link(s);break}case"image":{i+=t.image(s);break}case"checkbox":{i+=t.checkbox(s);break}case"strong":{i+=t.strong(s);break}case"em":{i+=t.em(s);break}case"codespan":{i+=t.codespan(s);break}case"br":{i+=t.br(s);break}case"del":{i+=t.del(s);break}case"text":{i+=t.text(s);break}default:{let o='Token with "'+s.type+'" type was not found.';if(this.options.silent)return console.error(o),"";throw new Error(o)}}}return i}},ce=class{options;block;constructor(n){this.options=n||V}static passThroughHooks=new Set(["preprocess","postprocess","processAllTokens","emStrongMask"]);static passThroughHooksRespectAsync=new Set(["preprocess","postprocess","processAllTokens"]);preprocess(n){return n}postprocess(n){return n}processAllTokens(n){return n}emStrongMask(n){return n}provideLexer(n=this.block){return n?L.lex:L.lexInline}provideParser(n=this.block){return n?N.parse:N.parseInline}},Je=class{defaults=je();options=this.setOptions;parse=this.parseMarkdown(!0);parseInline=this.parseMarkdown(!1);Parser=N;Renderer=ie;TextRenderer=Ye;Lexer=L;Tokenizer=Se;Hooks=ce;constructor(...n){this.use(...n)}walkTokens(n,e){let t=[];for(let i of n)switch(t=t.concat(e.call(this,i)),i.type){case"table":{let r=i;for(let a of r.header)t=t.concat(this.walkTokens(a.tokens,e));for(let a of r.rows)for(let s of a)t=t.concat(this.walkTokens(s.tokens,e));break}case"list":{let r=i;t=t.concat(this.walkTokens(r.items,e));break}default:{let r=i;this.defaults.extensions?.childTokens?.[r.type]?this.defaults.extensions.childTokens[r.type].forEach(a=>{let s=r[a].flat(1/0);t=t.concat(this.walkTokens(s,e))}):r.tokens&&(t=t.concat(this.walkTokens(r.tokens,e)))}}return t}use(...n){let e=this.defaults.extensions||{renderers:{},childTokens:{}};
67return n.forEach(t=>{let i=S({},t);if(i.async=this.defaults.async||i.async||!1,t.extensions&&(t.extensions.forEach(r=>{if(!r.name)throw new Error("extension name required");if("renderer"in r){let a=e.renderers[r.name];a?e.renderers[r.name]=function(...s){let o=r.renderer.apply(this,s);return o===!1&&(o=a.apply(this,s)),o}:e.renderers[r.name]=r.renderer}if("tokenizer"in r){if(!r.level||r.level!=="block"&&r.level!=="inline")throw new Error("extension level must be 'block' or 'inline'");let a=e[r.level];a?a.unshift(r.tokenizer):e[r.level]=[r.tokenizer],r.start&&(r.level==="block"?e.startBlock?e.startBlock.push(r.start):e.startBlock=[r.start]:r.level==="inline"&&(e.startInline?e.startInline.push(r.start):e.startInline=[r.start]))}"childTokens"in r&&r.childTokens&&(e.childTokens[r.name]=r.childTokens)}),i.extensions=e),t.renderer){let r=this.defaults.renderer||new ie(this.defaults);for(let a in t.renderer){if(!(a in r))throw new Error(`renderer '${a}' does not exist`);if(["options","parser"].includes(a))continue;let s=a,o=t.renderer[s],h=r[s];r[s]=(...p)=>{let g=o.apply(r,p);return g===!1&&(g=h.apply(r,p)),g||""}}i.renderer=r}if(t.tokenizer){let r=this.defaults.tokenizer||new Se(this.defaults);for(let a in t.tokenizer){if(!(a in r))throw new Error(`tokenizer '${a}' does not exist`);if(["options","rules","lexer"].includes(a))continue;let s=a,o=t.tokenizer[s],h=r[s];r[s]=(...p)=>{let g=o.apply(r,p);return g===!1&&(g=h.apply(r,p)),g}}i.tokenizer=r}if(t.hooks){let r=this.defaults.hooks||new ce;for(let a in t.hooks){if(!(a in r))throw new Error(`hook '${a}' does not exist`);if(["options","block"].includes(a))continue;let s=a,o=t.hooks[s],h=r[s];ce.passThroughHooks.has(a)?r[s]=p=>{if(this.defaults.async&&ce.passThroughHooksRespectAsync.has(a))return he(this,null,function*(){let m=yield o.call(r,p);return h.call(r,m)});let g=o.call(r,p);return h.call(r,g)}:r[s]=(...p)=>{if(this.defaults.async)return he(this,null,function*(){let m=yield o.apply(r,p);return m===!1&&(m=yield h.apply(r,p)),m});let g=o.apply(r,p);return g===!1&&(g=h.apply(r,p)),g}}i.hooks=r}if(t.walkTokens){let r=this.defaults.walkTokens,a=t.walkTokens;i.walkTokens=function(s){let o=[];return o.push(a.call(this,s)),r&&(o=o.concat(r.call(this,s))),o}}this.defaults=S(S({},this.defaults),i)}),this}setOptions(n){return this.defaults=S(S({},this.defaults),n),this}lexer(n,e){return L.lex(n,e??this.defaults)}parser(n,e){return N.parse(n,e??this.defaults)}parseMarkdown(n){return(e,t)=>{let i=S({},t),r=S(S({},this.defaults),i),a=this.onError(!!r.silent,!!r.async);if(this.defaults.async===!0&&i.async===!1)return a(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise."));if(typeof e>"u"||e===null)return a(new Error("marked(): input parameter is undefined or null"));if(typeof e!="string")return a(new Error("marked(): input parameter is of type "+Object.prototype.toString.call(e)+", string expected"));if(r.hooks&&(r.hooks.options=r,r.hooks.block=n),r.async)return he(this,null,function*(){let s=r.hooks?yield r.hooks.preprocess(e):e,o=yield(r.hooks?yield r.hooks.provideLexer(n):n?L.lex:L.lexInline)(s,r),h=r.hooks?yield r.hooks.processAllTokens(o):o;r.walkTokens&&(yield Promise.all(this.walkTokens(h,r.walkTokens)));let p=yield(r.hooks?yield r.hooks.provideParser(n):n?N.parse:N.parseInline)(h,r);return r.hooks?yield r.hooks.postprocess(p):p}).catch(a);try{r.hooks&&(e=r.hooks.preprocess(e));let s=(r.hooks?r.hooks.provideLexer(n):n?L.lex:L.lexInline)(e,r);r.hooks&&(s=r.hooks.processAllTokens(s)),r.walkTokens&&this.walkTokens(s,r.walkTokens);let o=(r.hooks?r.hooks.provideParser(n):n?N.parse:N.parseInline)(s,r);return r.hooks&&(o=r.hooks.postprocess(o)),o}catch(s){return a(s)}}}onError(n,e){return t=>{if(t.message+=`
68Please report this to https://github.com/markedjs/marked.`,n){let i="<p>An error occurred:</p><pre>"+j(t.message+"",!0)+"</pre>";return e?Promise.resolve(i):i}if(e)return Promise.reject(t);throw t}}},J=new Je;function v(n,e){return J.parse(n,e)}v.options=v.setOptions=function(n){return J.setOptions(n),v.defaults=J.defaults,Ct(v.defaults),v};v.getDefaults=je;v.defaults=V;function ai(...n){return J.use(...n),v.defaults=J.defaults,Ct(v.defaults),v}v.use=ai;v.walkTokens=function(n,e){return J.walkTokens(n,e)};v.parseInline=J.parseInline;v.Parser=N;v.parser=N.parse;
68v.Renderer=ie;v.TextRenderer=Ye;v.Lexer=L;v.lexer=L.lex;v.Tokenizer=Se;v.Hooks=ce;v.parse=v;var Qi=v.options,Yi=v.setOptions,Ji=v.walkTokens,Vi=v.parseInline;var Ki=N.parse,Xi=L.lex;var Me=class n{render(e){let t=new ie,i=t.table;return t.table=function(a){return'<div class="article-table" tabindex="0" role="region" aria-label="Article data table">'+i.call(this,a)+"</div>"},new Je({async:!1,gfm:!0,renderer:t,walkTokens:a=>{if(a.type==="html")throw new Error("Article Markdown must not contain raw HTML.");if((a.type==="link"||a.type==="image")&&!this.isSafeHref(a.href))throw new Error(`Article Markdown contains an unsafe link: ${a.href}`)}}).parse(e)}isSafeHref(e){if(e.startsWith("/")&&!e.startsWith("//")||e.startsWith("#"))return!0;try{return new URL(e).protocol==="https:"}catch{return!1}}static \u0275fac=function(t){return new(t||n)};static \u0275prov=F({token:n,factory:n.\u0275fac,providedIn:"root"})};var oi=[{attribute:"name",value:"description"},{attribute:"property",value:"og:title"},{attribute:"property",value:"og:description"},{attribute:"property",value:"og:type"},{attribute:"name",value:"twitter:card"},{attribute:"name",value:"twitter:title"},{attribute:"name",value:"twitter:description"},{attribute:"property",value:"article:published_time"},{attribute:"property",value:"article:modified_time"}],ae=class n{articleSchemaSelector='script[data-schema="article"]';document=C(me);meta=C(lt);title=C(ct);applyIndex(){return this.applyPage("Engineering articles \xB7 MetaEngine","Evidence-backed notes on code generation, API design, testing, and agent workflows.","website")}applyArticle(e){let t=`${e.searchTitle} \xB7 MetaEngine`,i=this.applyPage(t,e.searchDescription,"article");this.writeTag({attribute:"property",value:"article:modified_time"},e.modifiedOn),e.publishedOn&&this.writeTag({attribute:"property",value:"article:published_time"},e.publishedOn);let r=this.document.createElement("script");return r.type="application/ld+json",r.setAttribute("data-schema","article"),r.text=JSON.stringify(W(S({"@context":"https://schema.org","@type":"TechArticle",headline:e.title,description:e.searchDescription,dateModified:e.modifiedOn},e.publishedOn?{datePublished:e.publishedOn}:{}),{creativeWorkStatus:e.publishedOn?"Published":"Draft",mainEntityOfPage:`https://www.metaengine.eu/articles/${e.slug}`,url:`https://www.metaengine.eu/articles/${e.slug}`,inLanguage:"en",image:"https://www.metaengine.eu/og-image.png",author:{"@type":"Person",name:"Jos\xE9 A. Salda\xF1a P\xE9rez"},isAccessibleForFree:!0})),this.document.head.appendChild(r),i}clearArticleSchema(){this.document.querySelector(this.articleSchemaSelector)?.remove()}applyPage(e,t,i){let r=this.title.getTitle(),a=oi.map(s=>W(S({},s),{content:this.meta.getTag(this.selector(s))?.content}));return this.clearArticleSchema(),this.meta.removeTag('property="article:published_time"'),this.meta.removeTag('property="article:modified_time"'),this.title.setTitle(e),this.writeTag({attribute:"name",value:"description"},t),this.writeTag({attribute:"property",value:"og:title"},e),this.writeTag({attribute:"property",value:"og:description"},t),this.writeTag({attribute:"property",value:"og:type"},i),this.writeTag({attribute:"name",value:"twitter:card"},"summary_large_image"),this.writeTag({attribute:"name",value:"twitter:title"},e),this.writeTag({attribute:"name",value:"twitter:description"},t),()=>{this.clearArticleSchema(),this.title.setTitle(r);for(let s of a)s.content===void 0?this.meta.removeTag(this.selector(s)):this.writeTag(s,s.content)}}writeTag(e,t){this.meta.updateTag({[e.attribute]:e.value,content:t})}selector(e){return`${e.attribute}="${e.value}"`}static \u0275fac=function(t){return new(t||n)};static \u0275prov=F({token:n,factory:n.\u0275fac,providedIn:"root"})};function si(n,e){if(n&1&&(f(0,"span"),l(1,"Published "),f(2,"time"),l(3),y()()),n&2){let t=_();c(2),U("datetime",t.article.publishedOn),c(),b(t.article.publishedOn)}}function li(n,e){if(n&1&&(B(0,"app-article-interlude",10),f(1,"div",11),B(2,"article",12)(3,"app-article-evidence-rail",13),y()),n&2){let t=_();P("beats",t.article.readingMap)("exhibit",t.article.exhibit),c(2),P("innerHTML",t.body.lead,ge),c(),P("receipts",t.article.receipts)}}function ci(n,e){if(n&1&&(f(0,"div",5),B(1,"article",14)(2,"app-article-interlude",15)(3,"article",16)(4,"app-article-evidence-rail",13),y()),n&2){let t=_();c(),P("innerHTML",t.body.lead,ge),c(),P("beats",t.article.readingMap)("exhibit",t.article.exhibit),c(),P("innerHTML",t.body.rest,ge),c(),P("receipts",t.article.receipts)}}function pi(n,e){n&1&&(f(0,"p"),l(1),y()),n&2&&(c(),b(e))}function di(n,e){if(n&1&&(f(0,"div",7)(1,"span",17),l(2,"Repro"),y(),f(3,"pre")(4,"code"),l(5),y()(),I(6,pi,2,1,"p"),y()),n&2){let t,i=_();c(5),b(e),c(),R((t=i.article.repro==null?null:i.article.repro.note)?6:-1,t)}}function hi(n,e){if(n&1&&(f(0,"a",8),l(1),y()),n&2){let t=_();P("href",t.article.action.href,fe),c(),E(" ",t.article.action.label," \u2197 ")}}function ui(n,e){if(n&1&&(f(0,"a",9),l(1),y()),n&2){let t=_();P("routerLink",t.article.action.href),c(),E("",t.article.action.label," \u2192")}}var Te=class n{bodies=C(ee);split=C(te);catalog=C(be);markdown=C(Me);metadata=C(ae);route=C(pt);article=this.catalog.require(this.readSlug());body=this.renderBody();reproScript=this.article.repro?.commands.join(`
69`);restoreMetadata=this.metadata.applyArticle(this.article);ngOnDestroy(){this.restoreMetadata()}renderBody(){let e=this.bodies.require(this.article.slug),t=this.article.interludeAfterSection;if(t===void 0)return{lead:this.markdown.render(e),rest:null};let i=this.split.split(e,t);return{lead:this.markdown.render(i.lead),rest:this.markdown.render(i.rest)}}
69readSlug(){let e=this.route.snapshot.paramMap.get("slug");if(e===null)throw new Error("The article route requires a slug.");return e}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=$({type:n,selectors:[["app-article-detail"]],decls:26,vars:10,consts:[[1,"article-page"],[1,"article-header"],["routerLink","/articles",1,"back-link"],[1,"dek"],[1,"meta"],[1,"article-layout","article-layout--split"],[1,"article-end"],[1,"repro"],["target","_blank","rel","noopener",1,"action",3,"href"],[1,"action",3,"routerLink"],[3,"beats","exhibit"],[1,"article-layout"],[1,"article-copy",3,"innerHTML"],[3,"receipts"],[1,"article-copy","article-copy--lead",3,"innerHTML"],[1,"article-interlude",3,"beats","exhibit"],[1,"article-copy","article-copy--rest",3,"innerHTML"],[1,"end-label"]],template:function(t,i){if(t&1&&(f(0,"div",0)(1,"header",1)(2,"a",2),l(3,"\u2190 Engineering articles"),y(),f(4,"h1"),l(5),y(),f(6,"p",3),l(7),y(),f(8,"div",4)(9,"span"),l(10),y(),f(11,"span"),l(12),y(),f(13,"span"),l(14,"By Jos\xE9 A. Salda\xF1a P\xE9rez"),y(),I(15,si,4,2,"span"),f(16,"span"),l(17,"Updated "),f(18,"time"),l(19),y()()()(),I(20,li,4,4)(21,ci,5,5,"div",5),f(22,"footer",6),I(23,di,7,2,"div",7),I(24,hi,2,2,"a",8)(25,ui,2,2,"a",9),y()()),t&2){let r;c(5),b(i.article.title),c(2),b(i.article.dek),c(3),b(i.article.topic),c(2),b(i.article.readingTime),c(3),R(i.article.publishedOn?15:-1),c(3),U("datetime",i.article.modifiedOn),c(),b(i.article.modifiedOn),c(),R(i.body.rest===null?20:21),c(3),R((r=i.reproScript)?23:-1,r),c(),R(i.article.action.external?24:25)}},dependencies:[ye,Ce,xe],styles:[`.article-page{max-width:1080px;margin:0 auto;padding:0 32px 96px}.article-page .article-header{max-width:780px;padding:72px 0 18px}.article-page .back-link{width:fit-content;min-height:44px;display:inline-flex;align-items:center;margin-bottom:40px;color:var(--ink-3);font-family:var(--font-mono);font-size:10.5px;letter-spacing:.04em;text-decoration:none}.article-page .back-link:hover{color:var(--ink-0)}.article-page .article-header h1{max-width:760px;overflow-wrap:anywhere;margin:20px 0 18px;color:var(--ink-0);font-family:var(--font-display);font-size:clamp(50px,7vw,78px);font-weight:400;letter-spacing:-.045em;line-height:1}.article-page .dek{max-width:720px;margin:0;color:var(--ink-2);font-family:var(--font-display);font-size:20px;line-height:1.5}.article-page .meta{display:flex;flex-wrap:wrap;gap:8px 24px;margin-top:28px;color:var(--ink-3);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.04em;text-transform:uppercase}.article-page .article-layout{display:grid;grid-template-columns:minmax(0,700px) 280px;gap:64px;align-items:start;padding-top:52px}.article-page .article-layout--split{row-gap:0}.article-page .article-layout--split .article-copy--lead{grid-column:1;grid-row:1}.article-page .article-layout--split app-article-evidence-rail{grid-column:2;grid-row:1}.article-page .article-layout--split .article-interlude{grid-column:1/-1;grid-row:2;margin-bottom:58px}.article-page .article-layout--split .article-copy--rest{grid-column:1;grid-row:3}.article-page .article-copy{min-width:0;color:var(--ink-1);font-size:15px;line-height:1.82}.article-page .article-copy h2{margin:58px 0 18px;padding-top:18px;border-top:1px solid var(--line-1);color:var(--ink-0);font-family:var(--font-display);font-size:34px;font-weight:400;letter-spacing:-.025em;line-height:1.16}.article-page .article-copy h2:first-child{margin-top:0;border-top-color:var(--accent-line)}.article-page .article-copy--rest h2:first-child{border-top-color:var(--line-1)}.article-page .article-copy p{margin:0 0 22px}.article-page .article-copy h2+p{color:var(--ink-1);font-size:16.5px;line-height:1.75}.article-page .article-copy ul,.article-page .article-copy ol{margin:0 0 28px;padding-left:22px}.article-page .article-copy li{margin-bottom:10px;padding-left:5px}.article-page .article-copy li::marker{color:var(--accent)}.article-page .article-copy blockquote{margin:34px 0;padding:20px 24px;border-left:2px solid var(--accent);background:var(--accent-dim);color:var(--ink-1)}.article-page .article-copy blockquote p{margin:0}.article-page .article-copy code{padding:1px 5px;overflow-wrap:anywhere;border:1px solid var(--code-line);border-radius:var(--r-1);background:var(--code-bg);color:var(--ink-0);font-family:var(--font-mono);font-size:.86em}.article-page .article-copy pre{max-width:100%;margin:30px 0;padding:22px;overflow:auto;border:1px solid var(--code-line);border-radius:var(--r-3);background:var(--terminal-bg);color:var(--terminal-ink);box-shadow:var(--shadow-1)}.article-page .article-copy pre code{padding:0;border:0;background:transparent;color:inherit;line-height:1.65}.article-page .article-copy a{color:var(--ink-0);text-decoration-color:var(--accent-line);text-underline-offset:3px}.article-page .article-table{max-width:100%;margin:30px 0;overflow-x:auto}.article-page .article-table:focus-visible{outline:2px solid var(--accent);outline-offset:3px}.article-page .article-copy table{width:100%;margin:0;border-collapse:collapse;font-size:12.5px}.article-page .article-copy th,.article-page .article-copy td{padding:12px 10px;border-bottom:1px solid var(--line-1);text-align:left;vertical-align:top}.article-page .article-copy th{color:var(--ink-3);font-family:var(--font-mono);font-size:9px;font-weight:500;letter-spacing:.05em;text-transform:uppercase}.article-page .article-copy tbody tr:hover{background:var(--accent-dim)}.article-page .article-end{display:flex;align-items:flex-end;justify-content:space-between;gap:32px;margin:72px 0 0;padding:32px 0;border-top:1px solid var(--line-2);border-bottom:1px solid var(--line-2)}.article-page .repro{min-width:0;flex:1 1 auto}.article-page .end-label{color:var(--accent);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.08em;text-transform:uppercase}.article-page .repro pre{max-width:100%;margin:12px 0 0;padding:16px 18px;overflow:auto;border:1px solid var(--code-line);border-radius:var(--r-3);background:var(--terminal-bg);color:var(--terminal-ink);font-family:var(--font-mono);font-size:12px;line-height:1.65}.article-page .repro pre code{padding:0;border:0;background:transparent;color:inherit}.article-page .article-end p{margin:8px 0 0;color:var(--ink-2);font-size:13px}.article-page .action{min-height:44px;max-width:100%;display:inline-flex;align-items:center;margin-left:auto;padding:8px 16px;border:1px solid var(--line-2);border-radius:var(--r-2);color:var(--ink-0);font-family:var(--font-mono);font-size:10.5px;text-decoration:none;white-space:normal;overflow-wrap:anywhere}.article-page .action:hover{border-color:var(--accent-line);background:var(--accent-dim)}@media (max-width: 940px){.article-page .article-layout{grid-template-columns:1fr;gap:48px}.article-page .article-layout--split .article-copy--lead,.article-page .article-layout--split .article-copy--rest,.article-page .article-layout--split .article-interlude,.article-page .article-layout--split app-article-evidence-rail{grid-column:1;grid-row:auto}.article-page .article-layout--split .article-interlude{margin-bottom:0}}@media (max-width: 620px){.article-page{padding:0 20px 72px}.article-page .article-header{padding:52px 0 14px}.article-page .article-header h1{font-size:48px}.article-page .dek{font-size:18px}.article-page .article-layout{padding-top:40px}.article-page .article-copy{font-size:14px;line-height:1.75}.article-page .article-copy h2{font-size:29px}.article-page .article-end{align-items:stretch;flex-direction:column}.article-page .action{margin-left:0;align-self:flex-start}}@media (prefers-reduced-motion: reduce){.article-page *,.article-page *:before,.article-page *:after{scroll-behavior:auto!important;transition-duration:.01ms!important}}
70`],encapsulation:2})};var Rt="## The type under analysis\n\nThe reference console app ships this pair. Two parameters are forwarded to the base constructor; one of them is also assigned locally.\n\n```csharp\npublic class BaseEntity\n{\n    public Guid Id { get; }\n    public string Name { get; }\n\n    protected BaseEntity(Guid id, string name)\n    {\n        Id = id;\n        Name = name;\n    }\n}\n\npublic class User : BaseEntity\n{\n    public string Email { get; }\n    public string Username { get; }\n\n    public User(string email, Guid userId, string userName)\n        : base(userId, userName)\n    {\n        Email = email;\n        Username = userName;\n    }\n}\n```\n\nReflection does not tell you that `userName` reaches two public properties, including one declared on the base type, or that `userId` travels through `base(...)` into `BaseEntity.Id`.\n\nFor a code generator, those relationships matter. It needs to connect `email` to `Email`, preserve both uses of `userName`, and pass the inherited values through the base call. Matching names alone misses relationships such as `userId` \u2192 `Id`.\n\nRuntime constructor analysis supplies distinctive values, constructs the object once, and inspects its public state. When a property preserves a parameter's sentinel, that parameter is `Inferred`. The result gives a generator a parameter-to-property map without needing the original C# source. The sample targets data classes with straightforward assignments; it observes values, not every possible execution path.\n\n## How the probe runs\n\n1. Build a sentinel for every parameter before invoking anything. Strings, guids, numbers, enums, classes and interfaces each get an assignable distinctive value when the type's domain allows it.\n2. Invoke the selected constructor once with that complete argument vector. The analyzer does not fill unused slots with `null`, and it does not construct once per parameter.\n3. Read every public, non-indexed instance property. Exact matches use ordinal string equality, value equality for value types, and reference identity for class and interface sentinels. A string that contains the complete sentinel without remaining identical to it is the exceptional heuristic containment path.\n4. Probe the immediate base separately only when it exposes exactly one accessible constructor in total and that constructor has parameters. A shared property links a derived parameter to an ordered base parameter. A get-only auto-property rules out an ordinary overwrite by the derived constructor, so the sample reports an inferred base parameter. Writable properties retain a heuristic candidate. This correlation assumes the base constructor uses each parameter consistently across the two probes; neither verdict changes the original property mapping.\n\nThe interactive figure replays that single construction one parameter at a time. Playback only changes which exact landing points are highlighted.\n\n## Read the result in three layers\n\nEvery parameter receives a `ParameterInferenceOutcome`:\n\n| Outcome | Meaning |\n| --- | --- |\n| `Inferred` | One or more property mappings preserved the sentinel. |\n| `Unmatched` | The sentinel was supported and construction succeeded, but no readable property preserved it. |\n| `Ambiguous` | A unique conclusion is unsafe, as with Boolean or colliding finite-domain values. |\n| `Unsupported` | No s
70afe assignable, collision-resistant sentinel exists for that shape. |\n| `InstantiationFailed` | Binding, access, support, or constructor execution failed. |\n| `InspectionFailed` | Construction succeeded, but a public getter threw while the object was inspected. |\n\nAn `Inferred` parameter then exposes each property mapping's confidence and provenance. `ExactSentinel` means the observed property preserved the supplied sentinel exactly. `TransformedStringContainment` is a separate `Heuristic` result.\n\nDirect-base attribution is a third result. It asks which base-constructor parameter received a forwarded argument. `ReadOnlyBaseSentinel` marks an `Inferred` base parameter with `Exact` confidence: both probes matched the same get-only base property. Here `Exact` describes the observed match; the argument position is inferred under the assignment-based constructor assumption. `DirectBasePropertyCorrelation` marks an `Ambiguous` candidate with `Heuristic` confidence: the property overlaps, but the derived constructor could have written it. In both cases the property observation that led there remains exact.\n\n## What the console app prints\n\nThis is the `User` section of `dotnet run --project src/Demo.ConsoleAp
70p`. `DemoConsoleOutputTests.UserTranscriptExposesParameterPropertyAndDirectBaseOutcomes` locks the block.\n\n```text\nType: User\n\nConstructor Parameters:\n  - String email\n  - Guid userId\n  - String userName\n\nParameter Flow Analysis:\n\n  Parameter: email (String)\n    Parameter outcome: Inferred\n    Assigned to properties:\n      \u2192 User.Email (Confidence: Exact; Provenance: ExactSentinel)\n\n  Parameter: userId (Guid)\n    Parameter outcome: Inferred\n    Assigned to properties:\n      \u2192 BaseEntity.Id (Confidence: Exact; Provenance: ExactSentinel)\n    Direct-base outcome: Inferred\n      \u2192 Base parameter [0] id via BaseEntity.Id (Outcome: Inferred; Confidence: Exact; Provenance: ReadOnlyBaseSentinel)\n\n  Parameter: userName (String)\n    Parameter outcome: Inferred\n    Assigned to properties:\n      \u2192 BaseEntity.Name (Confidence: Exact; Provenance: ExactSentinel)\n      \u2192 User.Username (Confidence: Exact; Provenance: ExactSentinel)\n    Direct-base outcome: Inferred\n      \u2192 Base parameter [1] name via BaseEntity.Name (Outcome: Inferred; Confidence: Exact; Provenance: ReadOnlyBaseSentinel)\n\nProperties set in constructor:\n  - BaseEntity.Id\n  - BaseEntity.Name\n  - User.Email\n  - User.Username\n```\n\n[Open the reference implementation](https://github.com/meta-engine/constructor-analysis) and reproduce that block. Install the [.NET 10 SDK](https://dotnet.microsoft.com/download) first. There is no NuGet package; `src/ConstructorAnalysis` is the library in this repo, and `src/Demo.ConsoleAp
70p` is the playground the transcript comes from.\n\n```bash\ngit clone https://github.com/meta-engine/constructor-analysis\ncd constructor-analysis\ndotnet test constructor-analysis.sln --configuration Release\ndotnet run --project src/Demo.ConsoleApp --configuration Release\n```\n\nRead the property rows first, then the narrower base rows. `email` has no direct-base line because it never reached `BaseEntity`.\n\n## How direct-base candidates are decided\n\nRun the same one-vector probe on `BaseEntity`'s constructor. `userName` preserves its sentinel in `BaseEntity.Name` during the `User` construction; base parameter `name` preserves its own sentinel in that same reflected property during the base probe. That links `userName` to base parameter `[1] name`.\n\nA link alone is not proof. If `Name` had a setter, the `User` constructor could have called `base(userId, \"constant\")` and then written `Name = userName` itself, and the two probes would look identical. The analyzer therefore checks the property's shape through reflection. A get-only auto-property has no set accessor and a private `initonly` compiler-generated backing field, which verifiable code can write only inside a constructor of the declaring type. That rules out an ordinary derived write, so the sample labels the correlation `Inferred`, `Exact`, `ReadOnlyBaseSentinel`. It does not establish how the base constructor behaves for other inputs. A base constructor that conditionally chooses between parameters can invalidate the inferred position even when the property is get-only; the analyzer does not inspect the constructor body to rule that out.\n\nA property with a setter, an `init` accessor, or a getter over a protected field keeps the heuristic verdict. `init` accessors are callable from derived constructors, and a protected field can be written from anywhere in the hierarchy, so those shapes stay `Ambiguous`, `Heuristic`, `DirectBasePropertyCorrelation`, and the console app prints them with a `?` marker instead of an arrow.\n\nThe demo's third example makes the separation visible with misleading names: `Employee(..., Role userRole, ...) : base(..., userRole)`, with `AccessLevel = userRole` locally. The app reports both `Employee.AccessLevel` and `Person.Role` as exact property mappings, then reports base parameter `[2] role` as an inferred base parameter because `Person.Role` is get-only.\n\n## Where the technique stops\n\n- **Transformed values that drop the sentinel.** Case changes and concatenation that retain the complete string can still match heuristically. A transform that removes, splits, reorders, truncates, encodes, or hashes the sentinel remains unmatched.\n- **Finite domains.** Boolean flow needs a contrast probe to distinguish assignment from a constant. The reference marks booleans and exhausted narrow domains ambiguous. Numeric and enum sentinels can also coincide with a constant in the class, so an exact value match alone does not prove an assignment caused it.\n- **Writable inherited state.** A base property with a setter, an `init` accessor, or a protected backing field could have been written by the derived constructor, so its base candidate stays heuristic. The read-only verdict assumes verifiable code; reflection can still write an `initonly` field.\n- **Constructors that reject the generated vector.** Failures are reported as `InstantiationFailed`. The reference implementation does not retry with a different sentinel.\n- **Shapes without a safe sentinel.** Custom structs and some abstract or delegate references are unsupported. `null` is never accepted as flow evidence.\n- **Observable public state only.** Public readable, non-indexed properties are inspected, including computed getters. A throwing getter is reported as `InspectionFailed`; private getters and fields are not inspected.\n- **Side effects run.** A constructor that opens a connection opens it. Keep the technique on DTO-shaped types.\n- **One constructor, one base level.** The analyzer selects the constructor with the most parameters and inspects `type.BaseType` once. Multiple accessible base constructors make direct-base analysis ambiguous. For `A : B : C`, flow into `C` is not traced.\n\n## Where it fits\n\nThe mapping is useful before rendering begins. A generator can distinguish local assignments from inherited values, retain a parameter that feeds more than one property, and emit names according to the target language's conventions. Templates can render those decisions once the relationships are known; observation supplies information that a constructor signature alone does not contain.\n\nThe reference repository isolates the observation technique so it is easy to inspect and adapt. A generator can combine these observations with explicit configuration, then pass the resulting relationships to its target-language renderer.\n\nChange the examples under `src/Demo.ConsoleAp
70p/Examples` and run the playground again. Start with the data classes you would actually want to generate.\n";var $t=`A fluent builder API is a vocabulary. If that vocabulary is the same on every builder, the editor will offer \`WithCheckedBag\` on a ticket that cannot take hold luggage. You can throw at runtime. You can also make the method not exist.
71
72The second option is a composition problem: name the capabilities a kind of ticket actually has, then build its public callback type from only those capabilities.
73
74## Name the capabilities
75
76Each capability is one small interface. The type parameter is the public fluent surface that claims it, so every method hands back that same surface and the chain keeps going.
77
78\`\`\`csharp
79public enum Bag { Small, Large }
80
81public interface ISeatCapability<out TSelf>
82{
83    TSelf WithSeat(string seat);
84}
85
86public interface ICabinLuggageCapability<out TSelf>
87{
88    TSelf WithCabinBag(Bag bag);
89}
90
91public interface ICheckedLuggageCapability<out TSelf>
92{
93    TSelf WithCheckedBag(Bag bag);
94}
95\`\`\`
96
97## A kind is an intersection
98
99An economy builder has a seat and cabin luggage. A business builder has those and checked luggage. The public interface for each kind is the intersection of the capabilities it claims.
100
101\`\`\`csharp
102public interface IEconomyBookingBuilder :
103    ISeatCapability<IEconomyBookingBuilder>,
104    ICabinLuggageCapability<IEconomyBookingBuilder>
105{
106}
107
108public interface IBusinessBookingBuilder :
109    ISeatCapability<IBusinessBookingBuilder>,
110    ICabinLuggageCapability<IBusinessBookingBuilder>,
111    ICheckedLuggageCapability<IBusinessBookingBuilder>
112{
113}
114\`\`\`
115
116The concrete builders are internal. \`BookingDefinition\` creates one with a mutable booking draft, exposes only the appropriate public interface inside the callback, then materializes the draft when that callback returns. There is intentionally no terminal \`.Build()\` call: the enclosing definition owns that boundary.
117
118## Prove it
119
120Valid \u2014 both callbacks compile and the definition materializes two bookings:
121
122\`\`\`csharp
123var definition = new BookingDefinition()
124    .Economy("MAD-LHR", builder => builder
125        .WithSeat("12A")
126        .WithCabinBag(Bag.Small))
127    .Business("MAD-JFK", builder => builder
128        .WithSeat("2A")
129        .WithCabinBag(Bag.Small)
130        .WithCheckedBag(Bag.Large));
131\`\`\`
132
133\`\`\`text
134$ ./scripts/verify.sh
135Build succeeded.
136    0 Warning(s)
137    0 Error(s)
138Economy MAD-LHR | seat 12A | cabin bags 1 | checked bags 0
139Business MAD-JFK | seat 2A | cabin bags 1 | checked bags 1
140\`\`\`
141
142Invalid \u2014 checked luggage is not in the economy callback's vocabulary:
143
144\`\`\`csharp
145definition.Economy("MAD-LHR", builder => builder
146    .WithSeat("12A")
147    .WithCabinBag(Bag.Small)
148    .WithCheckedBag(Bag.Large));
149\`\`\`
150
151\`\`\`text
152CompileContracts/InvalidEconomyBooking.cs(12,14): error CS1061:
153'IEconomyBookingBuilder' does not contain a definition for 'WithCheckedBag'
154\`\`\`
155
156[Open the compiler-verified sample](https://github.com/meta-engine/capability-composed-fluent-api). Install the [.NET 10 SDK](https://dotnet.microsoft.com/download) first \u2014 the sample is a console app. The same CI command builds and runs the valid path, then enables the excluded negative fixture and requires that specific \`CS1061\` failure.
157
158Nothing was disabled and nothing throws. The member is absent from the callback's static type, so the editor never offers it and the compiler refuses to bind it. The exception class for \u201Cchecked bag on economy\u201D was never written, because there is no such operation to implement.
159
160## Why this beats a flag
161
162The usual alternatives keep one type and move the rule somewhere the developer cannot see it while typing:
163
164- **A flags enum or a \`Kind\` property.** Every method exists on every ticket; \`WithCheckedBag\` checks the flag and throws. The editor still offers it.
165- **A base builder with everything.** Same problem, and every new kind inherits methods it has to reject.
166- **Validation in the constructor of the result.** Correct rule, wrong audience. The first reader of \u201Cyou can't do that\u201D is a stack trace in someone else's CI run.
167
168Composition inverts it. A capability is an interface; a kind is the intersection of the capabilities it claims; the compiler does the rule-checking and the editor becomes a filtered view of the valid vocabulary. Adding a kind means listing its public capabilities and implementing that contract internally. Adding a capability means claiming it only on the kinds that have it. Renaming a capability method becomes a compile-visible change for every builder that c
168omposes it. Tests stop asserting \u201Cthis method throws for this kind\u201D \u2014 the assertion is that the method is not there.
169
170This is capability composition, not a staged typestate builder: calls do not transition the object through successive state types. Each builder's fixed public type selects the vocabulary available inside its callback. It is related to the broader idea of making illegal states unrepresentable, but it makes one narrower promise: illegal *calls* are absent.
171
172## What stays at runtime
173
174The compiler only reviews what the type can express.
175
176- **Values.** \`WithSeat("12A")\` type-checks whether or not seat 12A exists on the aircraft.
177- **Cross-object rules.** A bag over the weight limit for this fare is a fact about two objects, not a member.
178- **Name clashes and references.** Two bookings for the same passenger, a seat already taken \u2014 resolved when the objects meet, not when the chain is typed.
179- **The wire boundary.** Anything that arrives as JSON has no compiler in front of it. The same rules run again there, as explicit errors.
180
181The pattern moves unsupported member calls into the compiler\u2019s domain. Argument values and relationships between objects still need runtime validation.
182
183## Apply it in your own domain
184
185Look for operations that belong to some roles but not others: publishing on an editable document, adding a join to a relational query, or choosing delivery options for a physical order. Give each operation a small capability interface, then compose the public roles from the capabilities they support.
186
187The important boundary is the callback type a caller receives. Keep the implementation behind that boundary, preserve the public role through each chained method, and let the enclosing object own materialization. The result is an API whose vocabulary teaches its constraints while you type.
188
189Start with the flight-booking sample: add a capability, choose which booking role exposes it, and add a compile contract for the role that must not.
190`;var Bt=`Option combinations grow quickly as a generator gains targets and features. Sampling lets each build compile a changing selection while recording enough information to replay it. That is a contract with three parts: an identity for the run, a gate the output has to pass, and a report that lets someone else replay a failure.
191
192## Identity
193
194A generation run publishes its identity next to the generated output:
195
196\`\`\`json
197{
198  "schema": "nav-relationships",
199  "language": "php-sql",
200  "seed": -447741108,
201  "options": {
202    "WithNavigationProperties": true,
203    "WithValidationAnnotations": true,
204    "InitializeProperties": true,
205    "UseStrictTypes": false
206  }
207}
208\`\`\`
209
210Schema, language, seed, applied options, plus the build number that names the engine version: that report is the identity. Replaying it means applying the recorded options to the same schema with the same engine build and running the same gate.
211
212### Build a sampler for your own generator
213
214A small .NET example is enough to show the mechanism:
215
216\`\`\`csharp
217var seed = Random.Shared.Next();
218var random = new Random(seed);
219var options = new
220{
221    IncludeRelations = random.Next(2) == 1,
222    UseStrictTypes = random.Next(2) == 1
223};
224\`\`\`
225
226Record \`seed\` and the resulting \`options\` before generation. Reusing the seed with the same runtime, option code and call order reproduces the sample. Applying the recorded options directly is more durable when the sampler evolves.
227
228If a sampler derives its seed from names or build identifiers, its hash function matters. [.NET initializes \`HashCode\` with a process-specific seed](https://learn.microsoft.com/en-us/dotnet/api/system.hashcode?view=net-10.0), so recomputing that hash in another process will not recover the original sample. Store the chosen seed and options instead of relying on the inputs to a hash.
229
230## Gate
231
232Generate, compile, probe. The [pipeline review snapshot](/article-receipts/generator-option-reliability/pipeline-snapshot.json) records the commands and reporting contract reviewed for this article. It describes MetaEngine\u2019s CI; the public incident pack below reproduces the PHP compiler rule.
233
2341. **Generate.** One xUnit test per target generates every reference schema with its sampled options, in memory, and zips the output as a build artifact. Zero files is a failure, not an empty success.
2352. **Compile.** A separate job per target unpacks the archive and runs the language's own compiler or analyzer over everything at once.
2363. **Probe.** A failure the sampler finds becomes a probe test: a fixed schema, a fixed option combination, an assertion on the emitted shape. Probes run on every build regardless of what the sampler rolls, so a fixed corner stays fixed.
237
238| Target | Compile gate |
239| --- | --- |
240| TypeScript (Angular, React, fetch) | \`tsc --noEmit\`; React additionally \`vite build\` |
241| C# | \`dotnet build -c Release\` |
242| Java | \`mvn compile\` |
243| Kotlin | \`gradlew compileKotlin\` |
244| Go | \`go build ./...\` and \`go vet ./...\` |
245| Rust | \`cargo check --workspace\` |
246| Swift | \`swiftc -typecheck\` |
247| Python | \`ast.parse\` on every file, then \`mypy\` |
248| PHP | \`php -l\` on every file |
249| Dart | \`dart analyze --fatal-infos\` |
250| Scala, Groovy | \`scalac\`, \`groovyc\` smoke compile |
251
252## One failure, end to end
253
254[Open the sanitized incident pack](/article-receipts/generator-option-reliability/index.html) for the recorded report, relationship schema and a one-command PHP lint probe. It replays the compiler boundary \u2014 failing \`?mixed\`, fixed \`mixed\` \u2014 rather than regenerating the model.
255
256- **Engine.** CI build 6021, May 2026. Target: PHP models from SQL DDL.
257- **Schema.** \`nav-relationships.sql\` \u2014 tables with one-to-many and many-to-many relations, self-references, and two foreign keys to the same parent table.
258- **Identity.** Seed \`-447741108\`; options \`WithNavigationProperties: true\`, \`WithValidationAnnotations: true\`, \`InitializeProperties: true\`, \`UseStrictTypes: false\`.
259- **Gate.** \`php -l\` on every generated class.
260- **Failure.** \`Type mixed cannot be marked as nullable since mixed already includes null\`. A navigation property whose target type had no PHP mapping fell back to \`mixed\`, and the renderer prepended \`?\` to every nullable property without exception. \`?mixed\` is a parse error in PHP 8, whose [type documentation](https://www.php.net/manual/en/language.types.mixed.php) includes \`null\` in \`mixed\`.
261- **Why sampling found it.** The combination needs both toggles to land the wrong way \u2014 navigation properties on, strict types off \u2014 which happens on about a quarter of rolls. No hand-written fixture had combined them.
262- **Fix.** Nullable rendering is centralised so \`mixed\` is never prefixed; a probe test pins the emitted shape for exactly that combination; the combination went back into the sampler.
263
264## Which question each technique answers
265
266These are different questions. Calling one by another's name is how a testing story overstates itself.
267
268| Technique | Question it answers | Question it does not answer |
269| --- | --- | --- |
270| Option sampling | Did we exercise this schema \xD7 options pair? | Did we cover the space? |
271| Property check | Does this invariant hold for the sample? | Are two emitters semantically equivalent? |
272| Compilation gate | Does the artifact compile? | Does it behave? |
273| Runtime probe | Does this scenario run? | Is it exhaustively correct? |
274| Differential comparison | Did two runs or engines differ? | Which one is right? |
275
276## What the contract does not give you
277
278- Sampling is not coverage. A combination that fails on one roll in four is found quickly; one that needs five toggles aligned may go unrolled for a long time. Coverage accrues across builds and is never complete.
279- A compile gate says nothing about behavior. \`php -l\` accepts a class that parses and does the wrong thing at runtime.
280- The identity pins options, schema and engine build. It does not pin the toolchain on the build agent; a compiler upgrade can turn a passing artifact red with no change in the generator.
281`;var zt=`A code generator can return many files from one tool call. That reduces the number of tool operations an agent has to request. Whether it also reduces model round trips depends on how the agent batches those operations.
282
283I built a small harness to measure that distinction, and a second one: how much model output a generator needs when its input arrives as inline JSON or as a file produced by a short transformer script. The token totals below come from recorded \`claude -p\` result events. Message and tool counts are independently reconstructed from the original streams.
284
285## The setup
286
287| | |
288| --- | --- |
289| Scenario | Generate a 71-entity domain model (aggregates, value objects, enums, services) as TypeScript from a JSON spec |
290| Model / runtime | Claude Opus 4.7 through \`claude -p\`; Sonnet 4.6 for the cross-model rows |
291| Server | \`@metaengine/mcp-server\` through \`npx\`, registered with \`claude mcp add\` |
292| Judge | \`tsc --strict\`, plus a structural check for expected entities, kinds and selected members; no runtime behavior check |
293| Prepared generation | A separate warm-up session writes a brief, which is included in the generation session's prompt |
294| Date | 2026-04-26, one machine |
295| n | 5 runs per cell; tables show the mean and [min\u2013max], including failed judgments |
296
297The baseline prompt requires the agent to use \`Write\` for each file. It still allows multiple tool calls in one assistant response. The assisted prompts prescribe one generation call, plus the reads and verification needed around it. These are comparisons of specified workflows, not an unrestricted competition between agents.
298
299**A message is not a tool call.** Here, \u201Cassistant messages\u201D counts distinct assistant message IDs in the stream. One can contain many tool requests. The recorded CLI \`num_turns\` happens to equal tool calls plus one in these runs; it does not measure model round trips. The message count describes visible responses, without claiming to count provider retries hidden from the trace.
300
301## Manual vs assisted
302
303TypeScript, Opus 4.7, prepared generation, two runs in parallel.
304
305[Open the corrected measurements](https://github.com/meta-engine/mcp-server/blob/main/benchmark/results/corrected-results.json) beside the table. \`ts-multilang/summary.md\` reports this experiment; each session also has a hash identifying its original stream.
306
307| Arm | Assistant messages | Output tokens | Prompt-cache reads | Pass |
308| --- | --- | --- | --- | --- |
309| Manual \u2014 the agent writes each file with \`Write\` | 76.4 [73\u201382] | 21,007 [19,621\u201322,922] | 4.80M [4.43M\u20135.37M] | 5/5 |
310| Assisted \u2014 one generation call, spec inline | 5.0 [5\u20135] | 18,872 [16,940\u201320,817] | 231k [227k\u2013237k] | 4/5 |
311| Warm-up session, counted separately | 8.2 [5\u201310] | 12,436 [11,274\u201314,776] | 317k [177k\u2013395k] | \u2014 |
312
313In this particular cell, Opus requested each tool operation in a separate response. The manual arm therefore carried a growing conversation through many more model responses. The assisted arm needed fewer responses and recorded fewer cache-read tokens. For a first use, add the warm-up: the assisted workflow emitted 31,308 output tokens on average, compared with the baseline's 21,007.
314
315Java's baseline also used one operation per response: 76.6 [73\u201382] assistant messages against 5.0 [5\u20135]. Python batched some writes: 22.6 [6\u201374] messages against 6.6 [5\u201312]. A file-per-call tool does not force a model response per file.
316
317## Inline spec vs transformer + file
318
319Same TypeScript task and Opus model, with five runs in parallel in each of three separate batches. These cells have different concurrency and warm-up briefs from the first table, so their absolute numbers should not be interchanged.
320
321\u201CTool-input characters\u201D counts a consistent JSON serialization of all tool arguments in the session. It is a content-size measure, not a tokenizer result or a count of network bytes.
322
323| Arm | Assistant messages | Output tokens | Tool-input characters | Session duration | Pass |
324| --- | --- | --- | --- | --- | --- |
325| Inline JSON in the generation call | 5.0 [5\u20135] | 17,913 [16,154\u201321,021] | 34,689 | 146s [130\u2013179] | 5/5 |
326| Heredoc writes the JSON file | 6.4 [6\u20137] | 20,217 [19,234\u201322,377] | 45,587 | 175s [150\u2013200] | 4/5 |
327| Transformer writes the JSON file | 6.8 [6\u201310] | 4,691 [3,247\u20135,742] | 5,337 | 70s [54\u201394] | 4/5 |
328
329The transformer arm emitted 74% fewer output tokens than inline and took about half the session duration in this sample. Moving literal JSON into a Bash heredoc did not produce that saving: the model still had to emit the JSON as tool input. A short program can instead read the source spec and produce the larger generator spec outside the model's output channel.
330
331This is a plausible explanation supported by the smaller recorded tool inputs, not a complete causal decomposition. The prompts and generated programs differ, and the traces do not supply an exact split of output tokens into prose, tool arguments and thinking. Assistant-event usage cannot be treated as visible-text tokens.
332
333The technique needs a spec that can be derived from a smaller source the agent already has. Hand-authoring every detail leaves less to transform. Tool arguments count toward generated output in Claude's API usage model; subscription billing is a separate matter. [Claude tool-use pricing](https://platform.claude.com/docs/en/agents-and-tools/tool-use/overview).
334
335## Does it survive a model swap?
336
337TypeScript again, Sonnet 4.6, prepared generation, serial runs. The manual row comes from the inline comparison batch.
338
339| Arm | Assistant messages | Output tokens | Pass |
340| --- | --- | --- | --- |
341| Manual (\`Write\` per file) | 3.2 [3\u20134] | 16,280 [15,258\u201318,568] | 5/5 |
342| Assisted, inline | 5.0 [5\u20135] | 21,299 [17,474\u201331,142] | 3/5 |
343| Assisted, transformer + file | 7.0 [7\u20137] | 5,275 [4,075\u20136,530] | 5/5 |
344
345Sonnet usually put all 71 \`Write\` requests into one assistant message. In the first baseline run, three messages cover reading the source, requesting the writes, and saying \`DONE\`. There are still 72 tool calls, but there is no 73-response model loop.
346
347Across the two Sonnet batches, nine of ten baselines used only three or four assistant messages; the remaining run used 73. Their lower cache reads coincide with batched writes. These traces do not establish a cache-policy anomaly. The second batch's manual baseline is reported separately in the repository: 17.0 [3\u201373] messages and 16,936 [15,803\u201318,298] output tokens.
348
349The transformer workflow still emitted fewer output tokens in both models. A reduction in model responses did not survive the swap: Sonnet's inline-batch baseline used fewer responses than either assisted arm. Tool operation count, response count and output volume answer different questions.
350
351## What this suggests for tool design
352
353- **Support multiple artifacts per call.** It reduces required tool operations, and can shorten a workflow that otherwise uses sequential responses.
354- **Accept file input when a compact transformation can produce it.** \`load_spec_from_file\` gives the agent a way to run that transformation outside its output channel.
355- **Measure the trace as well as the summary.** Count responses and tool calls separately. Keep pass rates beside resource measurements.
356
357## What this setup does not show
358
359Five runs per cell expose useful behavior, but give little precision about reliability or performance across workloads. The observed ranges are descriptive, not confidence intervals. A 68-entity modular-monolith variant adds one other shape;
359 200- or 1,000-entity specs are unmeasured. The judge checks compilation and selected structure, not equivalent runtime behavior. Failed judgments remain in the means, and the experiment does not measure the cost of repairing them.
360
361Concurrency, prompts, warm-up briefs and provider load all affect comparisons. The prepared brief is a real input, not a simulation of a model trained on the API. New runs will use a changed service and tool environment; recomputing these historical measurements is distinct from repeating the experiment today.
362
363## Research note
364
365A smaller initial tool description with detailed material loaded when needed may reduce onboarding context. That is a possible follow-up experiment. The runs above do not compare disclosure strategies, and none of their results depends on this idea.
366`;var Dt={"runtime-constructor-analysis":Rt,"capability-composed-fluent-api":$t,"generator-option-reliability":Bt,"generating-for-the-agent-loop":zt};var Lt=[{provide:_e,useValue:Dt}];var Nt=n=>["/articles",n],mi=(n,e)=>e.slug;function gi(n,e){if(n&1&&(f(0,"article",8)(1,"div",9),l(2),y(),f(3,"div",10)(4,"div",11),l(5),y(),f(6,"h2")(7,"a",12),l(8),y()(),f(9,"p"),l(10),y(),f(11,"div",13)(12,"span"),l(13),y(),f(14,"span"),l(15),y()()(),f(16,"a",14),l(17," Read "),f(18,"span",15),l(19,"\u2192"),y()()()),n&2){let t=e.$implicit,i=e.$index;c(2),E("0",i+1),c(3),b(t.topic),c(2),P("routerLink",ze(8,Nt,t.slug)),c(),b(t.title),c(2),b(t.dek),c(3),b(t.readingTime),c(2),E("Updated ",t.modifiedOn),c(),P("routerLink",ze(10,Nt,t.slug))}}var Ae=class n{catalog=C(be);metadata=C(ae);articles=this.catalog.all();restoreMetadata=this.metadata.applyIndex();ngOnDestroy(){this.restoreMetadata()}static \u0275fac=function(t){return new(t||n)};static \u0275cmp=$({type:n,selectors:[["app-articles-index"]],decls:23,vars:0,consts:[[1,"index-page"],[1,"hero"],["aria-hidden","true",1,"hero-grid"],[1,"hero-copy"],[1,"hero-kicker"],[1,"receipt-note"],[1,"note-label"],["aria-label","Articles",1,"articles"],[1,"article-row"],["aria-hidden","true",1,"article-number"],[1,"article-copy"],[1,"article-topic"],[3,"routerLink"],[1,"article-meta"],[1,"read-link",3,"routerLink"],["aria-hidden","true"]],template:function(t,i){t&1&&(f(0,"div",0)(1,"header",1),B(2,"div",2),f(3,"div",3)(4,"span",4),l(5,"Engineering articles"),y(),f(6,"h1"),l(7,"Engineering notes,"),B(8,"br"),f(9,"em"),l(10,"with the receipts attached."),y()(),f(11,"p"),l(12," Four notes from building a code generator: a constructor-flow technique you can run, a fluent-API pattern you can type-check, a reproducibility contract for sampled generator options, and a measured look at what generation costs inside an agent loop. "),y()(),f(13,"div",5)(14,"span",6),l(15,"What a receipt is"),y(),f(16,"strong"),l(17,"Run it, don't take my word."),y(),f(18,"span"),l(19,"Where a note has a public artifact, it ends with the repository, command, or compile pair that produces what the page shows."),y()()(),f(20,"section",7),O(21,gi,20,12,"article",8,mi),y()()),t&2&&(c(21),M(i.articles))},dependencies:[xe],styles:['.index-page[_ngcontent-%COMP%]{max-width:1180px;margin:0 auto;padding:0 32px 96px}.hero[_ngcontent-%COMP%]{position:relative;display:grid;grid-template-columns:minmax(0,1fr) 280px;gap:72px;align-items:end;min-height:470px;padding:90px 0 72px;border-bottom:1px solid var(--line-2);overflow:hidden}.hero-grid[_ngcontent-%COMP%]{position:absolute;inset:0;z-index:-1;background-image:linear-gradient(var(--grid-line) 1px,transparent 1px),linear-gradient(90deg,var(--grid-line) 1px,transparent 1px);background-size:48px 48px;-webkit-mask-image:radial-gradient(circle at 26% 45%,black,transparent 70%);mask-image:radial-gradient(circle at 26% 45%,black,transparent 70%)}h1[_ngcontent-%COMP%]{margin:24px 0 22px;color:var(--ink-0);font-family:var(--font-display);font-size:clamp(54px,7vw,84px);font-weight:400;letter-spacing:-.045em;line-height:.98}h1[_ngcontent-%COMP%]   em[_ngcontent-%COMP%]{color:var(--accent);font-variation-settings:"SOFT" 100}.hero-copy[_ngcontent-%COMP%] > p[_ngcontent-%COMP%]{max-width:650px;margin:0;color:var(--ink-2);font-size:15px;line-height:1.7}.hero-kicker[_ngcontent-%COMP%]{color:var(--accent);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase}.receipt-note[_ngcontent-%COMP%]{display:grid;gap:8px;padding:22px;border:1px solid var(--line-2);border-radius:var(--r-3);background:color-mix(in oklab,var(--bg-1) 72%,transparent)}.note-label[_ngcontent-%COMP%]{color:var(--ink-3);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.1em;text-transform:uppercase}.receipt-note[_ngcontent-%COMP%]   strong[_ngcontent-%COMP%]{color:var(--ink-0);font-family:var(--font-display);font-size:22px;font-weight:400;line-height:1.2}.receipt-note[_ngcontent-%COMP%]   span[_ngcontent-%COMP%]:last-child{color:var(--ink-2);font-size:12.5px;line-height:1.55}.articles[_ngcontent-%COMP%]{border-bottom:1px solid var(--line-2)}.article-row[_ngcontent-%COMP%]{display:grid;grid-template-columns:48px minmax(0,1fr) auto;gap:24px;align-items:center;padding:40px 0;border-bottom:1px solid var(--line-1)}.article-row[_ngcontent-%COMP%]:last-child{border-bottom:0}.article-number[_ngcontent-%COMP%]{align-self:start;color:var(--accent);font-family:var(--font-mono);font-size:10px;padding-top:4px}.article-topic[_ngcontent-%COMP%]{color:var(--ink-3);font-family:var(--font-mono);font-size:9.5px;letter-spacing:.08em;text-transform:uppercase}
366h2[_ngcontent-%COMP%]{margin:7px 0 10px;font-family:var(--font-display);font-size:clamp(25px,3vw,36px);font-weight:400;letter-spacing:-.025em}h2[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]{min-height:44px;display:inline-flex;align-items:center;color:var(--ink-0);text-decoration:none}h2[_ngcontent-%COMP%]   a[_ngcontent-%COMP%]:hover{color:var(--accent-lo)}.article-copy[_ngcontent-%COMP%] > p[_ngcontent-%COMP%]{max-width:720px;margin:0;color:var(--ink-2);font-size:13.5px;line-height:1.65}.article-meta[_ngcontent-%COMP%]{display:flex;flex-wrap:wrap;gap:8px 20px;margin-top:14px;color:var(--ink-3);font-family:var(--font-mono);font-size:9.5px}.read-link[_ngcontent-%COMP%]{min-width:44px;min-height:44px;display:inline-flex;align-items:center;justify-content:flex-end;color:var(--ink-0);font-family:var(--font-mono);font-size:10.5px;text-decoration-color:var(--accent-line);text-underline-offset:4px;white-space:nowrap}@media (max-width: 800px){.index-page[_ngcontent-%COMP%]{padding:0 20px 72px}.hero[_ngcontent-%COMP%]{grid-template-columns:1fr;gap:36px;min-height:auto;padding:72px 0 52px}.receipt-note[_ngcontent-%COMP%]{max-width:420px}.article-row[_ngcontent-%COMP%]{grid-template-columns:32px minmax(0,1fr)}.read-link[_ngcontent-%COMP%]{grid-column:2}}@media (max-width: 520px){h1[_ngcontent-%COMP%]{font-size:48px}.article-row[_ngcontent-%COMP%]{grid-template-columns:1fr;gap:14px}.article-number[_ngcontent-%COMP%], .read-link[_ngcontent-%COMP%]{grid-column:1}}']})};var Xr=[{path:"",providers:[...Lt,ee,te],children:[{path:"",component:Ae},{path:":slug",component:Te,canActivate:[dt]}]}];export{Xr as articleRoutes};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.