rows { options { physical_type: PHYSICAL_STREAM_TYPE_QUADS max_name_table_size: 128 max_prefix_table_size: 16 max_datatype_table_size: 16 logical_type: LOGICAL_STREAM_TYPE_DATASETS version: 2 } } rows { prefix { value: "https://w3id.org/np/" } } rows { name { value: "RALlMm3LwaYbJpZPUQhJDzbbOyt3DrtXJlUpCGuYfRpq0" } } rows { namespace { name: "this" value { prefix_id: 1 } } } rows { prefix { value: "https://w3id.org/np/RALlMm3LwaYbJpZPUQhJDzbbOyt3DrtXJlUpCGuYfRpq0/" } } rows { name { } } rows { namespace { name: "sub" value { prefix_id: 2 } } } rows { prefix { value: "http://www.nanopub.org/nschema#" } } rows { namespace { name: "np" value { prefix_id: 3 name_id: 2 } } } rows { prefix { value: "https://w3id.org/kpxl/grlc/" } } rows { namespace { name: "grlc" value { prefix_id: 4 name_id: 2 } } } rows { prefix { value: "http://purl.org/dc/terms/" } } rows { namespace { name: "dct" value { prefix_id: 5 name_id: 2 } } } rows { prefix { value: "https://w3id.org/np/o/ntemplate/" } } rows { namespace { name: "nt" value { prefix_id: 6 name_id: 2 } } } rows { prefix { value: "http://purl.org/nanopub/x/" } } rows { namespace { name: "npx" value { prefix_id: 7 name_id: 2 } } } rows { prefix { value: "http://www.w3.org/2001/XMLSchema#" } } rows { namespace { name: "xsd" value { prefix_id: 8 name_id: 2 } } } rows { prefix { value: "http://www.w3.org/2000/01/rdf-schema#" } } rows { namespace { name: "rdfs" value { prefix_id: 9 name_id: 2 } } } rows { prefix { value: "https://orcid.org/" } } rows { namespace { name: "orcid" value { prefix_id: 10 name_id: 2 } } } rows { prefix { value: "http://www.w3.org/ns/prov#" } } rows { namespace { name: "prov" value { prefix_id: 11 name_id: 2 } } } rows { prefix { value: "http://xmlns.com/foaf/0.1/" } } rows { namespace { name: "foaf" value { prefix_id: 12 name_id: 2 } } } rows { name { value: "hasAssertion" } } rows { name { value: "assertion" } } rows { name { value: "Head" } } rows { quad { s_iri { prefix_id: 1 name_id: 1 } p_iri { prefix_id: 3 name_id: 3 } o_iri { prefix_id: 2 } g_iri { } } } rows { name { value: "hasProvenance" } } rows { name { value: "provenance" } } rows { quad { p_iri { prefix_id: 3 } o_iri { prefix_id: 2 } } } rows { name { value: "hasPublicationInfo" } } rows { name { value: "pubinfo" } } rows { quad { p_iri { prefix_id: 3 } o_iri { prefix_id: 2 } } } rows { prefix { value: "http://www.w3.org/1999/02/22-rdf-syntax-ns#" } } rows { name { value: "type" } } rows { name { value: "Nanopublication" } } rows { quad { p_iri { prefix_id: 13 } o_iri { prefix_id: 3 } } } rows { name { value: "get-presentations-grid-svg" } } rows { name { value: "description" } } rows { quad { s_iri { prefix_id: 2 } p_iri { prefix_id: 5 } o_literal { lex: "Renders the schedule of an event as one SVG per day: a grid with one column per room used that day, boxes placed at their real clock positions. The figure is fitted to the panel it is shown in, which is at most 1320px wide, so anything wider is scaled down until its text is unreadable: thirteen rooms at the fixed pitch of 176 came to 2346 units and 5.5px type. The pitch is therefore divided out of a width budget as soon as a day has more rooms than fit at 176, and the time axis is compressed as soon as the day runs longer than the height budget; seven rooms and 333 minutes still get the old values, so every day that already fitted is drawn exactly as it was. Covers both the presentations that are part of the event and its workshop, tutorial and session sub-spaces, which are coloured differently and link to their own space pages. The per-slot ranking joins two separately computed sub-selects rather than filtering a cross product, which the engine evaluated as a nested loop; the room\'s column index and the day\'s room count now come from one such pass as well, instead of a second one. Box text adapts to the box and to the column: an author line and up to seven title lines, one more for every twelve pixels the box has beyond the first two, otherwise a single centred title line with the full title and authors as a hover tooltip, and no text in boxes too short for one line. Line length follows the column width, derived from the widest character of the real font, and a line that has to break inside a word resumes at the next character. Reads both the http:// and https:// schema.org namespaces. Where several valid nanopublications introduce the same talk or sub-space (e.g. an override published by another admin, which carries no supersedes link), only the most recently created one is used, so an item is never counted twice. Each box links with an explicit &context= naming the event, so that a talk opened from the schedule lands with the conference as its navigation context; without it Nanodash appends the context of the page the schedule happens to be rendered on, and from the schedule\'s own resource page that is the schedule, on which the part page renders none of its views." } g_iri { prefix_id: 2 name_id: 4 } } } rows { name { value: "license" } } rows { prefix { value: "http://www.apache.org/licenses/" } } rows { name { value: "LICENSE-2.0" } } rows { quad { p_iri { prefix_id: 5 name_id: 14 } o_iri { prefix_id: 14 } } } rows { name { value: "grlc-query" } } rows { quad { p_iri { prefix_id: 13 name_id: 10 } o_iri { prefix_id: 4 name_id: 16 } } } rows { name { value: "label" } } rows { quad { p_iri { prefix_id: 9 } o_literal { lex: "Get the schedule of an event as an SVG grid" } } } rows { name { value: "endpoint" } } rows { prefix { value: "https://w3id.org/np/l/nanopub-query-1.1/repo/" } } rows { name { value: "full" } } rows { quad { p_iri { prefix_id: 4 } o_iri { prefix_id: 15 } } } rows { name { value: "sparql" } } rows { quad { p_iri { prefix_id: 4 } o_literal { lex: "prefix rdfs: \nprefix dct: \nprefix np: \nprefix npa: \nprefix npx: \nprefix xsd: \nprefix wd: \nprefix schema: \nprefix schemaold: \nprefix foaf: \nprefix pav: \nprefix gen: \nprefix conf: \n\nselect ?title (concat(\n \'\',\n ?frags, \'\') as ?svg)\nwhere {\n {\n select ?day (group_concat(?frag; separator=\"\") as ?frags)\n (max(?ybot) as ?maxy) (max(?xright) as ?maxx)\n where {\n # ============ talk boxes ============\n {\n select ?day ?frag (?by + ?bh as ?ybot) (?bx + ?colw as ?xright)\n where {\n {\n select ?pres ?day ?room ?smin ?emin ?tlabel ?path ?ctxq ?fill ?stroke\n (group_concat(distinct ?aname; separator=\", \") as ?authors)\n where {\n graph npa:graph {\n ?np npa:hasValidSignatureForPublicKeyHash ?pk ;\n np:hasAssertion ?a ; npx:introduces ?pres ; dct:created ?cr .\n filter not exists { ?inv npx:invalidates ?np ; npa:hasValidSignatureForPublicKeyHash ?pk . }\n filter not exists { ?np npx:hasNanopubType npx:ExampleNanopub . }\n # latest-wins across signing keys: an override by another admin carries no npx:supersedes\n filter not exists {\n ?nw npx:introduces ?pres ; npa:hasValidSignatureForPublicKeyHash ?pkw ; dct:created ?crw .\n filter(?crw > ?cr)\n filter not exists { ?invw npx:invalidates ?nw ; npa:hasValidSignatureForPublicKeyHash ?pkw . }\n filter not exists { ?nw npx:hasNanopubType npx:ExampleNanopub . }\n }\n }\n filter not exists { graph ?sg { ?newer npx:supersedes ?np . } }\n {\n values ?_resource_multi_iri {}\n bind(?_resource_multi_iri as ?ev)\n } union {\n values ?_resource_multi_iri {}\n graph ?mg { ?_resource_multi_iri gen:isMaintainedBy ?ev }\n }\n # one pattern over a kind table instead of a union per kind: each union branch\n # re-ran the whole join, and this block is repeated ten times\n values (?kind ?rel ?path ?fill ?stroke) {\n (wd:Q604733 dct:isPartOf \"/part?id=\" \"#eaf1f8\" \"#9bb4cc\")\n (conf:Workshop gen:isSubSpaceOf \"/space?id=\" \"#fdf0e2\" \"#d9a55f\")\n (conf:Tutorial gen:isSubSpaceOf \"/space?id=\" \"#eef7ec\" \"#8fbf86\")\n (conf:Session gen:isSubSpaceOf \"/space?id=\" \"#f1ecf8\" \"#a58fc8\")\n }\n graph ?a { ?pres a ?kind ; ?rel ?ev . }\n bind(concat(\"&context=\", encode_for_uri(str(?ev))) as ?ctxq)\n optional { graph ?a { ?pres schema:startDate ?sdA } }\n optional { graph ?a { ?pres schemaold:startDate ?sdB } }\n optional { graph ?a { ?pres schema:endDate ?edA } }\n optional { graph ?a { ?pres schemaold:endDate ?edB } }\n optional { graph ?a { ?pres schema:location ?loA } }\n optional { graph ?a { ?pres schemaold:location ?loB } }\n optional { graph ?a { ?pres rdfs:label ?lb } }\n bind(coalesce(?sdA, ?sdB) as ?sd)\n filter(bound(?sd))\n bind(coalesce(?edA, ?edB) as ?ed)\n bind(coalesce(str(?loA), str(?loB), \"\") as ?room)\n bind(substr(str(?sd), 1, 10) as ?day)\n bind(xsd:integer(substr(str(?sd), 12, 2)) * 60 + xsd:integer(substr(str(?sd), 15, 2)) as ?smin)\n bind(coalesce(xsd:integer(substr(str(?ed), 12, 2)) * 60 + xsd:integer(substr(str(?ed), 15, 2)), ?smin + 30) as ?emin)\n bind(coalesce(str(?lb), \"(untitled)\") as ?tlabel)\n optional {\n graph ?a { ?pres pav:authoredBy ?ag }\n optional { graph ?pi2 { ?ag foaf:name ?agn } }\n bind(coalesce(?agn, replace(str(?ag), \"^.*/\", \"\")) as ?aname)\n }\n } group by ?pres ?day ?room ?smin ?emin ?tlabel ?path ?ctxq ?fill ?stroke\n }\n # Rank within the (day, room, slot) cell and how many share it, in ONE\n # self-join: with the sub-space branch added, a second pass over the base\n # pattern ran the query service out of budget (HTTP 503).\n {\n select ?pres (sum(if(?keyO <= ?keyR, 1, 0)) as ?rank)\n (count(distinct ?o) as ?nslot)\n where {\n # Each side is its own sub-select, joined on (day, room, start). Written as one\n # group with a filter, the engine re-evaluated the whole O side once per R row,\n # which took about 9s on its own; this way each side is computed once.\n { select ?pres ?dayR ?roomR ?sminR ?keyR where {\n graph npa:graph {\n ?npR npa:hasValidSignatureForPublicKeyHash ?pkR ;\n np:hasAssertion ?a2 ; npx:introduces ?pres ; dct:created ?crR .\n filter not exists { ?invR npx:invalidates ?npR ; npa:hasValidSignatureForPublicKeyHash ?pkR . }\n filter not exists { ?npR npx:hasNanopubType npx:ExampleNanopub . }\n # latest-wins across signing keys: an override by another admin carries no npx:supersedes\n filter not exists {\n ?nwR npx:introduces ?pres ; npa:hasValidSignatureForPublicKeyHash ?pkwR ; dct:created ?crwR .\n filter(?crwR > ?crR)\n filter not exists { ?invwR npx:invalidates ?nwR ; npa:hasValidSignatureForPublicKeyHash ?pkwR . }\n filter not exists { ?nwR npx:hasNanopubType npx:ExampleNanopub . }\n }\n }\n filter not exists { graph ?sgR { ?newerR npx:supersedes ?npR . } }\n {\n values ?_resource_multi_iri {}\n bind(?_resource_multi_iri as ?evR)\n } union {\n values ?_resource_multi_iri {}\n graph ?mgR { ?_resource_multi_iri gen:isMaintainedBy ?evR }\n }\n # one pattern over a kind table instead of a union per kind: each union branch\n # re-ran the whole join, and this block is repeated ten times\n values (?kind2 ?rel2 ?pathR ?fillR ?strokeR) {\n (wd:Q604733 dct:isPartOf \"/part?id=\" \"#eaf1f8\" \"#9bb4cc\")\n (conf:Workshop gen:isSubSpaceOf \"/space?id=\" \"#fdf0e2\" \"#d9a55f\")\n (conf:Tutorial gen:isSubSpaceOf \"/space?id=\" \"#eef7ec\" \"#8fbf86\")\n (conf:Session gen:isSubSpaceOf \"/space?id=\" \"#f1ecf8\" \"#a58fc8\")\n }\n graph ?a2 { ?pres a ?kind2 ; ?rel2 ?evR . }\n optional { graph ?a2 { ?pres schema:startDate ?sdAR } }\n optional { graph ?a2 { ?pres schemaold:startDate ?sdBR } }\n optional { graph ?a2 { ?pres schema:endDate ?edAR } }\n optional { graph ?a2 { ?pres schemaold:endDate ?edBR } }\n optional { graph ?a2 { ?pres schema:location ?loAR } }\n optional { graph ?a2 { ?pres schemaold:location ?loBR } }\n optional { graph ?a2 { ?pres rdfs:label ?lbR } }\n optional { graph ?a2 { ?pres schema:position ?psR } }\n bind(coalesce(?sdAR, ?sdBR) as ?sdR)\n filter(bound(?sdR))\n bind(coalesce(?edAR, ?edBR) as ?edR)\n bind(coalesce(str(?loAR), str(?loBR), \"\") as ?roomR)\n bind(substr(str(?sdR), 1, 10) as ?dayR)\n bind(xsd:integer(substr(str(?sdR), 12, 2)) * 60 + xsd:integer(substr(str(?sdR), 15, 2)) as ?sminR)\n bind(coalesce(xsd:integer(substr(str(?edR), 12, 2)) * 60 + xsd:integer(substr(str(?edR), 15, 2)), ?sminR + 30) as ?eminR)\n bind(coalesce(str(?lbR), \"(untitled)\") as ?tlabelR)\n bind(concat(str(1000 + coalesce(?psR, 999)), ?tlabelR) as ?keyR)\n } }\n { select ?o ?dayR ?roomR ?sminR ?keyO where { graph npa:graph {\n ?npO npa:hasValidSignatureForPublicKeyHash ?pkO ;\n np:hasAssertion ?ao ; npx:introduces ?o ; dct:created ?crO .\n filter not exists { ?invO npx:invalidates ?npO ; npa:hasValidSignatureForPublicKeyHash ?pkO . }\n filter not exists { ?npO npx:hasNanopubType npx:ExampleNanopub . }\n # latest-wins across signing keys: an override by another admin carries no npx:supersedes\n filter not exists {\n ?nwO npx:introduces ?o ; npa:hasValidSignatureForPublicKeyHash ?pkwO ; dct:created ?crwO .\n filter(?crwO > ?crO)\n filter not exists { ?invwO npx:invalidates ?nwO ; npa:hasValidSignatureForPublicKeyHash ?pkwO . }\n filter not exists { ?nwO npx:hasNanopubType npx:ExampleNanopub . }\n }\n }\n filter not exists { graph ?sgO { ?newerO npx:supersedes ?npO . } }\n {\n values ?_resource_multi_iri {}\n bind(?_resource_multi_iri as ?evO)\n } union {\n values ?_resource_multi_iri {}\n graph ?mgO { ?_resource_multi_iri gen:isMaintainedBy ?evO }\n }\n # one pattern over a kind table instead of a union per kind: each union branch\n # re-ran the whole join, and this block is repeated ten times\n values (?kindo ?relo ?pathO ?fillO ?strokeO) {\n (wd:Q604733 dct:isPartOf \"/part?id=\" \"#eaf1f8\" \"#9bb4cc\")\n (conf:Workshop gen:isSubSpaceOf \"/space?id=\" \"#fdf0e2\" \"#d9a55f\")\n (conf:Tutorial gen:isSubSpaceOf \"/space?id=\" \"#eef7ec\" \"#8fbf86\")\n (conf:Session gen:isSubSpaceOf \"/space?id=\" \"#f1ecf8\" \"#a58fc8\")\n }\n graph ?ao { ?o a ?kindo ; ?relo ?evO . }\n optional { graph ?ao { ?o schema:startDate ?sdAO } }\n optional { graph ?ao { ?o schemaold:startDate ?sdBO } }\n optional { graph ?ao { ?o schema:endDate ?edAO } }\n optional { graph ?ao { ?o schemaold:endDate ?edBO } }\n optional { graph ?ao { ?o schema:location ?loAO } }\n optional { graph ?ao { ?o schemaold:location ?loBO } }\n optional { graph ?ao { ?o rdfs:label ?lbO } }\n optional { graph ?ao { ?o schema:position ?psO } }\n bind(coalesce(?sdAO, ?sdBO) as ?sdO)\n filter(bound(?sdO))\n bind(coalesce(?edAO, ?edBO) as ?edO)\n bind(coalesce(str(?loAO), str(?loBO), \"\") as ?roomR)\n bind(substr(str(?sdO), 1, 10) as ?dayR)\n bind(xsd:integer(substr(str(?sdO), 12, 2)) * 60 + xsd:integer(substr(str(?sdO), 15, 2)) as ?sminR)\n bind(coalesce(xsd:integer(substr(str(?edO), 12, 2)) * 60 + xsd:integer(substr(str(?edO), 15, 2)), ?sminR + 30) as ?eminO)\n bind(coalesce(str(?lbO), \"(untitled)\") as ?tlabelO)\n bind(concat(str(1000 + coalesce(?psO, 999)), ?tlabelO) as ?keyO)\n } }\n } group by ?pres\n }\n # column index of the room\n {\n # the room\'s column index and the day\'s room count from one pass: the\n # conditional count is the old self-join, with the filter lifted so that the\n # same group also yields the total (as the rank/slot-count select does above)\n select ?day ?room (count(distinct if(str(?r2) <= str(?room), ?r2, ?room)) - 1 as ?col)\n (count(distinct ?r2) as ?ncol) where {\n { select distinct ?day ?room where {\n graph npa:graph {\n ?npC npa:hasValidSignatureForPublicKeyHash ?pkC ;\n np:hasAssertion ?ac1 ; npx:introduces ?c1 ; dct:created ?crC .\n filter not exists { ?invC npx:invalidates ?npC ; npa:hasValidSignatureForPublicKeyHash ?pkC . }\n filter not exists { ?npC npx:hasNanopubType npx:ExampleNanopub . }\n # latest-wins across signing keys: an override by another admin carries no npx:supersedes\n filter not exists {\n ?nwC npx:introduces ?c1 ; npa:hasValidSignatureForPublicKeyHash ?pkwC ; dct:created ?crwC .\n filter(?crwC > ?crC)\n filter not exists { ?invwC npx:invalidates ?nwC ; npa:hasValidSignatureForPublicKeyHash ?pkwC . }\n filter not exists { ?nwC npx:hasNanopubType npx:ExampleNanopub . }\n }\n }\n filter not exists { graph ?sgC { ?newerC npx:supersedes ?npC . } }\n {\n values ?_resource_multi_iri {}\n bind(?_resource_multi_iri as ?evC)\n } union {\n values ?_resource_multi_iri {}\n graph ?mgC { ?_resource_multi_iri gen:isMaintainedBy ?evC }\n }\n # one pattern over a kind table instead of a union per kind: each union branch\n # re-ran the whole join, and this block is repeated ten times\n values (?kindc1 ?relc1 ?pathC ?fillC ?strokeC) {\n (wd:Q604733 dct:isPartOf \"/part?id=\" \"#eaf1f8\" \"#9bb4cc\")\n (conf:Workshop gen:isSubSpaceOf \"/space?id=\" \"#fdf0e2\" \"#d9a55f\")\n (conf:Tutorial gen:isSubSpaceOf \"/space?id=\" \"#eef7ec\" \"#8fbf86\")\n (conf:Session gen:isSubSpaceOf \"/space?id=\" \"#f1ecf8\" \"#a58fc8\")\n }\n graph ?ac1 { ?c1 a ?kindc1 ; ?relc1 ?evC . }\n optional { graph ?ac1 { ?c1 schema:startDate ?sdAC } }\n optional { graph ?ac1 { ?c1 schemaold:startDate ?sdBC } }\n optional { graph ?ac1 { ?c1 schema:endDate ?edAC } }\n optional { graph ?ac1 { ?c1 schemaold:endDate ?edBC } }\n optional { graph ?ac1 { ?c1 schema:location ?loAC } }\n optional { graph ?ac1 { ?c1 schemaold:location ?loBC } }\n optional { graph ?ac1 { ?c1 rdfs:label ?lbC } }\n bind(coalesce(?sdAC, ?sdBC) as ?sdC)\n filter(bound(?sdC))\n bind(coalesce(?edAC, ?edBC) as ?edC)\n bind(coalesce(str(?loAC), str(?loBC), \"\") as ?room)\n bind(substr(str(?sdC), 1, 10) as ?day)\n bind(xsd:integer(substr(str(?sdC), 12, 2)) * 60 + xsd:integer(substr(str(?sdC), 15, 2)) as ?sminC)\n bind(coalesce(xsd:integer(substr(str(?edC), 12, 2)) * 60 + xsd:integer(substr(str(?edC), 15, 2)), ?sminC + 30) as ?eminC)\n bind(coalesce(str(?lbC), \"(untitled)\") as ?tlabelC) } }\n { select distinct ?dayD ?r2 where {\n graph npa:graph {\n ?npD npa:hasValidSignatureForPublicKeyHash ?pkD ;\n np:hasAssertion ?ac2 ; npx:introduces ?c2 ; dct:created ?crD .\n filter not exists { ?invD npx:invalidates ?npD ; npa:hasValidSignatureForPublicKeyHash ?pkD . }\n filter not exists { ?npD npx:hasNanopubType npx:ExampleNanopub . }\n # latest-wins across signing keys: an override by another admin carries no npx:supersedes\n filter not exists {\n ?nwD npx:introduces ?c2 ; npa:hasValidSignatureForPublicKeyHash ?pkwD ; dct:created ?crwD .\n filter(?crwD > ?crD)\n filter not exists { ?invwD npx:invalidates ?nwD ; npa:hasValidSignatureForPublicKeyHash ?pkwD . }\n filter not exists { ?nwD npx:hasNanopubType npx:ExampleNanopub . }\n }\n }\n filter not exists { graph ?sgD { ?newerD npx:supersedes ?npD . } }\n {\n values ?_resource_multi_iri {}\n bind(?_resource_multi_iri as ?evD)\n } union {\n values ?_resource_multi_iri {}\n graph ?mgD { ?_resource_multi_iri gen:isMaintainedBy ?evD }\n }\n # one pattern over a kind table instead of a union per kind: each union branch\n # re-ran the whole join, and this block is repeated ten times\n values (?kindc2 ?relc2 ?pathD ?fillD ?strokeD) {\n (wd:Q604733 dct:isPartOf \"/part?id=\" \"#eaf1f8\" \"#9bb4cc\")\n (conf:Workshop gen:isSubSpaceOf \"/space?id=\" \"#fdf0e2\" \"#d9a55f\")\n (conf:Tutorial gen:isSubSpaceOf \"/space?id=\" \"#eef7ec\" \"#8fbf86\")\n (conf:Session gen:isSubSpaceOf \"/space?id=\" \"#f1ecf8\" \"#a58fc8\")\n }\n graph ?ac2 { ?c2 a ?kindc2 ; ?relc2 ?evD . }\n optional { graph ?ac2 { ?c2 schema:startDate ?sdAD } }\n optional { graph ?ac2 { ?c2 schemaold:startDate ?sdBD } }\n optional { graph ?ac2 { ?c2 schema:endDate ?edAD } }\n optional { graph ?ac2 { ?c2 schemaold:endDate ?edBD } }\n optional { graph ?ac2 { ?c2 schema:location ?loAD } }\n optional { graph ?ac2 { ?c2 schemaold:location ?loBD } }\n optional { graph ?ac2 { ?c2 rdfs:label ?lbD } }\n bind(coalesce(?sdAD, ?sdBD) as ?sdD)\n filter(bound(?sdD))\n bind(coalesce(?edAD, ?edBD) as ?edD)\n bind(coalesce(str(?loAD), str(?loBD), \"\") as ?r2)\n bind(substr(str(?sdD), 1, 10) as ?dayD)\n bind(xsd:integer(substr(str(?sdD), 12, 2)) * 60 + xsd:integer(substr(str(?sdD), 15, 2)) as ?sminD)\n bind(coalesce(xsd:integer(substr(str(?edD), 12, 2)) * 60 + xsd:integer(substr(str(?edD), 15, 2)), ?sminD + 30) as ?eminD)\n bind(coalesce(str(?lbD), \"(untitled)\") as ?tlabelD) } }\n filter(?dayD = ?day)\n } group by ?day ?room\n }\n {\n select ?day (min(?sminY) as ?dstart) (max(?eminY) as ?dend) where {\n graph npa:graph {\n ?npY npa:hasValidSignatureForPublicKeyHash ?pkY ;\n np:hasAssertion ?ay1 ; npx:introduces ?y1 ; dct:created ?crY .\n filter not exists { ?invY npx:invalidates ?npY ; npa:hasValidSignatureForPublicKeyHash ?pkY . }\n filter not exists { ?npY npx:hasNanopubType npx:ExampleNanopub . }\n # latest-wins across signing keys: an override by another admin carries no npx:supersedes\n filter not exists {\n ?nwY npx:introduces ?y1 ; npa:hasValidSignatureForPublicKeyHash ?pkwY ; dct:created ?crwY .\n filter(?crwY > ?crY)\n filter not exists { ?invwY npx:invalidates ?nwY ; npa:hasValidSignatureForPublicKeyHash ?pkwY . }\n filter not exists { ?nwY npx:hasNanopubType npx:ExampleNanopub . }\n }\n }\n filter not exists { graph ?sgY { ?newerY npx:supersedes ?npY . } }\n {\n values ?_resource_multi_iri {}\n bind(?_resource_multi_iri as ?evY)\n } union {\n values ?_resource_multi_iri {}\n graph ?mgY { ?_resource_multi_iri gen:isMaintainedBy ?evY }\n }\n # one pattern over a kind table instead of a union per kind: each union branch\n # re-ran the whole join, and this block is repeated ten times\n values (?kindy1 ?rely1 ?pathY ?fillY ?strokeY) {\n (wd:Q604733 dct:isPartOf \"/part?id=\" \"#eaf1f8\" \"#9bb4cc\")\n (conf:Workshop gen:isSubSpaceOf \"/space?id=\" \"#fdf0e2\" \"#d9a55f\")\n (conf:Tutorial gen:isSubSpaceOf \"/space?id=\" \"#eef7ec\" \"#8fbf86\")\n (conf:Session gen:isSubSpaceOf \"/space?id=\" \"#f1ecf8\" \"#a58fc8\")\n }\n graph ?ay1 { ?y1 a ?kindy1 ; ?rely1 ?evY . }\n optional { graph ?ay1 { ?y1 schema:startDate ?sdAY } }\n optional { graph ?ay1 { ?y1 schemaold:startDate ?sdBY } }\n optional { graph ?ay1 { ?y1 schema:endDate ?edAY } }\n optional { graph ?ay1 { ?y1 schemaold:endDate ?edBY } }\n optional { graph ?ay1 { ?y1 schema:location ?loAY } }\n optional { graph ?ay1 { ?y1 schemaold:location ?loBY } }\n optional { graph ?ay1 { ?y1 rdfs:label ?lbY } }\n bind(coalesce(?sdAY, ?sdBY) as ?sdY)\n filter(bound(?sdY))\n bind(coalesce(?edAY, ?edBY) as ?edY)\n bind(coalesce(str(?loAY), str(?loBY), \"\") as ?roomY)\n bind(substr(str(?sdY), 1, 10) as ?day)\n bind(xsd:integer(substr(str(?sdY), 12, 2)) * 60 + xsd:integer(substr(str(?sdY), 15, 2)) as ?sminY)\n bind(coalesce(xsd:integer(substr(str(?edY), 12, 2)) * 60 + xsd:integer(substr(str(?edY), 15, 2)), ?sminY + 30) as ?eminY)\n bind(coalesce(str(?lbY), \"(untitled)\") as ?tlabelY)\n } group by ?day\n }\n # The figure is fitted to the panel it is shown in, which is at most 1320px\n # wide, so a figure wider than that is scaled down until its text is unreadable:\n # thirteen rooms at the fixed pitch of 176 came to 2346 units and 5.5px type.\n # The pitch is therefore divided out of a width budget as soon as a day has more\n # rooms than fit at 176, and the time axis is compressed as soon as the day runs\n # longer than the height budget. Seven rooms and 333 minutes still get the old\n # values, so every day that already fitted is drawn exactly as it was.\n bind(if(1232 / ?ncol < 176, xsd:integer(floor(1232 / ?ncol)), 176) as ?pitch)\n bind(?pitch - 6 as ?colw)\n bind(if(?dend > ?dstart, ?dend - ?dstart, 1) as ?dspan)\n bind(if(1000 / ?dspan < 3.0, floor(100000 / ?dspan) / 100, 3.0) as ?ppm)\n bind(56 + ?col * ?pitch as ?bx)\n bind(36 + (?smin - ?dstart + 15) * ?ppm as ?slotY)\n bind((?emin - ?smin) * ?ppm as ?slotH)\n bind(?slotY + (?rank - 1) * (?slotH / ?nslot) as ?by)\n bind(?slotH / ?nslot - 3 as ?bh)\n\n # Text budgets follow the column width now that it varies. 6.21px is the widest\n # character at font-size 10, measured against the real font; at the full column\n # width these come to the 25, 27 and 25 characters they were before. A narrow\n # column holds fewer characters per line, so the title wraps over as many as seven\n # lines rather than two, as many as the box is tall enough to hold. A line that had\n # to break inside a word resumes at the next character, not past a space that is\n # not there.\n bind(if(floor((?colw - 14) / 6.21) < 6, 6, xsd:integer(floor((?colw - 14) / 6.21))) as ?cap)\n bind(concat(\"^(.{0,\", str(?cap), \"})\\\\s.*$\") as ?wrapx)\n bind(replace(?tlabel, ?wrapx, \"$1\") as ?ln1raw)\n bind(if(strlen(?ln1raw) > ?cap, substr(?ln1raw, 1, ?cap), ?ln1raw) as ?ln1)\n bind(if(strlen(?tlabel) > strlen(?ln1),\n substr(?tlabel, strlen(?ln1) + if(substr(?tlabel, strlen(?ln1) + 1, 1) = \" \", 2, 1)), \"\") as ?rest1)\n bind(replace(?rest1, ?wrapx, \"$1\") as ?ln2raw)\n bind(if(strlen(?ln2raw) > ?cap, substr(?ln2raw, 1, ?cap), ?ln2raw) as ?ln2)\n bind(if(strlen(?rest1) > strlen(?ln2),\n substr(?rest1, strlen(?ln2) + if(substr(?rest1, strlen(?ln2) + 1, 1) = \" \", 2, 1)), \"\") as ?rest2)\n bind(replace(?rest2, ?wrapx, \"$1\") as ?ln3raw)\n bind(if(strlen(?ln3raw) > ?cap, substr(?ln3raw, 1, ?cap), ?ln3raw) as ?ln3)\n bind(if(strlen(?rest2) > strlen(?ln3),\n substr(?rest2, strlen(?ln3) + if(substr(?rest2, strlen(?ln3) + 1, 1) = \" \", 2, 1)), \"\") as ?rest3)\n bind(replace(?rest3, ?wrapx, \"$1\") as ?ln4raw)\n bind(if(strlen(?ln4raw) > ?cap, substr(?ln4raw, 1, ?cap), ?ln4raw) as ?ln4)\n bind(if(strlen(?rest3) > strlen(?ln4),\n substr(?rest3, strlen(?ln4) + if(substr(?rest3, strlen(?ln4) + 1, 1) = \" \", 2, 1)), \"\") as ?rest4)\n bind(replace(?rest4, ?wrapx, \"$1\") as ?ln5raw)\n bind(if(strlen(?ln5raw) > ?cap, substr(?ln5raw, 1, ?cap), ?ln5raw) as ?ln5)\n bind(if(strlen(?rest4) > strlen(?ln5),\n substr(?rest4, strlen(?ln5) + if(substr(?rest4, strlen(?ln5) + 1, 1) = \" \", 2, 1)), \"\") as ?rest5)\n bind(replace(?rest5, ?wrapx, \"$1\") as ?ln6raw)\n bind(if(strlen(?ln6raw) > ?cap, substr(?ln6raw, 1, ?cap), ?ln6raw) as ?ln6)\n bind(if(strlen(?rest5) > strlen(?ln6),\n substr(?rest5, strlen(?ln6) + if(substr(?rest5, strlen(?ln6) + 1, 1) = \" \", 2, 1)), \"\") as ?rest6)\n bind(replace(?rest6, ?wrapx, \"$1\") as ?ln7raw)\n bind(if(strlen(?ln7raw) > ?cap, substr(?ln7raw, 1, ?cap), ?ln7raw) as ?ln7)\n bind(if(strlen(?rest6) > strlen(?ln7),\n substr(?rest6, strlen(?ln7) + if(substr(?rest6, strlen(?ln7) + 1, 1) = \" \", 2, 1)), \"\") as ?rest7)\n # the same lines in the form that ends the text: an ellipsis where more remains,\n # replacing the last character rather than being appended past the cap\n bind(if(strlen(?rest2) > 0, concat(substr(?ln2, 1, ?cap - 1), \"\\u2026\"), ?ln2) as ?el2)\n bind(if(strlen(?rest3) > 0, concat(substr(?ln3, 1, ?cap - 1), \"\\u2026\"), ?ln3) as ?el3)\n bind(if(strlen(?rest4) > 0, concat(substr(?ln4, 1, ?cap - 1), \"\\u2026\"), ?ln4) as ?el4)\n bind(if(strlen(?rest5) > 0, concat(substr(?ln5, 1, ?cap - 1), \"\\u2026\"), ?ln5) as ?el5)\n bind(if(strlen(?rest6) > 0, concat(substr(?ln6, 1, ?cap - 1), \"\\u2026\"), ?ln6) as ?el6)\n bind(if(strlen(?rest7) > 0, concat(substr(?ln7, 1, ?cap - 1), \"\\u2026\"), ?ln7) as ?el7)\n bind(if(floor((?colw - 2) / 6.21) < 6, 6, xsd:integer(floor((?colw - 2) / 6.21))) as ?capl)\n bind(if(strlen(?tlabel) > ?capl, concat(substr(?tlabel, 1, ?capl - 1), \"\\u2026\"), ?tlabel) as ?l1c)\n bind(if(strlen(?authors) > ?cap,\n concat(replace(substr(?authors, 1, ?cap - 2), \",[^,]*$\", \"\"), \" \342\200\246\"),\n ?authors) as ?authShort)\n bind(concat(\n \'\',\n \'\',\n # Text adapts to the box: author line and up to seven title lines, one more\n # for every twelve pixels the box has beyond the first two (44px), one centred\n # title line with the full title and authors as a tooltip when there is room\n # only for that (13px), nothing below. Many parallel items in one slot (e.g. a\n # demo session) otherwise spill their text over each other. A wrapped box now\n # carries the full title as its tooltip too, since seven narrow lines can still\n # run out.\n if(?bh >= 44, concat(\n \'\',\n replace(replace(replace(?authShort, \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\',\n \'\', replace(replace(replace(?tlabel, \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), if(strlen(?authors) > 0, concat(\' \342\200\224 \', replace(replace(replace(?authors, \"&\", \"&\"), \"<\", \"<\"), \">\", \">\")), \'\'), \'\',\n \'\',\n \'\', replace(replace(replace(?ln1, \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\',\n if(strlen(?ln2) > 0, concat(\'\', replace(replace(replace(if(?bh >= 56, ?ln2, ?el2), \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\'), \'\'),\n if(?bh >= 56 && strlen(?ln3) > 0, concat(\'\', replace(replace(replace(if(?bh >= 68, ?ln3, ?el3), \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\'), \'\'),\n if(?bh >= 68 && strlen(?ln4) > 0, concat(\'\', replace(replace(replace(if(?bh >= 80, ?ln4, ?el4), \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\'), \'\'),\n if(?bh >= 80 && strlen(?ln5) > 0, concat(\'\', replace(replace(replace(if(?bh >= 92, ?ln5, ?el5), \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\'), \'\'),\n if(?bh >= 92 && strlen(?ln6) > 0, concat(\'\', replace(replace(replace(if(?bh >= 104, ?ln6, ?el6), \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\'), \'\'),\n if(?bh >= 104 && strlen(?ln7) > 0, concat(\'\', replace(replace(replace(?el7, \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\'), \'\'),\n \'\'),\n if(?bh >= 13, concat(\n \'\', replace(replace(replace(?tlabel, \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), if(strlen(?authors) > 0, concat(\' \342\200\224 \', replace(replace(replace(?authors, \"&\", \"&\"), \"<\", \"<\"), \">\", \">\")), \'\'), \'\',\n \'\',\n replace(replace(replace(?l1c, \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\'), \'\')),\n \'\') as ?frag)\n }\n }\n union\n # ============ room headers ============\n {\n select ?day ?frag (0 as ?ybot) (?hx + ?hcolw as ?xright)\n where {\n {\n select distinct ?day ?room where {\n graph npa:graph {\n ?npH npa:hasValidSignatureForPublicKeyHash ?pkH ;\n np:hasAssertion ?ah1 ; npx:introduces ?h1 ; dct:created ?crH .\n filter not exists { ?invH npx:invalidates ?npH ; npa:hasValidSignatureForPublicKeyHash ?pkH . }\n filter not exists { ?npH npx:hasNanopubType npx:ExampleNanopub . }\n # latest-wins across signing keys: an override by another admin carries no npx:supersedes\n filter not exists {\n ?nwH npx:introduces ?h1 ; npa:hasValidSignatureForPublicKeyHash ?pkwH ; dct:created ?crwH .\n filter(?crwH > ?crH)\n filter not exists { ?invwH npx:invalidates ?nwH ; npa:hasValidSignatureForPublicKeyHash ?pkwH . }\n filter not exists { ?nwH npx:hasNanopubType npx:ExampleNanopub . }\n }\n }\n filter not exists { graph ?sgH { ?newerH npx:supersedes ?npH . } }\n {\n values ?_resource_multi_iri {}\n bind(?_resource_multi_iri as ?evH)\n } union {\n values ?_resource_multi_iri {}\n graph ?mgH { ?_resource_multi_iri gen:isMaintainedBy ?evH }\n }\n # one pattern over a kind table instead of a union per kind: each union branch\n # re-ran the whole join, and this block is repeated ten times\n values (?kindh1 ?relh1 ?pathH ?fillH ?strokeH) {\n (wd:Q604733 dct:isPartOf \"/part?id=\" \"#eaf1f8\" \"#9bb4cc\")\n (conf:Workshop gen:isSubSpaceOf \"/space?id=\" \"#fdf0e2\" \"#d9a55f\")\n (conf:Tutorial gen:isSubSpaceOf \"/space?id=\" \"#eef7ec\" \"#8fbf86\")\n (conf:Session gen:isSubSpaceOf \"/space?id=\" \"#f1ecf8\" \"#a58fc8\")\n }\n graph ?ah1 { ?h1 a ?kindh1 ; ?relh1 ?evH . }\n optional { graph ?ah1 { ?h1 schema:startDate ?sdAH } }\n optional { graph ?ah1 { ?h1 schemaold:startDate ?sdBH } }\n optional { graph ?ah1 { ?h1 schema:endDate ?edAH } }\n optional { graph ?ah1 { ?h1 schemaold:endDate ?edBH } }\n optional { graph ?ah1 { ?h1 schema:location ?loAH } }\n optional { graph ?ah1 { ?h1 schemaold:location ?loBH } }\n optional { graph ?ah1 { ?h1 rdfs:label ?lbH } }\n bind(coalesce(?sdAH, ?sdBH) as ?sdH)\n filter(bound(?sdH))\n bind(coalesce(?edAH, ?edBH) as ?edH)\n bind(coalesce(str(?loAH), str(?loBH), \"\") as ?room)\n bind(substr(str(?sdH), 1, 10) as ?day)\n bind(xsd:integer(substr(str(?sdH), 12, 2)) * 60 + xsd:integer(substr(str(?sdH), 15, 2)) as ?sminH)\n bind(coalesce(xsd:integer(substr(str(?edH), 12, 2)) * 60 + xsd:integer(substr(str(?edH), 15, 2)), ?sminH + 30) as ?eminH)\n bind(coalesce(str(?lbH), \"(untitled)\") as ?tlabelH) }\n }\n {\n select ?day ?room (count(distinct if(str(?r3) <= str(?room), ?r3, ?room)) - 1 as ?hcol)\n (count(distinct ?r3) as ?nhcol) where {\n { select distinct ?day ?room where {\n graph npa:graph {\n ?npE npa:hasValidSignatureForPublicKeyHash ?pkE ;\n np:hasAssertion ?ae1 ; npx:introduces ?e1 ; dct:created ?crE .\n filter not exists { ?invE npx:invalidates ?npE ; npa:hasValidSignatureForPublicKeyHash ?pkE . }\n filter not exists { ?npE npx:hasNanopubType npx:ExampleNanopub . }\n # latest-wins across signing keys: an override by another admin carries no npx:supersedes\n filter not exists {\n ?nwE npx:introduces ?e1 ; npa:hasValidSignatureForPublicKeyHash ?pkwE ; dct:created ?crwE .\n filter(?crwE > ?crE)\n filter not exists { ?invwE npx:invalidates ?nwE ; npa:hasValidSignatureForPublicKeyHash ?pkwE . }\n filter not exists { ?nwE npx:hasNanopubType npx:ExampleNanopub . }\n }\n }\n filter not exists { graph ?sgE { ?newerE npx:supersedes ?npE . } }\n {\n values ?_resource_multi_iri {}\n bind(?_resource_multi_iri as ?evE)\n } union {\n values ?_resource_multi_iri {}\n graph ?mgE { ?_resource_multi_iri gen:isMaintainedBy ?evE }\n }\n # one pattern over a kind table instead of a union per kind: each union branch\n # re-ran the whole join, and this block is repeated ten times\n values (?kinde1 ?rele1 ?pathE ?fillE ?strokeE) {\n (wd:Q604733 dct:isPartOf \"/part?id=\" \"#eaf1f8\" \"#9bb4cc\")\n (conf:Workshop gen:isSubSpaceOf \"/space?id=\" \"#fdf0e2\" \"#d9a55f\")\n (conf:Tutorial gen:isSubSpaceOf \"/space?id=\" \"#eef7ec\" \"#8fbf86\")\n (conf:Session gen:isSubSpaceOf \"/space?id=\" \"#f1ecf8\" \"#a58fc8\")\n }\n graph ?ae1 { ?e1 a ?kinde1 ; ?rele1 ?evE . }\n optional { graph ?ae1 { ?e1 schema:startDate ?sdAE } }\n optional { graph ?ae1 { ?e1 schemaold:startDate ?sdBE } }\n optional { graph ?ae1 { ?e1 schema:endDate ?edAE } }\n optional { graph ?ae1 { ?e1 schemaold:endDate ?edBE } }\n optional { graph ?ae1 { ?e1 schema:location ?loAE } }\n optional { graph ?ae1 { ?e1 schemaold:location ?loBE } }\n optional { graph ?ae1 { ?e1 rdfs:label ?lbE } }\n bind(coalesce(?sdAE, ?sdBE) as ?sdE)\n filter(bound(?sdE))\n bind(coalesce(?edAE, ?edBE) as ?edE)\n bind(coalesce(str(?loAE), str(?loBE), \"\") as ?room)\n bind(substr(str(?sdE), 1, 10) as ?day)\n bind(xsd:integer(substr(str(?sdE), 12, 2)) * 60 + xsd:integer(substr(str(?sdE), 15, 2)) as ?sminE)\n bind(coalesce(xsd:integer(substr(str(?edE), 12, 2)) * 60 + xsd:integer(substr(str(?edE), 15, 2)), ?sminE + 30) as ?eminE)\n bind(coalesce(str(?lbE), \"(untitled)\") as ?tlabelE) } }\n { select distinct ?dayF ?r3 where {\n graph npa:graph {\n ?npF npa:hasValidSignatureForPublicKeyHash ?pkF ;\n np:hasAssertion ?ae2 ; npx:introduces ?e2 ; dct:created ?crF .\n filter not exists { ?invF npx:invalidates ?npF ; npa:hasValidSignatureForPublicKeyHash ?pkF . }\n filter not exists { ?npF npx:hasNanopubType npx:ExampleNanopub . }\n # latest-wins across signing keys: an override by another admin carries no npx:supersedes\n filter not exists {\n ?nwF npx:introduces ?e2 ; npa:hasValidSignatureForPublicKeyHash ?pkwF ; dct:created ?crwF .\n filter(?crwF > ?crF)\n filter not exists { ?invwF npx:invalidates ?nwF ; npa:hasValidSignatureForPublicKeyHash ?pkwF . }\n filter not exists { ?nwF npx:hasNanopubType npx:ExampleNanopub . }\n }\n }\n filter not exists { graph ?sgF { ?newerF npx:supersedes ?npF . } }\n {\n values ?_resource_multi_iri {}\n bind(?_resource_multi_iri as ?evF)\n } union {\n values ?_resource_multi_iri {}\n graph ?mgF { ?_resource_multi_iri gen:isMaintainedBy ?evF }\n }\n # one pattern over a kind table instead of a union per kind: each union branch\n # re-ran the whole join, and this block is repeated ten times\n values (?kinde2 ?rele2 ?pathF ?fillF ?strokeF) {\n (wd:Q604733 dct:isPartOf \"/part?id=\" \"#eaf1f8\" \"#9bb4cc\")\n (conf:Workshop gen:isSubSpaceOf \"/space?id=\" \"#fdf0e2\" \"#d9a55f\")\n (conf:Tutorial gen:isSubSpaceOf \"/space?id=\" \"#eef7ec\" \"#8fbf86\")\n (conf:Session gen:isSubSpaceOf \"/space?id=\" \"#f1ecf8\" \"#a58fc8\")\n }\n graph ?ae2 { ?e2 a ?kinde2 ; ?rele2 ?evF . }\n optional { graph ?ae2 { ?e2 schema:startDate ?sdAF } }\n optional { graph ?ae2 { ?e2 schemaold:startDate ?sdBF } }\n optional { graph ?ae2 { ?e2 schema:endDate ?edAF } }\n optional { graph ?ae2 { ?e2 schemaold:endDate ?edBF } }\n optional { graph ?ae2 { ?e2 schema:location ?loAF } }\n optional { graph ?ae2 { ?e2 schemaold:location ?loBF } }\n optional { graph ?ae2 { ?e2 rdfs:label ?lbF } }\n bind(coalesce(?sdAF, ?sdBF) as ?sdF)\n filter(bound(?sdF))\n bind(coalesce(?edAF, ?edBF) as ?edF)\n bind(coalesce(str(?loAF), str(?loBF), \"\") as ?r3)\n bind(substr(str(?sdF), 1, 10) as ?dayF)\n bind(xsd:integer(substr(str(?sdF), 12, 2)) * 60 + xsd:integer(substr(str(?sdF), 15, 2)) as ?sminF)\n bind(coalesce(xsd:integer(substr(str(?edF), 12, 2)) * 60 + xsd:integer(substr(str(?edF), 15, 2)), ?sminF + 30) as ?eminF)\n bind(coalesce(str(?lbF), \"(untitled)\") as ?tlabelF) } }\n filter(?dayF = ?day)\n } group by ?day ?room\n }\n bind(if(1232 / ?nhcol < 176, xsd:integer(floor(1232 / ?nhcol)), 176) as ?hpitch)\n bind(?hpitch - 6 as ?hcolw)\n bind(56 + ?hcol * ?hpitch as ?hx)\n # 6.83px is the widest character at font-size 11 and 5.59px at font-size 9: a room\n # name that no longer fits a narrowed header goes onto two smaller lines instead.\n bind(if(floor((?hcolw - 8) / 6.83) < 4, 4, xsd:integer(floor((?hcolw - 8) / 6.83))) as ?hcap)\n bind(if(floor((?hcolw - 6) / 5.59) < 4, 4, xsd:integer(floor((?hcolw - 6) / 5.59))) as ?hcap9)\n bind(concat(\"^(.{0,\", str(?hcap9), \"})\\\\s.*$\") as ?hwrapx)\n bind(replace(?room, ?hwrapx, \"$1\") as ?hd1raw)\n bind(if(strlen(?hd1raw) > ?hcap9, substr(?hd1raw, 1, ?hcap9), ?hd1raw) as ?hd1)\n bind(if(strlen(?room) > strlen(?hd1), substr(?room, strlen(?hd1) + 2), \"\") as ?hd2raw)\n bind(if(strlen(?hd2raw) > ?hcap9, concat(substr(?hd2raw, 1, ?hcap9 - 1), \"\\u2026\"), ?hd2raw) as ?hd2)\n bind(concat(\n \'\',\n if(strlen(?room) <= ?hcap,\n concat(\'\',\n replace(replace(replace(?room, \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\'),\n concat(\'\',\n replace(replace(replace(?hd1, \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\',\n \'\',\n replace(replace(replace(?hd2, \"&\", \"&\"), \"<\", \"<\"), \">\", \">\"), \'\'))) as ?frag)\n }\n }\n union\n # ============ hour labels on the left ============\n {\n select ?day ?frag (0 as ?ybot) (0 as ?xright)\n where {\n {\n select ?day (min(?smin) as ?first) (max(?emin) as ?last) where {\n graph npa:graph {\n ?npT npa:hasValidSignatureForPublicKeyHash ?pkT ;\n np:hasAssertion ?at1 ; npx:introduces ?t1 ; dct:created ?crT .\n filter not exists { ?invT npx:invalidates ?npT ; npa:hasValidSignatureForPublicKeyHash ?pkT . }\n filter not exists { ?npT npx:hasNanopubType npx:ExampleNanopub . }\n # latest-wins across signing keys: an override by another admin carries no npx:supersedes\n filter not exists {\n ?nwT npx:introduces ?t1 ; npa:hasValidSignatureForPublicKeyHash ?pkwT ; dct:created ?crwT .\n filter(?crwT > ?crT)\n filter not exists { ?invwT npx:invalidates ?nwT ; npa:hasValidSignatureForPublicKeyHash ?pkwT . }\n filter not exists { ?nwT npx:hasNanopubType npx:ExampleNanopub . }\n }\n }\n filter not exists { graph ?sgT { ?newerT npx:supersedes ?npT . } }\n {\n values ?_resource_multi_iri {}\n bind(?_resource_multi_iri as ?evT)\n } union {\n values ?_resource_multi_iri {}\n graph ?mgT { ?_resource_multi_iri gen:isMaintainedBy ?evT }\n }\n # one pattern over a kind table instead of a union per kind: each union branch\n # re-ran the whole join, and this block is repeated ten times\n values (?kindt1 ?relt1 ?pathT ?fillT ?strokeT) {\n (wd:Q604733 dct:isPartOf \"/part?id=\" \"#eaf1f8\" \"#9bb4cc\")\n (conf:Workshop gen:isSubSpaceOf \"/space?id=\" \"#fdf0e2\" \"#d9a55f\")\n (conf:Tutorial gen:isSubSpaceOf \"/space?id=\" \"#eef7ec\" \"#8fbf86\")\n (conf:Session gen:isSubSpaceOf \"/space?id=\" \"#f1ecf8\" \"#a58fc8\")\n }\n graph ?at1 { ?t1 a ?kindt1 ; ?relt1 ?evT . }\n optional { graph ?at1 { ?t1 schema:startDate ?sdAT } }\n optional { graph ?at1 { ?t1 schemaold:startDate ?sdBT } }\n optional { graph ?at1 { ?t1 schema:endDate ?edAT } }\n optional { graph ?at1 { ?t1 schemaold:endDate ?edBT } }\n optional { graph ?at1 { ?t1 schema:location ?loAT } }\n optional { graph ?at1 { ?t1 schemaold:location ?loBT } }\n optional { graph ?at1 { ?t1 rdfs:label ?lbT } }\n bind(coalesce(?sdAT, ?sdBT) as ?sdT)\n filter(bound(?sdT))\n bind(coalesce(?edAT, ?edBT) as ?edT)\n bind(coalesce(str(?loAT), str(?loBT), \"\") as ?roomT)\n bind(substr(str(?sdT), 1, 10) as ?day)\n bind(xsd:integer(substr(str(?sdT), 12, 2)) * 60 + xsd:integer(substr(str(?sdT), 15, 2)) as ?smin)\n bind(coalesce(xsd:integer(substr(str(?edT), 12, 2)) * 60 + xsd:integer(substr(str(?edT), 15, 2)), ?smin + 30) as ?emin)\n bind(coalesce(str(?lbT), \"(untitled)\") as ?tlabelT)\n } group by ?day\n }\n values ?hr { 8 9 10 11 12 13 14 15 16 17 18 19 20 }\n filter(?hr * 60 >= ?first - 60 && ?hr * 60 <= ?last + 60)\n bind(if(?last > ?first, ?last - ?first, 1) as ?hspan)\n bind(if(1000 / ?hspan < 3.0, floor(100000 / ?hspan) / 100, 3.0) as ?ppm)\n bind(36 + (?hr * 60 - ?first + 15) * ?ppm as ?hy)\n bind(concat(\n \'\',\n if(?hr < 10, concat(\"0\", str(?hr)), str(?hr)), \':00\',\n \'\') as ?frag)\n }\n }\n } group by ?day\n }\n bind(?day as ?title)\n bind(?maxx + 8 as ?w)\n bind(?maxy + 16 as ?h)\n}\norder by ?title" } } } rows { name { value: "wasAttributedTo" } } rows { name { value: "0000-0002-1267-0234" } } rows { quad { s_iri { prefix_id: 2 name_id: 4 } p_iri { prefix_id: 11 name_id: 21 } o_iri { prefix_id: 10 } g_iri { prefix_id: 2 name_id: 7 } } } rows { name { value: "name" } } rows { quad { s_iri { prefix_id: 10 name_id: 22 } p_iri { prefix_id: 12 } o_literal { lex: "Tobias Kuhn" } g_iri { prefix_id: 2 name_id: 9 } } } rows { name { value: "created" } } rows { datatype { value: "http://www.w3.org/2001/XMLSchema#dateTime" } } rows { quad { s_iri { prefix_id: 1 name_id: 1 } p_iri { prefix_id: 5 name_id: 24 } o_literal { lex: "2026-10-09T18:02:20Z" datatype: 1 } } } rows { name { value: "creator" } } rows { quad { p_iri { } o_iri { prefix_id: 10 name_id: 22 } } } rows { prefix { value: "https://creativecommons.org/licenses/by/4.0/" } } rows { quad { p_iri { prefix_id: 5 name_id: 14 } o_iri { prefix_id: 16 name_id: 2 } } } rows { name { value: "embeds" } } rows { quad { p_iri { prefix_id: 7 name_id: 26 } o_iri { prefix_id: 2 name_id: 12 } } } rows { name { value: "supersedes" } } rows { name { value: "RAs5Ka5C8Ncx63siVnl_tYhXsov5kB5GPI63AdXJXAsG4" } } rows { quad { p_iri { prefix_id: 7 name_id: 27 } o_iri { prefix_id: 1 } } } rows { quad { p_iri { prefix_id: 9 name_id: 17 } o_literal { lex: "Get the schedule of an event as an SVG grid" } } } rows { name { value: "wasCreatedFromProvenanceTemplate" } } rows { prefix { id: 8 value: "http://purl.org/np/" } } rows { name { value: "RANwQa4ICWS5SOjw7gp99nBpXBasapwtZF1fIM3H2gYTM" } } rows { quad { p_iri { prefix_id: 6 name_id: 29 } o_iri { prefix_id: 8 } } } rows { name { value: "wasCreatedFromPubinfoTemplate" } } rows { name { value: "RA-N4_kFxcruvBTlo1yJv29E4SLOXsx5KO_th69PprMrA" } } rows { quad { p_iri { prefix_id: 6 } o_iri { prefix_id: 1 } } } rows { name { value: "RACJ58Gvyn91LqCKIO9zu1eijDQIeEff28iyDrJgjSJF8" } } rows { quad { o_iri { } } } rows { name { value: "RARJj78P72NR5edKOnu_f4ePE9NYYuW2m2pM-fEoobMBk" } } rows { quad { o_iri { } } } rows { name { value: "RAoTD7udB2KtUuOuAe74tJi1t3VzK0DyWS7rYVAq1GRvw" } } rows { quad { o_iri { } } } rows { name { value: "wasCreatedFromTemplate" } } rows { name { value: "RAEFAt-QcFK0ZhqfvlsmS10BnzGJA0xwOICZXkO-ai87k" } } rows { quad { p_iri { prefix_id: 6 } o_iri { prefix_id: 1 } } } rows { name { value: "sig" } } rows { name { value: "hasAlgorithm" } } rows { quad { s_iri { prefix_id: 2 } p_iri { prefix_id: 7 } o_literal { lex: "RSA" } } } rows { name { value: "hasPublicKey" } } rows { quad { p_iri { } o_literal { lex: "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCwUtewGCpT5vIfXYE1bmf/Uqu1ojqnWdYxv+ySO80ul8Gu7m8KoyPAwuvaPj0lvPtHrg000qMmkxzKhYknEjq8v7EerxZNYp5B3/3+5ZpuWOYAs78UnQVjbHSmDdmryr4D4VvvNIiUmd0yxci47dTFUj4DvfHnGd6hVe5+goqdcwIDAQAB" } } } rows { name { value: "hasSignature" } } rows { quad { p_iri { } o_literal { lex: "D6sDIkQR2hgL4/r414Uedr85RRvncQAP2W5GGT0HEREYc59qUyLmeYgHrQ5sMecU96s4ULwwTgbwaf44S+10f577OaXLMiOO2tD1M6/s7CIM8JJtIV82HmTabJ+TDW5nRjtPt6xHO9MWZjE09hlR7sxxvj9pHR1h7rSF7F6Lzl4=" } } } rows { name { value: "hasSignatureTarget" } } rows { quad { p_iri { } o_iri { prefix_id: 1 name_id: 1 } } } rows { name { value: "signedBy" } } rows { quad { p_iri { prefix_id: 7 name_id: 43 } o_iri { prefix_id: 10 name_id: 22 } } }