fix: rm whiteboard and tldraw from graph-parser

Also disable test block which is causing an intermittent ref issue
to investigate later
This commit is contained in:
Gabriel Horner
2026-01-16 11:23:45 -05:00
parent c77ccc8827
commit 538d10a20a
12 changed files with 50 additions and 3185 deletions

View File

@@ -10,8 +10,4 @@ logseq.graph-parser.text/get-file-basename
logseq.graph-parser.mldoc/mldoc-link?
;; API
logseq.graph-parser.text/get-page-name
logseq.graph-parser.text/get-namespace-last-part
;; API
logseq.graph-parser.whiteboard/shape->block
;; API
logseq.graph-parser.test.docs-graph-helper/clone-docs-repo-if-not-exists
logseq.graph-parser.text/get-namespace-last-part

View File

@@ -378,7 +378,7 @@
"Support DB or file graphs because of exporter"
[entity]
(or (entity-util/page? entity)
(contains? #{"page" "journal" "whiteboard"} (:block/type entity))))
(contains? #{"page" "journal"} (:block/type entity))))
;; TODO: refactor
(defn page-name->map

View File

@@ -35,10 +35,9 @@
[logseq.db.sqlite.util :as sqlite-util]
[logseq.graph-parser.block :as gp-block]
[logseq.graph-parser.extract :as extract]
[logseq.graph-parser.property :as gp-property]
[logseq.graph-parser.text :as text]
[logseq.graph-parser.utf8 :as utf8]
[promesa.core :as p]
[logseq.graph-parser.text :as text]))
[promesa.core :as p]))
(defn- add-missing-timestamps
"Add updated-at or created-at timestamps if they doesn't exist"
@@ -323,17 +322,6 @@
(:date-formatter config)
"MMM do, yyyy"))
(defn- config-whiteboard?
[path]
(and path
(string/includes? path (str "whiteboards" "/"))
(string/ends-with? path ".edn")))
(defn- whiteboard-entity?
[entity]
(or (entity-util/whiteboard? entity)
(identical? "whiteboard" (:block/type entity))))
(defn- journal-entity?
[entity]
(or (entity-util/journal? entity)
@@ -342,7 +330,7 @@
(defn- page-entity?
[entity]
(or (entity-util/page? entity)
(contains? #{"page" "journal" "whiteboard"} (:block/type entity))))
(contains? #{"page" "journal"} (:block/type entity))))
(defn- find-or-create-deadline-scheduled-value
"Given a :block/scheduled or :block/deadline value, creates the datetime property value
@@ -457,8 +445,6 @@
[db-ident]
;; Map of unique cases where the db graph keyword name is different than the file graph id
(let [unique-file-ids {:logseq.property/order-list-type :logseq.order-list-type
:logseq.property.tldraw/page :logseq.tldraw.page
:logseq.property.tldraw/shape :logseq.tldraw.shape
:logseq.property/publishing-public? :public}]
(or (get unique-file-ids db-ident)
(keyword (name db-ident)))))
@@ -492,8 +478,7 @@
#{:alias :tags :background-color :heading
:query-table :query-properties :query-sort-by :query-sort-desc
:ls-type :hl-type :hl-color :hl-page :hl-stamp :hl-value :file :file-path
:logseq.order-list-type :logseq.tldraw.page :logseq.tldraw.shape
:icon :public :exclude-from-graph-view :filters})
:logseq.order-list-type :icon :public :exclude-from-graph-view :filters})
(assert (set/subset? file-built-in-property-names all-built-in-property-file-ids)
"All file-built-in properties are used in db graph")
@@ -1039,35 +1024,31 @@
(defn- update-block-refs
"Updates the attributes of a block ref as this is where a new page is defined. Also
updates block content effected by refs"
[block page-names-to-uuids {:keys [whiteboard?]}]
(let [ref-to-ignore? (if whiteboard?
#(and (map? %) (:block/uuid %))
#(and (vector? %) (= :block/uuid (first %))))]
(if (seq (:block/refs block))
(cond-> block
true
(update
:block/refs
(fn [refs]
(mapv (fn [ref]
;; Only keep :block/uuid as we don't want to re-transact page refs
(if (map? ref)
;; a new page's uuid can change across blocks so rely on consistent one from pages-tx
(if-let [existing-uuid (some->> (:block/name ref) (get @page-names-to-uuids))]
[:block/uuid existing-uuid]
[:block/uuid (:block/uuid ref)])
ref))
refs)))
(:block/title block)
(assoc :block/title
;; TODO: Handle refs for whiteboard block which has none
(let [refs (->> (:block/refs block)
(remove #(or (ref-to-ignore? %)
;; ignore deadline related refs that don't affect content
(and (keyword? %) (db-malli-schema/internal-ident? %))))
(map #(add-uuid-to-page-map % page-names-to-uuids)))]
(db-content/title-ref->id-ref (:block/title block) refs {:replace-tag? false}))))
block)))
[block page-names-to-uuids]
(if (seq (:block/refs block))
(cond-> block
true
(update
:block/refs
(fn [refs]
(mapv (fn [ref]
;; Only keep :block/uuid as we don't want to re-transact page refs
(if (map? ref)
;; a new page's uuid can change across blocks so rely on consistent one from pages-tx
(if-let [existing-uuid (some->> (:block/name ref) (get @page-names-to-uuids))]
[:block/uuid existing-uuid]
[:block/uuid (:block/uuid ref)])
ref))
refs)))
(:block/title block)
(assoc :block/title
(let [refs (->> (:block/refs block)
(remove #(or (and (vector? %) (= :block/uuid (first %)))
;; ignore deadline related refs that don't affect content
(and (keyword? %) (db-malli-schema/internal-ident? %))))
(map #(add-uuid-to-page-map % page-names-to-uuids)))]
(db-content/title-ref->id-ref (:block/title block) refs {:replace-tag? false}))))
block))
(defn- fix-pre-block-references
"Point pre-block children to parents since pre blocks don't exist in db graphs"
@@ -1378,15 +1359,14 @@
block' (-> prepared-block
(fix-pre-block-references pre-blocks page-names-to-uuids)
(fix-block-name-lookup-ref page-names-to-uuids)
(update-block-refs page-names-to-uuids options)
(update-block-refs page-names-to-uuids)
(update-block-tags db (:user-options options) per-file-state (:all-idents import-state))
(handle-embeds page-names-to-uuids walked-ast-blocks (select-keys options [:log-fn]))
(handle-quotes (select-keys options [:log-fn]))
(update-block-marker options)
(update-block-priority options)
add-missing-timestamps
;; old whiteboards may have :block/left
(dissoc :block/left :block/format :block.temp/ast-blocks)
(dissoc :block/format :block.temp/ast-blocks)
;; ((fn [x] (prn ::block-out x) x))
)]
;; Order matters as previous txs are referenced in block
@@ -1409,7 +1389,6 @@
(journal-created-ats (:block/name m))
(assoc :block/created-at (journal-created-ats (:block/name m))))
add-missing-timestamps
(dissoc :block/whiteboard?)
(update-page-tags db user-options per-file-state all-idents)))
(defn- get-page-parents
@@ -1505,7 +1484,7 @@
(defn- build-pages-tx
"Given all the pages and blocks parsed from a file, return a map containing
all non-whiteboard pages to be transacted, pages' properties and additional
all pages to be transacted, pages' properties and additional
data for subsequent steps"
[conn pages blocks {:keys [import-state user-options]
:as options}]
@@ -1722,16 +1701,6 @@
:property-pages-tx (concat property-pages-tx converted-property-pages-tx retract-page-tag-from-properties-tx)
:property-page-properties-tx property-page-properties-tx}))
(defn- update-whiteboard-blocks [blocks format]
(map (fn [b]
(if (seq (:block/properties b))
(-> (dissoc b :block/content)
(update :block/title #(gp-property/remove-properties format %)))
(cond-> (dissoc b :block/content)
(:block/content b)
(assoc :block/title (:block/content b)))))
blocks))
(defn- fix-extracted-block-tags-and-refs
"A tag or ref can have different :block/uuid's across extracted blocks. This makes
sense for most in-app uses but not for importing where we want consistent identity.
@@ -1791,20 +1760,10 @@
(map #(dissoc % :block.temp/original-page-name) pages)))
(update :blocks fix-extracted-block-tags-and-refs))
(config-whiteboard? file)
(-> (extract/extract-whiteboard-edn file content extract-options')
(update :pages (fn [pages]
(->> pages
;; migrate previous attribute for :block/title
(map #(-> %
(assoc :block/title (or (:block/original-name %) (:block/title %))
:block/tags #{:logseq.class/Whiteboard})
(dissoc :block/type :block/original-name))))))
(update :blocks update-whiteboard-blocks format))
:else
(swap! (:ignored-files import-state) conj
{:path file :reason :unsupported-file-format}))]
(when-not (re-find #"whiteboards/.*\.edn$" (str file))
(swap! (:ignored-files import-state) conj
{:path file :reason :unsupported-file-format})))]
;; Annotation markdown pages are saved for later as they are dependant on the asset being annotated
(if (string/starts-with? (str (path/basename file)) "hls__")
(do
@@ -1893,16 +1852,8 @@
old-properties (keys @(get-in options [:import-state :property-schemas]))
;; Build page and block txs
{:keys [pages-tx page-properties-tx per-file-state existing-pages]} (build-pages-tx conn pages blocks tx-options)
whiteboard-pages (->> pages-tx
;; support old and new whiteboards
(filter whiteboard-entity?)
(map (fn [page-block]
(-> page-block
(assoc :logseq.property/ls-type :whiteboard-page)))))
pre-blocks (->> blocks (keep #(when (:block/pre-block? %) (:block/uuid %))) set)
blocks-tx (let [tx-options' (assoc tx-options :whiteboard? (some? (seq whiteboard-pages)))]
(<build-blocks-tx conn blocks pre-blocks per-file-state tx-options'))
blocks-tx (<build-blocks-tx conn blocks pre-blocks per-file-state tx-options)
{:keys [property-pages-tx property-page-properties-tx] pages-tx' :pages-tx}
(split-pages-and-properties-tx pages-tx old-properties existing-pages (:import-state options) @(:upstream-properties tx-options))
;; _ (when (seq property-pages-tx) (cljs.pprint/pprint {:property-pages-tx property-pages-tx}))
@@ -1927,12 +1878,12 @@
blocks-index (set/union (set block-ids) (set block-refs-ids))
;; Order matters. pages-index and blocks-index needs to come before their corresponding tx for
;; uuids to be valid. Also upstream-properties-tx comes after blocks-tx to possibly override blocks
tx (concat whiteboard-pages pages-index page-properties-tx property-page-properties-tx pages-tx'' classes-tx' blocks-index blocks-tx)
tx (concat pages-index page-properties-tx property-page-properties-tx pages-tx'' classes-tx' blocks-index blocks-tx)
tx' (common-util/fast-remove-nils tx)
;; (prn :tx-counts (map #(vector %1 (count %2))
;; [:whiteboard-pages :pages-index :page-properties-tx :property-page-properties-tx :pages-tx' :classes-tx :blocks-index :blocks-tx]
;; [whiteboard-pages pages-index page-properties-tx property-page-properties-tx pages-tx' classes-tx blocks-index blocks-tx]))
;; _ (when (not (seq whiteboard-pages)) (cljs.pprint/pprint {#_:property-pages-tx #_property-pages-tx :pages-tx pages-tx :tx tx'}))
;; _ (prn :tx-counts (map #(vector %1 (count %2))
;; [:pages-index :page-properties-tx :property-page-properties-tx :pages-tx' :classes-tx :blocks-index :blocks-tx]
;; [pages-index page-properties-tx property-page-properties-tx pages-tx' classes-tx blocks-index blocks-tx]))
;; _ (cljs.pprint/pprint {#_:property-pages-tx #_property-pages-tx :pages-tx pages-tx :tx tx'})
main-tx-report (d/transact! conn tx' {::new-graph? true ::path file})
_ (save-from-tx tx' options)

View File

@@ -15,23 +15,12 @@
[logseq.graph-parser.block :as gp-block]
[logseq.graph-parser.mldoc :as gp-mldoc]
[logseq.graph-parser.property :as gp-property]
[logseq.graph-parser.text :as text]
[logseq.graph-parser.whiteboard :as gp-whiteboard]
[medley.core :as medley]))
[logseq.graph-parser.text :as text]))
(defn- mldoc-support?
[format']
(contains? #{:org :markdown :md} (keyword format')))
(defn- filepath->page-name
[filepath]
(when-let [file-name (last (string/split filepath #"/"))]
(let [result (first (common-util/split-last "." file-name))
ext (string/lower-case (common-util/get-file-ext filepath))]
(if (or (mldoc-support? ext) (= "edn" ext))
(common-util/safe-decode-uri-component (string/replace result "." "/"))
result))))
(defn- path->file-name
;; Only for internal paths, as they are converted to POXIS already
;; https://github.com/logseq/logseq/blob/48b8e54e0fdd8fbd2c5d25b7f1912efef8814714/deps/graph-parser/src/logseq/graph_parser/extract.cljc#L32
@@ -306,42 +295,6 @@
:blocks blocks
:ast ast}))))
(defn extract-whiteboard-edn
"Extracts whiteboard page from given edn file
Whiteboard page edn is a subset of page schema
- it will only contain a single page (for now). The page properties are stored under :logseq.tldraw.* properties and contain 'bindings' etc
- blocks will be adapted to tldraw shapes. All blocks's parent is the given page."
[file content {:keys [verbose] :or {verbose true}}]
(let [_ (when verbose (println "Parsing start: " file))
{:keys [pages blocks]} (common-util/safe-read-map-string content)
blocks (map
(fn [block]
(-> block
(medley/dissoc-in [:block/parent :block/name])
;; :block/left here for backward compatibility
(medley/dissoc-in [:block/left :block/name])))
blocks)
serialized-page (first pages)
;; whiteboard edn file should normally have valid :block/title, :block/name, :block/uuid
page-name (-> (or (:block/name serialized-page)
(filepath->page-name file))
(common-util/page-name-sanity-lc))
title (or (:block/title serialized-page)
page-name)
page-block (merge {:block/name page-name
:block/title title
:block/file {:file/path (common-util/path-normalize file)}}
serialized-page
;; Ensure old whiteboards have correct type
{:block/type "whiteboard"})
page-block (gp-whiteboard/migrate-page-block page-block)
blocks (->> blocks
(map gp-whiteboard/migrate-shape-block)
(map #(merge % (gp-whiteboard/with-whiteboard-block-props % [:block/uuid (:block/uuid page-block)]))))
_ (when verbose (println "Parsing finished: " file))]
{:pages (list page-block)
:blocks blocks}))
(defn- with-block-uuid
[pages]
(->> (common-util/distinct-by :block/name pages)

View File

@@ -52,7 +52,7 @@
:created-at :updated-at :last-modified-at
:query-table :query-properties :query-sort-by :query-sort-desc :ls-type
:hl-type :hl-page :hl-stamp :hl-color :hl-value :logseq.macro-name :logseq.macro-arguments
:logseq.order-list-type :logseq.tldraw.page :logseq.tldraw.shape
:logseq.order-list-type
; task markers
:todo :doing :now :later :done})

View File

@@ -1,74 +0,0 @@
(ns logseq.graph-parser.whiteboard
"Whiteboard related parser utilities")
(defn block->shape [block]
(get-in block [:block/properties :logseq.tldraw.shape]))
(defn shape-block? [block]
(= :whiteboard-shape (get-in block [:block/properties :ls-type])))
;; tldraw shape props is now saved into [:block/properties :logseq.tldraw.shape]
;; migrate
(defn shape-block-needs-migrate? [block]
(let [properties (:block/properties block)]
(and (seq properties)
(and (= :whiteboard-shape (:ls-type properties))
(not (seq (get properties :logseq.tldraw.shape)))))))
(defn page-block-needs-migrate? [block]
(let [properties (:block/properties block)]
(and (seq properties)
(and (= :whiteboard-page (:ls-type properties))
(not (seq (get properties :logseq.tldraw.page)))))))
(defn migrate-shape-block [block]
(if (shape-block-needs-migrate? block)
(let [properties (:block/properties block)
properties (assoc properties :logseq.tldraw.shape properties)]
(assoc block :block/properties properties))
block))
(defn migrate-page-block [block]
(if (page-block-needs-migrate? block)
(let [properties (:block/properties block)
properties (assoc properties :logseq.tldraw.page properties)]
(assoc block :block/properties properties))
block))
(defn- get-shape-refs [shape]
(let [portal-refs (when (= "logseq-portal" (:type shape))
[{:block/uuid (uuid (:pageId shape))}])
shape-link-refs (->> (:refs shape)
(filter (complement empty?))
(keep (fn [ref] (when (parse-uuid ref)
{:block/uuid (parse-uuid ref)}))))]
(concat portal-refs shape-link-refs)))
(defn- with-whiteboard-block-refs
[shape]
(let [refs (or (get-shape-refs shape) [])]
{:block/refs (if (seq refs) refs [])}))
(defn- with-whiteboard-content
"Main purpose of this function is to populate contents when shapes are used as references in outliner."
[shape]
{:block/title (case (:type shape)
"text" (:text shape)
"logseq-portal" ""
"line" (str "whiteboard arrow" (when-let [label (:label shape)] (str ": " label)))
(str "whiteboard " (:type shape)))})
(defn with-whiteboard-block-props
"Builds additional block attributes for a whiteboard block. Expects :block/properties
to be in file graph format"
[block page-id]
(let [shape? (shape-block? block)
shape (block->shape block)]
(merge (when shape?
(merge
{:block/uuid (uuid (:id shape))}
(with-whiteboard-block-refs shape)
(with-whiteboard-content shape)))
(when (nil? (:block/parent block)) {:block/parent page-id})
(when (nil? (:block/format block)) {:block/format :markdown}) ;; TODO: read from config
{:block/page page-id})))

View File

@@ -231,12 +231,11 @@
#_(map #(select-keys % [:block/title :block/tags]))
count))
"Correct number of pages with block content")
(is (= 15 (->> @conn
(is (= 14 (->> @conn
(d/q '[:find [?ident ...]
:where [?b :block/tags :logseq.class/Tag] [?b :db/ident ?ident] (not [?b :logseq.property/built-in?])])
count))
"Correct number of user classes")
(is (= 4 (count (d/datoms @conn :avet :block/tags :logseq.class/Whiteboard))))
(is (= 0 (count @(:ignored-properties import-state))) "No ignored properties")
(is (= 0 (count @(:ignored-assets import-state))) "No ignored assets")
(is (= 1 (count @(:ignored-files import-state))) "Ignore .edn for now")
@@ -607,13 +606,7 @@
:block/refs
(map #(:db/ident (d/entity @conn (:db/id %))))
set))
"Block has correct task tag and property :block/refs")))
(testing "whiteboards"
(let [block-with-props (db-test/find-block-by-content @conn #"block with props")]
(is (= {:user.property/prop-num 10}
(db-test/readable-properties block-with-props)))
(is (= "block with props" (:block/title block-with-props)))))))
"Block has correct task tag and property :block/refs")))))
(deftest-async export-basic-graph-with-convert-all-tags-option-disabled
(p/let [file-graph-dir "test/resources/exporter-test-graph"

View File

@@ -128,26 +128,4 @@
"- line1
- line2
- line3
- line4"))))
(def foo-edn
"Example exported whiteboard page as an edn exportable."
'{:blocks
({:block/title "foo content a",
:block/format :markdown},
{:block/title "foo content b",
:block/format :markdown}),
:pages
({:block/format :markdown,
:block/title "Foo"
:block/uuid #uuid "a846e3b4-c41d-4251-80e1-be6978c36d8c"
:block/properties {:title "my whiteboard foo"}})})
(deftest test-extract-whiteboard-edn
(let [{:keys [pages blocks]} (extract/extract-whiteboard-edn "/whiteboards/foo.edn" (pr-str foo-edn) {})
page (first pages)]
(is (= (get-in page [:block/file :file/path]) "/whiteboards/foo.edn"))
(is (= (:block/name page) "foo"))
(is (= (:block/type page) "whiteboard"))
(is (= (:block/title page) "Foo"))
(is (every? #(= (:block/parent %) [:block/uuid #uuid "a846e3b4-c41d-4251-80e1-be6978c36d8c"]) blocks))))
- line4"))))

View File

@@ -7,4 +7,5 @@
card-last-reviewed:: 2024-11-26T20:27:33.373Z
- card 2 with cloze {{cloze surprise!}} #card
card-next-schedule:: 2024-11-27T05:00:00.000Z
- This block references a page with a future parent class #Property
- This block should test a page with a future parent class `#Property`
FIXME: Property tag triggers an intermittent, invalid hanging block ref

File diff suppressed because one or more lines are too long

View File

@@ -1,67 +0,0 @@
{:blocks ({:block/title "fix/published-embeds"
:block/format :markdown
:block/left
{:block/uuid #uuid "64551487-ffab-406c-adcf-a4e8f00db19c"}
:block/parent
{:block/uuid #uuid "64551487-ffab-406c-adcf-a4e8f00db19c"}
:block/uuid #uuid "645514a0-85c2-43db-ac08-12836ae3d147"}
{:block/created-at 1683639741650
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:index 0
:scale [1 1]
:type "youtube"
:size [853 480]
:id "e694caf0-eb52-11ed-a877-89e9886a62fe"
:url "https://www.youtube.com/watch?v=C5m5dIiJMD0"
:isLocked false
:point [475.04503224455124 300.94676141866057]
:parentId "64551487-ffab-406c-adcf-a4e8f00db19c"
:nonce 1683297680671}}
:block/updated-at 1683639741650}
{:block/created-at 1683639741650
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:isSizeLocked true
:stroke ""
:borderRadius 0
:index 1
:scale [1 1]
:scaleLevel "md"
:fill ""
:type "text"
:size [78 34]
:fontFamily "var(--ls-font-family)"
:strokeType "line"
:strokeWidth 2
:opacity 1
:id "51851490-ee6f-11ed-9c5e-21b9b3de5563"
:padding 4
:fontWeight 400
:noFill true
:point [719.5019628453911 862.2621018969135]
:lineHeight 1.2
:fontSize 20
:parentId "64551487-ffab-406c-adcf-a4e8f00db19c"
:nonce 1683639739496
:italic false
:text "fsdfsdf"}}
:block/updated-at 1683639741650})
:pages ({:block/uuid #uuid "64551487-ffab-406c-adcf-a4e8f00db19c"
:block/properties
{:ls-type :whiteboard-page
:logseq.tldraw.page
{:id "64551487-ffab-406c-adcf-a4e8f00db19c"
:name "page 9322"
:bindings
{}
:nonce 1
:assets []
:shapes-index ("e694caf0-eb52-11ed-a877-89e9886a62fe" "51851490-ee6f-11ed-9c5e-21b9b3de5563")}}
:block/updated-at 1683639741650
:block/created-at 1683297415382
:block/type "whiteboard"
:block/name "page 9322"
:block/title "page 9322"})}

View File

@@ -1,443 +0,0 @@
{:blocks ({:block/created-at 1682011775882
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:index 6
:scale [1 1]
:scaleLevel "md"
:fill ""
:type "highlighter"
:points [[58.92632216254492 0 0.5] [53.13546991923272 1.6664622322829246 0.5] [51.16419903897088 4.158826603346142 0.5] [49.32568186217577 9.035316911257496 0.5] [47.53632324095554 29.88347313229167 0.5] [49.71895030677524 46.759643666286024 0.5] [60.469888005890425 87.63005396957408 0.5] [72.73494762183498 119.53395653770247 0.5] [86.45018462723999 145.1504926495047 0.5] [106.48229602402319 174.53745156878244 0.5] [124.72504879958615 197.64197268899875 0.5] [131.47942153387396 213.25967139856766 0.5] [137.26048047119286 232.93288693453246 0.5] [136.6459985265061 251.89829608046125 0.5] [132.4970292376894 258.34786016677026 0.5] [122.82265110395804 269.37909124461294 0.5] [118.486840898835 272.63827787581613 0.5] [115.13913046247524 273.69518682067724 0.5] [99.9885020394039 274.4620730893532 0.5] [35.95948340305995 261.2727942234785 0.5] [15.160485737600652 250.60052301499036 0.5] [5.879312039932756 244.79981345714873 0.5] [2.2121350008718537 241.820792187601 0.5] [0.5308867967949027 237.77993331592756 0.5] [0.5308867967949027 228.9461792842344 0.5] [27.872901010984265 190.86794933418787 0.5] [31.771148864661768 186.2716243879322 0.5] [45.1472046383069 174.41455517984514 0.5] [82.42904038462518 149.37812842894857 0.5] [96.39007016790481 141.92567860208226 0.5] [116.70241093487948 131.92684119984904 0.5] [157.62690845100713 114.78522726745723 0.5] [186.61074161115596 100.98153046543177 0.5] [186.61074161115596 100.98153046543177 0.5]]
:strokeType "line"
:strokeWidth 2
:opacity 0.5
:id "ce9d5c40-dad2-11ed-b0d8-ef9040ba205f"
:noFill true
:point [896.1992792676562 872.0662892939717]
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1681483446343
:isComplete true}}
:block/updated-at 1682011775882}
{:block/title "wut"
:block/format :markdown
:block/left
{:block/uuid #uuid "6421db79-4e2f-4101-9758-4aef5320cc67"}
:block/parent
{:block/uuid #uuid "6421db79-4e2f-4101-9758-4aef5320cc67"}
:block/uuid #uuid "6421db96-5f44-4d56-b77e-598550b62fab"}
{:block/created-at 1682011775881
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:index 5
:scale [1 1]
:scaleLevel "md"
:fill ""
:type "pencil"
:points [[201.61895104183895 25.070863343213432 0.5] [191.7232953994844 25.070863343213432 0.5] [176.66605543029823 23.81239151878799 0.5] [160.10455085881222 23.81239151878799 0.5] [131.80887346817633 23.81239151878799 0.5] [113.42843833188203 24.741539425982864 0.5] [87.44327706180366 29.43125282612391 0.5] [59.14759967116788 39.13513889490753 0.5] [37.49325594041204 51.96059324269902 0.5] [28.12855110338819 60.46502335716161 0.5] [24.987332203857477 65.50870396085645 0.5] [22.431087313961257 73.05454224160792 0.5] [22.431087313961257 78.94371159606999 0.5] [30.453725178667924 93.28821651795556 0.5] [32.52331317007963 96.04602428741612 0.5] [41.558630081337014 110.6313293213758 0.5] [48.56865290802898 118.49176955609971 0.5] [52.707828890852284 124.70053353033461 0.5] [57.85469125442569 131.3074305978979 0.5] [64.1764943030687 139.86101926793538 0.5] [66.45743848003815 143.89202082507938 0.5] [68.05022688749455 147.07746962292038 0.5] [69.64295128641504 150.26298242929727 0.5] [70.78339137063188 154.2939839864415 0.5] [71.84522897275747 157.47943278428227 0.5] [72.37617977808827 160.66494559065916 0.5] [72.37617977808827 163.1572459531866 0.5] [72.37617977808827 170.63920371510505 0.5] [71.39300866658971 173.13150407763226 0.5] [69.87395809249563 175.6238684486956 0.5] [66.44271651678002 178.51436591308686 0.5] [59.132813699373855 183.66129228519628 0.5] [55.09201883623632 185.41134966537095 0.5] [51.051159964562885 186.02090295279288 0.5] [45.1521332955715 184.79686772068442 0.5] [37.07047956076053 181.17878522866238 0.5] [27.25841906629762 175.54027330080373 0.5] [19.545454498298568 168.35825953813548 0.5] [9.905448948348067 155.76381199642458 0.5] [5.274751418311325 146.34994860382574 0.5] [0 126.98147770730418 0.5] [0.6882197780489605 114.41653810064543 0.5] [3.7655581587466713 110.5625201452782 0.5] [14.226473181676965 101.4681873639164 0.5] [27.951567501611294 95.10215441696323 0.5] [37.35557357968071 92.01502273027211 0.5] [47.9295916855549 90.38786173903475 0.5] [58.5036097914292 89.61604681309404 0.5] [67.9076158694985 90.46652822966178 0.5] [72.78417018594575 91.68563480450564 0.5] [77.82785078964059 91.68563480450564 0.5] [82.87153139333543 92.37385458255471 0.5] [88.76070074779739 92.37385458255471 0.5] [95.66254914881017 91.68070614724104 0.5] [107.2050164029248 90.05354515600368 0.5] [114.68691015630736 89.3604607292259 0.5] [117.17927452737058 89.3604607292259 0.5] [117.91665286099453 89.3604607292259 0.5] [118.28534202780645 89.3604607292259 0.5] [118.65403119461837 89.3604607292259 0.5] [119.0227203614304 88.61322508107264 0.5] [119.47007601886935 87.33510263612459 0.5] [120.00096281566425 84.83294495906785 0.5] [120.44831847310331 82.33078728201122 0.5] [120.44831847310331 79.13548116964091 0.5] [120.44831847310331 73.23645450064953 0.5] [121.05787176052525 68.35004286967296 0.5] [121.66742504794718 63.463695247232295 0.5] [122.19837585327787 59.42290038409476 0.5] [121.7460915385742 56.920678698502115 0.5] [121.37247371449757 55.26900243801333 0.5] [121.37247371449757 54.8953846139367 0.5] [121.37247371449757 54.52176678986007 0.5] [121.37247371449757 54.14814896578332 0.5] [120.92025340832981 52.87002652083527 0.5] [120.46796909362604 51.0610172790922 0.5] [120.46796909362604 49.25194402881334 0.5] [120.46796909362604 47.442934787070385 0.5] [120.01568477892238 44.940777110013755 0.5] [119.56346447275462 41.59306667365388 0.5] [118.41803172273717 37.552207801980444 0.5] [116.33865042533216 27.027412260217034 0.5] [114.02326965604584 16.119077571311777 0.5] [113.25151873864104 8.037423836500807 0.5] [113.25151873864104 3.996628973363272 0.5] [113.25151873864104 1.4944072877706276 0.5] [113.62020790545296 0.7472356481532643 0.5] [113.62020790545296 0.37361782407663213 0.5] [113.62020790545296 0 0.5]]
:strokeType "line"
:strokeWidth 2
:opacity 1
:id "cae02d30-dad2-11ed-b0d8-ef9040ba205f"
:noFill true
:point [700.3564585058713 924.9854743703819]
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1681483440104
:isComplete true}}
:block/updated-at 1682011775881}
{:block/created-at 1682011775882
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:index 11
:scale [1 1]
:scaleLevel "sm"
:fill ""
:type "ellipse"
:size [20.46875 107.09686279296875]
:strokeType "line"
:strokeWidth 1.6
:opacity 1
:label "fff"
:id "46999ba0-dad3-11ed-b0d8-ef9040ba205f"
:fontWeight 400
:noFill false
:point [1350.6775150473263 1172.7983609232979]
:fontSize 16
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1681483647622
:italic false}}
:block/updated-at 1682011775882}
{:block/title "fff"
:block/format :markdown
:block/left
{:block/uuid #uuid "643966c4-fd32-4702-b85c-46b636668091"}
:block/parent
{:block/uuid #uuid "6421db79-4e2f-4101-9758-4aef5320cc67"}
:block/properties
{}
:block/uuid #uuid "6439673e-b0d3-43c6-b0f6-b79eedd209c8"}
{:block/title "fix/internal-paste"
:block/format :markdown
:block/left
{:block/uuid #uuid "6421db96-5f44-4d56-b77e-598550b62fab"}
:block/parent
{:block/uuid #uuid "6421db79-4e2f-4101-9758-4aef5320cc67"}
:block/uuid #uuid "6423420b-b2d9-4d2d-8add-d9da287cdc87"}
{:block/created-at 1682011775880
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke "green"
:index 2
:scale [1 1]
:fill "green"
:type "line"
:strokeType "line"
:strokeWidth 1
:opacity 1
:label ""
:id "08b11d80-cda0-11ed-8356-d36ee09ec21e"
:fontWeight 400
:noFill true
:point [703.1713114575059 767.7419665166876]
:fontSize 20
:handles
{:start
{:id "start"
:canBind true
:point [0 90.77]}
:end
{:id "end"
:canBind true
:point [334.06 0]}}
:decorations
{:end "arrow"}
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1679940523034
:italic false}}
:block/updated-at 1682011775880}
{:block/created-at 1682011775882
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:index 4
:scale [1 1]
:scaleLevel "xl"
:fill ""
:type "pencil"
:points [[348.65219076644905 0 0.5] [348.65219076644905 0.36868916681203245 0.5] [348.2785729423724 0.7373783336239512 0.5] [347.00045049742437 1.5534231578749313 0.5] [345.0291796171625 2.452999121481753 0.5] [341.8338735047922 2.9839499268125564 0.5] [336.780399595104 3.5148367236073454 0.5] [323.369907229142 5.294402038834164 0.5] [306.80840265765585 6.2234859374931375 0.5] [279.51068235031266 9.984115438975095 0.5] [258.6871054070659 13.341619181328383 0.5] [236.66896916249482 19.89449304458776 0.5] [208.37329177185904 31.584371956891346 0.5] [194.6384041459313 37.9406115978511 0.5] [180.83467533963778 45.46673524954383 0.5] [151.89011141626656 68.93508088784324 0.5] [141.1588243376741 81.51967111502483 0.5] [134.87635453434473 94.92024215792162 0.5] [131.223867454274 108.32087720935431 0.5] [131.223867454274 121.72151226078688 0.5] [135.10246468742855 138.2732235262796 0.5] [140.92775352305762 154.82487078323618 0.5] [147.7657214052373 171.3765820487289 0.5] [151.1674870501687 181.26238037655423 0.5] [154.08259579661558 189.33417679683578 0.5] [154.08259579661558 197.40603722565345 0.5] [152.858560564507 202.28252753356458 0.5] [147.11683487250184 209.39086747140652 0.5] [137.22121123441514 212.46820585210423 0.5] [127.96957747606734 214.0019783894562 0.5] [117.38573405993168 214.0019783894562 0.5] [102.31863677621618 214.0019783894562 0.5] [90.24038607231 214.0019783894562 0.5] [71.85998294028354 210.88041011044845 0.5] [45.14723664257474 199.91312355997468 0.5] [32.424996058929764 192.5344115664708 0.5] [26.20151012143674 189.15232854633007 0.5] [22.534301078107887 186.17330727678234 0.5] [22.160683254031255 185.42607162862907 0.5] [21.787097434222574 184.6788999890117 0.5] [21.41347961014594 183.93166434085845 0.5] [19.4422087298841 181.42950666380182 0.5] [11.23765860613571 168.27959304750846 0.5] [6.12516882634327 156.20131033933433 0.5] [1.7058274818643895 142.79088198190823 0.5] [0 130.7125992737341 0.5] [0 122.6309455389229 0.5] [0 116.73191886993152 0.5] [0.6882197780489605 110.83289220094014 0.5] [2.7528791121959557 103.92118648539815 0.5] [10.082432550124963 94.95960740750309 0.5] [15.59801608477835 90.1224183406373 0.5] [20.47453839695754 88.28383715530629 0.5] [25.351092713404796 88.28383715530629 0.5] [32.41024209140369 88.28383715530629 0.5] [40.482070515953296 91.19897790602101 0.5] [58.16442855966932 100.78982490039675 0.5] [106.01535375459719 124.08605158564808 0.5] [141.80278221314495 139.26125928650674 0.5] [183.93659299812293 158.82636440532826 0.5] [211.53419329618043 173.87873972578552 0.5] [230.43565791474032 184.80666102667772 0.5] [239.83972800134563 188.0462610458943 0.5] [244.716218309257 188.65581433331624 0.5] [248.05407143108744 188.65581433331624 0.5] [254.955983840636 185.89307790659075 0.5] [263.02778026091767 182.1963929324778 0.5] [267.0587818180618 180.44140689503854 0.5] [271.0897833752059 178.15060540353954 0.5] [274.2752961815828 176.55295234735456 0.5] [276.9298581826289 173.88859704031495 0.5] [279.8203556470204 170.45729145606344 0.5] [281.32954890658505 166.3574807228216 0.5] [282.39132250017474 163.1621746104512 0.5] [282.92227330550554 159.12131573877775 0.5] [284.22004637097643 153.22228906978637 0.5] [285.59648592707435 146.3106473627803 0.5] [288.034763085298 141.4242357318036 0.5] [291.32345765155355 136.218357498126 0.5] [294.45488324509085 131.85803202375143 0.5] [296.57849444080614 128.66272591138102 0.5] [296.9471836076182 128.2891080873045 0.5] [296.9471836076182 127.91549026322775 0.5]]
:strokeType "line"
:strokeWidth 4.8
:opacity 1
:id "c80e4880-dad2-11ed-b0d8-ef9040ba205f"
:noFill true
:point [343.33751998569096 922.4538087582731]
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1681483435368
:isComplete true}}
:block/updated-at 1682011775882}
{:block/created-at 1682011775882
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:borderRadius 2
:index 9
:scale [1 1]
:scaleLevel "sm"
:fill ""
:type "box"
:size [34.60626220703125 83.96405029296875]
:strokeType "line"
:strokeWidth 1.6
:opacity 1
:label "ffff"
:id "17a61b70-dad3-11ed-b0d8-ef9040ba205f"
:fontWeight 400
:noFill false
:point [1051.7181339438107 1173.3045865092354]
:fontSize 16
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1681483568842
:italic false}}
:block/updated-at 1682011775882}
{:block/created-at 1682011775881
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:borderRadius 2
:index 13
:scale [1 1]
:scaleLevel "xl"
:fill ""
:type "box"
:size [142.61874389648438 118.97967529296875]
:strokeType "line"
:strokeWidth 4.8
:opacity 1
:label "wut"
:id "3f1d1b80-cdaa-11ed-8356-d36ee09ec21e"
:fontWeight 400
:noFill false
:point [473.0882555996159 772.5590689866208]
:fontSize 48
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1679940538286
:italic false}}
:block/updated-at 1682011775881}
{:block/created-at 1682011775881
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:index 1
:scale [1 1]
:scaleLevel "lg"
:fill ""
:type "line"
:strokeType "line"
:strokeWidth 1
:opacity 1
:label ""
:id "689db722-ccca-11ed-8c36-cd64b4f8676b"
:fontWeight 400
:noFill true
:point [254.33 344.68]
:fontSize 20
:handles
{:start
{:id "start"
:canBind true
:point [0 90.77]
:bindingId nil}
:end
{:id "end"
:canBind true
:point [334.06 0]
:bindingId nil}}
:decorations
{:end "arrow"}
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1679940522990
:italic false}}
:block/updated-at 1682011775881}
{:block/created-at 1707842738589
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:blockType "B"
:stroke ""
:collapsed false
:borderRadius 8
:index 10
:scale [1 1]
:pageId "6439673e-b0d3-43c6-b0f6-b79eedd209c8"
:scaleLevel "md"
:fill ""
:compact true
:isAutoResizing true
:type "logseq-portal"
:size [400 40]
:strokeType "line"
:strokeWidth 2
:opacity 1
:id "1ee6f300-dad3-11ed-b0d8-ef9040ba205f"
:noFill false
:point [1184.2603397543576 993.6701870951728]
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:collapsedHeight 0
:nonce 1681483580997}}
:block/updated-at 1707842738589}
{:block/created-at 1682011775882
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:index 12
:scale [1 1]
:scaleLevel "md"
:fill ""
:type "line"
:strokeType "line"
:strokeWidth 1
:opacity 1
:label ""
:id "4ac3e461-dad3-11ed-b0d8-ef9040ba205f"
:fontWeight 400
:noFill true
:point [1248.21 1241.85]
:fontSize 20
:handles
{:start
{:id "start"
:canBind true
:point [100.18 0]}
:end
{:id "end"
:canBind true
:point [0 0.64]
:bindingId nil}}
:decorations
{:end "arrow"}
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1681483654602
:italic false}}
:block/updated-at 1682011775882}
{:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:borderRadius 2
:index 14
:scale [1 1]
:fill ""
:type "box"
:size [142.61874389648438 118.97967529296875]
:strokeType "line"
:strokeWidth 2
:opacity 1
:label "wut"
:id "eb97f800-dfa0-11ed-8d23-dd2d2525f6dc"
:fontWeight 400
:noFill false
:isLocked false
:point [618.9763945576193 604.0079150616748]
:fontSize 20
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1679940538286
:italic false}}
:block/updated-at 1682011775882}
{:block/created-at 1682011775882
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:index 7
:scale [1 1]
:scaleLevel "xl"
:fill ""
:type "highlighter"
:points [[211.77019276806163 8.076789086082158 0.5] [161.5153629986911 8.927206494114102 0.5] [129.88676114348948 11.955386319236823 0.5] [110.20368829299548 15.229358922234269 0.5] [98.12540558482124 18.626163905633007 0.5] [91.50865120272874 23.773090277742426 0.5] [89.45877784037577 29.450903446646635 0.5] [90.99741502645668 38.10280922783397 0.5] [96.34097562086572 51.82790354776819 0.5] [101.72876611358504 60.29789706991403 0.5] [120.00096281566425 83.03372902331841 0.5] [130.73717855152142 100.01800997445605 0.5] [138.0520100261923 114.81473520250927 0.5] [141.1785069624649 130.62413947711332 0.5] [140.80488913838826 137.929113637255 0.5] [134.79275938645299 146.72849508516708 0.5] [128.62336066179955 152.34729238396687 0.5] [105.45003036548553 167.99443502005226 0.5] [94.66465607405348 173.02832231775358 0.5] [86.58300233924251 173.71654209580254 0.5] [72.70550369531873 173.71654209580254 0.5] [58.72482329151637 170.17219743714315 0.5] [29.9621396229187 157.5580992749093 0.5] [21.000560545023745 150.218752530987 0.5] [12.486273116031725 140.85404769396325 0.5] [7.005094169427252 132.29060170939636 0.5] [4.557023705210213 127.40425408695558 0.5] [0 112.09136402536558 0.5] [0 100.3965564557974 0.5] [3.077338380697711 91.14489069318154 0.5] [14.246187810735705 79.80398631863125 0.5] [37.67510419091775 62.559190626360646 0.5] [90.86958998025466 33.46225438326792 0.5] [136.55760273842168 14.565718421972747 0.5] [183.01730240545749 1.5829310929269695 0.5] [225.67220668123696 0 0.5] [313.65129919710023 8.769873512859931 0.5] [335.6349668450865 8.769873512859931 0.5] [350.6922068142725 6.901848401012671 0.5] [359.3884065023061 3.9966289733631584 0.5] [359.3884065023061 2.7185065284149914 0.5] [359.3884065023061 2.7185065284149914 0.5]]
:strokeType "line"
:strokeWidth 4.8
:opacity 0.5
:id "d0eb6af0-dad2-11ed-b0d8-ef9040ba205f"
:noFill true
:point [783.606472372012 980.2396908366012]
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1681483450226
:isComplete true}}
:block/updated-at 1682011775882}
{:block/created-at 1682011775881
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:borderRadius 2
:index 0
:scale [1 1]
:fill ""
:type "box"
:size [184.88128662109375 159.4093780517578]
:strokeType "line"
:strokeWidth 2
:opacity 1
:label ""
:id "665eeab0-ccca-11ed-8c36-cd64b4f8676b"
:fontWeight 400
:noFill false
:point [389.85938718914986 200.99062728881836]
:fontSize 20
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1679940519184
:italic false}}
:block/updated-at 1682011775881}
{:block/title "huh"
:block/format :markdown
:block/left
{:block/uuid #uuid "6423420b-b2d9-4d2d-8add-d9da287cdc87"}
:block/parent
{:block/uuid #uuid "6421db79-4e2f-4101-9758-4aef5320cc67"}
:block/uuid #uuid "643966c4-fd32-4702-b85c-46b636668091"}
{:block/created-at 1682011775881
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:stroke ""
:borderRadius 2
:index 3
:scale [1 1]
:fill ""
:type "box"
:size [142.61874389648438 118.97967529296875]
:strokeType "line"
:strokeWidth 2
:opacity 1
:label "wut"
:id "a5ced1d0-d3cb-11ed-84d2-d9f3e7dd8e6d"
:fontWeight 400
:noFill false
:isLocked true
:point [389.51708629533925 571.3437222173457]
:fontSize 20
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:nonce 1679940538286
:italic false}}
:block/updated-at 1682011775881}
{:block/created-at 1707842738589
:block/properties
{:ls-type :whiteboard-shape
:logseq.tldraw.shape
{:blockType "B"
:stroke ""
:collapsed false
:borderRadius 8
:index 8
:scale [1 1]
:pageId "643966c4-fd32-4702-b85c-46b636668091"
:scaleLevel "lg"
:fill ""
:compact true
:isAutoResizing true
:type "logseq-portal"
:size [400 60]
:strokeType "line"
:strokeWidth 2
:opacity 1
:id "d51c4360-dad2-11ed-b0d8-ef9040ba205f"
:noFill false
:point [953.350964772239 864.4811497721747]
:parentId "6421db79-4e2f-4101-9758-4aef5320cc67"
:collapsedHeight 0
:nonce 1681483457197}}
:block/updated-at 1707842738589})
:pages ({:block/tx-id 536870974
:block/uuid #uuid "6421db79-4e2f-4101-9758-4aef5320cc67"
:block/properties
{:ls-type :whiteboard-page
:logseq.tldraw.page
{:id "6421db79-4e2f-4101-9758-4aef5320cc67"
:name "publishing test"
:bindings
{:689db721-ccca-11ed-8c36-cd64b4f8676b
{:id "689db721-ccca-11ed-8c36-cd64b4f8676b"
:type "line"
:fromId "689db722-ccca-11ed-8c36-cd64b4f8676b"
:toId "665eeab0-ccca-11ed-8c36-cd64b4f8676b"
:handleId "end"
:point [1 0.94]
:distance 4}}
:nonce 1
:assets []
:shapes-index ("665eeab0-ccca-11ed-8c36-cd64b4f8676b" "689db722-ccca-11ed-8c36-cd64b4f8676b" "08b11d80-cda0-11ed-8356-d36ee09ec21e" "a5ced1d0-d3cb-11ed-84d2-d9f3e7dd8e6d" "c80e4880-dad2-11ed-b0d8-ef9040ba205f" "cae02d30-dad2-11ed-b0d8-ef9040ba205f" "ce9d5c40-dad2-11ed-b0d8-ef9040ba205f" "d0eb6af0-dad2-11ed-b0d8-ef9040ba205f" "d51c4360-dad2-11ed-b0d8-ef9040ba205f" "17a61b70-dad3-11ed-b0d8-ef9040ba205f" "1ee6f300-dad3-11ed-b0d8-ef9040ba205f" "46999ba0-dad3-11ed-b0d8-ef9040ba205f" "4ac3e461-dad3-11ed-b0d8-ef9040ba205f" "3f1d1b80-cdaa-11ed-8356-d36ee09ec21e" "eb97f800-dfa0-11ed-8d23-dd2d2525f6dc")}}
:block/updated-at 1707842737378
:block/created-at 1679940473374
:block/type "whiteboard"
:block/name "publishing test"
:block/title "publishing test"})}