[{"data":1,"prerenderedAt":1971},["ShallowReactive",2],{"navigation":3,"\u002Fguides\u002Fsave-hooks-and-defaults":170,"\u002Fguides\u002Fsave-hooks-and-defaults-surround":1966},[4,25,104,150,160],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":6},"Getting Started",false,"\u002Fgetting-started","1.getting-started",[10,15,20],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":24},"Quick start","\u002Fgetting-started\u002Fquick-start","1.getting-started\u002F3.quick-start","i-lucide-rocket",{"title":26,"icon":6,"path":27,"stem":28,"children":29,"page":6},"Guides","\u002Fguides","2.guides",[30,35,40,45,50,55,60,65,70,75,79,84,89,94,99],{"title":31,"path":32,"stem":33,"icon":34},"Seeds and TestBiome","\u002Fguides\u002Fseeds-and-testbiome","2.guides\u002F01.seeds-and-testbiome","i-lucide-sprout",{"title":36,"path":37,"stem":38,"icon":39},"Blueprints","\u002Fguides\u002Fblueprints","2.guides\u002F02.blueprints","i-lucide-drafting-compass",{"title":41,"path":42,"stem":43,"icon":44},"Customizing","\u002Fguides\u002Fcustomizing","2.guides\u002F03.customizing","i-lucide-sliders-horizontal",{"title":46,"path":47,"stem":48,"icon":49},"Parent\u002Fchild chains and .Under","\u002Fguides\u002Fparents-and-children","2.guides\u002F04.parents-and-children","i-lucide-git-fork",{"title":51,"path":52,"stem":53,"icon":54},"Fan-out","\u002Fguides\u002Ffan-out","2.guides\u002F05.fan-out","i-lucide-split",{"title":56,"path":57,"stem":58,"icon":59},"Sequences","\u002Fguides\u002Fsequences","2.guides\u002F06.sequences","i-lucide-list-ordered",{"title":61,"path":62,"stem":63,"icon":64},"Time and precision","\u002Fguides\u002Ftime-and-precision","2.guides\u002F07.time-and-precision","i-lucide-clock",{"title":66,"path":67,"stem":68,"icon":69},"Transients","\u002Fguides\u002Ftransients","2.guides\u002F08.transients","i-lucide-ghost",{"title":71,"path":72,"stem":73,"icon":74},"Aggregates","\u002Fguides\u002Faggregates","2.guides\u002F09.aggregates","i-lucide-boxes",{"title":76,"path":77,"stem":78,"icon":74},"Input blueprints","\u002Fguides\u002Finput-blueprints","2.guides\u002F09.input-blueprints",{"title":80,"path":81,"stem":82,"icon":83},"Save hooks and global defaults","\u002Fguides\u002Fsave-hooks-and-defaults","2.guides\u002F10.save-hooks-and-defaults","i-lucide-webhook",{"title":85,"path":86,"stem":87,"icon":88},"EF Core store","\u002Fguides\u002Fef-core-store","2.guides\u002F11.ef-core-store","i-lucide-database",{"title":90,"path":91,"stem":92,"icon":93},"No-DB unit tests","\u002Fguides\u002Fno-db-unit-tests","2.guides\u002F12.no-db-unit-tests","i-lucide-flask-conical",{"title":95,"path":96,"stem":97,"icon":98},"Generated grafts and scenario helpers","\u002Fguides\u002Fscenario-helpers-and-sugar","2.guides\u002F13.scenario-helpers-and-sugar","i-lucide-wand-sparkles",{"title":100,"path":101,"stem":102,"icon":103},"Constructor setup","\u002Fguides\u002Fconstructor-setup","2.guides\u002F14.constructor-setup","i-lucide-blocks",{"title":105,"path":106,"stem":107,"children":108,"icon":6},"Examples","\u002Fexamples","3.examples\u002F1.index",[109,111,116,121,126,130,135,140,145],{"title":105,"path":106,"stem":107,"icon":110},"i-lucide-library",{"title":112,"path":113,"stem":114,"icon":115},"Code reviews","\u002Fexamples\u002Fcode-reviews","3.examples\u002F2.code-reviews","i-lucide-git-pull-request",{"title":117,"path":118,"stem":119,"icon":120},"Membership","\u002Fexamples\u002Fmembership","3.examples\u002F3.membership","i-lucide-users",{"title":122,"path":123,"stem":124,"icon":125},"Board","\u002Fexamples\u002Fboard","3.examples\u002F4.board","i-lucide-kanban",{"title":127,"path":128,"stem":129,"icon":44},"Custom seed","\u002Fexamples\u002Fcustom-seed","3.examples\u002F5.custom-seed",{"title":131,"path":132,"stem":133,"icon":134},"Commerce","\u002Fexamples\u002Fcommerce","3.examples\u002F6.commerce","i-lucide-shopping-cart",{"title":136,"path":137,"stem":138,"icon":139},"Project management","\u002Fexamples\u002Fproject-management","3.examples\u002F7.project-management","i-lucide-folder-kanban",{"title":141,"path":142,"stem":143,"icon":144},"Learning","\u002Fexamples\u002Flearning","3.examples\u002F8.learning","i-lucide-graduation-cap",{"title":146,"path":147,"stem":148,"icon":149},"Docs ingest","\u002Fexamples\u002Fdocs-ingest","3.examples\u002F9.docs-ingest","i-lucide-file-search",{"title":151,"icon":6,"path":152,"stem":153,"children":154,"page":6},"Reference","\u002Freference","4.reference",[155],{"title":156,"path":157,"stem":158,"icon":159},"API cheat sheet","\u002Freference\u002Fapi-cheat-sheet","4.reference\u002F1.api-cheat-sheet","i-lucide-list-checks",{"title":161,"icon":6,"path":162,"stem":163,"children":164,"page":6},"Agent Skills","\u002Fagents","5.agents",[165],{"title":166,"path":167,"stem":168,"icon":169},"Agent skills","\u002Fagents\u002Fagent-skills","5.agents\u002F1.agent-skills","i-lucide-bot",{"id":171,"title":80,"body":172,"description":1959,"extension":1960,"links":1961,"meta":1962,"navigation":1963,"path":81,"seo":1964,"stem":82,"__hash__":1965},"docs\u002F2.guides\u002F10.save-hooks-and-defaults.md",{"type":173,"value":174,"toc":1953},"minimark",[175,180,193,377,392,850,910,914,925,1259,1319,1332,1336,1345,1686,1690,1696,1937,1949],[176,177,179],"h2",{"id":178},"global-defaults","Global defaults",[181,182,183,184,188,189,192],"p",{},"Several entity types may share a convention, such as recording who created them. Repeating that default in every blueprint makes it easier for the definitions to drift. ",[185,186,187],"code",{},"options.Default\u003CTBase, TProp>"," applies it to entities matching a base class or interface. It runs after blueprint ",[185,190,191],{},"Derive","s and fills only unset properties.",[194,195,206],"pre",{"className":196,"code":197,"filename":198,"highlights":199,"language":204,"meta":205,"style":205},"language-csharp shiki shiki-themes material-theme-lighter github-light github-dark","private static readonly BiomeOptions\u003CZeeqSeed> Options =\n    new BiomeOptions\u003CZeeqSeed>()\n        .SeedEntities(seed => [seed.Owner, seed.Organization])\n        .Default\u003CIUpdatedEntity, DateTimeOffset>(\n            e => e.UpdatedAtUtc,\n            (_, ctx) => ctx.Now\n        );\n","TestBiome.cs",[200,201,202,203],4,5,6,7,"csharp","",[185,207,208,244,259,304,326,345,371],{"__ignoreMap":205},[209,210,213,217,220,223,227,231,234,237,240],"span",{"class":211,"line":212},"line",1,[209,214,216],{"class":215},"sbsja","private",[209,218,219],{"class":215}," static",[209,221,222],{"class":215}," readonly",[209,224,226],{"class":225},"sbgvK"," BiomeOptions",[209,228,230],{"class":229},"sP7_E","\u003C",[209,232,233],{"class":225},"ZeeqSeed",[209,235,236],{"class":229},">",[209,238,239],{"class":225}," Options",[209,241,243],{"class":242},"smGrS"," =\n",[209,245,247,250,252,254,256],{"class":211,"line":246},2,[209,248,249],{"class":242},"    new",[209,251,226],{"class":225},[209,253,230],{"class":229},[209,255,233],{"class":225},[209,257,258],{"class":229},">()\n",[209,260,262,265,269,272,275,278,281,284,287,290,293,296,298,301],{"class":211,"line":261},3,[209,263,264],{"class":229},"        .",[209,266,268],{"class":267},"sGLFI","SeedEntities",[209,270,271],{"class":229},"(",[209,273,274],{"class":225},"seed",[209,276,277],{"class":242}," =>",[209,279,280],{"class":229}," [",[209,282,274],{"class":283},"su5hD",[209,285,286],{"class":229},".",[209,288,289],{"class":283},"Owner",[209,291,292],{"class":229},",",[209,294,295],{"class":283}," seed",[209,297,286],{"class":229},[209,299,300],{"class":283},"Organization",[209,302,303],{"class":229},"])\n",[209,305,308,310,313,315,318,320,323],{"class":306,"line":200},[211,307],"highlight",[209,309,264],{"class":229},[209,311,312],{"class":267},"Default",[209,314,230],{"class":229},[209,316,317],{"class":225},"IUpdatedEntity",[209,319,292],{"class":229},[209,321,322],{"class":225}," DateTimeOffset",[209,324,325],{"class":229},">(\n",[209,327,329,332,334,337,339,342],{"class":328,"line":201},[211,307],[209,330,331],{"class":225},"            e",[209,333,277],{"class":242},[209,335,336],{"class":283}," e",[209,338,286],{"class":229},[209,340,341],{"class":283},"UpdatedAtUtc",[209,343,344],{"class":229},",\n",[209,346,348,351,354,356,359,362,364,366,368],{"class":347,"line":202},[211,307],[209,349,350],{"class":229},"            (",[209,352,353],{"class":225},"_",[209,355,292],{"class":229},[209,357,358],{"class":225}," ctx",[209,360,361],{"class":229},")",[209,363,277],{"class":242},[209,365,358],{"class":283},[209,367,286],{"class":229},[209,369,370],{"class":283},"Now\n",[209,372,374],{"class":373,"line":203},[211,307],[209,375,376],{"class":229},"        );\n",[181,378,379,380,383,384,387,388,391],{},"From the library's ",[185,381,382],{},"CustomSeed"," tests: every ",[185,385,386],{},"Note"," implements ",[185,389,390],{},"IHasCreatedBy",", so ownership comes from the seed and an explicit value still wins.",[393,394,395,541],"code-group",{},[194,396,400],{"className":196,"code":397,"filename":398,"highlights":399,"language":204,"meta":205,"style":205},"\u002F\u002F Default\u003CIHasCreatedBy, string?>(n => n.CreatedBy, (_, ctx) => ctx.Seed.Actor)\nvar options = TestBiome.NewOptions();\nawait TestBiome\n    .Start(out var seed, store, options)\n    .AddNotes(out var notes, _ => { }, n => n.CreatedBy = \"custom\")\n    .BuildAsync();\n\u002F\u002F notes[0].CreatedBy == seed.Actor; notes[1].CreatedBy == \"custom\"\n","With Biome",[201],[185,401,402,408,431,439,469,527,536],{"__ignoreMap":205},[209,403,404],{"class":211,"line":212},[209,405,407],{"class":406},"sutJx","\u002F\u002F Default\u003CIHasCreatedBy, string?>(n => n.CreatedBy, (_, ctx) => ctx.Seed.Actor)\n",[209,409,410,414,417,420,423,425,428],{"class":211,"line":246},[209,411,413],{"class":412},"sG8yY","var",[209,415,416],{"class":225}," options",[209,418,419],{"class":242}," =",[209,421,422],{"class":283}," TestBiome",[209,424,286],{"class":229},[209,426,427],{"class":267},"NewOptions",[209,429,430],{"class":229},"();\n",[209,432,433,436],{"class":211,"line":261},[209,434,435],{"class":242},"await",[209,437,438],{"class":283}," TestBiome\n",[209,440,441,444,447,449,452,455,457,459,462,464,466],{"class":211,"line":200},[209,442,443],{"class":229},"    .",[209,445,446],{"class":267},"Start",[209,448,271],{"class":229},[209,450,451],{"class":215},"out",[209,453,454],{"class":412}," var",[209,456,295],{"class":225},[209,458,292],{"class":229},[209,460,461],{"class":283}," store",[209,463,292],{"class":229},[209,465,416],{"class":283},[209,467,468],{"class":229},")\n",[209,470,472,474,477,479,481,483,486,488,491,493,496,499,502,504,506,508,511,514,518,522,525],{"class":471,"line":201},[211,307],[209,473,443],{"class":229},[209,475,476],{"class":267},"AddNotes",[209,478,271],{"class":229},[209,480,451],{"class":215},[209,482,454],{"class":412},[209,484,485],{"class":225}," notes",[209,487,292],{"class":229},[209,489,490],{"class":225}," _",[209,492,277],{"class":242},[209,494,495],{"class":229}," {",[209,497,498],{"class":229}," },",[209,500,501],{"class":225}," n",[209,503,277],{"class":242},[209,505,501],{"class":283},[209,507,286],{"class":229},[209,509,510],{"class":283},"CreatedBy ",[209,512,513],{"class":242},"=",[209,515,517],{"class":516},"sjJ54"," \"",[209,519,521],{"class":520},"s_sjI","custom",[209,523,524],{"class":516},"\"",[209,526,468],{"class":229},[209,528,529,531,534],{"class":211,"line":202},[209,530,443],{"class":229},[209,532,533],{"class":267},"BuildAsync",[209,535,430],{"class":229},[209,537,538],{"class":211,"line":203},[209,539,540],{"class":406},"\u002F\u002F notes[0].CreatedBy == seed.Actor; notes[1].CreatedBy == \"custom\"\n",[542,543,546],"code-collapse",{"label":544,"name":545},"Without Biome","setup",[194,547,549],{"className":196,"code":548,"language":204,"meta":205,"style":205},"\u002F\u002F The owner has to be set on every entity of every type, in every test.\nvar first = new Note\n{\n    Id = $\"note_{Guid.CreateVersion7():N}\",\n    Number = 1,\n    CreatedBy = seed.Actor,\n};\nvar second = new Note\n{\n    Id = $\"note_{Guid.CreateVersion7():N}\",\n    Number = 2,\n    CreatedBy = \"custom\",\n};\nvar comment = new Comment\n{\n    Id = $\"comment_{Guid.CreateVersion7():N}\",\n    CreatedBy = seed.Actor,\n}; \u002F\u002F easy to forget\n_db.AddRange(first, second, comment);\nawait _db.SaveChangesAsync();\n",[185,550,551,556,571,576,616,629,645,650,664,669,700,712,727,732,747,752,784,799,808,835],{"__ignoreMap":205},[209,552,553],{"class":211,"line":212},[209,554,555],{"class":406},"\u002F\u002F The owner has to be set on every entity of every type, in every test.\n",[209,557,558,560,563,565,568],{"class":211,"line":246},[209,559,413],{"class":412},[209,561,562],{"class":225}," first",[209,564,419],{"class":242},[209,566,567],{"class":242}," new",[209,569,570],{"class":225}," Note\n",[209,572,573],{"class":211,"line":261},[209,574,575],{"class":229},"{\n",[209,577,578,581,583,586,589,592,595,597,600,603,606,609,612,614],{"class":211,"line":200},[209,579,580],{"class":283},"    Id ",[209,582,513],{"class":242},[209,584,585],{"class":516}," $\"",[209,587,588],{"class":520},"note_",[209,590,591],{"class":516},"{",[209,593,594],{"class":283},"Guid",[209,596,286],{"class":516},[209,598,599],{"class":267},"CreateVersion7",[209,601,602],{"class":516},"()",[209,604,605],{"class":242},":",[209,607,608],{"class":283},"N",[209,610,611],{"class":516},"}",[209,613,524],{"class":516},[209,615,344],{"class":229},[209,617,618,621,623,627],{"class":211,"line":201},[209,619,620],{"class":283},"    Number ",[209,622,513],{"class":242},[209,624,626],{"class":625},"srdBf"," 1",[209,628,344],{"class":229},[209,630,631,634,636,638,640,643],{"class":211,"line":202},[209,632,633],{"class":283},"    CreatedBy ",[209,635,513],{"class":242},[209,637,295],{"class":283},[209,639,286],{"class":229},[209,641,642],{"class":283},"Actor",[209,644,344],{"class":229},[209,646,647],{"class":211,"line":203},[209,648,649],{"class":229},"};\n",[209,651,653,655,658,660,662],{"class":211,"line":652},8,[209,654,413],{"class":412},[209,656,657],{"class":225}," second",[209,659,419],{"class":242},[209,661,567],{"class":242},[209,663,570],{"class":225},[209,665,667],{"class":211,"line":666},9,[209,668,575],{"class":229},[209,670,672,674,676,678,680,682,684,686,688,690,692,694,696,698],{"class":211,"line":671},10,[209,673,580],{"class":283},[209,675,513],{"class":242},[209,677,585],{"class":516},[209,679,588],{"class":520},[209,681,591],{"class":516},[209,683,594],{"class":283},[209,685,286],{"class":516},[209,687,599],{"class":267},[209,689,602],{"class":516},[209,691,605],{"class":242},[209,693,608],{"class":283},[209,695,611],{"class":516},[209,697,524],{"class":516},[209,699,344],{"class":229},[209,701,703,705,707,710],{"class":211,"line":702},11,[209,704,620],{"class":283},[209,706,513],{"class":242},[209,708,709],{"class":625}," 2",[209,711,344],{"class":229},[209,713,715,717,719,721,723,725],{"class":211,"line":714},12,[209,716,633],{"class":283},[209,718,513],{"class":242},[209,720,517],{"class":516},[209,722,521],{"class":520},[209,724,524],{"class":516},[209,726,344],{"class":229},[209,728,730],{"class":211,"line":729},13,[209,731,649],{"class":229},[209,733,735,737,740,742,744],{"class":211,"line":734},14,[209,736,413],{"class":412},[209,738,739],{"class":225}," comment",[209,741,419],{"class":242},[209,743,567],{"class":242},[209,745,746],{"class":225}," Comment\n",[209,748,750],{"class":211,"line":749},15,[209,751,575],{"class":229},[209,753,755,757,759,761,764,766,768,770,772,774,776,778,780,782],{"class":211,"line":754},16,[209,756,580],{"class":283},[209,758,513],{"class":242},[209,760,585],{"class":516},[209,762,763],{"class":520},"comment_",[209,765,591],{"class":516},[209,767,594],{"class":283},[209,769,286],{"class":516},[209,771,599],{"class":267},[209,773,602],{"class":516},[209,775,605],{"class":242},[209,777,608],{"class":283},[209,779,611],{"class":516},[209,781,524],{"class":516},[209,783,344],{"class":229},[209,785,787,789,791,793,795,797],{"class":211,"line":786},17,[209,788,633],{"class":283},[209,790,513],{"class":242},[209,792,295],{"class":283},[209,794,286],{"class":229},[209,796,642],{"class":283},[209,798,344],{"class":229},[209,800,802,805],{"class":211,"line":801},18,[209,803,804],{"class":229},"};",[209,806,807],{"class":406}," \u002F\u002F easy to forget\n",[209,809,811,814,816,819,821,824,826,828,830,832],{"class":211,"line":810},19,[209,812,813],{"class":283},"_db",[209,815,286],{"class":229},[209,817,818],{"class":267},"AddRange",[209,820,271],{"class":229},[209,822,823],{"class":283},"first",[209,825,292],{"class":229},[209,827,657],{"class":283},[209,829,292],{"class":229},[209,831,739],{"class":283},[209,833,834],{"class":229},");\n",[209,836,838,840,843,845,848],{"class":211,"line":837},20,[209,839,435],{"class":242},[209,841,842],{"class":283}," _db",[209,844,286],{"class":229},[209,846,847],{"class":267},"SaveChangesAsync",[209,849,430],{"class":229},[851,852,853],"note",{},[854,855,856,871,881,896],"ul",{},[857,858,859,861,862,866,867,870],"li",{},[185,860,312],{}," needs ",[863,864,865],"strong",{},"explicit type arguments"," (",[185,868,869],{},"Default\u003CTBase, TProp>",").",[857,872,873,874,877,878,286],{},"The selected property must be directly writable. ",[185,875,876],{},"init"," properties are fine. Anything else throws ",[185,879,880],{},"ArgumentException",[857,882,883,884,888,889,892,893,286],{},"Defaults apply to entities built by blueprints, including the output of an ",[885,886,887],"a",{"href":77},"input blueprint",", but not its input object. They don't reach ",[863,890,891],{},"aggregate parts"," or rows added in ",[185,894,895],{},"BeforeSave",[857,897,898,899,902,903,902,906,909],{},"A default is fill-only: it treats the type's default value (",[185,900,901],{},"null",", ",[185,904,905],{},"0",[185,907,908],{},"false",") as unset, so it cannot tell \"unset\" from an explicit default value.",[176,911,913],{"id":912},"save-hooks","Save hooks",[181,915,916,917,920,921,924],{},"Some setup rules depend on the whole graph, such as adding an audit row before saving. Save hooks give those rules a place to run: ",[185,918,919],{},"options.BeforeSave"," can inspect and change the final row list, while ",[185,922,923],{},"options.AfterSave"," runs after a successful save.",[194,926,929],{"className":196,"code":927,"filename":198,"highlights":928,"language":204,"meta":205,"style":205},".BeforeSave((save, _) =>\n{\n    \u002F\u002F Invariant: every saved user is an active member of the seed organization.\n    foreach (var user in save.Entities.OfType\u003CUser>().ToList())\n    {\n        save.Entities.Add(new OrganizationMembership\n        {\n            Id = $\"mem_{Guid.CreateVersion7():N}\",\n            OrganizationId = save.Seed.Organization.Id,\n            UserId = user.Id,\n            Role = user == save.Seed.Owner ? \"owner\" : \"member\",\n            Status = MembershipStatus.Active,\n            CreatedByUserId = save.Seed.Owner.Id,\n        });\n    }\n    return ValueTask.CompletedTask;\n})\n\u002F\u002F e.g. logging, assertions on what was saved\n.AfterSave((save, _) => ValueTask.CompletedTask)\n",[202,810],[185,930,931,952,956,961,1004,1009,1032,1037,1069,1094,1109,1155,1172,1195,1200,1205,1221,1226,1231],{"__ignoreMap":205},[209,932,933,935,937,940,943,945,947,949],{"class":211,"line":212},[209,934,286],{"class":229},[209,936,895],{"class":267},[209,938,939],{"class":229},"((",[209,941,942],{"class":225},"save",[209,944,292],{"class":229},[209,946,490],{"class":225},[209,948,361],{"class":229},[209,950,951],{"class":242}," =>\n",[209,953,954],{"class":211,"line":246},[209,955,575],{"class":229},[209,957,958],{"class":211,"line":261},[209,959,960],{"class":406},"    \u002F\u002F Invariant: every saved user is an active member of the seed organization.\n",[209,962,963,967,969,971,974,977,980,982,985,987,990,992,995,998,1001],{"class":211,"line":200},[209,964,966],{"class":965},"sVHd0","    foreach",[209,968,866],{"class":229},[209,970,413],{"class":412},[209,972,973],{"class":225}," user",[209,975,976],{"class":965}," in",[209,978,979],{"class":283}," save",[209,981,286],{"class":229},[209,983,984],{"class":283},"Entities",[209,986,286],{"class":229},[209,988,989],{"class":267},"OfType",[209,991,230],{"class":229},[209,993,994],{"class":225},"User",[209,996,997],{"class":229},">().",[209,999,1000],{"class":267},"ToList",[209,1002,1003],{"class":229},"())\n",[209,1005,1006],{"class":211,"line":201},[209,1007,1008],{"class":229},"    {\n",[209,1010,1012,1015,1017,1019,1021,1024,1026,1029],{"class":1011,"line":202},[211,307],[209,1013,1014],{"class":283},"        save",[209,1016,286],{"class":229},[209,1018,984],{"class":283},[209,1020,286],{"class":229},[209,1022,1023],{"class":267},"Add",[209,1025,271],{"class":229},[209,1027,1028],{"class":242},"new",[209,1030,1031],{"class":225}," OrganizationMembership\n",[209,1033,1034],{"class":211,"line":203},[209,1035,1036],{"class":229},"        {\n",[209,1038,1039,1042,1044,1046,1049,1051,1053,1055,1057,1059,1061,1063,1065,1067],{"class":211,"line":652},[209,1040,1041],{"class":283},"            Id ",[209,1043,513],{"class":242},[209,1045,585],{"class":516},[209,1047,1048],{"class":520},"mem_",[209,1050,591],{"class":516},[209,1052,594],{"class":283},[209,1054,286],{"class":516},[209,1056,599],{"class":267},[209,1058,602],{"class":516},[209,1060,605],{"class":242},[209,1062,608],{"class":283},[209,1064,611],{"class":516},[209,1066,524],{"class":516},[209,1068,344],{"class":229},[209,1070,1071,1074,1076,1078,1080,1083,1085,1087,1089,1092],{"class":211,"line":666},[209,1072,1073],{"class":283},"            OrganizationId ",[209,1075,513],{"class":242},[209,1077,979],{"class":283},[209,1079,286],{"class":229},[209,1081,1082],{"class":283},"Seed",[209,1084,286],{"class":229},[209,1086,300],{"class":283},[209,1088,286],{"class":229},[209,1090,1091],{"class":283},"Id",[209,1093,344],{"class":229},[209,1095,1096,1099,1101,1103,1105,1107],{"class":211,"line":671},[209,1097,1098],{"class":283},"            UserId ",[209,1100,513],{"class":242},[209,1102,973],{"class":283},[209,1104,286],{"class":229},[209,1106,1091],{"class":283},[209,1108,344],{"class":229},[209,1110,1111,1114,1116,1119,1122,1124,1126,1128,1130,1133,1136,1138,1141,1143,1146,1148,1151,1153],{"class":211,"line":702},[209,1112,1113],{"class":283},"            Role ",[209,1115,513],{"class":242},[209,1117,1118],{"class":283}," user ",[209,1120,1121],{"class":242},"==",[209,1123,979],{"class":283},[209,1125,286],{"class":229},[209,1127,1082],{"class":283},[209,1129,286],{"class":229},[209,1131,1132],{"class":283},"Owner ",[209,1134,1135],{"class":242},"?",[209,1137,517],{"class":516},[209,1139,1140],{"class":520},"owner",[209,1142,524],{"class":516},[209,1144,1145],{"class":242}," :",[209,1147,517],{"class":516},[209,1149,1150],{"class":520},"member",[209,1152,524],{"class":516},[209,1154,344],{"class":229},[209,1156,1157,1160,1162,1165,1167,1170],{"class":211,"line":714},[209,1158,1159],{"class":283},"            Status ",[209,1161,513],{"class":242},[209,1163,1164],{"class":283}," MembershipStatus",[209,1166,286],{"class":229},[209,1168,1169],{"class":283},"Active",[209,1171,344],{"class":229},[209,1173,1174,1177,1179,1181,1183,1185,1187,1189,1191,1193],{"class":211,"line":729},[209,1175,1176],{"class":283},"            CreatedByUserId ",[209,1178,513],{"class":242},[209,1180,979],{"class":283},[209,1182,286],{"class":229},[209,1184,1082],{"class":283},[209,1186,286],{"class":229},[209,1188,289],{"class":283},[209,1190,286],{"class":229},[209,1192,1091],{"class":283},[209,1194,344],{"class":229},[209,1196,1197],{"class":211,"line":734},[209,1198,1199],{"class":229},"        });\n",[209,1201,1202],{"class":211,"line":749},[209,1203,1204],{"class":229},"    }\n",[209,1206,1207,1210,1213,1215,1218],{"class":211,"line":754},[209,1208,1209],{"class":965},"    return",[209,1211,1212],{"class":283}," ValueTask",[209,1214,286],{"class":229},[209,1216,1217],{"class":283},"CompletedTask",[209,1219,1220],{"class":229},";\n",[209,1222,1223],{"class":211,"line":786},[209,1224,1225],{"class":229},"})\n",[209,1227,1228],{"class":211,"line":801},[209,1229,1230],{"class":406},"\u002F\u002F e.g. logging, assertions on what was saved\n",[209,1232,1234,1236,1239,1241,1243,1245,1247,1249,1251,1253,1255,1257],{"class":1233,"line":810},[211,307],[209,1235,286],{"class":229},[209,1237,1238],{"class":267},"AfterSave",[209,1240,939],{"class":229},[209,1242,942],{"class":225},[209,1244,292],{"class":229},[209,1246,490],{"class":225},[209,1248,361],{"class":229},[209,1250,277],{"class":242},[209,1252,1212],{"class":283},[209,1254,286],{"class":229},[209,1256,1217],{"class":283},[209,1258,468],{"class":229},[1260,1261,1262,1275],"table",{},[1263,1264,1265],"thead",{},[1266,1267,1268,1272],"tr",{},[1269,1270,1271],"th",{},"Member",[1269,1273,1274],{},"Meaning",[1276,1277,1278,1293,1303],"tbody",{},[1266,1279,1280,1286],{},[1281,1282,1283],"td",{},[185,1284,1285],{},"save.Entities",[1281,1287,1288,1289,1292],{},"The mutable ",[185,1290,1291],{},"List\u003Cobject>"," about to be saved (seed rows first, then created entities).",[1266,1294,1295,1300],{},[1281,1296,1297],{},[185,1298,1299],{},"save.Seed",[1281,1301,1302],{},"Your seed.",[1266,1304,1305,1310],{},[1281,1306,1307],{},[185,1308,1309],{},"save.Session",[1281,1311,1312,1313,902,1316,870],{},"The session, for inspecting what was created (",[185,1314,1315],{},"All\u003CT>",[185,1317,1318],{},"Last\u003CT>",[181,1320,1321,1322,1324,1325,1328,1329,1331],{},"Hooks run once per ",[185,1323,533],{},", in ",[863,1326,1327],{},"registration order",", and ",[185,1330,1238],{}," only runs when the store's save succeeded.",[176,1333,1335],{"id":1334},"a-hook-in-action","A hook in action",[181,1337,1338,1339,1341,1342,1344],{},"The library's ",[185,1340,382],{}," test registers an audit row in ",[185,1343,895],{}," and records the order of events:",[194,1346,1350],{"className":196,"code":1347,"filename":1348,"highlights":1349,"language":204,"meta":205,"style":205},"var options = TestBiome\n    .NewOptions()\n    .BeforeSave(\n        (ctx, _) =>\n        {\n            events.Add(\"before\");\n            ctx.Entities.Add(new Audit(ctx.Seed.Actor));\n            return ValueTask.CompletedTask;\n        }\n    )\n    .AfterSave(\n        (ctx, _) =>\n        {\n            events.Add(\"after\");\n            events.Add(ctx.Session.Last\u003CNote>().Text);\n            return ValueTask.CompletedTask;\n        }\n    );\nvar biome = TestBiome.Start(out var seed, store, options);\n\nawait biome\n    .AddNotes(out var notes, _ => { }, n => n.CreatedBy = \"custom\")\n    .BuildAsync();\n\u002F\u002F events: \"before,save,after,note\"; the Audit row reached the store\n","CustomSeedTests.cs",[203,749],[185,1351,1352,1362,1371,1380,1396,1400,1420,1456,1469,1474,1479,1487,1501,1505,1524,1558,1570,1574,1579,1612,1618,1626,1671,1680],{"__ignoreMap":205},[209,1353,1354,1356,1358,1360],{"class":211,"line":212},[209,1355,413],{"class":412},[209,1357,416],{"class":225},[209,1359,419],{"class":242},[209,1361,438],{"class":283},[209,1363,1364,1366,1368],{"class":211,"line":246},[209,1365,443],{"class":229},[209,1367,427],{"class":267},[209,1369,1370],{"class":229},"()\n",[209,1372,1373,1375,1377],{"class":211,"line":261},[209,1374,443],{"class":229},[209,1376,895],{"class":267},[209,1378,1379],{"class":229},"(\n",[209,1381,1382,1385,1388,1390,1392,1394],{"class":211,"line":200},[209,1383,1384],{"class":229},"        (",[209,1386,1387],{"class":225},"ctx",[209,1389,292],{"class":229},[209,1391,490],{"class":225},[209,1393,361],{"class":229},[209,1395,951],{"class":242},[209,1397,1398],{"class":211,"line":201},[209,1399,1036],{"class":229},[209,1401,1402,1405,1407,1409,1411,1413,1416,1418],{"class":211,"line":202},[209,1403,1404],{"class":283},"            events",[209,1406,286],{"class":229},[209,1408,1023],{"class":267},[209,1410,271],{"class":229},[209,1412,524],{"class":516},[209,1414,1415],{"class":520},"before",[209,1417,524],{"class":516},[209,1419,834],{"class":229},[209,1421,1423,1426,1428,1430,1432,1434,1436,1438,1441,1443,1445,1447,1449,1451,1453],{"class":1422,"line":203},[211,307],[209,1424,1425],{"class":283},"            ctx",[209,1427,286],{"class":229},[209,1429,984],{"class":283},[209,1431,286],{"class":229},[209,1433,1023],{"class":267},[209,1435,271],{"class":229},[209,1437,1028],{"class":242},[209,1439,1440],{"class":225}," Audit",[209,1442,271],{"class":229},[209,1444,1387],{"class":283},[209,1446,286],{"class":229},[209,1448,1082],{"class":283},[209,1450,286],{"class":229},[209,1452,642],{"class":283},[209,1454,1455],{"class":229},"));\n",[209,1457,1458,1461,1463,1465,1467],{"class":211,"line":652},[209,1459,1460],{"class":965},"            return",[209,1462,1212],{"class":283},[209,1464,286],{"class":229},[209,1466,1217],{"class":283},[209,1468,1220],{"class":229},[209,1470,1471],{"class":211,"line":666},[209,1472,1473],{"class":229},"        }\n",[209,1475,1476],{"class":211,"line":671},[209,1477,1478],{"class":229},"    )\n",[209,1480,1481,1483,1485],{"class":211,"line":702},[209,1482,443],{"class":229},[209,1484,1238],{"class":267},[209,1486,1379],{"class":229},[209,1488,1489,1491,1493,1495,1497,1499],{"class":211,"line":714},[209,1490,1384],{"class":229},[209,1492,1387],{"class":225},[209,1494,292],{"class":229},[209,1496,490],{"class":225},[209,1498,361],{"class":229},[209,1500,951],{"class":242},[209,1502,1503],{"class":211,"line":729},[209,1504,1036],{"class":229},[209,1506,1507,1509,1511,1513,1515,1517,1520,1522],{"class":211,"line":734},[209,1508,1404],{"class":283},[209,1510,286],{"class":229},[209,1512,1023],{"class":267},[209,1514,271],{"class":229},[209,1516,524],{"class":516},[209,1518,1519],{"class":520},"after",[209,1521,524],{"class":516},[209,1523,834],{"class":229},[209,1525,1527,1529,1531,1533,1535,1537,1539,1542,1544,1547,1549,1551,1553,1556],{"class":1526,"line":749},[211,307],[209,1528,1404],{"class":283},[209,1530,286],{"class":229},[209,1532,1023],{"class":267},[209,1534,271],{"class":229},[209,1536,1387],{"class":283},[209,1538,286],{"class":229},[209,1540,1541],{"class":283},"Session",[209,1543,286],{"class":229},[209,1545,1546],{"class":267},"Last",[209,1548,230],{"class":229},[209,1550,386],{"class":225},[209,1552,997],{"class":229},[209,1554,1555],{"class":283},"Text",[209,1557,834],{"class":229},[209,1559,1560,1562,1564,1566,1568],{"class":211,"line":754},[209,1561,1460],{"class":965},[209,1563,1212],{"class":283},[209,1565,286],{"class":229},[209,1567,1217],{"class":283},[209,1569,1220],{"class":229},[209,1571,1572],{"class":211,"line":786},[209,1573,1473],{"class":229},[209,1575,1576],{"class":211,"line":801},[209,1577,1578],{"class":229},"    );\n",[209,1580,1581,1583,1586,1588,1590,1592,1594,1596,1598,1600,1602,1604,1606,1608,1610],{"class":211,"line":810},[209,1582,413],{"class":412},[209,1584,1585],{"class":225}," biome",[209,1587,419],{"class":242},[209,1589,422],{"class":283},[209,1591,286],{"class":229},[209,1593,446],{"class":267},[209,1595,271],{"class":229},[209,1597,451],{"class":215},[209,1599,454],{"class":412},[209,1601,295],{"class":225},[209,1603,292],{"class":229},[209,1605,461],{"class":283},[209,1607,292],{"class":229},[209,1609,416],{"class":283},[209,1611,834],{"class":229},[209,1613,1614],{"class":211,"line":837},[209,1615,1617],{"emptyLinePlaceholder":1616},true,"\n",[209,1619,1621,1623],{"class":211,"line":1620},21,[209,1622,435],{"class":242},[209,1624,1625],{"class":283}," biome\n",[209,1627,1629,1631,1633,1635,1637,1639,1641,1643,1645,1647,1649,1651,1653,1655,1657,1659,1661,1663,1665,1667,1669],{"class":211,"line":1628},22,[209,1630,443],{"class":229},[209,1632,476],{"class":267},[209,1634,271],{"class":229},[209,1636,451],{"class":215},[209,1638,454],{"class":412},[209,1640,485],{"class":225},[209,1642,292],{"class":229},[209,1644,490],{"class":225},[209,1646,277],{"class":242},[209,1648,495],{"class":229},[209,1650,498],{"class":229},[209,1652,501],{"class":225},[209,1654,277],{"class":242},[209,1656,501],{"class":283},[209,1658,286],{"class":229},[209,1660,510],{"class":283},[209,1662,513],{"class":242},[209,1664,517],{"class":516},[209,1666,521],{"class":520},[209,1668,524],{"class":516},[209,1670,468],{"class":229},[209,1672,1674,1676,1678],{"class":211,"line":1673},23,[209,1675,443],{"class":229},[209,1677,533],{"class":267},[209,1679,430],{"class":229},[209,1681,1683],{"class":211,"line":1682},24,[209,1684,1685],{"class":406},"\u002F\u002F events: \"before,save,after,note\"; the Audit row reached the store\n",[176,1687,1689],{"id":1688},"when-a-hook-beats-a-default","When a hook beats a default",[181,1691,1692,1693,1695],{},"An EF example from the library: open pull requests are queued for review by a coordinator row, as an app's own save rules might do. Putting the rule in ",[185,1694,895],{}," keeps every test honest without repeating it.",[194,1697,1701],{"className":196,"code":1698,"filename":1699,"highlights":1700,"language":204,"meta":205,"style":205},"private static readonly BiomeOptions\u003CReviewSeed> Options =\n    new BiomeOptions\u003CReviewSeed>()\n        .SeedEntities(seed => [seed.Owner, seed.Organization])\n        .BeforeSave(\n            (save, _) =>\n            {\n                save.Entities.AddRange([\n                    .. save\n                        .Entities.OfType\u003CPullRequestRecord>()\n                        .Where(pr => !pr.Closed)\n                        .Select(pr => new ReviewQueueEntry\n                        {\n                            PullRequest = pr,\n                        }),\n                ]);\n                return ValueTask.CompletedTask;\n            }\n        );\n","Reviews\u002FBlueprints.cs",[203,652,666,671,702,714,729,734,749],[185,1702,1703,1724,1736,1766,1774,1788,1793,1810,1819,1838,1865,1884,1890,1903,1909,1915,1928,1933],{"__ignoreMap":205},[209,1704,1705,1707,1709,1711,1713,1715,1718,1720,1722],{"class":211,"line":212},[209,1706,216],{"class":215},[209,1708,219],{"class":215},[209,1710,222],{"class":215},[209,1712,226],{"class":225},[209,1714,230],{"class":229},[209,1716,1717],{"class":225},"ReviewSeed",[209,1719,236],{"class":229},[209,1721,239],{"class":225},[209,1723,243],{"class":242},[209,1725,1726,1728,1730,1732,1734],{"class":211,"line":246},[209,1727,249],{"class":242},[209,1729,226],{"class":225},[209,1731,230],{"class":229},[209,1733,1717],{"class":225},[209,1735,258],{"class":229},[209,1737,1738,1740,1742,1744,1746,1748,1750,1752,1754,1756,1758,1760,1762,1764],{"class":211,"line":261},[209,1739,264],{"class":229},[209,1741,268],{"class":267},[209,1743,271],{"class":229},[209,1745,274],{"class":225},[209,1747,277],{"class":242},[209,1749,280],{"class":229},[209,1751,274],{"class":283},[209,1753,286],{"class":229},[209,1755,289],{"class":283},[209,1757,292],{"class":229},[209,1759,295],{"class":283},[209,1761,286],{"class":229},[209,1763,300],{"class":283},[209,1765,303],{"class":229},[209,1767,1768,1770,1772],{"class":211,"line":200},[209,1769,264],{"class":229},[209,1771,895],{"class":267},[209,1773,1379],{"class":229},[209,1775,1776,1778,1780,1782,1784,1786],{"class":211,"line":201},[209,1777,350],{"class":229},[209,1779,942],{"class":225},[209,1781,292],{"class":229},[209,1783,490],{"class":225},[209,1785,361],{"class":229},[209,1787,951],{"class":242},[209,1789,1790],{"class":211,"line":202},[209,1791,1792],{"class":229},"            {\n",[209,1794,1796,1799,1801,1803,1805,1807],{"class":1795,"line":203},[211,307],[209,1797,1798],{"class":283},"                save",[209,1800,286],{"class":229},[209,1802,984],{"class":283},[209,1804,286],{"class":229},[209,1806,818],{"class":267},[209,1808,1809],{"class":229},"([\n",[209,1811,1813,1816],{"class":1812,"line":652},[211,307],[209,1814,1815],{"class":242},"                    ..",[209,1817,1818],{"class":283}," save\n",[209,1820,1822,1825,1827,1829,1831,1833,1836],{"class":1821,"line":666},[211,307],[209,1823,1824],{"class":229},"                        .",[209,1826,984],{"class":283},[209,1828,286],{"class":229},[209,1830,989],{"class":267},[209,1832,230],{"class":229},[209,1834,1835],{"class":225},"PullRequestRecord",[209,1837,258],{"class":229},[209,1839,1841,1843,1846,1848,1851,1853,1856,1858,1860,1863],{"class":1840,"line":671},[211,307],[209,1842,1824],{"class":229},[209,1844,1845],{"class":267},"Where",[209,1847,271],{"class":229},[209,1849,1850],{"class":225},"pr",[209,1852,277],{"class":242},[209,1854,1855],{"class":242}," !",[209,1857,1850],{"class":283},[209,1859,286],{"class":229},[209,1861,1862],{"class":283},"Closed",[209,1864,468],{"class":229},[209,1866,1868,1870,1873,1875,1877,1879,1881],{"class":1867,"line":702},[211,307],[209,1869,1824],{"class":229},[209,1871,1872],{"class":267},"Select",[209,1874,271],{"class":229},[209,1876,1850],{"class":225},[209,1878,277],{"class":242},[209,1880,567],{"class":242},[209,1882,1883],{"class":225}," ReviewQueueEntry\n",[209,1885,1887],{"class":1886,"line":714},[211,307],[209,1888,1889],{"class":229},"                        {\n",[209,1891,1893,1896,1898,1901],{"class":1892,"line":729},[211,307],[209,1894,1895],{"class":283},"                            PullRequest ",[209,1897,513],{"class":242},[209,1899,1900],{"class":283}," pr",[209,1902,344],{"class":229},[209,1904,1906],{"class":1905,"line":734},[211,307],[209,1907,1908],{"class":229},"                        }),\n",[209,1910,1912],{"class":1911,"line":749},[211,307],[209,1913,1914],{"class":229},"                ]);\n",[209,1916,1917,1920,1922,1924,1926],{"class":211,"line":754},[209,1918,1919],{"class":965},"                return",[209,1921,1212],{"class":283},[209,1923,286],{"class":229},[209,1925,1217],{"class":283},[209,1927,1220],{"class":229},[209,1929,1930],{"class":211,"line":786},[209,1931,1932],{"class":229},"            }\n",[209,1934,1935],{"class":211,"line":801},[209,1936,376],{"class":229},[1938,1939,1940],"warning",{},[181,1941,1942,1943,1945,1946,1948],{},"A hook can keep a shared save rule in one place, but hidden rows make a test harder to follow. Keep hooks small and use them for rules the app consistently requires. Rows added in ",[185,1944,895],{}," skip traits, ",[185,1947,191],{},"s, and global defaults, so the hook must supply every required property.",[1950,1951,1952],"style",{},"html pre.shiki code .sbsja, html code.shiki .sbsja{--shiki-light:#9C3EDA;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sbgvK, html code.shiki .sbgvK{--shiki-light:#E2931D;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sP7_E, html code.shiki .sP7_E{--shiki-light:#39ADB5;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .smGrS, html code.shiki .smGrS{--shiki-light:#39ADB5;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sGLFI, html code.shiki .sGLFI{--shiki-light:#6182B8;--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .su5hD, html code.shiki .su5hD{--shiki-light:#90A4AE;--shiki-default:#24292E;--shiki-dark:#E1E4E8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sutJx, html code.shiki .sutJx{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#6A737D;--shiki-default-font-style:inherit;--shiki-dark:#6A737D;--shiki-dark-font-style:inherit}html pre.shiki code .sG8yY, html code.shiki .sG8yY{--shiki-light:#E2931D;--shiki-default:#D73A49;--shiki-dark:#F97583}html pre.shiki code .sjJ54, html code.shiki .sjJ54{--shiki-light:#39ADB5;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .s_sjI, html code.shiki .s_sjI{--shiki-light:#91B859;--shiki-default:#032F62;--shiki-dark:#9ECBFF}html pre.shiki code .srdBf, html code.shiki .srdBf{--shiki-light:#F76D47;--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sVHd0, html code.shiki .sVHd0{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#D73A49;--shiki-default-font-style:inherit;--shiki-dark:#F97583;--shiki-dark-font-style:inherit}",{"title":205,"searchDepth":212,"depth":246,"links":1954},[1955,1956,1957,1958],{"id":178,"depth":246,"text":179},{"id":912,"depth":246,"text":913},{"id":1334,"depth":246,"text":1335},{"id":1688,"depth":246,"text":1689},"Fill unset properties on every matching entity, and see or change the final row list before it is saved.","md",null,{},{"icon":83},{"title":80,"description":1959},"3pz8STJRA_j0M8lmZwmc0xA32BpVrzBC8LJHKTOnZ3Y",[1967,1969],{"title":76,"path":77,"stem":78,"description":1968,"icon":74,"children":-1},"Customize a small input object, then build the row from it. For init-only properties, derived values, typed children, and groups of rows.",{"title":85,"path":86,"stem":87,"description":1970,"icon":88,"children":-1},"Save a biome through a DbContext with one SaveChangesAsync.",1791831052451]