commit d5cc07c25956f98a7c5d83bab4beb8613d01322f Author: polwex Date: Sun Oct 6 18:19:22 2024 +0000 Done diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..5bf8fc1 --- /dev/null +++ b/.envrc @@ -0,0 +1,3 @@ +source_url "https://raw.githubusercontent.com/cachix/devenv/95f329d49a8a5289d31e0982652f7058a189bfca/direnvrc" "sha256-d+8cBpDfDBj41inrADaJt+bDWhOktwslgoP5YiGJ1v0=" + +use devenv \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4d058db --- /dev/null +++ b/.gitignore @@ -0,0 +1,9 @@ +# Devenv +.devenv* +devenv.local.nix + +# direnv +.direnv + +# pre-commit +.pre-commit-config.yaml diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..00d45c8 --- /dev/null +++ b/LICENSE @@ -0,0 +1,10 @@ +MIT License + +Copyright (c) 2024 polwex + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/README.md b/README.md new file mode 100644 index 0000000..be52af5 --- /dev/null +++ b/README.md @@ -0,0 +1,11 @@ +# Urbit Community Manager + +Create self-hosted communities on Urbit. +Currently supports Blog, Static sites, Chat, Forum, Radio and Wiki apps. +Supports EAuth and Metamask login with Urbit ID. + + +### Installation +Two options: +1.- On dojo run `|install ~dister-dozzod-sortug %ucm` +2.- Symlink the `desk` folder to a folder inside your pier, then commit and `|install our `. diff --git a/desk/app/ucm.hoon b/desk/app/ucm.hoon new file mode 100644 index 0000000..227df8d --- /dev/null +++ b/desk/app/ucm.hoon @@ -0,0 +1,329 @@ +/- sur=ucm, blog-paths, docket +:: XX sss; remove on transition to %4 +/+ jon=json, lib=ucm, dbug, *sss, cons=constants, metamask, sr=sortug, apps, web +:: /= router /web/router +:: +%- agent:dbug +^- agent:gall +=> |% + +$ versioned-state + $% state-0:sur + == + :: XX move into +* below + +$ card $+(card card:agent:gall) + -- +=| versioned-state +=* state - +:: +=< +|_ =bowl:gall ++* this . + hd ~(. +> [state bowl]) + :: rout ~(. router:router [state bowl]) + metalib ~(. metamask [sessions.state bowl]) + :: XX sss; remove on transition to state-4 + du-paths + =/ du + (du blog-paths ,[%paths ~]) + (du pub-paths bowl -:!>(*result:du)) +:: +++ on-init + ^- (quip card _this) + :_ this + :_ ~ (add-eyre-binding [dap.bowl ~]) +:: +++ on-save + !>(state) +:: +++ on-load + |= =vase + ^- (quip card _this) + =+ !<(old=versioned-state vase) + ?- -.old + %0 :_ this(state old) ~ + == +:: +++ on-poke + |= [=mark =vase] + =. src.bowl login:metalib + |^ + ^- (quip card _this) + ?+ mark + ~|("unexpected poke to {} with mark {}" !!) + :: + %noun (handle-poke !<(* vase)) + %json (handle-json !<(json vase)) + %handle-http-request (serve-http !<([@ta inbound-request:eyre] vase)) + == :: end of pokes + ++ handle-poke |= a=* + ?: ?=([%ui *] a) (handle-ui a) + :: metamask + ?: ?=([%meta @] a) + =. sessions (handle-meta:metalib +.a) `this + ?: ?=([%auth @p @p @uv] a) + =. sessions (handle-auth:metalib +.a) `this + ?: ?=(%sessions a) handle-sess + ?: ?=(%chal a) handle-chal + ?: ?=([%glob *] a) (handle-glob +.a) + (handle-debug a) + :: + ++ handle-json |= j=json + =/ =action:sur (de:jon j) + ?- -.action + %dash (handle-dash +.action) + %site (handle-site +.action) + == + + ++ handle-dash |= a=dash-action:sur + ?- -.a + %del =. sites (~(del by sites) name.a) + `this + %set + =/ site (~(get by sites) binding.a) + =/ nsite ?~ site *site:sur u.site + =/ ns %= nsite + sitename sitename.a + description description.a + groupname groupname.a + binding binding.a + icon icon.a + home home.a + css css.a + hidden hidden.a + apps apps.a + app-order app-order.a + == + =. sites (~(put by sites) binding.a ns) + :: =/ cards [(add-eyre-binding:hd binding.a) (diff-sites nsite ns)] + =/ cards [(add-eyre-binding:hd binding.a) ~] + [cards this] + == + ++ handle-site |= [name=@t a=site-action:sur] + ?- -.a + %lol `this + %search `this + == + :: ++ diff-sites |= [sa=site:sur sb=site:sur] ^- (list card) + :: =/ applib ~(. apps [groupname.sb bowl]) + :: =, applib + :: =/ a apps.sa =/ b apps.sb + :: %- zing + :: :~ (group-diff sa sb) + :: (blog-diff blog.a blog.b) + :: (chat-diff chat.a chat.b) + :: (forum-diff forum.a forum.b) + :: (radio-diff radio.a radio.b) + :: (wiki-diff wiki.a wiki.b) + :: == + ++ handle-sess + ~& >> users.sessions + `this + ++ handle-chal + ~& >> challenges.sessions + ~& "wiping challenges" + =. challenges.sessions *(set @uv) + `this + ++ handle-glob |= arg=* + =/ pat (path arg) + =/ ta-now `@ta`(scot %da now.bowl) + :_ this :_ ~ + [%pass (weld /glob pat) %arvo %k %fard dap.bowl %make-glob %noun !>(pat)] + :: + ++ handle-debug |= arg=* + ~& debug=arg + =/ applib ~(. apps [%lol bowl]) + ?: .=(%seed arg) + + + `this + ?: .=(%print arg) + =/ log + =/ l ~(tap by sites) + |- ?~ l ~ + =/ site +.i.l + ~& site + $(l t.l) + `this + ?: .=(%vats arg) ~& show-vats:applib `this + ?: .=(%eyre arg) :_ this + =/ cards wipe-eyre-bindings:hd + ~& cards=cards + cards + + ?: .=([%add *] arg) + =/ ssite *site:sur + =/ ms %= ssite + sitename 'My test site' + binding /test1 + groupname %my-test-site-3 + == + =. sites (~(put by sites) /test1 ms) + `this + ?: ?=([%order *] arg) + ~& > ordering=arg + =/ pat (path +.arg) + ~& > ordering=pat + =/ site (~(get by sites) pat) + ~& site + ?~ site `this + :: TODO resurrect when wiki is usable + :: =. app-order.u.site ~[%blog %chat %forum %radio %wiki] + =. app-order.u.site ~[%blog %chat %forum %radio] + + =. sites (~(put by sites) pat u.site) + `this + ?: .=(%wipe-subs arg) + :_ this %+ weld + %+ turn ~(tap by wex.bowl) |= [[=wire =ship =term] [acked=? =path]] + ^- card + [%pass wire %agent [ship term] %leave ~] + %+ turn ~(tap by sup.bowl) |= [* p=@p pat=path] + ^- card + [%give %kick ~[pat] `p] + :: ?: .=(arg 5) + :: :_ this :_ ~ (add-eyre-binding /test) + :: ?: .=(arg 4) + :: :_ this :_ ~ (remove-eyre-binding /test) + :: ~& >> unrecognized-poke-to-ublog=a + `this + :: UI poke handler + ++ handle-ui |= a=* + :: =/ ua ((soft sail-poke:sur) a) + :: ?~ ua `this =/ action action.u.ua + :: =. sites + :: ?+ -.action sites + :: %launch (handle-launch +.action) + :: %delist (handle-delist +.action) + :: %delete (handle-delete +.action) + :: :: %add-app + :: :: %hide-app + :: :: %del-app + :: == + :: :_ this (redirect:router eyre-id.u.ua "") + `this + :: ++ handle-launch |= [name=@t] + :: ?: =('' name) sites + :: =/ site (~(get by sites) name) + :: ?~ site + :: =/ nsite *site:sur + :: (~(put by sites) name nsite) + :: =. hidden.u.site .n + :: (~(put by sites) name u.site) + :: ++ handle-delist |= name=@t + :: =/ site (~(get by sites) name) + :: ?~ site sites + :: =. hidden.u.site .y + :: (~(put by sites) name u.site) + + :: ++ handle-delete |= name=@t + :: (~(del by sites) name) + + +++ serve-http |= [id=@ta req=inbound-request:eyre] + =/ weblib ~(. web [bowl id req state]) + :- route:weblib this + +-- +:: +++ on-peek + |= =path + ^- (unit (unit cage)) + :: ~& >> "attempting scry on {}" + ?+ path ~&("unexpected scry into {} on path {}" ~) + [%x %state ~] :- ~ :- ~ :- %json !> + (en:jon sites) + == +++ on-watch + |= =(pole knot) + ?+ pole !! + :: dashboard + [%ui ~] :_ this :~(give-state:hd) + :: site + [%ui rest=*] + :_ this :~((give-site-state:hd rest.pole)) + [%http-response *] `this + [%proxy app=@t rest=*] + :_ this + :: ~ + :_ ~ + (proxy-watch:hd rest.pole our.bowl app.pole) + == +:: +++ on-arvo + |= [=(pole knot) =sign-arvo] + `this + +++ on-agent |= [wire=(pole knot) =sign:agent:gall] + :: ?: ?=(%kick -.sign) :_ this :~((re-watch:hd wire)) + ?. ?=(%fact -.sign) `this + ?+ wire `this + [%ninja-sub app=@t rest=*] + =/ return-path (weld /proxy [app.wire rest.wire]) + =/ =mars:clay [p.cage.sign %json] + =/ mars-path /[a.mars]/[b.mars] + :: this is annoyingly ad-hoc but I'm tired + =/ base ?: ?=(?(%tower %tenna) app.wire) + /(scot %p our.bowl)/[%radio]/(scot %da now.bowl) + /(scot %p our.bowl)/[%groups]/(scot %da now.bowl) + =/ scry-path (weld base mars-path) + =/ mark-conversion-gate .^(tube:clay %cc scry-path) + =/ vas (mark-conversion-gate q.cage.sign) + :_ this :_ ~ + [%give %fact ~[return-path] %json vas] + == +++ on-leave |~(* [~ this]) +++ on-fail |~(* [~ this]) +-- +|_ [s=versioned-state =bowl:gall] +:: cards +++ add-eyre-binding + |= =path ^- card + [%pass /eyre/connect %arvo %e %connect [~ path] dap.bowl] + +++ wipe-eyre-bindings + =/ l .^((list [=binding:eyre duct =action:eyre]) %e /(scot %p our.bowl)/bindings/(scot %da now.bowl)) + =/ cards=(list card) [(add-eyre-binding [dap.bowl ~]) ~] + |- ?~ l cards + =/ target action.i.l + ?. ?=(%app -.target) $(l t.l) + ?. .=(dap.bowl app.target) $(l t.l) + =/ nc (remove-eyre-binding binding.i.l) + =. cards [nc cards] + $(l t.l) + +++ remove-eyre-binding |= =binding:eyre ^- card + [%pass /eyre/disconnect %arvo %e %disconnect binding] + +++ give-state ^- card + [%give %fact ~ [%json !>((en:jon sites))]] +++ give-site-state |= sitepath=path ^- card + =/ usite (~(get by sites) sitepath) + =/ j=json + ?~ usite ~ (en-site:en:jon u.usite) + [%give %fact ~ [%json !>(j)]] + + +++ proxy-watch |= [=path =ship app=term] ^- card + =/ sub-path (weld /ninja-sub [app path]) + [%pass sub-path %agent [ship app] %watch path] +++ re-watch |= wire=(pole knot) ^- card + ?. ?=([%ninja-sub app=@t rest=*] wire) !! + [%pass wire %agent [our.bowl app.wire] %watch rest.wire] + +:: ++ cache-card +:: |= path=tape ^- card +:: =/ pathc (crip "{base-url:cons}{path}") +:: ~& >> caching=pathc +:: =/ router-path ?~ path '/' pathc +:: =/ pl=simple-payload:http (render:rout router-path) +:: =/ entry=cache-entry:eyre [.n %payload pl] +:: [%pass /root %arvo %e %set-response pathc `entry] +:: ++ uncache-card +:: |= path=tape ^- card +:: =/ pathc (crip "{base-url:cons}{path}") +:: ~& >> uncaching=pathc +:: =/ router-path ?~ path '/' pathc +:: =/ pl=simple-payload:http (render:rout router-path) +:: =/ entry=cache-entry:eyre [.n %payload pl] +:: [%pass /root %arvo %e %set-response pathc ~] +-- diff --git a/desk/desk.bill b/desk/desk.bill new file mode 100644 index 0000000..97507e7 --- /dev/null +++ b/desk/desk.bill @@ -0,0 +1,2 @@ +:~ %ucm +== diff --git a/desk/desk.docket-0 b/desk/desk.docket-0 new file mode 100644 index 0000000..1e4e334 --- /dev/null +++ b/desk/desk.docket-0 @@ -0,0 +1,11 @@ +:~ + title+'Urbit Community Manager' + info+'Self-host your whole community on Urbit' + color+0xef.f0f4 + version+[0 1 0] + website+'https://sortug.com' + license+'MIT' + image+'https://s3.sortug.com/img/icons/ucm-logo.png' + base+'ucm' + glob-http+['https://s3.sortug.com/globs/glob-0v1.fiva2.d83ct.k90tn.n7tjl.58mjq.glob' 0v1.fiva2.d83ct.k90tn.n7tjl.58mjq] +== diff --git a/desk/desk.ship b/desk/desk.ship new file mode 100644 index 0000000..6d9f878 --- /dev/null +++ b/desk/desk.ship @@ -0,0 +1 @@ +~dister-bonbud-macryg \ No newline at end of file diff --git a/desk/gen/blog/export.hoon b/desk/gen/blog/export.hoon new file mode 100644 index 0000000..f9fa526 --- /dev/null +++ b/desk/gen/blog/export.hoon @@ -0,0 +1,5 @@ +:- %say +:: css is whether to append the css to exported html in ') +:: +++ http-response-cards + |= [id=@tas hed=response-header:http data=(unit octs)] + ^- (list card:agent:gall) + =/ paths [/http-response/[id]]~ + :~ [%give %fact paths %http-response-header !>(hed)] + [%give %fact paths %http-response-data !>(data)] + [%give %kick paths ~] + == +++ serve + |= [eyre-id=@ta =simple-payload:http] + ^- (list card:agent:gall) + =/ header-cage + [%http-response-header !>(response-header.simple-payload)] + =/ data-cage + [%http-response-data !>(data.simple-payload)] + :~ [%give %fact ~[/http-response/[eyre-id]] header-cage] + [%give %fact ~[/http-response/[eyre-id]] data-cage] + [%give %kick ~[/http-response/[eyre-id]] ~] + == ++$ request-line + $: [ext=(unit @ta) site=(list @t)] + args=(list [key=@t value=@t]) + == +:: +parse-request-line: take a cord and parse out a url +:: +++ parse-request-line + |= url=@t + ^- request-line + (fall (rush url ;~(plug apat:de-purl:html yque:de-purl:html)) [[~ ~] ~]) +++ serve-manx |= =manx ^- simple-payload:http + :- [200 [['content-type' 'text/html'] ~]] + `(as-octt:mimes:html (en-xml:html manx)) + +++ serve-file |= [name=@t htmls=@t] ^- simple-payload:http + :- [200 [['content-type' 'text/html'] ~]] + `(as-octs:mimes:html htmls) + +++ insert |= [layout=manx body=marl] ^- manx + =/ m layout + |- + ?~ c.m m + ?: .=(%body n.g.i.c.m) + =. c.i.c.m (weld c.i.c.m body) m + $(c.m t.c.m) +++ login-page + |= redirect=tape + ^- manx +:: TODO + =/ css ^~ %- trip + ''' + #login{ + margin-top: 3rem; + & h1, & p { + text-align: center; + } + & form{ + margin: auto; + width: 50%; + text-align: center; + + & input[type=text]{ + outline: none; + padding: 0.5rem; + } + & button{ + display: block; + margin: 1rem auto; + padding: 0.4rem; + background-color: white; + } + + } + } + ''' +;html + ;head + ;title:"Sblog" + ;meta(charset "utf-8"); + == + ;body + ;div#login.blog + ;style: {css} + ;h1: Login + ;p: Please login to your Urbit ID to access this page. + ;form(action "/~/login", method "post") + ;input.mono(type "text") + =name "name" + =id "name" + =placeholder "~sorreg-namtyv" + =required "true" + =minlength "4" + =maxlength "14" + =pattern "~((([a-z]\{6})\{1,2}-\{0,2})+|[a-z]\{3})"; + ;input(type "hidden", name "redirect", value redirect); + ;button(name "eauth", type "submit"):"Login" + == + == + == +== +++ not-found-page ^- manx +:: TODO +;html + ;head + ;title:"Sblog" + ;meta(charset "utf-8"); + == + ;body + ;p:"404" + == +== +++ layout ^- manx +;html + ;head + ;title:"Sblog" + ;meta(charset "utf-8"); + == + ;body + ;span; + == +== +-- diff --git a/desk/lib/web.hoon b/desk/lib/web.hoon new file mode 100644 index 0000000..4b0fb67 --- /dev/null +++ b/desk/lib/web.hoon @@ -0,0 +1,319 @@ +/- sur=ucm, docket +/+ server, jon=json, sr=sortug, metamask, cons=constants +|_ [=bowl:gall eyre-id=@ta req=inbound-request:eyre =state:sur] ++$ card card:agent:gall +++ session-timeout ~d300 +:: +++ get-file-at + |= [base=path file=path ext=@ta] + ^- (unit octs) + =/ =path + :* (scot %p our.bowl) + q.byk.bowl + (scot %da now.bowl) + (snoc (weld base file) ext) + == + ?. .^(? %cu path) ~ + %- some + %- as-octs:mimes:html + .^(@ %cx path) + +++ handle-get-request + |= [headers=header-list:http request-line:server] + ^- simple-payload:http + ?~ ext $(ext `%html, site [%index ~]) + ?: ?=([%ucm *] site) $(site +.site) + :: serve dynamic session.js + :: + ?: =([/session `%js] [site ext]) + %- js-response:gen:server + %- as-octt:mimes:html + """ + window.ship = '{(scow %p src.bowl)}'; + """ + =/ file=(unit octs) + (get-file-at /web site u.ext) + ?~ file ~& "file not found" not-found:gen:server + ?+ u.ext not-found:gen:server + %html (html-response:gen:server u.file) + %js (js-response:gen:server u.file) + %css (css-response:gen:server u.file) + %png (png-response:gen:server u.file) + == + + + + + + + + +++ route + :: set cookie + =/ metalib ~(. metamask [sessions.state bowl]) + =/ rl (parse-request-line:server url.request.req) + =/ sitepath=path /[(head site.rl)] + =/ pat=(pole knot) site.rl + ?: .=(%'PUT' method.request.req) (ninja-put pat) + ?+ pat ebail + [%ucm %metamask rest=*] (serve-metamask-challenge:metalib eyre-id) + [%ucm %auth rest=*] (process-metamask-auth:metalib eyre-id body.request.req) + [%ucm %api rest=*] (serve-site-json rest.pat) + [%ucm %napi rest=*] (ninja-scry rest.pat) + [site=@t *] (send-response (handle-get-request header-list.request.req rl)) + == ++$ channel-request + $% :: %ack: acknowledges that the client has received events up to :id + :: + [%ack event-id=@ud] + :: %poke: pokes an application, validating :noun against :mark + :: + [%poke request-id=@ud ship=@p app=term mark=@tas =noun] + :: %poke-json: pokes an application, translating :json to :mark + :: + :: TODO important!! must add desk + [%poke-json request-id=@ud ship=@p desk=term app=term mark=@tas =json] + :: %watch: subscribes to an application path + :: + [%subscribe request-id=@ud ship=@p app=term =path] + :: %leave: unsubscribes from an application path + :: + [%unsubscribe request-id=@ud subscription-id=@ud] + :: %delete: kills a channel + :: + [%delete ~] + == +++ parse-channel-request-json + |= request-list=json + ^- (unit (list channel-request)) + :: parse top + :: + =, dejs-soft:format + =- ((ar -) request-list) + :: + |= item=json + ^- (unit channel-request) + :: + ?~ maybe-key=((ot action+so ~) item) + ~ + ?: =('ack' u.maybe-key) + ((pe %ack (ot event-id+ni ~)) item) + ?: =('poke' u.maybe-key) + %. item + %+ pe %poke-json + :: TODO important!! must add desk + (ot id+ni ship+(su fed:ag) desk+so app+so mark+(su sym) json+some ~) + ?: =('subscribe' u.maybe-key) + %. item + %+ pe %subscribe + (ot id+ni ship+(su fed:ag) app+so path+(su stap) ~) + ?: =('unsubscribe' u.maybe-key) + %. item + %+ pe %unsubscribe + (ot id+ni subscription+ni ~) + ?: =('delete' u.maybe-key) + `[%delete ~] + :: if we reached this, we have an invalid action key. fail parsing. + :: + ~ + + +++ ninja-put |= pat=(pole knot) + ^- (list card) + =/ octs body.request.req + ?~ octs ~|(%empty-auth-request !!) + =/ jon (de:json:html q.u.octs) + ?~ jon ~|(%empty-auth-json !!) + %+ weld + %- send-response + (json-response:gen:server [%s 'ok']) + =/ body=json u.jon + =/ mchan-reqs (parse-channel-request-json body) + ?~ mchan-reqs ~ + %+ roll u.mchan-reqs |= [cr=channel-request acc=(list card)] + ?+ -.cr acc + %poke-json + :: TODO channels has ?>(.=(our.bowl src.bowk)) + :: channels-server has ?>(.=(src.bowl author.essay)) + :: damn wat do + =/ =mars:clay [%json mark.cr] + =/ mars-path /[a.mars]/[b.mars] + =/ base /(scot %p our.bowl)/[desk.cr]/(scot %da now.bowl) + =/ scry-path (weld base mars-path) + =/ mark-conversion-gate .^(tube:clay %cc scry-path) + =/ vas (mark-conversion-gate !>(json.cr)) + :_ acc + [%pass /ninja-poke %agent [ship.cr app.cr] %poke mark.cr vas] + == + + :: ~& ninja-put=pat + :: ?. ?=([%ucm rest=*] pat) !! + :: =/ channel-url (path:enjs:format rest.pat) + :: ?. ?=(%s -.channel-url) !! + :: :_ ~ + :: [%pass /ninja-poke %arvo %k %fard %ucm %iris-thread %noun !>([+.channel-url request.req])] + :: ~& ninja-put=req + :: =/ octs body.request.req + :: ?~ octs ~|(%empty-auth-request !!) + :: =/ jon (de:json:html q.u.octs) + :: ?~ jon ~|(%empty-auth-json !!) + :: =/ body=json u.jon + :: ~& (en:json:html body) +++ session-cookie-string + |= [session=@uv extend=?] + ^- @t + %- crip + =; max-age=tape + :: "urbauth-{(scow %p src.bowl)}={(scow %uv session)}; Path=/; Max-Age={max-age}" + "ucm-{(scow %p src.bowl)}={(scow %uv session)}; Path=/; Max-Age={max-age}" + %+ scow:parsing:sr %ud + ?. extend 0 + (div (msec:milly session-timeout) 1.000) +++ session-id-from-request + |= =request:http + ^- (unit @uv) + :: are there cookies passed with this request? + :: + =/ cookie-header=@t + %+ roll header-list.request + |= [[key=@t value=@t] c=@t] + ?. =(key 'cookie') + c + (cat 3 (cat 3 c ?~(c 0 '; ')) value) + :: is the cookie line valid? + :: + ?~ cookies=(rush cookie-header cock:de-purl:html) + ~ + :: is there an urbauth cookie? + :: + ?~ urbauth=(get-header:http (crip "urblog-{(scow %p src.bowl)}") u.cookies) + ~ + :: if it's formatted like a valid session cookie, produce it + :: + `(unit @)`(rush u.urbauth ;~(pfix (jest '0v') viz:ag)) +++ send-response + |= =simple-payload:http + =/ cookie ['set-cookie' (session-cookie-string 0vublog .y)] + =. headers.response-header.simple-payload + [cookie headers.response-header.simple-payload] + %+ give-simple-payload:app:server eyre-id simple-payload + +++ ebail + ^- (list card:agent:gall) + (send-response pbail) +++ egive + |= pl=simple-payload:http + ^- (list card:agent:gall) + (send-response pl) +++ pbail + %- html-response:gen:server + %- manx-to-octs:server + manx-bail +++ manx-bail ^- manx ;div:"404" +++ manx-payload + |= =manx + ^- simple-payload:http + %- html-response:gen:server + %- manx-to-octs:server manx +:: +++ serve-site-json :: serve site state and group state + |= =path + =/ site (~(get by sites.state) path) + ?~ site ebail + =/ site-j=json (en-site:en:jon u.site) + + =/ group-j .^(json %gx /(scot %p our.bowl)/groups/(scot %da now.bowl)/groups/(scot %p our.bowl)/[groupname.u.site]/v1/json) + =/ j=json %- pairs:enjs:format + :~ group+group-j + site+site-j + == + %- send-response + (json-response:gen:server j) +++ ninja-scry :: serve site state and group state + |= pat=path + :: ~& >> ninja-scry=[eyre-id pat] + ?~ pat !! + =/ [app=@t rest=path] pat + =/ base /(scot %p our.bowl)/[app]/(scot %da now.bowl) + =/ scrypath (weld (weld base rest) /json) + =/ res .^(json %gx scrypath) + %- send-response + (json-response:gen:server res) + + :: async function scryGroups() { + :: const app = "groups"; + :: const path = "/groups/v1"; + :: return await scry(app, path); + :: } + + :: async function scryDiary( + :: ship: Ship, + :: name: string, + :: count: number, + :: ): Promise { + :: const app = "channels"; + :: const path = `/v1/diary/${ship}/${name}/posts/newest/${count}/post`; + :: return await scry(app, path); + :: } + :: async function scryDiaryPost( + :: ship: Ship, + :: name: string, + :: id: string, + :: ): Promise { + :: const app = "channels"; + :: const path = `/v1/diary/${ship}/${name}/posts/post/${id}`; + :: return await scry(app, path); + :: } + :: async function scryChat( + :: ship: Ship, + :: name: string, + :: count: number, + :: ): Promise { + :: const app = "channels"; + :: const path = `/v1/chat/${ship}/${name}/posts/newest/${count}/post`; + :: return await scry(app, path); + :: } + + :: // other apps + + :: async function scryPikes() { + :: const app = "hood"; + :: const path = "/kiln/pikes"; + :: return await scry(app, path); + :: } + + + + + + +++ payload-from-glob + |= [=glob:docket what=request-line:server eyre-id=@ta] + %- send-response + ^- simple-payload:http + =/ suffix=path + (weld site.what (drop ext.what)) + ?: =(suffix /desk/js) + %- inline-js-response + (rap 3 'window.desk = "' %ucm '";' ~) + =? suffix !(~(has by glob) suffix) + (turn suffix |=(s=@t (crip (en-urlt:html (trip s))))) + =/ requested + ?: (~(has by glob) suffix) suffix + %+ weld suffix /index/html + =/ data=mime + (~(got by glob) requested) + =/ mime-type=@t (rsh 3 (crip )) + =; headers + [[200 headers] `q.data] + :- content-type+mime-type + ?: =(/index/html requested) ~ + ~[max-1-wk:gen:server] +++ inline-js-response + |= js=cord + ^- simple-payload:http + %. (as-octs:mimes:html js) + %* . js-response:gen:server + cache %.n + == +-- diff --git a/desk/mar/arch.hoon b/desk/mar/arch.hoon new file mode 100644 index 0000000..ff1dfa5 --- /dev/null +++ b/desk/mar/arch.hoon @@ -0,0 +1,16 @@ +|_ arch=(list @ta) +:: +++ grab + |% + ++ noun (list @ta) + -- +:: +++ grow + |% + ++ noun arch + ++ json + [%a (turn arch |=(c=@ta [%s c]))] + -- +:: +++ grad %noun +-- diff --git a/desk/mar/bill.hoon b/desk/mar/bill.hoon new file mode 100644 index 0000000..76cef34 --- /dev/null +++ b/desk/mar/bill.hoon @@ -0,0 +1,34 @@ +|_ bil=(list dude:gall) +++ grow + |% + ++ mime `^mime`[/text/x-bill (as-octs:mimes:html hoon)] + ++ noun bil + ++ hoon + ^- @t + |^ (crip (of-wall:format (wrap-lines (spit-duz bil)))) + :: + ++ wrap-lines + |= taz=wall + ^- wall + ?~ taz ["~"]~ + :- (weld ":~ " i.taz) + %- snoc :_ "==" + (turn t.taz |=(t=tape (weld " " t))) + :: + ++ spit-duz + |= duz=(list dude:gall) + ^- wall + (turn duz |=(=dude:gall ['%' (trip dude)])) + -- + ++ txt (to-wain:format hoon) + -- +++ grab + |% + ++ noun (list dude:gall) + ++ mime + |= [=mite len=@ud tex=@] + ~_ tex + !<((list dude:gall) (slap !>(~) (ream tex))) + -- +++ grad %noun +-- diff --git a/desk/mar/css.hoon b/desk/mar/css.hoon new file mode 100644 index 0000000..c4810b2 --- /dev/null +++ b/desk/mar/css.hoon @@ -0,0 +1,21 @@ +:: +:::: /hoon/css/mar + :: +/? 310 +=, eyre +=, mimes:html +|_ mud=@t +++ grow :: convert to + |% ++ mime [/text/css (as-octs mud)] :: convert to %mime + ++ elem ;style :: convert to %hymn + ;- (trip mud) + == + ++ hymn ;html:(head:"{elem}" body) + -- +++ grab + |% :: convert from + ++ mime |=([p=mite q=octs] (@t q.q)) + ++ noun @t :: clam from %noun + -- +++ grad %mime +-- diff --git a/desk/mar/docket-0.hoon b/desk/mar/docket-0.hoon new file mode 100644 index 0000000..911d34c --- /dev/null +++ b/desk/mar/docket-0.hoon @@ -0,0 +1,25 @@ +/+ dock=docket +|_ =docket:dock +++ grow + |% + ++ mime + ^- ^mime + [/text/x-docket (as-octt:mimes:html (spit-docket:mime:dock docket))] + ++ noun docket + ++ json (docket:enjs:dock docket) + -- +++ grab + |% + :: + ++ mime + |= [=mite len=@ud tex=@] + ^- docket:dock + %- need + %- from-clauses:mime:dock + !<((list clause:dock) (slap !>(~) (ream tex))) + + :: + ++ noun docket:dock + -- +++ grad %noun +-- diff --git a/desk/mar/docket/install.hoon b/desk/mar/docket/install.hoon new file mode 100644 index 0000000..3f021b6 --- /dev/null +++ b/desk/mar/docket/install.hoon @@ -0,0 +1,14 @@ +|_ [=ship =desk] +++ grad %noun +++ grow + |% + ++ noun [ship desk] + ++ json `^json`s+(crip "{(scow %p ship)}/{(trip desk)}") + -- +++ grab + |% + ++ noun _[ship desk] + ++ json + (su:dejs:format ;~((glue fas) ;~(pfix sig fed:ag) sym)) + -- +-- diff --git a/desk/mar/docket/uninstall.hoon b/desk/mar/docket/uninstall.hoon new file mode 100644 index 0000000..335cd95 --- /dev/null +++ b/desk/mar/docket/uninstall.hoon @@ -0,0 +1,13 @@ +|_ =desk +++ grad %noun +++ grow + |% + ++ noun desk + ++ json s+desk + -- +++ grab + |% + ++ noun ^desk + ++ json so:dejs:format + -- +-- diff --git a/desk/mar/hoon.hoon b/desk/mar/hoon.hoon new file mode 100644 index 0000000..b6f5906 --- /dev/null +++ b/desk/mar/hoon.hoon @@ -0,0 +1,49 @@ +:::: /hoon/hoon/mar + :: +/? 310 +:: +=, eyre +|_ own=@t +:: +++ grow :: convert to + |% + ++ mime `^mime`[/text/x-hoon (as-octs:mimes:html own)] :: convert to %mime + ++ elem :: convert to %html + ;div:pre(urb_codemirror "", mode "hoon"):"{(trip own)}" + :: =+ gen-id="src-{<`@ui`(mug own)>}" + :: ;div + :: ;textarea(id "{gen-id}"):"{(trip own)}" + :: ;script:""" + :: CodeMirror.fromTextArea( + :: window[{}], + :: \{lineNumbers:true, readOnly:true} + :: ) + :: """ + :: == + ++ hymn + :: ;html:(head:title:"Source" "+{elem}") + ;html + ;head + ;title:"Source" + ;script@"//cdnjs.cloudflare.com/ajax/libs/codemirror/4.3.0/codemirror.js"; + ;script@"/lib/syntax/hoon.js"; + ;link(rel "stylesheet", href "//cdnjs.cloudflare.com/ajax/libs/". + "codemirror/4.3.0/codemirror.min.css"); + ;link/"/lib/syntax/codemirror.css"(rel "stylesheet"); + == + ;body + ;textarea#src:"{(trip own)}" + ;script:'CodeMirror.fromTextArea(src, {lineNumbers:true, readOnly:true})' + == + == + ++ txt + (to-wain:format own) + -- +++ grab + |% :: convert from + ++ mime |=([p=mite q=octs] q.q) + ++ noun @t :: clam from %noun + ++ txt of-wain:format + -- +++ grad %txt +-- diff --git a/desk/mar/html.hoon b/desk/mar/html.hoon new file mode 100644 index 0000000..203d75f --- /dev/null +++ b/desk/mar/html.hoon @@ -0,0 +1,22 @@ +:: +:::: /hoon/html/mar + :: +/? 310 + :: +:::: compute + :: +=, html +|_ htm=@t +++ grow :: convert to + ^? + |% :: + ++ mime [/text/html (met 3 htm) htm] :: to %mime + ++ hymn (need (de-xml htm)) :: to %hymn + -- :: +++ grab ^? + |% :: convert from + ++ noun @t :: clam from %noun + ++ mime |=([p=mite q=octs] q.q) :: retrieve form %mime + -- +++ grad %mime +-- diff --git a/desk/mar/ico.hoon b/desk/mar/ico.hoon new file mode 100644 index 0000000..e862b9b --- /dev/null +++ b/desk/mar/ico.hoon @@ -0,0 +1,12 @@ +|_ dat=@ +++ grow + |% + ++ mime [/image/x-icon (as-octs:mimes:html dat)] + -- +++ grab + |% + ++ mime |=([p=mite q=octs] q.q) + ++ noun @ + -- +++ grad %mime +-- diff --git a/desk/mar/js.hoon b/desk/mar/js.hoon new file mode 100644 index 0000000..fe010d9 --- /dev/null +++ b/desk/mar/js.hoon @@ -0,0 +1,25 @@ +:: +:::: /hoon/js/mar + :: +/? 310 +:: +=, eyre +|_ mud=@ +++ grow + |% + ++ mime [/application/javascript (as-octs:mimes:html (@t mud))] + ++ hymn :: convert to %hymn + |^ html + ++ script ;script + ;- (trip (@t mud)) + == + ++ html ;html:(head:"{script}" body) + -- + -- +++ grab + |% :: convert from + ++ mime |=([p=mite q=octs] (@t q.q)) + ++ noun cord :: clam from %noun + -- +++ grad %mime +-- diff --git a/desk/mar/json.hoon b/desk/mar/json.hoon new file mode 100644 index 0000000..7d6fcbf --- /dev/null +++ b/desk/mar/json.hoon @@ -0,0 +1,26 @@ +:: +:::: /hoon/json/mar + :: +/? 310 + :: +:::: compute + :: +=, eyre +=, format +=, html +|_ jon=^json +:: +++ grow :: convert to + |% + ++ mime [/application/json (as-octs:mimes -:txt)] :: convert to %mime + ++ txt [(en:json jon)]~ + -- +++ grab + |% :: convert from + ++ mime |=([p=mite q=octs] (fall (de:json (@t q.q)) *^json)) + ++ noun ^json :: clam from %noun + ++ numb numb:enjs + ++ time time:enjs + -- +++ grad %mime +-- diff --git a/desk/mar/kelvin.hoon b/desk/mar/kelvin.hoon new file mode 100644 index 0000000..7f1b409 --- /dev/null +++ b/desk/mar/kelvin.hoon @@ -0,0 +1,28 @@ +|_ kal=waft:clay +++ grow + |% + ++ mime `^mime`[/text/x-kelvin (as-octs:mimes:html hoon)] + ++ noun kal + ++ hoon + %+ rap 3 + %+ turn + %+ sort + ~(tap in (waft-to-wefts:clay kal)) + |= [a=weft b=weft] + ?: =(lal.a lal.b) + (gte num.a num.b) + (gte lal.a lal.b) + |= =weft + (rap 3 '[%' (scot %tas lal.weft) ' ' (scot %ud num.weft) ']\0a' ~) + :: + ++ txt (to-wain:format hoon) + -- +++ grab + |% + ++ noun waft:clay + ++ mime + |= [=mite len=@ud tex=@] + (cord-to-waft:clay tex) + -- +++ grad %noun +-- diff --git a/desk/mar/md.hoon b/desk/mar/md.hoon new file mode 100644 index 0000000..4f790f8 --- /dev/null +++ b/desk/mar/md.hoon @@ -0,0 +1,20 @@ +:: +:::: /hoon/md/mar + :: +/? 310 +:: +=, format +=, mimes:html +|_ txt=wain +:: +++ grab :: convert from + |% + ++ mime |=((pair mite octs) (to-wain q.q)) + ++ noun wain :: clam from %noun + -- +++ grow + |% + ++ mime [/text/plain (as-octs (of-wain txt))] + -- +++ grad %mime +-- diff --git a/desk/mar/mime.hoon b/desk/mar/mime.hoon new file mode 100644 index 0000000..83b4dae --- /dev/null +++ b/desk/mar/mime.hoon @@ -0,0 +1,32 @@ +:: +:::: /hoon/mime/mar + :: +/? 310 +:: +|_ own=mime +++ grow + ^? + |% + ++ jam `@`q.q.own + -- +:: +++ grab :: convert from + ^? + |% + ++ noun mime :: clam from %noun + ++ tape + |=(a=_"" [/application/x-urb-unknown (as-octt:mimes:html a)]) + -- +++ grad + ^? + |% + ++ form %mime + ++ diff |=(mime +<) + ++ pact |=(mime +<) + ++ join |=([mime mime] `(unit mime)`~) + ++ mash + |= [[ship desk mime] [ship desk mime]] + ^- mime + ~|(%mime-mash !!) + -- +-- diff --git a/desk/mar/ninja.hoon b/desk/mar/ninja.hoon new file mode 100644 index 0000000..7d6fcbf --- /dev/null +++ b/desk/mar/ninja.hoon @@ -0,0 +1,26 @@ +:: +:::: /hoon/json/mar + :: +/? 310 + :: +:::: compute + :: +=, eyre +=, format +=, html +|_ jon=^json +:: +++ grow :: convert to + |% + ++ mime [/application/json (as-octs:mimes -:txt)] :: convert to %mime + ++ txt [(en:json jon)]~ + -- +++ grab + |% :: convert from + ++ mime |=([p=mite q=octs] (fall (de:json (@t q.q)) *^json)) + ++ noun ^json :: clam from %noun + ++ numb numb:enjs + ++ time time:enjs + -- +++ grad %mime +-- diff --git a/desk/mar/noun.hoon b/desk/mar/noun.hoon new file mode 100644 index 0000000..7fe50f1 --- /dev/null +++ b/desk/mar/noun.hoon @@ -0,0 +1,22 @@ +:: +:::: /hoon/noun/mar + :: +/? 310 +!: +|_ non=* +++ grab |% + ++ noun * + ++ mime |=([p=mite q=octs] (cue q.q)) + -- +++ grow |% + ++ mime [/application/octet-stream (as-octs:mimes:html (jam non))] + -- +++ grad + |% + ++ form %noun + ++ diff |=(* +<) + ++ pact |=(* +<) + ++ join |=([* *] *(unit *)) + ++ mash |=([[ship desk *] [ship desk *]] `*`~|(%noun-mash !!)) + -- +-- diff --git a/desk/mar/png.hoon b/desk/mar/png.hoon new file mode 100644 index 0000000..6a60a6a --- /dev/null +++ b/desk/mar/png.hoon @@ -0,0 +1,12 @@ +|_ dat=@ +++ grow + |% + ++ mime [/image/png (as-octs:mimes:html dat)] + -- +++ grab + |% + ++ mime |=([p=mite q=octs] q.q) + ++ noun @ + -- +++ grad %mime +-- diff --git a/desk/mar/ship.hoon b/desk/mar/ship.hoon new file mode 100644 index 0000000..176bcad --- /dev/null +++ b/desk/mar/ship.hoon @@ -0,0 +1,20 @@ +|_ s=ship +++ grad %noun +++ grow + |% + ++ noun s + ++ json s+(scot %p s) + ++ mime + ^- ^mime + [/text/x-ship (as-octt:mimes:html (scow %p s))] + + -- +++ grab + |% + ++ noun ship + ++ json (su:dejs:format ;~(pfix sig fed:ag)) + ++ mime + |= [=mite len=@ tex=@] + (slav %p (snag 0 (to-wain:format tex))) + -- +-- diff --git a/desk/mar/sss/blog-paths.hoon b/desk/mar/sss/blog-paths.hoon new file mode 100644 index 0000000..9b746e3 --- /dev/null +++ b/desk/mar/sss/blog-paths.hoon @@ -0,0 +1,6 @@ +:: +:: XX remove this file in transition to %4 +:: +/- blog-paths +/+ *sss +(mk-mar blog-paths) diff --git a/desk/mar/sss/to-pub.hoon b/desk/mar/sss/to-pub.hoon new file mode 100644 index 0000000..a042502 --- /dev/null +++ b/desk/mar/sss/to-pub.hoon @@ -0,0 +1,15 @@ +:: +:: XX remove this file in transition to %4 +:: +/- *sss +|_ =(request:poke) +++ grow + |% + ++ noun request + -- +++ grab + |% + ++ noun (request:poke) + -- +++ grad %noun +-- diff --git a/desk/mar/svg.hoon b/desk/mar/svg.hoon new file mode 100644 index 0000000..2911e49 --- /dev/null +++ b/desk/mar/svg.hoon @@ -0,0 +1,12 @@ +|_ dat=@ +++ grow + |% + ++ mime [/image/'svg+xml' (as-octs:mimes:html dat)] + -- +++ grab + |% + ++ mime |=([p=mite q=octs] q.q) + ++ noun @ + -- +++ grad %mime +-- diff --git a/desk/mar/txt.hoon b/desk/mar/txt.hoon new file mode 100644 index 0000000..982dce9 --- /dev/null +++ b/desk/mar/txt.hoon @@ -0,0 +1,274 @@ +:: +:::: /hoon/txt/mar + :: +/? 310 +:: +=, clay +=, differ +=, format +=, mimes:html +|_ txt=wain +:: +++ grab :: convert from + |% + ++ mime |=((pair mite octs) (to-wain q.q)) + ++ noun wain :: clam from %noun + -- +++ grow + => v=. + |% + ++ mime => v [/text/plain (as-octs (of-wain txt))] + -- +++ grad + |% + ++ form %txt-diff + ++ diff + |= tyt=wain + ^- (urge cord) + (lusk txt tyt (loss txt tyt)) + :: + ++ pact + |= dif=(urge cord) + ~| [%pacting dif] + ^- wain + (lurk txt dif) + :: + ++ join + |= [ali=(urge cord) bob=(urge cord)] + ^- (unit (urge cord)) + |^ + =. ali (clean ali) + =. bob (clean bob) + |- ^- (unit (urge cord)) + ?~ ali `bob + ?~ bob `ali + ?- -.i.ali + %& + ?- -.i.bob + %& + ?: =(p.i.ali p.i.bob) + %+ bind $(ali t.ali, bob t.bob) + |=(cud=(urge cord) [i.ali cud]) + ?: (gth p.i.ali p.i.bob) + %+ bind $(p.i.ali (sub p.i.ali p.i.bob), bob t.bob) + |=(cud=(urge cord) [i.bob cud]) + %+ bind $(ali t.ali, p.i.bob (sub p.i.bob p.i.ali)) + |=(cud=(urge cord) [i.ali cud]) + :: + %| + ?: =(p.i.ali (lent p.i.bob)) + %+ bind $(ali t.ali, bob t.bob) + |=(cud=(urge cord) [i.bob cud]) + ?: (gth p.i.ali (lent p.i.bob)) + %+ bind $(p.i.ali (sub p.i.ali (lent p.i.bob)), bob t.bob) + |=(cud=(urge cord) [i.bob cud]) + ~ + == + :: + %| + ?- -.i.bob + %| + ?. =(i.ali i.bob) + ~ + %+ bind $(ali t.ali, bob t.bob) + |=(cud=(urge cord) [i.ali cud]) + :: + %& + ?: =(p.i.bob (lent p.i.ali)) + %+ bind $(ali t.ali, bob t.bob) + |=(cud=(urge cord) [i.ali cud]) + ?: (gth p.i.bob (lent p.i.ali)) + %+ bind $(ali t.ali, p.i.bob (sub p.i.bob (lent p.i.ali))) + |=(cud=(urge cord) [i.ali cud]) + ~ + == + == + ++ clean :: clean + |= wig=(urge cord) + ^- (urge cord) + ?~ wig ~ + ?~ t.wig wig + ?: ?=(%& -.i.wig) + ?: ?=(%& -.i.t.wig) + $(wig [[%& (add p.i.wig p.i.t.wig)] t.t.wig]) + [i.wig $(wig t.wig)] + ?: ?=(%| -.i.t.wig) + $(wig [[%| (welp p.i.wig p.i.t.wig) (welp q.i.wig q.i.t.wig)] t.t.wig]) + [i.wig $(wig t.wig)] + -- + :: + ++ mash + |= $: [als=ship ald=desk ali=(urge cord)] + [bos=ship bod=desk bob=(urge cord)] + == + ^- (urge cord) + |^ + =. ali (clean ali) + =. bob (clean bob) + |- ^- (urge cord) + ?~ ali bob + ?~ bob ali + ?- -.i.ali + %& + ?- -.i.bob + %& + ?: =(p.i.ali p.i.bob) + [i.ali $(ali t.ali, bob t.bob)] + ?: (gth p.i.ali p.i.bob) + [i.bob $(p.i.ali (sub p.i.ali p.i.bob), bob t.bob)] + [i.ali $(ali t.ali, p.i.bob (sub p.i.bob p.i.ali))] + :: + %| + ?: =(p.i.ali (lent p.i.bob)) + [i.bob $(ali t.ali, bob t.bob)] + ?: (gth p.i.ali (lent p.i.bob)) + [i.bob $(p.i.ali (sub p.i.ali (lent p.i.bob)), bob t.bob)] + =/ [fic=(unce cord) ali=(urge cord) bob=(urge cord)] + (resolve ali bob) + [fic $(ali ali, bob bob)] + :: ~ :: here, alice is good for a while, but not for the whole + == :: length of bob's changes + :: + %| + ?- -.i.bob + %| + =/ [fic=(unce cord) ali=(urge cord) bob=(urge cord)] + (resolve ali bob) + [fic $(ali ali, bob bob)] + :: + %& + ?: =(p.i.bob (lent p.i.ali)) + [i.ali $(ali t.ali, bob t.bob)] + ?: (gth p.i.bob (lent p.i.ali)) + [i.ali $(ali t.ali, p.i.bob (sub p.i.bob (lent p.i.ali)))] + =/ [fic=(unce cord) ali=(urge cord) bob=(urge cord)] + (resolve ali bob) + [fic $(ali ali, bob bob)] + == + == + :: + ++ annotate :: annotate conflict + |= $: ali=(list @t) + bob=(list @t) + bas=(list @t) + == + ^- (list @t) + %- zing + ^- (list (list @t)) + %- flop + ^- (list (list @t)) + :- :_ ~ + %^ cat 3 '<<<<<<<<<<<<' + %^ cat 3 ' ' + %^ cat 3 `@t`(scot %p bos) + %^ cat 3 '/' + bod + + :- bob + :- ~['------------'] + :- bas + :- ~['++++++++++++'] + :- ali + :- :_ ~ + %^ cat 3 '>>>>>>>>>>>>' + %^ cat 3 ' ' + %^ cat 3 `@t`(scot %p als) + %^ cat 3 '/' + ald + ~ + :: + ++ clean :: clean + |= wig=(urge cord) + ^- (urge cord) + ?~ wig ~ + ?~ t.wig wig + ?: ?=(%& -.i.wig) + ?: ?=(%& -.i.t.wig) + $(wig [[%& (add p.i.wig p.i.t.wig)] t.t.wig]) + [i.wig $(wig t.wig)] + ?: ?=(%| -.i.t.wig) + $(wig [[%| (welp p.i.wig p.i.t.wig) (welp q.i.wig q.i.t.wig)] t.t.wig]) + [i.wig $(wig t.wig)] + :: + ++ resolve + |= [ali=(urge cord) bob=(urge cord)] + ^- [fic=[%| p=(list cord) q=(list cord)] ali=(urge cord) bob=(urge cord)] + =- [[%| bac (annotate alc boc bac)] ali bob] + |- ^- $: $: bac=(list cord) + alc=(list cord) + boc=(list cord) + == + ali=(urge cord) + bob=(urge cord) + == + ?~ ali [[~ ~ ~] ali bob] + ?~ bob [[~ ~ ~] ali bob] + ?- -.i.ali + %& + ?- -.i.bob + %& [[~ ~ ~] ali bob] :: no conflict + %| + =+ lob=(lent p.i.bob) + ?: =(lob p.i.ali) + [[p.i.bob p.i.bob q.i.bob] t.ali t.bob] + ?: (lth lob p.i.ali) + [[p.i.bob p.i.bob q.i.bob] [[%& (sub p.i.ali lob)] t.ali] t.bob] + =+ wat=(scag (sub lob p.i.ali) p.i.bob) + =+ ^= res + %= $ + ali t.ali + bob [[%| (scag (sub lob p.i.ali) p.i.bob) ~] t.bob] + == + :* :* (welp bac.res wat) + (welp alc.res wat) + (welp boc.res q.i.bob) + == + ali.res + bob.res + == + == + :: + %| + ?- -.i.bob + %& + =+ loa=(lent p.i.ali) + ?: =(loa p.i.bob) + [[p.i.ali q.i.ali p.i.ali] t.ali t.bob] + ?: (lth loa p.i.bob) + [[p.i.ali q.i.ali p.i.ali] t.ali [[%& (sub p.i.bob loa)] t.bob]] + =+ wat=(slag (sub loa p.i.bob) p.i.ali) + =+ ^= res + %= $ + ali [[%| (scag (sub loa p.i.bob) p.i.ali) ~] t.ali] + bob t.bob + == + :* :* (welp bac.res wat) + (welp alc.res q.i.ali) + (welp boc.res wat) + == + ali.res + bob.res + == + :: + %| + =+ loa=(lent p.i.ali) + =+ lob=(lent p.i.bob) + ?: =(loa lob) + [[p.i.ali q.i.ali q.i.bob] t.ali t.bob] + =+ ^= res + ?: (gth loa lob) + $(ali [[%| (scag (sub loa lob) p.i.ali) ~] t.ali], bob t.bob) + ~& [%scagging loa=loa pibob=p.i.bob slag=(scag loa p.i.bob)] + $(ali t.ali, bob [[%| (scag (sub lob loa) p.i.bob) ~] t.bob]) + :* :* (welp bac.res ?:((gth loa lob) p.i.bob p.i.ali)) + (welp alc.res q.i.ali) + (welp boc.res q.i.bob) + == + ali.res + bob.res + == + == + == + -- + -- +-- diff --git a/desk/mar/webmanifest.hoon b/desk/mar/webmanifest.hoon new file mode 100644 index 0000000..6a60a6a --- /dev/null +++ b/desk/mar/webmanifest.hoon @@ -0,0 +1,12 @@ +|_ dat=@ +++ grow + |% + ++ mime [/image/png (as-octs:mimes:html dat)] + -- +++ grab + |% + ++ mime |=([p=mite q=octs] q.q) + ++ noun @ + -- +++ grad %mime +-- diff --git a/desk/mar/woff.hoon b/desk/mar/woff.hoon new file mode 100644 index 0000000..d0a733b --- /dev/null +++ b/desk/mar/woff.hoon @@ -0,0 +1,12 @@ +|_ dat=@ +++ grow + |% + ++ mime [/font/woff (as-octs:mimes:html dat)] + -- +++ grab + |% + ++ mime |=([p=mite q=octs] q.q) + ++ noun @ + -- +++ grad %mime +-- diff --git a/desk/mar/woff2.hoon b/desk/mar/woff2.hoon new file mode 100644 index 0000000..191b669 --- /dev/null +++ b/desk/mar/woff2.hoon @@ -0,0 +1,12 @@ +|_ dat=@ +++ grow + |% + ++ mime [/font/woff2 (as-octs:mimes:html dat)] + -- +++ grab + |% + ++ mime |=([p=mite q=octs] q.q) + ++ noun @ + -- +++ grad %mime +-- diff --git a/desk/sur/blog-paths.hoon b/desk/sur/blog-paths.hoon new file mode 100644 index 0000000..5c1a309 --- /dev/null +++ b/desk/sur/blog-paths.hoon @@ -0,0 +1,21 @@ +:: +:: XX remove this file in transition to %4 +:: +|% +++ name %blog-paths ++$ rock [uri=@t paths=(set path)] ++$ wave + $% [%init paths=(set path)] + [%post =path] + [%depost =path] + [%uri uri=@t] + == +++ wash + |= [=rock =wave] + ?- -.wave + %init rock(paths paths.wave) + %post rock(paths (~(put in paths.rock) path.wave)) + %depost rock(paths (~(del in paths.rock) path.wave)) + %uri rock(uri uri.wave) + == +-- diff --git a/desk/sur/docket.hoon b/desk/sur/docket.hoon new file mode 100644 index 0000000..091c8c9 --- /dev/null +++ b/desk/sur/docket.hoon @@ -0,0 +1,82 @@ +|% +:: ++$ version + [major=@ud minor=@ud patch=@ud] +:: ++$ glob (map path mime) +:: ++$ url cord +:: $glob-location: How to retrieve a glob +:: ++$ glob-reference + [hash=@uvH location=glob-location] +:: ++$ glob-location + $% [%http =url] + [%ames =ship] + == +:: $href: Where a tile links to +:: ++$ href + $% [%glob base=term =glob-reference] + [%site =path] + == +:: $chad: State of a docket +:: ++$ chad + $~ [%install ~] + $% :: Done + [%glob =glob] + [%site ~] + :: Waiting + [%install ~] + [%suspend glob=(unit glob)] + :: Error + [%hung err=cord] + == +:: +:: $charge: A realized $docket +:: ++$ charge + $: =docket + =chad + == +:: +:: $clause: A key and value, as part of a docket +:: +:: Only used to parse $docket +:: ++$ clause + $% [%title title=@t] + [%info info=@t] + [%color color=@ux] + [%glob-http url=cord hash=@uvH] + [%glob-ames =ship hash=@uvH] + [%image =url] + [%site =path] + [%base base=term] + [%version =version] + [%website website=url] + [%license license=cord] + == +:: +:: $docket: A description of JS bundles for a desk +:: ++$ docket + $: %1 + title=@t + info=@t + color=@ux + =href + image=(unit url) + =version + website=url + license=cord + == +:: ++$ charge-update + $% [%initial initial=(map desk charge)] + [%add-charge =desk =charge] + [%del-charge =desk] + == +-- diff --git a/desk/sur/hood.hoon b/desk/sur/hood.hoon new file mode 100644 index 0000000..3cde86c --- /dev/null +++ b/desk/sur/hood.hoon @@ -0,0 +1,392 @@ +/% kelvin %kelvin +=, clay +=* dude dude:gall +|% ++$ pike + $: sync=(unit [=ship =desk]) + hash=@uv + =zest + wic=(set weft) + == +:: ++$ pikes (map desk pike) +:: $jump: changes to update source change requests +:: ++$ jump + $% [%all all=(map dock dock)] :: pending requests + [%add old=dock new=dock] :: new request + [%yea old=dock new=dock] :: approved + [%nay old=dock new=dock] :: denied + == +:: $rung: reference to upstream commit +:: ++$ rung [=aeon =weft] +:: #sync-record: source and destination of a kiln sync +:: ++$ sync-record :: + $: syd=desk :: local desk + her=ship :: foreign ship + sud=desk :: foreign desk + == +:: ++$ sync-state :: + $: nun=@ta :: nonce + kid=(unit desk) :: has kids desk too? + let=@ud :: next revision + nit=(unit ?) :: automerge or default + hav=(unit @ud) :: update available + yea=? :: update approved + == +:: ++$ sync-update + $% [%new for=sync-record rev=@ud] + [%done for=sync-record rev=@ud] + [%drop for=sync-record rev=@ud] + [%pending pending=(set [for=sync-record rev=@ud])] + == +:: ++$ sink (unit [her=@p sud=desk kid=(unit desk) let=@ud]) +:: +truncate-hash: get last 5 digits of hash and convert to tape +:: +++ truncate-hash + |= hash=@uv + ^- tape + (slag 2 <`@uv`(mod hash 0v1.00000)>) +:: +report-prep: get data required for reports +:: +++ report-prep + |= [our=@p now=@da] + =/ ego (scot %p our) + =/ wen (scot %da now) + :* .^(rock:tire %cx /[ego]//[wen]/tire) + .^(cone %cx /[ego]//[wen]/domes) + .^((map desk [ship desk]) %gx /[ego]/hood/[wen]/kiln/sources/noun) + .^ (map [desk ship desk] sync-state) %gx + /[ego]/hood/[wen]/kiln/syncs/noun + == + == +:: +report-vats: report on all desk installations +:: +++ report-vats + |= [our=@p now=@da desks=(list desk) filt=@tas verb=?] + ^- tang + =/ ego (scot %p our) + =/ wen (scot %da now) + =+ prep=[tyr cone sor zyn]=(report-prep our now) + ?: =(%$ filt) + %- zing + %+ turn + ?^ desks + (flop desks) + %+ sort ~(tap in ~(key by tyr.prep)) + |= [a=desk b=desk] + ?: |(=(a %kids) =(b %base)) & + ?: |(=(a %base) =(b %kids)) | + (aor b a) + |=(syd=@tas (report-vat prep our now syd verb)) + =/ deks=(list [=desk =zest wic=(set weft)]) + ?~ desks + %+ sort ~(tap by tyr.prep) + |= [[a=desk *] [b=desk *]] + ?: |(=(a %kids) =(b %base)) & + ?: |(=(a %base) =(b %kids)) | + (aor b a) + %+ murn (flop desks) + |= des=desk + ^- (unit [=desk =zest wic=(set weft)]) + ?~ got=(~(get by tyr.prep) des) + ~ + `[des u.got] + ?: =(filt %blocking) + =/ base-weft=(unit weft) + %- ~(rep in wic:(~(got by tyr.prep) %base)) + |= [=weft out=(unit weft)] + ?~ out + `weft + ?: (lth num.weft num.u.out) + out + `weft + ?~ base-weft ~['%base already up-to-date'] + =/ blockers=(list desk) + %+ sort + ^- (list desk) + %+ murn deks + |= [=desk =zest wic=(set weft)] + ^- (unit ^desk) + ?. =(%live zest) + ~ + ?: (~(has in wic) u.base-weft) + ~ + `desk + aor + ?~ blockers ~['No desks blocking upgrade'] + %- zing + ^- (list tang) + :- :~ %+ rap 3 + :~ 'These desks are blocking upgrade to [%zuse ' + (scot %ud num.u.base-weft) + ']:' + == == + %+ turn blockers + |=(syd=desk (report-vat prep our now syd verb)) + :: + %- zing + %+ turn + ?+ filt !! + %exists + %+ skip deks + |= [syd=desk *] + ?~ got=(~(get by cone.prep) our syd) + & + =(0 let.u.got) + :: + %running + %+ skim deks + |=([* [zest=@tas *]] =(zest %live)) + :: + %suspended + %+ skip deks + |= [syd=@tas [zest=@tas *]] + ?| =(syd %kids) + =(zest %live) + ?~ got=(~(get by cone.prep) our syd) + & + =(0 let.u.got) + == + :: + %exists-not + %+ skim deks + |= [syd=desk *] + ?~ got=(~(get by cone.prep) our syd) + | + =(0 let.u.got) + == + |=([syd=desk *] (report-vat prep our now syd verb)) +:: +report-vat: report on a single desk installation +:: +++ report-vat + |= $: $: tyr=rock:tire =cone sor=(map desk (pair ship desk)) + zyn=(map [desk ship desk] sync-state) + == + our=ship now=@da syd=desk verb=? + == + |^ ^- tang + =/ ego (scot %p our) + =/ wen (scot %da now) + ?. ((sane %tas) syd) + ~[(cat 3 'insane desk: %' syd)] + ?. (~(has by cone) our syd) + ~[(cat 3 'desk does not yet exist: %' syd)] + =/ hash .^(@uv %cz /[ego]/[syd]/[wen]) + ?: =(%kids syd) + ~[(cat 3 '%kids %cz hash: ' (scot %uv hash))] + =/ kel-path /[ego]/[syd]/[wen]/sys/kelvin + ?. .^(? %cu kel-path) + ~[(cat 3 'bad desk: %' syd)] + =+ .^(=waft %cx kel-path) + ^- tang + =/ =sink + ?~ s=(~(get by sor) syd) + ~ + ?~ z=(~(get by zyn) syd u.s) + ~ + `[p.u.s q.u.s [kid let]:u.z] + =/ meb=(list @uv) + ?~ sink ~[hash] + %+ turn + .^ (list tako) %cs + /[ego]/[syd]/[wen]/base/(scot %p her.u.sink)/[sud.u.sink] + == + |=(=tako .^(@uv %cs /[ego]/[syd]/[wen]/hash/(scot %uv tako))) + =/ dek (~(got by tyr) syd) + =/ sat + ?- zest.dek + %live 'running' + %dead 'suspended' + %held 'suspended until next update' + == + =/ kul=cord (print-wefts (waft-to-wefts waft)) + ?. verb + :~ '::' + (cat 3 ' pending updates: ' (print-wefts wic.dek)) + (cat 3 ' source ship: ' ?~(sink '~' (scot %p her.u.sink))) + (cat 3 ' app status: ' sat) + (cat 3 ' %cz hash ends in: ' (print-shorthash hash)) + (cat 3 ' /sys/kelvin: ' (print-wefts (waft-to-wefts waft))) + (cat 3 '%' syd) + == + :: + =/ [on=(list @tas) of=(list @tas)] + =/ [on=(list @tas) of=(list @tas)] + %- ~(rep by ren:(~(got by cone) our syd)) + |= [[=dude:gall is-on=?] on=(list @tas) of=(list @tas)] + ?: is-on + [[dude on] of] + [on [dude of]] + [(sort on aor) (sort of aor)] + :~ '::' + (cat 3 ' pending updates: ' (print-wefts wic.dek)) + %^ cat 3 ' kids desk: ' ?~ sink '~' + ?~ kid.u.sink '~' + (cat 3 '%' u.kid.u.sink) + (cat 3 ' source aeon: ' ?~(sink '~' (scot %ud let.u.sink))) + (cat 3 ' source desk: ' ?~(sink '~' (cat 3 '%' sud.u.sink))) + (cat 3 ' source ship: ' ?~(sink '~' (scot %p her.u.sink))) + (cat 3 ' updates: ' ?~(sink 'local' 'remote')) + %^ cat 3 ' publishing ship: ' ?~ got=(get-publisher our syd now) + '~' + (scot %p u.got) + :: + (cat 3 ' force off: ' (print-agents of)) + (cat 3 ' force on: ' (print-agents on)) + (cat 3 ' app status: ' sat) + :: + (cat 3 ' %cz hash: ' (scot %uv hash)) + (cat 3 ' base hash: ' (print-mergebases meb)) + (cat 3 ' /sys/kelvin: ' (print-wefts (waft-to-wefts waft))) + (cat 3 '%' syd) + == + ++ print-wefts + |= wefts=(set weft) + ^- @t + ?: =(~ wefts) + '~' + %+ roll (sort ~(tap in wefts) aor) + |= [=weft out=@t] + ?: =('' out) + (rap 3 '[%' lal.weft ' ' (scot %ud num.weft) ']' ~) + (rap 3 out ' [%' lal.weft ' ' (scot %ud num.weft) ']' ~) + :: + ++ print-shorthash + |= hash=@uv + ^- @t + (crip ((v-co:co 5) (end [0 25] hash))) + :: + ++ print-mergebases + |= hashes=(list @uv) + ^- @t + ?~ hashes + '~' + ?~ t.hashes + (scot %uv i.hashes) + %+ roll `(list @uv)`hashes + |= [hash=@uv out=@t] + ?: =('' out) + (print-shorthash hash) + (rap 3 out ' ' (print-shorthash hash) ~) + :: + ++ print-agents + |= agents=(list @tas) + ^- @t + ?~ agents + '~' + %+ roll `(list @tas)`agents + |= [agent=@tas out=@tas] + ?: =('' out) + (cat 3 '%' agent) + (rap 3 out ' %' agent ~) + -- +:: +report-kids: non-vat cz hash report for kids desk +:: +++ report-kids + |= [our=ship now=@da] + ^- tank + =/ syd %kids + =/ ego (scot %p our) + =/ wen (scot %da now) + ?. (~(has in .^((set desk) %cd /[ego]//[wen])) syd) + 'no %kids desk' + =+ .^(hash=@uv %cz /[ego]/[syd]/[wen]) + (cat 3 '%kids %cz hash: ' (scot %uv hash)) +:: +read-bill-foreign: read /desk/bill from a foreign desk +:: +++ read-bill-foreign + |= [=ship =desk =aeon] + ^- (list dude) + ~| +< + =/ her (scot %p ship) + =/ syd (scot %tas desk) + =/ yon (scot %ud aeon) + :: + =/ dom .^(domo cv/~[her syd yon]) + =/ tak ~| aeons=~(key by hit.dom) + (scot %uv (~(got by hit.dom) aeon)) + =/ yak .^(yaki cs/~[her syd yon %yaki tak]) + =/ fil (~(get by q.yak) /desk/bill) + ?~ fil ~ + =/ lob (scot %uv u.fil) + =/ peg .^(page cs/~[her syd yon %blob lob]) + ;;((list dude) q.peg) +:: +read-bill: read contents of /desk/bill manifest +:: +++ read-bill + |= [our=ship =desk now=@da] + =/ pax (en-beam [our desk da+now] /desk/bill) + ?. .^(? cu/pax) + *(list dude) + .^((list dude) cx/pax) +:: +++ get-remote-diff + |= [our=ship here=desk now=@da her=ship there=desk when=aeon] + =+ .^(our-hash=@uv cz/[(scot %p our) here (scot %da now) ~]) + =+ .^(her-hash=@uv cz/[(scot %p her) there (scot %ud when) ~]) + !=(our-hash her-hash) +:: +++ get-publisher + |= [our=ship =desk now=@da] + ^- (unit ship) + =/ pax /(scot %p our)/[desk]/(scot %da now)/desk/ship + ?. .^(? %cu pax) ~ + `.^(ship %cx pax) +:: +++ get-apps-live + |= [our=ship =desk now=@da] + ^- (list dude) + %+ murn (get-apps-have our desk now) + |=([=dude live=?] ?.(live ~ `dude)) +:: +get-apps-have: find which apps Gall is running on a desk +:: +++ get-apps-have + |= [our=ship =desk now=@da] + ^- (list [=dude live=?]) + %~ tap in + .^((set [=dude live=?]) ge+/(scot %p our)/[desk]/(scot %da now)/$) +:: +++ mergebase-hashes + |= [our=@p syd=desk now=@da her=ship sud=desk] + =/ her (scot %p her) + =/ ego (scot %p our) + =/ wen (scot %da now) + %+ turn .^((list tako) %cs /[ego]/[syd]/[wen]/base/[her]/[sud]) + |=(=tako .^(@uv %cs /[ego]/[syd]/[wen]/hash/(scot %uv tako))) +:: +++ enjs + =, enjs:format + |% + ++ tim + |= t=@ + ^- json + (numb (fall (mole |.((unm:chrono:userlib t))) 0)) + :: + ++ cass + |= c=^cass + %- pairs + :~ ud+(numb ud.c) + da+(tim da.c) + == + :: + ++ weft + |= w=^weft + %- pairs + :~ name+s+lal.w + kelvin+(numb num.w) + == + :: + ++ rung + |= r=^rung + %- pairs + :~ aeon+(numb aeon.r) + weft+(weft weft.r) + == + -- +-- diff --git a/desk/sur/spider.hoon b/desk/sur/spider.hoon new file mode 100644 index 0000000..7c21268 --- /dev/null +++ b/desk/sur/spider.hoon @@ -0,0 +1,27 @@ +/+ libstrand=strand +=, strand=strand:libstrand +|% ++$ thread $-(vase shed:khan) ++$ input [=tid =cage] ++$ tid tid:strand ++$ bowl bowl:strand ++$ http-error + $? %bad-request :: 400 + %forbidden :: 403 + %nonexistent :: 404 + %offline :: 504 + == ++$ start-args + $: parent=(unit tid) + use=(unit tid) + =beak + file=term + =vase + == ++$ inline-args + $: parent=(unit tid) + use=(unit tid) + =beak + =shed:khan + == +-- diff --git a/desk/sur/sss.hoon b/desk/sur/sss.hoon new file mode 100644 index 0000000..a5b889a --- /dev/null +++ b/desk/sur/sss.hoon @@ -0,0 +1,46 @@ +:: +:: XX remove this file in transition to %4 +:: +|% +++ lake + |$ [rock wave] + $_ ^? + |% + ++ name *term + +$ rock ^rock + +$ wave ^wave + ++ wash |~ [rock wave] *rock + -- ++$ aeon @ud ++$ dude dude:agent:gall ++$ what ?(%rock %wave) +++ poke + |% + ++ request + |* paths=mold + $: path=paths + =dude + when=(unit aeon) + == + ++ response + |* [=(lake) paths=mold] + $: path=paths + =dude + =aeon + $% [type=?(%nigh %yore %tomb) ~] + $: type=%scry + $% [what=%rock =rock:lake] + [what=%wave =wave:lake] + == == == == + ++ on-rock + |* [=(lake) paths=mold] + $: path=paths + src=ship + from=dude + stale=? + fail=? + =rock:lake + wave=(unit wave:lake) + == + -- +-- diff --git a/desk/sur/tlon/channels.hoon b/desk/sur/tlon/channels.hoon new file mode 100644 index 0000000..c222d4c --- /dev/null +++ b/desk/sur/tlon/channels.hoon @@ -0,0 +1,464 @@ +:: channels: message stream structures +:: +:: four shapes that cross client-subscriber-publisher boundaries: +:: - actions client-to-subscriber change requests (user actions) +:: - commands subscriber-to-publisher change requests +:: - updates publisher-to-subscriber change notifications +:: - responses subscriber-to-client change notifications +:: +:: --action--> --command--> +:: client subscriber publisher +:: <--response-- <--update-- +:: +:: local actions _may_ become responses, +:: remote actions become commands, +:: commands _may_ become updates, +:: updates _may_ become responses. +:: +/- g=tlon-groups, c=tlon-cite +/+ mp=mop-extensions +|% ++| %ancients +:: +++ mar + |% + ++ act `mark`%channel-action + ++ cmd `mark`%channel-command + ++ upd `mark`%channel-update + ++ log `mark`%channel-logs + ++ not `mark`%channel-posts + -- +:: ++| %primitives +:: ++$ flag (pair ship term) ++$ v-channels (map nest v-channel) +++ v-channel + |^ ,[global local] + :: $global: should be identical between ships + :: + +$ global + $: posts=v-posts + order=(rev order=arranged-posts) + view=(rev =view) + sort=(rev =sort) + perm=(rev =perm) + == + :: $window: sparse set of time ranges + :: + ::TODO populate this + +$ window (list [from=time to=time]) + :: .window: time range for requested posts that we haven't received + :: .diffs: diffs for posts in the window, to apply on receipt + :: + +$ future + [=window diffs=(jug id-post u-post)] + :: $local: local-only information + :: + +$ local + $: =net + =log + =remark + =window + =future + == + -- +:: $v-post: a channel post +:: ++$ v-post [v-seal (rev essay)] ++$ id-post time ++$ v-posts ((mop id-post (unit v-post)) lte) +++ on-v-posts ((on id-post (unit v-post)) lte) +++ mo-v-posts ((mp id-post (unit v-post)) lte) +:: $v-reply: a post comment +:: ++$ v-reply [v-reply-seal (rev memo)] ++$ id-reply time ++$ v-replies ((mop id-reply (unit v-reply)) lte) +++ on-v-replies ((on id-reply (unit v-reply)) lte) +++ mo-v-replies ((mp time (unit v-reply)) lte) +:: $v-seal: host-side data for a post +:: ++$ v-seal $+ channel-seal + $: id=id-post + replies=v-replies + reacts=v-reacts + == +:: $v-reply-seal: host-side data for a reply +:: ++$ v-reply-seal + $: id=id-reply + reacts=v-reacts + == +:: $essay: top-level post, with metadata +:: ++$ essay [memo =kind-data] +:: $reply-meta: metadata for all replies ++$ reply-meta + $: reply-count=@ud + last-repliers=(set ship) + last-reply=(unit time) + == +:: $kind-data: metadata for a channel type's "post" +:: ++$ kind-data + $% [%diary title=@t image=@t] + [%heap title=(unit @t)] + [%chat kind=$@(~ [%notice ~])] + == +:: $memo: post data proper +:: +:: content: the body of the comment +:: author: the ship that wrote the comment +:: sent: the client-side time the comment was made +:: ++$ memo + $: content=story + author=ship + sent=time + == +:: $story: post body content +:: ++$ story (list verse) +:: $verse: a chunk of post content +:: +:: blocks stand on their own. inlines come in groups and get wrapped +:: into a paragraph +:: ++$ verse + $% [%block p=block] + [%inline p=(list inline)] + == +:: $listing: recursive type for infinitely nested
    or
      ++$ listing + $% [%list p=?(%ordered %unordered %tasklist) q=(list listing) r=(list inline)] + [%item p=(list inline)] + == +:: $block: post content that sits outside of the normal text +:: +:: %image: a visual, we record dimensions for better rendering +:: %cite: an Urbit reference +:: %header: a traditional HTML heading, h1-h6 +:: %listing: a traditional HTML list, ul and ol +:: %code: a block of code +:: ++$ block $+ channel-block + $% [%image src=cord height=@ud width=@ud alt=cord] + [%cite =cite:c] + [%header p=?(%h1 %h2 %h3 %h4 %h5 %h6) q=(list inline)] + [%listing p=listing] + [%rule ~] + [%code code=cord lang=cord] + == +:: $inline: post content that flows within a paragraph +:: +:: @t: plain text +:: %italics: italic text +:: %bold: bold text +:: %strike: strikethrough text +:: %inline-code: code formatting for small snippets +:: %blockquote: blockquote surrounded content +:: %block: link/reference to blocks +:: %code: code formatting for large snippets +:: %tag: tag gets special signifier +:: %link: link to a URL with a face +:: %break: line break +:: ++$ inline $+ channel-inline + $@ @t + $% [%italics p=(list inline)] + [%bold p=(list inline)] + [%strike p=(list inline)] + [%blockquote p=(list inline)] + [%inline-code p=cord] + [%code p=cord] + [%ship p=ship] + [%block p=@ud q=cord] + [%tag p=cord] + [%link p=cord q=cord] + [%task p=?(%.y %.n) q=(list inline)] + [%break ~] + == +:: ++$ kind ?(%diary %heap %chat) +:: $nest: identifier for a channel ++$ nest [=kind =ship name=term] +:: $view: the persisted display format for a channel ++$ view $~(%list ?(%grid %list)) +:: $sort: the persisted sort type for a channel ++$ sort $~(%time ?(%alpha %time %arranged)) +:: $arranged-posts: an array of postIds ++$ arranged-posts (unit (list time)) +:: $hidden-posts: a set of ids for posts that are hidden ++$ hidden-posts (set id-post) +:: $post-toggle: hide or show a particular post by id ++$ post-toggle + $% [%hide =id-post] + [%show =id-post] + == +:: $react: either an emoji identifier like :diff or a URL for custom ++$ react @ta ++$ v-reacts (map ship (rev (unit react))) +:: $scan: search results ++$ scan (list reference) ++$ reference + $% [%post =post] + [%reply =id-post =reply] + == +:: $said: used for references ++$ said (pair nest reference) +:: $plan: index into channel state +:: p: Post being referred to +:: q: Reply being referred to, if any +:: ++$ plan + (pair time (unit time)) +:: +:: $net: subscriber-only state +:: ++$ net [p=ship load=_|] +:: +:: $unreads: a map of channel unread information, for clients +:: $unread: unread data for a specific channel, for clients +:: recency: time of most recent message +:: count: how many posts are unread +:: unread-id: the id of the first unread top-level post +:: threads: for each unread thread, the id of the first unread reply +:: ++$ unreads (map nest unread) ++$ unread + $: recency=time + count=@ud + unread-id=(unit id-post) + threads=(map id-post id-reply) + == +:: $remark: markers representing unread state +:: last-read: time at which the user last read this channel +:: watching: unused, intended for disabling unread accumulation +:: unread-threads: threads that contain unread messages +:: ++$ remark [recency=time last-read=time watching=_| unread-threads=(set id-post)] +:: +:: $perm: represents the permissions for a channel and gives a +:: pointer back to the group it belongs to. +:: ++$ perm + $: writers=(set sect:g) + group=flag:g + == +:: +:: $log: a time ordered history of modifications to a channel +:: ++$ log ((mop time u-channel) lte) +++ log-on ((on time u-channel) lte) +:: +:: $create-channel: represents a request to create a channel +:: +:: $create-channel is consumed by the channel agent first and then +:: passed to the groups agent to register the channel with the group. +:: +:: Write permission is stored with the specific agent in the channel, +:: read permission is stored with the group's data. +:: ++$ create-channel + $: =kind + name=term + group=flag:g + title=cord + description=cord + readers=(set sect:g) + writers=(set sect:g) + == +:: $outline: abridged $post +:: .replies: number of comments +:: ++$ outline + [replies=@ud replyers=(set ship) essay] +:: +++ outlines + =< outlines + |% + +$ outlines ((mop time outline) lte) + ++ on ((^on time outline) lte) + -- +++ rev + |$ [data] + [rev=@ud data] +:: +++ apply-rev + |* [old=(rev) new=(rev)] + ^+ [changed=& old] + ?: (lth rev.old rev.new) + &+new + |+old +:: +++ next-rev + |* [old=(rev) new=*] + ^+ [changed=& old] + ?: =(+.old new) + |+old + &+old(rev +(rev.old), + new) +:: ++| %actions +:: +:: some actions happen to be the same as commands, but this can freely +:: change +:: +::NOTE we might want to add a action-id=uuid to this eventually, threading +:: that through all the way, so that an $r-channels may indicate what +:: originally caused it ++$ a-channels + $% [%create =create-channel] + [%pin pins=(list nest)] + [%channel =nest =a-channel] + [%toggle-post toggle=post-toggle] + == ++$ a-channel + $% [%join group=flag:g] + [%leave ~] + a-remark + c-channel + == +:: ++$ a-remark + $~ [%read ~] + $% [%read ~] + [%read-at =time] + [%watch ~] + [%unwatch ~] + == +:: ++$ a-post c-post ++$ a-reply c-reply +:: ++| %commands +:: ++$ c-channels + $% [%create =create-channel] + [%channel =nest =c-channel] + == ++$ c-channel + $% [%post =c-post] + [%view =view] + [%sort =sort] + [%order order=arranged-posts] + [%add-writers sects=(set sect:g)] + [%del-writers sects=(set sect:g)] + == +:: ++$ c-post + $% [%add =essay] + [%edit id=id-post =essay] + [%del id=id-post] + [%reply id=id-post =c-reply] + c-react + == +:: ++$ c-reply + $% [%add =memo] + [%edit id=id-reply =memo] + [%del id=id-reply] + c-react + == +:: ++$ c-react + $% [%add-react id=@da p=ship q=react] + [%del-react id=@da p=ship] + == +:: ++| %updates +:: ++$ update [=time =u-channel] ++$ u-channels [=nest =u-channel] ++$ u-channel + $% [%create =perm] + [%order (rev order=arranged-posts)] + [%view (rev =view)] + [%sort (rev =sort)] + [%perm (rev =perm)] + [%post id=id-post =u-post] + == +:: ++$ u-post + $% [%set post=(unit v-post)] + [%reacts reacts=v-reacts] + [%essay (rev =essay)] + [%reply id=id-reply =u-reply] + == +:: ++$ u-reply + $% [%set reply=(unit v-reply)] + [%reacts reacts=v-reacts] + == +:: ++$ u-checkpoint global:v-channel +:: ++| %responses +:: ++$ r-channels [=nest =r-channel] ++$ r-channel + $% [%posts =posts] + [%post id=id-post =r-post] + [%order order=arranged-posts] + [%view =view] + [%sort =sort] + [%perm =perm] + :: + [%create =perm] + [%join group=flag:g] + [%leave ~] + a-remark + == +:: ++$ r-post + $% [%set post=(unit post)] + [%reply id=id-reply =reply-meta =r-reply] + [%reacts =reacts] + [%essay =essay] + == +:: ++$ r-reply + $% [%set reply=(unit reply)] + [%reacts =reacts] + == +:: versions of backend types with their revision numbers stripped, +:: because the frontend shouldn't care to learn those. +:: ++$ channels (map nest channel) +++ channel + |^ ,[global local] + +$ global + $: =posts + order=arranged-posts + =view + =sort + =perm + == + :: + +$ local + $: =net + =remark + == + -- ++$ paged-posts + $: =posts + newer=(unit time) + older=(unit time) + total=@ud + == ++$ posts ((mop id-post (unit post)) lte) ++$ post [seal essay] ++$ seal + $: id=id-post + =reacts + =replies + =reply-meta + == ++$ reacts (map ship react) ++$ reply [reply-seal memo] ++$ replies ((mop id-reply reply) lte) ++$ reply-seal [id=id-reply parent-id=id-post =reacts] +++ on-posts ((on id-post (unit post)) lte) +++ on-replies ((on id-reply reply) lte) ++$ cite cite:c +-- diff --git a/desk/sur/tlon/cite.hoon b/desk/sur/tlon/cite.hoon new file mode 100644 index 0000000..1d92a46 --- /dev/null +++ b/desk/sur/tlon/cite.hoon @@ -0,0 +1,57 @@ +/- g=tlon-groups +=< cite +|% +++ purse + |= =(pole knot) + ^- (unit cite) + ?. =(~.1 -.pole) ~ + =. pole +.pole + ?+ pole ~ + [%chan agent=@ ship=@ name=@ rest=*] + =/ ship (slaw %p ship.pole) + ?~ ship ~ + `[%chan [agent.pole u.ship name.pole] rest.pole] + :: + [%desk ship=@ name=@ rest=*] + =/ ship (slaw %p ship.pole) + ?~ ship ~ + `[%desk [u.ship name.pole] rest.pole] + :: + [%group ship=@ name=@ ~] + =/ ship (slaw %p ship.pole) + ?~ ship ~ + `[%group u.ship name.pole] + == +:: +++ parse + |= =path + ^- cite + (need (purse path)) +:: +++ print + |= c=cite + |^ ^- path + :- (scot %ud 1) + ?- -.c + %chan chan/(welp (nest nest.c) wer.c) + %desk desk/(welp (flag flag.c) wer.c) + %group group/(flag flag.c) + %bait bait/:(welp (flag grp.c) (flag gra.c) wer.c) + == + ++ flag + |= f=flag:g + ~[(scot %p p.f) q.f] + ++ nest + |= n=nest:g + [p.n (flag q.n)] + -- +:: ++$ cite + $% [%chan =nest:g wer=path] + [%group =flag:g] + [%desk =flag:g wer=path] + [%bait grp=flag:g gra=flag:g wer=path] + :: scry into groups when you receive a bait for a chat that doesn't exist yet + :: work out what app + == +-- diff --git a/desk/sur/tlon/groups.hoon b/desk/sur/tlon/groups.hoon new file mode 100644 index 0000000..2cb22bb --- /dev/null +++ b/desk/sur/tlon/groups.hoon @@ -0,0 +1,384 @@ +|% ++$ kind ?(%diary %heap %chat) +++ epic +|% ++$ saga + $~ [%lev ~] + $% [%dex ver=@ud] + [%lev ~] + [%chi ~] + == + ++$ epic @ud +-- +++ meta +|% ++$ data + $: title=cord + description=cord + image=cord + cover=cord + == ++$ diff + $% [%title =cord] + [%description =cord] + [%image =cord] + [%cover =cord] + == +-- +++ e epic +++ okay `epic:e`2 +++ mar + |% + ++ act `mark`(rap 3 %group-action '-' (scot %ud okay) ~) + ++ upd `mark`(rap 3 %group-update '-' (scot %ud okay) ~) + ++ log `mark`(rap 3 %group-log '-' (scot %ud okay) ~) + ++ int `mark`(rap 3 %group-init '-' (scot %ud okay) ~) + -- +:: $flag: ID for a group +:: ++$ flag (pair ship term) +:: +:: $nest: ID for a channel, {app}/{ship}/{name} +:: ++$ nest (pair term flag) +:: +:: $sect: ID for cabal, similar to a role +:: ++$ sect term +:: +:: $zone: channel grouping +:: +:: includes its own metadata for display and keeps the order of +:: channels within. +:: +:: zone: the term that represents the ID of a zone +:: realm: the metadata representing the zone and the order of channels +:: delta: the set of actions that can be taken on a zone +:: %add: create a zone +:: %del: delete the zone +:: %edit: modify the zone metadata +:: %mov: reorders the zone in the group +:: %mov-nest: reorders a channel within the zone +:: +++ zone + =< zone + |% + +$ zone @tas + +$ realm + $: met=data:meta + ord=(list nest) + == + +$ diff (pair zone delta) + +$ delta + $% [%add meta=data:meta] + [%del ~] + [%edit meta=data:meta] + [%mov idx=@ud] + [%mov-nest =nest idx=@ud] + == + -- +:: +:: $fleet: group members and their associated metadata +:: +:: vessel: a user's set of sects or roles and the time that they joined +:: @da default represents an admin added member that has yet to join +:: +++ fleet + =< fleet + |% + +$ fleet (map ship vessel) + +$ vessel + $: sects=(set sect) + joined=time + == + +$ diff + $% [%add ~] + [%del ~] + [%add-sects sects=(set sect)] + [%del-sects sects=(set sect)] + == + -- +:: +:: $channel: a medium for interaction +:: +++ channel + =< channel + |% + +$ preview + $: =nest + meta=data:meta + group=^preview + == + :: + +$ channels (map nest channel) + :: + :: $channel: a collection of metadata about a specific agent integration + :: + :: meta: title, description, image, cover + :: added: when the channel was created + :: zone: what zone or section to bucket in + :: join: should the channel be joined by new members + :: readers: what sects can see the channel, empty means anyone + :: + +$ channel + $: meta=data:meta + added=time + =zone + join=? + readers=(set sect) + == + :: + :: $diff: represents the set of actions you can take on a channel + :: + :: add: create a channel + :: edit: edit a channel + :: del: delete a channel + :: add-sects: add sects to readers + :: del-sects: delete sects from readers + :: zone: change the zone of the channel + :: join: toggle default join + :: + +$ diff + $% [%add =channel] + [%edit =channel] + [%del ~] + :: + [%add-sects sects=(set sect)] + [%del-sects sects=(set sect)] + :: + [%zone =zone] + :: + [%join join=_|] + == + -- +:: +:: $group: collection of people and the pathways in which they interact +:: +:: group holds all data around members, permissions, channel +:: organization, and its own metadata to represent the group +:: ++$ group + $: =fleet + cabals=(map sect cabal) + zones=(map zone realm:zone) + zone-ord=(list zone) + =bloc + =channels:channel + imported=(set nest) + =cordon + secret=? + meta=data:meta + == +:: ++$ group-ui [group saga=(unit saga:e)] +:: $cabal: metadata representing a $sect or role +:: +++ cabal + =< cabal + |% + :: + +$ cabal + [meta=data:meta ~] + :: + +$ diff + $% [%add meta=data:meta] + [%edit meta=data:meta] + [%del ~] + == + -- +:: +:: $cordon: group entry and visibility permissions +:: +++ cordon + =< cordon + |% + :: + :: $open: a group with open entry, only bans are barred entry + :: + ++ open + |% + :: $ban: set of ships and ranks/classes that are not allowed entry + :: + :: bans can either be done at the individual ship level or by the + :: rank level (comet/moon/etc.) + :: + +$ ban [ships=(set ship) ranks=(set rank:title)] + +$ diff + $% [%add-ships p=(set ship)] + [%del-ships p=(set ship)] + :: + [%add-ranks p=(set rank:title)] + [%del-ranks p=(set rank:title)] + == + -- + :: + :: $shut: a group with closed entry, everyone barred entry + :: + :: a shut cordon means that the group is closed, but still visible. + :: people may request entry and either be accepted or denied or + :: they may be invited directly + :: + :: ask: represents those requesting entry + :: pending: represents those who've been invited + :: + ++ shut + |% + +$ state [pend=(set ship) ask=(set ship)] + +$ kind ?(%ask %pending) + +$ diff + $% [%add-ships p=kind q=(set ship)] + [%del-ships p=kind q=(set ship)] + == + -- + :: + :: $cordon: a set of metadata to represent the entry policy for a group + :: + :: open: a group with open entry, only bans barred entry + :: shut: a group with closed entry, everyone barred entry + :: afar: a custom entry policy defined by another agent + :: + +$ cordon + $% [%shut state:shut] + [%afar =flag =path desc=@t] + [%open =ban:open] + == + :: + :: $diff: the actions you can take on a cordon + :: + +$ diff + $% [%shut p=diff:shut] + [%open p=diff:open] + [%swap p=cordon] + == + -- +:: +:: $bloc: superuser sects +:: +:: sects in the bloc set are allowed to make modifications to the group +:: and its various metadata and permissions +:: +++ bloc + =< bloc + |% + +$ bloc (set sect) + +$ diff + $% [%add p=(set sect)] + [%del p=(set sect)] + == + -- +:: +:: $diff: the general set of changes that can be made to a group +:: ++$ diff + $% [%fleet p=(set ship) q=diff:fleet] + [%cabal p=sect q=diff:cabal] + [%channel p=nest q=diff:channel] + [%bloc p=diff:bloc] + [%cordon p=diff:cordon] + [%zone p=diff:zone] + [%meta p=data:meta] + [%secret p=?] + [%create p=group] + [%del ~] + == +:: +:: $action: the complete set of data required to edit a group +:: ++$ action + (pair flag update) +:: +:: $update: a representation in time of a modification of a group +:: ++$ update + (pair time diff) +:: +:: $create: a request to make a group +:: ++$ create + $: name=term + title=cord + description=cord + image=cord + cover=cord + =cordon + members=(jug ship sect) + secret=? + == +:: ++$ init [=time =group] +:: +:: $groups-ui: map for frontend to display groups ++$ groups-ui + (map flag group-ui) ++$ groups + (map flag group) ++$ net-groups + (map flag [net group]) +:: +:: $log: a time ordered map of all modifications to groups +:: ++$ log + ((mop time diff) lte) +:: +++ log-on + ((on time diff) lte) +:: +:: $net: an indicator of whether I'm a host or subscriber +:: ++$ net + $~ [%pub ~] + $% [%pub p=log] + [%sub p=time load=_| =saga:e] + == +:: +:: $join: a join request, can elect to join all channels +:: ++$ join + $: =flag + join-all=? + == +:: +:: $knock: a request to enter a closed group +:: ++$ knock flag +:: +:: $progress: the state of a group join +:: ++$ progress + ?(%knocking %adding %watching %done %error) +:: +:: $claim: a mark for gangs to represent a join in progress +:: ++$ claim + $: join-all=? + =progress + == +:: +:: $preview: the metadata and entry policy for a group +:: ++$ preview + $: =flag + meta=data:meta + =cordon + =time + secret=? + == +:: ++$ previews (map flag preview) +:: +:: $invite: a marker to show you've been invited to a group +:: ++$ invite (pair flag ship) +:: +:: $gang: view of foreign group +:: ++$ gang + $: cam=(unit claim) + pev=(unit preview) + vit=(unit invite) + == +:: ++$ gangs (map flag gang) +:: +-- diff --git a/desk/sur/ucm.hoon b/desk/sur/ucm.hoon new file mode 100644 index 0000000..8b9e345 --- /dev/null +++ b/desk/sur/ucm.hoon @@ -0,0 +1,52 @@ +/- t=tlon-groups, docket +/+ metalib=metamask +|% +:: ++$ state state-0 ++$ state-0 + $: %0 + =sites + sessions=sess:metalib + == ++$ sites (map path site) ++$ site + $: sitename=@t + description=@t + groupname=@tas + binding=path + icon=@t + home=@t + css=@t + =apps + =app-order + hidden=_| + == ++$ app-order (list navbar-app) ++$ navbar-app $@(app-type [%static @tas]) ++$ apps + $: blog=@t + radio=? + chat=(set term) + forum=(set term) + wiki=@t + static=(map @tas @t) :: markdown + == ++$ filedata [html=@t md=@t theme=@tas public=?] +:: %blog-action ++$ sail-poke [%ui ship=@p eyre-id=@ta =action] ++$ action + :: global + $% [%dash dash-action] + [%site name=@t action=site-action] + == ++$ dash-action + $% [%set site] + [%del name=path] +== ++$ site-action + $% + [%search query=@t start=(unit @da) end=(unit @da) apps=(list app-type) by=(unit @p)] + [%lol @t] + == ++$ app-type $?(%blog %chat %forum %radio %wiki) +-- diff --git a/desk/sys.kelvin b/desk/sys.kelvin new file mode 100644 index 0000000..14d80f1 --- /dev/null +++ b/desk/sys.kelvin @@ -0,0 +1 @@ +[%zuse 411] diff --git a/desk/ted/import.hoon b/desk/ted/import.hoon new file mode 100644 index 0000000..25670a0 --- /dev/null +++ b/desk/ted/import.hoon @@ -0,0 +1,85 @@ +/- spider, blog +/+ *strandio +=, strand=strand:spider +=, strand-fail=strand-fail:libstrand:spider +^- thread:spider +|= arg=vase +=/ m (strand ,vase) +^- form:m +;< our=@p bind:m get-our +;< now=@da bind:m get-time +=/ files-path=path /(scot %p our)/blog/(scot %da now)/import +=/ files=(axal *) + |- + =+ .^(=arch %cy files-path) + ?: (test dir.arch ~) + =/ mark + ?+ (rear files-path) !! + %md wain + %html @t + %css @t + %noun noun + == + :- [~ .^(mark %cx files-path)] + (~(urn by dir.arch) |=([name=@ta ~] ^$(files-path (snoc files-path name)))) + :- fil.arch + (~(urn by dir.arch) |=([name=@ta ~] ^$(files-path (snoc files-path name)))) +:: +=| $= imp + $: pub=(map path [html=@t md=@t theme=@tas]) + dra=(map path md=@t) + thm=(map @tas css=@t) + == +=. imp + =/ all-files ~(tap of files) + |- + ?~ all-files imp + %. i.all-files + |= [=path content=*] + %= ^$ + all-files t.all-files + imp + ?+ (rear path) imp + %md + =+ content=(of-wain:format ((list cord) content)) + ?: ?=(%published (snag 0 path)) + =/ file-name (oust [0 2] (snip path)) + =/ file (~(gut by pub.imp) file-name [html='' md='' theme=%default]) + imp(pub (~(put by pub.imp) file-name file(md content))) + =/ draft-name (oust [0 1] (snip path)) + =/ draft (~(gut by dra.imp) draft-name [md='']) + imp(dra (~(put by dra.imp) draft-name draft(md content))) + :: + %css + =/ theme-name (@tas (rear (oust [0 1] (snip path)))) + =/ theme (~(gut by thm.imp) theme-name [css='']) + imp(thm (~(put by thm.imp) theme-name theme(css (@t (@tas content))))) + :: + %html + =/ file-name (oust [0 2] (snip path)) + =/ file (~(gut by pub.imp) file-name [html='' md='' theme=%default]) + imp(pub (~(put by pub.imp) file-name file(html (@t (@tas content))))) + == + == +=/ thm-map ;; (map path @tas) + :: XX is this expecting a folder called 'meta' in the export? + :: there wasn't one when i exported files from ~bonbud-macryg, + :: but that might be because the export process crashed my ship + .^(noun %cx /(scot %p our)/blog/(scot %da now)/import/published/meta/noun) +=/ act |=(=vase [%pass /poke %agent [our %blog] %poke %blog-action vase]) +;< ~ bind:m + %- send-raw-cards + %- zing + :~ %+ turn ~(tap by pub.imp) + |= [=path html=@t md=@t theme=@tas] + (act !>([%publish path html md (~(gut by thm-map) path %default)])) + :: + %+ turn ~(tap by dra.imp) + |= [=path md=@t] + (act !>([%save-draft path md])) + :: + %+ turn ~(tap by thm.imp) + |= [theme=@tas css=@t] + (act !>([%save-theme theme css])) + == +(pure:m !>(~)) \ No newline at end of file diff --git a/desk/ted/iris-thread.hoon b/desk/ted/iris-thread.hoon new file mode 100644 index 0000000..b1458e0 --- /dev/null +++ b/desk/ted/iris-thread.hoon @@ -0,0 +1,26 @@ +/- spider +/+ strandio +=, strand=strand:spider +^- thread:spider +|= arg=vase +=/ m (strand ,vase) +^- form:m +~& "calling iris thread" +=/ req !<([@t request:http] arg) +=/ [channel-slug=@t =request:http] req +~& >> request +=/ origin (get-header:http 'origin' header-list.request) +?~ origin (pure:m !>(~)) +=/ url (cat 3 [u.origin channel-slug]) +~& >> `@t`url +=. url.request url +=/ =task:iris [%request request *outbound-config:iris] +=/ =card:agent:gall [%pass /http-req %arvo %i task] +;< ~ bind:m (send-raw-card:strandio card) +;< res=(pair wire sign-arvo) bind:m take-sign-arvo:strandio +?. ?=([%iris %http-response %finished *] q.res) + (strand-fail:strand %bad-sign ~) +~& +.q.res +?~ full-file.client-response.q.res + (strand-fail:strand %no-body ~) +(pure:m !>(`@t`q.data.u.full-file.client-response.q.res)) diff --git a/desk/web b/desk/web new file mode 120000 index 0000000..6f11f71 --- /dev/null +++ b/desk/web @@ -0,0 +1 @@ +../site/dist \ No newline at end of file diff --git a/devenv.lock b/devenv.lock new file mode 100644 index 0000000..f3b5fd6 --- /dev/null +++ b/devenv.lock @@ -0,0 +1,122 @@ +{ + "nodes": { + "devenv": { + "locked": { + "dir": "src/modules", + "lastModified": 1726063457, + "owner": "cachix", + "repo": "devenv", + "rev": "39bf6ce569103c9390d37322daa59468c31b3ce7", + "treeHash": "839747a1cb35ba6d5b36cce9a739ab2ba5e4a5d4", + "type": "github" + }, + "original": { + "dir": "src/modules", + "owner": "cachix", + "repo": "devenv", + "type": "github" + } + }, + "flake-compat": { + "flake": false, + "locked": { + "lastModified": 1696426674, + "owner": "edolstra", + "repo": "flake-compat", + "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33", + "treeHash": "2addb7b71a20a25ea74feeaf5c2f6a6b30898ecb", + "type": "github" + }, + "original": { + "owner": "edolstra", + "repo": "flake-compat", + "type": "github" + } + }, + "gitignore": { + "inputs": { + "nixpkgs": [ + "pre-commit-hooks", + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1709087332, + "owner": "hercules-ci", + "repo": "gitignore.nix", + "rev": "637db329424fd7e46cf4185293b9cc8c88c95394", + "treeHash": "ca14199cabdfe1a06a7b1654c76ed49100a689f9", + "type": "github" + }, + "original": { + "owner": "hercules-ci", + "repo": "gitignore.nix", + "type": "github" + } + }, + "nixpkgs": { + "locked": { + "lastModified": 1716977621, + "owner": "cachix", + "repo": "devenv-nixpkgs", + "rev": "4267e705586473d3e5c8d50299e71503f16a6fb6", + "treeHash": "6d9f1f7ca0faf1bc2eeb397c78a49623260d3412", + "type": "github" + }, + "original": { + "owner": "cachix", + "ref": "rolling", + "repo": "devenv-nixpkgs", + "type": "github" + } + }, + "nixpkgs-stable": { + "locked": { + "lastModified": 1725930920, + "owner": "NixOS", + "repo": "nixpkgs", + "rev": "44a71ff39c182edaf25a7ace5c9454e7cba2c658", + "treeHash": "56e93544112b7bb7aa0c3093d537295683ef9148", + "type": "github" + }, + "original": { + "owner": "NixOS", + "ref": "nixos-24.05", + "repo": "nixpkgs", + "type": "github" + } + }, + "pre-commit-hooks": { + "inputs": { + "flake-compat": "flake-compat", + "gitignore": "gitignore", + "nixpkgs": [ + "nixpkgs" + ], + "nixpkgs-stable": "nixpkgs-stable" + }, + "locked": { + "lastModified": 1725513492, + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "rev": "7570de7b9b504cfe92025dd1be797bf546f66528", + "treeHash": "4b46d77870afecd8f642541cb4f4927326343b59", + "type": "github" + }, + "original": { + "owner": "cachix", + "repo": "pre-commit-hooks.nix", + "type": "github" + } + }, + "root": { + "inputs": { + "devenv": "devenv", + "nixpkgs": "nixpkgs", + "pre-commit-hooks": "pre-commit-hooks" + } + } + }, + "root": "root", + "version": 7 +} diff --git a/devenv.nix b/devenv.nix new file mode 100644 index 0000000..d1072bb --- /dev/null +++ b/devenv.nix @@ -0,0 +1,52 @@ +{ + pkgs, + lib, + config, + inputs, + ... +}: { + # https://devenv.sh/basics/ + env.GREET = "devenv"; + + # https://devenv.sh/packages/ + packages = with pkgs; [ + git + nodePackages.typescript-language-server + nodePackages.vscode-json-languageserver + nodePackages.prettier + ]; + + # https://devenv.sh/languages/ + # languages.rust.enable = true; + languages.javascript = { + enable = true; + bun.enable = true; + }; + + # https://devenv.sh/processes/ + # processes.cargo-watch.exec = "cargo-watch"; + + # https://devenv.sh/services/ + # services.postgres.enable = true; + + # https://devenv.sh/scripts/ + scripts.hello.exec = '' + echo hello from $GREET + ''; + + enterShell = '' + hello + git --version + ''; + + # https://devenv.sh/tests/ + enterTest = '' + echo "Running tests" + git --version | grep --color=auto "${pkgs.git.version}" + ''; + + # https://devenv.sh/pre-commit-hooks/ + # pre-commit.hooks.shellcheck.enable = true; + + # See full reference at https://devenv.sh/reference/options/ +} diff --git a/devenv.yaml b/devenv.yaml new file mode 100644 index 0000000..fefdd49 --- /dev/null +++ b/devenv.yaml @@ -0,0 +1,14 @@ +# yaml-language-server: $schema=https://devenv.sh/devenv.schema.json +inputs: + nixpkgs: + url: github:cachix/devenv-nixpkgs/rolling +# If you're using non-OSS software, you can set allowUnfree to true. +# allowUnfree: true + +# If you're willing to use a package that's vulnerable +# permittedInsecurePackages: +# - "openssl-1.1.1w" + +# If you have more than one devenv you can merge them +#imports: +# - ./backend diff --git a/fe/.gitignore b/fe/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/fe/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/fe/.prettierrc.json b/fe/.prettierrc.json new file mode 100644 index 0000000..6ec5828 --- /dev/null +++ b/fe/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "trailingComma": "all", + "tabWidth": 2, + "semi": true, + "singleQuote": true, + "printWidth": 90 +} diff --git a/fe/README.md b/fe/README.md new file mode 100644 index 0000000..1e5a46b --- /dev/null +++ b/fe/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}); +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react'; + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}); +``` diff --git a/fe/bun.lockb b/fe/bun.lockb new file mode 100755 index 0000000..87dfbcf Binary files /dev/null and b/fe/bun.lockb differ diff --git a/fe/eslint.config.js b/fe/eslint.config.js new file mode 100644 index 0000000..cfd81c9 --- /dev/null +++ b/fe/eslint.config.js @@ -0,0 +1,25 @@ +import js from '@eslint/js'; +import globals from 'globals'; +import reactHooks from 'eslint-plugin-react-hooks'; +import reactRefresh from 'eslint-plugin-react-refresh'; +import tseslint from 'typescript-eslint'; + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': ['warn', { allowConstantExport: true }], + }, + }, +); diff --git a/fe/index.html b/fe/index.html new file mode 100644 index 0000000..caab4fe --- /dev/null +++ b/fe/index.html @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + Urbit Community Manager + + +
      + + + diff --git a/fe/package.json b/fe/package.json new file mode 100644 index 0000000..ba1e19e --- /dev/null +++ b/fe/package.json @@ -0,0 +1,56 @@ +{ + "name": "ucm", + "private": true, + "version": "0.1.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", + "@fontsource/inter": "^5.1.0", + "@fontsource/roboto": "^5.1.0", + "@hello-pangea/dnd": "^17.0.0", + "@mui/icons-material": "^6.1.0", + "@mui/material": "^6.1.0", + "@urbit/http-api": "file:../../js-http-api", + "any-ascii": "^0.3.2", + "bn.js": "^5.2.1", + "invariant": "^2.2.4", + "lodash": "^4.17.21", + "marked": "^14.1.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-html-parser": "^2.0.2", + "react-player": "^2.16.0", + "svgson": "^5.3.1", + "transformation-matrix": "^2.16.1", + "wouter": "^3.3.5", + "zustand": "^4.5.5" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.9.0", + "@faker-js/faker": "^9.0.3", + "@types/bn.js": "^5.1.6", + "@types/invariant": "^2.2.37", + "@types/lodash": "^4.17.7", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@vitejs/plugin-react": "^4.3.1", + "eslint": "^9.9.0", + "eslint-plugin-react-hooks": "^5.1.0-rc.0", + "eslint-plugin-react-refresh": "^0.4.9", + "globals": "^15.9.0", + "typescript": "^5.5.3", + "typescript-eslint": "^8.0.1", + "vite": "^5.4.1" + } +} diff --git a/fe/public/android-chrome-192x192.png b/fe/public/android-chrome-192x192.png new file mode 100644 index 0000000..98b84a8 Binary files /dev/null and b/fe/public/android-chrome-192x192.png differ diff --git a/fe/public/android-chrome-512x512.png b/fe/public/android-chrome-512x512.png new file mode 100644 index 0000000..3b764f5 Binary files /dev/null and b/fe/public/android-chrome-512x512.png differ diff --git a/fe/public/apple-touch-icon.png b/fe/public/apple-touch-icon.png new file mode 100644 index 0000000..d54c810 Binary files /dev/null and b/fe/public/apple-touch-icon.png differ diff --git a/fe/public/favicon-16x16.png b/fe/public/favicon-16x16.png new file mode 100644 index 0000000..fb8d14b Binary files /dev/null and b/fe/public/favicon-16x16.png differ diff --git a/fe/public/favicon-32x32.png b/fe/public/favicon-32x32.png new file mode 100644 index 0000000..afc27b5 Binary files /dev/null and b/fe/public/favicon-32x32.png differ diff --git a/fe/public/favicon.ico b/fe/public/favicon.ico new file mode 100644 index 0000000..62bdf71 Binary files /dev/null and b/fe/public/favicon.ico differ diff --git a/fe/public/site.webmanifest b/fe/public/site.webmanifest new file mode 100644 index 0000000..45dc8a2 --- /dev/null +++ b/fe/public/site.webmanifest @@ -0,0 +1 @@ +{"name":"","short_name":"","icons":[{"src":"/android-chrome-192x192.png","sizes":"192x192","type":"image/png"},{"src":"/android-chrome-512x512.png","sizes":"512x512","type":"image/png"}],"theme_color":"#ffffff","background_color":"#ffffff","display":"standalone"} \ No newline at end of file diff --git a/fe/src/App.css b/fe/src/App.css new file mode 100644 index 0000000..f51452f --- /dev/null +++ b/fe/src/App.css @@ -0,0 +1,72 @@ + +:root { + font-synthesis: none; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +*{ + box-sizing: border-box; +} +html, +body, +#root { + width: 100%; + height: 100%; + overflow: hidden; + /* max-width: 1280px; */ + /* margin: 0 auto; */ + /* padding: 2rem; */ + /* text-align: center; */ +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} +em { + margin: 0 0.5ch; +} +.textarea textarea, .textarea >div{ + width: 100%; + height: 100% !important; +} +.textarea textarea{ + overflow-y: scroll !important; +} +a { + font-weight: 500; + text-decoration: inherit; +} diff --git a/fe/src/App.tsx b/fe/src/App.tsx new file mode 100644 index 0000000..d938d1f --- /dev/null +++ b/fe/src/App.tsx @@ -0,0 +1,24 @@ +import { useEffect, useState } from 'react'; +import './App.css'; +import useStore from './logic/store'; +import Router from './Router'; +import { LoadingScreen } from './ui/Components'; +import { createTheme, ThemeProvider, styled, PaletteMode } from '@mui/material/styles'; +import CssBaseline from '@mui/material/CssBaseline'; +import AppTheme from './ui/shared-theme/AppTheme'; + +function App() { + // data loading + const { init, loading } = useStore(['init', 'loading']); + useEffect(() => { + init(); + }, []); + return ( + + + {loading ? : } + + ); +} + +export default App; diff --git a/fe/src/Router.tsx b/fe/src/Router.tsx new file mode 100644 index 0000000..7e26b8f --- /dev/null +++ b/fe/src/Router.tsx @@ -0,0 +1,48 @@ +import { Link, Route, Router } from "wouter"; +import Dashboard from "./dashboard/Dashboard.tsx"; +import CreateForm from "./dashboard/CreateForm.tsx"; +import SiteDash from "./dashboard/Site.tsx"; +import Modal from "./modals/Modal.tsx"; +import useStore from "./logic/store.ts"; +import { Button, Container, Typography } from "@mui/material"; + +export default function () { + const { airlock, state, groups, modal } = useStore([ + "airlock", + "state", + "groups", + "modal", + ]); + return ( + <> + + + + + {(params) => { + const binding = `/${params.site}`; + const site = state[binding]; + if (!site) return ; + else { + const groupParam = `~${airlock.ship}/${site.groupname}`; + const group = groups[groupParam]; + return ; + } + }} + + + {modal && {modal}} + + ); +} + +export function NotFound({ err }: { err: string }) { + return ( + + {err} not found + + + + + ); +} diff --git a/fe/src/assets/icons/comet.svg b/fe/src/assets/icons/comet.svg new file mode 100644 index 0000000..2d5c3f5 --- /dev/null +++ b/fe/src/assets/icons/comet.svg @@ -0,0 +1,23 @@ + + + + + diff --git a/fe/src/assets/icons/spinner.svg b/fe/src/assets/icons/spinner.svg new file mode 100755 index 0000000..2a516de --- /dev/null +++ b/fe/src/assets/icons/spinner.svg @@ -0,0 +1 @@ + diff --git a/fe/src/assets/react.svg b/fe/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/fe/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/fe/src/dashboard/CreateForm.tsx b/fe/src/dashboard/CreateForm.tsx new file mode 100644 index 0000000..5fb86e5 --- /dev/null +++ b/fe/src/dashboard/CreateForm.tsx @@ -0,0 +1,118 @@ +import { useState } from "react"; +import { useLocation, Link } from "wouter"; +import { + Alert, + Button, + TextField, + Typography, + Box, + Container, + Card, + CardHeader, + CardContent, + Stack, + CircularProgress, +} from "@mui/material"; +import useStore from "../logic/store"; +import { AppBunt, Site } from "../logic/types"; +import { enkebab } from "../logic/utils"; +import { Centered, Flex, WholeFlex } from "../ui/Components"; + +export default function () { + const { sync, dashIO } = useStore(["sync", "dashIO"]); + const [location, navigate] = useLocation(); + const [loading, setLoading] = useState(false); + const [siteName, setSite] = useState(""); + const [sitePath, setPath] = useState("/"); + const [siteDesc, setDesc] = useState(""); + const [error, setError] = useState(""); + function setSitePath(e: React.ChangeEvent) { + const input = e.currentTarget.value.slice(1).replace("/", ""); + setPath("/" + input); + } + + // TODO add automated name change logic if site already exists + async function create() { + const { createGroup, createSite } = dashIO(); + if (!siteName) { + setError("Site name can't be empty"); + return; + } + setLoading(true); + // Create Group first + // Then create site on agent + const site: Site = { + sitename: siteName, + description: siteDesc, + groupname: enkebab(siteName), + binding: sitePath, + icon: "", + home: "", + css: "", + apps: AppBunt, + "app-order": [], + hidden: false, + }; + const res = await createSite(site); + if (res) { + await createGroup(siteName); + await sync(); + navigate("/"); + console.log(res, "res"); + } + } + return ( + + + + + + + Choose the name of your site and the URL path you want for it + + + {error && {error}.} + + setSite(e.currentTarget.value)} + /> + + setDesc(e.currentTarget.value)} + /> + + {loading ? ( + + + + ) : ( + <> + + + + + + )} + + + + + ); +} diff --git a/fe/src/dashboard/Dashboard.tsx b/fe/src/dashboard/Dashboard.tsx new file mode 100644 index 0000000..e180294 --- /dev/null +++ b/fe/src/dashboard/Dashboard.tsx @@ -0,0 +1,87 @@ +import useStore from "../logic/store"; +import { Site } from "../logic/types"; +import { useLocation, Link as RouterLink } from "wouter"; +import { + Card, + CardContent, + CardMedia, + Paper, + Typography, + Button, + Container, + Stack, +} from "@mui/material"; +import { DEFAULT_ICON } from "../logic/constants"; +import { Centered, Row, SpreadRow } from "../ui/Components"; +import * as muiStyles from "@mui/material/styles"; +import { ThemeToggle } from "../ui/theme"; +// import { ColorToggle } from "../ui/theme"; + +export default function () { + const using = muiStyles.useColorScheme(); + const [_location, navigate] = useLocation(); + const { state } = useStore(["state"]); + const list = Object.values(state); + function create() { + navigate("/create-site"); + } + return ( + + + + + Urbit Community Manager + + + + + + Your Sites + + + {list.length !== 0 ? ( + list.map((site) => ) + ) : ( + + Nothing yet{" "} + + )} + + + + + + ); +} + +function SiteCard({ site }: { site: Site }) { + console.log(site, "site"); + const icon = site.icon || DEFAULT_ICON; + // Responsive font sizes huh + return ( + + + + + + + + + {site.sitename} + + + + + + + ); +} diff --git a/fe/src/dashboard/Site.tsx b/fe/src/dashboard/Site.tsx new file mode 100644 index 0000000..1e5321c --- /dev/null +++ b/fe/src/dashboard/Site.tsx @@ -0,0 +1,543 @@ +import { useEffect, useState } from "react"; +import { + AppType, + Apps, + Channels, + ChannelsBunt, + RichMetadata, + Ship, + Site, + Wiki, +} from "../logic/types"; +import { + Button, + TextField, + Typography, + Box, + Container, + CardHeader, + Card, + CardContent, + CardActions, + CircularProgress, + Avatar, + Collapse, + Accordion, + AccordionSummary, + AccordionDetails, + Link as MuiLink, + List, + ListItem, + Divider, +} from "@mui/material"; +import useStore from "../logic/store"; +import { + AddAppModal, + ConfirmationModal, + StaticPageModal, +} from "../modals/Modal"; +import { ChannelType, Group } from "../logic/types-tlon"; +import { APP_NAME, RADIO_SHIP, WIKI_SHIP } from "../logic/constants"; +import { useLocation } from "wouter"; +import { capitalize, doubleCheckApps, delay, enkebab } from "../logic/utils"; + +import DragContainer from "../ui/Drag.tsx"; +import { DropResult } from "@hello-pangea/dnd"; +import { Centered, SpreadRow } from "../ui/Components.tsx"; +import { ExpandMore } from "@mui/icons-material"; + +export function SiteDash({ site, group }: { site: Site; group: Group }) { + useEffect(() => { + setChans(); + // const apporder = ["blog", "chat", "forum", "radio", "wiki", "about"]; + const order = [...site["app-order"]]; + if (!order.includes("blog")) order.push("blog"); + if (!order.includes("chat")) order.push("chat"); + if (!order.includes("forum")) order.push("forum"); + if (!order.includes("radio")) order.push("radio"); + if (!order.includes("wiki")) order.push("wiki"); + for (const title of Object.keys(site.apps.static)) { + const key = `static/${title}` as AppType; + if (!order.includes(key)) order.push(key); + } + setAppOrder(order as AppType[]); + }, [group, site]); + function setChans() { + const chans = Object.entries(group.channels); + const agg = chans.reduce((acc: Channels, [nam, chan]) => { + const [kind, ship, name] = nam.split("/"); + const host = ship as Ship; + const meta: RichMetadata = { + ...chan.meta, + name, + host, + kind: kind as ChannelType, + }; + if (kind === "chat") return { ...acc, chats: [...acc.chats, meta] }; + else if (kind === "diary" && name.includes("ucm-ublog")) + return { ...acc, blog: meta }; + else if (kind === "diary") + return { ...acc, forums: [...acc.forums, meta] }; + else return acc; + }, ChannelsBunt); + setChannels(agg); + } + + useEffect(() => { + fetchWikis(); + }, []); + + async function fetchWikis() { + try { + const res = await dashIO().scryWiki(); + setWiki(res.filter((w) => w.public)); + } catch { + setWiki(null); + } + } + + const { setModal, dashIO, pikes, sync } = useStore([ + "setModal", + "dashIO", + "pikes", + "sync", + ]); + const [wikis, setWiki] = useState(null); + const [modal, showModal] = useState(false); + const [error, setError] = useState(""); + const [homeMarkdown, setHome] = useState(site.home); + const [customPalette, setPalette] = useState(site.css); + const [siteName, setSite] = useState(site.sitename); + const [siteDesc, setDesc] = useState(site.description); + const [sitePath, setPath] = useState(site.binding); + const [siteIcon, setSiteIcon] = useState(site.icon); + const [hidden, setHidden] = useState(site.hidden); + const [channels, setChannels] = useState(ChannelsBunt); + const [appOrder, setAppOrder] = useState([]); + const [apps, setApps] = useState(site.apps); + + useEffect(() => { + doubleCheckApps(site.apps, channels, pikes).then((a) => setApps(a)); + }, [channels, site, pikes]); + + function setSitePath(e: React.ChangeEvent) { + const input = e.currentTarget.value.slice(1).replace("/", ""); + setPath("/" + input); + } + + async function save() { + const ns: Site = { + description: siteDesc, + icon: siteIcon, + home: homeMarkdown, + css: customPalette, + binding: sitePath, + sitename: siteName, + groupname: enkebab(siteName), + "app-order": appOrder, + apps, + hidden, + }; + const res = await dashIO().createSite(ns); + sync(); + } + + // drag + function reorder(result: DropResult) { + // dropped outside the list + if (!result.destination) { + return; + } + const newlist = Array.from(appOrder); + const [removed] = newlist.splice(result.source.index, 1); + newlist.splice(result.destination.index, 0, removed); + setAppOrder(newlist); + } + + const [loading, setLoading] = useState(false); + const [_, navigate] = useLocation(); + async function destroy() { + const res = await dashIO().delSite(site.binding); + if (res) { + await sync(); + navigate("/"); + } + } + function confirmDestroy() { + setModal(); + } + + return ( + + + + {loading ? ( + + ) : ( + + )} + + + {site.sitename} + + + + + + + + setSite(e.currentTarget.value)} + /> + + setDesc(e.currentTarget.value)} + /> + + + setSiteIcon(e.currentTarget.value)} + /> + + + + + Apps + +
      + +
      +
      + + }> + Home Page + + + + Write some Markdown to display in the root page of your site + + setHome(e.currentTarget.value)} + /> + + + + {/* + }> + Custom Styling + + + + {APP_NAME} uses{" "} + + Material UI + + for its styling + + + You can use a custom color palette by adding the palette object in + JSON format below. + + setPalette(e.currentTarget.value)} + /> + + */} + + + + +
      +
      + ); +} + +function cardWrapper(site: Site, channels: Channels, wiki: Wiki[] | null) { + return function buildCard(a: AppType) { + const { enabled, content, actions } = + a === "blog" + ? buildBlogCard(site, channels) + : a === "chat" + ? buildChatCard(site) + : a === "forum" + ? buildForumCard(site) + : a === "radio" + ? buildRadioCard(site) + : a === "wiki" + ? buildWikiCard(site, wiki) + : buildStaticCard(a, site); + + const opacity = enabled ? 1 : 0.7; + const title = a.startsWith("static") ? "Static" : capitalize(a); + return ( + + + + + {content} + + + + {actions} + + + ); + }; +} + +function buildBlogCard(site: Site, channels: Channels) { + const { setModal, dashIO, sync } = useStore(["setModal", "dashIO", "sync"]); + const [loading, setLoading] = useState(false); + function addBlog() { + setModal(); + } + async function toggle(blog: string) { + setLoading(true); + const ns = { ...site, apps: { ...site.apps, blog } }; + const res = await dashIO().createSite(ns); + await sync(); + setLoading(false); + } + const enabled = !!site.apps.blog; + const content = {channels.blog?.title}; + const actions = loading ? ( + + ) : !channels.blog ? ( + + ) : !enabled ? ( + + ) : ( + + ); + return { enabled, content, actions }; +} +function buildChatCard(site: Site) { + const { setModal } = useStore(["setModal"]); + function addChat() { + setModal(); + } + const enabled = site.apps.chat.length > 0; + const content = !enabled ? ( + No chats + ) : ( + + {site.apps.chat.map((c, i) => ( + + -{c} + + ))} + + ); + const actions = ; + return { enabled, content, actions }; +} +function buildForumCard(site: Site) { + const { setModal } = useStore(["setModal"]); + function addForum() { + setModal(); + } + const enabled = site.apps.forum.length > 0; + const content = !enabled ? ( + No forums + ) : ( + + {site.apps.forum.map((c, i) => ( + + -{c} + + ))} + + ); + const actions = ; + return { enabled, content, actions }; +} + +function buildRadioCard(site: Site) { + const { sync, dashIO, pikes } = useStore(["sync", "dashIO", "pikes"]); + const [loading, setLoading] = useState(false); + const { createSite, scryPikes } = dashIO(); + async function toggle(bool: boolean) { + setLoading(true); + const ns = { ...site, apps: { ...site.apps, radio: bool } }; + await createSite(ns); + await sync(); + setLoading(false); + } + async function install() { + setLoading(true); + const res = await dashIO().installApp(RADIO_SHIP, "radio"); + await delay(3000); + const pikes = await scryPikes(); + if (pikes?.radio?.sync?.ship === RADIO_SHIP) setLoading(false); + else { + await delay(5000); + if (pikes?.radio?.sync?.ship === RADIO_SHIP) setLoading(false); + } + // sync(); + } + const pike = pikes.radio; + const installed = pike?.sync?.ship === RADIO_SHIP; + const content = !installed ? Not Installed : <>; + const enabled = site.apps.radio; + const actions = loading ? ( + + ) : !installed ? ( + + ) : site.apps.radio ? ( + + ) : ( + + ); + return { enabled, content, actions }; +} +function buildWikiCard(site: Site, wiki: Wiki[] | null) { + const { sync, dashIO, pikes } = useStore(["sync", "dashIO", "pikes"]); + const [loading, setLoading] = useState(false); + async function disable() { + const ns = { ...site, apps: { ...site.apps, wiki: "" } }; + const res = await dashIO().createSite(ns); + sync(); + } + async function toggleWiki(name: string) { + const ns = { ...site, apps: { ...site.apps, wiki: name } }; + const res = await dashIO().createSite(ns); + sync(); + } + async function install() { + setLoading(true); + const res = await dashIO().installApp(WIKI_SHIP, "wiki"); + sync(); + } + const pike = pikes.wiki; + const installed = pike?.sync?.ship === WIKI_SHIP; + const content = !wiki ? ( + Not Installed + ) : ( + wiki.map((w) => ( + toggleWiki(w.id)} + key={w.id} + > + {w.title} + + )) + ); + const actions = !wiki ? ( + + ) : site.apps.wiki ? ( + + ) : null; + + return { enabled: installed, content, actions }; +} + +function buildStaticCard(title: string, site: Site) { + const { setModal } = useStore(["setModal"]); + async function openEditor() { + const text = site.apps.static[name]; + setModal(); + } + const [_, name] = title.split("/"); + if (name) { + const content = {name}; + const actions = ; + return { enabled: true, content, actions }; + } else { + const content = <>; + const actions = ; + return { enabled: false, content, actions }; + } +} + +export default SiteDash; diff --git a/fe/src/logic/comms.ts b/fe/src/logic/comms.ts new file mode 100644 index 0000000..0c3bef4 --- /dev/null +++ b/fe/src/logic/comms.ts @@ -0,0 +1,549 @@ +import anyAscii from "any-ascii"; +import { + faker, + Faker, + es, + en, + zh_CN, + ja, + th, + mergeLocales, +} from "@faker-js/faker"; +import { APP_NAME, RADIO_SHIP, WIKI_SHIP } from "./constants"; +import { + AppChoice, + AppType, + Pikes, + RichMetadata, + Ship, + Site, + Wiki, +} from "./types"; +import { enkebab, generateRandomBase64, isValidHttpUrl } from "./utils"; +import { + ChannelsRes, + Content, + DiaryPage, + DiaryPost, + Essay, + PostsPage, +} from "./types-tlon"; +import Urbit from "@urbit/http-api"; +import { hex2patp } from "./ob/co"; +import { tokenize } from "./tlon-helpers"; + +type EventHandler = (data: any) => void; +type ErrorHandler = (data: any, id: string) => void; + +export function urbitIO(airlock: Urbit) { + const sub = async ( + app: string, + path: string, + event: EventHandler, + err?: ErrorHandler, + quit?: EventHandler, + ) => airlock.subscribe({ app, path, event }); + const unsub = async (num: number) => airlock.unsubscribe(num); + const scry = async (app: string, path: string) => airlock.scry({ app, path }); + const poke = async (app: string, mark: string, json: any) => + airlock.poke({ app, mark, json }); + const thread = async ( + threadName: string, + desk: string, + inputMark: string, + outputMark: string, + body: any, + ) => airlock.thread({ threadName, desk, inputMark, outputMark, body }); + return { + sub, + unsub, + scry, + poke, + thread, + }; +} + +export function dashIO(airlock: Urbit) { + const { scry, sub, unsub, poke, thread } = urbitIO(airlock); + + async function initSubs(handler: EventHandler) { + const err = (err: any, id: string) => console.log(err, ""); + const quit = (data: any) => console.log(data, ""); + const res = await sub(APP_NAME, "/ui", handler, err, quit); + return res; + } + async function initialScries() { + const groups = scry("groups", "/groups/v1"); + const pikes = scry("hood", "/kiln/pikes"); + return { groups: await groups, pikes: await pikes }; + } + // pokes + + async function createSite(site: Site) { + const obj = { dash: { set: site } }; + return poke(APP_NAME, "json", obj); + } + async function delSite(path: string) { + const obj = { dash: { del: path } }; + return poke(APP_NAME, "json", obj); + } + + // Tlon + async function createGroup(title: string) { + const name = enkebab(title); + const mark = "group-create"; + const app = "groups"; + const json = { + title, + description: "Backend Group for UCM site", + image: "#999999", + cover: "#D9D9D9", + name, + members: {}, + cordon: { + open: { + ships: [], + ranks: [], + }, + }, + secret: false, + }; + return poke(app, mark, json); + } + async function createBlog( + groupname: string, + title: string, + description: string, + ) { + const group = `~${airlock.ship}/${groupname}`; + const randomString = generateRandomBase64(3); + const name = "ucm-" + "ublog-" + enkebab(title) + "-" + randomString; + const mark = "channel-action"; + const app = "channels"; + const json = { + create: { + kind: "diary", + group, + name, + title, + description, + readers: [], + writers: [], + }, + }; + console.log(json); + return poke(app, mark, json); + } + async function createChannel( + groupname: string, + title: string, + description: string, + kind: string, + ) { + const group = `~${airlock.ship}/${groupname}`; + const randomString = generateRandomBase64(3); + const name = "ucm-" + enkebab(title) + "-" + randomString; + const mark = "channel-action"; + const app = "channels"; + const json = { + create: { + kind, + group, + name, + title, + description, + readers: [], + writers: [], + }, + }; + // console.log(json); + return poke(app, mark, json); + } + async function scryState(): Promise { + const res = await scry(APP_NAME, "/state"); + return res; + } + async function scryGroups() { + const app = "groups"; + const path = "/groups/v1"; + return await scry(app, path); + } + async function scryPikes() { + const app = "hood"; + const path = "/kiln/pikes"; + return await scry(app, path); + } + async function fetchApps(pikes: Pikes) { + const haveWiki = pikes.wiki && pikes.wiki.sync.ship === WIKI_SHIP; + if (!haveWiki) installApp(WIKI_SHIP, "wiki"); + } + async function installApp(ship: Ship, appName: string) { + const app = "docket"; + const mark = "docket-install"; + const json = `${ship}/${appName}`; + return poke(app, mark, json); + } + async function scryWiki(): Promise { + const app = "wiki"; + const path = `/list/mine`; + return await scry(app, path); + } + + return { + initSubs, + initialScries, + createSite, + delSite, + createGroup, + createBlog, + createChannel, + scryGroups, + scryState, + scryPikes, + fetchApps, + installApp, + scryWiki, + }; +} +export default function appIO(airlock: Urbit) { + const { scry, sub, unsub, poke, thread } = urbitIO(airlock); + + async function channelsSub(handler: EventHandler) { + const err = (err: any, id: string) => console.log(err, ""); + const quit = (data: any) => console.log(data, ""); + const res = await sub("channels", "/v1", handler, err, quit); + return res; + } + + // { + // "kind": "chat", + // "group": "~zod/my-test-site-3", + // "name": "shat-number-2", + // "title": "shat number 2", + // "description": "my new shat", + // "readers": [], + // "writers": [] + // } + + // tlom + async function sendChatMsg( + author: Ship, + host: Ship, + name: string, + content: Content, + sent: number, + ) { + const nest = `chat/${host}/${name}`; + const mark = "channel-action"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + add: { + "kind-data": { + chat: null, + }, + author, + content, + sent, + }, + }, + }, + }, + }; + return poke(app, mark, json); + } + async function sendChatReply( + author: Ship, + host: Ship, + name: string, + parent: string, + content: Content, + ) { + const nest = `chat/${host}/${name}`; + const mark = "channel-action"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + reply: { + id: parent, + action: { + add: { + author, + sent: Date.now(), + content, + }, + }, + }, + }, + }, + }, + }; + return poke(app, mark, json); + } + + async function sendDiaryPost( + author: Ship, + host: Ship, + name: string, + title: string, + image: string, + content: Content, + sent: number, + ) { + const nest = `diary/${host}/${name}`; + const mark = "channel-action"; + const app = "channels"; + const kind = { diary: { title, image } }; + const json = { + channel: { + nest, + action: { + post: { + add: { + author, + sent, + content, + "kind-data": kind, + }, + }, + }, + }, + }; + return poke(app, mark, json); + } + async function sendDiaryReply( + author: Ship, + host: Ship, + name: string, + parent: string, + content: Content, + ) { + const nest = `diary/${host}/${name}`; + const mark = "channel-action"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + reply: { + id: parent, // dotted! + action: { + add: { + author, + sent: Date.now(), + content, + }, + }, + }, + }, + }, + }, + }; + console.log(json, "sending diary reply"); + return poke(app, mark, json); + } + async function sendReact( + author: Ship, + kind: string, + host: Ship, + name: string, + id: string, + react: string, + ) { + const nest = `${kind}/${host}/${name}`; + const mark = "channel-action"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + "add-react": { + id, + react, + ship: author, + }, + }, + }, + }, + }; + return poke(app, mark, json); + } + async function sendReplyReact( + author: Ship, + kind: string, + host: Ship, + name: string, + parentId: string, + id: string, + react: string, + ) { + const nest = `${kind}/${host}/${name}`; + const mark = "channel-action"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + reply: { + id: parentId, + action: { + "add-react": { + id, + react, + ship: author, + }, + }, + }, + }, + }, + }, + }; + return poke(app, mark, json); + } + + async function scryDiary( + ship: Ship, + name: string, + count: number, + ): Promise { + const app = "channels"; + const path = `/v1/diary/${ship}/${name}/posts/newest/${count}/post`; + return await scry(app, path); + } + async function scryDiaryPost( + ship: Ship, + name: string, + id: string, + ): Promise { + const app = "channels"; + const path = `/v1/diary/${ship}/${name}/posts/post/${id}`; + return await scry(app, path); + } + async function scryChat( + ship: Ship, + name: string, + count: number, + ): Promise { + const app = "channels"; + const path = `/v1/chat/${ship}/${name}/posts/newest/${count}/post`; + return await scry(app, path); + } + + // other apps + + async function search( + query: string, + apps: AppType[], + by: string, + start?: number, + end?: number, + ) { + const obj = { site: { search: { query, apps, by, start, end } } }; + return poke(APP_NAME, "json", obj); + } + async function scryChatroom( + ship: Ship, + name: string, + count: number, + ): Promise { + const res = await scry( + "channels", + `/v2/chat/${ship}/${name}/posts/newest/${count}/outline`, + ); + return res; + } + + async function fixChatMsg( + airlock: Urbit, + host: Ship, + name: string, + id: string, + essay: Essay, + ) { + const nest = `chat/${host}/${name}`; + const mark = "channel-action"; + const desk = "groups"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + edit: { + id, + essay, + }, + }, + }, + }, + }; + console.log(airlock, "airlock"); + return airlock.ninjaPoke({ desk, app, mark, json, proxyApp: "ucm" }); + } + async function scryChannels(): Promise { + const res = await scry("channels", "/v2/channels/full"); + // const res4 = await scry("channels", "/v2/heads"); + // console.log(res4, "channs4"); + return res; + } + async function radioSub(handler: EventHandler) { + return sub("tenna", "/frontend", handler); + } + async function radioSub2(handler: EventHandler) { + await sub("tower", "/greg/local", handler); + // return sub("tower", "/personal", handler); + } + async function radioChat(from: Ship, message: string) { + const time = Date.now(); + const json = { + chat: { + from, + message, + time, + }, + }; + return poke("tenna", "radio-action", json); + } + async function radioSpin(playUrl: string) { + if (!isValidHttpUrl(playUrl)) return; + let currentUnixTime = Date.now(); + currentUnixTime = Math.ceil(currentUnixTime); + const json = { + spin: { + url: playUrl, + time: currentUnixTime, + }, + }; + return await poke("tenna", "radio-action", json); + } + + return { + channelsSub, + sendChatMsg, + sendChatReply, + sendDiaryPost, + sendDiaryReply, + sendReact, + sendReplyReact, + scryDiary, + scryDiaryPost, + scryChat, + search, + scryChatroom, + fixChatMsg, + scryChannels, + radioSub, + radioSub2, + radioSpin, + radioChat, + }; +} diff --git a/fe/src/logic/constants.ts b/fe/src/logic/constants.ts new file mode 100644 index 0000000..4aa679c --- /dev/null +++ b/fe/src/logic/constants.ts @@ -0,0 +1,37 @@ +import { Ship } from "./types"; + +export const APP_NAME = "ucm"; +export const URL = import.meta.env.PROD ? "" : "http://localhost:8081"; + +export const MOBILE_BROWSER_REGEX = + /Android|webOS|iPhone|iPad|iPod|BlackBerry/i; +export const AUDIO_REGEX = new RegExp(/https:\/\/.+\.(mp3|wav|ogg)\b/gim); +export const VIDEO_REGEX = new RegExp(/https:\/\/.+\.(mov|mp4|ogv)\b/gim); +export const TWITTER_REGEX = new RegExp( + /https:\/\/(twitter|x)\.com\/.+\/status\/\d+/gim, +); + +export const REF_REGEX = new RegExp( + /urbit:\/\/[a-z0-9-]+\/~[a-z-_]+\/[a-z0-9-_]+/gim, +); +export const RADIO_REGEX = new RegExp(/urbit:\/\/radio\/~[a-z-_]+/gim); + +export const IMAGE_REGEX = new RegExp( + /https:\/\/.+\.(jpg|img|png|gif|tiff|jpeg|webp|webm|svg)\b/gim, +); + +export const SHIP_REGEX = new RegExp(/\B~[a-z-]+/); +export const HASHTAGS_REGEX = new RegExp(/#[a-z-]+/g); + +export const DEFAULT_DATE = { year: 1970, month: 1, day: 1 }; +export const RADIO = "📻"; + +export const RADIO_SHIP: Ship = "~nodmyn-dosrux" as Ship; +export const WIKI_SHIP: Ship = "~holnes" as Ship; + +export const DEFAULT_ICON = "https://s3.sortug.com/img/icons/ucm-logo.png"; + +export const MAGIC_COMET = + "~dozzod-polwex-dozzod-polwex--dozzod-polwex-dozzod-polwex"; +const paths = window.location.pathname.split("/"); +export const BASE_PATH = `/${paths[4]}`; diff --git a/fe/src/logic/ob/co.ts b/fe/src/logic/ob/co.ts new file mode 100644 index 0000000..892c86a --- /dev/null +++ b/fe/src/logic/ob/co.ts @@ -0,0 +1,400 @@ +// ++ co +// +// See arvo/sys/hoon.hoon. +import { BN } from "bn.js"; +import { chunk, isEqual } from "lodash"; +import { ob } from "./ob"; +import type { Bn, PatP, PatQ, Rank, Iterable, Number } from "./types"; + +const zero = new BN(0); +const one = new BN(1); +const two = new BN(2); +const three = new BN(3); +const four = new BN(4); +const five = new BN(5); + +const pre = ` +dozmarbinwansamlitsighidfidlissogdirwacsabwissib\ +rigsoldopmodfoglidhopdardorlorhodfolrintogsilmir\ +holpaslacrovlivdalsatlibtabhanticpidtorbolfosdot\ +losdilforpilramtirwintadbicdifrocwidbisdasmidlop\ +rilnardapmolsanlocnovsitnidtipsicropwitnatpanmin\ +ritpodmottamtolsavposnapnopsomfinfonbanmorworsip\ +ronnorbotwicsocwatdolmagpicdavbidbaltimtasmallig\ +sivtagpadsaldivdactansidfabtarmonranniswolmispal\ +lasdismaprabtobrollatlonnodnavfignomnibpagsopral\ +bilhaddocridmocpacravripfaltodtiltinhapmicfanpat\ +taclabmogsimsonpinlomrictapfirhasbosbatpochactid\ +havsaplindibhosdabbitbarracparloddosbortochilmac\ +tomdigfilfasmithobharmighinradmashalraglagfadtop\ +mophabnilnosmilfopfamdatnoldinhatnacrisfotribhoc\ +nimlarfitwalrapsarnalmoslandondanladdovrivbacpol\ +laptalpitnambonrostonfodponsovnocsorlavmatmipfip\ +`; + +const suf = ` +zodnecbudwessevpersutletfulpensytdurwepserwylsun\ +rypsyxdyrnuphebpeglupdepdysputlughecryttyvsydnex\ +lunmeplutseppesdelsulpedtemledtulmetwenbynhexfeb\ +pyldulhetmevruttylwydtepbesdexsefwycburderneppur\ +rysrebdennutsubpetrulsynregtydsupsemwynrecmegnet\ +secmulnymtevwebsummutnyxrextebfushepbenmuswyxsym\ +selrucdecwexsyrwetdylmynmesdetbetbeltuxtugmyrpel\ +syptermebsetdutdegtexsurfeltudnuxruxrenwytnubmed\ +lytdusnebrumtynseglyxpunresredfunrevrefmectedrus\ +bexlebduxrynnumpyxrygryxfeptyrtustyclegnemfermer\ +tenlusnussyltecmexpubrymtucfyllepdebbermughuttun\ +bylsudpemdevlurdefbusbeprunmelpexdytbyttyplevmyl\ +wedducfurfexnulluclennerlexrupnedlecrydlydfenwel\ +nydhusrelrudneshesfetdesretdunlernyrsebhulryllud\ +remlysfynwerrycsugnysnyllyndyndemluxfedsedbecmun\ +lyrtesmudnytbyrsenwegfyrmurtelreptegpecnelnevfes\ +`; + +const patp2syls = (name: string): string[] => + name.replace(/[\^~-]/g, "").match(/.{1,3}/g) || []; + +const splitAt = (index: number, str: string) => [ + str.slice(0, index), + str.slice(index), +]; + +const prefixes = pre.match(/.{1,3}/g) as RegExpMatchArray; + +const suffixes = suf.match(/.{1,3}/g) as RegExpMatchArray; + +const bex = (n: Bn): Bn => two.pow(n); + +const rsh = (a: Bn, b: Bn, c: Bn): Bn => c.div(bex(bex(a).mul(b))); + +const met = (a: Bn, b: Bn, c: Bn = zero): Bn => + b.eq(zero) ? c : met(a, rsh(a, one, b), c.add(one)); + +const end = (a: Bn, b: Bn, c: Bn) => c.mod(bex(bex(a).mul(b))); + +/** + * Convert a hex-encoded string to a @p-encoded string. + * + */ +export const hex2patp = (hex: string): string => { + if (hex === null) { + throw new Error("hex2patp: null input"); + } + return patp(new BN(hex, "hex")); +}; + +/** + * Convert a @p-encoded string to a hex-encoded string. + * + * @param {String} name @p + * @return {String} + */ +const patp2hex = (name: PatP): string => { + if (isValidPat(name) === false) { + throw new Error("patp2hex: not a valid @p"); + } + const syls = patp2syls(name); + + const syl2bin = (idx: number) => idx.toString(2).padStart(8, "0"); + + const addr = syls.reduce( + (acc, syl, idx) => + idx % 2 !== 0 || syls.length === 1 + ? acc + syl2bin(suffixes.indexOf(syl)) + : acc + syl2bin(prefixes.indexOf(syl)), + "", + ); + + const bn = new BN(addr, 2); + const hex = ob.fynd(bn).toString("hex"); + return hex.length % 2 !== 0 ? hex.padStart(hex.length + 1, "0") : hex; +}; + +/** + * Convert a @p-encoded string to a bignum. + * + */ +const patp2bn = (name: PatP): Bn => new BN(patp2hex(name), "hex"); + +/** + * Convert a @p-encoded string to a decimal-encoded string. + * + */ +export const patp2dec = (name: PatP): string => { + let bn; + try { + bn = patp2bn(name); + } catch (_) { + throw new Error("patp2dec: not a valid @p"); + } + return bn.toString(); +}; + +/** + * Convert a number to a @q-encoded string. + * + */ +const patq = (arg: number | Bn | string): string => { + const bn = new BN(arg); + const buf = bn.toArrayLike(Buffer); + return buf2patq(buf); +}; + +/** + * Convert a Buffer into a @q-encoded string. + * + */ +const buf2patq = (buf: Buffer): string => { + const chunked = + buf.length % 2 !== 0 && buf.length > 1 + ? [[buf[0]]].concat(chunk(buf.slice(1), 2)) + : chunk(buf, 2); + + const prefixName = (byts: number[]) => + byts[1] === undefined + ? prefixes[0] + suffixes[byts[0]] + : prefixes[byts[0]] + suffixes[byts[1]]; + + const name = (byts: number[]) => + byts[1] === undefined + ? suffixes[byts[0]] + : prefixes[byts[0]] + suffixes[byts[1]]; + + const alg = (pair: number[]) => + pair.length % 2 !== 0 && chunked.length > 1 ? prefixName(pair) : name(pair); + + return chunked.reduce( + (acc, elem) => acc + (acc === "~" ? "" : "-") + alg(elem), + "~", + ); +}; + +/** + * Convert a hex-encoded string to a @q-encoded string. + * + * Note that this preserves leading zero bytes. + * + */ +const hex2patq = (arg: string): string => { + const hex = arg.length % 2 !== 0 ? arg.padStart(arg.length + 1, "0") : arg; + + const buf = Buffer.from(hex, "hex"); + return buf2patq(buf); +}; + +/** + * Convert a @q-encoded string to a hex-encoded string. + * + * Note that this preserves leading zero bytes. + * + */ +const patq2hex = (name: PatQ): string => { + if (isValidPat(name) === false) { + throw new Error("patq2hex: not a valid @q"); + } + const chunks = name.slice(1).split("-"); + const dec2hex = (dec: number) => dec.toString(16).padStart(2, "0"); + + const splat = chunks.map((chunk) => { + let syls = splitAt(3, chunk); + return syls[1] === "" + ? dec2hex(suffixes.indexOf(syls[0])) + : dec2hex(prefixes.indexOf(syls[0])) + dec2hex(suffixes.indexOf(syls[1])); + }); + + return name.length === 0 ? "00" : splat.join(""); +}; + +/** + * Convert a @q-encoded string to a bignum. + * + */ +const patq2bn = (name: PatQ): Bn => new BN(patq2hex(name), "hex"); + +/** + * Convert a @q-encoded string to a decimal-encoded string. + * + */ +const patq2dec = (name: PatQ): string => { + let bn; + try { + bn = patq2bn(name); + } catch (_) { + throw new Error("patq2dec: not a valid @q"); + } + return bn.toString(); +}; + +/** + * Determine the ship class of a @p value. + * + */ +const clan = (who: PatP): Rank => { + let name; + try { + name = patp2bn(who); + } catch (_) { + throw new Error("clan: not a valid @p"); + } + + const wid = met(three, name); + return wid.lte(one) + ? "galaxy" + : wid.eq(two) + ? "star" + : wid.lte(four) + ? "planet" + : wid.lte(new BN(8)) + ? "moon" + : "comet"; +}; + +/** + * Determine the parent of a @p value. + * + */ +const sein = (name: PatP): PatP => { + let who; + try { + who = patp2bn(name); + } catch (_) { + throw new Error("sein: not a valid @p"); + } + + let mir; + try { + mir = clan(name); + } catch (_) { + throw new Error("sein: not a valid @p"); + } + + const res = + mir === "galaxy" + ? who + : mir === "star" + ? end(three, one, who) + : mir === "planet" + ? end(four, one, who) + : mir === "moon" + ? end(five, one, who) + : zero; + return patp(res); +}; + +/** + * Weakly check if a string is a valid @p or @q value. + * + * This is, at present, a pretty weak sanity check. It doesn't confirm the + * structure precisely (e.g. dashes), and for @q, it's required that q values + * of (greater than one) odd bytelength have been zero-padded. So, for + * example, '~doznec-binwod' will be considered a valid @q, but '~nec-binwod' + * will not. + * + + */ +export const isValidPat = (name: PatQ | PatP): boolean => { + if (typeof name !== "string") { + throw new Error("isValidPat: non-string input"); + } + + const leadingTilde = name.slice(0, 1) === "~"; + + if (leadingTilde === false || name.length < 4) { + return false; + } else { + const syls = patp2syls(name); + const wrongLength = syls.length % 2 !== 0 && syls.length !== 1; + const sylsExist = syls.reduce( + (acc: boolean, syl, index) => + acc && + (index % 2 !== 0 || syls.length === 1 + ? suffixes.includes(syl) + : prefixes.includes(syl)), + true, + ); + + return !wrongLength && sylsExist; + } +}; + +/** + * Validate a @p string. + * + */ +export const isValidPatp = (str: PatP): boolean => + isValidPat(str) && str === patp(patp2dec(str)); + +/** + * Validate a @q string. + * + */ +const isValidPatq = (str: PatQ): boolean => + isValidPat(str) && eqPatq(str, patq(patq2dec(str))); + +/** + * Remove all leading zero bytes from a sliceable value. + */ +const removeLeadingZeroBytes = (str: Iterable): Iterable => + str.slice(0, 2) === "00" ? removeLeadingZeroBytes(str.slice(2)) : str; + +/** + * Equality comparison, modulo leading zero bytes. + */ +const eqModLeadingZeroBytes = (s: Iterable, t: Iterable): boolean => + isEqual(removeLeadingZeroBytes(s), removeLeadingZeroBytes(t)); + +/** + * Equality comparison on @q values. + */ +const eqPatq = (p: PatQ, q: PatQ): boolean => { + let phex; + try { + phex = patq2hex(p); + } catch (_) { + throw new Error("eqPatq: not a valid @q"); + } + + let qhex; + try { + qhex = patq2hex(q); + } catch (_) { + throw new Error("eqPatq: not a valid @q"); + } + + return eqModLeadingZeroBytes(phex, qhex); +}; + +/** + * Convert a number to a @p-encoded string. + * + * @param {String, Number, BN} arg + * @return {String} + */ +const patp = (arg: number | string | Bn): PatP => { + if (arg === null) { + throw new Error("patp: null input"); + } + const n = new BN(arg); + + const sxz = ob.fein(n); + const dyy = met(four, sxz); + + const loop = (tsxz: Bn, timp: Bn, trep: string): string => { + const log = end(four, one, tsxz); + const pre = prefixes[rsh(three, one, log).toNumber()]; + const suf = suffixes[end(three, one, log).toNumber()]; + const etc = timp.mod(four).eq(zero) ? (timp.eq(zero) ? "" : "--") : "-"; + + const res = pre + suf + etc + trep; + + return timp.eq(dyy) ? trep : loop(rsh(four, one, tsxz), timp.add(one), res); + }; + + const dyx = met(three, sxz); + + return "~" + (dyx.lte(one) ? suffixes[sxz.toNumber()] : loop(sxz, zero, "")); +}; + +export const co = { + patp, +}; diff --git a/fe/src/logic/ob/muk.ts b/fe/src/logic/ob/muk.ts new file mode 100644 index 0000000..c9d191b --- /dev/null +++ b/fe/src/logic/ob/muk.ts @@ -0,0 +1,116 @@ +// ++ muk +// +// See arvo/sys/hoon.hoon. +import { BN } from 'bn.js'; +import type { Bn, PatP, PatQ, Rank, Iterable, Number } from './types'; + +const ux_FF = new BN(0xff); +const ux_FF00 = new BN(0xff00); +const u_256 = new BN(256); + +/** + * Standard murmur3. + * + */ +export const muk = (syd: number, len: number, key: Bn): Bn => { + const lo = key.and(ux_FF).toNumber(); + const hi = key.and(ux_FF00).div(u_256).toNumber(); + const kee = String.fromCharCode(lo) + String.fromCharCode(hi); + return new BN(murmurhash3_32_gc(kee, syd)); +}; + +// see: https://github.com/garycourt/murmurhash-js +// +// Copyright (c) 2011 Gary Court +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +/** + * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011) + * + * @author Gary Court + * @see http://github.com/garycourt/murmurhash-js + * @author Austin Appleby + * @see http://sites.google.com/site/murmurhash/ + * + * @param {string} key ASCII only + * @param {number} seed Positive integer only + * @return {number} 32-bit positive integer hash + **/ +const murmurhash3_32_gc = (key: string, seed: number): number => { + // eslint-disable-next-line no-unused-vars + let remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i; + + remainder = key.length & 3; // key.length % 4 + bytes = key.length - remainder; + h1 = seed; + c1 = 0xcc9e2d51; + c2 = 0x1b873593; + i = 0; + + while (i < bytes) { + k1 = + (key.charCodeAt(i) & 0xff) | + ((key.charCodeAt(++i) & 0xff) << 8) | + ((key.charCodeAt(++i) & 0xff) << 16) | + ((key.charCodeAt(++i) & 0xff) << 24); + ++i; + + k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; + + h1 ^= k1; + h1 = (h1 << 13) | (h1 >>> 19); + h1b = ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff; + h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16); + } + + k1 = 0; + + switch (remainder) { + case 3: + k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; + // eslint-disable-next-line no-fallthrough + case 2: + k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; + // eslint-disable-next-line no-fallthrough + case 1: + k1 ^= key.charCodeAt(i) & 0xff; + + k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; + h1 ^= k1; + } + + h1 ^= key.length; + + h1 ^= h1 >>> 16; + h1 = + ((h1 & 0xffff) * 0x85ebca6b + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & + 0xffffffff; + h1 ^= h1 >>> 13; + h1 = + ((h1 & 0xffff) * 0xc2b2ae35 + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & + 0xffffffff; + h1 ^= h1 >>> 16; + + return h1 >>> 0; +}; diff --git a/fe/src/logic/ob/ob.ts b/fe/src/logic/ob/ob.ts new file mode 100644 index 0000000..70f5c22 --- /dev/null +++ b/fe/src/logic/ob/ob.ts @@ -0,0 +1,166 @@ +// ++ ob +// +// See arvo/sys/hoon.hoon. +import { BN } from 'bn.js'; +import { muk } from './muk'; +import type { Bn, Number } from './types'; + +const ux_1_0000 = new BN('10000', 'hex'); +const ux_ffff_ffff = new BN('ffffffff', 'hex'); +const ux_1_0000_0000 = new BN('100000000', 'hex'); +const ux_ffff_ffff_ffff_ffff = new BN('ffffffffffffffff', 'hex'); +const ux_ffff_ffff_0000_0000 = new BN('ffffffff00000000', 'hex'); + +const u_65535 = new BN('65535'); +const u_65536 = new BN('65536'); + +// a PRF for j in { 0, .., 3 } +const F = (j: number, arg: Bn): Bn => { + const raku = [0xb76d5eed, 0xee281300, 0x85bcae01, 0x4b387af7]; + + return muk(raku[j], 2, arg); +}; + +/** + * Conceal structure v3. + * + */ +const fein = (arg: Number): Bn => { + const loop = (pyn: Bn): Bn => { + const lo = pyn.and(ux_ffff_ffff); + const hi = pyn.and(ux_ffff_ffff_0000_0000); + + return pyn.gte(ux_1_0000) && pyn.lte(ux_ffff_ffff) + ? ux_1_0000.add(feis(pyn.sub(ux_1_0000))) + : pyn.gte(ux_1_0000_0000) && pyn.lte(ux_ffff_ffff_ffff_ffff) + ? hi.or(loop(lo)) + : pyn; + }; + + return loop(new BN(arg)); +}; + +/** + * Restore structure v3. + * + */ +const fynd = (arg: Number): Bn => { + const loop = (cry: Bn): Bn => { + const lo = cry.and(ux_ffff_ffff); + const hi = cry.and(ux_ffff_ffff_0000_0000); + + return cry.gte(ux_1_0000) && cry.lte(ux_ffff_ffff) + ? ux_1_0000.add(tail(cry.sub(ux_1_0000))) + : cry.gte(ux_1_0000_0000) && cry.lte(ux_ffff_ffff_ffff_ffff) + ? hi.or(loop(lo)) + : cry; + }; + + return loop(new BN(arg)); +}; + +/** + * Generalised Feistel cipher. + * + * See: Black and Rogaway (2002), "Ciphers with arbitrary finite domains." + * + * Note that this has been adjusted from the reference paper in order to + * support some legacy behaviour. + * + * @param {String, Number, BN} + * @return {BN} + */ +const feis = (arg: Number): Bn => Fe(4, u_65535, u_65536, ux_ffff_ffff, F, new BN(arg)); + +const Fe = (r: number, a: Bn, b: Bn, k: Bn, f: typeof F, m: Bn): Bn => { + const c = fe(r, a, b, f, m); + return c.lt(k) ? c : fe(r, a, b, f, c); +}; + +const fe = (r: number, a: Bn, b: Bn, f: typeof F, m: Bn) => { + const loop = (j: number, ell: Bn, arr: Bn): Bn => { + if (j > r) { + return r % 2 !== 0 + ? a.mul(arr).add(ell) + : arr.eq(a) + ? a.mul(arr).add(ell) + : a.mul(ell).add(arr); + } else { + const eff = f(j - 1, arr); + + const tmp = j % 2 !== 0 ? ell.add(eff).mod(a) : ell.add(eff).mod(b); + + return loop(j + 1, arr, tmp); + } + }; + + const L = m.mod(a); + const R = m.div(a); + + return loop(1, L, R); +}; + +/** + * Reverse 'feis'. + * + * See: Black and Rogaway (2002), "Ciphers with arbitrary finite domains." + * + * Note that this has been adjusted from the reference paper in order to + * support some legacy behaviour. + * + * @param {Number, String, BN} arg + * @return {BN} + */ +const tail = (arg: Number): Bn => Fen(4, u_65535, u_65536, ux_ffff_ffff, F, new BN(arg)); + +const Fen = (r: number, a: Bn, b: Bn, k: Bn, f: typeof F, m: Bn): Bn => { + const c = fen(r, a, b, f, m); + return c.lt(k) ? c : fen(r, a, b, f, c); +}; + +const fen = (r: number, a: Bn, b: Bn, f: typeof F, m: Bn) => { + const loop = (j: number, ell: Bn, arr: Bn): Bn => { + if (j < 1) { + return a.mul(arr).add(ell); + } else { + const eff = f(j - 1, ell); + + // NB (jtobin): + // + // Slight deviation from B&R (2002) here to prevent negative values. We + // add 'a' or 'b' to arr as appropriate and reduce 'eff' modulo the same + // number before performing subtraction. + // + const tmp = + j % 2 !== 0 + ? arr.add(a).sub(eff.mod(a)).mod(a) + : arr.add(b).sub(eff.mod(b)).mod(b); + + return loop(j - 1, tmp, ell); + } + }; + + const ahh = r % 2 !== 0 ? m.div(a) : m.mod(a); + + const ale = r % 2 !== 0 ? m.mod(a) : m.div(a); + + const L = ale.eq(a) ? ahh : ale; + + const R = ale.eq(a) ? ale : ahh; + + return loop(r, L, R); +}; + +export const ob = { + F, + + fe, + Fe, + feis, + fein, + + fen, + Fen, + tail, + fynd, +}; diff --git a/fe/src/logic/ob/types.ts b/fe/src/logic/ob/types.ts new file mode 100644 index 0000000..8d74530 --- /dev/null +++ b/fe/src/logic/ob/types.ts @@ -0,0 +1,7 @@ +import { BN } from 'bn.js'; +export type Bn = InstanceType; +export type PatP = string; +export type PatQ = string; +export type Rank = 'galaxy' | 'star' | 'planet' | 'moon' | 'comet'; +export type Iterable = any[] | Buffer | string; +export type Number = number | string | Bn; diff --git a/fe/src/logic/store.ts b/fe/src/logic/store.ts new file mode 100644 index 0000000..9cf69da --- /dev/null +++ b/fe/src/logic/store.ts @@ -0,0 +1,126 @@ +import Urbit from "@urbit/http-api"; +import { create } from "zustand"; +import { persist } from "zustand/middleware"; +import { APP_NAME, URL } from "./constants"; +import { dashIO } from "./comms"; +import { Pikes, Ship, Site, SiteBunt } from "./types"; +import { Group as TlonGroup } from "./types-tlon"; + +interface ClientState { + // dashboard stuff + airlock: Urbit; + init: () => Promise; + sync: () => Promise; + modal: JSX.Element | null; + setModal: (m: JSX.Element | null) => void; + state: Record; + groups: Record; + pikes: Pikes; + loading: boolean; + setLoading: (b: boolean) => void; + dashIO: () => ReturnType; +} +export async function start(): Promise { + const airlock = new Urbit(URL, ""); + const res = await fetch(URL + "/~/host"); + const ship = await res.text(); + airlock.ship = ship.slice(1); + airlock.desk = APP_NAME; + await airlock.poke({ app: "hood", mark: "helm-hi", json: "opening airlock" }); + await airlock.eventSource(); + return airlock; +} +export async function getShip(): Promise { + const res2 = await fetch(URL + "/~/name"); + const ship2 = await res2.text(); + return ship2 as Ship; +} + +const stateStore = create()( + // persist( + (set, get) => ({ + loading: true, + setLoading: (loading) => set({ loading }), + airlock: new Urbit(URL), + state: {}, + channelsState: {}, + groups: {}, + pikes: {}, + sync: async () => { + const airlock = get().airlock; + const aio = dashIO(airlock); + const state = aio.scryState(); + const groups = aio.scryGroups(); + const pikes = aio.scryPikes(); + set({ + state: await state, + groups: await groups, + pikes: await pikes, + loading: false, + }); + }, + init: async () => { + const airlock = await start(); + const dio = dashIO(airlock); + const scries = dio.initialScries(); + dio.initSubs((data) => { + console.log(data, "sub data"); + const state = data; + set({ state }); + }); + // TODO this is only for seeding phase + const ss = await scries; + const { groups, pikes } = ss; + set({ + airlock, + groups, + pikes, + loading: false, + }); + }, + modal: null, + setModal: (m) => set({ modal: m }), + dashIO: () => { + const airlock = get().airlock; + const aio = dashIO(airlock); + return aio; + }, + }), + // { + // name: "ucm-storage", + // }, + // ), +); + +// very nice +// https://dev.to/eraywebdev/optimizing-zustand-how-to-prevent-unnecessary-re-renders-in-your-react-app-59do +import { StoreApi, UseBoundStore } from "zustand"; +import { shallow } from "zustand/shallow"; +import { addDots } from "./utils"; + +type GenericState = Record; + +export const createStoreWithSelectors = ( + store: UseBoundStore>, +): ((keys: K[]) => Pick) => { + const useStore: (keys: K[]) => Pick = < + K extends keyof T, + >( + keys: K[], + ) => { + // console.log(keys, "keys"); + return store((state) => { + const x = keys.reduce((acc, cur) => { + acc[cur] = state[cur]; + return acc; + }, {} as T); + + return x as Pick; + }, shallow); + }; + + return useStore; +}; + +const useStore = createStoreWithSelectors(stateStore); +export default useStore; diff --git a/fe/src/logic/tlon-helpers.ts b/fe/src/logic/tlon-helpers.ts new file mode 100644 index 0000000..e1dbb37 --- /dev/null +++ b/fe/src/logic/tlon-helpers.ts @@ -0,0 +1,690 @@ +import { + Block, + ChatQuoteParams, + Content, + Essay, + Inline, + Listing, + Memo, + Nest, + Reply, + Seal, + Verse, + Writ, +} from './types-tlon'; +import { Ship } from './types'; +import { Token, Tokens, marked } from 'marked'; +import { isValidPatp } from './ob/co'; +import { addDots5, makeDottedIndex } from './utils'; +import { REF_REGEX, SHIP_REGEX } from './constants'; +export function buildMemo(author: Ship, content: Content): Memo { + return { + author, + sent: Date.now(), + content, + }; +} +export function buildEssay(author: Ship, content: Content): Essay { + return { + author, + sent: Date.now(), + content, + 'kind-data': { chat: null }, + }; +} + +export function buildClubPost(author: Ship, chatID: string, essay: Essay) { + // ids now are ~ship/170.123... + const { 'kind-data': _, ...memo } = essay; + const index = makeDottedIndex(); + const id = `${author}/${index}`; + const json = { + id: chatID, + diff: { + uid: '0v3', + delta: { + writ: { + id, + delta: { + add: { + time: null, + kind: null, + memo, + }, + }, + }, + }, + }, + }; + return { + app: 'chat', + mark: 'chat-club-action-0', + json, + }; +} +export function buildNDM(author: Ship, ship: Ship, memo: Memo) { + // ids now are ~ship/170.123... + const index = makeDottedIndex(); + const id = `${author}/${index}`; + const json = { + ship, + diff: { + id: id, + delta: { + add: { + time: null, + kind: null, + memo, + }, + }, + }, + }; + return { + app: 'chat', + mark: 'chat-dm-action', + json, + }; +} +export function buildNChatPost(nes: Nest, essay: Essay) { + const nest = nestToString(nes); + // ids now are ~ship/170.123... + const json = { + channel: { + nest, + action: { + post: { + add: essay, + }, + }, + }, + }; + return { + app: 'channels', + mark: 'channel-action', + json, + }; +} +export function buildDMReply( + our: Ship, + ship: Ship, + author: Ship, + parent: string, + memo: Memo, +) { + const id = makeDottedIndex(); + const json = { + ship, + diff: { + id: `${author}/${parent}`, + delta: { + reply: { + meta: null, + id: `${our}/${id}`, + delta: { + add: { + memo, + time: null, + }, + }, + }, + }, + }, + }; + return { + app: 'chat', + mark: 'chat-dm-action', + json, + }; +} +export function buildClubReply( + our: Ship, + clubID: string, + author: Ship, + parent: string, + memo: Memo, +) { + const id = makeDottedIndex(); + const json = { + id: addDots5(clubID), + diff: { + delta: { + writ: { + delta: { + reply: { + delta: { + add: { + memo, + time: null, + }, + }, + meta: null, + id: `${our}/${id}`, + }, + }, + id: `${author}/${parent}`, + }, + }, + uid: '0v3', + }, + }; + return { + app: 'chat', + mark: 'chat-club-action-0', + json, + }; +} +export function buildChatReply(parent: string, nest: string, memo: Memo) { + // club reply + const json = { + channel: { + nest, + action: { + post: { + reply: { + id: parent, + action: { + add: memo, + }, + }, + }, + }, + }, + }; + return { + app: 'channels', + mark: 'channel-action', + json, + }; +} +export function buildDiaryPost( + author: Ship, + resource: string, + title: string, + inline: Inline[], +) { + const index = makeDottedIndex(); + const json = { + flag: resource, + update: { + time: '', + diff: { + notes: { + time: index, + delta: { + add: { + author, + image: '', + title, + sent: Date.now(), + content: [{ inline }], + }, + }, + }, + }, + }, + }; + return { + app: 'diary', + mark: 'diary-action-0', + json, + }; +} +export function buildHeapPost( + author: Ship, + resource: string, + title: string, + inline: Inline[], +) { + const index = makeDottedIndex(); + const json = { + flag: resource, + update: { + time: '', + diff: { + curios: { + time: index, + delta: { + add: { + author, + title, + replying: null, + sent: Date.now(), + content: { + block: [], + inline, + }, + }, + }, + }, + }, + }, + }; + return { + app: 'heap', + mark: 'heap-action-0', + json, + }; +} +// export function markdownToReply( +// our: Ship, +// parent: string, +// s: string +// ): ReplyGraph { +// const verses = tokenize(s); +// const memo = buildMemo(our, verses); +// const provIndex = makeDottedIndex(); +// const graph = memoToReply(provIndex, parent, memo); +// return graph; +// } +export function chatQuoteToCite(cq: ChatQuoteParams): Verse { + const nest = cq.nest as any; + const where = `/msg/${cq.id}`; + return { + block: { + cite: { + chan: { nest, where }, + }, + }, + }; +} +export function markdownToWrit( + our: Ship, + s: string, + images: string[], + cite: ChatQuoteParams | null, +): Essay { + const verses = tokenize(s); + const fverses = cite ? [...verses, chatQuoteToCite(cite)] : verses; + const f = [...fverses, ...images.map(buildImage)]; + const essay = buildEssay(our, f); + return essay; +} +function buildImage(src: string): Verse { + return { + block: { + image: { + src, + alt: '', + height: 100, + width: 100, // TODO wtf + }, + }, + }; +} + +export function provWrit(essay: Essay): Writ { + const seal: Seal = { + id: essay.sent.toString(), + reacts: {}, + replies: {}, + meta: { + lastRepliers: [], + lastReply: null, + replyCount: 0, + }, + }; + return { essay, seal, prov: true }; +} +// export function memoToReply(id: string, parent: string, memo: Memo): ReplyGraph { +// const writ = { +// memo, +// seal: { +// reacts: {}, +// id, +// "parent-id": parent, +// }, +// }; +// return { [id]: writ }; +// } + +export function memoToChatReply( + parentID: string, + fullID: string, + id: string, + memo: Memo, +): Reply { + const seal = { + id: fullID, + reacts: {}, + 'parent-id': parentID, + time: id, // non dotted + }; + return { memo, seal }; +} +export function memoToWrit(id: string, memo: Memo, time: string): Writ { + const writ = { + essay: { ...memo, 'kind-data': { chat: null } }, + seal: { + time, + reacts: {}, + id, + replies: {}, + meta: { + lastRepliers: [], + lastReply: null, + replyCount: 0, + }, + }, + }; + return writ; +} +export function essayToWrit(id: string, essay: Essay): Writ { + return { + essay, + seal: { + reacts: {}, + id: `${essay.author}/${id}`, + replies: {}, + meta: { + lastRepliers: [], + lastReply: null, + replyCount: 0, + }, + }, + }; +} +export function tokenize(s: string): Content { + // TODO there must be a better way to do this + // // man this is annoying. Thanks github, fuck you maintainers. + // const notEscape: marked.MarkedExtension = { + // name: "singleQuote", + // level: "inline", // This is an inline-level tokenizer + // start(src: string) { + // return src.match(/['"<>&]/); + // }, // Hint to Marked.js to stop and check for a match + // tokenizer(src: string, tokens: marked.Token[]) { + // const rule = /['"<>&]/; // Regex for the complete token, anchor to string start + // const match = rule.exec(src); + // if (match) { + // return { + // // Token to generate + // type: "singleQuote", // Should match "name" above + // raw: match[0], // Text to consume from the source + // // text: match[0], // Additional custom properties + // }; + // } + // }, + // renderer(token) { + // return token.text; + // } + // }; + marked.use({ + breaks: true, + }); + // marked.use({ extensions: [notEscape] }); + // const m = marked.lexer(s); + // const tokens = m.map(lexerToTlon).flat(); + // return tokens; + const m = inputToMDTokens(s); + const tokens = m.reduce(lexerToTlonTop, [] as Verse[]); + return tokens; +} +export function inputToMDTokens(input: string) { + const refExtension = { + name: 'ref', + level: 'inline' as 'inline', + start(src: string) { + return src.match(REF_REGEX)?.index; + }, + tokenizer(src: string) { + const ref = src.match(REF_REGEX); + if (!ref || !ref.index || ref.index > 0) return; + return { + type: 'ref', + raw: src, + text: src, + }; + }, + }; + const shipExtension = { + name: 'ship', + level: 'inline' as 'inline', + start(src: string) { + return src.match(SHIP_REGEX)?.index; + }, + tokenizer(src: string) { + const ship = src.match(SHIP_REGEX); + if (ship && isValidPatp(ship[0])) { + if (!ship || !ship.index || ship.index > 0) return; + return { + type: 'ship', + raw: ship[0], + text: ship[0].trim(), + }; + } + }, + }; + marked.use({ breaks: true, extensions: [refExtension, shipExtension] }); + const md = marked.lexer(input); + return md; +} +function lexerToTlonTop(acc: Verse[], m: Token): Verse[] { + // console.log(m, "parsing"); + if (m.type === 'paragraph') + return [...acc, { inline: m.tokens!.map(lexerToTlon).flat() }]; + if (m.type === 'blockquote') + return [...acc, { inline: [{ blockquote: m.tokens!.map(lexerToTlon).flat() }] }]; + if (m.type === 'code') return [...acc, { block: tlonCodeblock(m) }]; + if (m.type === 'list') return [...acc, { block: { listing: tlonList(m) } }]; + if (m.type === 'heading') return [...acc, { block: tlonHeading(m) }]; + else return acc; +} +function tlonHeading(t: any) { + return { + header: { + content: t.tokens.map(lexerToTlon).flat(), + tag: `h${t.depth}`, + }, + }; +} +function tlonCodeblock(t: any) { + return { + code: { + code: t.text, + lang: t.lang, + }, + }; +} +function tlonList(t: any): Listing { + return { + list: { + type: t.ordered ? 'ordered' : 'unordered', + items: t.items.map(tlonListItem), + contents: [], + }, + }; +} +function tlonListItem(t: any) { + return { + item: t.tokens.map(lexerToTlon).flat(), + }; +} +export function unEscape(s: string): string { + var e = document.createElement('textarea'); + e.innerHTML = s; + // handle case of empty input + return e.childNodes.length === 0 ? '' : e.childNodes[0].nodeValue || ''; +} +function lexerToTlon(m: Token): Inline[] { + if ('text' in m) m.text = unEscape(m.text.trim()); + if (m.type === 'text') return parsePlainText(m.text.trim()); + if (m.type === 'ref') return m.text; + else if (m.type === 'paragraph') return m.tokens!.map(lexerToTlon).flat(); + else if (m.type === 'space') return [{ break: null }]; + else if (m.type === 'ship') return [{ ship: m.text }]; + else if (m.type === 'em') return [{ italics: m.tokens!.map(lexerToTlon).flat() }]; + else if (m.type === 'strong') return [{ bold: m.tokens!.map(lexerToTlon).flat() }]; + else if (m.type === 'del') return [{ strike: m.tokens!.map(lexerToTlon).flat() }]; + else if (m.type === 'blockquote') + return [{ blockquote: m.tokens!.map(lexerToTlon).flat() }]; + else if (m.type === 'link') return [{ link: { href: m.href, content: m.text } }]; + else if (m.type === 'image') return [{ link: { href: m.href, content: m.text } }]; + else if (m.type === 'code') return [{ code: m.text, lang: m.lang }]; + else if (m.type === 'codespan') return [{ 'inline-code': m.text }]; + else if (m.type === 'br') return [{ break: null }]; + else if (m.type === 'list') return m.items.map(markdownListToTlon).flat(); + else if (m.type === 'html' || m.type === 'heading') return parsePlainText(m.text); + else return [m.raw]; +} +function markdownListToTlon(m: Tokens.ListItem): Inline[] { + return [m.raw, { break: null }]; +} +function parsePlainText(s: string): Inline[] { + let data: tokenizerData = [s, []]; + data = extract_mention(data); + data = extract_url(data); + return extract_text(data); +} +// tokenizer adapted from graph-store implementation +type tokenizerData = [string, taggedContent[]]; +type taggedContent = [string, Inline]; +export function extract_mention(data: tokenizerData): tokenizerData { + // const regex = /(^|\s)~[a-z_-]+/g; + const matches = data[0].match(SHIP_REGEX); + if (!matches) return data; + else + return matches.reduce((acc, item) => { + const uid = `;;${Math.random().toString(36).substring(8)};;`; + if (isValidPatp(item.trim())) + return [acc[0].replace(item, uid), [...acc[1], [uid, { ship: item.trim() }]]]; + else return acc; + }, data); +} +export const URL_REGEX = + /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,10}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g; +function extract_url(data: tokenizerData): tokenizerData { + const matches = data[0].match(URL_REGEX); + if (!matches) return data; + else + return matches.reduce((acc, item) => { + const uid = `;;${Math.random().toString(36).substring(8)};;`; + return [ + acc[0].replace(item, uid), + [...acc[1], [uid, { link: { href: item, content: item } }]], + ]; + }, data); +} +function extract_text(data: tokenizerData): Inline[] { + const uids = data[1].map((tuple) => tuple[0].replace(/;/g, '')); + const ret = data[0].split(';;').map((section) => { + if (uids.includes(section)) { + const tc = data[1].find((tagged) => tagged[0] === `;;${section};;`); + if (tc) return tc[1]; + else return section; + } else return section; + }); + return ret; +} + +export function newUv(seed = Date.now()) { + return formatUv(unixToDa(seed)); +} +export const DA_UNIX_EPOCH = BigInt('170141184475152167957503069145530368000'); // `@ud` ~1970.1.1 + +export const DA_SECOND = BigInt('18446744073709551616'); // `@ud` ~s1 + +export const EPOCH = BigInt('292277024400'); +export function unixToDa(unix: number): bigint { + const timeSinceEpoch = (BigInt(unix) * DA_SECOND) / 1000n; + return DA_UNIX_EPOCH + timeSinceEpoch; +} +export function formatUv(x: bigint): string { + const uvMask = BigInt(31); + const uvAlphabet = '0123456789abcdefghijklmnopqrstuv'; + let res = ''; + while (x !== BigInt(0)) { + let nextSix = Number(x & uvMask); + res = uvAlphabet[nextSix] + res; + x = x >> BigInt(5); + } + return addDots5(`0v${res}`); +} + +export function replyToPost(post: Reply): Writ { + const essay: Essay = { ...post.memo, 'kind-data': { chat: null } }; + const seal: Seal = { + id: post.seal.id, + reacts: post.seal.reacts, + time: post.seal?.time as string, + replies: {}, + meta: { + lastRepliers: [], + lastReply: null, + replyCount: 0, + }, + }; + return { essay, seal }; +} +export function postToReply(post: Writ): Reply { + const { 'kind-data': _, ...memo } = post.essay; + const seal = { + id: post.seal.id, + reacts: post.seal.reacts, + 'parent-id': post.seal.id, + time: post.seal.time!, + }; + return { memo, seal }; +} + +export function writToMD(content: Content): string { + return content.reduce((acc, verse) => { + if ('block' in verse) return acc + '\n\n' + blockReducer(verse.block); + else return acc + `\n\n` + inlineReducer(verse.inline); + }, ''); +} +function blockReducer(b: Block): string { + if ('image' in b) return `![](${b.image.src})`; + else if ('code' in b) + return ` + \`\`\` + ${b.code.code} + \`\`\` + `; + else if ('header' in b) { + const tag = + b.header.tag === 'h1' + ? '#' + : b.header.tag === 'h2' + ? '##' + : b.header.tag === 'h3' + ? '###' + : b.header.tag === 'h4' + ? '####' + : b.header.tag === 'h5' + ? '#####' + : b.header.tag === 'h6' + ? '######' + : ''; + return `${tag} ${b.header.content}`; + } else if ('listing' in b) + return ''; // TODO + else if ('cite' in b) + return ''; // TODO + else return ''; +} +function inlineReducer(ar: Inline[]): string { + const res = ar.reduce((acc: string, item) => { + return `${acc} ${inlineToString(item)}`; + }, ''); + return res as string; +} +function inlineToString(i: Inline): string { + if (typeof i === 'string') return i; + else if ('break' in i) return `\n`; + else if ('ship' in i) return i.ship; + else if ('inline-code' in i) return `\`${i['inline-code']}\``; + else if ('code' in i) return `\`${i.code}\``; + else if ('link' in i) return `![${i.link.content}](${i.link.href})`; + else if ('italics' in i) return `_${inlineReducer(i.italics).trim()}_`; + else if ('bold' in i) return `*${inlineReducer(i.bold).trim()}*`; + else if ('blockquote' in i) return `> ${inlineReducer(i.blockquote).trim()}`; + else if ('strike' in i) return `~~${inlineReducer(i.strike).trim()}~~`; + else return ''; +} +export function nestFromString(s: string): Nest { + const ss = s.split('/'); + return { type: ss[0] as any, host: ss[1] as any, name: ss[2] }; +} +export function nestToString(nes: Nest): string { + return `${nes.type}/${nes.host}/${nes.name}`; +} diff --git a/fe/src/logic/types-tlon.ts b/fe/src/logic/types-tlon.ts new file mode 100644 index 0000000..2e8e3d7 --- /dev/null +++ b/fe/src/logic/types-tlon.ts @@ -0,0 +1,630 @@ +import { Ship } from "./types"; + +export type Timestamp = number; +export type UrbitTime = string; +// Tlon Channels +export type TlonUnreads = { + dms: Record; + clubs: Record; + channels: Record; + invites: Ship[]; +}; +export type DMType = Ship | string; +export type Nest = { + type: ChannelType; + host: Ship; + name: string; +}; +export type NestString = `${ChannelType}/${Ship}/${string}`; +export type ChannelType = "chat" | "diary" | "heap"; +export type ChatTypeI = { dm: Ship } | { club: string } | { channel: Nest }; +export type ChatType = ChatTypeI | { thread: Thread }; + +export type Thread = { author: Ship; op: string; in: ChatTypeI }; + +export const buntUnread: ChannelUnread = { + count: 0, + recency: Date.now(), + unread: null, + threads: {}, + meta: { + cover: "", + image: "", + title: "", + description: "", + team: [], + }, +}; +export type ChannelUnread = { + count: number; + recency: Timestamp; + unread: null | Unread; + threads: Record; // kana + meta: Metadata; +}; +export type Unread = { + count: number; + id: PostID; + time: UrbitTime; +}; +export type Atom = string; +export type PostID = `${Ship}/${Atom}` | Atom; + +// Groups + +export type GroupsMap = Record; +export type Group = { + bloc: string[]; // roles + cabals: Record; + channels: Record; + cordon: any; // bans I think + fleet: Record; + meta: GroupMetadata; + "flagged-content": any; // mmm + saga: any; // ? + zones: Record; + "zone-ord": string[]; +}; +export const GroupBunt: Group = { + bloc: [], // roles + cabals: {}, + channels: {}, + cordon: null, // bans I think + fleet: {}, + meta: { cover: "", image: "", title: "", description: "" }, + "flagged-content": {}, // mmm + saga: {}, // ? + zones: {}, + "zone-ord": [], +}; +export type Zone = { + idx: string; // channeltype/host/name + meta: GroupMetadata; +}; +export type Membership = { + joined: number; + sects: Sect[]; +}; +export type Sect = any; // idk man +export type ChannelData = { + added: number; // date + join: boolean; + meta: GroupMetadata; + readers: Ship[]; + zone: string; // the section I think +}; +export type Metadata = { + cover: string; + image: string; + title: string; + description: string; + team: Ship[]; +}; +export type GroupMetadata = { + cover: string; + image: string; + title: string; + description: string; +}; +export type ClubsMap = Record; +export type Club = { + hive: Ship[]; + team: Ship[]; + net: string; // "done" or sop + meta: GroupMetadata; +}; + +export type ChannelsRes = Record; +export type ChanString = `${ChannelType}/${Ship}/${string}`; +export type ChanState = { + order: string[]; // ? + sort: string; // ? "time" | w/e + view: string; // ? "list" | w/e + pending: { + posts: any; // ? + replies: any; + }; + perms: { + group: string; + writers: Ship[]; + }; + posts: Record; +}; +export type DottedPostID = string; + +// Chat posts +export interface Writ { + seal: Seal; + essay: Essay; + prov?: boolean; +} +export interface Reply { + seal: ReplySeal; + memo: Memo; + unconfirmed?: boolean; +} +export interface DiaryPage { + newer: string | null; // atom, no-dots + older: string | null; + total: number; + posts: DiaryGraph; +} +export interface DiaryPost { + type: "post"; // or? + essay: DiaryEssay; + seal: Seal; + revision: string; // number +} +export interface DiaryEssay extends Memo { + "kind-data": { diary: { image: string; title: string } }; +} +export interface PostsPage { + newer: string | null; // atom, no-dots + older: string | null; + total: number; + posts: WritGraph; +} +export type Cursor = string | null; +export interface WritPage { + newer: Cursor; + older: Cursor; + total: number; + writs: WritGraph; + prov?: WritGraph; +} +export interface DiaryGraph { + [id: string]: DiaryPost; +} +export interface ReplyGraph { + [id: string]: Reply; +} +export interface WritGraph { + [id: string]: Writ; +} +export interface Seal { + id: WritID; + reacts: Reacts; + replies: ReplyGraph; + meta: { + lastRepliers: Ship[]; + lastReply: number | null; //WritID | null; // ? + replyCount: number; + }; + time?: string; // chats have this, channels don't (...) +} +export interface ReplySeal { + id: string; + "parent-id": string; + reacts: Reacts; + time?: string; // always?? +} +export interface Memo { + author: Ship; + content: Content; + sent: number; // unix ts +} +export interface Essay extends Memo { + "kind-data": { chat: null } | { notice: null }; +} +export type Reacts = Record; +type WritID = string; // ship/123.123 + +export type Block = + | { cite: Cite } + | { image: ImageBlock } + | { header: { tag: string; content: Inline[] } } + | { listing: Listing } + | { rule: null } + | { code: { code: string; lang: string } }; + +export type Verse = { block: Block } | { inline: Inline[] }; +export type Content = Verse[]; + +export type Listing = + | { item: Inline[] } + | { list: { type: string; items: Listing[]; contents: Inline[] } }; +export type Cite = ChannelCite | GroupCite | DeskCite | BaitCite; +export interface ChannelCite { + chan: { + nest: `${App}/${Ship}/${string}`; + where: string; // "/msg/123.123" path in hoon, idgi yet + }; +} +export interface GroupCite { + group: string; // ship/term +} +export interface DeskCite { + desk: { + flag: string; // flag + where: string; // + }; +} +export interface BaitCite { + bait: { + group: string; // flag + graph: string; // flag + where: string; // + }; +} +export type App = "chat" | "diary" | "heap"; +export interface ImageBlock { + width: number; + height: number; + alt: string; + src: string; // url +} +export type Inline = + | string + | { italics: Inline[] } + | { bold: Inline[] } + | { blockquote: Inline[] } + | { strike: Inline[] } + | { code: string; lang: string } // not actually in the type, but it should + | { "inline-code": string } + | { ship: string } + | { tag: string } + | { link: { content: string; href: string } } + | { task: { checked: boolean; content: Inline[] } } + | { break: null }; + +// kinda custom but still +// +export interface Skein { + unread: boolean; + count: number; + top: { + button: null; + id: string; // @uv + con: Array; + wer: string; // path + time: number; + rope: { + channel: string; + desk: string; + group: string; + thread: string; + }; + }; + "ship-count": number; + time: number; +} + +export interface Brief { + uid: string; + title: string; + group: string; + count: number; + last: number; // date + "read-id": string; // ~ship/123.123.123 + icon: string; // url + cover: string; // url + desc: string; +} +export interface Briefs { + dms: Brief[]; + groups: Brief[]; + threads: Brief[]; + clubs: Brief[]; +} + +export interface NewPostUpdate { + set: { + type: "post"; // or? + essay: Essay; + seal: Seal; + }; +} +export interface ReplyMeta { + replyCount: number; + lastReply: number; // ts + lastRepliers: Ship[]; +} +export interface NewReplyUpdate { + reply: { + id: string; // atom, no dots + meta: ReplyMeta; + "r-reply": NewReplySet | NewReactUpdate; + }; +} +export interface NewReplySet { + set: Reply; +} +export interface NewReactUpdate { + reacts: Reacts; +} + +export type ChannelPendingUpdate = { + pending: { + id: { author: Ship; sent: number }; + pending: { + post: Essay; + }; + }; +}; +export type RPost = NewPostUpdate | NewReactUpdate | NewReplyUpdate; +export type ChanRPost = { + host: Ship; + name: string; + kind: ChannelType; + update: RPost; +}; +export interface ChannelPostUpdate { + post: { + id: string; // atom, no dots + "r-post": RPost; + }; +} +export type ChannelPermUpdate = { + perm: { + group: string; + writers: Ship[]; + }; +}; +export type ChannelCreateUpdate = { + create: { + group: string; + writers: Ship[]; + }; +}; +export interface ChannelUpdate { + nest: string; + response: + | ChannelPendingUpdate + | ChannelPostUpdate + | ChannelPermUpdate + | ChannelCreateUpdate; +} +export interface NewChatPostUpdate { + add: { + memo: Essay; + time: string; // atom, no dots + }; + id?: string; // ~ship/string, only on threads, to set the child, reply.id being the parent +} +export interface NewChatReactUpdate { + "add-react": { ship: Ship; react: string }; +} +export interface ChatUpdate { + id: WritID; + response: NewChatPostUpdate | NewChatReactUpdate | NewChatReplyUpdate; +} + +export interface NewChatReplyUpdate { + reply: { + meta: ReplyMeta; + id: string; // author/dottedID + delta: NewChatPostUpdate | NewChatReactUpdate; + }; +} + +// graph-store +type ID = string; +export interface Graph { + [keys: ID]: GraphStoreNode; +} +export interface GraphStoreNode { + post: GSPost; + children: Graph | null; +} +export type GSContent = any; +export interface GSPost { + author: Ship; + contents: GSContent[]; + "time-sent": number; + hash: string | null; + signatures: string[]; + index: string; +} +export interface GSKey { + name: string; + ship: Ship; +} +export interface AssociationGraph { + [key: string]: Association; +} +export interface Association { + metadata: Metadatum; + "app-name": "graph" | "groups"; + resource: string; // resource string + group: string; // same + groupName: string; // here we ourselves add the group title +} +export interface Metadatum { + preview: boolean; + vip: string; + title: string; + description: string; + creator: Ship; + picture: string; //URL + hidden: boolean; + config: MetadataConfig; + "date-created": string; + color: string; +} +type MetadataConfig = GroupConfig | GraphConfig; +export interface GroupConfig { + group: { + "app-name": "graph"; + resource: string; ///ship/~bacrys/pokur-14 + }; +} +export interface GraphConfig { + graph: GraphType; +} +export type GraphType = "chat" | "publish" | "link" | "post"; + +export interface GSResource { + entity: Ship; + name: string; +} + +export interface Contact { + p?: Ship; + nickname: string; + bio: string; + status: string; + color: string; + avatar: string | null; + cover: string | null; +} + +// responses +export interface Pals { + incoming: Record; + outgoing: Record; +} +export type Contacts = Record; + +export interface DisterApps { + ini: Record; +} +export type FlagString = `${Ship}/${string}`; +export type AppData = { + cass: { + da: string; // @da string + }; + image: string; + info: string; // description + license: string; + ship: Ship; + title: string; // dude + version: string; + website: string; + color: string; // @ux string; + desk: string; + hash: string; // @uv string; + href: { + glob: { + base: string; // desk name + "glob-reference": { + location: { + http: string; // URL, + // could be ames too I guess? + }; + hash: string; + }; + }; + }; +}; + +export type Gangs = Record; +export type GroupPreview = { + claim: null; // + invite: null; // + preview: { + secret: boolean; + time: number; + flag: FlagString; + cordon: { + shut: { + // suspect this is a whitelist/blacklist thing + pending: Ship[]; + ask: Ship[]; + }; + }; + meta: GroupMetadata; + }; +}; + +// %vitals + +interface Connected { + complete: "yes"; +} + +interface YetToCheck { + complete: "no-data"; +} + +interface NoDNS { + complete: "no-dns"; +} + +interface Crash { + complete: "crash"; + crash: string[][]; +} + +interface NoOurPlanet { + complete: "no-our-planet"; + "last-contact": number; +} + +interface NoOurGalaxy { + complete: "no-our-galaxy"; + "last-contact": number; +} + +interface NoSponsorHit { + complete: "no-sponsor-hit"; + ship: string; +} + +interface NoSponsorMiss { + complete: "no-sponsor-miss"; + ship: string; +} + +interface NoTheirGalaxy { + complete: "no-their-galaxy"; + "last-contact": number; +} + +export type ConnectionCompleteStatusKey = + | "yes" + | "crash" + | "no-data" + | "no-dns" + | "no-our-planet" + | "no-our-galaxy" + | "no-sponsor-hit" + | "no-sponsor-miss" + | "no-their-galaxy"; + +export interface CompleteStatus { + complete: ConnectionCompleteStatusKey; +} + +export type ConnectionCompleteStatus = + | Connected + | YetToCheck + | Crash + | NoDNS + | NoOurPlanet + | NoOurGalaxy + | NoSponsorHit + | NoSponsorMiss + | NoTheirGalaxy; + +export type ConnectionPendingStatusKey = + | "setting-up" + | "trying-dns" + | "trying-local" + | "trying-target" + | "trying-sponsor"; + +export type ConnectionPendingStatus = + | { + pending: Omit; + } + | { + pending: "trying-sponsor"; + ship: string; + }; + +export type ConnectionStatus = + | ConnectionCompleteStatus + | ConnectionPendingStatus; + +export interface ConnectionUpdate { + status: ConnectionStatus; + timestamp: number; +} + +export interface ConnectivityCheckOptions { + useStale?: boolean; + enabled?: boolean; + staleTime?: number; + waitToDisplay?: number; +} +export type ChatQuoteParams = { p: Ship; nest: string; id: string }; diff --git a/fe/src/logic/types.ts b/fe/src/logic/types.ts new file mode 100644 index 0000000..7b62643 --- /dev/null +++ b/fe/src/logic/types.ts @@ -0,0 +1,105 @@ +import { ChannelType, GroupMetadata, Inline } from "./types-tlon"; + +export type Site = { + sitename: string; + description: string; + groupname: string; + binding: string; + icon: string; + home: string; // home page markdown + css: string; + hidden: boolean; + apps: Apps; + "app-order": AppType[]; +}; +export type AppType = + | "blog" + | "chat" + | "forum" + | "radio" + | "wiki" + | `static/${string}`; +export type Apps = { + chat: string[]; + forum: string[]; + blog: string; + radio: boolean; + wiki: string; + static: Record; +}; +export const AppBunt: Apps = { + blog: "", + chat: [], + forum: [], + radio: false, + wiki: "", + static: {}, +}; +export const SiteBunt: Site = { + sitename: "lol", + description: "", + groupname: "lmao", + binding: "/lol", + icon: "", + home: "", + css: "", + hidden: false, + apps: AppBunt, + "app-order": [], +}; + +export type AppChoice = { type: AppType; name: string; id: number }; +export type Ship = `~${string};`; +export type RichMetadata = GroupMetadata & { + name: string; + host: Ship; + kind: ChannelType; +}; +export type Channels = { + chats: RichMetadata[]; + forums: RichMetadata[]; + blog: RichMetadata | null; +}; + +export const ChannelsBunt: Channels = { + chats: [], + forums: [], + blog: null, +}; + +export type Pikes = Record; +export type Pike = { + sync: Desk; + zest: "live" | "dead"; + wefts: any[]; //? + hash: string; +}; +export type Desk = { + ship: Ship; + desk: string; +}; +export type Paragraph = NotRetardedInline[]; +type NInline = NotRetardedInline; +export type NotRetardedInline = + | { text: string } + | { italics: Inline[] } + | { bold: Inline[] } + | { blockquote: Inline[] } + | { strike: Inline[] } + | { code: string; lang: string } // not actually in the type, but it should + | { "inline-code": string } + | { ship: string } + | { tag: string } + | { link: { content: string; href: string } } + | { task: { checked: boolean; content: Inline[] } } + | { break: null }; + +export type Wiki = { + host: Ship; + id: string; + title: string; + public: boolean; + pageCount: number; + mustLogin: boolean; + edited: number; +}; diff --git a/fe/src/logic/utils.ts b/fe/src/logic/utils.ts new file mode 100644 index 0000000..c4acc02 --- /dev/null +++ b/fe/src/logic/utils.ts @@ -0,0 +1,562 @@ +import type { + Apps, + Channels, + NotRetardedInline, + Paragraph, + Pikes, + Ship, +} from "./types"; +import { patp2dec, isValidPatp } from "./ob/co"; +import anyAscii from "any-ascii"; +import { Renderer, Token, marked } from "marked"; +import { RADIO_SHIP, REF_REGEX, SHIP_REGEX, WIKI_SHIP } from "./constants"; +import { unEscape } from "./tlon-helpers"; +import type { + GraphStoreNode, + AssociationGraph, + Association, + GSResource, + Graph, + Contacts, + Pals, + Contact, + Content, + Inline, +} from "./types-tlon"; + +export function addScheme(url: string) { + if (url.includes("localhost")) { + return `http://${url.replace("http://", "")}`; + } else { + return `https://${url.replace("http://", "")}`; + } +} + +export function easyCode(code: string) { + const string = code.replace(/-/g, ""); + const matches = string.match(/.{1,6}/g); + if (matches) return matches.join("-"); +} + +export function tilde(patp: Ship) { + if (patp[0] == "~") { + return patp; + } else { + return "~" + patp; + } +} + +export function color_to_hex(color: string) { + let hex = "#" + color.replace(".", "").replace("0x", "").toUpperCase(); + if (hex == "#0") { + hex = "#000000"; + } + return hex; +} + +export function date_diff(date: number | Date, type: "short" | "long") { + const now = new Date().getTime(); + const diff = now - new Date(date).getTime(); + if (type == "short") { + return to_string(diff / 1000); + } else { + return to_string_long(diff / 1000); + } +} + +function to_string(s: number) { + if (s < 60) { + return "now"; + } else if (s < 3600) { + return `${Math.ceil(s / 60)}m`; + } else if (s < 86400) { + return `${Math.ceil(s / 60 / 60)}h`; + } else if (s < 2678400) { + return `${Math.ceil(s / 60 / 60 / 24)}d`; + } else if (s < 32140800) { + return `${Math.ceil(s / 60 / 60 / 24 / 30)}mo`; + } else { + return `${Math.ceil(s / 60 / 60 / 24 / 30 / 12)}y`; + } +} + +function to_string_long(s: number) { + if (s < 60) { + return "right now"; + } else if (s < 3600) { + return `${Math.ceil(s / 60)} minutes ago`; + } else if (s < 86400) { + return `${Math.ceil(s / 60 / 60)} hours ago`; + } else if (s < 2678400) { + return `${Math.ceil(s / 60 / 60 / 24)} days ago`; + } else if (s < 32140800) { + return `${Math.ceil(s / 60 / 60 / 24 / 30)} months ago`; + } else { + return `${Math.ceil(s / 60 / 60 / 24 / 30 / 12)} years ago`; + } +} + +export function regexes() { + const IMAGE_REGEX = new RegExp(/(jpg|img|png|gif|tiff|jpeg|webp|webm|svg)$/i); + const AUDIO_REGEX = new RegExp(/(mp3|wav|ogg)$/i); + const VIDEO_REGEX = new RegExp(/(mov|mp4|ogv)$/i); + return { img: IMAGE_REGEX, aud: AUDIO_REGEX, vid: VIDEO_REGEX }; +} + +export function stringToSymbol(str: string) { + const ascii = anyAscii(str); + let result = ""; + for (let i = 0; i < ascii.length; i++) { + const n = ascii.charCodeAt(i); + if ((n >= 97 && n <= 122) || (n >= 48 && n <= 57)) { + result += ascii[i]; + } else if (n >= 65 && n <= 90) { + result += String.fromCharCode(n + 32); + } else { + result += "-"; + } + } + result = result.replace(/^[\-\d]+|\-+/g, "-"); + result = result.replace(/^\-+|\-+$/g, ""); + return result; +} +export function buildDM(author: Ship, recipient: Ship, contents: Content[]) { + const node: any = {}; + const point = patp2dec(recipient); + const index = `/${point}/${makeIndex()}`; + node[index] = { + children: null, + post: { + author: author, + contents: contents, + hash: null, + index: index, + signatures: [], + "time-sent": Date.now(), + }, + }; + return { + app: "dm-hook", + mark: "graph-update-3", + json: { + "add-nodes": { + resource: { name: "dm-inbox", ship: author }, + nodes: node, + }, + }, + }; +} + +export function buildChatPost( + author: Ship, + resource: GSResource, + c: Content[], +) { + const index = `/${makeIndex()}`; + return { + "add-nodes": { + resource: { name: resource.name, ship: resource.entity }, + nodes: { + [index]: { + children: null, + post: { + author: author, + contents: c, + hash: null, + index: index, + signatures: [], + "time-sent": Date.now(), + }, + }, + }, + }, + }; +} + +export function buildNotebookPost( + author: Ship, + resource: GSResource, + c: Content[], +) { + const index = `/${makeIndex()}`; + const node: GraphStoreNode = { + children: { + "1": { + post: { + author: author, + contents: [], + hash: null, + index: index + "/1", + signatures: [], + "time-sent": Date.now(), + }, + children: { + "1": { + children: null, + post: { + author: author, + contents: c, + hash: null, + index: index + "/1/1", + signatures: [], + "time-sent": Date.now(), + }, + }, + }, + }, + "2": { + children: null, + post: { + author: author, + contents: [], + hash: null, + index: index + "/2", + signatures: [], + "time-sent": Date.now(), + }, + }, + }, + post: { + author: author, + contents: [], + hash: null, + index: index, + signatures: [], + "time-sent": Date.now(), + }, + }; + const graph = { [index]: node }; + return { + "add-nodes": { + resource: { name: resource.name, ship: resource.entity }, + nodes: graph, + }, + }; +} +export function buildCollectionPost( + author: Ship, + resource: GSResource, + c: Content[], +) { + const index = `/${makeIndex()}`; + const node: GraphStoreNode = { + children: null, + post: { + author: author, + contents: c, + hash: null, + index: index, + signatures: [], + "time-sent": Date.now(), + }, + }; + const graph: Graph = { [index]: node }; + return { + "add-nodes": { + resource: { name: resource.name, ship: resource.entity }, + nodes: graph, + }, + }; +} + +export function makeIndex(): string { + const DA_UNIX_EPOCH = BigInt("170141184475152167957503069145530368000"); + const DA_SECOND = BigInt("18446744073709551616"); + const timeSinceEpoch = (BigInt(Date.now()) * DA_SECOND) / BigInt(1000); + return (DA_UNIX_EPOCH + timeSinceEpoch).toString(); +} +export function makeDottedIndex() { + const DA_UNIX_EPOCH = BigInt("170141184475152167957503069145530368000"); + const DA_SECOND = BigInt("18446744073709551616"); + const timeSinceEpoch = (BigInt(Date.now()) * DA_SECOND) / BigInt(1000); + const index = (DA_UNIX_EPOCH + timeSinceEpoch).toString(); + return index.replace(/\B(?=(\d{3})+(?!\d))/g, "."); +} + +export function nodeToText(n: GraphStoreNode): string { + const c = n.post.contents; + return c.reduce((acc, item) => { + if ("text" in item) return acc + item.text; + else if ("mention" in item) return acc + item.mention; + else return acc; + }, ""); +} + +export function nodesFromGraphUpdate(g: any): GraphStoreNode[] { + const nodes = g["graph-update"]["add-nodes"]["nodes"]; + return Object.keys(nodes).map((n) => nodes[n]); +} + +export function cleanMetadata(metadata: AssociationGraph): Association[] { + const all: Association[] = Object.values(metadata); + const graphs = all.filter((a) => a["app-name"] === "graph"); + return graphs.map((g) => { + const gn = `${g.group}/groups${g.group}`; + const gn2 = `${g.group}/graph${g.group}`; + const group = metadata[gn] || metadata[gn2]; + if (!group) console.log(g, "you lack metadata for this graph"); + const title = group ? group.metadata.title : "error"; + return { ...g, ...{ groupName: title } }; + }); +} + +export function abbreviateChat(s: string): string { + const plist = s.trim().split(" "); + if (isValidPatp(plist[0]) && plist.length > 1) { + return `${plist[0]} & ${plist.length - 1}+`; + } else if (s.length < 25) return s; + else return `${s.substring(0, 25)}...`; +} + +export function timestring(n: number): string { + const nn = new Date(n); + return nn.toTimeString().slice(0, 5); +} +export function wait(ms: number) { + return new Promise((resolve, _reject) => { + setTimeout(resolve, ms); + }); +} + +export function checkTilde(s: string) { + if (s[0] === "~") return s; + else return "~" + s; +} + +export function addDots(s: string, num: number): string { + const reversed = s.split("").reverse().join(""); + const reg = new RegExp(`.{${num}}`, "g"); + const withCommas = reversed.replace(reg, "$&."); + return withCommas.split("").reverse().join("").slice(1); +} +export function addDots5(s: string): string { + const reversed = s.split("").reverse().join(""); + const withCommas = reversed.replace(/.{5}/g, "$&."); + return withCommas.split("").reverse().join(""); +} +// TODO +export function isTwatterLink(s: string) { + const sp = s + .replace("https://", "") + .split("/") + .filter((s) => s); + return sp.length === 4 && sp[0] === "twitter.com" && sp[2] === "status"; +} +export const isSortugLink = (s: string) => !!s.match(REF_REGEX); + +export const markdownRenderer: Partial = { + // paragraph(content: any) { + // // console.log(content, "rendering") + // return content; + // }, + // text(text: string) { + // return text; + // }, + // codespan(code, lang) { + // console.log(code, "code"); + // console.log(lang, "lang"); + // return "" + // }, +}; + +export function auraToHex(s: string): string { + if (s.startsWith("0x")) { + let numbers = s.replace("0x", "").replace(".", ""); + while (numbers.length < 6) { + numbers = "0" + numbers; + } + return "#" + numbers; + } else if (s.startsWith("#")) return s; + else { + // console.log(s, "weird hex"); + return "black"; + } +} + +// default cursors +export function makeNewestIndex() { + const DA_UNIX_EPOCH = BigInt("170141184475152167957503069145530368000"); + const DA_SECOND = BigInt("18446744073709551616"); + const timeSinceEpoch = (BigInt(Date.now()) * DA_SECOND) / BigInt(1000); + return (DA_UNIX_EPOCH + timeSinceEpoch).toString(); +} +export const startCursor = makeNewestIndex(); +export const endCursor = "0"; + +export function displayCount(c: number): string { + if (c === 0) return ""; + else if (c < 1_000) return `${c}`; + else if (c >= 1_000 && c < 1_000_000) return `${Math.round(c / 1_00) / 10}K`; + else if (c >= 1_000_000) return `${Math.round(c / 100_000) / 10}M`; + else return ""; +} +export function isWhiteish(hex: string): boolean { + if (hex.indexOf("#") === 0) hex = hex.slice(1); + const r = parseInt(hex.slice(0, 2), 16); + const g = parseInt(hex.slice(2, 4), 16); + const b = parseInt(hex.slice(4, 6), 16); + return r > 200 && g > 200 && b > 200; +} + +export function localISOString(date: Date) { + const offset = new Date().getTimezoneOffset(); + const localts = date.getTime() - offset * 60_000; + return new Date(localts).toISOString().slice(0, 16); +} + +export function goback() { + window.history.back(); +} + +export function reverseRecord( + a: Record, +): Record { + return Object.entries(a).reduce((acc: any, [k, v]) => { + acc[v] = k; + return acc; + }, {}); +} + +function contactMatch(contact: Contact, input: string): boolean { + return ( + (contact.nickname || "").includes(input) || + (contact.avatar || "").includes(input) || + (contact.cover || "").includes(input) || + (contact.bio || "").includes(input) || + (contact.status || "").includes(input) || + (contact.color || "").includes(input) + ); +} + +export function getColorHex(color: string): string { + if (color.startsWith("0x")) + return `#${padString(stripFuckingDots(color), 6)}`; + else if (color.startsWith("#") && color.length === 7) return color; + else if (color.length === 6) return `#${color}`; + else { + console.log(color, "something weird with this color"); + return "#FFFFFF"; + } +} + +export function stripFuckingDots(hex: string) { + return hex.replace("0x", "").replaceAll(".", ""); +} +export function padString(s: string, size: number) { + if (s.length >= size) return s; + else return padString(`0${s}`, size); +} +export function isDark(hexColor: string): boolean { + const r = parseInt(hexColor.substring(1, 2), 16); + const g = parseInt(hexColor.substring(3, 5), 16); + const b = parseInt(hexColor.substring(5, 7), 16); + + const sr = r / 255; + const sg = g / 255; + const sb = b / 255; + const rSrgb = + sr <= 0.03928 ? sr / 12.92 : Math.pow((sr + 0.055) / 1.055, 2.4); + const gSrgb = + sg <= 0.03928 ? sg / 12.92 : Math.pow((sg + 0.055) / 1.055, 2.4); + const bSrgb = + sb <= 0.03928 ? sb / 12.92 : Math.pow((sb + 0.055) / 1.055, 2.4); + + // Calculate luminance + const luminance = 0.2126 * rSrgb + 0.7152 * gSrgb + 0.0722 * bSrgb; + return luminance < 0.12; +} + +export function checkIfClickedOutside( + e: React.MouseEvent, + el: HTMLElement, + close: any, +) { + e.stopPropagation(); + if (el.contains(e.currentTarget)) close(); +} + +export function enkebab(s: string) { + return anyAscii(s.trim()) + .toLowerCase() + .replace(/[^a-zA-Z0-9-\s]/g, "") + .replace(/\s+/g, "-"); +} + +export function generateRandomBase64(length: number) { + const bytes = new Uint8Array(length); + crypto.getRandomValues(bytes); + return btoa(String.fromCharCode(...bytes)) + .slice(0, 4) + .toLowerCase(); +} + +export function capitalize(s: string) { + return s.charAt(0).toUpperCase() + s.slice(1); +} + +export function retardedTlonTokens(tokens: Inline[]): Paragraph[] { + let ps: Paragraph[] = []; + ps.push([]); + for (const token of tokens) { + const currentP: NotRetardedInline[] = ps[ps.length - 1]; + if (typeof token === "string") currentP.push({ text: token }); + else if ("break" in token) ps.push([] as NotRetardedInline[]); + else if ("blockquote" in token) { + ps.push([token]); + ps.push([] as NotRetardedInline[]); + } else currentP.push(token); + } + return ps; +} + +export async function doubleCheckApps( + apps: Apps, + chans: Channels, + pikes: Pikes, +): Promise { + const blog = chans.blog && apps.blog ? chans.blog.name : apps.blog; + const chat = chans.chats.map((c) => c.title); + const forum = chans.forums.map((c) => c.title); + const radio = pikes?.radio?.sync?.ship === RADIO_SHIP && apps.radio; + + return { blog, chat, forum, radio, wiki: apps.wiki, static: apps.static }; +} +export async function checkWikis(pikes: Pikes): Promise { + const installed = pikes?.wiki?.sync?.ship === WIKI_SHIP; + if (!installed) return []; + else { + // const wikires = await fetch("/wiki"); // wtf man give me scry endpoints + // const wikires = await fetch("http://localhost:8081/wiki"); // wtf man give me scry endpoints + // const html = await wikires.text(); + // const parser = new DOMParser(); + // const parsed = parser.parseFromString(html, "text/html"); + // console.log(parsed, "fucking wiki frontend"); + return []; + } +} +export async function waitUntil(condition: boolean) { + return await new Promise((resolve) => { + const interval = setInterval(() => { + if (condition) { + resolve(true); + clearInterval(interval); + } + }, 1000); + }); +} + +export async function delay(ms: number) { + // return await for better async stack trace support in case of errors. + return await new Promise((resolve) => setTimeout(resolve, ms)); +} +export function isValidHttpUrl(string: string) { + let url; + + try { + url = new URL(string); + } catch (_) { + return false; + } + + return url.protocol === "http:" || url.protocol === "https:"; +} diff --git a/fe/src/main.tsx b/fe/src/main.tsx new file mode 100644 index 0000000..7b4cc34 --- /dev/null +++ b/fe/src/main.tsx @@ -0,0 +1,15 @@ +// import "@fontsource/roboto/300.css"; +// import "@fontsource/roboto/400.css"; +// import "@fontsource/roboto/500.css"; +// import "@fontsource/roboto/700.css"; +import "@fontsource/inter/400.css"; +import "@fontsource/inter/700.css"; +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App.tsx"; + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/fe/src/modals/Example.tsx b/fe/src/modals/Example.tsx new file mode 100644 index 0000000..0edba2d --- /dev/null +++ b/fe/src/modals/Example.tsx @@ -0,0 +1,43 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Typography from '@mui/material/Typography'; +import Modal from '@mui/material/Modal'; +import { AddAppModal } from './Modal'; +import { SiteBunt } from '../logic/types'; +// import { ColorToggle, ThemeTest } from "../ui/theme"; + +const style = { + position: 'absolute' as 'absolute', + top: '50%', + left: '50%', + transform: 'translate(-50%, -50%)', + width: 400, + bgcolor: 'background.paper', + border: '2px solid #000', + boxShadow: 24, + p: 4, +}; + +export default function BasicModal() { + const [open, setOpen] = React.useState(false); + const handleOpen = () => setOpen(true); + + function handleClose(e: any, r: any) { + console.log(e); + console.log(r); + } + return ( + + + + + + + ); +} diff --git a/fe/src/modals/Modal.tsx b/fe/src/modals/Modal.tsx new file mode 100644 index 0000000..24ff547 --- /dev/null +++ b/fe/src/modals/Modal.tsx @@ -0,0 +1,289 @@ +import { ReactNode, useEffect, useRef, useState } from "react"; +import { useLocation, Link } from "wouter"; +import { + Alert, + Button, + TextField, + Typography, + Box, + Container, + AvatarGroup, + Stack, + CardContent, + CardActions, + Dialog, + DialogTitle, + DialogActions, + ButtonPropsColorOverrides, +} from "@mui/material"; +import useStore from "../logic/store"; +import { Site, AppType, Ship } from "../logic/types"; +import { tokenize } from "../logic/tlon-helpers"; +import { addDots, capitalize } from "../logic/utils"; +import { Row, Scrollable, WholeFlex } from "../ui/Components"; + +export default function MuhModal({ children }: { children: ReactNode }) { + const { setModal } = useStore(["setModal"]); + function close(e: any, reason: any) { + setModal(null); + } + function onKey(event: any) { + if (event.key === "Escape") setModal(null); + } + useEffect(() => { + document.addEventListener("keyup", onKey); + return () => { + document.removeEventListener("keyup", onKey); + }; + }, [children]); + + function clickAway(e: React.MouseEvent) { + e.stopPropagation(); + if (!modalRef.current || !modalRef.current.contains(e.target as any)) + setModal(null); + } + const modalRef = useRef(null); + const bgStyle = { + position: "fixed" as "fixed", + left: 0, + top: 0, + width: "100vw", + height: "100vh", + backgroundColor: "rgb(0, 0, 0, 0.7)", + zIndex: 0, + }; + const modalStyle = { + position: "fixed" as "fixed", + transform: "translate(-50%, -50%)", + top: "50%", + left: "50%", + backgroundColor: "white", + }; + return ( + + ); +} +export function StaticPageModal({ + name, + text, + site, +}: { + name: string; + text: string; + site: Site; +}) { + useEffect(() => { + setTitle(name); + setInput(text); + const tit = localStorage.getItem("staticPageDraftTitle"); + if (tit) setTitle(tit); + const inp = localStorage.getItem("staticPageDraftInput"); + if (inp) setInput(inp); + }, []); + const { sync, setModal, dashIO } = useStore(["sync", "setModal", "dashIO"]); + const [location, navigate] = useLocation(); + const [title, setTitle] = useState(""); + const [input, setInput] = useState(""); + const [error, setError] = useState(""); + const { createSite } = dashIO(); + async function save() { + localStorage.removeItem("staticPageDraftTitle"); + localStorage.removeItem("staticPageDraftInput"); + const stat = { ...site.apps.static, [title]: input }; + const apps = { ...site.apps, static: stat }; + const ns = { ...site, apps }; + console.log(ns, "ns"); + await createSite(ns); + sync().then((_) => setModal(null)); + } + async function del() { + const { [name]: _, ...rest } = site.apps.static; + const apps = { ...site.apps, static: rest }; + const ns = { ...site, apps }; + await createSite(ns); + sync().then((_) => setModal(null)); + } + useEffect(() => { + console.log("setting", title); + if (title) localStorage.setItem("staticPageDraftTitle", title); + }, [title]); + useEffect(() => { + if (input) localStorage.setItem("staticPageDraftInput", input); + }, [input]); + return ( + + + + + Static Page Editor + + + + setTitle(e.currentTarget.value)} + /> + setInput(e.currentTarget.value)} + /> + + + + + + ); +} + +export function AddAppModal({ kind, site }: { kind: AppType; site: Site }) { + // weird that this has to be written manually + const style = { + container: { + width: "70vw", + bgcolor: "background.paper", + border: "2px solid #000", + boxShadow: 24, + py: 3, + px: 4, + height: "90vh", + }, + coverImg: { + border: "1px solid primary.dark", + width: "100%", + minHeight: "3rem", + display: "block", + marginTop: "2ch", + }, + }; + const { sync, setModal, dashIO } = useStore(["sync", "setModal", "dashIO"]); + const [location, navigate] = useLocation(); + const [title, setTitle] = useState(""); + const [desc, setDesc] = useState(""); + const [image, setImg] = useState(""); + const [error, setError] = useState(""); + + // TODO add automated name change logic if site already exists + async function create() { + const { createBlog, createChannel } = dashIO(); + if (!title) { + setError("name can't be empty"); + return; + } + const taip = kind === "chat" ? "chat" : kind === "forum" ? "diary" : ""; + const res = + kind === "blog" + ? await createBlog(site.groupname, title, desc) + : await createChannel(site.groupname, title, desc, taip); + if (res) { + await sync(); + setModal(null); + console.log(res, "res"); + } + } + return ( + + + Add {capitalize(kind)} + + + {error && {error}.} + + setTitle(e.currentTarget.value)} + /> + setDesc(e.currentTarget.value)} + /> + {kind === "blog" || kind === "forum" ? ( + + setImg(e.currentTarget.value)} + /> + + + ) : ( + <> + )} + + + + + + + ); +} + +export function ConfirmationModal({ + fun, + color, + text, +}: { + text: string; + color: any; + fun: any; +}) { + const { setModal } = useStore(["setModal"]); + return ( + + Are you sure? + + + + + + ); +} diff --git a/fe/src/ui/Components.tsx b/fe/src/ui/Components.tsx new file mode 100644 index 0000000..4b3594b --- /dev/null +++ b/fe/src/ui/Components.tsx @@ -0,0 +1,111 @@ +import { Box, Card, CircularProgress, SxProps, Theme } from '@mui/material'; +import { ReactNode } from 'react'; + +export function WholeFlex({ + children, + sx, +}: { + sx?: SxProps; + children: ReactNode; +}) { + const style: any = { + display: 'flex', + flexDirection: 'column', + height: '100%', + ...sx, + }; + return {children}; +} + +export const styles = { + steady: { + overflow: 'hidden', + }, +}; + +export function Flex({ + sx, + children, + dir = 'row', + gap = '1rem', +}: { + sx?: SxProps; + children: ReactNode; + dir?: 'row' | 'column'; + gap?: string; +}) { + const styl: any = { display: 'flex', flexDirection: dir, gap, ...sx }; + return {children}; +} +export function Row({ sx, children }: { sx?: SxProps; children: ReactNode }) { + const styl: any = { ...sx, display: 'flex' }; + return {children}; +} +export function SpreadRow({ + children, + sx, +}: { + sx?: SxProps; + children: ReactNode; +}) { + const styl: any = { ...sx, display: 'flex', justifyContent: 'space-between' }; + return {children}; +} +export function Centered({ + children, + y = false, + sx, + fixed = false, +}: { + y?: boolean; + fixed?: boolean; + sx?: SxProps; + children: ReactNode; +}) { + if (!y) { + return ( + + {children} + + ); + } else { + const position = fixed ? 'fixed' : 'absolute'; + const styles = y + ? { + transform: 'translate(-50%, -50%)', + top: '50%', + left: '50%', + } + : { transform: 'translateX(-50%)', left: '50%' }; + + const styl: any = { position, ...styles, ...sx }; + return {children}; + } +} + +export function Scrollable({ + children, + x = false, + sx, +}: { + x?: boolean; + sx?: SxProps; + children: ReactNode; +}) { + const xstyles = x ? { overflowX: 'auto' } : {}; + const styles: any = { ...sx, ...xstyles, overflowY: 'auto' }; + return {children}; +} + +export function LoadingScreen() { + return ( + + + + + +

      Syncing with your Urbit...

      +
      +
      + ); +} diff --git a/fe/src/ui/Drag.tsx b/fe/src/ui/Drag.tsx new file mode 100644 index 0000000..c2be8b7 --- /dev/null +++ b/fe/src/ui/Drag.tsx @@ -0,0 +1,96 @@ +import { + DragDropContext, + Draggable, + DraggableProvided, + DraggableRubric, + DraggableStateSnapshot, + Droppable, + DropResult, +} from "@hello-pangea/dnd"; +import { useEffect, useState } from "react"; +import { AppType } from "../logic/types"; +import { useTheme } from "@mui/material"; + +export default DragContainer; +function DragContainer({ + apps, + buildCard, + onEnd, +}: { + apps: AppType[]; + buildCard: Function; + onEnd: (d: DropResult) => void; +}) { + useEffect(() => { + setItems(apps); + }, [apps]); + // fake data generator + const baseItems = ["blog", "chat", "forum", "radio", "wiki"]; + const theme = useTheme(); + + // a little function to help us with reordering the result + + const grid = 5; + + const getItemStyle = (isDragging: boolean, draggableStyle: any) => ({ + // some basic styles to make the items look a bit nicer + userSelect: "none", + margin: `0 ${grid * 2}px 0 0`, + + // change background colour if dragging + background: isDragging ? theme.palette.warning.light : "grey", + + // styles we need to apply on draggables + ...draggableStyle, + }); + + const getListStyle = (isDraggingOver: boolean) => ({ + background: isDraggingOver ? theme.palette.secondary.light : "grey", + display: "flex", + padding: grid, + overflow: "auto", + height: "100%", + }); + + const [items, setItems] = useState(baseItems); + + // Normally you would want to split things out into separate components. + // But in this example everything is just done in one place for simplicity + return ( + + + {(provided, snapshot) => ( +
      + {items.map((item, index) => ( + + {(provided, snapshot) => ( +
      + {buildCard(item)} +
      + )} +
      + ))} + {provided.placeholder} +
      + )} +
      +
      + ); +} diff --git a/fe/src/ui/Sigil.tsx b/fe/src/ui/Sigil.tsx new file mode 100644 index 0000000..ecb4f56 --- /dev/null +++ b/fe/src/ui/Sigil.tsx @@ -0,0 +1,49 @@ +import { sigil, reactRenderer } from './sigil-ts'; +import { isValidPatp } from '../logic/ob/co'; +import comet from '../assets/icons/comet.svg'; +import { auraToHex } from '../logic/utils'; + +interface SigilProps { + patp: string; + size: number; + color?: string; +} + +const Sigil = (props: SigilProps) => { + const color = props.color ? auraToHex(props.color) : 'black'; + if (!isValidPatp(props.patp)) return
      X
      ; + else if (props.patp.length > 28) + return ( + + ); + else if (props.patp.length > 15) + // moons + return ( + <> + {sigil({ + patp: props.patp.substring(props.patp.length - 13), + renderer: reactRenderer, + size: props.size, + colors: ['grey', 'white'], + })} + + ); + else + return ( + <> + {sigil({ + patp: props.patp, + renderer: reactRenderer, + size: props.size, + colors: [color, 'white'], + })} + + ); +}; + +export default Sigil; diff --git a/fe/src/ui/shared-theme/AppTheme.tsx b/fe/src/ui/shared-theme/AppTheme.tsx new file mode 100644 index 0000000..c26d206 --- /dev/null +++ b/fe/src/ui/shared-theme/AppTheme.tsx @@ -0,0 +1,58 @@ +import * as React from 'react'; +import { ThemeProvider, createTheme, responsiveFontSizes } from '@mui/material/styles'; +import type { ThemeOptions } from '@mui/material/styles'; +import { inputsCustomizations } from './customizations/inputs'; +import { dataDisplayCustomizations } from './customizations/dataDisplay'; +import { feedbackCustomizations } from './customizations/feedback'; +import { navigationCustomizations } from './customizations/navigation'; +import { surfacesCustomizations } from './customizations/surfaces'; +import { colorSchemes, typography, shadows, shape } from './themePrimitives'; + +interface AppThemeProps { + children: React.ReactNode; + /** + * This is for the docs site. You can ignore it or remove it. + */ + disableCustomTheme?: boolean; + themeComponents?: ThemeOptions['components']; +} + +export default function AppTheme({ + children, + disableCustomTheme, + themeComponents, +}: AppThemeProps) { + // Mmm hope this works + let t1 = createTheme({ + // For more details about CSS variables configuration, see https://mui.com/material-ui/customization/css-theme-variables/configuration/ + cssVariables: { + colorSchemeSelector: 'data-mui-color-scheme', + cssVarPrefix: 'template', + }, + colorSchemes, // Recently added in v6 for building light & dark mode app, see https://mui.com/material-ui/customization/palette/#color-schemes + typography, + shadows, + shape, + components: { + ...inputsCustomizations, + ...dataDisplayCustomizations, + ...feedbackCustomizations, + ...navigationCustomizations, + ...surfacesCustomizations, + ...themeComponents, + }, + }); + t1 = responsiveFontSizes(t1, {}); + t1.palette.warning; + const theme = React.useMemo(() => { + return disableCustomTheme ? {} : t1; + }, [disableCustomTheme, themeComponents]); + if (disableCustomTheme) { + return {children}; + } + return ( + + {children} + + ); +} diff --git a/fe/src/ui/shared-theme/ColorModeIconDropdown.tsx b/fe/src/ui/shared-theme/ColorModeIconDropdown.tsx new file mode 100644 index 0000000..2b76bb3 --- /dev/null +++ b/fe/src/ui/shared-theme/ColorModeIconDropdown.tsx @@ -0,0 +1,88 @@ +import * as React from 'react'; +import DarkModeIcon from '@mui/icons-material/DarkModeOutlined'; +import LightModeIcon from '@mui/icons-material/LightModeOutlined'; +import Box from '@mui/material/Box'; +import IconButton from '@mui/material/IconButton'; +import Menu from '@mui/material/Menu'; +import MenuItem from '@mui/material/MenuItem'; +import { useColorScheme } from '@mui/material/styles'; + +export default function ColorModeIconDropdown() { + const { mode, systemMode, setMode } = useColorScheme(); + const [anchorEl, setAnchorEl] = React.useState(null); + const open = Boolean(anchorEl); + // TODO this is actually useful too + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + const handleMode = (targetMode: 'system' | 'light' | 'dark') => () => { + setMode(targetMode); + handleClose(); + }; + if (!mode) { + return ( + ({ + verticalAlign: 'bottom', + display: 'inline-flex', + width: '2.25rem', + height: '2.25rem', + borderRadius: (theme.vars || theme).shape.borderRadius, + border: '1px solid', + borderColor: (theme.vars || theme).palette.divider, + })} + /> + ); + } + const resolvedMode = (systemMode || mode) as 'light' | 'dark'; + const icon = { + light: , + dark: , + }[resolvedMode]; + return ( + + + {icon} + + + + System + + + Light + + + Dark + + + + ); +} diff --git a/fe/src/ui/shared-theme/ColorModeSelect.tsx b/fe/src/ui/shared-theme/ColorModeSelect.tsx new file mode 100644 index 0000000..4bb20df --- /dev/null +++ b/fe/src/ui/shared-theme/ColorModeSelect.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { useColorScheme } from '@mui/material/styles'; +import MenuItem from '@mui/material/MenuItem'; +import Select, { SelectProps } from '@mui/material/Select'; + +export default function ColorModeSelect(props: SelectProps) { + const { mode, setMode } = useColorScheme(); + if (!mode) { + return null; + } + return ( + + ); +} diff --git a/fe/src/ui/shared-theme/customizations/dataDisplay.tsx b/fe/src/ui/shared-theme/customizations/dataDisplay.tsx new file mode 100644 index 0000000..b6b2b46 --- /dev/null +++ b/fe/src/ui/shared-theme/customizations/dataDisplay.tsx @@ -0,0 +1,233 @@ +import { Theme, alpha, Components } from '@mui/material/styles'; +import { svgIconClasses } from '@mui/material/SvgIcon'; +import { typographyClasses } from '@mui/material/Typography'; +import { buttonBaseClasses } from '@mui/material/ButtonBase'; +import { chipClasses } from '@mui/material/Chip'; +import { iconButtonClasses } from '@mui/material/IconButton'; +import { gray, red, green } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const dataDisplayCustomizations: Components = { + MuiList: { + styleOverrides: { + root: { + padding: '8px', + display: 'flex', + flexDirection: 'column', + gap: 0, + }, + }, + }, + MuiListItem: { + styleOverrides: { + root: ({ theme }) => ({ + [`& .${svgIconClasses.root}`]: { + width: '1rem', + height: '1rem', + color: (theme.vars || theme).palette.text.secondary, + }, + [`& .${typographyClasses.root}`]: { + fontWeight: 500, + }, + [`& .${buttonBaseClasses.root}`]: { + display: 'flex', + gap: 8, + padding: '2px 8px', + borderRadius: (theme.vars || theme).shape.borderRadius, + opacity: 0.7, + '&.Mui-selected': { + opacity: 1, + backgroundColor: alpha(theme.palette.action.selected, 0.3), + [`& .${svgIconClasses.root}`]: { + color: (theme.vars || theme).palette.text.primary, + }, + '&:focus-visible': { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + '&:hover': { + backgroundColor: alpha(theme.palette.action.selected, 0.5), + }, + }, + '&:focus-visible': { + backgroundColor: 'transparent', + }, + }, + }), + }, + }, + MuiListItemText: { + styleOverrides: { + primary: ({ theme }) => ({ + fontSize: theme.typography.body2.fontSize, + fontWeight: 500, + lineHeight: theme.typography.body2.lineHeight, + }), + secondary: ({ theme }) => ({ + fontSize: theme.typography.caption.fontSize, + lineHeight: theme.typography.caption.lineHeight, + }), + }, + }, + MuiListSubheader: { + styleOverrides: { + root: ({ theme }) => ({ + backgroundColor: 'transparent', + padding: '4px 8px', + fontSize: theme.typography.caption.fontSize, + fontWeight: 500, + lineHeight: theme.typography.caption.lineHeight, + }), + }, + }, + MuiListItemIcon: { + styleOverrides: { + root: { + minWidth: 0, + }, + }, + }, + MuiChip: { + defaultProps: { + size: 'small', + }, + styleOverrides: { + root: ({ theme }) => ({ + border: '1px solid', + borderRadius: '999px', + [`& .${chipClasses.label}`]: { + fontWeight: 600, + }, + variants: [ + { + props: { + color: 'default', + }, + style: { + borderColor: gray[200], + backgroundColor: gray[100], + [`& .${chipClasses.label}`]: { + color: gray[500], + }, + [`& .${chipClasses.icon}`]: { + color: gray[500], + }, + ...theme.applyStyles('dark', { + borderColor: gray[700], + backgroundColor: gray[800], + [`& .${chipClasses.label}`]: { + color: gray[300], + }, + [`& .${chipClasses.icon}`]: { + color: gray[300], + }, + }), + }, + }, + { + props: { + color: 'success', + }, + style: { + borderColor: green[200], + backgroundColor: green[50], + [`& .${chipClasses.label}`]: { + color: green[500], + }, + [`& .${chipClasses.icon}`]: { + color: green[500], + }, + ...theme.applyStyles('dark', { + borderColor: green[800], + backgroundColor: green[900], + [`& .${chipClasses.label}`]: { + color: green[300], + }, + [`& .${chipClasses.icon}`]: { + color: green[300], + }, + }), + }, + }, + { + props: { + color: 'error', + }, + style: { + borderColor: red[100], + backgroundColor: red[50], + [`& .${chipClasses.label}`]: { + color: red[500], + }, + [`& .${chipClasses.icon}`]: { + color: red[500], + }, + ...theme.applyStyles('dark', { + borderColor: red[800], + backgroundColor: red[900], + [`& .${chipClasses.label}`]: { + color: red[200], + }, + [`& .${chipClasses.icon}`]: { + color: red[300], + }, + }), + }, + }, + { + props: { size: 'small' }, + style: { + maxHeight: 20, + [`& .${chipClasses.label}`]: { + fontSize: theme.typography.caption.fontSize, + }, + [`& .${svgIconClasses.root}`]: { + fontSize: theme.typography.caption.fontSize, + }, + }, + }, + { + props: { size: 'medium' }, + style: { + [`& .${chipClasses.label}`]: { + fontSize: theme.typography.caption.fontSize, + }, + }, + }, + ], + }), + }, + }, + MuiTablePagination: { + styleOverrides: { + actions: { + display: 'flex', + gap: 8, + marginRight: 6, + [`& .${iconButtonClasses.root}`]: { + minWidth: 0, + width: 36, + height: 36, + }, + }, + }, + }, + MuiIcon: { + defaultProps: { + fontSize: 'small', + }, + styleOverrides: { + root: { + variants: [ + { + props: { + fontSize: 'small', + }, + style: { + fontSize: '1rem', + }, + }, + ], + }, + }, + }, +}; diff --git a/fe/src/ui/shared-theme/customizations/feedback.tsx b/fe/src/ui/shared-theme/customizations/feedback.tsx new file mode 100644 index 0000000..6d475c9 --- /dev/null +++ b/fe/src/ui/shared-theme/customizations/feedback.tsx @@ -0,0 +1,46 @@ +import { Theme, alpha, Components } from '@mui/material/styles'; +import { gray, orange } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const feedbackCustomizations: Components = { + MuiAlert: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: 10, + backgroundColor: orange[100], + color: (theme.vars || theme).palette.text.primary, + border: `1px solid ${alpha(orange[300], 0.5)}`, + '& .MuiAlert-icon': { + color: orange[500], + }, + ...theme.applyStyles('dark', { + backgroundColor: `${alpha(orange[900], 0.5)}`, + border: `1px solid ${alpha(orange[800], 0.5)}`, + }), + }), + }, + }, + MuiDialog: { + styleOverrides: { + root: ({ theme }) => ({ + '& .MuiDialog-paper': { + borderRadius: '10px', + border: '1px solid', + borderColor: (theme.vars || theme).palette.divider, + }, + }), + }, + }, + MuiLinearProgress: { + styleOverrides: { + root: ({ theme }) => ({ + height: 8, + borderRadius: 8, + backgroundColor: gray[200], + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + }), + }), + }, + }, +}; diff --git a/fe/src/ui/shared-theme/customizations/inputs.tsx b/fe/src/ui/shared-theme/customizations/inputs.tsx new file mode 100644 index 0000000..b384563 --- /dev/null +++ b/fe/src/ui/shared-theme/customizations/inputs.tsx @@ -0,0 +1,445 @@ +import * as React from 'react'; +import { alpha, Theme, Components } from '@mui/material/styles'; +import { outlinedInputClasses } from '@mui/material/OutlinedInput'; +import { svgIconClasses } from '@mui/material/SvgIcon'; +import { toggleButtonGroupClasses } from '@mui/material/ToggleButtonGroup'; +import { toggleButtonClasses } from '@mui/material/ToggleButton'; +import CheckBoxOutlineBlankRoundedIcon from '@mui/icons-material/CheckBoxOutlineBlankRounded'; +import CheckRoundedIcon from '@mui/icons-material/CheckRounded'; +import RemoveRoundedIcon from '@mui/icons-material/RemoveRounded'; +import { gray, brand } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const inputsCustomizations: Components = { + MuiButtonBase: { + defaultProps: { + disableTouchRipple: true, + disableRipple: true, + }, + styleOverrides: { + root: ({ theme }) => ({ + boxSizing: 'border-box', + transition: 'all 100ms ease-in', + '&:focus-visible': { + outline: `3px solid ${alpha(theme.palette.primary.main, 0.5)}`, + outlineOffset: '2px', + }, + }), + }, + }, + MuiButton: { + styleOverrides: { + root: ({ theme }) => ({ + boxShadow: 'none', + borderRadius: (theme.vars || theme).shape.borderRadius, + textTransform: 'none', + variants: [ + { + props: { + size: 'small', + }, + style: { + height: '2.25rem', + padding: '8px 12px', + }, + }, + { + props: { + size: 'medium', + }, + style: { + height: '2.5rem', // 40px + }, + }, + { + props: { + color: 'primary', + variant: 'contained', + }, + style: { + color: 'white', + backgroundColor: gray[900], + backgroundImage: `linear-gradient(to bottom, ${gray[700]}, ${gray[800]})`, + boxShadow: `inset 0 1px 0 ${gray[600]}, inset 0 -1px 0 1px hsl(220, 0%, 0%)`, + border: `1px solid ${gray[700]}`, + '&:hover': { + backgroundImage: 'none', + backgroundColor: gray[700], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: gray[800], + }, + ...theme.applyStyles('dark', { + color: 'black', + backgroundColor: gray[50], + backgroundImage: `linear-gradient(to bottom, ${gray[100]}, ${gray[50]})`, + boxShadow: 'inset 0 -1px 0 hsl(220, 30%, 80%)', + border: `1px solid ${gray[50]}`, + '&:hover': { + backgroundImage: 'none', + backgroundColor: gray[300], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: gray[400], + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'contained', + }, + style: { + color: 'white', + backgroundColor: brand[300], + backgroundImage: `linear-gradient(to bottom, ${alpha(brand[400], 0.8)}, ${brand[500]})`, + boxShadow: `inset 0 2px 0 ${alpha(brand[200], 0.2)}, inset 0 -2px 0 ${alpha(brand[700], 0.4)}`, + border: `1px solid ${brand[500]}`, + '&:hover': { + backgroundColor: brand[700], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: brand[700], + backgroundImage: 'none', + }, + }, + }, + { + props: { + variant: 'outlined', + }, + style: { + color: (theme.vars || theme).palette.text.primary, + border: '1px solid', + borderColor: gray[200], + backgroundColor: alpha(gray[50], 0.3), + '&:hover': { + backgroundColor: gray[100], + borderColor: gray[300], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + borderColor: gray[700], + + '&:hover': { + backgroundColor: gray[900], + borderColor: gray[600], + }, + '&:active': { + backgroundColor: gray[900], + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'outlined', + }, + style: { + color: brand[700], + border: '1px solid', + borderColor: brand[200], + backgroundColor: brand[50], + '&:hover': { + backgroundColor: brand[100], + borderColor: brand[400], + }, + '&:active': { + backgroundColor: alpha(brand[200], 0.7), + }, + ...theme.applyStyles('dark', { + color: brand[50], + border: '1px solid', + borderColor: brand[900], + backgroundColor: alpha(brand[900], 0.3), + '&:hover': { + borderColor: brand[700], + backgroundColor: alpha(brand[900], 0.6), + }, + '&:active': { + backgroundColor: alpha(brand[900], 0.5), + }, + }), + }, + }, + { + props: { + variant: 'text', + }, + style: { + color: gray[600], + '&:hover': { + backgroundColor: gray[100], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + color: gray[50], + '&:hover': { + backgroundColor: gray[700], + }, + '&:active': { + backgroundColor: alpha(gray[700], 0.7), + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'text', + }, + style: { + color: brand[700], + '&:hover': { + backgroundColor: alpha(brand[100], 0.5), + }, + '&:active': { + backgroundColor: alpha(brand[200], 0.7), + }, + ...theme.applyStyles('dark', { + color: brand[100], + '&:hover': { + backgroundColor: alpha(brand[900], 0.5), + }, + '&:active': { + backgroundColor: alpha(brand[900], 0.3), + }, + }), + }, + }, + ], + }), + }, + }, + MuiIconButton: { + styleOverrides: { + root: ({ theme }) => ({ + boxShadow: 'none', + borderRadius: (theme.vars || theme).shape.borderRadius, + textTransform: 'none', + fontWeight: theme.typography.fontWeightMedium, + letterSpacing: 0, + color: (theme.vars || theme).palette.text.primary, + border: '1px solid ', + borderColor: gray[200], + backgroundColor: alpha(gray[50], 0.3), + '&:hover': { + backgroundColor: gray[100], + borderColor: gray[300], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + borderColor: gray[700], + '&:hover': { + backgroundColor: gray[900], + borderColor: gray[600], + }, + '&:active': { + backgroundColor: gray[900], + }, + }), + variants: [ + { + props: { + size: 'small', + }, + style: { + width: '2.25rem', + height: '2.25rem', + padding: '0.25rem', + [`& .${svgIconClasses.root}`]: { fontSize: '1rem' }, + }, + }, + { + props: { + size: 'medium', + }, + style: { + width: '2.5rem', + height: '2.5rem', + }, + }, + ], + }), + }, + }, + MuiToggleButtonGroup: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: '10px', + boxShadow: `0 4px 16px ${alpha(gray[400], 0.2)}`, + [`& .${toggleButtonGroupClasses.selected}`]: { + color: brand[500], + }, + ...theme.applyStyles('dark', { + [`& .${toggleButtonGroupClasses.selected}`]: { + color: '#fff', + }, + boxShadow: `0 4px 16px ${alpha(brand[700], 0.5)}`, + }), + }), + }, + }, + MuiToggleButton: { + styleOverrides: { + root: ({ theme }) => ({ + padding: '12px 16px', + textTransform: 'none', + borderRadius: '10px', + fontWeight: 500, + ...theme.applyStyles('dark', { + color: gray[400], + boxShadow: '0 4px 16px rgba(0, 0, 0, 0.5)', + [`&.${toggleButtonClasses.selected}`]: { + color: brand[300], + }, + }), + }), + }, + }, + MuiCheckbox: { + defaultProps: { + disableRipple: true, + icon: ( + + ), + checkedIcon: , + indeterminateIcon: , + }, + styleOverrides: { + root: ({ theme }) => ({ + margin: 10, + height: 16, + width: 16, + borderRadius: 5, + border: '1px solid ', + borderColor: alpha(gray[300], 0.8), + boxShadow: '0 0 0 1.5px hsla(210, 0%, 0%, 0.04) inset', + backgroundColor: alpha(gray[100], 0.4), + transition: 'border-color, background-color, 120ms ease-in', + '&:hover': { + borderColor: brand[300], + }, + '&.Mui-focusVisible': { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + borderColor: brand[400], + }, + '&.Mui-checked': { + color: 'white', + backgroundColor: brand[500], + borderColor: brand[500], + boxShadow: `none`, + '&:hover': { + backgroundColor: brand[600], + }, + }, + ...theme.applyStyles('dark', { + borderColor: alpha(gray[700], 0.8), + boxShadow: '0 0 0 1.5px hsl(210, 0%, 0%) inset', + backgroundColor: alpha(gray[900], 0.8), + '&:hover': { + borderColor: brand[300], + }, + '&.Mui-focusVisible': { + borderColor: brand[400], + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + }, + }), + }), + }, + }, + MuiInputBase: { + styleOverrides: { + root: { + border: 'none', + }, + input: { + '&::placeholder': { + opacity: 0.7, + color: gray[500], + }, + }, + }, + }, + MuiOutlinedInput: { + styleOverrides: { + input: { + padding: 0, + }, + root: ({ theme }) => ({ + padding: '8px 12px', + color: (theme.vars || theme).palette.text.primary, + borderRadius: (theme.vars || theme).shape.borderRadius, + border: `1px solid ${(theme.vars || theme).palette.divider}`, + backgroundColor: (theme.vars || theme).palette.background.default, + transition: 'border 120ms ease-in', + '&:hover': { + borderColor: gray[400], + }, + [`&.${outlinedInputClasses.focused}`]: { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + borderColor: brand[400], + }, + ...theme.applyStyles('dark', { + '&:hover': { + borderColor: gray[500], + }, + }), + variants: [ + { + props: { + size: 'small', + }, + style: { + height: '2.25rem', + }, + }, + { + props: { + size: 'medium', + }, + style: { + height: '2.5rem', + }, + }, + ], + }), + notchedOutline: { + border: 'none', + }, + }, + }, + MuiInputAdornment: { + styleOverrides: { + root: ({ theme }) => ({ + color: (theme.vars || theme).palette.grey[500], + ...theme.applyStyles('dark', { + color: (theme.vars || theme).palette.grey[400], + }), + }), + }, + }, + MuiFormLabel: { + styleOverrides: { + root: ({ theme }) => ({ + typography: theme.typography.caption, + marginBottom: 8, + }), + }, + }, +}; diff --git a/fe/src/ui/shared-theme/customizations/navigation.tsx b/fe/src/ui/shared-theme/customizations/navigation.tsx new file mode 100644 index 0000000..3cb9713 --- /dev/null +++ b/fe/src/ui/shared-theme/customizations/navigation.tsx @@ -0,0 +1,279 @@ +import * as React from 'react'; +import { Theme, alpha, Components } from '@mui/material/styles'; +import { SvgIconProps } from '@mui/material/SvgIcon'; +import { buttonBaseClasses } from '@mui/material/ButtonBase'; +import { dividerClasses } from '@mui/material/Divider'; +import { menuItemClasses } from '@mui/material/MenuItem'; +import { selectClasses } from '@mui/material/Select'; +import { tabClasses } from '@mui/material/Tab'; +import UnfoldMoreRoundedIcon from '@mui/icons-material/UnfoldMoreRounded'; +import { gray, brand } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const navigationCustomizations: Components = { + MuiMenuItem: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: (theme.vars || theme).shape.borderRadius, + padding: '6px 8px', + [`&.${menuItemClasses.focusVisible}`]: { + backgroundColor: 'transparent', + }, + [`&.${menuItemClasses.selected}`]: { + [`&.${menuItemClasses.focusVisible}`]: { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + }, + }), + }, + }, + MuiMenu: { + styleOverrides: { + list: { + gap: '0px', + [`&.${dividerClasses.root}`]: { + margin: '0 -8px', + }, + }, + paper: ({ theme }) => ({ + marginTop: '4px', + borderRadius: (theme.vars || theme).shape.borderRadius, + border: `1px solid ${(theme.vars || theme).palette.divider}`, + backgroundImage: 'none', + background: 'hsl(0, 0%, 100%)', + boxShadow: + 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px', + [`& .${buttonBaseClasses.root}`]: { + '&.Mui-selected': { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + }, + ...theme.applyStyles('dark', { + background: gray[900], + boxShadow: + 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px', + }), + }), + }, + }, + MuiSelect: { + defaultProps: { + IconComponent: React.forwardRef((props, ref) => ( + + )), + }, + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: (theme.vars || theme).shape.borderRadius, + border: '1px solid', + borderColor: gray[200], + backgroundColor: (theme.vars || theme).palette.background.paper, + boxShadow: `inset 0 1px 0 1px hsla(220, 0%, 100%, 0.6), inset 0 -1px 0 1px hsla(220, 35%, 90%, 0.5)`, + '&:hover': { + borderColor: gray[300], + backgroundColor: (theme.vars || theme).palette.background.paper, + boxShadow: 'none', + }, + [`&.${selectClasses.focused}`]: { + outlineOffset: 0, + borderColor: gray[400], + }, + '&:before, &:after': { + display: 'none', + }, + + ...theme.applyStyles('dark', { + borderRadius: (theme.vars || theme).shape.borderRadius, + borderColor: gray[700], + backgroundColor: (theme.vars || theme).palette.background.paper, + boxShadow: `inset 0 1px 0 1px ${alpha(gray[700], 0.15)}, inset 0 -1px 0 1px hsla(220, 0%, 0%, 0.7)`, + '&:hover': { + borderColor: alpha(gray[700], 0.7), + backgroundColor: (theme.vars || theme).palette.background.paper, + boxShadow: 'none', + }, + [`&.${selectClasses.focused}`]: { + outlineOffset: 0, + borderColor: gray[900], + }, + '&:before, &:after': { + display: 'none', + }, + }), + }), + select: ({ theme }) => ({ + display: 'flex', + alignItems: 'center', + ...theme.applyStyles('dark', { + display: 'flex', + alignItems: 'center', + '&:focus-visible': { + backgroundColor: gray[900], + }, + }), + }), + }, + }, + MuiLink: { + defaultProps: { + underline: 'none', + }, + styleOverrides: { + root: ({ theme }) => ({ + color: (theme.vars || theme).palette.text.primary, + fontWeight: 500, + position: 'relative', + textDecoration: 'none', + width: 'fit-content', + '&::before': { + content: '""', + position: 'absolute', + width: '100%', + height: '1px', + bottom: 0, + left: 0, + backgroundColor: (theme.vars || theme).palette.text.secondary, + opacity: 0.3, + transition: 'width 0.3s ease, opacity 0.3s ease', + }, + '&:hover::before': { + width: 0, + }, + '&:focus-visible': { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '4px', + borderRadius: '2px', + }, + }), + }, + }, + MuiDrawer: { + styleOverrides: { + paper: ({ theme }) => ({ + backgroundColor: (theme.vars || theme).palette.background.default, + }), + }, + }, + MuiPaginationItem: { + styleOverrides: { + root: ({ theme }) => ({ + '&.Mui-selected': { + color: 'white', + backgroundColor: (theme.vars || theme).palette.grey[900], + }, + ...theme.applyStyles('dark', { + '&.Mui-selected': { + color: 'black', + backgroundColor: (theme.vars || theme).palette.grey[50], + }, + }), + }), + }, + }, + MuiTabs: { + styleOverrides: { + root: { minHeight: 'fit-content' }, + indicator: ({ theme }) => ({ + backgroundColor: (theme.vars || theme).palette.grey[800], + ...theme.applyStyles('dark', { + backgroundColor: (theme.vars || theme).palette.grey[200], + }), + }), + }, + }, + MuiTab: { + styleOverrides: { + root: ({ theme }) => ({ + padding: '6px 8px', + marginBottom: '8px', + textTransform: 'none', + minWidth: 'fit-content', + minHeight: 'fit-content', + color: (theme.vars || theme).palette.text.secondary, + borderRadius: (theme.vars || theme).shape.borderRadius, + border: '1px solid', + borderColor: 'transparent', + ':hover': { + color: (theme.vars || theme).palette.text.primary, + backgroundColor: gray[100], + borderColor: gray[200], + }, + [`&.${tabClasses.selected}`]: { + color: gray[900], + }, + ...theme.applyStyles('dark', { + ':hover': { + color: (theme.vars || theme).palette.text.primary, + backgroundColor: gray[800], + borderColor: gray[700], + }, + [`&.${tabClasses.selected}`]: { + color: '#fff', + }, + }), + }), + }, + }, + MuiStepConnector: { + styleOverrides: { + line: ({ theme }) => ({ + borderTop: '1px solid', + borderColor: (theme.vars || theme).palette.divider, + flex: 1, + borderRadius: '99px', + }), + }, + }, + MuiStepIcon: { + styleOverrides: { + root: ({ theme }) => ({ + color: 'transparent', + border: `1px solid ${gray[400]}`, + width: 12, + height: 12, + borderRadius: '50%', + '& text': { + display: 'none', + }, + '&.Mui-active': { + border: 'none', + color: (theme.vars || theme).palette.primary.main, + }, + '&.Mui-completed': { + border: 'none', + color: (theme.vars || theme).palette.success.main, + }, + ...theme.applyStyles('dark', { + border: `1px solid ${gray[700]}`, + '&.Mui-active': { + border: 'none', + color: (theme.vars || theme).palette.primary.light, + }, + '&.Mui-completed': { + border: 'none', + color: (theme.vars || theme).palette.success.light, + }, + }), + variants: [ + { + props: { completed: true }, + style: { + width: 12, + height: 12, + }, + }, + ], + }), + }, + }, + MuiStepLabel: { + styleOverrides: { + label: ({ theme }) => ({ + '&.Mui-completed': { + opacity: 0.6, + ...theme.applyStyles('dark', { opacity: 0.5 }), + }, + }), + }, + }, +}; diff --git a/fe/src/ui/shared-theme/customizations/surfaces.ts b/fe/src/ui/shared-theme/customizations/surfaces.ts new file mode 100644 index 0000000..f47a6d8 --- /dev/null +++ b/fe/src/ui/shared-theme/customizations/surfaces.ts @@ -0,0 +1,113 @@ +import { alpha, Theme, Components } from '@mui/material/styles'; +import { gray } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const surfacesCustomizations: Components = { + MuiAccordion: { + defaultProps: { + elevation: 0, + disableGutters: true, + }, + styleOverrides: { + root: ({ theme }) => ({ + padding: 4, + overflow: 'clip', + backgroundColor: (theme.vars || theme).palette.background.default, + border: '1px solid', + borderColor: (theme.vars || theme).palette.divider, + ':before': { + backgroundColor: 'transparent', + }, + '&:not(:last-of-type)': { + borderBottom: 'none', + }, + '&:first-of-type': { + borderTopLeftRadius: (theme.vars || theme).shape.borderRadius, + borderTopRightRadius: (theme.vars || theme).shape.borderRadius, + }, + '&:last-of-type': { + borderBottomLeftRadius: (theme.vars || theme).shape.borderRadius, + borderBottomRightRadius: (theme.vars || theme).shape.borderRadius, + }, + }), + }, + }, + MuiAccordionSummary: { + styleOverrides: { + root: ({ theme }) => ({ + border: 'none', + borderRadius: 8, + '&:hover': { backgroundColor: gray[50] }, + '&:focus-visible': { backgroundColor: 'transparent' }, + ...theme.applyStyles('dark', { + '&:hover': { backgroundColor: gray[800] }, + }), + }), + }, + }, + MuiAccordionDetails: { + styleOverrides: { + root: { mb: 20, border: 'none' }, + }, + }, + MuiPaper: { + defaultProps: { + elevation: 0, + }, + }, + MuiCard: { + styleOverrides: { + root: ({ theme }) => { + return { + padding: 16, + gap: 16, + transition: 'all 100ms ease', + backgroundColor: gray[50], + borderRadius: (theme.vars || theme).shape.borderRadius, + border: `1px solid ${(theme.vars || theme).palette.divider}`, + boxShadow: 'none', + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + }), + variants: [ + { + props: { + variant: 'outlined', + }, + style: { + border: `1px solid ${(theme.vars || theme).palette.divider}`, + boxShadow: 'none', + background: 'hsl(0, 0%, 100%)', + ...theme.applyStyles('dark', { + background: alpha(gray[900], 0.4), + }), + }, + }, + ], + }; + }, + }, + }, + MuiCardContent: { + styleOverrides: { + root: { + padding: 0, + '&:last-child': { paddingBottom: 0 }, + }, + }, + }, + MuiCardHeader: { + styleOverrides: { + root: { + padding: 0, + }, + }, + }, + MuiCardActions: { + styleOverrides: { + root: { + padding: 0, + }, + }, + }, +}; diff --git a/fe/src/ui/shared-theme/themePrimitives.ts b/fe/src/ui/shared-theme/themePrimitives.ts new file mode 100644 index 0000000..b9b8a04 --- /dev/null +++ b/fe/src/ui/shared-theme/themePrimitives.ts @@ -0,0 +1,399 @@ +import { createTheme, alpha, PaletteMode, Shadows } from '@mui/material/styles'; + +declare module '@mui/material/Paper' { + interface PaperPropsVariantOverrides { + highlighted: true; + } +} +declare module '@mui/material/styles/createPalette' { + interface ColorRange { + 50: string; + 100: string; + 200: string; + 300: string; + 400: string; + 500: string; + 600: string; + 700: string; + 800: string; + 900: string; + } + + interface PaletteColor extends ColorRange {} + + interface Palette { + baseShadow: string; + } +} + +const defaultTheme = createTheme(); + +const customShadows: Shadows = [...defaultTheme.shadows]; + +export const brand = { + 50: 'hsl(210, 100%, 95%)', + 100: 'hsl(210, 100%, 92%)', + 200: 'hsl(210, 100%, 80%)', + 300: 'hsl(210, 100%, 65%)', + 400: 'hsl(210, 98%, 48%)', + 500: 'hsl(210, 98%, 42%)', + 600: 'hsl(210, 98%, 55%)', + 700: 'hsl(210, 100%, 35%)', + 800: 'hsl(210, 100%, 16%)', + 900: 'hsl(210, 100%, 21%)', +}; + +export const gray = { + 50: 'hsl(220, 35%, 97%)', + 100: 'hsl(220, 30%, 94%)', + 200: 'hsl(220, 20%, 88%)', + 300: 'hsl(220, 20%, 80%)', + 400: 'hsl(220, 20%, 65%)', + 500: 'hsl(220, 20%, 42%)', + 600: 'hsl(220, 20%, 35%)', + 700: 'hsl(220, 20%, 25%)', + 800: 'hsl(220, 30%, 6%)', + 900: 'hsl(220, 35%, 3%)', +}; + +export const green = { + 50: 'hsl(120, 80%, 98%)', + 100: 'hsl(120, 75%, 94%)', + 200: 'hsl(120, 75%, 87%)', + 300: 'hsl(120, 61%, 77%)', + 400: 'hsl(120, 44%, 53%)', + 500: 'hsl(120, 59%, 30%)', + 600: 'hsl(120, 70%, 25%)', + 700: 'hsl(120, 75%, 16%)', + 800: 'hsl(120, 84%, 10%)', + 900: 'hsl(120, 87%, 6%)', +}; + +export const orange = { + 50: 'hsl(45, 100%, 97%)', + 100: 'hsl(45, 92%, 90%)', + 200: 'hsl(45, 94%, 80%)', + 300: 'hsl(45, 90%, 65%)', + 400: 'hsl(45, 90%, 40%)', + 500: 'hsl(45, 90%, 35%)', + 600: 'hsl(45, 91%, 25%)', + 700: 'hsl(45, 94%, 20%)', + 800: 'hsl(45, 95%, 16%)', + 900: 'hsl(45, 93%, 12%)', +}; + +export const red = { + 50: 'hsl(0, 100%, 97%)', + 100: 'hsl(0, 92%, 90%)', + 200: 'hsl(0, 94%, 80%)', + 300: 'hsl(0, 90%, 65%)', + 400: 'hsl(0, 90%, 40%)', + 500: 'hsl(0, 90%, 30%)', + 600: 'hsl(0, 91%, 25%)', + 700: 'hsl(0, 94%, 18%)', + 800: 'hsl(0, 95%, 12%)', + 900: 'hsl(0, 93%, 6%)', +}; + +export const getDesignTokens = (mode: PaletteMode) => { + customShadows[1] = + mode === 'dark' + ? 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px' + : 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px'; + + return { + palette: { + mode, + primary: { + light: brand[200], + main: brand[400], + dark: brand[700], + contrastText: brand[50], + ...(mode === 'dark' && { + contrastText: brand[50], + light: brand[300], + main: brand[400], + dark: brand[700], + }), + }, + info: { + light: brand[100], + main: brand[300], + dark: brand[600], + contrastText: gray[50], + ...(mode === 'dark' && { + contrastText: brand[300], + light: brand[500], + main: brand[700], + dark: brand[900], + }), + }, + warning: { + light: orange[300], + main: orange[400], + dark: orange[800], + ...(mode === 'dark' && { + light: orange[400], + main: orange[500], + dark: orange[700], + }), + }, + error: { + light: red[300], + main: red[400], + dark: red[800], + ...(mode === 'dark' && { + light: red[400], + main: red[500], + dark: red[700], + }), + }, + success: { + light: green[300], + main: green[400], + dark: green[800], + ...(mode === 'dark' && { + light: green[400], + main: green[500], + dark: green[700], + }), + }, + grey: { + ...gray, + }, + divider: mode === 'dark' ? alpha(gray[700], 0.6) : alpha(gray[300], 0.4), + background: { + default: 'hsl(0, 0%, 99%)', + paper: 'hsl(220, 35%, 97%)', + ...(mode === 'dark' && { default: gray[900], paper: 'hsl(220, 30%, 7%)' }), + }, + text: { + primary: gray[800], + secondary: gray[600], + warning: orange[400], + ...(mode === 'dark' && { primary: 'hsl(0, 0%, 100%)', secondary: gray[400] }), + }, + action: { + hover: alpha(gray[200], 0.2), + selected: `${alpha(gray[200], 0.3)}`, + ...(mode === 'dark' && { + hover: alpha(gray[600], 0.2), + selected: alpha(gray[600], 0.3), + }), + }, + }, + typography: { + fontFamily: ['"Inter", "sans-serif"'].join(','), + h1: { + fontSize: defaultTheme.typography.pxToRem(48), + fontWeight: 600, + lineHeight: 1.2, + letterSpacing: -0.5, + }, + h2: { + fontSize: defaultTheme.typography.pxToRem(36), + fontWeight: 600, + lineHeight: 1.2, + }, + h3: { + fontSize: defaultTheme.typography.pxToRem(30), + lineHeight: 1.2, + }, + h4: { + fontSize: defaultTheme.typography.pxToRem(24), + fontWeight: 600, + lineHeight: 1.5, + }, + h5: { + fontSize: defaultTheme.typography.pxToRem(20), + fontWeight: 600, + }, + h6: { + fontSize: defaultTheme.typography.pxToRem(18), + fontWeight: 600, + }, + subtitle1: { + fontSize: defaultTheme.typography.pxToRem(18), + }, + subtitle2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 500, + }, + body1: { + fontSize: defaultTheme.typography.pxToRem(14), + }, + body2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 400, + }, + caption: { + fontSize: defaultTheme.typography.pxToRem(12), + fontWeight: 400, + }, + }, + shape: { + borderRadius: 8, + }, + shadows: customShadows, + }; +}; + +export const colorSchemes = { + light: { + palette: { + primary: { + light: brand[200], + main: brand[400], + dark: brand[700], + contrastText: brand[50], + }, + info: { + light: brand[100], + main: brand[300], + dark: brand[600], + contrastText: gray[50], + }, + warning: { + light: orange[300], + main: orange[400], + dark: orange[800], + }, + error: { + light: red[300], + main: red[400], + dark: red[800], + }, + success: { + light: green[300], + main: green[400], + dark: green[800], + }, + grey: { + ...gray, + }, + divider: alpha(gray[300], 0.4), + background: { + default: 'hsl(0, 0%, 99%)', + paper: 'hsl(220, 35%, 97%)', + }, + text: { + primary: gray[800], + secondary: gray[600], + warning: orange[400], + }, + action: { + hover: alpha(gray[200], 0.2), + selected: `${alpha(gray[200], 0.3)}`, + }, + baseShadow: + 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px', + }, + }, + dark: { + palette: { + primary: { + contrastText: brand[50], + light: brand[300], + main: brand[400], + dark: brand[700], + }, + info: { + contrastText: brand[300], + light: brand[500], + main: brand[700], + dark: brand[900], + }, + warning: { + light: orange[400], + main: orange[500], + dark: orange[700], + }, + error: { + light: red[400], + main: red[500], + dark: red[700], + }, + success: { + light: green[400], + main: green[500], + dark: green[700], + }, + grey: { + ...gray, + }, + divider: alpha(gray[700], 0.6), + background: { + default: gray[900], + paper: 'hsl(220, 30%, 7%)', + }, + text: { + primary: 'hsl(0, 0%, 100%)', + secondary: gray[400], + }, + action: { + hover: alpha(gray[600], 0.2), + selected: alpha(gray[600], 0.3), + }, + baseShadow: + 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px', + }, + }, +}; + +export const typography = { + fontFamily: ['"Inter", "sans-serif"'].join(','), + h1: { + fontSize: defaultTheme.typography.pxToRem(48), + fontWeight: 600, + lineHeight: 1.2, + letterSpacing: -0.5, + }, + h2: { + fontSize: defaultTheme.typography.pxToRem(36), + fontWeight: 600, + lineHeight: 1.2, + }, + h3: { + fontSize: defaultTheme.typography.pxToRem(30), + lineHeight: 1.2, + }, + h4: { + fontSize: defaultTheme.typography.pxToRem(24), + fontWeight: 600, + lineHeight: 1.5, + }, + h5: { + fontSize: defaultTheme.typography.pxToRem(20), + fontWeight: 600, + }, + h6: { + fontSize: defaultTheme.typography.pxToRem(18), + fontWeight: 600, + }, + subtitle1: { + fontSize: defaultTheme.typography.pxToRem(18), + }, + subtitle2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 500, + }, + body1: { + fontSize: defaultTheme.typography.pxToRem(14), + }, + body2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 400, + }, + caption: { + fontSize: defaultTheme.typography.pxToRem(12), + fontWeight: 400, + }, +}; + +export const shape = { + borderRadius: 8, +}; + +// @ts-ignore +const defaultShadows: Shadows = ['var(--mui-palette-baseShadow)', ...defaultTheme.shadows.slice(1)]; +export const shadows = defaultShadows; diff --git a/fe/src/ui/sigil-ts/index.json b/fe/src/ui/sigil-ts/index.json new file mode 100644 index 0000000..3c8f95b --- /dev/null +++ b/fe/src/ui/sigil-ts/index.json @@ -0,0 +1,24315 @@ +{ + "bac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32.0072", + "x2": "32.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64.0072", + "x2": "64.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96.0072", + "x2": "96.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ban": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 70.6924 70.6924 128 -1.52588e-05 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3462 99.3462 64 64 64C28.6538 64 0 35.3462 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ben": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "8", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ber": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bet": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C74.9807 96 32 53.0193 32 -4.19629e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0C32 70.6925 74.9807 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96", + "x2": "-8.87604e-09", + "y2": "96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-8.87604e-09", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bon": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 4.215e-07 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bot": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 64C16 90.5097 37.4903 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 110.327 17.6731 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "byl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M22.1288 22.6299C16.0075 28.7511 8.0234 31.874 0.00134547 31.9986M44.7562 45.2573C32.3866 57.6269 16.2133 63.8747 0.00134277 64.0005M67.3836 67.8847C48.7656 86.5027 24.403 95.8749 0.00134412 96.0012", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "byn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "byr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "byt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L-5.96046e-08 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "63.29", + "y2": "63.2929", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32.0072", + "x2": "32.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64.0072", + "x2": "64.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96.0072", + "x2": "96.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dap": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.004", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.6274 86.6274C99.1242 74.1307 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M75.3137 75.3137C81.5621 69.0653 81.5621 58.9347 75.3137 52.6863C69.0653 46.4379 58.9347 46.4379 52.6863 52.6863", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M97.9411 97.9411C116.686 79.1959 116.686 48.804 97.9411 30.0589C79.196 11.3137 48.804 11.3137 30.0589 30.0589", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "das": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 -1.54503e-06 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "deb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 -6.35781e-07C64 35.3462 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "16", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "16", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "def": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128L128 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 94L94 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 64L64 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 32L32 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "deg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "del": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 -6.35781e-07C64 35.3462 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "den": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1216", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "der": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128L96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "des": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "det": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.996", + "x2": "47.9964", + "y2": "79.9964", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96.5", + "y1": "3.07317e-08", + "x2": "96.5", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32.5", + "y1": "3.07317e-08", + "x2": "32.5", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dib": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "8.74228e-08", + "y1": "64", + "x2": "128", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "5.25874e-08", + "y1": "32", + "x2": "128", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dif": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M60.1244 67.3837C41.5063 48.7657 32.1342 24.4031 32.0079 0.00145601M82.7518 44.7563C70.3822 32.3867 64.1344 16.2134 64.0086 0.00145196M105.379 22.1289C99.258 16.0077 96.1351 8.02351 96.0105 0.00145196", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dig": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64.5", + "y1": "-0.5", + "x2": "64.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9964", + "x2": "112.004", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "din": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dir": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 81.6731 81.6731 96 64 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.0029152 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "div": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-4.19629e-06 96C70.6924 96 128 53.0193 128 5.59506e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-2.79753e-06 64C70.6924 64 128 35.3462 128 5.59506e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "doc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M127.997 0L-0.00291443 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726C28.8758 53.8694 28.8758 74.1306 41.3726 86.6274", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-4.19629e-06 16C26.5097 16 48 37.4903 48 64C48 90.5097 26.5097 112 0 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "don": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-3.8147e-06 128C-7.24632e-07 92.6538 28.6538 64 64 64C99.3462 64 128 92.6538 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "63.5", + "x2": "128", + "y2": "63.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.6274 86.6274C99.1242 74.1306 99.1242 53.8693 86.6274 41.3725C74.1306 28.8758 53.8694 28.8758 41.3726 41.3725", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dot": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dov": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.701724 31.9914C25.6281 31.9914 49.4822 42.5913 66.8261 59.7565M-0.701723 63.9914C16.7916 63.9914 32.6456 71.0098 44.1982 82.3844M-0.701722 95.9914C7.955 95.9914 15.8089 99.4288 21.5694 105.013", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "doz": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128L0 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M30.0589 30.0589C48.804 11.3137 79.196 11.3137 97.9411 30.0589C116.686 48.804 116.686 79.196 97.9411 97.9411", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M52.6863 52.6863C58.9347 46.4379 69.0653 46.4379 75.3137 52.6863C81.5621 58.9347 81.5621 69.0653 75.3137 75.3137", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M41.3726 41.3726C53.8694 28.8758 74.1306 28.8758 86.6274 41.3726C99.1242 53.8694 99.1242 74.1306 86.6274 86.6274", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "duc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C90.5097 16 112 37.4903 112 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 64L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dun": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 -3.05151e-06C32 53.0193 74.9807 96 128 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dux": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-2.79795e-06 -3.55988e-06C70.6924 -4.40288e-06 128 57.3075 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dyn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dyr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dys": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-3.8147e-06 1.11901e-05C-7.24633e-07 35.3462 28.6538 64 64 64C99.3462 64 128 35.3462 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dyt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fad": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128L128 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 32C26.5077 32 50.5061 42.7436 67.8783 60.1138", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 64C17.6721 64 33.6713 71.1626 45.2529 82.7432", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 95.6284C8.83603 95.6284 16.8356 99.2097 22.6264 105", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fam": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fas": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "feb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fed": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fen": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fer": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fet": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00291443 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fig": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "98", + "y1": "2.18557e-08", + "x2": "98", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fip": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fir": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fog": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.6274 86.6274C99.1242 74.1306 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fon": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 64C16 90.5097 37.4903 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "for": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 53.0193 53.0193 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 35.3462 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0C32 17.6731 17.6731 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fot": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ful": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fun": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.8823 41.6275C74.3855 29.1307 54.1242 29.1307 41.6274 41.6275C29.1307 54.1243 29.1307 74.3855 41.6274 86.8823", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 110.327 17.6731 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M22.1288 22.6299C16.0075 28.7511 8.0234 31.874 0.00134547 31.9986M44.7562 45.2573C32.3866 57.6269 16.2133 63.8747 0.00134277 64.0005M67.3836 67.8847C48.7656 86.5027 24.403 95.8749 0.00134412 96.0012", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fyn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fyr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00268555 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M60.1244 67.3837C41.5063 48.7657 32.1342 24.4031 32.0079 0.00145601M82.7518 44.7563C70.3822 32.3867 64.1344 16.2134 64.0086 0.00145196M105.379 22.1289C99.258 16.0077 96.1351 8.02351 96.0105 0.00145196", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "had": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64.5", + "y1": "-0.5", + "x2": "64.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 64C16 90.5097 37.4903 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "han": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hap": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "har": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "has": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "8", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M48 32C48 40.8366 40.8366 48 32 48C23.1634 48 16 40.8366 16 32C16 23.1634 23.1634 16 32 16C40.8366 16 48 23.1634 48 32ZM32 40C36.4183 40 40 36.4183 40 32C40 27.5817 36.4183 24 32 24C27.5817 24 24 27.5817 24 32C24 36.4183 27.5817 40 32 40Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "heb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.00285417", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M48 96C48 104.837 40.8366 112 32 112C23.1634 112 16 104.837 16 96C16 87.1634 23.1634 80 32 80C40.8366 80 48 87.1634 48 96ZM32 104C36.4183 104 40 100.418 40 96C40 91.5817 36.4183 88 32 88C27.5817 88 24 91.5817 24 96C24 100.418 27.5817 104 32 104Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "het": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128L96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "8.74228e-08", + "y1": "64", + "x2": "128", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M48 64C48 72.8366 40.8366 80 32 80C23.1634 80 16 72.8366 16 64C16 55.1634 23.1634 48 32 48C40.8366 48 48 55.1634 48 64ZM32 72C36.4183 72 40 68.4183 40 64C40 59.5817 36.4183 56 32 56C27.5817 56 24 59.5817 24 64C24 68.4183 27.5817 72 32 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hob": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hoc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "47", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "47", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "81", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "81", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C46.3269 96 32 81.6731 32 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 -9.40976e-06C64 70.6924 92.6538 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 -7.63193e-07C32 70.6924 74.9807 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lad": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "95.35", + "y1": "32.7071", + "x2": "32.0571", + "y2": "96", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lag": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 112C90.5097 112 112 90.5097 112 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lap": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "2.78181e-08", + "y1": "64", + "x2": "128", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "las": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "leb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-1.64036e-05 32C53.0193 32 96 74.9807 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "led": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "leg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M7.63192e-07 32C17.6731 32 32 46.3269 32 64C32 81.6731 17.6731 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "len": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 110.327 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ler": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "let": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9965", + "y1": "111.997", + "x2": "47.9965", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lib": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lig": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "128", + "x2": "64", + "y2": "-6.55671e-08", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "64", + "r": "8", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-4.70488e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00286865 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "liv": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-5.21346e-06 32C70.6924 32 128 17.6731 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M3.4331e-06 96C70.6924 96 128 53.0193 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "loc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C74.9807 96 32 53.0193 32 -4.19629e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 64C16 90.5097 37.4903 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lom": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lon": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-8.87604e-09", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "los": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "luc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lug": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lun": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lup": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lux": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lyd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lyn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lyr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00268555 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lys": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lyt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lyx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mag": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.004", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "map": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.0029152 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 64L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.6274 86.6274C99.1242 74.1307 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M75.3137 75.3137C81.5621 69.0653 81.5621 58.9347 75.3137 52.6863C69.0653 46.4379 58.9347 46.4379 52.6863 52.6863", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M97.9411 97.9411C116.686 79.1959 116.686 48.804 97.9411 30.0589C79.196 11.3137 48.804 11.3137 30.0589 30.0589", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mas": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C110.327 32 96 17.6731 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "meb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 -3.05151e-06C32 53.0193 74.9807 96 128 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "med": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "meg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mer": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.996", + "x2": "47.9964", + "y2": "79.9964", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "met": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128L32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-2.09815e-06 80C26.5097 80 48 101.49 48 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mig": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-4.37114e-08", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96", + "x2": "-4.37114e-08", + "y2": "96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "min": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mip": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 4.215e-07 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mir": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9964", + "x2": "48.0036", + "y2": "47.9964", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00286865 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "moc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 96L128 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mog": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 90.5097 90.5097 112 64 112C37.4903 112 16 90.5097 16 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 0C112 26.5097 90.5097 48 64 48C37.4903 48 16 26.5097 16 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mon": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9964", + "x2": "48.0035", + "y2": "47.9964", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.996", + "x2": "47.9964", + "y2": "79.9964", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mot": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mug": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.003", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mun": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 74.9807 53.0193 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "myl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "myn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 1.52638e-06C57.3076 -7.74381e-06 9.2702e-06 57.3075 0 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C74.9807 32 32 74.9807 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 110.327 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "myr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.82114e-06 110C60.7513 110 110 60.7513 110 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-5.09828e-06 73C40.3168 73 73 40.3168 73 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-6.63647e-07 37C20.4345 37 37 20.4345 37 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nam": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "8.74228e-08", + "y1": "64", + "x2": "128", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nap": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "8", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-1.52588e-05 128C-9.07866e-06 57.3075 57.3076 1.44926e-06 128 7.62939e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "neb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C74.9807 32 32 74.9807 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ned": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00268555 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 1.90735e-06C96 53.0193 53.0193 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C57.3076 128 3.09007e-06 70.6925 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C74.9807 96 32 53.0193 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C110.327 32 96 17.6731 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ner": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9965", + "y1": "111.997", + "x2": "47.9965", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "net": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 64L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.003", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nib": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6538 128 64 70.6925 64 7.63192e-07", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-8.87604e-09", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nim": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C74.9807 32 32 74.9807 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00285435 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "noc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "1.51277e-05", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nom": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C46.3269 96 32 81.6731 32 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nov": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nub": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "num": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nup": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0.000105172 128C35.3582 128 67.3679 113.664 90.5332 90.4863", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "31", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "31", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.003", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nux": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nyd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nym": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nyr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00268555 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.9984 0C95.9984 26.3298 85.3985 50.1839 68.2332 67.5278M63.9983 0C63.9983 17.4933 56.9799 33.3473 45.6054 44.8999M31.9983 0C31.9983 8.65672 28.5609 16.5106 22.9766 22.2711", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nys": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nyt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 32C81.6731 32 96 46.3269 96 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C90.5097 16 112 37.4903 112 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nyx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pad": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pag": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M41.3726 86.6274C28.8758 74.1306 28.8758 53.8693 41.3726 41.3725C53.8694 28.8758 74.1306 28.8758 86.6274 41.3725", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "par": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.693 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pas": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 -2.67054e-06C32 53.0193 74.9807 96 128 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 -1.78036e-06C64 35.3462 92.6538 64 128 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 -8.9018e-07C96 17.6731 110.327 32 128 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ped": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "peg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 17.6731 81.6731 32 64 32C46.3269 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pen": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 17.6731 81.6731 32 64 32C46.3269 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "per": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 112C90.5097 112 112 90.5097 112 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.00285417", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pet": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.003", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 74.9807 53.0193 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 110.327 17.6731 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "poc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64.5", + "y1": "-0.5", + "x2": "64.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96.5", + "y1": "-0.5", + "x2": "96.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32.5", + "y1": "-0.5", + "x2": "32.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96", + "x2": "-8.87604e-09", + "y2": "96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-8.87604e-09", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pon": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pub": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pun": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M80 64C80 55.1634 72.8366 48 64 48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M3.73284e-05 64C17.6633 64 33.6554 56.8445 45.2356 45.2741", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "put": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-5.59506e-06 128C35.3462 128 64 99.3462 64 64C64 28.6538 35.3462 1.54503e-06 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pyx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9965", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rad": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rag": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ral": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ram": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ran": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00291443 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rap": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "-1.29797e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "reb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 -9.40976e-06C57.3075 -6.31969e-06 -3.09007e-06 57.3075 0 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "red": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ref": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "reg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ren": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 74.9807 74.9807 32 128 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "res": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ret": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9965", + "y1": "111.997", + "x2": "53.9965", + "y2": "73.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rib": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "8.74228e-08", + "y1": "64", + "x2": "128", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ric": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 74.9807 53.0193 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rig": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ril": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.693 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rip": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ris": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "riv": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "roc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "16", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "16", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ron": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 70.6924 70.6925 128 0 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ros": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rov": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ruc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.003", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rum": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "run": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rup": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rux": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 64C32 81.6731 46.3269 96 64 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 81.6731 81.6731 96 64 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryg": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-2.79795e-06 -3.55988e-06C70.6924 -4.40288e-06 128 57.3075 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rym": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C57.3075 128 -3.09007e-06 70.6925 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryp": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rys": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128L128 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.701724 31.9914C25.6281 31.9914 49.4822 42.5913 66.8261 59.7565M-0.701723 63.9914C16.7916 63.9914 32.6456 71.0098 44.1982 82.3844M-0.701722 95.9914C7.955 95.9914 15.8089 99.4288 21.5694 105.013", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sam": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "san": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sap": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "8", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 0 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "seb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sed": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sef": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "seg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 110.327 46.3269 96 64 96C81.6731 96 96 110.327 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "8", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sen": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 110.327 81.6731 96 64 96C46.3269 96 32 110.327 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128L64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128L32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128L96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ser": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "set": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 64L128 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sib": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 9.40976e-06C64 35.3462 92.6538 64 128 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C110.327 128 96 113.673 96 96C96 78.3269 110.327 64 128 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sig": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sim": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sip": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 64C16 37.4903 37.4903 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "siv": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "soc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sog": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L-5.96046e-08 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "som": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "son": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "127.553", + "y1": "128.224", + "x2": "63.5528", + "y2": "0.223598", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sov": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128L128 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sub": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sug": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C46.3269 96 32 81.6731 32 64C32 46.3269 46.3269 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sum": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sun": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sup": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M3.73284e-05 64.0001C17.6633 64.0001 33.6554 56.8446 45.2356 45.2742", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0.000105172 128C35.3582 128 67.3679 113.664 90.5332 90.4863", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C37.4903 16 16 37.4903 16 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sym": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96.5", + "y1": "3.07317e-08", + "x2": "96.5", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 32C26.5077 32 50.5061 42.7436 67.8783 60.1138", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 64C17.6721 64 33.6713 71.1626 45.2529 82.7432", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 95.6284C8.83603 95.6284 16.8356 99.2097 22.6264 105", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syp": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128C4.63574e-06 92.6488 14.3309 60.6449 37.5 37.4807", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1216", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "8", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tad": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tag": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9964", + "x2": "112.004", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 74.9807 53.0193 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tam": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96", + "x2": "-8.87604e-09", + "y2": "96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-8.87604e-09", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 74.9807 53.0193 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M48 128C48 101.49 26.5097 80 0 80", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 110.327 17.6731 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 128C16 119.163 8.83656 112 0 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3075 70.6925 0 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tap": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 32C81.6731 32 96 46.3269 96 64C96 81.6731 81.6731 96 64 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tas": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 32C81.6731 32 96 46.3269 96 64C96 81.6731 81.6731 96 64 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "teb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ted": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "teg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 80C119.163 80 112 72.8366 112 64C112 55.1634 119.163 48 128 48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "15", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "15", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0L127.986 127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L128 96", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L128 64", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L128 32", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.00285417", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ten": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.14479e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ter": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96.5", + "y1": "3.07317e-08", + "x2": "96.5", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9965", + "y1": "111.997", + "x2": "47.9965", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C110.327 32 96 17.6731 96 -1.39876e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M112 32C112 40.8366 104.837 48 96 48C87.1634 48 80 40.8366 80 32C80 23.1634 87.1634 16 96 16C104.837 16 112 23.1634 112 32ZM96 40C100.418 40 104 36.4183 104 32C104 27.5817 100.418 24 96 24C91.5817 24 88 27.5817 88 32C88 36.4183 91.5817 40 96 40Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "til": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tim": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00291443 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tip": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tir": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tob": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "toc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96", + "x2": "-8.87604e-09", + "y2": "96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tog": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C46.3269 96 32 81.6731 32 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 128C16 101.49 37.4903 80 64 80C90.5097 80 112 101.49 112 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tom": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ton": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C74.9807 32 32 74.9807 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 110.327 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "top": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tuc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tug": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tun": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tux": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 -2.28831e-06C57.3076 -3.13131e-06 8.42999e-07 57.3075 0 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "typ": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 1.90735e-06C96 53.0193 53.0193 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0L128 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 64C35.3462 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyv": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M256 0L128 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64.5", + "y1": "-0.5", + "x2": "64.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "web": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3075 70.6925 0 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wed": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "weg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M79.5254 0C79.5254 8.83656 72.3619 16 63.5254 16C54.6888 16 47.5254 8.83656 47.5254 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C74.9807 32 32 74.9807 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 110.327 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wen": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wer": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wet": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 64H0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "48.0035", + "y1": "80.0036", + "x2": "16.0035", + "y2": "112.004", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "win": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 64L128 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C46.3269 96 32 81.6731 32 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 64C32 46.3269 46.3269 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-3.8147e-06 128C-7.24633e-07 92.6538 28.6538 64 64 64C99.3462 64 128 92.6538 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "zod": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + } +} diff --git a/fe/src/ui/sigil-ts/index.ts b/fe/src/ui/sigil-ts/index.ts new file mode 100644 index 0000000..a9b5ac5 --- /dev/null +++ b/fe/src/ui/sigil-ts/index.ts @@ -0,0 +1,296 @@ +import { scale, translate, transform, toString } from 'transformation-matrix'; +import invariant from 'invariant'; + +import stringRenderer from './stringRenderer'; +import reactRenderer from './reactRenderer'; +import reactImageRenderer from './reactImageRenderer'; +import { Ast, Config } from './types'; +import { deepClone, chunkStr, isUndefined } from './lib'; +import index from './index.json'; + +const FG = 1; +const BG = 0; + +const COLOR_CODES = { + FG: '@FG', + BG: '@BG', +}; + +const UNIT_GRIDS = { + 4: [ + { x: 0, y: 0 }, + { x: 128, y: 0 }, + { x: 0, y: 128 }, + { x: 128, y: 128 }, + ], + 2: [ + { x: 0, y: 0 }, + { x: 128, y: 0 }, + ], + 1: [{ x: 0, y: 0 }], +}; + +const TILEMAP = { + 4: { x: 2, y: 2 }, + 2: { x: 2, y: 1 }, + 1: { x: 1, y: 1 }, +}; + +// class ConfigError extends Error {} + +// apply color preference +const paint = (node: Ast, colors: [string, string], strokeWidth: number): Ast => { + const fillIndex = node.attributes.fill === COLOR_CODES.FG ? FG : BG; + const strokeIndex = node.attributes.stroke === COLOR_CODES.FG ? FG : BG; + + if (node.attributes.fill !== undefined && node.attributes.fill !== 'none') { + node.attributes.fill = colors[fillIndex]; + } + + if (node.attributes.stroke !== undefined && node.attributes.stroke !== 'none') { + node.attributes.stroke = colors[strokeIndex]; + node.attributes['stroke-width'] = strokeWidth + 'px'; + node.attributes['stroke-linecap'] = 'square'; + // non-scaling-stroke is used to prevent the stroke from scaling when a scaling transformation is applied by sigil() + node.attributes['vector-effect'] = 'non-scaling-stroke'; + } + + return { + ...node, + ...{ + name: node.name, + attributes: node.attributes, + children: node.children.map((n) => paint(n, colors, strokeWidth)), + }, + }; +}; + +const sigil = (props: Config) => { + props = { ...props }; + + // Set default values from config + if (typeof props.colors === 'undefined') { + props.colors = ['#000', '#fff']; + } + + if (typeof props.attributes === 'undefined') { + props.attributes = {}; + } + + if (typeof props.style === 'undefined') { + props.style = {}; + } + + if (typeof props.class === 'undefined') { + props.class = ''; + } + + // if props.size is defined, set width and height + if (!(typeof props.size === 'undefined')) { + props.width = props.size; + props.height = props.size; + } + + // if width and height are undefined, set default size + if (typeof props.width === 'undefined' || typeof props.height === 'undefined') { + props.width = 128; + props.height = 128; + } + + if (typeof props.margin === 'undefined') { + props.margin = true; + } + + if (props.icon === true) { + props.margin = false; + } + + // get phonemes as array from patp input and split into array + let phonemes = chunkStr(props.patp.replace(/[\^~-]/g, ''), 3); + + invariant(Array.isArray(phonemes), `Invalid patp argument`); + + // Throw an error if the phoneme length is not a 32, 16 or 8 bit point. + const phonemeLengthDidPass = + phonemes.length === 1 || phonemes.length === 2 || phonemes.length === 4; + + invariant( + phonemeLengthDidPass, + `@tlon/sigil-js cannot render @p of length ${phonemes.length}. Only lengths of 1 (galaxy), 2 (star), and 4 (planet) are supported at this time.`, + ); + + // get symbols and clone them. If no symbol is found, the @p prop was invalid. + let patpDidPass; + + let symbols = phonemes.map((phoneme) => { + // @ts-ignore + const ast = index[phoneme]; + if (isUndefined(ast)) { + patpDidPass = false; + return {}; + } else { + patpDidPass = true; + return deepClone(ast); + } + }); + + invariant( + patpDidPass, + `@tlon/sigil-js needs a valid patp (point name). Patp field is invalid. Recieved ${props.patp}`, + ); + + if (props.icon === true) { + symbols = symbols.map((s: Ast) => { + return { + ...s, + children: s.children.filter((c: Ast) => c.attributes['dataisgeon']), + }; + }); + } + + const tier = symbols.length === 4 ? 4 : symbols.length === 2 ? 2 : 1; + + // get a grid according to the point's tier (planet, start, galaxy) + const grid = UNIT_GRIDS[tier]; + + // Move each symbol into it's new x/y position on a unit rectangle sized 256 by 256. + for (let i = 0; i < grid.length; i++) { + const positionTransform = toString(translate(grid[i].x, grid[i].y)); + if (symbols[i].attributes === undefined) { + symbols[i].attributes = {}; + } + symbols[i].attributes.transform = positionTransform; + } + + // Create a variable that will store a ratio used to scale the symbolsGroup to its final size driven primarily by props.size, or props.width fallback. + let resizeRatio; + + if (tier === 1) { + // If there is only 1 symbol being drawn + if (props.margin === true) { + // If this symbol will be drawn with a margin + resizeRatio = 0.5 * 0.8; + } else { + // If this symbol will be drawn without a margin + resizeRatio = 1; + } + } else { + // If the sigils is 2 symbols wide + if (props.margin === true) { + // If this symbol will be drawn with a margin + resizeRatio = 0.5 * 0.8; + } else { + // If this symbol will be drawn without a margin + resizeRatio = 0.5; + } + } + + // Calculate the size of each symbol - IE, for planets, there are four symbols. + const symbolSize = { + x: props.width * resizeRatio, + y: props.height * resizeRatio, + }; + + // Calculate the left and top margins that will be used to transform the symbolsGroup. + const marginPx = { + x: (props.width - TILEMAP[tier].x * symbolSize.x) / 2, + y: (props.height - TILEMAP[tier].y * symbolSize.y) / 2, + }; + + if (props.margin === false || props.icon === true) { + marginPx.x = 0; + if (props.icon !== true) { + marginPx.y = 0; + } + } + + // Calculate how much the symbolsGroups should change in scale. 128 is the unit size of the SVGs as drawn in their source file. + const symbolsGroupScale = symbolSize.x / 128; + + // First translate the symbols group to a centered x/y position, then scale the group to it's final size. + const scaleAndCenteringTransform = toString( + transform( + translate(marginPx.x, marginPx.y), + scale(symbolsGroupScale, symbolsGroupScale), + ), + ); + + // Create a SVG AST group and assign the transformation and child symbols to it. + const symbolsGroup = { + name: 'g', + type: '', + value: '', + attributes: { + transform: scaleAndCenteringTransform, + }, + children: symbols, + }; + + if (props.style === undefined) { + props.style = {}; + } + + if (props.style.width === undefined) { + props.style.width = `${props.width}px`; + } + + if (props.style.height === undefined) { + props.style.height = `${props.height}px`; + } + + const wrapped = { + name: 'svg', + type: '', + value: '', + attributes: { + style: { + // prevent bottom margin on svg tag + display: 'block', + ...props.style, + }, + viewBox: `0 0 ${props.width} ${props.height}`, + version: '1.1', + xmlns: 'http://www.w3.org/2000/svg', + class: props.class, + ...props.attributes, + }, + children: [ + // Background rectangle + { + name: 'rect', + type: '', + value: '', + attributes: { + fill: COLOR_CODES.BG, + width: `${props.width}px`, + height: `${props.height}px`, + x: 0 + 'px', + y: 0 + 'px', + }, + children: [], + }, + symbolsGroup, + ], + }; + + // Calculate a strokeWidth based on props.size + let strokeWidth; + + if (props.strokeScalingFunction) { + strokeWidth = props.strokeScalingFunction(props.size); + } else { + strokeWidth = props.width / 128 + 0.33; + } + + if (props.icon === true) { + strokeWidth = 0.8; + } + + // Recursively apply color and other style attributes. + const out = paint(wrapped, props.colors, strokeWidth); + + // If a renderer function has been provided, call this renderer with provided AST. If there is no renderer, return the AST. + return props.renderer === undefined ? out : props.renderer(out); +}; + +export { sigil, stringRenderer, reactRenderer, reactImageRenderer }; diff --git a/fe/src/ui/sigil-ts/lib.ts b/fe/src/ui/sigil-ts/lib.ts new file mode 100644 index 0000000..b27775b --- /dev/null +++ b/fe/src/ui/sigil-ts/lib.ts @@ -0,0 +1,17 @@ +const deepClone = (v: any) => JSON.parse(JSON.stringify(v)); + +const chunkStr = (str: string, size: number) => { + const r = new RegExp(`.{1,${size}}`, 'g'); + return str.match(r); +}; + +const compose = (...fns: Array) => { + return fns.reduce((f, g) => (...xs: any) => { + const r = g(...xs); + return Array.isArray(r) ? f(...r) : f(r); + }); +}; + +const isUndefined = (v: any) => typeof v === 'undefined'; + +export { deepClone, chunkStr, compose, isUndefined }; diff --git a/fe/src/ui/sigil-ts/reactImageRenderer.ts b/fe/src/ui/sigil-ts/reactImageRenderer.ts new file mode 100644 index 0000000..f67025d --- /dev/null +++ b/fe/src/ui/sigil-ts/reactImageRenderer.ts @@ -0,0 +1,24 @@ +import React from 'react'; +import stringRenderer from './stringRenderer'; +import { Ast } from './types'; + +const reactImageRenderer = (node: Ast) => { + let w; + let h; + + if (node.attributes.style) { + w = node.attributes.style.width || ''; + h = node.attributes.style.height || ''; + } + + return React.createElement('div', { + style: { + backgroundRepeat: 'no-repeat', + width: w, + height: h, + backgroundImage: `url(data:image/svg+xml;base64,${btoa(stringRenderer(node))})`, + }, + }); +}; + +export default reactImageRenderer; diff --git a/fe/src/ui/sigil-ts/reactRenderer.ts b/fe/src/ui/sigil-ts/reactRenderer.ts new file mode 100644 index 0000000..01b57c5 --- /dev/null +++ b/fe/src/ui/sigil-ts/reactRenderer.ts @@ -0,0 +1,21 @@ +import * as React from 'react'; +import { Ast } from './types'; + +const toCamelCase = (s: string) => s.replace(/-([a-z])/g, (g) => g[1].toUpperCase()); + +const attributesToProps = (o: {}) => + Object.entries(o).reduce((a, [k, v]) => { + if (k === 'class') k = 'className'; + return { ...a, [`${toCamelCase(k)}`]: v }; + }, {}); + +const reactRenderer = (node: Ast, i: string): JSX.Element => { + if (i === undefined) i = ''; + return React.createElement( + node.name, + { ...attributesToProps(node.attributes), key: `${i}` }, + node.children.map((child, j) => reactRenderer(child, `${i}:${j}`)), + ); +}; + +export default reactRenderer; diff --git a/fe/src/ui/sigil-ts/stringRenderer.ts b/fe/src/ui/sigil-ts/stringRenderer.ts new file mode 100644 index 0000000..c70a0de --- /dev/null +++ b/fe/src/ui/sigil-ts/stringRenderer.ts @@ -0,0 +1,10 @@ +// @ts-ignore +import { stringify } from 'svgson'; +import { Ast } from './types'; + +const stringRenderer = (ast: Ast) => { + if (ast.attributes.style !== undefined) delete ast.attributes.style; + return stringify(ast as any); +}; + +export default stringRenderer; diff --git a/fe/src/ui/sigil-ts/types.ts b/fe/src/ui/sigil-ts/types.ts new file mode 100644 index 0000000..06f0b57 --- /dev/null +++ b/fe/src/ui/sigil-ts/types.ts @@ -0,0 +1,54 @@ +export type Attributes = { + style?: { + [key: string]: string; + }; + version?: string; + class?: string; + width?: string; + height?: string; + viewBox?: string; + fill?: string; + xmlns?: string; + id?: string; + 'clip-path'?: string; + d?: string; + stroke?: string; + 'stroke-width'?: string; + x1?: string; + x2?: string; + y2?: string; + 'stroke-linecap'?: string; + cx?: string; + cy?: string; + r?: string; + x?: string; + y?: string; + transform?: string; + 'vector-effect'?: string; + dataisgeon?: string; +}; + +export type Ast = { + name: string; + type: string; + value: string; + attributes: Attributes; + children: Ast[]; +}; + +export type Config = { + patp: string; + colors?: [string, string]; + attributes?: Attributes; + style?: { + [key: string]: string; + }; + class?: string; + size?: number; + width?: number; + height?: number; + margin?: boolean; + strokeScalingFunction?: Function; + renderer?: Function; + icon?: boolean; +}; diff --git a/fe/src/ui/sign-up/CustomIcons.tsx b/fe/src/ui/sign-up/CustomIcons.tsx new file mode 100644 index 0000000..1c24a77 --- /dev/null +++ b/fe/src/ui/sign-up/CustomIcons.tsx @@ -0,0 +1,120 @@ +import * as React from 'react'; +import SvgIcon from '@mui/material/SvgIcon'; + +export function SitemarkIcon() { + return ( + + + + + + + + + + + + + ); +} + +export function FacebookIcon() { + return ( + + + + + + + + + + + + + ); +} + +export function GoogleIcon() { + return ( + + + + + + + + + ); +} diff --git a/fe/src/ui/sign-up/README.md b/fe/src/ui/sign-up/README.md new file mode 100644 index 0000000..aa89e29 --- /dev/null +++ b/fe/src/ui/sign-up/README.md @@ -0,0 +1,15 @@ +# Sign-up template + +## Usage + + + +1. Copy the files into your project, or one of the [example projects](https://github.com/mui/material-ui/tree/master/examples). +2. Make sure your project has the required dependencies: @mui/material, @mui/icons-material, @emotion/styled, @emotion/react. +3. Import and use the `SignUp` component. + +## Demo + + + +View the demo at https://mui.com/material-ui/getting-started/templates/sign-up/. diff --git a/fe/src/ui/sign-up/SignUp.tsx b/fe/src/ui/sign-up/SignUp.tsx new file mode 100644 index 0000000..858dcd1 --- /dev/null +++ b/fe/src/ui/sign-up/SignUp.tsx @@ -0,0 +1,259 @@ +import * as React from 'react'; +import Box from '@mui/material/Box'; +import Button from '@mui/material/Button'; +import Checkbox from '@mui/material/Checkbox'; +import CssBaseline from '@mui/material/CssBaseline'; +import Divider from '@mui/material/Divider'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import FormLabel from '@mui/material/FormLabel'; +import FormControl from '@mui/material/FormControl'; +import Link from '@mui/material/Link'; +import TextField from '@mui/material/TextField'; +import Typography from '@mui/material/Typography'; +import Stack from '@mui/material/Stack'; +import MuiCard from '@mui/material/Card'; +import { createTheme, ThemeProvider, styled, PaletteMode } from '@mui/material/styles'; +import getSignUpTheme from './theme/getSignUpTheme'; +import { GoogleIcon, FacebookIcon, SitemarkIcon } from './CustomIcons'; +import TemplateFrame from './TemplateFrame'; + +const Card = styled(MuiCard)(({ theme }) => ({ + display: 'flex', + flexDirection: 'column', + alignSelf: 'center', + width: '100%', + padding: theme.spacing(4), + gap: theme.spacing(2), + margin: 'auto', + boxShadow: + 'hsla(220, 30%, 5%, 0.05) 0px 5px 15px 0px, hsla(220, 25%, 10%, 0.05) 0px 15px 35px -5px', + [theme.breakpoints.up('sm')]: { + width: '450px', + }, + ...theme.applyStyles('dark', { + boxShadow: + 'hsla(220, 30%, 5%, 0.5) 0px 5px 15px 0px, hsla(220, 25%, 10%, 0.08) 0px 15px 35px -5px', + }), +})); + +const SignUpContainer = styled(Stack)(({ theme }) => ({ + minHeight: '100%', + padding: theme.spacing(2), + [theme.breakpoints.up('sm')]: { + padding: theme.spacing(4), + }, + backgroundImage: + 'radial-gradient(ellipse at 50% 50%, hsl(210, 100%, 97%), hsl(0, 0%, 100%))', + backgroundRepeat: 'no-repeat', + ...theme.applyStyles('dark', { + backgroundImage: + 'radial-gradient(at 50% 50%, hsla(210, 100%, 16%, 0.5), hsl(220, 30%, 5%))', + }), +})); + +export default function SignUp() { + const [mode, setMode] = React.useState('light'); + const [showCustomTheme, setShowCustomTheme] = React.useState(true); + const defaultTheme = createTheme({ palette: { mode } }); + const SignUpTheme = createTheme(getSignUpTheme(mode)); + const [nameError, setNameError] = React.useState(false); + const [nameErrorMessage, setNameErrorMessage] = React.useState(''); + const [emailError, setEmailError] = React.useState(false); + const [emailErrorMessage, setEmailErrorMessage] = React.useState(''); + const [passwordError, setPasswordError] = React.useState(false); + const [passwordErrorMessage, setPasswordErrorMessage] = React.useState(''); + // This code only runs on the client side, to determine the system color preference + React.useEffect(() => { + // Check if there is a preferred mode in localStorage + const savedMode = localStorage.getItem('themeMode') as PaletteMode | null; + if (savedMode) { + setMode(savedMode); + } else { + // If no preference is found, it uses system preference + const systemPrefersDark = window.matchMedia('(prefers-color-scheme: dark)').matches; + setMode(systemPrefersDark ? 'dark' : 'light'); + } + }, []); + + const toggleColorMode = () => { + const newMode = mode === 'dark' ? 'light' : 'dark'; + setMode(newMode); + localStorage.setItem('themeMode', newMode); // Save the selected mode to localStorage + }; + + const toggleCustomTheme = () => { + setShowCustomTheme((prev) => !prev); + }; + + const validateInputs = () => { + const email = document.getElementById('email') as HTMLInputElement; + const password = document.getElementById('password') as HTMLInputElement; + const name = document.getElementById('name') as HTMLInputElement; + + let isValid = true; + + if (!email.value || !/\S+@\S+\.\S+/.test(email.value)) { + setEmailError(true); + setEmailErrorMessage('Please enter a valid email address.'); + isValid = false; + } else { + setEmailError(false); + setEmailErrorMessage(''); + } + + if (!password.value || password.value.length < 6) { + setPasswordError(true); + setPasswordErrorMessage('Password must be at least 6 characters long.'); + isValid = false; + } else { + setPasswordError(false); + setPasswordErrorMessage(''); + } + + if (!name.value || name.value.length < 1) { + setNameError(true); + setNameErrorMessage('Name is required.'); + isValid = false; + } else { + setNameError(false); + setNameErrorMessage(''); + } + + return isValid; + }; + + const handleSubmit = (event: React.FormEvent) => { + if (nameError || emailError || passwordError) { + event.preventDefault(); + return; + } + const data = new FormData(event.currentTarget); + console.log({ + name: data.get('name'), + lastName: data.get('lastName'), + email: data.get('email'), + password: data.get('password'), + }); + }; + + return ( + + + + + + + + Sign up + + + + Full name + + + + Email + + + + Password + + + } + label="I want to receive updates via email." + /> + + + Already have an account?{' '} + + + Sign in + + + + + + or + + + + + + + + + + ); +} diff --git a/fe/src/ui/sign-up/TemplateFrame.tsx b/fe/src/ui/sign-up/TemplateFrame.tsx new file mode 100644 index 0000000..15f6cf5 --- /dev/null +++ b/fe/src/ui/sign-up/TemplateFrame.tsx @@ -0,0 +1,115 @@ +import * as React from 'react'; +import { + createTheme, + ThemeProvider, + PaletteMode, + styled, +} from '@mui/material/styles'; +import Select, { SelectChangeEvent } from '@mui/material/Select'; +import MenuItem from '@mui/material/MenuItem'; +import FormControl from '@mui/material/FormControl'; +import Button from '@mui/material/Button'; +import IconButton from '@mui/material/IconButton'; +import Box from '@mui/material/Box'; +import AppBar from '@mui/material/AppBar'; +import Toolbar from '@mui/material/Toolbar'; +import ArrowBackRoundedIcon from '@mui/icons-material/ArrowBackRounded'; +import ToggleColorMode from './ToggleColorMode'; +import getSignUpTheme from './theme/getSignUpTheme'; + +const StyledAppBar = styled(AppBar)(({ theme }) => ({ + position: 'relative', + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between', + flexShrink: 0, + borderBottom: '1px solid', + borderColor: theme.palette.divider, + backgroundColor: theme.palette.background.paper, + boxShadow: 'none', + backgroundImage: 'none', + zIndex: theme.zIndex.drawer + 1, + flex: '0 0 auto', +})); + +interface TemplateFrameProps { + showCustomTheme: boolean; + toggleCustomTheme: (theme: boolean) => void; + mode: PaletteMode; + toggleColorMode: () => void; + children: React.ReactNode; +} + +export default function TemplateFrame({ + showCustomTheme, + toggleCustomTheme, + mode, + toggleColorMode, + children, +}: TemplateFrameProps) { + const handleChange = (event: SelectChangeEvent) => { + toggleCustomTheme(event.target.value === 'custom'); + }; + const signUpTheme = createTheme(getSignUpTheme(mode)); + + return ( + + + + + + + + + + + + + + + + + {children} + + + ); +} diff --git a/fe/src/ui/sign-up/ToggleColorMode.tsx b/fe/src/ui/sign-up/ToggleColorMode.tsx new file mode 100644 index 0000000..1de6afc --- /dev/null +++ b/fe/src/ui/sign-up/ToggleColorMode.tsx @@ -0,0 +1,34 @@ +import * as React from 'react'; + +import { PaletteMode } from '@mui/material/styles'; +import IconButton, { IconButtonProps } from '@mui/material/IconButton'; + +import ModeNightRoundedIcon from '@mui/icons-material/ModeNightRounded'; +import WbSunnyRoundedIcon from '@mui/icons-material/WbSunnyRounded'; + +interface ToggleColorModeProps extends IconButtonProps { + mode: PaletteMode; + toggleColorMode: () => void; +} + +export default function ToggleColorMode({ + mode, + toggleColorMode, + ...props +}: ToggleColorModeProps) { + return ( + + {mode === 'dark' ? ( + + ) : ( + + )} + + ); +} diff --git a/fe/src/ui/sign-up/getSignUpTheme.tsx b/fe/src/ui/sign-up/getSignUpTheme.tsx new file mode 100644 index 0000000..76dfd82 --- /dev/null +++ b/fe/src/ui/sign-up/getSignUpTheme.tsx @@ -0,0 +1,720 @@ +import * as React from 'react'; +import type {} from '@mui/material/themeCssVarsAugmentation'; +import { createTheme, ThemeOptions, alpha, PaletteMode } from '@mui/material/styles'; + +import CheckBoxOutlineBlankRoundedIcon from '@mui/icons-material/CheckBoxOutlineBlankRounded'; +import CheckRoundedIcon from '@mui/icons-material/CheckRounded'; + +declare module '@mui/material/styles/createPalette' { + interface ColorRange { + 50: string; + 100: string; + 200: string; + 300: string; + 400: string; + 500: string; + 600: string; + 700: string; + 800: string; + 900: string; + } + + interface PaletteColor extends ColorRange {} +} + +const customTheme = createTheme(); + +export const brand = { + 50: 'hsl(210, 100%, 97%)', + 100: 'hsl(210, 100%, 90%)', + 200: 'hsl(210, 100%, 80%)', + 300: 'hsl(210, 100%, 65%)', + 400: 'hsl(210, 98%, 48%)', + 500: 'hsl(210, 98%, 42%)', + 600: 'hsl(210, 98%, 55%)', + 700: 'hsl(210, 100%, 35%)', + 800: 'hsl(210, 100%, 16%)', + 900: 'hsl(210, 100%, 21%)', +}; + +export const gray = { + 50: 'hsl(220, 60%, 99%)', + 100: 'hsl(220, 35%, 94%)', + 200: 'hsl(220, 35%, 88%)', + 300: 'hsl(220, 25%, 80%)', + 400: 'hsl(220, 20%, 65%)', + 500: 'hsl(220, 20%, 42%)', + 600: 'hsl(220, 25%, 35%)', + 700: 'hsl(220, 25%, 25%)', + 800: 'hsl(220, 25%, 10%)', + 900: 'hsl(220, 30%, 5%)', +}; + +export const green = { + 50: 'hsl(120, 80%, 98%)', + 100: 'hsl(120, 75%, 94%)', + 200: 'hsl(120, 75%, 87%)', + 300: 'hsl(120, 61%, 77%)', + 400: 'hsl(120, 44%, 53%)', + 500: 'hsl(120, 59%, 30%)', + 600: 'hsl(120, 70%, 25%)', + 700: 'hsl(120, 75%, 16%)', + 800: 'hsl(120, 84%, 10%)', + 900: 'hsl(120, 87%, 6%)', +}; + +export const orange = { + 50: 'hsl(45, 100%, 97%)', + 100: 'hsl(45, 92%, 90%)', + 200: 'hsl(45, 94%, 80%)', + 300: 'hsl(45, 90%, 65%)', + 400: 'hsl(45, 90%, 40%)', + 500: 'hsl(45, 90%, 35%)', + 600: 'hsl(45, 91%, 25%)', + 700: 'hsl(45, 94%, 20%)', + 800: 'hsl(45, 95%, 16%)', + 900: 'hsl(45, 93%, 12%)', +}; + +export const red = { + 50: 'hsl(0, 100%, 97%)', + 100: 'hsl(0, 92%, 90%)', + 200: 'hsl(0, 94%, 80%)', + 300: 'hsl(0, 90%, 65%)', + 400: 'hsl(0, 90%, 40%)', + 500: 'hsl(0, 90%, 30%)', + 600: 'hsl(0, 91%, 25%)', + 700: 'hsl(0, 94%, 20%)', + 800: 'hsl(0, 95%, 16%)', + 900: 'hsl(0, 93%, 12%)', +}; + +const getDesignTokens = (mode: PaletteMode) => ({ + palette: { + mode, + primary: { + light: brand[200], + main: brand[500], + dark: brand[800], + contrastText: brand[50], + ...(mode === 'dark' && { + contrastText: brand[100], + light: brand[300], + main: brand[400], + dark: brand[800], + }), + }, + warning: { + light: orange[300], + main: orange[400], + dark: orange[800], + ...(mode === 'dark' && { + light: orange[400], + main: orange[500], + dark: orange[700], + }), + }, + error: { + light: red[300], + main: red[400], + dark: red[800], + ...(mode === 'dark' && { + light: red[400], + main: red[500], + dark: red[700], + }), + }, + success: { + light: green[300], + main: green[400], + dark: green[800], + ...(mode === 'dark' && { + light: green[400], + main: green[500], + dark: green[700], + }), + }, + grey: { + ...gray, + }, + divider: mode === 'dark' ? alpha(gray[600], 0.3) : alpha(gray[300], 0.5), + background: { + default: 'hsl(0, 0%, 100%)', + paper: gray[100], + ...(mode === 'dark' && { default: 'hsl(220, 30%, 3%)', paper: gray[900] }), + }, + text: { + primary: gray[800], + secondary: gray[600], + ...(mode === 'dark' && { primary: 'hsl(0, 0%, 100%)', secondary: gray[400] }), + }, + action: { + selected: `${alpha(brand[200], 0.2)}`, + ...(mode === 'dark' && { + selected: alpha(brand[800], 0.2), + }), + }, + }, + typography: { + fontFamily: ['"Inter", "sans-serif"'].join(','), + h1: { + fontSize: customTheme.typography.pxToRem(60), + fontWeight: 600, + lineHeight: 1.2, + letterSpacing: -0.5, + }, + h2: { + fontSize: customTheme.typography.pxToRem(48), + fontWeight: 600, + lineHeight: 1.2, + }, + h3: { + fontSize: customTheme.typography.pxToRem(42), + lineHeight: 1.2, + }, + h4: { + fontSize: customTheme.typography.pxToRem(36), + fontWeight: 500, + lineHeight: 1.5, + }, + h5: { + fontSize: customTheme.typography.pxToRem(20), + fontWeight: 600, + }, + h6: { + fontSize: customTheme.typography.pxToRem(18), + }, + subtitle1: { + fontSize: customTheme.typography.pxToRem(18), + }, + subtitle2: { + fontSize: customTheme.typography.pxToRem(16), + }, + body1: { + fontSize: customTheme.typography.pxToRem(15), + fontWeight: 400, + }, + body2: { + fontSize: customTheme.typography.pxToRem(14), + fontWeight: 400, + }, + caption: { + fontSize: customTheme.typography.pxToRem(12), + fontWeight: 400, + }, + }, + shape: { + borderRadius: 12, + }, +}); + +export default function getSignUpTheme(mode: PaletteMode): ThemeOptions { + return { + ...getDesignTokens(mode), + components: { + MuiButtonBase: { + defaultProps: { + disableTouchRipple: true, + disableRipple: true, + }, + styleOverrides: { + root: { + boxSizing: 'border-box', + transition: 'all 100ms ease', + '&:focus-visible': { + outline: `3px solid ${alpha(brand[400], 0.5)}`, + outlineOffset: '2px', + }, + }, + }, + }, + MuiButton: { + styleOverrides: { + root: ({ theme }) => ({ + boxShadow: 'none', + borderRadius: theme.shape.borderRadius, + textTransform: 'none', + variants: [ + { + props: { + size: 'small', + }, + style: { + height: '2rem', // 32px + padding: '0 0.5rem', + }, + }, + { + props: { + size: 'medium', + }, + style: { + height: '2.5rem', // 40px + }, + }, + { + props: { + color: 'primary', + variant: 'contained', + }, + style: { + color: 'white', + backgroundColor: brand[300], + backgroundImage: `linear-gradient(to bottom, ${alpha(brand[400], 0.8)}, ${brand[500]})`, + boxShadow: `inset 0 2px 0 ${alpha(brand[200], 0.2)}, inset 0 -2px 0 ${alpha(brand[700], 0.4)}`, + border: `1px solid ${brand[500]}`, + '&:hover': { + backgroundColor: brand[700], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: brand[700], + boxShadow: `inset 0 2.5px 0 ${alpha(brand[700], 0.4)}`, + }, + }, + }, + { + props: { + variant: 'outlined', + }, + style: { + color: brand[700], + backgroundColor: alpha(brand[300], 0.1), + borderColor: alpha(brand[200], 0.8), + boxShadow: `inset 0 2px ${alpha(brand[50], 0.5)}, inset 0 -2px ${alpha(brand[200], 0.2)}`, + '&:hover': { + backgroundColor: alpha(brand[300], 0.2), + borderColor: alpha(brand[300], 0.5), + boxShadow: 'none', + }, + '&:active': { + backgroundColor: alpha(brand[300], 0.3), + boxShadow: `inset 0 2.5px 0 ${alpha(brand[400], 0.2)}`, + backgroundImage: 'none', + }, + ...theme.applyStyles('dark', { + color: brand[200], + backgroundColor: alpha(brand[600], 0.1), + borderColor: alpha(brand[600], 0.6), + boxShadow: `inset 0 2.5px ${alpha(brand[400], 0.1)}, inset 0 -2px ${alpha(gray[900], 0.5)}`, + '&:hover': { + backgroundColor: alpha(brand[700], 0.2), + borderColor: alpha(brand[700], 0.5), + boxShadow: 'none', + }, + '&:active': { + backgroundColor: alpha(brand[800], 0.2), + boxShadow: `inset 0 2.5px 0 ${alpha(brand[900], 0.4)}`, + backgroundImage: 'none', + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'outlined', + }, + style: { + backgroundColor: alpha(gray[300], 0.1), + borderColor: alpha(gray[300], 0.5), + color: gray[700], + '&:hover': { + backgroundColor: alpha(gray[300], 0.3), + borderColor: alpha(gray[300], 0.5), + boxShadow: 'none', + }, + '&:active': { + backgroundColor: alpha(gray[300], 0.4), + boxShadow: `inset 0 2.5px 0 ${alpha(gray[400], 0.2)}`, + backgroundImage: 'none', + }, + ...theme.applyStyles('dark', { + color: gray[300], + backgroundColor: alpha(gray[600], 0.1), + borderColor: alpha(gray[700], 0.5), + boxShadow: `inset 0 2.5px ${alpha(gray[600], 0.1)}, inset 0 -2px ${alpha(gray[900], 0.5)}`, + '&:hover': { + backgroundColor: alpha(gray[700], 0.2), + borderColor: alpha(gray[700], 0.5), + boxShadow: 'none', + }, + '&:active': { + backgroundColor: alpha(gray[800], 0.2), + boxShadow: `inset 0 2.5px 0 ${alpha(gray[900], 0.4)}`, + backgroundImage: 'none', + }, + }), + }, + }, + { + props: { + color: 'primary', + variant: 'text', + }, + style: { + color: brand[700], + '&:hover': { + backgroundColor: alpha(brand[300], 0.3), + }, + ...theme.applyStyles('dark', { + color: brand[200], + '&:hover': { + backgroundColor: alpha(brand[700], 0.3), + }, + }), + }, + }, + { + props: { + color: 'info', + variant: 'text', + }, + style: { + color: gray[700], + '&:hover': { + backgroundColor: alpha(gray[300], 0.3), + }, + ...theme.applyStyles('dark', { + color: gray[200], + '&:hover': { + backgroundColor: alpha(gray[700], 0.3), + }, + }), + }, + }, + ], + }), + }, + }, + MuiCard: { + styleOverrides: { + root: ({ theme }) => ({ + transition: 'all 100ms ease', + backgroundColor: gray[50], + borderRadius: theme.shape.borderRadius, + border: `1px solid ${alpha(gray[200], 0.5)}`, + boxShadow: 'none', + ...theme.applyStyles('dark', { + backgroundColor: alpha(gray[800], 0.6), + border: `1px solid ${alpha(gray[700], 0.3)}`, + }), + variants: [ + { + props: { + variant: 'outlined', + }, + style: { + border: `1px solid ${gray[200]}`, + boxShadow: 'none', + background: `linear-gradient(to bottom, hsl(0, 0%, 100%), ${gray[50]})`, + ...theme.applyStyles('dark', { + border: `1px solid ${alpha(gray[700], 0.4)}`, + boxShadow: 'none', + background: `linear-gradient(to bottom, ${gray[900]}, ${alpha( + gray[800], + 0.5, + )})`, + }), + }, + }, + ], + }), + }, + }, + MuiCheckbox: { + defaultProps: { + disableRipple: true, + icon: ( + + ), + checkedIcon: , + }, + styleOverrides: { + root: ({ theme }) => ({ + margin: 10, + height: 16, + width: 16, + borderRadius: 5, + border: '1px solid ', + borderColor: alpha(gray[300], 0.8), + backgroundColor: alpha(gray[100], 0.4), + boxShadow: '0 0 0 1.5px hsla(210, 0%, 0%, 0.04) inset', + transition: 'border-color, background-color, 120ms ease-in', + '&:hover': { + borderColor: gray[400], + }, + '&.Mui-focusVisible': { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + borderColor: brand[400], + }, + '&.Mui-checked': { + color: 'white', + backgroundColor: brand[500], + borderColor: brand[500], + boxShadow: `none`, + '&:hover': { + backgroundColor: brand[600], + }, + }, + ...theme.applyStyles('dark', { + borderColor: alpha(gray[700], 0.5), + boxShadow: '0 0 0 1.5px hsl(210, 0%, 0%) inset', + backgroundColor: alpha(gray[900], 0.8), + '&:hover': { + borderColor: brand[300], + }, + '&.Mui-focusVisible': { + borderColor: brand[400], + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + }, + }), + }), + }, + }, + MuiDialog: { + styleOverrides: { + root: ({ theme }) => ({ + '& .MuiDialog-paper': { + borderRadius: '10px', + border: '1px solid', + borderColor: theme.palette.divider, + }, + }), + }, + }, + MuiDivider: { + styleOverrides: { + root: ({ theme }) => ({ + borderColor: `${alpha(gray[200], 0.8)}`, + ...theme.applyStyles('dark', { + borderColor: `${alpha(gray[700], 0.4)}`, + }), + }), + }, + }, + MuiFormLabel: { + styleOverrides: { + root: ({ theme }) => ({ + typography: theme.typography.caption, + marginBottom: 8, + }), + }, + }, + MuiIconButton: { + styleOverrides: { + root: ({ theme }) => ({ + color: brand[500], + '&:hover': { + backgroundColor: alpha(brand[300], 0.3), + borderColor: brand[200], + }, + ...theme.applyStyles('dark', { + color: brand[200], + '&:hover': { + backgroundColor: alpha(brand[600], 0.3), + borderColor: brand[700], + }, + }), + variants: [ + { + props: { + size: 'small', + }, + style: { + height: '2rem', + width: '2rem', + }, + }, + { + props: { + size: 'medium', + }, + style: { + height: '2.5rem', + width: '2.5rem', + }, + }, + ], + }), + }, + }, + MuiInputBase: { + styleOverrides: { + root: { + border: 'none', + }, + }, + }, + MuiLink: { + defaultProps: { + underline: 'none', + }, + styleOverrides: { + root: ({ theme }) => ({ + color: brand[700], + fontWeight: 500, + position: 'relative', + textDecoration: 'none', + '&::before': { + content: '""', + position: 'absolute', + width: 0, + height: '1px', + bottom: 0, + left: 0, + backgroundColor: brand[200], + opacity: 0.7, + transition: 'width 0.3s ease, opacity 0.3s ease', + }, + '&:hover::before': { + width: '100%', + opacity: 1, + }, + '&:focus-visible': { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '4px', + borderRadius: '2px', + }, + ...theme.applyStyles('dark', { + color: brand[200], + }), + }), + }, + }, + MuiOutlinedInput: { + styleOverrides: { + notchedOutline: { + border: 'none', + }, + input: { + paddingLeft: 10, + }, + root: ({ theme }) => ({ + 'input:-webkit-autofill': { + WebkitBoxShadow: `0 0 0 1000px ${brand[100]} inset, 0 0 0 1px ${brand[200]}`, + maxHeight: '4px', + borderRadius: '8px', + }, + '& .MuiInputBase-input': { + fontSize: '1rem', + '&::placeholder': { + opacity: 0.7, + color: gray[500], + }, + }, + boxSizing: 'border-box', + flexGrow: 1, + height: '40px', + borderRadius: theme.shape.borderRadius, + border: '1px solid', + borderColor: alpha(gray[300], 0.8), + boxShadow: '0 0 0 1.5px hsla(210, 0%, 0%, 0.02) inset', + transition: 'border-color 120ms ease-in', + backgroundColor: alpha(gray[100], 0.4), + '&:hover': { + borderColor: brand[300], + }, + '&.Mui-focused': { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + borderColor: brand[400], + }, + ...theme.applyStyles('dark', { + 'input:-webkit-autofill': { + WebkitBoxShadow: `0 0 0 1000px ${brand[900]} inset, 0 0 0 1px ${brand[600]}`, + maxHeight: '6px', + borderRadius: '8px', + }, + '& .MuiInputBase-input': { + fontSize: '1rem', + '&::placeholder': { + opacity: 1, + color: gray[500], + }, + }, + borderColor: alpha(gray[700], 0.5), + boxShadow: '0 0 0 1.5px hsl(210, 0%, 0%) inset', + backgroundColor: alpha(gray[900], 0.8), + transition: 'border-color 120ms ease-in', + '&:hover': { + borderColor: brand[300], + }, + '&.Mui-focused': { + borderColor: brand[400], + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + }, + }), + variants: [ + { + props: { + color: 'error', + }, + style: { + borderColor: red[200], + color: red[500], + '& + .MuiFormHelperText-root': { + color: red[500], + }, + ...theme.applyStyles('dark', { + borderColor: red[700], + color: red[300], + '& + .MuiFormHelperText-root': { + color: red[300], + }, + }), + }, + }, + ], + }), + }, + }, + MuiPaper: { + defaultProps: { + elevation: 0, + }, + }, + MuiStack: { + defaultProps: { + useFlexGap: true, + }, + }, + MuiToggleButtonGroup: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: theme.shape.borderRadius, + boxShadow: `0 1px 2px hsla(210, 0%, 0%, 0.05), 0 2px 12px ${alpha(brand[200], 0.5)}`, + '& .Mui-selected': { + color: brand[500], + }, + ...theme.applyStyles('dark', { + '& .Mui-selected': { + color: 'hsl(0, 0%, 100%)', + }, + boxShadow: `0 0 0 1px hsla(210, 0%, 0%, 0.5), 0 2px 12px ${alpha(brand[700], 0.5)}`, + }), + }), + }, + }, + MuiToggleButton: { + styleOverrides: { + root: ({ theme }) => ({ + padding: '12px 16px', + textTransform: 'none', + borderRadius: theme.shape.borderRadius, + fontWeight: 500, + ...theme.applyStyles('dark', { + color: gray[400], + '&.Mui-selected': { color: brand[300] }, + }), + }), + }, + }, + }, + }; +} diff --git a/fe/src/ui/sign-up/theme/customizations/dataDisplay.tsx b/fe/src/ui/sign-up/theme/customizations/dataDisplay.tsx new file mode 100644 index 0000000..c93ccbf --- /dev/null +++ b/fe/src/ui/sign-up/theme/customizations/dataDisplay.tsx @@ -0,0 +1,233 @@ +import { Theme, alpha, Components } from '@mui/material/styles'; +import { svgIconClasses } from '@mui/material/SvgIcon'; +import { typographyClasses } from '@mui/material/Typography'; +import { buttonBaseClasses } from '@mui/material/ButtonBase'; +import { chipClasses } from '@mui/material/Chip'; +import { iconButtonClasses } from '@mui/material/IconButton'; +import { gray, red, green } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const dataDisplayCustomizations: Components = { + MuiList: { + styleOverrides: { + root: { + padding: '8px', + display: 'flex', + flexDirection: 'column', + gap: 0, + }, + }, + }, + MuiListItem: { + styleOverrides: { + root: ({ theme }) => ({ + [`& .${svgIconClasses.root}`]: { + width: '1rem', + height: '1rem', + color: theme.palette.text.secondary, + }, + [`& .${typographyClasses.root}`]: { + fontWeight: 500, + }, + [`& .${buttonBaseClasses.root}`]: { + display: 'flex', + gap: 8, + padding: '2px 8px', + borderRadius: theme.shape.borderRadius, + opacity: 0.7, + '&.Mui-selected': { + opacity: 1, + backgroundColor: alpha(theme.palette.action.selected, 0.3), + [`& .${svgIconClasses.root}`]: { + color: theme.palette.text.primary, + }, + '&:focus-visible': { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + '&:hover': { + backgroundColor: alpha(theme.palette.action.selected, 0.5), + }, + }, + '&:focus-visible': { + backgroundColor: 'transparent', + }, + }, + }), + }, + }, + MuiListItemText: { + styleOverrides: { + primary: ({ theme }) => ({ + fontSize: theme.typography.body2.fontSize, + fontWeight: 500, + lineHeight: theme.typography.body2.lineHeight, + }), + secondary: ({ theme }) => ({ + fontSize: theme.typography.caption.fontSize, + lineHeight: theme.typography.caption.lineHeight, + }), + }, + }, + MuiListSubheader: { + styleOverrides: { + root: ({ theme }) => ({ + backgroundColor: 'transparent', + padding: '4px 8px', + fontSize: theme.typography.caption.fontSize, + fontWeight: 500, + lineHeight: theme.typography.caption.lineHeight, + }), + }, + }, + MuiListItemIcon: { + styleOverrides: { + root: { + minWidth: 0, + }, + }, + }, + MuiChip: { + defaultProps: { + size: 'small', + }, + styleOverrides: { + root: ({ theme }) => ({ + border: '1px solid', + borderRadius: '999px', + [`& .${chipClasses.label}`]: { + fontWeight: 600, + }, + variants: [ + { + props: { + color: 'default', + }, + style: { + borderColor: gray[200], + backgroundColor: gray[100], + [`& .${chipClasses.label}`]: { + color: gray[500], + }, + [`& .${chipClasses.icon}`]: { + color: gray[500], + }, + ...theme.applyStyles('dark', { + borderColor: gray[700], + backgroundColor: gray[800], + [`& .${chipClasses.label}`]: { + color: gray[300], + }, + [`& .${chipClasses.icon}`]: { + color: gray[300], + }, + }), + }, + }, + { + props: { + color: 'success', + }, + style: { + borderColor: green[200], + backgroundColor: green[50], + [`& .${chipClasses.label}`]: { + color: green[500], + }, + [`& .${chipClasses.icon}`]: { + color: green[500], + }, + ...theme.applyStyles('dark', { + borderColor: green[800], + backgroundColor: green[900], + [`& .${chipClasses.label}`]: { + color: green[300], + }, + [`& .${chipClasses.icon}`]: { + color: green[300], + }, + }), + }, + }, + { + props: { + color: 'error', + }, + style: { + borderColor: red[100], + backgroundColor: red[50], + [`& .${chipClasses.label}`]: { + color: red[500], + }, + [`& .${chipClasses.icon}`]: { + color: red[500], + }, + ...theme.applyStyles('dark', { + borderColor: red[800], + backgroundColor: red[900], + [`& .${chipClasses.label}`]: { + color: red[200], + }, + [`& .${chipClasses.icon}`]: { + color: red[300], + }, + }), + }, + }, + { + props: { size: 'small' }, + style: { + maxHeight: 20, + [`& .${chipClasses.label}`]: { + fontSize: theme.typography.caption.fontSize, + }, + [`& .${svgIconClasses.root}`]: { + fontSize: theme.typography.caption.fontSize, + }, + }, + }, + { + props: { size: 'medium' }, + style: { + [`& .${chipClasses.label}`]: { + fontSize: theme.typography.caption.fontSize, + }, + }, + }, + ], + }), + }, + }, + MuiTablePagination: { + styleOverrides: { + actions: { + display: 'flex', + gap: 8, + marginRight: 6, + [`& .${iconButtonClasses.root}`]: { + minWidth: 0, + width: 36, + height: 36, + }, + }, + }, + }, + MuiIcon: { + defaultProps: { + fontSize: 'small', + }, + styleOverrides: { + root: { + variants: [ + { + props: { + fontSize: 'small', + }, + style: { + fontSize: '1rem', + }, + }, + ], + }, + }, + }, +}; diff --git a/fe/src/ui/sign-up/theme/customizations/feedback.tsx b/fe/src/ui/sign-up/theme/customizations/feedback.tsx new file mode 100644 index 0000000..aaf0000 --- /dev/null +++ b/fe/src/ui/sign-up/theme/customizations/feedback.tsx @@ -0,0 +1,46 @@ +import { Theme, alpha, Components } from '@mui/material/styles'; +import { gray, orange } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const feedbackCustomizations: Components = { + MuiAlert: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: 10, + backgroundColor: orange[100], + color: theme.palette.text.primary, + border: `1px solid ${alpha(orange[300], 0.5)}`, + '& .MuiAlert-icon': { + color: orange[500], + }, + ...theme.applyStyles('dark', { + backgroundColor: `${alpha(orange[900], 0.5)}`, + border: `1px solid ${alpha(orange[800], 0.5)}`, + }), + }), + }, + }, + MuiDialog: { + styleOverrides: { + root: ({ theme }) => ({ + '& .MuiDialog-paper': { + borderRadius: '10px', + border: '1px solid', + borderColor: theme.palette.divider, + }, + }), + }, + }, + MuiLinearProgress: { + styleOverrides: { + root: ({ theme }) => ({ + height: 8, + borderRadius: 8, + backgroundColor: gray[200], + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + }), + }), + }, + }, +}; diff --git a/fe/src/ui/sign-up/theme/customizations/index.ts b/fe/src/ui/sign-up/theme/customizations/index.ts new file mode 100644 index 0000000..91a4485 --- /dev/null +++ b/fe/src/ui/sign-up/theme/customizations/index.ts @@ -0,0 +1,5 @@ +export { inputsCustomizations } from './inputs'; +export { dataDisplayCustomizations } from './dataDisplay'; +export { feedbackCustomizations } from './feedback'; +export { navigationCustomizations } from './navigation'; +export { surfacesCustomizations } from './surfaces'; diff --git a/fe/src/ui/sign-up/theme/customizations/inputs.tsx b/fe/src/ui/sign-up/theme/customizations/inputs.tsx new file mode 100644 index 0000000..4be4c18 --- /dev/null +++ b/fe/src/ui/sign-up/theme/customizations/inputs.tsx @@ -0,0 +1,445 @@ +import * as React from 'react'; +import { alpha, Theme, Components } from '@mui/material/styles'; +import { outlinedInputClasses } from '@mui/material/OutlinedInput'; +import { svgIconClasses } from '@mui/material/SvgIcon'; +import { toggleButtonGroupClasses } from '@mui/material/ToggleButtonGroup'; +import { toggleButtonClasses } from '@mui/material/ToggleButton'; +import CheckBoxOutlineBlankRoundedIcon from '@mui/icons-material/CheckBoxOutlineBlankRounded'; +import CheckRoundedIcon from '@mui/icons-material/CheckRounded'; +import RemoveRoundedIcon from '@mui/icons-material/RemoveRounded'; +import { gray, brand } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const inputsCustomizations: Components = { + MuiButtonBase: { + defaultProps: { + disableTouchRipple: true, + disableRipple: true, + }, + styleOverrides: { + root: ({ theme }) => ({ + boxSizing: 'border-box', + transition: 'all 100ms ease-in', + '&:focus-visible': { + outline: `3px solid ${alpha(theme.palette.primary.main, 0.5)}`, + outlineOffset: '2px', + }, + }), + }, + }, + MuiButton: { + styleOverrides: { + root: ({ theme }) => ({ + boxShadow: 'none', + borderRadius: theme.shape.borderRadius, + textTransform: 'none', + variants: [ + { + props: { + size: 'small', + }, + style: { + height: '2.25rem', + padding: '8px 12px', + }, + }, + { + props: { + size: 'medium', + }, + style: { + height: '2.5rem', // 40px + }, + }, + { + props: { + color: 'primary', + variant: 'contained', + }, + style: { + color: 'white', + backgroundColor: gray[900], + backgroundImage: `linear-gradient(to bottom, ${gray[700]}, ${gray[800]})`, + boxShadow: `inset 0 1px 0 ${gray[600]}, inset 0 -1px 0 1px hsl(220, 0%, 0%)`, + border: `1px solid ${gray[700]}`, + '&:hover': { + backgroundImage: 'none', + backgroundColor: gray[700], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: gray[800], + }, + ...theme.applyStyles('dark', { + color: 'black', + backgroundColor: gray[50], + backgroundImage: `linear-gradient(to bottom, ${gray[100]}, ${gray[50]})`, + boxShadow: 'inset 0 -1px 0 hsl(220, 30%, 80%)', + border: `1px solid ${gray[50]}`, + '&:hover': { + backgroundImage: 'none', + backgroundColor: gray[300], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: gray[400], + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'contained', + }, + style: { + color: 'white', + backgroundColor: brand[300], + backgroundImage: `linear-gradient(to bottom, ${alpha(brand[400], 0.8)}, ${brand[500]})`, + boxShadow: `inset 0 2px 0 ${alpha(brand[200], 0.2)}, inset 0 -2px 0 ${alpha(brand[700], 0.4)}`, + border: `1px solid ${brand[500]}`, + '&:hover': { + backgroundColor: brand[700], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: brand[700], + backgroundImage: 'none', + }, + }, + }, + { + props: { + variant: 'outlined', + }, + style: { + color: theme.palette.text.primary, + border: '1px solid', + borderColor: gray[200], + backgroundColor: alpha(gray[50], 0.3), + '&:hover': { + backgroundColor: gray[100], + borderColor: gray[300], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + borderColor: gray[700], + + '&:hover': { + backgroundColor: gray[900], + borderColor: gray[600], + }, + '&:active': { + backgroundColor: gray[900], + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'outlined', + }, + style: { + color: brand[700], + border: '1px solid', + borderColor: brand[200], + backgroundColor: brand[50], + '&:hover': { + backgroundColor: brand[100], + borderColor: brand[400], + }, + '&:active': { + backgroundColor: alpha(brand[200], 0.7), + }, + ...theme.applyStyles('dark', { + color: brand[50], + border: '1px solid', + borderColor: brand[900], + backgroundColor: alpha(brand[900], 0.3), + '&:hover': { + borderColor: brand[700], + backgroundColor: alpha(brand[900], 0.6), + }, + '&:active': { + backgroundColor: alpha(brand[900], 0.5), + }, + }), + }, + }, + { + props: { + variant: 'text', + }, + style: { + color: gray[600], + '&:hover': { + backgroundColor: gray[100], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + color: gray[50], + '&:hover': { + backgroundColor: gray[700], + }, + '&:active': { + backgroundColor: alpha(gray[700], 0.7), + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'text', + }, + style: { + color: brand[700], + '&:hover': { + backgroundColor: alpha(brand[100], 0.5), + }, + '&:active': { + backgroundColor: alpha(brand[200], 0.7), + }, + ...theme.applyStyles('dark', { + color: brand[100], + '&:hover': { + backgroundColor: alpha(brand[900], 0.5), + }, + '&:active': { + backgroundColor: alpha(brand[900], 0.3), + }, + }), + }, + }, + ], + }), + }, + }, + MuiIconButton: { + styleOverrides: { + root: ({ theme }) => ({ + boxShadow: 'none', + borderRadius: theme.shape.borderRadius, + textTransform: 'none', + fontWeight: theme.typography.fontWeightMedium, + letterSpacing: 0, + color: theme.palette.text.primary, + border: '1px solid ', + borderColor: gray[200], + backgroundColor: alpha(gray[50], 0.3), + '&:hover': { + backgroundColor: gray[100], + borderColor: gray[300], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + borderColor: gray[700], + '&:hover': { + backgroundColor: gray[900], + borderColor: gray[600], + }, + '&:active': { + backgroundColor: gray[900], + }, + }), + variants: [ + { + props: { + size: 'small', + }, + style: { + width: '2.25rem', + height: '2.25rem', + padding: '0.25rem', + [`& .${svgIconClasses.root}`]: { fontSize: '1rem' }, + }, + }, + { + props: { + size: 'medium', + }, + style: { + width: '2.5rem', + height: '2.5rem', + }, + }, + ], + }), + }, + }, + MuiToggleButtonGroup: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: '10px', + boxShadow: `0 4px 16px ${alpha(gray[400], 0.2)}`, + [`& .${toggleButtonGroupClasses.selected}`]: { + color: brand[500], + }, + ...theme.applyStyles('dark', { + [`& .${toggleButtonGroupClasses.selected}`]: { + color: '#fff', + }, + boxShadow: `0 4px 16px ${alpha(brand[700], 0.5)}`, + }), + }), + }, + }, + MuiToggleButton: { + styleOverrides: { + root: ({ theme }) => ({ + padding: '12px 16px', + textTransform: 'none', + borderRadius: '10px', + fontWeight: 500, + ...theme.applyStyles('dark', { + color: gray[400], + boxShadow: '0 4px 16px rgba(0, 0, 0, 0.5)', + [`&.${toggleButtonClasses.selected}`]: { + color: brand[300], + }, + }), + }), + }, + }, + MuiCheckbox: { + defaultProps: { + disableRipple: true, + icon: ( + + ), + checkedIcon: , + indeterminateIcon: , + }, + styleOverrides: { + root: ({ theme }) => ({ + margin: 10, + height: 16, + width: 16, + borderRadius: 5, + border: '1px solid ', + borderColor: alpha(gray[300], 0.8), + boxShadow: '0 0 0 1.5px hsla(210, 0%, 0%, 0.04) inset', + backgroundColor: alpha(gray[100], 0.4), + transition: 'border-color, background-color, 120ms ease-in', + '&:hover': { + borderColor: brand[300], + }, + '&.Mui-focusVisible': { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + borderColor: brand[400], + }, + '&.Mui-checked': { + color: 'white', + backgroundColor: brand[500], + borderColor: brand[500], + boxShadow: `none`, + '&:hover': { + backgroundColor: brand[600], + }, + }, + ...theme.applyStyles('dark', { + borderColor: alpha(gray[700], 0.8), + boxShadow: '0 0 0 1.5px hsl(210, 0%, 0%) inset', + backgroundColor: alpha(gray[900], 0.8), + '&:hover': { + borderColor: brand[300], + }, + '&.Mui-focusVisible': { + borderColor: brand[400], + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + }, + }), + }), + }, + }, + MuiInputBase: { + styleOverrides: { + root: { + border: 'none', + }, + input: { + '&::placeholder': { + opacity: 0.7, + color: gray[500], + }, + }, + }, + }, + MuiOutlinedInput: { + styleOverrides: { + input: { + padding: 0, + }, + root: ({ theme }) => ({ + padding: '8px 12px', + color: theme.palette.text.primary, + borderRadius: theme.shape.borderRadius, + border: `1px solid ${theme.palette.divider}`, + backgroundColor: theme.palette.background.default, + transition: 'border 120ms ease-in', + '&:hover': { + borderColor: gray[400], + }, + [`&.${outlinedInputClasses.focused}`]: { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + borderColor: brand[400], + }, + ...theme.applyStyles('dark', { + '&:hover': { + borderColor: gray[500], + }, + }), + variants: [ + { + props: { + size: 'small', + }, + style: { + height: '2.25rem', + }, + }, + { + props: { + size: 'medium', + }, + style: { + height: '2.5rem', + }, + }, + ], + }), + notchedOutline: { + border: 'none', + }, + }, + }, + MuiInputAdornment: { + styleOverrides: { + root: ({ theme }) => ({ + color: theme.palette.grey[500], + ...theme.applyStyles('dark', { + color: theme.palette.grey[400], + }), + }), + }, + }, + MuiFormLabel: { + styleOverrides: { + root: ({ theme }) => ({ + typography: theme.typography.caption, + marginBottom: 8, + }), + }, + }, +}; diff --git a/fe/src/ui/sign-up/theme/customizations/navigation.tsx b/fe/src/ui/sign-up/theme/customizations/navigation.tsx new file mode 100644 index 0000000..f6b92e5 --- /dev/null +++ b/fe/src/ui/sign-up/theme/customizations/navigation.tsx @@ -0,0 +1,279 @@ +import * as React from 'react'; +import { Theme, alpha, Components } from '@mui/material/styles'; +import { SvgIconProps } from '@mui/material/SvgIcon'; +import { buttonBaseClasses } from '@mui/material/ButtonBase'; +import { dividerClasses } from '@mui/material/Divider'; +import { menuItemClasses } from '@mui/material/MenuItem'; +import { selectClasses } from '@mui/material/Select'; +import { tabClasses } from '@mui/material/Tab'; +import UnfoldMoreRoundedIcon from '@mui/icons-material/UnfoldMoreRounded'; +import { gray, brand } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const navigationCustomizations: Components = { + MuiMenuItem: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: theme.shape.borderRadius, + padding: '6px 8px', + [`&.${menuItemClasses.focusVisible}`]: { + backgroundColor: 'transparent', + }, + [`&.${menuItemClasses.selected}`]: { + [`&.${menuItemClasses.focusVisible}`]: { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + }, + }), + }, + }, + MuiMenu: { + styleOverrides: { + list: { + gap: '0px', + [`&.${dividerClasses.root}`]: { + margin: '0 -8px', + }, + }, + paper: ({ theme }) => ({ + marginTop: '4px', + borderRadius: theme.shape.borderRadius, + border: `1px solid ${theme.palette.divider}`, + backgroundImage: 'none', + background: 'hsl(0, 0%, 100%)', + boxShadow: + 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px', + [`& .${buttonBaseClasses.root}`]: { + '&.Mui-selected': { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + }, + ...theme.applyStyles('dark', { + background: gray[900], + boxShadow: + 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px', + }), + }), + }, + }, + MuiSelect: { + defaultProps: { + IconComponent: React.forwardRef((props, ref) => ( + + )), + }, + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: theme.shape.borderRadius, + border: '1px solid', + borderColor: gray[200], + backgroundColor: theme.palette.background.paper, + boxShadow: `inset 0 1px 0 1px hsla(220, 0%, 100%, 0.6), inset 0 -1px 0 1px hsla(220, 35%, 90%, 0.5)`, + '&:hover': { + borderColor: gray[300], + backgroundColor: theme.palette.background.paper, + boxShadow: 'none', + }, + [`&.${selectClasses.focused}`]: { + outlineOffset: 0, + borderColor: gray[400], + }, + '&:before, &:after': { + display: 'none', + }, + + ...theme.applyStyles('dark', { + borderRadius: theme.shape.borderRadius, + borderColor: gray[700], + backgroundColor: theme.palette.background.paper, + boxShadow: `inset 0 1px 0 1px ${alpha(gray[700], 0.15)}, inset 0 -1px 0 1px hsla(220, 0%, 0%, 0.7)`, + '&:hover': { + borderColor: alpha(gray[700], 0.7), + backgroundColor: theme.palette.background.paper, + boxShadow: 'none', + }, + [`&.${selectClasses.focused}`]: { + outlineOffset: 0, + borderColor: gray[900], + }, + '&:before, &:after': { + display: 'none', + }, + }), + }), + select: ({ theme }) => ({ + display: 'flex', + alignItems: 'center', + ...theme.applyStyles('dark', { + display: 'flex', + alignItems: 'center', + '&:focus-visible': { + backgroundColor: gray[900], + }, + }), + }), + }, + }, + MuiLink: { + defaultProps: { + underline: 'none', + }, + styleOverrides: { + root: ({ theme }) => ({ + color: theme.palette.text.primary, + fontWeight: 500, + position: 'relative', + textDecoration: 'none', + width: 'fit-content', + '&::before': { + content: '""', + position: 'absolute', + width: '100%', + height: '1px', + bottom: 0, + left: 0, + backgroundColor: theme.palette.text.secondary, + opacity: 0.3, + transition: 'width 0.3s ease, opacity 0.3s ease', + }, + '&:hover::before': { + width: 0, + }, + '&:focus-visible': { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '4px', + borderRadius: '2px', + }, + }), + }, + }, + MuiDrawer: { + styleOverrides: { + paper: ({ theme }) => ({ + backgroundColor: theme.palette.background.default, + }), + }, + }, + MuiPaginationItem: { + styleOverrides: { + root: ({ theme }) => ({ + '&.Mui-selected': { + color: 'white', + backgroundColor: theme.palette.grey[900], + }, + ...theme.applyStyles('dark', { + '&.Mui-selected': { + color: 'black', + backgroundColor: theme.palette.grey[50], + }, + }), + }), + }, + }, + MuiTabs: { + styleOverrides: { + root: { minHeight: 'fit-content' }, + indicator: ({ theme }) => ({ + backgroundColor: theme.palette.grey[800], + ...theme.applyStyles('dark', { + backgroundColor: theme.palette.grey[200], + }), + }), + }, + }, + MuiTab: { + styleOverrides: { + root: ({ theme }) => ({ + padding: '6px 8px', + marginBottom: '8px', + textTransform: 'none', + minWidth: 'fit-content', + minHeight: 'fit-content', + color: theme.palette.text.secondary, + borderRadius: theme.shape.borderRadius, + border: '1px solid', + borderColor: 'transparent', + ':hover': { + color: theme.palette.text.primary, + backgroundColor: gray[100], + borderColor: gray[200], + }, + [`&.${tabClasses.selected}`]: { + color: gray[900], + }, + ...theme.applyStyles('dark', { + ':hover': { + color: theme.palette.text.primary, + backgroundColor: gray[800], + borderColor: gray[700], + }, + [`&.${tabClasses.selected}`]: { + color: '#fff', + }, + }), + }), + }, + }, + MuiStepConnector: { + styleOverrides: { + line: ({ theme }) => ({ + borderTop: '1px solid', + borderColor: theme.palette.divider, + flex: 1, + borderRadius: '99px', + }), + }, + }, + MuiStepIcon: { + styleOverrides: { + root: ({ theme }) => ({ + color: 'transparent', + border: `1px solid ${gray[400]}`, + width: 12, + height: 12, + borderRadius: '50%', + '& text': { + display: 'none', + }, + '&.Mui-active': { + border: 'none', + color: theme.palette.primary.main, + }, + '&.Mui-completed': { + border: 'none', + color: theme.palette.success.main, + }, + ...theme.applyStyles('dark', { + border: `1px solid ${gray[700]}`, + '&.Mui-active': { + border: 'none', + color: theme.palette.primary.light, + }, + '&.Mui-completed': { + border: 'none', + color: theme.palette.success.light, + }, + }), + variants: [ + { + props: { completed: true }, + style: { + width: 12, + height: 12, + }, + }, + ], + }), + }, + }, + MuiStepLabel: { + styleOverrides: { + label: ({ theme }) => ({ + '&.Mui-completed': { + opacity: 0.6, + ...theme.applyStyles('dark', { opacity: 0.5 }), + }, + }), + }, + }, +}; diff --git a/fe/src/ui/sign-up/theme/customizations/surfaces.ts b/fe/src/ui/sign-up/theme/customizations/surfaces.ts new file mode 100644 index 0000000..5bcdfc5 --- /dev/null +++ b/fe/src/ui/sign-up/theme/customizations/surfaces.ts @@ -0,0 +1,113 @@ +import { alpha, Theme, Components } from '@mui/material/styles'; +import { gray } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const surfacesCustomizations: Components = { + MuiAccordion: { + defaultProps: { + elevation: 0, + disableGutters: true, + }, + styleOverrides: { + root: ({ theme }) => ({ + padding: 4, + overflow: 'clip', + backgroundColor: theme.palette.background.default, + border: '1px solid', + borderColor: theme.palette.divider, + ':before': { + backgroundColor: 'transparent', + }, + '&:not(:last-of-type)': { + borderBottom: 'none', + }, + '&:first-of-type': { + borderTopLeftRadius: theme.shape.borderRadius, + borderTopRightRadius: theme.shape.borderRadius, + }, + '&:last-of-type': { + borderBottomLeftRadius: theme.shape.borderRadius, + borderBottomRightRadius: theme.shape.borderRadius, + }, + }), + }, + }, + MuiAccordionSummary: { + styleOverrides: { + root: ({ theme }) => ({ + border: 'none', + borderRadius: 8, + '&:hover': { backgroundColor: gray[50] }, + '&:focus-visible': { backgroundColor: 'transparent' }, + ...theme.applyStyles('dark', { + '&:hover': { backgroundColor: gray[800] }, + }), + }), + }, + }, + MuiAccordionDetails: { + styleOverrides: { + root: { mb: 20, border: 'none' }, + }, + }, + MuiPaper: { + defaultProps: { + elevation: 0, + }, + }, + MuiCard: { + styleOverrides: { + root: ({ theme }) => { + return { + padding: 16, + gap: 16, + transition: 'all 100ms ease', + backgroundColor: gray[50], + borderRadius: theme.shape.borderRadius, + border: `1px solid ${theme.palette.divider}`, + boxShadow: 'none', + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + }), + variants: [ + { + props: { + variant: 'outlined', + }, + style: { + border: `1px solid ${theme.palette.divider}`, + boxShadow: 'none', + background: 'hsl(0, 0%, 100%)', + ...theme.applyStyles('dark', { + background: alpha(gray[900], 0.4), + }), + }, + }, + ], + }; + }, + }, + }, + MuiCardContent: { + styleOverrides: { + root: { + padding: 0, + '&:last-child': { paddingBottom: 0 }, + }, + }, + }, + MuiCardHeader: { + styleOverrides: { + root: { + padding: 0, + }, + }, + }, + MuiCardActions: { + styleOverrides: { + root: { + padding: 0, + }, + }, + }, +}; diff --git a/fe/src/ui/sign-up/theme/getSignUpTheme.tsx b/fe/src/ui/sign-up/theme/getSignUpTheme.tsx new file mode 100644 index 0000000..514832b --- /dev/null +++ b/fe/src/ui/sign-up/theme/getSignUpTheme.tsx @@ -0,0 +1,23 @@ +import type {} from '@mui/material/themeCssVarsAugmentation'; +import { ThemeOptions, PaletteMode } from '@mui/material/styles'; +import { getDesignTokens } from './themePrimitives'; +import { + inputsCustomizations, + dataDisplayCustomizations, + feedbackCustomizations, + navigationCustomizations, + surfacesCustomizations, +} from './customizations'; + +export default function getSignUpTheme(mode: PaletteMode): ThemeOptions { + return { + ...getDesignTokens(mode), + components: { + ...inputsCustomizations, + ...dataDisplayCustomizations, + ...feedbackCustomizations, + ...navigationCustomizations, + ...surfacesCustomizations, + }, + }; +} diff --git a/fe/src/ui/sign-up/theme/themePrimitives.ts b/fe/src/ui/sign-up/theme/themePrimitives.ts new file mode 100644 index 0000000..41b517b --- /dev/null +++ b/fe/src/ui/sign-up/theme/themePrimitives.ts @@ -0,0 +1,235 @@ +import { createTheme, alpha, PaletteMode, Shadows } from '@mui/material/styles'; + +declare module '@mui/material/Paper' { + interface PaperPropsVariantOverrides { + highlighted: true; + } +} +declare module '@mui/material/styles/createPalette' { + interface ColorRange { + 50: string; + 100: string; + 200: string; + 300: string; + 400: string; + 500: string; + 600: string; + 700: string; + 800: string; + 900: string; + } + + interface PaletteColor extends ColorRange {} +} + +const defaultTheme = createTheme(); + +const customShadows: Shadows = [...defaultTheme.shadows]; + +export const brand = { + 50: 'hsl(210, 100%, 95%)', + 100: 'hsl(210, 100%, 92%)', + 200: 'hsl(210, 100%, 80%)', + 300: 'hsl(210, 100%, 65%)', + 400: 'hsl(210, 98%, 48%)', + 500: 'hsl(210, 98%, 42%)', + 600: 'hsl(210, 98%, 55%)', + 700: 'hsl(210, 100%, 35%)', + 800: 'hsl(210, 100%, 16%)', + 900: 'hsl(210, 100%, 21%)', +}; + +export const gray = { + 50: 'hsl(220, 35%, 97%)', + 100: 'hsl(220, 30%, 94%)', + 200: 'hsl(220, 20%, 88%)', + 300: 'hsl(220, 20%, 80%)', + 400: 'hsl(220, 20%, 65%)', + 500: 'hsl(220, 20%, 42%)', + 600: 'hsl(220, 20%, 35%)', + 700: 'hsl(220, 20%, 25%)', + 800: 'hsl(220, 30%, 6%)', + 900: 'hsl(220, 35%, 3%)', +}; + +export const green = { + 50: 'hsl(120, 80%, 98%)', + 100: 'hsl(120, 75%, 94%)', + 200: 'hsl(120, 75%, 87%)', + 300: 'hsl(120, 61%, 77%)', + 400: 'hsl(120, 44%, 53%)', + 500: 'hsl(120, 59%, 30%)', + 600: 'hsl(120, 70%, 25%)', + 700: 'hsl(120, 75%, 16%)', + 800: 'hsl(120, 84%, 10%)', + 900: 'hsl(120, 87%, 6%)', +}; + +export const orange = { + 50: 'hsl(45, 100%, 97%)', + 100: 'hsl(45, 92%, 90%)', + 200: 'hsl(45, 94%, 80%)', + 300: 'hsl(45, 90%, 65%)', + 400: 'hsl(45, 90%, 40%)', + 500: 'hsl(45, 90%, 35%)', + 600: 'hsl(45, 91%, 25%)', + 700: 'hsl(45, 94%, 20%)', + 800: 'hsl(45, 95%, 16%)', + 900: 'hsl(45, 93%, 12%)', +}; + +export const red = { + 50: 'hsl(0, 100%, 97%)', + 100: 'hsl(0, 92%, 90%)', + 200: 'hsl(0, 94%, 80%)', + 300: 'hsl(0, 90%, 65%)', + 400: 'hsl(0, 90%, 40%)', + 500: 'hsl(0, 90%, 30%)', + 600: 'hsl(0, 91%, 25%)', + 700: 'hsl(0, 94%, 18%)', + 800: 'hsl(0, 95%, 12%)', + 900: 'hsl(0, 93%, 6%)', +}; + +export const getDesignTokens = (mode: PaletteMode) => { + customShadows[1] = + mode === 'dark' + ? 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px' + : 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px'; + + return { + palette: { + mode, + primary: { + light: brand[200], + main: brand[400], + dark: brand[700], + contrastText: brand[50], + ...(mode === 'dark' && { + contrastText: brand[50], + light: brand[300], + main: brand[400], + dark: brand[700], + }), + }, + info: { + light: brand[100], + main: brand[300], + dark: brand[600], + contrastText: gray[50], + ...(mode === 'dark' && { + contrastText: brand[300], + light: brand[500], + main: brand[700], + dark: brand[900], + }), + }, + warning: { + light: orange[300], + main: orange[400], + dark: orange[800], + ...(mode === 'dark' && { + light: orange[400], + main: orange[500], + dark: orange[700], + }), + }, + error: { + light: red[300], + main: red[400], + dark: red[800], + ...(mode === 'dark' && { + light: red[400], + main: red[500], + dark: red[700], + }), + }, + success: { + light: green[300], + main: green[400], + dark: green[800], + ...(mode === 'dark' && { + light: green[400], + main: green[500], + dark: green[700], + }), + }, + grey: { + ...gray, + }, + divider: mode === 'dark' ? alpha(gray[700], 0.6) : alpha(gray[300], 0.4), + background: { + default: 'hsl(0, 0%, 99%)', + paper: 'hsl(220, 35%, 97%)', + ...(mode === 'dark' && { default: gray[900], paper: 'hsl(220, 30%, 7%)' }), + }, + text: { + primary: gray[800], + secondary: gray[600], + warning: orange[400], + ...(mode === 'dark' && { primary: 'hsl(0, 0%, 100%)', secondary: gray[400] }), + }, + action: { + hover: alpha(gray[200], 0.2), + selected: `${alpha(gray[200], 0.3)}`, + ...(mode === 'dark' && { + hover: alpha(gray[600], 0.2), + selected: alpha(gray[600], 0.3), + }), + }, + }, + typography: { + fontFamily: ['"Inter", "sans-serif"'].join(','), + h1: { + fontSize: defaultTheme.typography.pxToRem(48), + fontWeight: 600, + lineHeight: 1.2, + letterSpacing: -0.5, + }, + h2: { + fontSize: defaultTheme.typography.pxToRem(36), + fontWeight: 600, + lineHeight: 1.2, + }, + h3: { + fontSize: defaultTheme.typography.pxToRem(30), + lineHeight: 1.2, + }, + h4: { + fontSize: defaultTheme.typography.pxToRem(24), + fontWeight: 600, + lineHeight: 1.5, + }, + h5: { + fontSize: defaultTheme.typography.pxToRem(20), + fontWeight: 600, + }, + h6: { + fontSize: defaultTheme.typography.pxToRem(18), + fontWeight: 600, + }, + subtitle1: { + fontSize: defaultTheme.typography.pxToRem(18), + }, + subtitle2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 500, + }, + body1: { + fontSize: defaultTheme.typography.pxToRem(14), + }, + body2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 400, + }, + caption: { + fontSize: defaultTheme.typography.pxToRem(12), + fontWeight: 400, + }, + }, + shape: { + borderRadius: 8, + }, + shadows: customShadows, + }; +}; diff --git a/fe/src/ui/theme.tsx b/fe/src/ui/theme.tsx new file mode 100644 index 0000000..9731593 --- /dev/null +++ b/fe/src/ui/theme.tsx @@ -0,0 +1,234 @@ +import { useEffect, useState } from "react"; +import { + createTheme, + ThemeProvider, + styled, + PaletteMode, +} from "@mui/material/styles"; +import CssBaseline from "@mui/material/CssBaseline"; +import Box from "@mui/material/Box"; +import Button from "@mui/material/Button"; +import Checkbox from "@mui/material/Checkbox"; +import Divider from "@mui/material/Divider"; +import FormControlLabel from "@mui/material/FormControlLabel"; +import FormLabel from "@mui/material/FormLabel"; +import FormControl from "@mui/material/FormControl"; +import Link from "@mui/material/Link"; +import TextField from "@mui/material/TextField"; +import Typography from "@mui/material/Typography"; +import Stack from "@mui/material/Stack"; +import MuiCard from "@mui/material/Card"; +import { + Brightness3, + Brightness5, + DarkMode, + ImportContacts, + ImportContactsTwoTone, + LightMode, +} from "@mui/icons-material"; +import { IconButton, IconButtonProps } from "@mui/material"; + +export function ThemeTest1() { + const [mode, setMode] = useState("light"); + const [showCustomTheme, setShowCustomTheme] = useState(true); + const defaultTheme = createTheme({ palette: { mode } }); + useEffect(() => { + // Check if there is a preferred mode in localStorage + const savedMode = localStorage.getItem("themeMode") as PaletteMode | null; + if (savedMode) { + setMode(savedMode); + } else { + // If no preference is found, it uses system preference + const systemPrefersDark = window.matchMedia( + "(prefers-color-scheme: dark)", + ).matches; + setMode(systemPrefersDark ? "dark" : "light"); + } + }, []); + const toggleColorMode = () => { + const newMode = mode === "dark" ? "light" : "dark"; + setMode(newMode); + localStorage.setItem("themeMode", newMode); // Save the selected mode to localStorage + }; + + return ( + + + + + + Sign up + + + + Full name + + + + Email + + + } + label="I want to receive updates via email." + /> + + + Already have an account?{" "} + + + Sign in + + + + + + or + + + + + + + + ); +} +interface ToggleColorModeProps extends IconButtonProps { + mode: PaletteMode; + toggleColorMode: () => void; +} +import ModeNightRoundedIcon from "@mui/icons-material/ModeNightRounded"; +import WbSunnyRoundedIcon from "@mui/icons-material/WbSunnyRounded"; +import AppTheme from "./shared-theme/AppTheme.tsx"; +import ColorModeSelect from "./shared-theme/ColorModeSelect.tsx"; +export function ToggleColorMode({ + mode, + toggleColorMode, + ...props +}: ToggleColorModeProps) { + return ( + + {mode === "dark" ? ( + + ) : ( + + )} + + ); +} + +export function ThemeTest() { + return ( + + + + Hey + + + + + ); +} + +import { useColorScheme } from "@mui/material/styles"; +export function ThemeToggle() { + const { mode, systemMode, setMode } = useColorScheme(); + const handleClick = (event: React.MouseEvent) => { + const nmode = mode === "dark" ? "light" : "dark"; + setMode(nmode); + }; + if (!mode) { + return ( + ({ + verticalAlign: "bottom", + display: "inline-flex", + width: "2.25rem", + height: "2.25rem", + borderRadius: (theme.vars || theme).shape.borderRadius, + border: "1px solid", + borderColor: (theme.vars || theme).palette.divider, + })} + /> + ); + } + const resolvedMode = (systemMode || mode) as "light" | "dark"; + const icon = { + light: , + dark: , + }[resolvedMode]; + return ( + + {icon} + + ); +} + +export const scrollableStyle = { + overflowY: "auto", + overflowX: "hidden", + scrollbarWidth: "none", + "&::-webkit-scrollbar": { + display: "none", + }, +}; diff --git a/fe/src/ui/theme/customizations/dataDisplay.tsx b/fe/src/ui/theme/customizations/dataDisplay.tsx new file mode 100644 index 0000000..c93ccbf --- /dev/null +++ b/fe/src/ui/theme/customizations/dataDisplay.tsx @@ -0,0 +1,233 @@ +import { Theme, alpha, Components } from '@mui/material/styles'; +import { svgIconClasses } from '@mui/material/SvgIcon'; +import { typographyClasses } from '@mui/material/Typography'; +import { buttonBaseClasses } from '@mui/material/ButtonBase'; +import { chipClasses } from '@mui/material/Chip'; +import { iconButtonClasses } from '@mui/material/IconButton'; +import { gray, red, green } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const dataDisplayCustomizations: Components = { + MuiList: { + styleOverrides: { + root: { + padding: '8px', + display: 'flex', + flexDirection: 'column', + gap: 0, + }, + }, + }, + MuiListItem: { + styleOverrides: { + root: ({ theme }) => ({ + [`& .${svgIconClasses.root}`]: { + width: '1rem', + height: '1rem', + color: theme.palette.text.secondary, + }, + [`& .${typographyClasses.root}`]: { + fontWeight: 500, + }, + [`& .${buttonBaseClasses.root}`]: { + display: 'flex', + gap: 8, + padding: '2px 8px', + borderRadius: theme.shape.borderRadius, + opacity: 0.7, + '&.Mui-selected': { + opacity: 1, + backgroundColor: alpha(theme.palette.action.selected, 0.3), + [`& .${svgIconClasses.root}`]: { + color: theme.palette.text.primary, + }, + '&:focus-visible': { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + '&:hover': { + backgroundColor: alpha(theme.palette.action.selected, 0.5), + }, + }, + '&:focus-visible': { + backgroundColor: 'transparent', + }, + }, + }), + }, + }, + MuiListItemText: { + styleOverrides: { + primary: ({ theme }) => ({ + fontSize: theme.typography.body2.fontSize, + fontWeight: 500, + lineHeight: theme.typography.body2.lineHeight, + }), + secondary: ({ theme }) => ({ + fontSize: theme.typography.caption.fontSize, + lineHeight: theme.typography.caption.lineHeight, + }), + }, + }, + MuiListSubheader: { + styleOverrides: { + root: ({ theme }) => ({ + backgroundColor: 'transparent', + padding: '4px 8px', + fontSize: theme.typography.caption.fontSize, + fontWeight: 500, + lineHeight: theme.typography.caption.lineHeight, + }), + }, + }, + MuiListItemIcon: { + styleOverrides: { + root: { + minWidth: 0, + }, + }, + }, + MuiChip: { + defaultProps: { + size: 'small', + }, + styleOverrides: { + root: ({ theme }) => ({ + border: '1px solid', + borderRadius: '999px', + [`& .${chipClasses.label}`]: { + fontWeight: 600, + }, + variants: [ + { + props: { + color: 'default', + }, + style: { + borderColor: gray[200], + backgroundColor: gray[100], + [`& .${chipClasses.label}`]: { + color: gray[500], + }, + [`& .${chipClasses.icon}`]: { + color: gray[500], + }, + ...theme.applyStyles('dark', { + borderColor: gray[700], + backgroundColor: gray[800], + [`& .${chipClasses.label}`]: { + color: gray[300], + }, + [`& .${chipClasses.icon}`]: { + color: gray[300], + }, + }), + }, + }, + { + props: { + color: 'success', + }, + style: { + borderColor: green[200], + backgroundColor: green[50], + [`& .${chipClasses.label}`]: { + color: green[500], + }, + [`& .${chipClasses.icon}`]: { + color: green[500], + }, + ...theme.applyStyles('dark', { + borderColor: green[800], + backgroundColor: green[900], + [`& .${chipClasses.label}`]: { + color: green[300], + }, + [`& .${chipClasses.icon}`]: { + color: green[300], + }, + }), + }, + }, + { + props: { + color: 'error', + }, + style: { + borderColor: red[100], + backgroundColor: red[50], + [`& .${chipClasses.label}`]: { + color: red[500], + }, + [`& .${chipClasses.icon}`]: { + color: red[500], + }, + ...theme.applyStyles('dark', { + borderColor: red[800], + backgroundColor: red[900], + [`& .${chipClasses.label}`]: { + color: red[200], + }, + [`& .${chipClasses.icon}`]: { + color: red[300], + }, + }), + }, + }, + { + props: { size: 'small' }, + style: { + maxHeight: 20, + [`& .${chipClasses.label}`]: { + fontSize: theme.typography.caption.fontSize, + }, + [`& .${svgIconClasses.root}`]: { + fontSize: theme.typography.caption.fontSize, + }, + }, + }, + { + props: { size: 'medium' }, + style: { + [`& .${chipClasses.label}`]: { + fontSize: theme.typography.caption.fontSize, + }, + }, + }, + ], + }), + }, + }, + MuiTablePagination: { + styleOverrides: { + actions: { + display: 'flex', + gap: 8, + marginRight: 6, + [`& .${iconButtonClasses.root}`]: { + minWidth: 0, + width: 36, + height: 36, + }, + }, + }, + }, + MuiIcon: { + defaultProps: { + fontSize: 'small', + }, + styleOverrides: { + root: { + variants: [ + { + props: { + fontSize: 'small', + }, + style: { + fontSize: '1rem', + }, + }, + ], + }, + }, + }, +}; diff --git a/fe/src/ui/theme/customizations/feedback.tsx b/fe/src/ui/theme/customizations/feedback.tsx new file mode 100644 index 0000000..aaf0000 --- /dev/null +++ b/fe/src/ui/theme/customizations/feedback.tsx @@ -0,0 +1,46 @@ +import { Theme, alpha, Components } from '@mui/material/styles'; +import { gray, orange } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const feedbackCustomizations: Components = { + MuiAlert: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: 10, + backgroundColor: orange[100], + color: theme.palette.text.primary, + border: `1px solid ${alpha(orange[300], 0.5)}`, + '& .MuiAlert-icon': { + color: orange[500], + }, + ...theme.applyStyles('dark', { + backgroundColor: `${alpha(orange[900], 0.5)}`, + border: `1px solid ${alpha(orange[800], 0.5)}`, + }), + }), + }, + }, + MuiDialog: { + styleOverrides: { + root: ({ theme }) => ({ + '& .MuiDialog-paper': { + borderRadius: '10px', + border: '1px solid', + borderColor: theme.palette.divider, + }, + }), + }, + }, + MuiLinearProgress: { + styleOverrides: { + root: ({ theme }) => ({ + height: 8, + borderRadius: 8, + backgroundColor: gray[200], + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + }), + }), + }, + }, +}; diff --git a/fe/src/ui/theme/customizations/index.ts b/fe/src/ui/theme/customizations/index.ts new file mode 100644 index 0000000..91a4485 --- /dev/null +++ b/fe/src/ui/theme/customizations/index.ts @@ -0,0 +1,5 @@ +export { inputsCustomizations } from './inputs'; +export { dataDisplayCustomizations } from './dataDisplay'; +export { feedbackCustomizations } from './feedback'; +export { navigationCustomizations } from './navigation'; +export { surfacesCustomizations } from './surfaces'; diff --git a/fe/src/ui/theme/customizations/inputs.tsx b/fe/src/ui/theme/customizations/inputs.tsx new file mode 100644 index 0000000..4be4c18 --- /dev/null +++ b/fe/src/ui/theme/customizations/inputs.tsx @@ -0,0 +1,445 @@ +import * as React from 'react'; +import { alpha, Theme, Components } from '@mui/material/styles'; +import { outlinedInputClasses } from '@mui/material/OutlinedInput'; +import { svgIconClasses } from '@mui/material/SvgIcon'; +import { toggleButtonGroupClasses } from '@mui/material/ToggleButtonGroup'; +import { toggleButtonClasses } from '@mui/material/ToggleButton'; +import CheckBoxOutlineBlankRoundedIcon from '@mui/icons-material/CheckBoxOutlineBlankRounded'; +import CheckRoundedIcon from '@mui/icons-material/CheckRounded'; +import RemoveRoundedIcon from '@mui/icons-material/RemoveRounded'; +import { gray, brand } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const inputsCustomizations: Components = { + MuiButtonBase: { + defaultProps: { + disableTouchRipple: true, + disableRipple: true, + }, + styleOverrides: { + root: ({ theme }) => ({ + boxSizing: 'border-box', + transition: 'all 100ms ease-in', + '&:focus-visible': { + outline: `3px solid ${alpha(theme.palette.primary.main, 0.5)}`, + outlineOffset: '2px', + }, + }), + }, + }, + MuiButton: { + styleOverrides: { + root: ({ theme }) => ({ + boxShadow: 'none', + borderRadius: theme.shape.borderRadius, + textTransform: 'none', + variants: [ + { + props: { + size: 'small', + }, + style: { + height: '2.25rem', + padding: '8px 12px', + }, + }, + { + props: { + size: 'medium', + }, + style: { + height: '2.5rem', // 40px + }, + }, + { + props: { + color: 'primary', + variant: 'contained', + }, + style: { + color: 'white', + backgroundColor: gray[900], + backgroundImage: `linear-gradient(to bottom, ${gray[700]}, ${gray[800]})`, + boxShadow: `inset 0 1px 0 ${gray[600]}, inset 0 -1px 0 1px hsl(220, 0%, 0%)`, + border: `1px solid ${gray[700]}`, + '&:hover': { + backgroundImage: 'none', + backgroundColor: gray[700], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: gray[800], + }, + ...theme.applyStyles('dark', { + color: 'black', + backgroundColor: gray[50], + backgroundImage: `linear-gradient(to bottom, ${gray[100]}, ${gray[50]})`, + boxShadow: 'inset 0 -1px 0 hsl(220, 30%, 80%)', + border: `1px solid ${gray[50]}`, + '&:hover': { + backgroundImage: 'none', + backgroundColor: gray[300], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: gray[400], + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'contained', + }, + style: { + color: 'white', + backgroundColor: brand[300], + backgroundImage: `linear-gradient(to bottom, ${alpha(brand[400], 0.8)}, ${brand[500]})`, + boxShadow: `inset 0 2px 0 ${alpha(brand[200], 0.2)}, inset 0 -2px 0 ${alpha(brand[700], 0.4)}`, + border: `1px solid ${brand[500]}`, + '&:hover': { + backgroundColor: brand[700], + boxShadow: 'none', + }, + '&:active': { + backgroundColor: brand[700], + backgroundImage: 'none', + }, + }, + }, + { + props: { + variant: 'outlined', + }, + style: { + color: theme.palette.text.primary, + border: '1px solid', + borderColor: gray[200], + backgroundColor: alpha(gray[50], 0.3), + '&:hover': { + backgroundColor: gray[100], + borderColor: gray[300], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + borderColor: gray[700], + + '&:hover': { + backgroundColor: gray[900], + borderColor: gray[600], + }, + '&:active': { + backgroundColor: gray[900], + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'outlined', + }, + style: { + color: brand[700], + border: '1px solid', + borderColor: brand[200], + backgroundColor: brand[50], + '&:hover': { + backgroundColor: brand[100], + borderColor: brand[400], + }, + '&:active': { + backgroundColor: alpha(brand[200], 0.7), + }, + ...theme.applyStyles('dark', { + color: brand[50], + border: '1px solid', + borderColor: brand[900], + backgroundColor: alpha(brand[900], 0.3), + '&:hover': { + borderColor: brand[700], + backgroundColor: alpha(brand[900], 0.6), + }, + '&:active': { + backgroundColor: alpha(brand[900], 0.5), + }, + }), + }, + }, + { + props: { + variant: 'text', + }, + style: { + color: gray[600], + '&:hover': { + backgroundColor: gray[100], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + color: gray[50], + '&:hover': { + backgroundColor: gray[700], + }, + '&:active': { + backgroundColor: alpha(gray[700], 0.7), + }, + }), + }, + }, + { + props: { + color: 'secondary', + variant: 'text', + }, + style: { + color: brand[700], + '&:hover': { + backgroundColor: alpha(brand[100], 0.5), + }, + '&:active': { + backgroundColor: alpha(brand[200], 0.7), + }, + ...theme.applyStyles('dark', { + color: brand[100], + '&:hover': { + backgroundColor: alpha(brand[900], 0.5), + }, + '&:active': { + backgroundColor: alpha(brand[900], 0.3), + }, + }), + }, + }, + ], + }), + }, + }, + MuiIconButton: { + styleOverrides: { + root: ({ theme }) => ({ + boxShadow: 'none', + borderRadius: theme.shape.borderRadius, + textTransform: 'none', + fontWeight: theme.typography.fontWeightMedium, + letterSpacing: 0, + color: theme.palette.text.primary, + border: '1px solid ', + borderColor: gray[200], + backgroundColor: alpha(gray[50], 0.3), + '&:hover': { + backgroundColor: gray[100], + borderColor: gray[300], + }, + '&:active': { + backgroundColor: gray[200], + }, + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + borderColor: gray[700], + '&:hover': { + backgroundColor: gray[900], + borderColor: gray[600], + }, + '&:active': { + backgroundColor: gray[900], + }, + }), + variants: [ + { + props: { + size: 'small', + }, + style: { + width: '2.25rem', + height: '2.25rem', + padding: '0.25rem', + [`& .${svgIconClasses.root}`]: { fontSize: '1rem' }, + }, + }, + { + props: { + size: 'medium', + }, + style: { + width: '2.5rem', + height: '2.5rem', + }, + }, + ], + }), + }, + }, + MuiToggleButtonGroup: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: '10px', + boxShadow: `0 4px 16px ${alpha(gray[400], 0.2)}`, + [`& .${toggleButtonGroupClasses.selected}`]: { + color: brand[500], + }, + ...theme.applyStyles('dark', { + [`& .${toggleButtonGroupClasses.selected}`]: { + color: '#fff', + }, + boxShadow: `0 4px 16px ${alpha(brand[700], 0.5)}`, + }), + }), + }, + }, + MuiToggleButton: { + styleOverrides: { + root: ({ theme }) => ({ + padding: '12px 16px', + textTransform: 'none', + borderRadius: '10px', + fontWeight: 500, + ...theme.applyStyles('dark', { + color: gray[400], + boxShadow: '0 4px 16px rgba(0, 0, 0, 0.5)', + [`&.${toggleButtonClasses.selected}`]: { + color: brand[300], + }, + }), + }), + }, + }, + MuiCheckbox: { + defaultProps: { + disableRipple: true, + icon: ( + + ), + checkedIcon: , + indeterminateIcon: , + }, + styleOverrides: { + root: ({ theme }) => ({ + margin: 10, + height: 16, + width: 16, + borderRadius: 5, + border: '1px solid ', + borderColor: alpha(gray[300], 0.8), + boxShadow: '0 0 0 1.5px hsla(210, 0%, 0%, 0.04) inset', + backgroundColor: alpha(gray[100], 0.4), + transition: 'border-color, background-color, 120ms ease-in', + '&:hover': { + borderColor: brand[300], + }, + '&.Mui-focusVisible': { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + borderColor: brand[400], + }, + '&.Mui-checked': { + color: 'white', + backgroundColor: brand[500], + borderColor: brand[500], + boxShadow: `none`, + '&:hover': { + backgroundColor: brand[600], + }, + }, + ...theme.applyStyles('dark', { + borderColor: alpha(gray[700], 0.8), + boxShadow: '0 0 0 1.5px hsl(210, 0%, 0%) inset', + backgroundColor: alpha(gray[900], 0.8), + '&:hover': { + borderColor: brand[300], + }, + '&.Mui-focusVisible': { + borderColor: brand[400], + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '2px', + }, + }), + }), + }, + }, + MuiInputBase: { + styleOverrides: { + root: { + border: 'none', + }, + input: { + '&::placeholder': { + opacity: 0.7, + color: gray[500], + }, + }, + }, + }, + MuiOutlinedInput: { + styleOverrides: { + input: { + padding: 0, + }, + root: ({ theme }) => ({ + padding: '8px 12px', + color: theme.palette.text.primary, + borderRadius: theme.shape.borderRadius, + border: `1px solid ${theme.palette.divider}`, + backgroundColor: theme.palette.background.default, + transition: 'border 120ms ease-in', + '&:hover': { + borderColor: gray[400], + }, + [`&.${outlinedInputClasses.focused}`]: { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + borderColor: brand[400], + }, + ...theme.applyStyles('dark', { + '&:hover': { + borderColor: gray[500], + }, + }), + variants: [ + { + props: { + size: 'small', + }, + style: { + height: '2.25rem', + }, + }, + { + props: { + size: 'medium', + }, + style: { + height: '2.5rem', + }, + }, + ], + }), + notchedOutline: { + border: 'none', + }, + }, + }, + MuiInputAdornment: { + styleOverrides: { + root: ({ theme }) => ({ + color: theme.palette.grey[500], + ...theme.applyStyles('dark', { + color: theme.palette.grey[400], + }), + }), + }, + }, + MuiFormLabel: { + styleOverrides: { + root: ({ theme }) => ({ + typography: theme.typography.caption, + marginBottom: 8, + }), + }, + }, +}; diff --git a/fe/src/ui/theme/customizations/navigation.tsx b/fe/src/ui/theme/customizations/navigation.tsx new file mode 100644 index 0000000..f6b92e5 --- /dev/null +++ b/fe/src/ui/theme/customizations/navigation.tsx @@ -0,0 +1,279 @@ +import * as React from 'react'; +import { Theme, alpha, Components } from '@mui/material/styles'; +import { SvgIconProps } from '@mui/material/SvgIcon'; +import { buttonBaseClasses } from '@mui/material/ButtonBase'; +import { dividerClasses } from '@mui/material/Divider'; +import { menuItemClasses } from '@mui/material/MenuItem'; +import { selectClasses } from '@mui/material/Select'; +import { tabClasses } from '@mui/material/Tab'; +import UnfoldMoreRoundedIcon from '@mui/icons-material/UnfoldMoreRounded'; +import { gray, brand } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const navigationCustomizations: Components = { + MuiMenuItem: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: theme.shape.borderRadius, + padding: '6px 8px', + [`&.${menuItemClasses.focusVisible}`]: { + backgroundColor: 'transparent', + }, + [`&.${menuItemClasses.selected}`]: { + [`&.${menuItemClasses.focusVisible}`]: { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + }, + }), + }, + }, + MuiMenu: { + styleOverrides: { + list: { + gap: '0px', + [`&.${dividerClasses.root}`]: { + margin: '0 -8px', + }, + }, + paper: ({ theme }) => ({ + marginTop: '4px', + borderRadius: theme.shape.borderRadius, + border: `1px solid ${theme.palette.divider}`, + backgroundImage: 'none', + background: 'hsl(0, 0%, 100%)', + boxShadow: + 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px', + [`& .${buttonBaseClasses.root}`]: { + '&.Mui-selected': { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + }, + ...theme.applyStyles('dark', { + background: gray[900], + boxShadow: + 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px', + }), + }), + }, + }, + MuiSelect: { + defaultProps: { + IconComponent: React.forwardRef((props, ref) => ( + + )), + }, + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: theme.shape.borderRadius, + border: '1px solid', + borderColor: gray[200], + backgroundColor: theme.palette.background.paper, + boxShadow: `inset 0 1px 0 1px hsla(220, 0%, 100%, 0.6), inset 0 -1px 0 1px hsla(220, 35%, 90%, 0.5)`, + '&:hover': { + borderColor: gray[300], + backgroundColor: theme.palette.background.paper, + boxShadow: 'none', + }, + [`&.${selectClasses.focused}`]: { + outlineOffset: 0, + borderColor: gray[400], + }, + '&:before, &:after': { + display: 'none', + }, + + ...theme.applyStyles('dark', { + borderRadius: theme.shape.borderRadius, + borderColor: gray[700], + backgroundColor: theme.palette.background.paper, + boxShadow: `inset 0 1px 0 1px ${alpha(gray[700], 0.15)}, inset 0 -1px 0 1px hsla(220, 0%, 0%, 0.7)`, + '&:hover': { + borderColor: alpha(gray[700], 0.7), + backgroundColor: theme.palette.background.paper, + boxShadow: 'none', + }, + [`&.${selectClasses.focused}`]: { + outlineOffset: 0, + borderColor: gray[900], + }, + '&:before, &:after': { + display: 'none', + }, + }), + }), + select: ({ theme }) => ({ + display: 'flex', + alignItems: 'center', + ...theme.applyStyles('dark', { + display: 'flex', + alignItems: 'center', + '&:focus-visible': { + backgroundColor: gray[900], + }, + }), + }), + }, + }, + MuiLink: { + defaultProps: { + underline: 'none', + }, + styleOverrides: { + root: ({ theme }) => ({ + color: theme.palette.text.primary, + fontWeight: 500, + position: 'relative', + textDecoration: 'none', + width: 'fit-content', + '&::before': { + content: '""', + position: 'absolute', + width: '100%', + height: '1px', + bottom: 0, + left: 0, + backgroundColor: theme.palette.text.secondary, + opacity: 0.3, + transition: 'width 0.3s ease, opacity 0.3s ease', + }, + '&:hover::before': { + width: 0, + }, + '&:focus-visible': { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: '4px', + borderRadius: '2px', + }, + }), + }, + }, + MuiDrawer: { + styleOverrides: { + paper: ({ theme }) => ({ + backgroundColor: theme.palette.background.default, + }), + }, + }, + MuiPaginationItem: { + styleOverrides: { + root: ({ theme }) => ({ + '&.Mui-selected': { + color: 'white', + backgroundColor: theme.palette.grey[900], + }, + ...theme.applyStyles('dark', { + '&.Mui-selected': { + color: 'black', + backgroundColor: theme.palette.grey[50], + }, + }), + }), + }, + }, + MuiTabs: { + styleOverrides: { + root: { minHeight: 'fit-content' }, + indicator: ({ theme }) => ({ + backgroundColor: theme.palette.grey[800], + ...theme.applyStyles('dark', { + backgroundColor: theme.palette.grey[200], + }), + }), + }, + }, + MuiTab: { + styleOverrides: { + root: ({ theme }) => ({ + padding: '6px 8px', + marginBottom: '8px', + textTransform: 'none', + minWidth: 'fit-content', + minHeight: 'fit-content', + color: theme.palette.text.secondary, + borderRadius: theme.shape.borderRadius, + border: '1px solid', + borderColor: 'transparent', + ':hover': { + color: theme.palette.text.primary, + backgroundColor: gray[100], + borderColor: gray[200], + }, + [`&.${tabClasses.selected}`]: { + color: gray[900], + }, + ...theme.applyStyles('dark', { + ':hover': { + color: theme.palette.text.primary, + backgroundColor: gray[800], + borderColor: gray[700], + }, + [`&.${tabClasses.selected}`]: { + color: '#fff', + }, + }), + }), + }, + }, + MuiStepConnector: { + styleOverrides: { + line: ({ theme }) => ({ + borderTop: '1px solid', + borderColor: theme.palette.divider, + flex: 1, + borderRadius: '99px', + }), + }, + }, + MuiStepIcon: { + styleOverrides: { + root: ({ theme }) => ({ + color: 'transparent', + border: `1px solid ${gray[400]}`, + width: 12, + height: 12, + borderRadius: '50%', + '& text': { + display: 'none', + }, + '&.Mui-active': { + border: 'none', + color: theme.palette.primary.main, + }, + '&.Mui-completed': { + border: 'none', + color: theme.palette.success.main, + }, + ...theme.applyStyles('dark', { + border: `1px solid ${gray[700]}`, + '&.Mui-active': { + border: 'none', + color: theme.palette.primary.light, + }, + '&.Mui-completed': { + border: 'none', + color: theme.palette.success.light, + }, + }), + variants: [ + { + props: { completed: true }, + style: { + width: 12, + height: 12, + }, + }, + ], + }), + }, + }, + MuiStepLabel: { + styleOverrides: { + label: ({ theme }) => ({ + '&.Mui-completed': { + opacity: 0.6, + ...theme.applyStyles('dark', { opacity: 0.5 }), + }, + }), + }, + }, +}; diff --git a/fe/src/ui/theme/customizations/surfaces.ts b/fe/src/ui/theme/customizations/surfaces.ts new file mode 100644 index 0000000..5bcdfc5 --- /dev/null +++ b/fe/src/ui/theme/customizations/surfaces.ts @@ -0,0 +1,113 @@ +import { alpha, Theme, Components } from '@mui/material/styles'; +import { gray } from '../themePrimitives'; + +/* eslint-disable import/prefer-default-export */ +export const surfacesCustomizations: Components = { + MuiAccordion: { + defaultProps: { + elevation: 0, + disableGutters: true, + }, + styleOverrides: { + root: ({ theme }) => ({ + padding: 4, + overflow: 'clip', + backgroundColor: theme.palette.background.default, + border: '1px solid', + borderColor: theme.palette.divider, + ':before': { + backgroundColor: 'transparent', + }, + '&:not(:last-of-type)': { + borderBottom: 'none', + }, + '&:first-of-type': { + borderTopLeftRadius: theme.shape.borderRadius, + borderTopRightRadius: theme.shape.borderRadius, + }, + '&:last-of-type': { + borderBottomLeftRadius: theme.shape.borderRadius, + borderBottomRightRadius: theme.shape.borderRadius, + }, + }), + }, + }, + MuiAccordionSummary: { + styleOverrides: { + root: ({ theme }) => ({ + border: 'none', + borderRadius: 8, + '&:hover': { backgroundColor: gray[50] }, + '&:focus-visible': { backgroundColor: 'transparent' }, + ...theme.applyStyles('dark', { + '&:hover': { backgroundColor: gray[800] }, + }), + }), + }, + }, + MuiAccordionDetails: { + styleOverrides: { + root: { mb: 20, border: 'none' }, + }, + }, + MuiPaper: { + defaultProps: { + elevation: 0, + }, + }, + MuiCard: { + styleOverrides: { + root: ({ theme }) => { + return { + padding: 16, + gap: 16, + transition: 'all 100ms ease', + backgroundColor: gray[50], + borderRadius: theme.shape.borderRadius, + border: `1px solid ${theme.palette.divider}`, + boxShadow: 'none', + ...theme.applyStyles('dark', { + backgroundColor: gray[800], + }), + variants: [ + { + props: { + variant: 'outlined', + }, + style: { + border: `1px solid ${theme.palette.divider}`, + boxShadow: 'none', + background: 'hsl(0, 0%, 100%)', + ...theme.applyStyles('dark', { + background: alpha(gray[900], 0.4), + }), + }, + }, + ], + }; + }, + }, + }, + MuiCardContent: { + styleOverrides: { + root: { + padding: 0, + '&:last-child': { paddingBottom: 0 }, + }, + }, + }, + MuiCardHeader: { + styleOverrides: { + root: { + padding: 0, + }, + }, + }, + MuiCardActions: { + styleOverrides: { + root: { + padding: 0, + }, + }, + }, +}; diff --git a/fe/src/ui/theme/getSignUpTheme.tsx b/fe/src/ui/theme/getSignUpTheme.tsx new file mode 100644 index 0000000..514832b --- /dev/null +++ b/fe/src/ui/theme/getSignUpTheme.tsx @@ -0,0 +1,23 @@ +import type {} from '@mui/material/themeCssVarsAugmentation'; +import { ThemeOptions, PaletteMode } from '@mui/material/styles'; +import { getDesignTokens } from './themePrimitives'; +import { + inputsCustomizations, + dataDisplayCustomizations, + feedbackCustomizations, + navigationCustomizations, + surfacesCustomizations, +} from './customizations'; + +export default function getSignUpTheme(mode: PaletteMode): ThemeOptions { + return { + ...getDesignTokens(mode), + components: { + ...inputsCustomizations, + ...dataDisplayCustomizations, + ...feedbackCustomizations, + ...navigationCustomizations, + ...surfacesCustomizations, + }, + }; +} diff --git a/fe/src/ui/theme/themePrimitives.ts b/fe/src/ui/theme/themePrimitives.ts new file mode 100644 index 0000000..41b517b --- /dev/null +++ b/fe/src/ui/theme/themePrimitives.ts @@ -0,0 +1,235 @@ +import { createTheme, alpha, PaletteMode, Shadows } from '@mui/material/styles'; + +declare module '@mui/material/Paper' { + interface PaperPropsVariantOverrides { + highlighted: true; + } +} +declare module '@mui/material/styles/createPalette' { + interface ColorRange { + 50: string; + 100: string; + 200: string; + 300: string; + 400: string; + 500: string; + 600: string; + 700: string; + 800: string; + 900: string; + } + + interface PaletteColor extends ColorRange {} +} + +const defaultTheme = createTheme(); + +const customShadows: Shadows = [...defaultTheme.shadows]; + +export const brand = { + 50: 'hsl(210, 100%, 95%)', + 100: 'hsl(210, 100%, 92%)', + 200: 'hsl(210, 100%, 80%)', + 300: 'hsl(210, 100%, 65%)', + 400: 'hsl(210, 98%, 48%)', + 500: 'hsl(210, 98%, 42%)', + 600: 'hsl(210, 98%, 55%)', + 700: 'hsl(210, 100%, 35%)', + 800: 'hsl(210, 100%, 16%)', + 900: 'hsl(210, 100%, 21%)', +}; + +export const gray = { + 50: 'hsl(220, 35%, 97%)', + 100: 'hsl(220, 30%, 94%)', + 200: 'hsl(220, 20%, 88%)', + 300: 'hsl(220, 20%, 80%)', + 400: 'hsl(220, 20%, 65%)', + 500: 'hsl(220, 20%, 42%)', + 600: 'hsl(220, 20%, 35%)', + 700: 'hsl(220, 20%, 25%)', + 800: 'hsl(220, 30%, 6%)', + 900: 'hsl(220, 35%, 3%)', +}; + +export const green = { + 50: 'hsl(120, 80%, 98%)', + 100: 'hsl(120, 75%, 94%)', + 200: 'hsl(120, 75%, 87%)', + 300: 'hsl(120, 61%, 77%)', + 400: 'hsl(120, 44%, 53%)', + 500: 'hsl(120, 59%, 30%)', + 600: 'hsl(120, 70%, 25%)', + 700: 'hsl(120, 75%, 16%)', + 800: 'hsl(120, 84%, 10%)', + 900: 'hsl(120, 87%, 6%)', +}; + +export const orange = { + 50: 'hsl(45, 100%, 97%)', + 100: 'hsl(45, 92%, 90%)', + 200: 'hsl(45, 94%, 80%)', + 300: 'hsl(45, 90%, 65%)', + 400: 'hsl(45, 90%, 40%)', + 500: 'hsl(45, 90%, 35%)', + 600: 'hsl(45, 91%, 25%)', + 700: 'hsl(45, 94%, 20%)', + 800: 'hsl(45, 95%, 16%)', + 900: 'hsl(45, 93%, 12%)', +}; + +export const red = { + 50: 'hsl(0, 100%, 97%)', + 100: 'hsl(0, 92%, 90%)', + 200: 'hsl(0, 94%, 80%)', + 300: 'hsl(0, 90%, 65%)', + 400: 'hsl(0, 90%, 40%)', + 500: 'hsl(0, 90%, 30%)', + 600: 'hsl(0, 91%, 25%)', + 700: 'hsl(0, 94%, 18%)', + 800: 'hsl(0, 95%, 12%)', + 900: 'hsl(0, 93%, 6%)', +}; + +export const getDesignTokens = (mode: PaletteMode) => { + customShadows[1] = + mode === 'dark' + ? 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px' + : 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px'; + + return { + palette: { + mode, + primary: { + light: brand[200], + main: brand[400], + dark: brand[700], + contrastText: brand[50], + ...(mode === 'dark' && { + contrastText: brand[50], + light: brand[300], + main: brand[400], + dark: brand[700], + }), + }, + info: { + light: brand[100], + main: brand[300], + dark: brand[600], + contrastText: gray[50], + ...(mode === 'dark' && { + contrastText: brand[300], + light: brand[500], + main: brand[700], + dark: brand[900], + }), + }, + warning: { + light: orange[300], + main: orange[400], + dark: orange[800], + ...(mode === 'dark' && { + light: orange[400], + main: orange[500], + dark: orange[700], + }), + }, + error: { + light: red[300], + main: red[400], + dark: red[800], + ...(mode === 'dark' && { + light: red[400], + main: red[500], + dark: red[700], + }), + }, + success: { + light: green[300], + main: green[400], + dark: green[800], + ...(mode === 'dark' && { + light: green[400], + main: green[500], + dark: green[700], + }), + }, + grey: { + ...gray, + }, + divider: mode === 'dark' ? alpha(gray[700], 0.6) : alpha(gray[300], 0.4), + background: { + default: 'hsl(0, 0%, 99%)', + paper: 'hsl(220, 35%, 97%)', + ...(mode === 'dark' && { default: gray[900], paper: 'hsl(220, 30%, 7%)' }), + }, + text: { + primary: gray[800], + secondary: gray[600], + warning: orange[400], + ...(mode === 'dark' && { primary: 'hsl(0, 0%, 100%)', secondary: gray[400] }), + }, + action: { + hover: alpha(gray[200], 0.2), + selected: `${alpha(gray[200], 0.3)}`, + ...(mode === 'dark' && { + hover: alpha(gray[600], 0.2), + selected: alpha(gray[600], 0.3), + }), + }, + }, + typography: { + fontFamily: ['"Inter", "sans-serif"'].join(','), + h1: { + fontSize: defaultTheme.typography.pxToRem(48), + fontWeight: 600, + lineHeight: 1.2, + letterSpacing: -0.5, + }, + h2: { + fontSize: defaultTheme.typography.pxToRem(36), + fontWeight: 600, + lineHeight: 1.2, + }, + h3: { + fontSize: defaultTheme.typography.pxToRem(30), + lineHeight: 1.2, + }, + h4: { + fontSize: defaultTheme.typography.pxToRem(24), + fontWeight: 600, + lineHeight: 1.5, + }, + h5: { + fontSize: defaultTheme.typography.pxToRem(20), + fontWeight: 600, + }, + h6: { + fontSize: defaultTheme.typography.pxToRem(18), + fontWeight: 600, + }, + subtitle1: { + fontSize: defaultTheme.typography.pxToRem(18), + }, + subtitle2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 500, + }, + body1: { + fontSize: defaultTheme.typography.pxToRem(14), + }, + body2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 400, + }, + caption: { + fontSize: defaultTheme.typography.pxToRem(12), + fontWeight: 400, + }, + }, + shape: { + borderRadius: 8, + }, + shadows: customShadows, + }; +}; diff --git a/fe/src/vite-env.d.ts b/fe/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/fe/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/fe/tsconfig.app.json b/fe/tsconfig.app.json new file mode 100644 index 0000000..588add2 --- /dev/null +++ b/fe/tsconfig.app.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable", "WebWorker", "ES2021.String"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noFallthroughCasesInSwitch": false + }, + "include": ["src"], + "types": ["vite/client", "vite-plugin-pwa/client"], + "baseUrl": "./src", + "paths": { + "@/*": ["*"] + } +} diff --git a/fe/tsconfig.app.tsbuildinfo b/fe/tsconfig.app.tsbuildinfo new file mode 100644 index 0000000..c9a18eb --- /dev/null +++ b/fe/tsconfig.app.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/App.tsx","./src/Router.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/dashboard/CreateForm.tsx","./src/dashboard/Dashboard.tsx","./src/dashboard/Site.tsx","./src/logic/comms.ts","./src/logic/constants.ts","./src/logic/store.ts","./src/logic/tlon-helpers.ts","./src/logic/types-tlon.ts","./src/logic/types.ts","./src/logic/utils.ts","./src/logic/ob/co.ts","./src/logic/ob/muk.ts","./src/logic/ob/ob.ts","./src/logic/ob/types.ts","./src/modals/Example.tsx","./src/modals/Modal.tsx","./src/ui/Components.tsx","./src/ui/Drag.tsx","./src/ui/Sigil.tsx","./src/ui/theme.tsx","./src/ui/shared-theme/AppTheme.tsx","./src/ui/shared-theme/ColorModeIconDropdown.tsx","./src/ui/shared-theme/ColorModeSelect.tsx","./src/ui/shared-theme/themePrimitives.ts","./src/ui/shared-theme/customizations/dataDisplay.tsx","./src/ui/shared-theme/customizations/feedback.tsx","./src/ui/shared-theme/customizations/inputs.tsx","./src/ui/shared-theme/customizations/navigation.tsx","./src/ui/shared-theme/customizations/surfaces.ts","./src/ui/sigil-ts/index.ts","./src/ui/sigil-ts/lib.ts","./src/ui/sigil-ts/reactImageRenderer.ts","./src/ui/sigil-ts/reactRenderer.ts","./src/ui/sigil-ts/stringRenderer.ts","./src/ui/sigil-ts/types.ts","./src/ui/sign-up/CustomIcons.tsx","./src/ui/sign-up/SignUp.tsx","./src/ui/sign-up/TemplateFrame.tsx","./src/ui/sign-up/ToggleColorMode.tsx","./src/ui/sign-up/getSignUpTheme.tsx","./src/ui/sign-up/theme/getSignUpTheme.tsx","./src/ui/sign-up/theme/themePrimitives.ts","./src/ui/sign-up/theme/customizations/dataDisplay.tsx","./src/ui/sign-up/theme/customizations/feedback.tsx","./src/ui/sign-up/theme/customizations/index.ts","./src/ui/sign-up/theme/customizations/inputs.tsx","./src/ui/sign-up/theme/customizations/navigation.tsx","./src/ui/sign-up/theme/customizations/surfaces.ts","./src/ui/theme/getSignUpTheme.tsx","./src/ui/theme/themePrimitives.ts","./src/ui/theme/customizations/dataDisplay.tsx","./src/ui/theme/customizations/feedback.tsx","./src/ui/theme/customizations/index.ts","./src/ui/theme/customizations/inputs.tsx","./src/ui/theme/customizations/navigation.tsx","./src/ui/theme/customizations/surfaces.ts"],"version":"5.6.2"} \ No newline at end of file diff --git a/fe/tsconfig.json b/fe/tsconfig.json new file mode 100644 index 0000000..d32ff68 --- /dev/null +++ b/fe/tsconfig.json @@ -0,0 +1,4 @@ +{ + "files": [], + "references": [{ "path": "./tsconfig.app.json" }, { "path": "./tsconfig.node.json" }] +} diff --git a/fe/tsconfig.node.json b/fe/tsconfig.node.json new file mode 100644 index 0000000..0d3d714 --- /dev/null +++ b/fe/tsconfig.node.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/fe/tsconfig.node.tsbuildinfo b/fe/tsconfig.node.tsbuildinfo new file mode 100644 index 0000000..98ef2f9 --- /dev/null +++ b/fe/tsconfig.node.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./vite.config.ts"],"version":"5.6.2"} \ No newline at end of file diff --git a/fe/vite.config.ts b/fe/vite.config.ts new file mode 100644 index 0000000..70001c4 --- /dev/null +++ b/fe/vite.config.ts @@ -0,0 +1,32 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +import { createHash } from "crypto"; + +export default defineConfig({ + base: "/apps/ucm", + plugins: [react()], + resolve: { + alias: { "@": new URL("./src/", import.meta.url).pathname }, + }, + build: { + rollupOptions: { + output: { + assetFileNames: (a) => { + let hash = createHash("sha256"); + hash.update(a.source); + hash.update(a.name!); + const str = hash.digest("hex").slice(0, 16); + return `assets/${str}-${a.name}`; + }, + entryFileNames: (c) => { + let hash = createHash("sha256"); + for (let m of c.moduleIds) { + hash.update(m); + } + const str = hash.digest("hex").slice(0, 16); + return `assets/${str}-${c.name}.js`; + }, + }, + }, + }, +}); diff --git a/site/.gitignore b/site/.gitignore new file mode 100644 index 0000000..a547bf3 --- /dev/null +++ b/site/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/site/.prettierrc.json b/site/.prettierrc.json new file mode 100644 index 0000000..6ec5828 --- /dev/null +++ b/site/.prettierrc.json @@ -0,0 +1,7 @@ +{ + "trailingComma": "all", + "tabWidth": 2, + "semi": true, + "singleQuote": true, + "printWidth": 90 +} diff --git a/site/README.md b/site/README.md new file mode 100644 index 0000000..74872fd --- /dev/null +++ b/site/README.md @@ -0,0 +1,50 @@ +# React + TypeScript + Vite + +This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. + +Currently, two official plugins are available: + +- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react/README.md) uses [Babel](https://babeljs.io/) for Fast Refresh +- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh + +## Expanding the ESLint configuration + +If you are developing a production application, we recommend updating the configuration to enable type aware lint rules: + +- Configure the top-level `parserOptions` property like this: + +```js +export default tseslint.config({ + languageOptions: { + // other options... + parserOptions: { + project: ['./tsconfig.node.json', './tsconfig.app.json'], + tsconfigRootDir: import.meta.dirname, + }, + }, +}) +``` + +- Replace `tseslint.configs.recommended` to `tseslint.configs.recommendedTypeChecked` or `tseslint.configs.strictTypeChecked` +- Optionally add `...tseslint.configs.stylisticTypeChecked` +- Install [eslint-plugin-react](https://github.com/jsx-eslint/eslint-plugin-react) and update the config: + +```js +// eslint.config.js +import react from 'eslint-plugin-react' + +export default tseslint.config({ + // Set the react version + settings: { react: { version: '18.3' } }, + plugins: { + // Add the react plugin + react, + }, + rules: { + // other rules... + // Enable its recommended rules + ...react.configs.recommended.rules, + ...react.configs['jsx-runtime'].rules, + }, +}) +``` diff --git a/site/bun.lockb b/site/bun.lockb new file mode 100755 index 0000000..d2d2af7 Binary files /dev/null and b/site/bun.lockb differ diff --git a/site/eslint.config.js b/site/eslint.config.js new file mode 100644 index 0000000..092408a --- /dev/null +++ b/site/eslint.config.js @@ -0,0 +1,28 @@ +import js from '@eslint/js' +import globals from 'globals' +import reactHooks from 'eslint-plugin-react-hooks' +import reactRefresh from 'eslint-plugin-react-refresh' +import tseslint from 'typescript-eslint' + +export default tseslint.config( + { ignores: ['dist'] }, + { + extends: [js.configs.recommended, ...tseslint.configs.recommended], + files: ['**/*.{ts,tsx}'], + languageOptions: { + ecmaVersion: 2020, + globals: globals.browser, + }, + plugins: { + 'react-hooks': reactHooks, + 'react-refresh': reactRefresh, + }, + rules: { + ...reactHooks.configs.recommended.rules, + 'react-refresh/only-export-components': [ + 'warn', + { allowConstantExport: true }, + ], + }, + }, +) diff --git a/site/index.html b/site/index.html new file mode 100644 index 0000000..0592657 --- /dev/null +++ b/site/index.html @@ -0,0 +1,13 @@ + + + + + + UCM Site + + +
      + + + + diff --git a/site/package.json b/site/package.json new file mode 100644 index 0000000..92ffc0a --- /dev/null +++ b/site/package.json @@ -0,0 +1,51 @@ +{ + "name": "ucm site", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev": "vite", + "build": "tsc -b && vite build", + "lint": "eslint .", + "preview": "vite preview" + }, + "dependencies": { + "@emotion/react": "^11.13.3", + "@emotion/styled": "^11.13.0", + "@fontsource/inter": "^5.1.0", + "@fontsource/roboto": "^5.1.0", + "@mui/icons-material": "^6.1.0", + "@mui/material": "^6.1.0", + "@tanstack/react-query": "^5.59.0", + "@urbit/http-api": "file:../../js-http-api", + "bn.js": "^5.2.1", + "invariant": "^2.2.4", + "lodash": "^4.17.21", + "marked": "^14.1.2", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-html-parser": "^2.0.2", + "react-player": "^2.16.0", + "svgson": "^5.3.1", + "transformation-matrix": "^2.16.1", + "wouter": "^3.3.5", + "zustand": "^4.5.5" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.9.0", + "@types/bn.js": "^5.1.6", + "@types/invariant": "^2.2.37", + "@types/lodash": "^4.17.7", + "@types/react": "^18.3.3", + "@types/react-dom": "^18.3.0", + "@types/react-html-parser": "^2.0.6", + "@vitejs/plugin-react": "^4.3.1", + "globals": "^15.9.0", + "typescript": "^5.6.2", + "vite": "^5.4.1" + } +} diff --git a/site/public/vite.svg b/site/public/vite.svg new file mode 100644 index 0000000..e7b8dfb --- /dev/null +++ b/site/public/vite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/rename-files.js b/site/rename-files.js new file mode 100644 index 0000000..b684d43 --- /dev/null +++ b/site/rename-files.js @@ -0,0 +1,48 @@ + +// rename-files.js +import fs from 'fs'; +import path from 'path'; + +const distDir = path.resolve(__dirname, 'dist'); + +let files; +function renameFilesToLowercase(dir) { + files = fs.readdirSync(dir); + console.log(files, "files") + + files.forEach((file) => { + const oldPath = path.join(dir, file); + const newPath = path.join(dir, file.toLowerCase()); + + // Rename files + if (oldPath !== newPath) { + fs.renameSync(oldPath, newPath); + } + + // If it's a directory, recursively rename files inside + if (fs.statSync(newPath).isDirectory()) { + renameFilesToLowercase(newPath); + } + }); +} +function updateReferences(dir) { + const regex = new RegExp(files.join("|"), 'gi'); + const fils = fs.readdirSync(dir); + console.log("renamed files", fils) + fils.forEach((file) => { + const filePath = path.join(dir, file); + if (fs.statSync(filePath).isFile()) { + let content = fs.readFileSync(filePath, 'utf-8'); + const newContent = content.replace(regex, (match) => match.toLowerCase()); + + if (content !== newContent) { + fs.writeFileSync(filePath, newContent); + } + } else if (fs.statSync(filePath).isDirectory()) { + updateReferences(filePath); + } + }); +} + +renameFilesToLowercase(distDir); +updateReferences(distDir); diff --git a/site/src/App.css b/site/src/App.css new file mode 100644 index 0000000..7bdb146 --- /dev/null +++ b/site/src/App.css @@ -0,0 +1,110 @@ +html, +body, +#root { + width: 100%; + height: 100%; + overflow: hidden; + /* max-width: 1280px; */ + /* margin: 0 auto; */ + /* padding: 2rem; */ + /* text-align: center; */ +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} +em { + margin: 0 0.5ch; +} + +.logo { + height: 6em; + padding: 1.5em; + will-change: filter; + transition: filter 300ms; +} +.logo:hover { + filter: drop-shadow(0 0 2em #646cffaa); +} +.logo.react:hover { + filter: drop-shadow(0 0 2em #61dafbaa); +} + +@keyframes logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} + +@media (prefers-reduced-motion: no-preference) { + a:nth-of-type(2) .logo { + animation: logo-spin infinite 20s linear; + } +} + +.card { + padding: 2em; +} + +.read-the-docs { + color: #888; +} +.textarea textarea, .textarea >div{ + width: 100%; + height: 100% !important; +} +.textarea textarea{ + overflow-y: scroll !important; +} +a { + font-weight: 500; + text-decoration: inherit; +} + + +.msg-inline-code{ + font-family: monospace; + background-color: rgb(0, 0, 0, 0.1); + padding: 0.1rem; +} +.inline-content > span{ + margin: 0 0.3ch; +} +.msg-ship-mention{ + font-family: monospace; +} diff --git a/site/src/App.tsx b/site/src/App.tsx new file mode 100644 index 0000000..e03672f --- /dev/null +++ b/site/src/App.tsx @@ -0,0 +1,61 @@ +import { useEffect } from "react"; +import "./App.css"; +import useStore from "./logic/store"; +import Router, { NotFound } from "./site/Home"; +import CssBaseline from "@mui/material/CssBaseline"; +import AppTheme from "./ui/theme/AppTheme"; +import { LoadingScreen } from "./ui/Components"; +import { + QueryClient, + QueryClientProvider, + useQuery, + useQueryClient, +} from "@tanstack/react-query"; +import { SITE_NAME } from "./logic/constants"; +import { useParams } from "wouter"; +import { ScryRes } from "./logic/comms"; + +function App() { + const { init, loading } = useStore(["init", "loading"]); + useEffect(() => { + init(); + }, []); + const queryClient = new QueryClient(); + + return ( + + + + {loading ? : } + + + ); +} + +export default App; + +function Loader() { + const queryClient = useQueryClient(); + const params: any = useParams(); + const { io } = useStore(["io"]); + const { initSubs, scrySite } = io(); + const { isLoading, data } = useQuery({ + queryKey: ["site"], + queryFn: scrySite, + }); + useEffect(() => { + initSubs(SITE_NAME, (site) => { + queryClient.setQueryData(["site"], (old: ScryRes) => { + return { ...old, site }; + }); + }); + }, []); + + return isLoading ? ( + + ) : data && data.site && data.group ? ( + + ) : ( + + ); +} diff --git a/site/src/assets/icons/comet.svg b/site/src/assets/icons/comet.svg new file mode 100644 index 0000000..2d5c3f5 --- /dev/null +++ b/site/src/assets/icons/comet.svg @@ -0,0 +1,23 @@ + + + + + diff --git a/site/src/assets/icons/spinner.svg b/site/src/assets/icons/spinner.svg new file mode 100755 index 0000000..2a516de --- /dev/null +++ b/site/src/assets/icons/spinner.svg @@ -0,0 +1 @@ + diff --git a/site/src/assets/react.svg b/site/src/assets/react.svg new file mode 100644 index 0000000..6c87de9 --- /dev/null +++ b/site/src/assets/react.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/site/src/logic/comms.ts b/site/src/logic/comms.ts new file mode 100644 index 0000000..4362632 --- /dev/null +++ b/site/src/logic/comms.ts @@ -0,0 +1,529 @@ +import { APP_NAME } from "./constants"; +import { AppType, Ship, Site } from "./types"; +import { addDots, isValidHttpUrl } from "./utils"; +import { + ChannelUpdate, + ChannelsRes, + Content, + DiaryPage, + DiaryPost, + Essay, + Group, + Memo, + PostsPage, +} from "./types-tlon"; +import Urbit from "@urbit/http-api"; + +type EventHandler = (data: any) => void; +type ErrorHandler = (data: any, id: string) => void; + +export function urbitIO(airlock: Urbit) { + const sub = async ( + app: string, + path: string, + event: EventHandler, + err?: ErrorHandler, + quit?: EventHandler, + ) => airlock.subscribe({ app, path, event }); + const unsub = async (num: number) => airlock.unsubscribe(num); + const ninjaSub = async ( + app: string, + path: string, + event: EventHandler, + err?: ErrorHandler, + quit?: EventHandler, + ) => + airlock.subscribe({ app: APP_NAME, path: `/proxy/${app}${path}`, event }); + + const poke = async (app: string, mark: string, json: any) => + // airlock.poke({ + // app: APP_NAME, + // mark: "json", + // json: { ...json, app, mark }, + // }); + airlock.poke({ app, mark, json }); + const ninjaPoke = async ( + desk: string, + app: string, + mark: string, + json: any, + ) => airlock.ninjaPoke({ desk, app, mark, json, proxyApp: APP_NAME }); + const thread = async ( + threadName: string, + desk: string, + inputMark: string, + outputMark: string, + body: any, + ) => airlock.thread({ threadName, desk, inputMark, outputMark, body }); + return { + sub, + unsub, + poke, + ninjaSub, + ninjaPoke, + thread, + }; +} + +export type ScryRes = { + site: Site; + group: Group; +}; +export default function appIO(airlock: Urbit) { + const { sub, unsub, poke, ninjaPoke, ninjaSub, thread } = urbitIO(airlock); + + async function scrySite(): Promise { + const site = window.location.pathname.split("/")[1]; + const res = await fetch("/ucm/api/" + site); + const j = await res.json(); + return j; + } + async function ninjaScry(app: string, path: string): Promise { + const res = await fetch("/ucm/napi" + `/${app}${path}`); + const j = await res.json(); + return j; + } + + async function initSubs(site: string, handler: EventHandler) { + const err = (err: any, id: string) => console.log(err, ""); + const quit = (data: any) => console.log(data, ""); + const res = await sub(APP_NAME, `/ui/${site}`, handler, err, quit); + return res; + } + async function channelsSub(handler: EventHandler) { + const err = (err: any, id: string) => console.log(err, ""); + const quit = (data: any) => console.log(data, ""); + const res = await ninjaSub("channels", "/v1", handler, err, quit); + return res; + } + + // pokes + + async function search( + query: string, + apps: AppType[], + by: string, + start?: number, + end?: number, + ) { + const obj = { site: { search: { query, apps, by, start, end } } }; + return poke(APP_NAME, "json", obj); + } + + // Tlon + async function scryChannels(): Promise { + const res = await ninjaScry("channels", "/v2/channels/full"); + return res; + } + async function scryChatroom( + ship: Ship, + name: string, + count: number, + ): Promise { + const res = await ninjaScry( + "channels", + `/v2/chat/${ship}/${name}/posts/newest/${count}/outline`, + ); + return res; + } + async function sendChatMsg( + author: Ship, + host: Ship, + name: string, + content: Content, + sent: number, + ) { + const nest = `chat/${host}/${name}`; + const mark = "channel-action"; + const desk = "groups"; + const app = "channels"; + const essay = { + "kind-data": { + chat: null, + }, + author, + sent, + content, + }; + const json = { + channel: { + nest, + action: { + post: { + add: essay, + }, + }, + }, + }; + return ninjaPoke(desk, app, mark, json); + } + function fixTlon(pending: Map, update: ChannelUpdate) { + if (!("post" in update.response)) return; + const [kind, host, name] = update.nest.split("/"); + const rpost = update.response.post["r-post"]; + const id = addDots(update.response.post.id, 3); + const needFix = + "set" in rpost + ? editPostAuthor(pending, kind, host as Ship, name, id, rpost.set.essay) + : "reply" in rpost && "set" in rpost.reply["r-reply"] + ? editReplyAuthor( + pending, + kind, + host as Ship, + name, + id, + rpost.reply.id, + rpost.reply["r-reply"].set.memo, + ) + : false; + if (!needFix) return rpost; + } + function editPostAuthor( + pending: Map, + kind: string, + host: Ship, + name: string, + id: string, + essay: Essay, + ) { + const clientShip = (window as any).ship; + const isPending = pending.has(essay.sent); + if (essay.author === host && clientShip !== host && isPending) { + const nessay = { ...essay, author: clientShip }; + fixPost(kind, host, name, id, nessay); + return true; + } else return false; + } + function editReplyAuthor( + pending: Map, + kind: string, + host: Ship, + name: string, + parent_id: string, + id: string, + memo: Memo, + ) { + const clientShip = (window as any).ship; + const isPending = pending.has(memo.sent); + if (memo.author === host && clientShip !== "host" && isPending) { + const nmemo = { ...memo, author: clientShip }; + fixReply(kind, host, name, parent_id, id, nmemo); + return true; + } else return false; + } + + async function fixPost( + kind: string, + host: Ship, + name: string, + id: string, + essay: Essay, + ) { + const nest = `${kind}/${host}/${name}`; + const mark = "channel-action"; + const desk = "groups"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + edit: { + id, + essay, + }, + }, + }, + }, + }; + return ninjaPoke(desk, app, mark, json); + } + async function fixReply( + kind: string, + host: Ship, + name: string, + parent_id: string, + id: string, + memo: Memo, + ) { + const nest = `${kind}/${host}/${name}`; + const mark = "channel-action"; + const desk = "groups"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + reply: { + id: parent_id, + action: { + edit: { + id: addDots(id, 3), + memo, + }, + }, + }, + }, + }, + }, + }; + return ninjaPoke(desk, app, mark, json); + } + async function sendChatReply( + author: Ship, + host: Ship, + name: string, + parent: string, + content: Content, + sent: number, + ) { + const nest = `chat/${host}/${name}`; + const mark = "channel-action"; + const desk = "groups"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + reply: { + id: parent, + action: { + add: { + author, + sent, + content, + }, + }, + }, + }, + }, + }, + }; + return ninjaPoke(desk, app, mark, json); + } + + async function sendDiaryReply( + author: Ship, + host: Ship, + name: string, + parent: string, + content: Content, + sent: number, + ) { + const nest = `diary/${host}/${name}`; + const mark = "channel-action"; + const desk = "groups"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + reply: { + id: parent, // dotted! + action: { + add: { + author, + sent, + content, + }, + }, + }, + }, + }, + }, + }; + return ninjaPoke(desk, app, mark, json); + } + async function sendReact( + author: Ship, + kind: string, + host: Ship, + name: string, + id: string, + react: string, + ) { + const nest = `${kind}/${host}/${name}`; + const mark = "channel-action"; + const desk = "groups"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + "add-react": { + id, + react, + ship: author, + }, + }, + }, + }, + }; + return ninjaPoke(desk, app, mark, json); + } + async function sendReplyReact( + author: Ship, + kind: string, + host: Ship, + name: string, + parentId: string, + id: string, + react: string, + ) { + const nest = `${kind}/${host}/${name}`; + const mark = "channel-action"; + const app = "channels"; + const json = { + channel: { + nest, + action: { + post: { + reply: { + id: parentId, + action: { + "add-react": { + id, + react, + ship: author, + }, + }, + }, + }, + }, + }, + }; + return ninjaPoke("groups", app, mark, json); + } + + async function radioSub(handler: EventHandler) { + return ninjaSub("tower", "/global", handler); + } + async function radioSub2(handler: EventHandler) { + // return ninjaSub("tower", "/greg/local", handler); + return ninjaSub("tower", "/personal", handler); + } + async function radioChat(from: Ship, message: string) { + const time = Date.now(); + const json = { + chat: { + from, + message, + time, + }, + }; + return poke("tower", "radio-action", json); + } + async function radioSpin(title: string, desc: string, playUrl: string) { + if (!isValidHttpUrl(playUrl)) return; + let currentUnixTime = Date.now(); + currentUnixTime = Math.ceil(currentUnixTime); + let pokes = []; + if (title) + pokes.push( + poke("tower", "radio-action", { + talk: title, + }), + ); + if (desc) + pokes.push( + poke("tower", "radio-action", { + description: desc, + }), + ); + if (playUrl) + pokes.push( + poke("tower", "radio-action", { + spin: { + url: playUrl, + time: currentUnixTime, + }, + }), + ); + return await Promise.all(pokes); + } + + async function sendDiaryPost( + author: Ship, + host: Ship, + name: string, + title: string, + image: string, + content: Content, + sent: number, + ) { + const nest = `diary/${host}/${name}`; + const mark = "channel-action"; + const app = "channels"; + const kind = { diary: { title, image } }; + const json = { + channel: { + nest, + action: { + post: { + add: { + author, + sent, + content, + "kind-data": kind, + }, + }, + }, + }, + }; + return ninjaPoke("groups", app, mark, json); + } + async function scryDiary( + ship: Ship, + name: string, + count: number, + ): Promise { + const app = "channels"; + const path = `/v1/diary/${ship}/${name}/posts/newest/${count}/post`; + return await ninjaScry(app, path); + } + async function scryDiaryPost( + ship: Ship, + name: string, + id: string, + ): Promise { + const app = "channels"; + const path = `/v1/diary/${ship}/${name}/posts/post/${id}`; + return await ninjaScry(app, path); + } + async function scryChat( + ship: Ship, + name: string, + count: number, + ): Promise { + const app = "channels"; + const path = `/v1/chat/${ship}/${name}/posts/newest/${count}/post`; + return await ninjaScry(app, path); + } + return { + scrySite, + ninjaScry, + initSubs, + channelsSub, + scryChannels, + scryChatroom, + sendChatMsg, + fixTlon, + sendChatReply, + sendDiaryPost, + sendDiaryReply, + sendReact, + sendReplyReact, + radioSub, + radioSub2, + radioSpin, + radioChat, + search, + scryDiary, + scryDiaryPost, + scryChat, + }; +} diff --git a/site/src/logic/constants.ts b/site/src/logic/constants.ts new file mode 100644 index 0000000..8b374dc --- /dev/null +++ b/site/src/logic/constants.ts @@ -0,0 +1,37 @@ +import { Ship } from "./types"; + +export const APP_NAME = "ucm"; +// export const URL = import.meta.env.PROD ? "" : "http://localhost:8081"; +export const URL = window.location.origin; + +export const MOBILE_BROWSER_REGEX = + /Android|webOS|iPhone|iPad|iPod|BlackBerry/i; +export const AUDIO_REGEX = new RegExp(/https:\/\/.+\.(mp3|wav|ogg)\b/gim); +export const VIDEO_REGEX = new RegExp(/https:\/\/.+\.(mov|mp4|ogv)\b/gim); +export const TWITTER_REGEX = new RegExp( + /https:\/\/(twitter|x)\.com\/.+\/status\/\d+/gim, +); + +export const REF_REGEX = new RegExp( + /urbit:\/\/[a-z0-9-]+\/~[a-z-_]+\/[a-z0-9-_]+/gim, +); +export const RADIO_REGEX = new RegExp(/urbit:\/\/radio\/~[a-z-_]+/gim); + +export const IMAGE_REGEX = new RegExp( + /https:\/\/.+\.(jpg|img|png|gif|tiff|jpeg|webp|webm|svg)\b/gim, +); + +export const SHIP_REGEX = new RegExp(/\B~[a-z-]+/); +export const HASHTAGS_REGEX = new RegExp(/#[a-z-]+/g); + +export const DEFAULT_DATE = { year: 1970, month: 1, day: 1 }; +export const RADIO = "📻"; + +export const RADIO_SHIP: Ship = "~nodmyn-dosrux" as Ship; +export const WIKI_SHIP: Ship = "~holnes" as Ship; + +export const DEFAULT_ICON = "https://s3.sortug.com/img/icons/ucm-logo.png"; + +const firstSlug = window.location.pathname.split("/")[1]; +export const SITE_NAME = firstSlug; +export const BASE_PATH = `/${firstSlug}`; diff --git a/site/src/logic/ob/co.ts b/site/src/logic/ob/co.ts new file mode 100644 index 0000000..c63faae --- /dev/null +++ b/site/src/logic/ob/co.ts @@ -0,0 +1,392 @@ +// ++ co +// +// See arvo/sys/hoon.hoon. +import { BN } from 'bn.js'; +import { chunk, isEqual } from 'lodash'; +import { ob } from './ob'; +import type { Bn, PatP, PatQ, Rank, Iterable, Number } from './types'; + +const zero = new BN(0); +const one = new BN(1); +const two = new BN(2); +const three = new BN(3); +const four = new BN(4); +const five = new BN(5); + +const pre = ` +dozmarbinwansamlitsighidfidlissogdirwacsabwissib\ +rigsoldopmodfoglidhopdardorlorhodfolrintogsilmir\ +holpaslacrovlivdalsatlibtabhanticpidtorbolfosdot\ +losdilforpilramtirwintadbicdifrocwidbisdasmidlop\ +rilnardapmolsanlocnovsitnidtipsicropwitnatpanmin\ +ritpodmottamtolsavposnapnopsomfinfonbanmorworsip\ +ronnorbotwicsocwatdolmagpicdavbidbaltimtasmallig\ +sivtagpadsaldivdactansidfabtarmonranniswolmispal\ +lasdismaprabtobrollatlonnodnavfignomnibpagsopral\ +bilhaddocridmocpacravripfaltodtiltinhapmicfanpat\ +taclabmogsimsonpinlomrictapfirhasbosbatpochactid\ +havsaplindibhosdabbitbarracparloddosbortochilmac\ +tomdigfilfasmithobharmighinradmashalraglagfadtop\ +mophabnilnosmilfopfamdatnoldinhatnacrisfotribhoc\ +nimlarfitwalrapsarnalmoslandondanladdovrivbacpol\ +laptalpitnambonrostonfodponsovnocsorlavmatmipfip\ +`; + +const suf = ` +zodnecbudwessevpersutletfulpensytdurwepserwylsun\ +rypsyxdyrnuphebpeglupdepdysputlughecryttyvsydnex\ +lunmeplutseppesdelsulpedtemledtulmetwenbynhexfeb\ +pyldulhetmevruttylwydtepbesdexsefwycburderneppur\ +rysrebdennutsubpetrulsynregtydsupsemwynrecmegnet\ +secmulnymtevwebsummutnyxrextebfushepbenmuswyxsym\ +selrucdecwexsyrwetdylmynmesdetbetbeltuxtugmyrpel\ +syptermebsetdutdegtexsurfeltudnuxruxrenwytnubmed\ +lytdusnebrumtynseglyxpunresredfunrevrefmectedrus\ +bexlebduxrynnumpyxrygryxfeptyrtustyclegnemfermer\ +tenlusnussyltecmexpubrymtucfyllepdebbermughuttun\ +bylsudpemdevlurdefbusbeprunmelpexdytbyttyplevmyl\ +wedducfurfexnulluclennerlexrupnedlecrydlydfenwel\ +nydhusrelrudneshesfetdesretdunlernyrsebhulryllud\ +remlysfynwerrycsugnysnyllyndyndemluxfedsedbecmun\ +lyrtesmudnytbyrsenwegfyrmurtelreptegpecnelnevfes\ +`; + +const patp2syls = (name: string): string[] => + name.replace(/[\^~-]/g, '').match(/.{1,3}/g) || []; + +const splitAt = (index: number, str: string) => [str.slice(0, index), str.slice(index)]; + +const prefixes = pre.match(/.{1,3}/g) as RegExpMatchArray; + +const suffixes = suf.match(/.{1,3}/g) as RegExpMatchArray; + +const bex = (n: Bn): Bn => two.pow(n); + +const rsh = (a: Bn, b: Bn, c: Bn): Bn => c.div(bex(bex(a).mul(b))); + +const met = (a: Bn, b: Bn, c: Bn = zero): Bn => + b.eq(zero) ? c : met(a, rsh(a, one, b), c.add(one)); + +const end = (a: Bn, b: Bn, c: Bn) => c.mod(bex(bex(a).mul(b))); + +/** + * Convert a hex-encoded string to a @p-encoded string. + * + */ +const hex2patp = (hex: string): string => { + if (hex === null) { + throw new Error('hex2patp: null input'); + } + return patp(new BN(hex, 'hex')); +}; + +/** + * Convert a @p-encoded string to a hex-encoded string. + * + * @param {String} name @p + * @return {String} + */ +const patp2hex = (name: PatP): string => { + if (isValidPat(name) === false) { + throw new Error('patp2hex: not a valid @p'); + } + const syls = patp2syls(name); + + const syl2bin = (idx: number) => idx.toString(2).padStart(8, '0'); + + const addr = syls.reduce( + (acc, syl, idx) => + idx % 2 !== 0 || syls.length === 1 + ? acc + syl2bin(suffixes.indexOf(syl)) + : acc + syl2bin(prefixes.indexOf(syl)), + '', + ); + + const bn = new BN(addr, 2); + const hex = ob.fynd(bn).toString('hex'); + return hex.length % 2 !== 0 ? hex.padStart(hex.length + 1, '0') : hex; +}; + +/** + * Convert a @p-encoded string to a bignum. + * + */ +const patp2bn = (name: PatP): Bn => new BN(patp2hex(name), 'hex'); + +/** + * Convert a @p-encoded string to a decimal-encoded string. + * + */ +export const patp2dec = (name: PatP): string => { + let bn; + try { + bn = patp2bn(name); + } catch (_) { + throw new Error('patp2dec: not a valid @p'); + } + return bn.toString(); +}; + +/** + * Convert a number to a @q-encoded string. + * + */ +const patq = (arg: number | Bn | string): string => { + const bn = new BN(arg); + const buf = bn.toArrayLike(Buffer); + return buf2patq(buf); +}; + +/** + * Convert a Buffer into a @q-encoded string. + * + */ +const buf2patq = (buf: Buffer): string => { + const chunked = + buf.length % 2 !== 0 && buf.length > 1 + ? [[buf[0]]].concat(chunk(buf.slice(1), 2)) + : chunk(buf, 2); + + const prefixName = (byts: number[]) => + byts[1] === undefined + ? prefixes[0] + suffixes[byts[0]] + : prefixes[byts[0]] + suffixes[byts[1]]; + + const name = (byts: number[]) => + byts[1] === undefined ? suffixes[byts[0]] : prefixes[byts[0]] + suffixes[byts[1]]; + + const alg = (pair: number[]) => + pair.length % 2 !== 0 && chunked.length > 1 ? prefixName(pair) : name(pair); + + return chunked.reduce((acc, elem) => acc + (acc === '~' ? '' : '-') + alg(elem), '~'); +}; + +/** + * Convert a hex-encoded string to a @q-encoded string. + * + * Note that this preserves leading zero bytes. + * + */ +const hex2patq = (arg: string): string => { + const hex = arg.length % 2 !== 0 ? arg.padStart(arg.length + 1, '0') : arg; + + const buf = Buffer.from(hex, 'hex'); + return buf2patq(buf); +}; + +/** + * Convert a @q-encoded string to a hex-encoded string. + * + * Note that this preserves leading zero bytes. + * + */ +const patq2hex = (name: PatQ): string => { + if (isValidPat(name) === false) { + throw new Error('patq2hex: not a valid @q'); + } + const chunks = name.slice(1).split('-'); + const dec2hex = (dec: number) => dec.toString(16).padStart(2, '0'); + + const splat = chunks.map((chunk) => { + let syls = splitAt(3, chunk); + return syls[1] === '' + ? dec2hex(suffixes.indexOf(syls[0])) + : dec2hex(prefixes.indexOf(syls[0])) + dec2hex(suffixes.indexOf(syls[1])); + }); + + return name.length === 0 ? '00' : splat.join(''); +}; + +/** + * Convert a @q-encoded string to a bignum. + * + */ +const patq2bn = (name: PatQ): Bn => new BN(patq2hex(name), 'hex'); + +/** + * Convert a @q-encoded string to a decimal-encoded string. + * + */ +const patq2dec = (name: PatQ): string => { + let bn; + try { + bn = patq2bn(name); + } catch (_) { + throw new Error('patq2dec: not a valid @q'); + } + return bn.toString(); +}; + +/** + * Determine the ship class of a @p value. + * + */ +const clan = (who: PatP): Rank => { + let name; + try { + name = patp2bn(who); + } catch (_) { + throw new Error('clan: not a valid @p'); + } + + const wid = met(three, name); + return wid.lte(one) + ? 'galaxy' + : wid.eq(two) + ? 'star' + : wid.lte(four) + ? 'planet' + : wid.lte(new BN(8)) + ? 'moon' + : 'comet'; +}; + +/** + * Determine the parent of a @p value. + * + */ +const sein = (name: PatP): PatP => { + let who; + try { + who = patp2bn(name); + } catch (_) { + throw new Error('sein: not a valid @p'); + } + + let mir; + try { + mir = clan(name); + } catch (_) { + throw new Error('sein: not a valid @p'); + } + + const res = + mir === 'galaxy' + ? who + : mir === 'star' + ? end(three, one, who) + : mir === 'planet' + ? end(four, one, who) + : mir === 'moon' + ? end(five, one, who) + : zero; + return patp(res); +}; + +/** + * Weakly check if a string is a valid @p or @q value. + * + * This is, at present, a pretty weak sanity check. It doesn't confirm the + * structure precisely (e.g. dashes), and for @q, it's required that q values + * of (greater than one) odd bytelength have been zero-padded. So, for + * example, '~doznec-binwod' will be considered a valid @q, but '~nec-binwod' + * will not. + * + + */ +export const isValidPat = (name: PatQ | PatP): boolean => { + if (typeof name !== 'string') { + throw new Error('isValidPat: non-string input'); + } + + const leadingTilde = name.slice(0, 1) === '~'; + + if (leadingTilde === false || name.length < 4) { + return false; + } else { + const syls = patp2syls(name); + const wrongLength = syls.length % 2 !== 0 && syls.length !== 1; + const sylsExist = syls.reduce( + (acc: boolean, syl, index) => + acc && + (index % 2 !== 0 || syls.length === 1 + ? suffixes.includes(syl) + : prefixes.includes(syl)), + true, + ); + + return !wrongLength && sylsExist; + } +}; + +/** + * Validate a @p string. + * + */ +export const isValidPatp = (str: PatP): boolean => + isValidPat(str) && str === patp(patp2dec(str)); + +/** + * Validate a @q string. + * + */ +const isValidPatq = (str: PatQ): boolean => + isValidPat(str) && eqPatq(str, patq(patq2dec(str))); + +/** + * Remove all leading zero bytes from a sliceable value. + */ +const removeLeadingZeroBytes = (str: Iterable): Iterable => + str.slice(0, 2) === '00' ? removeLeadingZeroBytes(str.slice(2)) : str; + +/** + * Equality comparison, modulo leading zero bytes. + */ +const eqModLeadingZeroBytes = (s: Iterable, t: Iterable): boolean => + isEqual(removeLeadingZeroBytes(s), removeLeadingZeroBytes(t)); + +/** + * Equality comparison on @q values. + */ +const eqPatq = (p: PatQ, q: PatQ): boolean => { + let phex; + try { + phex = patq2hex(p); + } catch (_) { + throw new Error('eqPatq: not a valid @q'); + } + + let qhex; + try { + qhex = patq2hex(q); + } catch (_) { + throw new Error('eqPatq: not a valid @q'); + } + + return eqModLeadingZeroBytes(phex, qhex); +}; + +/** + * Convert a number to a @p-encoded string. + * + * @param {String, Number, BN} arg + * @return {String} + */ +const patp = (arg: number | string | Bn): PatP => { + if (arg === null) { + throw new Error('patp: null input'); + } + const n = new BN(arg); + + const sxz = ob.fein(n); + const dyy = met(four, sxz); + + const loop = (tsxz: Bn, timp: Bn, trep: string): string => { + const log = end(four, one, tsxz); + const pre = prefixes[rsh(three, one, log).toNumber()]; + const suf = suffixes[end(three, one, log).toNumber()]; + const etc = timp.mod(four).eq(zero) ? (timp.eq(zero) ? '' : '--') : '-'; + + const res = pre + suf + etc + trep; + + return timp.eq(dyy) ? trep : loop(rsh(four, one, tsxz), timp.add(one), res); + }; + + const dyx = met(three, sxz); + + return '~' + (dyx.lte(one) ? suffixes[sxz.toNumber()] : loop(sxz, zero, '')); +}; + +export const co = { + patp, +}; diff --git a/site/src/logic/ob/muk.ts b/site/src/logic/ob/muk.ts new file mode 100644 index 0000000..c9d191b --- /dev/null +++ b/site/src/logic/ob/muk.ts @@ -0,0 +1,116 @@ +// ++ muk +// +// See arvo/sys/hoon.hoon. +import { BN } from 'bn.js'; +import type { Bn, PatP, PatQ, Rank, Iterable, Number } from './types'; + +const ux_FF = new BN(0xff); +const ux_FF00 = new BN(0xff00); +const u_256 = new BN(256); + +/** + * Standard murmur3. + * + */ +export const muk = (syd: number, len: number, key: Bn): Bn => { + const lo = key.and(ux_FF).toNumber(); + const hi = key.and(ux_FF00).div(u_256).toNumber(); + const kee = String.fromCharCode(lo) + String.fromCharCode(hi); + return new BN(murmurhash3_32_gc(kee, syd)); +}; + +// see: https://github.com/garycourt/murmurhash-js +// +// Copyright (c) 2011 Gary Court +// +// Permission is hereby granted, free of charge, to any person obtaining a copy of +// this software and associated documentation files (the "Software"), to deal in +// the Software without restriction, including without limitation the rights to +// use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +// of the Software, and to permit persons to whom the Software is furnished to do +// so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in all +// copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +// SOFTWARE. + +/** + * JS Implementation of MurmurHash3 (r136) (as of May 20, 2011) + * + * @author Gary Court + * @see http://github.com/garycourt/murmurhash-js + * @author Austin Appleby + * @see http://sites.google.com/site/murmurhash/ + * + * @param {string} key ASCII only + * @param {number} seed Positive integer only + * @return {number} 32-bit positive integer hash + **/ +const murmurhash3_32_gc = (key: string, seed: number): number => { + // eslint-disable-next-line no-unused-vars + let remainder, bytes, h1, h1b, c1, c1b, c2, c2b, k1, i; + + remainder = key.length & 3; // key.length % 4 + bytes = key.length - remainder; + h1 = seed; + c1 = 0xcc9e2d51; + c2 = 0x1b873593; + i = 0; + + while (i < bytes) { + k1 = + (key.charCodeAt(i) & 0xff) | + ((key.charCodeAt(++i) & 0xff) << 8) | + ((key.charCodeAt(++i) & 0xff) << 16) | + ((key.charCodeAt(++i) & 0xff) << 24); + ++i; + + k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; + + h1 ^= k1; + h1 = (h1 << 13) | (h1 >>> 19); + h1b = ((h1 & 0xffff) * 5 + ((((h1 >>> 16) * 5) & 0xffff) << 16)) & 0xffffffff; + h1 = (h1b & 0xffff) + 0x6b64 + ((((h1b >>> 16) + 0xe654) & 0xffff) << 16); + } + + k1 = 0; + + switch (remainder) { + case 3: + k1 ^= (key.charCodeAt(i + 2) & 0xff) << 16; + // eslint-disable-next-line no-fallthrough + case 2: + k1 ^= (key.charCodeAt(i + 1) & 0xff) << 8; + // eslint-disable-next-line no-fallthrough + case 1: + k1 ^= key.charCodeAt(i) & 0xff; + + k1 = ((k1 & 0xffff) * c1 + ((((k1 >>> 16) * c1) & 0xffff) << 16)) & 0xffffffff; + k1 = (k1 << 15) | (k1 >>> 17); + k1 = ((k1 & 0xffff) * c2 + ((((k1 >>> 16) * c2) & 0xffff) << 16)) & 0xffffffff; + h1 ^= k1; + } + + h1 ^= key.length; + + h1 ^= h1 >>> 16; + h1 = + ((h1 & 0xffff) * 0x85ebca6b + ((((h1 >>> 16) * 0x85ebca6b) & 0xffff) << 16)) & + 0xffffffff; + h1 ^= h1 >>> 13; + h1 = + ((h1 & 0xffff) * 0xc2b2ae35 + ((((h1 >>> 16) * 0xc2b2ae35) & 0xffff) << 16)) & + 0xffffffff; + h1 ^= h1 >>> 16; + + return h1 >>> 0; +}; diff --git a/site/src/logic/ob/ob.ts b/site/src/logic/ob/ob.ts new file mode 100644 index 0000000..70f5c22 --- /dev/null +++ b/site/src/logic/ob/ob.ts @@ -0,0 +1,166 @@ +// ++ ob +// +// See arvo/sys/hoon.hoon. +import { BN } from 'bn.js'; +import { muk } from './muk'; +import type { Bn, Number } from './types'; + +const ux_1_0000 = new BN('10000', 'hex'); +const ux_ffff_ffff = new BN('ffffffff', 'hex'); +const ux_1_0000_0000 = new BN('100000000', 'hex'); +const ux_ffff_ffff_ffff_ffff = new BN('ffffffffffffffff', 'hex'); +const ux_ffff_ffff_0000_0000 = new BN('ffffffff00000000', 'hex'); + +const u_65535 = new BN('65535'); +const u_65536 = new BN('65536'); + +// a PRF for j in { 0, .., 3 } +const F = (j: number, arg: Bn): Bn => { + const raku = [0xb76d5eed, 0xee281300, 0x85bcae01, 0x4b387af7]; + + return muk(raku[j], 2, arg); +}; + +/** + * Conceal structure v3. + * + */ +const fein = (arg: Number): Bn => { + const loop = (pyn: Bn): Bn => { + const lo = pyn.and(ux_ffff_ffff); + const hi = pyn.and(ux_ffff_ffff_0000_0000); + + return pyn.gte(ux_1_0000) && pyn.lte(ux_ffff_ffff) + ? ux_1_0000.add(feis(pyn.sub(ux_1_0000))) + : pyn.gte(ux_1_0000_0000) && pyn.lte(ux_ffff_ffff_ffff_ffff) + ? hi.or(loop(lo)) + : pyn; + }; + + return loop(new BN(arg)); +}; + +/** + * Restore structure v3. + * + */ +const fynd = (arg: Number): Bn => { + const loop = (cry: Bn): Bn => { + const lo = cry.and(ux_ffff_ffff); + const hi = cry.and(ux_ffff_ffff_0000_0000); + + return cry.gte(ux_1_0000) && cry.lte(ux_ffff_ffff) + ? ux_1_0000.add(tail(cry.sub(ux_1_0000))) + : cry.gte(ux_1_0000_0000) && cry.lte(ux_ffff_ffff_ffff_ffff) + ? hi.or(loop(lo)) + : cry; + }; + + return loop(new BN(arg)); +}; + +/** + * Generalised Feistel cipher. + * + * See: Black and Rogaway (2002), "Ciphers with arbitrary finite domains." + * + * Note that this has been adjusted from the reference paper in order to + * support some legacy behaviour. + * + * @param {String, Number, BN} + * @return {BN} + */ +const feis = (arg: Number): Bn => Fe(4, u_65535, u_65536, ux_ffff_ffff, F, new BN(arg)); + +const Fe = (r: number, a: Bn, b: Bn, k: Bn, f: typeof F, m: Bn): Bn => { + const c = fe(r, a, b, f, m); + return c.lt(k) ? c : fe(r, a, b, f, c); +}; + +const fe = (r: number, a: Bn, b: Bn, f: typeof F, m: Bn) => { + const loop = (j: number, ell: Bn, arr: Bn): Bn => { + if (j > r) { + return r % 2 !== 0 + ? a.mul(arr).add(ell) + : arr.eq(a) + ? a.mul(arr).add(ell) + : a.mul(ell).add(arr); + } else { + const eff = f(j - 1, arr); + + const tmp = j % 2 !== 0 ? ell.add(eff).mod(a) : ell.add(eff).mod(b); + + return loop(j + 1, arr, tmp); + } + }; + + const L = m.mod(a); + const R = m.div(a); + + return loop(1, L, R); +}; + +/** + * Reverse 'feis'. + * + * See: Black and Rogaway (2002), "Ciphers with arbitrary finite domains." + * + * Note that this has been adjusted from the reference paper in order to + * support some legacy behaviour. + * + * @param {Number, String, BN} arg + * @return {BN} + */ +const tail = (arg: Number): Bn => Fen(4, u_65535, u_65536, ux_ffff_ffff, F, new BN(arg)); + +const Fen = (r: number, a: Bn, b: Bn, k: Bn, f: typeof F, m: Bn): Bn => { + const c = fen(r, a, b, f, m); + return c.lt(k) ? c : fen(r, a, b, f, c); +}; + +const fen = (r: number, a: Bn, b: Bn, f: typeof F, m: Bn) => { + const loop = (j: number, ell: Bn, arr: Bn): Bn => { + if (j < 1) { + return a.mul(arr).add(ell); + } else { + const eff = f(j - 1, ell); + + // NB (jtobin): + // + // Slight deviation from B&R (2002) here to prevent negative values. We + // add 'a' or 'b' to arr as appropriate and reduce 'eff' modulo the same + // number before performing subtraction. + // + const tmp = + j % 2 !== 0 + ? arr.add(a).sub(eff.mod(a)).mod(a) + : arr.add(b).sub(eff.mod(b)).mod(b); + + return loop(j - 1, tmp, ell); + } + }; + + const ahh = r % 2 !== 0 ? m.div(a) : m.mod(a); + + const ale = r % 2 !== 0 ? m.mod(a) : m.div(a); + + const L = ale.eq(a) ? ahh : ale; + + const R = ale.eq(a) ? ale : ahh; + + return loop(r, L, R); +}; + +export const ob = { + F, + + fe, + Fe, + feis, + fein, + + fen, + Fen, + tail, + fynd, +}; diff --git a/site/src/logic/ob/types.ts b/site/src/logic/ob/types.ts new file mode 100644 index 0000000..8d74530 --- /dev/null +++ b/site/src/logic/ob/types.ts @@ -0,0 +1,7 @@ +import { BN } from 'bn.js'; +export type Bn = InstanceType; +export type PatP = string; +export type PatQ = string; +export type Rank = 'galaxy' | 'star' | 'planet' | 'moon' | 'comet'; +export type Iterable = any[] | Buffer | string; +export type Number = number | string | Bn; diff --git a/site/src/logic/store.ts b/site/src/logic/store.ts new file mode 100644 index 0000000..6a46288 --- /dev/null +++ b/site/src/logic/store.ts @@ -0,0 +1,150 @@ +import Urbit from "@urbit/http-api"; +import { create } from "zustand"; +import { persist } from "zustand/middleware"; +import { SITE_NAME, URL } from "./constants"; +import io from "./comms"; +import { Ship, Site, SiteBunt } from "./types"; +import { + ChanRPost, + ChannelType, + ChannelUpdate, + ChannelsRes, + Content, + GroupBunt, + Group as TlonGroup, +} from "./types-tlon"; + +interface ClientState { + airlock: Urbit; + clientShip: Ship; + init: () => Promise; + sync: () => Promise; + modal: JSX.Element | null; + setModal: (m: JSX.Element | null) => void; + setSiteState: (s: Site) => void; + siteState: Site; + group: TlonGroup; + loading: boolean; + setLoading: (b: boolean) => void; + addPending: (ts: number, c: Content) => void; + delPending: (ts: number) => void; + pendingPosts: Map; + lastChannelUpdate: ChanRPost | null; + io: () => ReturnType; +} +export async function start(): Promise { + const airlock = new Urbit(URL, ""); + await airlock.getShipName(); + await airlock.poke({ app: "hood", mark: "helm-hi", json: "opening airlock" }); + await airlock.eventSource(); + return airlock; +} +export async function getShip(): Promise { + const res2 = await fetch(URL + "/~/name"); + const ship2 = await res2.text(); + return ship2 as Ship; +} + +const stateStore = create()( + // persist( + (set, get) => ({ + loading: true, + setLoading: (loading) => set({ loading }), + airlock: new Urbit(URL), + clientShip: (window as any).ship, + setSiteState: (siteState) => set({ siteState }), + siteState: SiteBunt, + group: GroupBunt, + sync: async () => { + set({ loading: true }); + const airlock = get().airlock; + set({ + loading: false, + }); + }, + init: async () => { + const airlock = await start(); + const aio = io(airlock); + aio.channelsSub((data: ChannelUpdate) => { + const pending = get().pendingPosts; + if ("pending" in data.response) { + return; + } else { + const [kind, host, name] = data.nest.split("/"); + const rpost = aio.fixTlon(pending, data); + if (rpost) + set({ + lastChannelUpdate: { + update: rpost, + host: host as Ship, + kind: kind as ChannelType, + name, + }, + }); + } + }); + set({ + airlock, + loading: false, + }); + }, + addPending: (ts, content) => { + set((s) => { + s.pendingPosts.set(ts, content); + return { pendingPosts: s.pendingPosts }; + }); + }, + delPending: (ts) => { + set((s) => { + s.pendingPosts.delete(ts); + return { pendingPosts: s.pendingPosts }; + }); + }, + pendingPosts: new Map(), + lastChannelUpdate: null, + modal: null, + setModal: (m) => set({ modal: m }), + io: () => { + const airlock = get().airlock; + const aio = io(airlock); + return aio; + }, + }), + // { + // name: "ublog-storage", + // }, + // ), +); + +// very nice +// https://dev.to/eraywebdev/optimizing-zustand-how-to-prevent-unnecessary-re-renders-in-your-react-app-59do +import { StoreApi, UseBoundStore } from "zustand"; +import { shallow } from "zustand/shallow"; +import { addDots } from "./utils"; + +type GenericState = Record; + +export const createStoreWithSelectors = ( + store: UseBoundStore>, +): ((keys: K[]) => Pick) => { + const useStore: (keys: K[]) => Pick = < + K extends keyof T, + >( + keys: K[], + ) => { + // console.log(keys, "keys"); + return store((state) => { + const x = keys.reduce((acc, cur) => { + acc[cur] = state[cur]; + return acc; + }, {} as T); + + return x as Pick; + }, shallow); + }; + + return useStore; +}; + +const useStore = createStoreWithSelectors(stateStore); +export default useStore; diff --git a/site/src/logic/tlon-helpers.ts b/site/src/logic/tlon-helpers.ts new file mode 100644 index 0000000..f67a664 --- /dev/null +++ b/site/src/logic/tlon-helpers.ts @@ -0,0 +1,705 @@ +import { + Block, + ChannelUpdate, + ChatQuoteParams, + Content, + Essay, + Inline, + Listing, + Memo, + Nest, + RPost, + Reply, + Seal, + Verse, + Writ, +} from "./types-tlon"; +import { Ship } from "./types"; +import { Token, Tokens, marked } from "marked"; +import { isValidPatp } from "./ob/co"; +import { addDots, addDots5, makeDottedIndex } from "./utils"; +import { REF_REGEX, SHIP_REGEX } from "./constants"; +import Urbit from "@urbit/http-api"; +export function buildMemo(author: Ship, content: Content): Memo { + return { + author, + sent: Date.now(), + content, + }; +} +export function buildEssay(author: Ship, content: Content): Essay { + return { + author, + sent: Date.now(), + content, + "kind-data": { chat: null }, + }; +} + +export function buildClubPost(author: Ship, chatID: string, essay: Essay) { + // ids now are ~ship/170.123... + const { "kind-data": _, ...memo } = essay; + const index = makeDottedIndex(); + const id = `${author}/${index}`; + const json = { + id: chatID, + diff: { + uid: "0v3", + delta: { + writ: { + id, + delta: { + add: { + time: null, + kind: null, + memo, + }, + }, + }, + }, + }, + }; + return { + app: "chat", + mark: "chat-club-action-0", + json, + }; +} +export function buildNDM(author: Ship, ship: Ship, memo: Memo) { + // ids now are ~ship/170.123... + const index = makeDottedIndex(); + const id = `${author}/${index}`; + const json = { + ship, + diff: { + id: id, + delta: { + add: { + time: null, + kind: null, + memo, + }, + }, + }, + }; + return { + app: "chat", + mark: "chat-dm-action", + json, + }; +} +export function buildNChatPost(nes: Nest, essay: Essay) { + const nest = nestToString(nes); + // ids now are ~ship/170.123... + const json = { + channel: { + nest, + action: { + post: { + add: essay, + }, + }, + }, + }; + return { + app: "channels", + mark: "channel-action", + json, + }; +} +export function buildDMReply( + our: Ship, + ship: Ship, + author: Ship, + parent: string, + memo: Memo, +) { + const id = makeDottedIndex(); + const json = { + ship, + diff: { + id: `${author}/${parent}`, + delta: { + reply: { + meta: null, + id: `${our}/${id}`, + delta: { + add: { + memo, + time: null, + }, + }, + }, + }, + }, + }; + return { + app: "chat", + mark: "chat-dm-action", + json, + }; +} +export function buildClubReply( + our: Ship, + clubID: string, + author: Ship, + parent: string, + memo: Memo, +) { + const id = makeDottedIndex(); + const json = { + id: addDots5(clubID), + diff: { + delta: { + writ: { + delta: { + reply: { + delta: { + add: { + memo, + time: null, + }, + }, + meta: null, + id: `${our}/${id}`, + }, + }, + id: `${author}/${parent}`, + }, + }, + uid: "0v3", + }, + }; + return { + app: "chat", + mark: "chat-club-action-0", + json, + }; +} +export function buildChatReply(parent: string, nest: string, memo: Memo) { + // club reply + const json = { + channel: { + nest, + action: { + post: { + reply: { + id: parent, + action: { + add: memo, + }, + }, + }, + }, + }, + }; + return { + app: "channels", + mark: "channel-action", + json, + }; +} +export function buildDiaryPost( + author: Ship, + resource: string, + title: string, + inline: Inline[], +) { + const index = makeDottedIndex(); + const json = { + flag: resource, + update: { + time: "", + diff: { + notes: { + time: index, + delta: { + add: { + author, + image: "", + title, + sent: Date.now(), + content: [{ inline }], + }, + }, + }, + }, + }, + }; + return { + app: "diary", + mark: "diary-action-0", + json, + }; +} +export function buildHeapPost( + author: Ship, + resource: string, + title: string, + inline: Inline[], +) { + const index = makeDottedIndex(); + const json = { + flag: resource, + update: { + time: "", + diff: { + curios: { + time: index, + delta: { + add: { + author, + title, + replying: null, + sent: Date.now(), + content: { + block: [], + inline, + }, + }, + }, + }, + }, + }, + }; + return { + app: "heap", + mark: "heap-action-0", + json, + }; +} +// export function markdownToReply( +// our: Ship, +// parent: string, +// s: string +// ): ReplyGraph { +// const verses = tokenize(s); +// const memo = buildMemo(our, verses); +// const provIndex = makeDottedIndex(); +// const graph = memoToReply(provIndex, parent, memo); +// return graph; +// } +export function chatQuoteToCite(cq: ChatQuoteParams): Verse { + const nest = cq.nest as any; + const where = `/msg/${cq.id}`; + return { + block: { + cite: { + chan: { nest, where }, + }, + }, + }; +} +export function markdownToWrit( + our: Ship, + s: string, + images: string[], + cite: ChatQuoteParams | null, +): Essay { + const verses = tokenize(s); + const fverses = cite ? [...verses, chatQuoteToCite(cite)] : verses; + const f = [...fverses, ...images.map(buildImage)]; + const essay = buildEssay(our, f); + return essay; +} +function buildImage(src: string): Verse { + return { + block: { + image: { + src, + alt: "", + height: 100, + width: 100, // TODO wtf + }, + }, + }; +} + +export function provWrit(essay: Essay): Writ { + const seal: Seal = { + id: essay.sent.toString(), + reacts: {}, + replies: {}, + meta: { + lastRepliers: [], + lastReply: null, + replyCount: 0, + }, + }; + return { essay, seal, prov: true }; +} +// export function memoToReply(id: string, parent: string, memo: Memo): ReplyGraph { +// const writ = { +// memo, +// seal: { +// reacts: {}, +// id, +// "parent-id": parent, +// }, +// }; +// return { [id]: writ }; +// } + +export function memoToChatReply( + parentID: string, + fullID: string, + id: string, + memo: Memo, +): Reply { + const seal = { + id: fullID, + reacts: {}, + "parent-id": parentID, + time: id, // non dotted + }; + return { memo, seal }; +} +export function memoToWrit(id: string, memo: Memo, time: string): Writ { + const writ = { + essay: { ...memo, "kind-data": { chat: null } }, + seal: { + time, + reacts: {}, + id, + replies: {}, + meta: { + lastRepliers: [], + lastReply: null, + replyCount: 0, + }, + }, + }; + return writ; +} +export function essayToWrit(id: string, essay: Essay): Writ { + return { + essay, + seal: { + reacts: {}, + id: `${essay.author}/${id}`, + replies: {}, + meta: { + lastRepliers: [], + lastReply: null, + replyCount: 0, + }, + }, + }; +} +export function tokenize(s: string): Content { + // TODO there must be a better way to do this + // // man this is annoying. Thanks github, fuck you maintainers. + // const notEscape: marked.MarkedExtension = { + // name: "singleQuote", + // level: "inline", // This is an inline-level tokenizer + // start(src: string) { + // return src.match(/['"<>&]/); + // }, // Hint to Marked.js to stop and check for a match + // tokenizer(src: string, tokens: marked.Token[]) { + // const rule = /['"<>&]/; // Regex for the complete token, anchor to string start + // const match = rule.exec(src); + // if (match) { + // return { + // // Token to generate + // type: "singleQuote", // Should match "name" above + // raw: match[0], // Text to consume from the source + // // text: match[0], // Additional custom properties + // }; + // } + // }, + // renderer(token) { + // return token.text; + // } + // }; + marked.use({ + breaks: true, + }); + // marked.use({ extensions: [notEscape] }); + // const m = marked.lexer(s); + // const tokens = m.map(lexerToTlon).flat(); + // return tokens; + const m = inputToMDTokens(s); + const tokens = m.reduce(lexerToTlonTop, [] as Verse[]); + return tokens; +} +export function inputToMDTokens(input: string) { + const refExtension = { + name: "ref", + level: "inline" as "inline", + start(src: string) { + return src.match(REF_REGEX)?.index; + }, + tokenizer(src: string) { + const ref = src.match(REF_REGEX); + if (!ref || !ref.index || ref.index > 0) return; + return { + type: "ref", + raw: src, + text: src, + }; + }, + }; + const shipExtension = { + name: "ship", + level: "inline" as "inline", + start(src: string) { + return src.match(SHIP_REGEX)?.index; + }, + tokenizer(src: string) { + const ship = src.match(SHIP_REGEX); + if (ship && isValidPatp(ship[0])) { + if (!ship || !ship.index || ship.index > 0) return; + return { + type: "ship", + raw: ship[0], + text: ship[0].trim(), + }; + } + }, + }; + marked.use({ breaks: true, extensions: [refExtension, shipExtension] }); + const md = marked.lexer(input); + return md; +} +function lexerToTlonTop(acc: Verse[], m: Token): Verse[] { + // console.log(m, "parsing"); + if (m.type === "paragraph") + return [...acc, { inline: m.tokens!.map(lexerToTlon).flat() }]; + if (m.type === "blockquote") + return [ + ...acc, + { inline: [{ blockquote: m.tokens!.map(lexerToTlon).flat() }] }, + ]; + if (m.type === "code") return [...acc, { block: tlonCodeblock(m) }]; + if (m.type === "list") return [...acc, { block: { listing: tlonList(m) } }]; + if (m.type === "heading") return [...acc, { block: tlonHeading(m) }]; + else return acc; +} +function tlonHeading(t: any) { + return { + header: { + content: t.tokens.map(lexerToTlon).flat(), + tag: `h${t.depth}`, + }, + }; +} +function tlonCodeblock(t: any) { + return { + code: { + code: t.text, + lang: t.lang, + }, + }; +} +function tlonList(t: any): Listing { + return { + list: { + type: t.ordered ? "ordered" : "unordered", + items: t.items.map(tlonListItem), + contents: [], + }, + }; +} +function tlonListItem(t: any) { + return { + item: t.tokens.map(lexerToTlon).flat(), + }; +} +export function unEscape(s: string): string { + var e = document.createElement("textarea"); + e.innerHTML = s; + // handle case of empty input + return e.childNodes.length === 0 ? "" : e.childNodes[0].nodeValue || ""; +} +function lexerToTlon(m: Token): Inline[] { + if ("text" in m) m.text = unEscape(m.text.trim()); + if (m.type === "text") return parsePlainText(m.text.trim()); + if (m.type === "ref") return m.text; + else if (m.type === "paragraph") return m.tokens!.map(lexerToTlon).flat(); + else if (m.type === "space") return [{ break: null }]; + else if (m.type === "ship") return [{ ship: m.text }]; + else if (m.type === "em") + return [{ italics: m.tokens!.map(lexerToTlon).flat() }]; + else if (m.type === "strong") + return [{ bold: m.tokens!.map(lexerToTlon).flat() }]; + else if (m.type === "del") + return [{ strike: m.tokens!.map(lexerToTlon).flat() }]; + else if (m.type === "blockquote") + return [{ blockquote: m.tokens!.map(lexerToTlon).flat() }]; + else if (m.type === "link") + return [{ link: { href: m.href, content: m.text } }]; + else if (m.type === "image") + return [{ link: { href: m.href, content: m.text } }]; + else if (m.type === "code") return [{ code: m.text, lang: m.lang }]; + else if (m.type === "codespan") return [{ "inline-code": m.text }]; + else if (m.type === "br") return [{ break: null }]; + else if (m.type === "list") return m.items.map(markdownListToTlon).flat(); + else if (m.type === "html" || m.type === "heading") + return parsePlainText(m.text); + else return [m.raw]; +} +function markdownListToTlon(m: Tokens.ListItem): Inline[] { + return [m.raw, { break: null }]; +} +function parsePlainText(s: string): Inline[] { + let data: tokenizerData = [s, []]; + data = extract_mention(data); + data = extract_url(data); + return extract_text(data); +} +// tokenizer adapted from graph-store implementation +type tokenizerData = [string, taggedContent[]]; +type taggedContent = [string, Inline]; +export function extract_mention(data: tokenizerData): tokenizerData { + // const regex = /(^|\s)~[a-z_-]+/g; + const matches = data[0].match(SHIP_REGEX); + if (!matches) return data; + else + return matches.reduce((acc, item) => { + const uid = `;;${Math.random().toString(36).substring(8)};;`; + if (isValidPatp(item.trim())) + return [ + acc[0].replace(item, uid), + [...acc[1], [uid, { ship: item.trim() }]], + ]; + else return acc; + }, data); +} +export const URL_REGEX = + /https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,10}\b([-a-zA-Z0-9()@:%_\+.~#?&//=]*)/g; +function extract_url(data: tokenizerData): tokenizerData { + const matches = data[0].match(URL_REGEX); + if (!matches) return data; + else + return matches.reduce((acc, item) => { + const uid = `;;${Math.random().toString(36).substring(8)};;`; + return [ + acc[0].replace(item, uid), + [...acc[1], [uid, { link: { href: item, content: item } }]], + ]; + }, data); +} +function extract_text(data: tokenizerData): Inline[] { + const uids = data[1].map((tuple) => tuple[0].replace(/;/g, "")); + const ret = data[0].split(";;").map((section) => { + if (uids.includes(section)) { + const tc = data[1].find((tagged) => tagged[0] === `;;${section};;`); + if (tc) return tc[1]; + else return section; + } else return section; + }); + return ret; +} + +export function newUv(seed = Date.now()) { + return formatUv(unixToDa(seed)); +} +export const DA_UNIX_EPOCH = BigInt("170141184475152167957503069145530368000"); // `@ud` ~1970.1.1 + +export const DA_SECOND = BigInt("18446744073709551616"); // `@ud` ~s1 + +export const EPOCH = BigInt("292277024400"); +export function unixToDa(unix: number): bigint { + const timeSinceEpoch = (BigInt(unix) * DA_SECOND) / 1000n; + return DA_UNIX_EPOCH + timeSinceEpoch; +} +export function formatUv(x: bigint): string { + const uvMask = BigInt(31); + const uvAlphabet = "0123456789abcdefghijklmnopqrstuv"; + let res = ""; + while (x !== BigInt(0)) { + let nextSix = Number(x & uvMask); + res = uvAlphabet[nextSix] + res; + x = x >> BigInt(5); + } + return addDots5(`0v${res}`); +} + +export function replyToPost(post: Reply): Writ { + const essay: Essay = { ...post.memo, "kind-data": { chat: null } }; + const seal: Seal = { + id: post.seal.id, + reacts: post.seal.reacts, + time: post.seal?.time as string, + replies: {}, + meta: { + lastRepliers: [], + lastReply: null, + replyCount: 0, + }, + }; + return { essay, seal }; +} +export function postToReply(post: Writ): Reply { + const { "kind-data": _, ...memo } = post.essay; + const seal = { + id: post.seal.id, + reacts: post.seal.reacts, + "parent-id": post.seal.id, + time: post.seal.time!, + }; + return { memo, seal }; +} + +export function writToMD(content: Content): string { + return content.reduce((acc, verse) => { + if ("block" in verse) return acc + "\n\n" + blockReducer(verse.block); + else return acc + `\n\n` + inlineReducer(verse.inline); + }, ""); +} +function blockReducer(b: Block): string { + if ("image" in b) return `![](${b.image.src})`; + else if ("code" in b) + return ` + \`\`\` + ${b.code.code} + \`\`\` + `; + else if ("header" in b) { + const tag = + b.header.tag === "h1" + ? "#" + : b.header.tag === "h2" + ? "##" + : b.header.tag === "h3" + ? "###" + : b.header.tag === "h4" + ? "####" + : b.header.tag === "h5" + ? "#####" + : b.header.tag === "h6" + ? "######" + : ""; + return `${tag} ${b.header.content}`; + } else if ("listing" in b) + return ""; // TODO + else if ("cite" in b) + return ""; // TODO + else return ""; +} +function inlineReducer(ar: Inline[]): string { + const res = ar.reduce((acc: string, item) => { + return `${acc} ${inlineToString(item)}`; + }, ""); + return res as string; +} +function inlineToString(i: Inline): string { + if (typeof i === "string") return i; + else if ("break" in i) return `\n`; + else if ("ship" in i) return i.ship; + else if ("inline-code" in i) return `\`${i["inline-code"]}\``; + else if ("code" in i) return `\`${i.code}\``; + else if ("link" in i) return `![${i.link.content}](${i.link.href})`; + else if ("italics" in i) return `_${inlineReducer(i.italics).trim()}_`; + else if ("bold" in i) return `*${inlineReducer(i.bold).trim()}*`; + else if ("blockquote" in i) return `> ${inlineReducer(i.blockquote).trim()}`; + else if ("strike" in i) return `~~${inlineReducer(i.strike).trim()}~~`; + else return ""; +} +export function nestFromString(s: string): Nest { + const ss = s.split("/"); + return { type: ss[0] as any, host: ss[1] as any, name: ss[2] }; +} +export function nestToString(nes: Nest): string { + return `${nes.type}/${nes.host}/${nes.name}`; +} diff --git a/site/src/logic/types-tlon.ts b/site/src/logic/types-tlon.ts new file mode 100644 index 0000000..a59890a --- /dev/null +++ b/site/src/logic/types-tlon.ts @@ -0,0 +1,630 @@ +import { Ship } from "./types"; + +export type Timestamp = number; +export type UrbitTime = string; +// Tlon Channels +export type TlonUnreads = { + dms: Record; + clubs: Record; + channels: Record; + invites: Ship[]; +}; +export type DMType = Ship | string; +export type Nest = { + type: ChannelType; + host: Ship; + name: string; +}; +export type NestString = `${ChannelType}/${Ship}/${string}`; +export type ChannelType = "chat" | "diary" | "heap"; +export type ChatTypeI = { dm: Ship } | { club: string } | { channel: Nest }; +export type ChatType = ChatTypeI | { thread: Thread }; + +export type Thread = { author: Ship; op: string; in: ChatTypeI }; + +export const buntUnread: ChannelUnread = { + count: 0, + recency: Date.now(), + unread: null, + threads: {}, + meta: { + cover: "", + image: "", + title: "", + description: "", + team: [], + }, +}; +export type ChannelUnread = { + count: number; + recency: Timestamp; + unread: null | Unread; + threads: Record; // kana + meta: Metadata; +}; +export type Unread = { + count: number; + id: PostID; + time: UrbitTime; +}; +export type Atom = string; +export type PostID = `${Ship}/${Atom}` | Atom; + +// Groups + +export type GroupsMap = Record; +export type Group = { + bloc: string[]; // roles + cabals: Record; + channels: Record; + cordon: any; // bans I think + fleet: Record; + meta: GroupMetadata; + "flagged-content": any; // mmm + saga: any; // ? + zones: Record; + "zone-ord": string[]; +}; +export const GroupBunt: Group = { + bloc: [], // roles + cabals: {}, + channels: {}, + cordon: null, // bans I think + fleet: {}, + meta: { cover: "", image: "", title: "", description: "" }, + "flagged-content": {}, // mmm + saga: {}, // ? + zones: {}, + "zone-ord": [], +}; +export type Zone = { + idx: string; // channeltype/host/name + meta: GroupMetadata; +}; +export type Membership = { + joined: number; + sects: Sect[]; +}; +export type Sect = any; // idk man +export type ChannelData = { + added: number; // date + join: boolean; + meta: GroupMetadata; + readers: Ship[]; + zone: string; // the section I think +}; +export type Metadata = { + cover: string; + image: string; + title: string; + description: string; + team: Ship[]; +}; +export type GroupMetadata = { + cover: string; + image: string; + title: string; + description: string; +}; +export type ClubsMap = Record; +export type Club = { + hive: Ship[]; + team: Ship[]; + net: string; // "done" or sop + meta: GroupMetadata; +}; + +export type ChannelsRes = Record; +export type ChanString = `${ChannelType}/${Ship}/${string}`; +export type ChanState = { + order: string[]; // ? + sort: string; // ? "time" | w/e + view: string; // ? "list" | w/e + pending: { + posts: any; // ? + replies: any; + }; + perms: { + group: string; + writers: Ship[]; + }; + posts: Record; +}; +export type DottedPostID = string; +// Chat posts +export interface Writ { + seal: Seal; + essay: Essay; + prov?: boolean; +} +export interface Reply { + seal: ReplySeal; + memo: Memo; + unconfirmed?: boolean; +} +export interface DiaryPage { + newer: string | null; // atom, no-dots + older: string | null; + total: number; + posts: DiaryGraph; +} +export interface DiaryPost { + type: "post"; // or? + essay: DiaryEssay; + seal: Seal; + revision: string; // number +} +export interface DiaryEssay extends Memo { + "kind-data": { diary: { image: string; title: string } }; +} +export interface PostsPage { + newer: string | null; // atom, no-dots + older: string | null; + total: number; + posts: WritGraph; +} +export type Cursor = string | null; +export interface WritPage { + newer: Cursor; + older: Cursor; + total: number; + writs: WritGraph; + prov?: WritGraph; +} +export interface DiaryGraph { + [id: string]: DiaryPost; +} +export interface ReplyGraph { + [id: string]: Reply; +} +export interface WritGraph { + [id: string]: Writ; +} +export interface Seal { + id: WritID; + reacts: Reacts; + replies: ReplyGraph; + meta: SealMeta; + time?: string; // chats have this, channels don't (...) +} +export interface SealMeta { + lastRepliers: Ship[]; + lastReply: number | null; //WritID | null; // ? + replyCount: number; +} +export interface ReplySeal { + id: string; + "parent-id": string; + reacts: Reacts; + time?: string; // always?? +} +export interface Memo { + author: Ship; + content: Content; + sent: number; // unix ts +} +export interface Essay extends Memo { + "kind-data": { chat: null } | { notice: null }; +} +export type Reacts = Record; +type WritID = string; // ship/123.123 + +export type Block = + | { cite: Cite } + | { image: ImageBlock } + | { header: { tag: string; content: Inline[] } } + | { listing: Listing } + | { rule: null } + | { code: { code: string; lang: string } }; + +export type Verse = { block: Block } | { inline: Inline[] }; +export type Content = Verse[]; + +export type Listing = + | { item: Inline[] } + | { list: { type: string; items: Listing[]; contents: Inline[] } }; +export type Cite = ChannelCite | GroupCite | DeskCite | BaitCite; +export interface ChannelCite { + chan: { + nest: `${App}/${Ship}/${string}`; + where: string; // "/msg/123.123" path in hoon, idgi yet + }; +} +export interface GroupCite { + group: string; // ship/term +} +export interface DeskCite { + desk: { + flag: string; // flag + where: string; // + }; +} +export interface BaitCite { + bait: { + group: string; // flag + graph: string; // flag + where: string; // + }; +} +export type App = "chat" | "diary" | "heap"; +export interface ImageBlock { + width: number; + height: number; + alt: string; + src: string; // url +} +export type Inline = + | string + | { italics: Inline[] } + | { bold: Inline[] } + | { blockquote: Inline[] } + | { strike: Inline[] } + | { code: string; lang: string } // not actually in the type, but it should + | { "inline-code": string } + | { ship: string } + | { tag: string } + | { link: { content: string; href: string } } + | { task: { checked: boolean; content: Inline[] } } + | { break: null }; + +// kinda custom but still +// +export interface Skein { + unread: boolean; + count: number; + top: { + button: null; + id: string; // @uv + con: Array; + wer: string; // path + time: number; + rope: { + channel: string; + desk: string; + group: string; + thread: string; + }; + }; + "ship-count": number; + time: number; +} + +export interface Brief { + uid: string; + title: string; + group: string; + count: number; + last: number; // date + "read-id": string; // ~ship/123.123.123 + icon: string; // url + cover: string; // url + desc: string; +} +export interface Briefs { + dms: Brief[]; + groups: Brief[]; + threads: Brief[]; + clubs: Brief[]; +} + +export interface NewPostUpdate { + set: { + type: "post"; // or? + essay: Essay; + seal: Seal; + }; +} +export interface ReplyMeta { + replyCount: number; + lastReply: number; // ts + lastRepliers: Ship[]; +} +export interface NewReplyUpdate { + reply: { + id: string; // atom, no dots + meta: ReplyMeta; + "r-reply": NewReplySet | NewReactUpdate; + }; +} +export interface NewReplySet { + set: Reply; +} +export interface NewReactUpdate { + reacts: Reacts; +} + +export type ChannelPendingUpdate = { + pending: { + id: { author: Ship; sent: number }; + pending: + | { post: Essay } + | { reply: { memo: Memo; meta: SealMeta; top: string } }; + }; +}; +export type RPost = NewPostUpdate | NewReactUpdate | NewReplyUpdate; +export type ChanRPost = { + host: Ship; + name: string; + kind: ChannelType; + update: RPost; +}; +export interface ChannelPostUpdate { + post: { + id: string; // atom, no dots + "r-post": RPost; + }; +} +export interface ChannelUpdate { + nest: string; + response: + | ChannelPendingUpdate + | ChannelPostUpdate + | ChannelPermUpdate + | ChannelCreateUpdate; +} +export type ChannelPermUpdate = { + perm: { + group: string; + writers: Ship[]; + }; +}; +export type ChannelCreateUpdate = { + create: { + group: string; + writers: Ship[]; + }; +}; +export interface NewChatPostUpdate { + add: { + memo: Essay; + time: string; // atom, no dots + }; + id?: string; // ~ship/string, only on threads, to set the child, reply.id being the parent +} +export interface NewChatReactUpdate { + "add-react": { ship: Ship; react: string }; +} +export interface ChatUpdate { + id: WritID; + response: NewChatPostUpdate | NewChatReactUpdate | NewChatReplyUpdate; +} + +export interface NewChatReplyUpdate { + reply: { + meta: ReplyMeta; + id: string; // author/dottedID + delta: NewChatPostUpdate | NewChatReactUpdate; + }; +} + +// graph-store +type ID = string; +export interface Graph { + [keys: ID]: GraphStoreNode; +} +export interface GraphStoreNode { + post: GSPost; + children: Graph | null; +} +export type GSContent = any; +export interface GSPost { + author: Ship; + contents: GSContent[]; + "time-sent": number; + hash: string | null; + signatures: string[]; + index: string; +} +export interface GSKey { + name: string; + ship: Ship; +} +export interface AssociationGraph { + [key: string]: Association; +} +export interface Association { + metadata: Metadatum; + "app-name": "graph" | "groups"; + resource: string; // resource string + group: string; // same + groupName: string; // here we ourselves add the group title +} +export interface Metadatum { + preview: boolean; + vip: string; + title: string; + description: string; + creator: Ship; + picture: string; //URL + hidden: boolean; + config: MetadataConfig; + "date-created": string; + color: string; +} +type MetadataConfig = GroupConfig | GraphConfig; +export interface GroupConfig { + group: { + "app-name": "graph"; + resource: string; ///ship/~bacrys/pokur-14 + }; +} +export interface GraphConfig { + graph: GraphType; +} +export type GraphType = "chat" | "publish" | "link" | "post"; + +export interface GSResource { + entity: Ship; + name: string; +} + +export interface Contact { + p?: Ship; + nickname: string; + bio: string; + status: string; + color: string; + avatar: string | null; + cover: string | null; +} + +// responses +export interface Pals { + incoming: Record; + outgoing: Record; +} +export type Contacts = Record; + +export interface DisterApps { + ini: Record; +} +export type FlagString = `${Ship}/${string}`; +export type AppData = { + cass: { + da: string; // @da string + }; + image: string; + info: string; // description + license: string; + ship: Ship; + title: string; // dude + version: string; + website: string; + color: string; // @ux string; + desk: string; + hash: string; // @uv string; + href: { + glob: { + base: string; // desk name + "glob-reference": { + location: { + http: string; // URL, + // could be ames too I guess? + }; + hash: string; + }; + }; + }; +}; + +export type Gangs = Record; +export type GroupPreview = { + claim: null; // + invite: null; // + preview: { + secret: boolean; + time: number; + flag: FlagString; + cordon: { + shut: { + // suspect this is a whitelist/blacklist thing + pending: Ship[]; + ask: Ship[]; + }; + }; + meta: GroupMetadata; + }; +}; + +// %vitals + +interface Connected { + complete: "yes"; +} + +interface YetToCheck { + complete: "no-data"; +} + +interface NoDNS { + complete: "no-dns"; +} + +interface Crash { + complete: "crash"; + crash: string[][]; +} + +interface NoOurPlanet { + complete: "no-our-planet"; + "last-contact": number; +} + +interface NoOurGalaxy { + complete: "no-our-galaxy"; + "last-contact": number; +} + +interface NoSponsorHit { + complete: "no-sponsor-hit"; + ship: string; +} + +interface NoSponsorMiss { + complete: "no-sponsor-miss"; + ship: string; +} + +interface NoTheirGalaxy { + complete: "no-their-galaxy"; + "last-contact": number; +} + +export type ConnectionCompleteStatusKey = + | "yes" + | "crash" + | "no-data" + | "no-dns" + | "no-our-planet" + | "no-our-galaxy" + | "no-sponsor-hit" + | "no-sponsor-miss" + | "no-their-galaxy"; + +export interface CompleteStatus { + complete: ConnectionCompleteStatusKey; +} + +export type ConnectionCompleteStatus = + | Connected + | YetToCheck + | Crash + | NoDNS + | NoOurPlanet + | NoOurGalaxy + | NoSponsorHit + | NoSponsorMiss + | NoTheirGalaxy; + +export type ConnectionPendingStatusKey = + | "setting-up" + | "trying-dns" + | "trying-local" + | "trying-target" + | "trying-sponsor"; + +export type ConnectionPendingStatus = + | { + pending: Omit; + } + | { + pending: "trying-sponsor"; + ship: string; + }; + +export type ConnectionStatus = + | ConnectionCompleteStatus + | ConnectionPendingStatus; + +export interface ConnectionUpdate { + status: ConnectionStatus; + timestamp: number; +} + +export interface ConnectivityCheckOptions { + useStale?: boolean; + enabled?: boolean; + staleTime?: number; + waitToDisplay?: number; +} +export type ChatQuoteParams = { p: Ship; nest: string; id: string }; diff --git a/site/src/logic/types.ts b/site/src/logic/types.ts new file mode 100644 index 0000000..1cb1a14 --- /dev/null +++ b/site/src/logic/types.ts @@ -0,0 +1,95 @@ +import { ChannelType, GroupMetadata, Inline } from "./types-tlon"; + +export type Site = { + sitename: string; + description: string; + groupname: string; + binding: string; + icon: string; + home: string; + css: string; + hidden: boolean; + apps: Apps; + "app-order": AppType[]; +}; +export type AppType = + | "blog" + | "chat" + | "forum" + | "radio" + | "wiki" + | `static/${string}`; +export type Apps = { + chat: string[]; + forum: string[]; + blog: string; + radio: boolean; + wiki: string[]; + static: Record; +}; +export const AppBunt: Apps = { + blog: "", + chat: [], + forum: [], + radio: false, + wiki: [], + static: {}, +}; +export const SiteBunt: Site = { + sitename: "lol", + description: "", + groupname: "lmao", + binding: "/lol", + icon: "", + home: "", + css: "", + hidden: false, + apps: AppBunt, + "app-order": [], +}; + +export type AppChoice = { type: AppType; name: string; id: number }; +export type Ship = `~${string};`; +export type RichMetadata = GroupMetadata & { + name: string; + host: Ship; + kind: ChannelType; +}; +export type Channels = { + chats: RichMetadata[]; + forums: RichMetadata[]; + blog: RichMetadata | null; +}; + +export const ChannelsBunt: Channels = { + chats: [], + forums: [], + blog: null, +}; + +export type Pikes = Record; +export type Pike = { + sync: Desk; + zest: "live" | "dead"; + wefts: any[]; //? + hash: string; +}; +export type Desk = { + ship: Ship; + desk: string; +}; +export type Paragraph = NotRetardedInline[]; +type NInline = NotRetardedInline; +export type NotRetardedInline = + | { text: string } + | { italics: Inline[] } + | { bold: Inline[] } + | { blockquote: Inline[] } + | { strike: Inline[] } + | { code: string; lang: string } // not actually in the type, but it should + | { "inline-code": string } + | { ship: string } + | { tag: string } + | { link: { content: string; href: string } } + | { task: { checked: boolean; content: Inline[] } } + | { break: null }; diff --git a/site/src/logic/utils.ts b/site/src/logic/utils.ts new file mode 100644 index 0000000..20d6446 --- /dev/null +++ b/site/src/logic/utils.ts @@ -0,0 +1,493 @@ +import type { NotRetardedInline, Paragraph, Ship } from "./types"; +import { patp2dec, isValidPatp } from "./ob/co"; +import { Renderer, Token, marked } from "marked"; +import { REF_REGEX, SHIP_REGEX } from "./constants"; +import { unEscape } from "./tlon-helpers"; +import type { + GraphStoreNode, + AssociationGraph, + Association, + GSResource, + Graph, + Contacts, + Pals, + Contact, + Content, + Inline, +} from "./types-tlon"; + +export function addScheme(url: string) { + if (url.includes("localhost")) { + return `http://${url.replace("http://", "")}`; + } else { + return `https://${url.replace("http://", "")}`; + } +} + +export function easyCode(code: string) { + const string = code.replace(/-/g, ""); + const matches = string.match(/.{1,6}/g); + if (matches) return matches.join("-"); +} + +export function tilde(patp: Ship) { + if (patp[0] == "~") { + return patp; + } else { + return "~" + patp; + } +} + +export function color_to_hex(color: string) { + let hex = "#" + color.replace(".", "").replace("0x", "").toUpperCase(); + if (hex == "#0") { + hex = "#000000"; + } + return hex; +} + +export function date_diff(date: number | Date, type: "short" | "long") { + const now = new Date().getTime(); + const diff = now - new Date(date).getTime(); + if (type == "short") { + return to_string(diff / 1000); + } else { + return to_string_long(diff / 1000); + } +} + +function to_string(s: number) { + if (s < 60) { + return "now"; + } else if (s < 3600) { + return `${Math.ceil(s / 60)}m`; + } else if (s < 86400) { + return `${Math.ceil(s / 60 / 60)}h`; + } else if (s < 2678400) { + return `${Math.ceil(s / 60 / 60 / 24)}d`; + } else if (s < 32140800) { + return `${Math.ceil(s / 60 / 60 / 24 / 30)}mo`; + } else { + return `${Math.ceil(s / 60 / 60 / 24 / 30 / 12)}y`; + } +} + +function to_string_long(s: number) { + if (s < 60) { + return "right now"; + } else if (s < 3600) { + return `${Math.ceil(s / 60)} minutes ago`; + } else if (s < 86400) { + return `${Math.ceil(s / 60 / 60)} hours ago`; + } else if (s < 2678400) { + return `${Math.ceil(s / 60 / 60 / 24)} days ago`; + } else if (s < 32140800) { + return `${Math.ceil(s / 60 / 60 / 24 / 30)} months ago`; + } else { + return `${Math.ceil(s / 60 / 60 / 24 / 30 / 12)} years ago`; + } +} + +export function regexes() { + const IMAGE_REGEX = new RegExp(/(jpg|img|png|gif|tiff|jpeg|webp|webm|svg)$/i); + const AUDIO_REGEX = new RegExp(/(mp3|wav|ogg)$/i); + const VIDEO_REGEX = new RegExp(/(mov|mp4|ogv)$/i); + return { img: IMAGE_REGEX, aud: AUDIO_REGEX, vid: VIDEO_REGEX }; +} + +export function buildDM(author: Ship, recipient: Ship, contents: Content[]) { + const node: any = {}; + const point = patp2dec(recipient); + const index = `/${point}/${makeIndex()}`; + node[index] = { + children: null, + post: { + author: author, + contents: contents, + hash: null, + index: index, + signatures: [], + "time-sent": Date.now(), + }, + }; + return { + app: "dm-hook", + mark: "graph-update-3", + json: { + "add-nodes": { + resource: { name: "dm-inbox", ship: author }, + nodes: node, + }, + }, + }; +} + +export function buildChatPost( + author: Ship, + resource: GSResource, + c: Content[], +) { + const index = `/${makeIndex()}`; + return { + "add-nodes": { + resource: { name: resource.name, ship: resource.entity }, + nodes: { + [index]: { + children: null, + post: { + author: author, + contents: c, + hash: null, + index: index, + signatures: [], + "time-sent": Date.now(), + }, + }, + }, + }, + }; +} + +export function buildNotebookPost( + author: Ship, + resource: GSResource, + c: Content[], +) { + const index = `/${makeIndex()}`; + const node: GraphStoreNode = { + children: { + "1": { + post: { + author: author, + contents: [], + hash: null, + index: index + "/1", + signatures: [], + "time-sent": Date.now(), + }, + children: { + "1": { + children: null, + post: { + author: author, + contents: c, + hash: null, + index: index + "/1/1", + signatures: [], + "time-sent": Date.now(), + }, + }, + }, + }, + "2": { + children: null, + post: { + author: author, + contents: [], + hash: null, + index: index + "/2", + signatures: [], + "time-sent": Date.now(), + }, + }, + }, + post: { + author: author, + contents: [], + hash: null, + index: index, + signatures: [], + "time-sent": Date.now(), + }, + }; + const graph = { [index]: node }; + return { + "add-nodes": { + resource: { name: resource.name, ship: resource.entity }, + nodes: graph, + }, + }; +} +export function buildCollectionPost( + author: Ship, + resource: GSResource, + c: Content[], +) { + const index = `/${makeIndex()}`; + const node: GraphStoreNode = { + children: null, + post: { + author: author, + contents: c, + hash: null, + index: index, + signatures: [], + "time-sent": Date.now(), + }, + }; + const graph: Graph = { [index]: node }; + return { + "add-nodes": { + resource: { name: resource.name, ship: resource.entity }, + nodes: graph, + }, + }; +} + +export function makeIndex(): string { + const DA_UNIX_EPOCH = BigInt("170141184475152167957503069145530368000"); + const DA_SECOND = BigInt("18446744073709551616"); + const timeSinceEpoch = (BigInt(Date.now()) * DA_SECOND) / BigInt(1000); + return (DA_UNIX_EPOCH + timeSinceEpoch).toString(); +} +export function makeDottedIndex() { + const DA_UNIX_EPOCH = BigInt("170141184475152167957503069145530368000"); + const DA_SECOND = BigInt("18446744073709551616"); + const timeSinceEpoch = (BigInt(Date.now()) * DA_SECOND) / BigInt(1000); + const index = (DA_UNIX_EPOCH + timeSinceEpoch).toString(); + return index.replace(/\B(?=(\d{3})+(?!\d))/g, "."); +} + +export function nodeToText(n: GraphStoreNode): string { + const c = n.post.contents; + return c.reduce((acc, item) => { + if ("text" in item) return acc + item.text; + else if ("mention" in item) return acc + item.mention; + else return acc; + }, ""); +} + +export function nodesFromGraphUpdate(g: any): GraphStoreNode[] { + const nodes = g["graph-update"]["add-nodes"]["nodes"]; + return Object.keys(nodes).map((n) => nodes[n]); +} + +export function cleanMetadata(metadata: AssociationGraph): Association[] { + const all: Association[] = Object.values(metadata); + const graphs = all.filter((a) => a["app-name"] === "graph"); + return graphs.map((g) => { + const gn = `${g.group}/groups${g.group}`; + const gn2 = `${g.group}/graph${g.group}`; + const group = metadata[gn] || metadata[gn2]; + if (!group) console.log(g, "you lack metadata for this graph"); + const title = group ? group.metadata.title : "error"; + return { ...g, ...{ groupName: title } }; + }); +} + +export function abbreviateChat(s: string): string { + const plist = s.trim().split(" "); + if (isValidPatp(plist[0]) && plist.length > 1) { + return `${plist[0]} & ${plist.length - 1}+`; + } else if (s.length < 25) return s; + else return `${s.substring(0, 25)}...`; +} + +export function timestring(n: number): string { + const nn = new Date(n); + return nn.toTimeString().slice(0, 5); +} +export function wait(ms: number) { + return new Promise((resolve, _reject) => { + setTimeout(resolve, ms); + }); +} + +export function checkTilde(s: string) { + if (s[0] === "~") return s; + else return "~" + s; +} + +export function addDots(s: string, num: number): string { + const reversed = s.split("").reverse().join(""); + const reg = new RegExp(`.{${num}}`, "g"); + const withCommas = reversed.replace(reg, "$&."); + return withCommas.split("").reverse().join("").slice(1); +} +export function addDots5(s: string): string { + const reversed = s.split("").reverse().join(""); + const withCommas = reversed.replace(/.{5}/g, "$&."); + return withCommas.split("").reverse().join(""); +} +// TODO +export function isTwatterLink(s: string) { + const sp = s + .replace("https://", "") + .split("/") + .filter((s) => s); + return sp.length === 4 && sp[0] === "twitter.com" && sp[2] === "status"; +} +export const isSortugLink = (s: string) => !!s.match(REF_REGEX); + +export const markdownRenderer: Partial = { + // paragraph(content: any) { + // // console.log(content, "rendering") + // return content; + // }, + // text(text: string) { + // return text; + // }, + // codespan(code, lang) { + // console.log(code, "code"); + // console.log(lang, "lang"); + // return "" + // }, +}; + +export function auraToHex(s: string): string { + if (s.startsWith("0x")) { + let numbers = s.replace("0x", "").replace(".", ""); + while (numbers.length < 6) { + numbers = "0" + numbers; + } + return "#" + numbers; + } else if (s.startsWith("#")) return s; + else { + // console.log(s, "weird hex"); + return "black"; + } +} + +// default cursors +export function makeNewestIndex() { + const DA_UNIX_EPOCH = BigInt("170141184475152167957503069145530368000"); + const DA_SECOND = BigInt("18446744073709551616"); + const timeSinceEpoch = (BigInt(Date.now()) * DA_SECOND) / BigInt(1000); + return (DA_UNIX_EPOCH + timeSinceEpoch).toString(); +} +export const startCursor = makeNewestIndex(); +export const endCursor = "0"; + +export function displayCount(c: number): string { + if (c === 0) return ""; + else if (c < 1_000) return `${c}`; + else if (c >= 1_000 && c < 1_000_000) return `${Math.round(c / 1_00) / 10}K`; + else if (c >= 1_000_000) return `${Math.round(c / 100_000) / 10}M`; + else return ""; +} +export function isWhiteish(hex: string): boolean { + if (hex.indexOf("#") === 0) hex = hex.slice(1); + const r = parseInt(hex.slice(0, 2), 16); + const g = parseInt(hex.slice(2, 4), 16); + const b = parseInt(hex.slice(4, 6), 16); + return r > 200 && g > 200 && b > 200; +} + +export function localISOString(date: Date) { + const offset = new Date().getTimezoneOffset(); + const localts = date.getTime() - offset * 60_000; + return new Date(localts).toISOString().slice(0, 16); +} + +export function goback() { + window.history.back(); +} + +export function reverseRecord( + a: Record, +): Record { + return Object.entries(a).reduce((acc: any, [k, v]) => { + acc[v] = k; + return acc; + }, {}); +} + +function contactMatch(contact: Contact, input: string): boolean { + return ( + (contact.nickname || "").includes(input) || + (contact.avatar || "").includes(input) || + (contact.cover || "").includes(input) || + (contact.bio || "").includes(input) || + (contact.status || "").includes(input) || + (contact.color || "").includes(input) + ); +} + +export function getColorHex(color: string): string { + if (color.startsWith("0x")) + return `#${padString(stripFuckingDots(color), 6)}`; + else if (color.startsWith("#") && color.length === 7) return color; + else if (color.length === 6) return `#${color}`; + else { + console.log(color, "something weird with this color"); + return "#FFFFFF"; + } +} + +export function stripFuckingDots(hex: string) { + return hex.replace("0x", "").replaceAll(".", ""); +} +export function padString(s: string, size: number) { + if (s.length >= size) return s; + else return padString(`0${s}`, size); +} +export function isDark(hexColor: string): boolean { + const r = parseInt(hexColor.substring(1, 2), 16); + const g = parseInt(hexColor.substring(3, 5), 16); + const b = parseInt(hexColor.substring(5, 7), 16); + + const sr = r / 255; + const sg = g / 255; + const sb = b / 255; + const rSrgb = + sr <= 0.03928 ? sr / 12.92 : Math.pow((sr + 0.055) / 1.055, 2.4); + const gSrgb = + sg <= 0.03928 ? sg / 12.92 : Math.pow((sg + 0.055) / 1.055, 2.4); + const bSrgb = + sb <= 0.03928 ? sb / 12.92 : Math.pow((sb + 0.055) / 1.055, 2.4); + + // Calculate luminance + const luminance = 0.2126 * rSrgb + 0.7152 * gSrgb + 0.0722 * bSrgb; + return luminance < 0.12; +} + +export function checkIfClickedOutside( + e: React.MouseEvent, + el: HTMLElement, + close: any, +) { + e.stopPropagation(); + if (el.contains(e.currentTarget)) close(); +} + +export function generateRandomBase64(length: number) { + const bytes = new Uint8Array(length); + crypto.getRandomValues(bytes); + return btoa(String.fromCharCode(...bytes)) + .slice(0, 4) + .toLowerCase(); +} + +export function capitalize(s: string) { + return s.charAt(0).toUpperCase() + s.slice(1); +} + +export function retardedTlonTokens(tokens: Inline[]): Paragraph[] { + let ps: Paragraph[] = []; + ps.push([]); + for (const token of tokens) { + const currentP: NotRetardedInline[] = ps[ps.length - 1]; + if (typeof token === "string") currentP.push({ text: token }); + else if ("break" in token) ps.push([] as NotRetardedInline[]); + else if ("blockquote" in token) { + ps.push([token]); + ps.push([] as NotRetardedInline[]); + } else currentP.push(token); + } + return ps; +} +export function isValidHttpUrl(string: string) { + let url; + + try { + url = new URL(string); + } catch (_) { + return false; + } + + return url.protocol === "http:" || url.protocol === "https:"; +} +export function displayAnon(ship: Ship): string { + if (ship.length > 30) return "anon"; + else return ship; +} diff --git a/site/src/main.tsx b/site/src/main.tsx new file mode 100644 index 0000000..7b4cc34 --- /dev/null +++ b/site/src/main.tsx @@ -0,0 +1,15 @@ +// import "@fontsource/roboto/300.css"; +// import "@fontsource/roboto/400.css"; +// import "@fontsource/roboto/500.css"; +// import "@fontsource/roboto/700.css"; +import "@fontsource/inter/400.css"; +import "@fontsource/inter/700.css"; +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import App from "./App.tsx"; + +createRoot(document.getElementById("root")!).render( + + + , +); diff --git a/site/src/modals/Modal.tsx b/site/src/modals/Modal.tsx new file mode 100644 index 0000000..f91b504 --- /dev/null +++ b/site/src/modals/Modal.tsx @@ -0,0 +1,85 @@ +import { useEffect, useRef, useState } from "react"; +import { useLocation, Link } from "wouter"; +import { + Alert, + Button, + TextField, + Typography, + Box, + Container, +} from "@mui/material"; +import useStore from "../logic/store"; +import { Site, AppType, Ship } from "../logic/types"; +import { tokenize } from "../logic/tlon-helpers"; +import { addDots } from "../logic/utils"; + +// weird that this has to be written manually +const style = { + position: "absolute" as "absolute", + top: "50%", + left: "50%", + transform: "translate(-50%, -50%)", + width: 400, + bgcolor: "background.paper", + border: "2px solid #000", + boxShadow: 24, + p: 4, +}; +export default function MuhModal({ children }: { children: JSX.Element }) { + const { setModal } = useStore(["setModal"]); + function close(e: any, reason: any) { + setModal(null); + } + function onKey(event: any) { + if (event.key === "Escape") setModal(null); + } + useEffect(() => { + document.addEventListener("keyup", onKey); + return () => { + document.removeEventListener("keyup", onKey); + }; + }, [children]); + + function clickAway(e: React.MouseEvent) { + e.stopPropagation(); + if (!modalRef.current || !modalRef.current.contains(e.target as any)) + setModal(null); + } + const modalRef = useRef(null); + const bgStyle = { + position: "fixed" as "fixed", + left: 0, + top: 0, + width: "100vw", + height: "100vh", + backgroundColor: "rgb(0, 0, 0, 0.7)", + zIndex: 0, + }; + const modalStyle = { + position: "fixed" as "fixed", + transform: "translate(-50%, -50%)", + top: "50%", + left: "50%", + }; + return ( + + ); +} + +export function ForumReplyModal({ board, id }: { board: string; id: string }) { + // const { io, airlock, clientShip } = useStore(["io", "airlock", "clientShip"]); + // const { sendDiaryReply } = io(); + // const [input, setInput] = useState(""); + // async function sendReply() { + // const host = `~${airlock.ship}` as Ship; + // console.log(id, "parent id!!, dots??"); + // const did = addDots(id, 3); + // const tokens = tokenize(input); + // const res = await sendDiaryReply(clientShip, host, board, did, tokens); + // } + return ; +} diff --git a/site/src/site/Blog.tsx b/site/src/site/Blog.tsx new file mode 100644 index 0000000..6b03f66 --- /dev/null +++ b/site/src/site/Blog.tsx @@ -0,0 +1,154 @@ +import { + Box, + Container, + Divider, + Typography, + Link as Lin, + Button, + List, + ListItem, + CircularProgress, +} from "@mui/material"; +import { RichMetadata, Ship, Site } from "../logic/types"; +import { Link, Route, Switch, useLocation } from "wouter"; +import useStore from "../logic/store"; +import { Content, DiaryPage, DiaryPost, Group } from "../logic/types-tlon"; +import { tokenize, writToMD } from "../logic/tlon-helpers"; +import BlogPost from "./BlogPost"; +import { PostContent } from "./PostContent"; +import { Centered } from "../ui/Components"; +import Composer from "./Composer"; +import { useQuery } from "@tanstack/react-query"; +export default function Page({ + site, + group, + meta, +}: { + site: Site; + group: Group; + meta: RichMetadata; +}) { + return ( + + Composer({ kind: "Blog Post", meta })} + /> + BlogPost({ site, group, meta })} + /> + BlogPage({ meta })} /> + + ); +} +function BlogPage({ meta }: { meta: RichMetadata }) { + const { io, clientShip } = useStore(["airlock", "io", "clientShip"]); + const { scryDiary } = io(); + const { isLoading, data } = useQuery({ + queryKey: ["diary", meta.name], + queryFn: () => scryDiary(meta.host, meta.name, 300), + }); + const [_, navigate] = useLocation(); + function openEditor() { + navigate("/e"); + } + return ( + + + + + {meta.title} + + + {meta.description} + + {meta.host === clientShip ? ( + + + + ) : ( + <> + )} + + + + {!data ? ( + + + + ) : ( + + )} + + + ); +} + +function PostList({ page }: { page: DiaryPage }) { + return ( + + {Object.entries(page.posts) + .sort((a, b) => b[1].essay.sent - a[1].essay.sent) + .map((entry) => ( + + + + ))} + + ); +} + +function PostPreview({ post }: { post: DiaryPost }) { + const [_, navigate] = useLocation(); + const date = new Date(post.essay.sent).toLocaleDateString(); + const commentCount = post.seal.meta.replyCount; + function openPost() { + navigate(`/${post.seal.id}`, { state: { post } }); + } + return ( + + + {post.essay["kind-data"].diary.title} + + + + + Continue + + + Posted on {date} + {commentCount > 0 && ( + {commentCount} comments + )} + + + ); +} + +function Snippet({ content }: { content: Content }) { + const markdown = writToMD(content); + const snip = markdown.substring(0, 200); + const tokens = tokenize(snip); + return ; +} + +const styles = { + previewTitle: { + cursor: "pointer", + color: "primary.main", + }, +}; diff --git a/site/src/site/BlogPost.tsx b/site/src/site/BlogPost.tsx new file mode 100644 index 0000000..f429a85 --- /dev/null +++ b/site/src/site/BlogPost.tsx @@ -0,0 +1,215 @@ +import { + Box, + Button, + CircularProgress, + Container, + Divider, + Link, + Stack, + TextField, + Typography, +} from "@mui/material"; +import { RichMetadata, Ship, Site } from "../logic/types"; +import { useParams } from "wouter"; +import useStore from "../logic/store"; +import { DiaryPost, Group, Reply } from "../logic/types-tlon"; +import { useEffect, useState } from "react"; +import { addDots, displayAnon } from "../logic/utils"; +import { NotFound } from "./Home"; +import { PostContent } from "./PostContent"; +import { tokenize } from "../logic/tlon-helpers"; +import Sigil from "../ui/Sigil"; +// import { TweetSnippet } from "./Snippets"; + +export default function BlogPost({ + site, + group, + meta, +}: { + site: Site; + group: Group; + meta: RichMetadata; +}) { + const { airlock, io } = useStore(["airlock", "io"]); + const params: any = useParams(); + useEffect(() => { + loadPost(); + }, [history.state]); + async function loadPost() { + if (history.state?.post) setPost(history.state.post); + else { + const { scryDiary } = io(); + const res = await scryDiary(`~${airlock.ship}` as Ship, meta.name, 300); + const dotId = addDots(params.post, 3); + const post = res.posts[dotId]; + if (post) setPost(post); + else setDead(true); + } + } + const [post, setPost] = useState(); + const [dead, setDead] = useState(false); + if (dead) return ; + return {post && }; +} + +function Post({ post, meta }: { meta: RichMetadata; post: DiaryPost }) { + const author = post.essay.author; + const date = new Date(post.essay.sent).toLocaleDateString(); + return ( + + + + + {post.essay["kind-data"].diary.title} + + + Posted by {author} on {date} + + + + + + + + + + ); +} +function CommentComposer({ + post, + parent, + meta, + replyingTo, + close, +}: { + parent: string; + meta: RichMetadata; + post: DiaryPost; + replyingTo?: Ship; + close?: () => void; +}) { + useEffect(() => { + if (replyingTo) setInput(`${replyingTo}: `); + }, [post, replyingTo]); + const { io, clientShip, addPending } = useStore([ + "io", + "clientShip", + "addPending", + ]); + const { sendDiaryReply } = io(); + const [input, setInput] = useState(""); + async function send() { + setSending(true); + const content = tokenize(input); + const ts = Date.now(); + if (meta.host !== clientShip) addPending(ts, content); + const res = await sendDiaryReply( + // clientShip, + meta.host, + meta.host, + meta.name, + addDots(parent, 3), + content, + ts, + ); + if (res) { + setSending(false); + if (close) close(); + } + } + const [sending, setSending] = useState(false); + return ( + + setInput(e.currentTarget.value)} + /> + + + Posting as + + {clientShip} + + {sending ? ( + + ) : ( + + )} + + + ); +} +function Comments({ post, meta }: { meta: RichMetadata; post: DiaryPost }) { + const { lastChannelUpdate } = useStore(["lastChannelUpdate"]); + useEffect(() => { + if (!lastChannelUpdate) return; + const { name, update } = lastChannelUpdate; + if (name !== meta.name) return; + const rpost = update; + if (!("reply" in rpost)) return; + if (!("set" in rpost.reply["r-reply"])) return; + const rep: Reply = rpost.reply["r-reply"].set; + const id = addDots(rep.seal.id, 3); + setIncoming((s) => ({ ...s, [id]: rep })); + }, [lastChannelUpdate]); + const [incoming, setIncoming] = useState>({}); + return ( + + + + {post.seal.meta.replyCount} comments + + + {Object.values({ ...post.seal.replies, ...incoming }) + .sort((a, b) => a.memo.sent - b.memo.sent) + .map((r) => ( + + ))} + + ); +} +function Comment({ + post, + meta, + comment, +}: { + post: DiaryPost; + meta: RichMetadata; + comment: Reply; +}) { + const [replying, setReplying] = useState(false); + return ( + + + + {displayAnon(comment.memo.author)} + + {new Date(comment.memo.sent).toLocaleString()} + + + setReplying(true)}> + Reply + + {replying && ( + setReplying(false)} + /> + )} + + ); +} diff --git a/site/src/site/Board.tsx b/site/src/site/Board.tsx new file mode 100644 index 0000000..712a565 --- /dev/null +++ b/site/src/site/Board.tsx @@ -0,0 +1,212 @@ +import { RichMetadata, Site, Ship } from "../logic/types"; +import Thread from "./BoardThread"; +import Composer from "./Composer"; +import { Link, Route, Switch, useLocation, useParams } from "wouter"; +import useStore from "../logic/store"; +import Sigil from "../ui/Sigil"; +import { + Content, + DiaryPage, + DiaryPost, + Group, + PostsPage, + Writ, +} from "../logic/types-tlon"; +import { + Box, + Button, + CircularProgress, + List, + ListItem, + TextField, + Typography, +} from "@mui/material"; +import { useEffect, useLayoutEffect, useRef, useState } from "react"; +import { NotFound } from "./Home"; +import { PostContent } from "./PostContent"; +import { Centered, WholeFlex } from "../ui/Components"; +import { tokenize, writToMD } from "../logic/tlon-helpers"; +import { addDots, date_diff } from "../logic/utils"; + +export function Board({ page, meta }: { page: DiaryPage; meta: RichMetadata }) { + const [_, navigate] = useLocation(); + function openEditor() { + navigate("/e"); + } + return ( + + <> + + {meta!.title} + {meta!.description} + + + + + + + + ); +} + +const styles = { + chatHeader: { + textAlign: "center", + borderBottom: "2px solid black", + padding: "1rem", + }, + chatList: { + flexGrow: "1", + }, + chatMessage: { + display: "flex", + gap: "1rem", + minHeight: "4rem", + }, + chatInput: { + display: "flex", + width: "100%", + borderTop: "2px solid black", + }, + textInput: { + flexGrow: "1", + border: "none", + outline: "none", + padding: "0.5rem", + }, + threadPreview: { + gap: "1rem", + cursor: "pointer", + }, +}; + +function Loader({ page, meta }: { page: DiaryPage; meta: RichMetadata }) { + const { lastChannelUpdate } = useStore(["lastChannelUpdate"]); + const [incoming, setIncoming] = useState>({}); + useEffect(() => { + if (!lastChannelUpdate) return; + const { kind, host, name, update } = lastChannelUpdate; + if (kind !== "diary") return; + if (host !== meta.host || name !== meta.name) return; + // TODO handle new replies and posts + // if (!("set" in rpost)) return; // const writ: Writ = { essay: rpost.set.essay, seal: rpost.set.seal }; + // const id = addDots(writ.seal.id, 3); + // setIncoming((s) => ({ ...s, [id]: writ })); + }, [lastChannelUpdate]); + return ( + + ); +} +function ThreadList({ page, meta }: { page: DiaryPage; meta: RichMetadata }) { + const [pages, setPages] = useState([]); + return ( + + {Object.values(page.posts) + .sort((a, b) => b.essay.sent - a.essay.sent) + .map((p) => ( + + ))} + + ); +} + +function ThreadPreview({ post, board }: { post: DiaryPost; board: string }) { + const [_, navigate] = useLocation(); + function openThread() { + const n = post.seal.id; + navigate(`/${n}`, { state: { thread: post, board } }); + } + return ( + + + + + + + {post.essay["kind-data"].diary.title} + + + {post.essay.author} + + + {date_diff(post.essay.sent, "short")} + {post.seal.meta.replyCount} replies + + + ); +} +function Snippet({ content }: { content: Content }) { + const markdown = writToMD(content.filter((c) => c)); + const snip = markdown.substring(0, 200); + const tokens = tokenize(snip); + const style = { + container: { + margin: 0, + }, + paragraph: { + margin: 0, + }, + }; + return ; +} + +export default function Router({ + site, + group, + forums, +}: { + site: Site; + group: Group; + forums: RichMetadata[]; +}) { + const params: any = useParams(); + const { airlock, io } = useStore(["airlock", "io"]); + const [dead, setDead] = useState(false); + const [loading, setLoading] = useState(false); + const [page, setPage] = useState(); + const [meta, setMeta] = useState(); + useEffect(() => { + setLoading(true); + const param = params.board; + if (!param) setDead(true); + else getData(param); + }, [params]); + async function getData(name: string) { + const { scryDiary } = io(); + const ship = `~${airlock.ship}` as Ship; + const us = forums.find((c) => c.name === name); + if (us) setMeta(us); + const res = await scryDiary(ship, name, 300); + setPage(res); + setLoading(false); + } + + if (dead) return ; + else if (loading) + return ( + + + + ); + else if (page && meta) + return ( + + Composer({ kind: "Forum Thread", meta })} + /> + + Board({ page, meta })} /> + + ); +} diff --git a/site/src/site/BoardThread.tsx b/site/src/site/BoardThread.tsx new file mode 100644 index 0000000..581ee06 --- /dev/null +++ b/site/src/site/BoardThread.tsx @@ -0,0 +1,303 @@ +import { scrollableStyle } from "../ui/theme"; +import { RichMetadata, Site, Ship } from "../logic/types"; +import { Link, Route, Switch, useLocation, useParams } from "wouter"; +import useStore from "../logic/store"; +import Sigil from "../ui/Sigil"; +import { + ChanString, + ChannelsRes, + Content, + DiaryPage, + DiaryPost, + Group, + Memo, + PostsPage, + Reply, + ReplySeal, + Writ, +} from "../logic/types-tlon"; +import { + Box, + Button, + CircularProgress, + Container, + List, + ListItem, + Stack, + TextField, + Toolbar, + Typography, +} from "@mui/material"; +import { useEffect, useLayoutEffect, useRef, useState } from "react"; +import { NotFound } from "./Home"; +import { PostContent } from "./PostContent"; +import { WholeFlex } from "../ui/Components"; +import { tokenize, writToMD } from "../logic/tlon-helpers"; +import { addDots, date_diff } from "../logic/utils"; + +export default function Thread() { + const { airlock, io } = useStore(["airlock", "io"]); + const { scryChannels } = io(); + const chansQuery = useQuery({ + queryKey: ["channels"], + queryFn: scryChannels, + }); + + const params: any = useParams(); + const [dead, setDead] = useState(false); + const [loading, setLoading] = useState(false); + const [boardName, setBoard] = useState(""); + const [thread, setThread] = useState(); + // const [meta, setMeta] = useState(); + useEffect(() => { + loadPost(); + }, [params]); + async function loadPost() { + if (history.state) { + const { thread, board } = history.state; + if (thread && board) { + setThread(history.state.thread); + setBoard(history.state.board); + } + } else { + const { board, thread } = params; + if (board) setBoard(board); + if (board && thread && chansQuery.data) + getData(board, thread, chansQuery.data); + else setDead(true); + } + } + + async function getData( + name: string, + tid: string, + channelsState: ChannelsRes, + ) { + const dted = addDots(tid, 3); + const host = `~${airlock.ship}`; + const chanString = `diary/${host}/${name}` as ChanString; + const board = channelsState[chanString]; + const ted = board.posts[dted] as unknown as DiaryPost; + setThread(ted); + // const { scryDiaryPost } = io(); + // const ship = `~${airlock.ship}` as Ship; + // const res = await scryDiaryPost(ship, name, dted); + // setThread(res); + setLoading(false); + } + + if (dead) return ; + else if (loading) return ; + else if (thread && boardName) + return ( + + + + {thread.essay["kind-data"].diary.title} + + + + + ); + else return
      ; +} + +function Posts({ thread, board }: { board: string; thread: DiaryPost }) { + const { lastChannelUpdate } = useStore(["lastChannelUpdate"]); + const seal = { ...thread.seal, "parent-id": thread.seal.id }; + useEffect(() => { + if (!lastChannelUpdate) return; + const { kind, name, update } = lastChannelUpdate; + if (kind !== "diary") return; + if (name !== board) return; + const rpost = update; + if (!("reply" in rpost)) return; + if (!("set" in rpost.reply["r-reply"])) return; + const rep: Reply = rpost.reply["r-reply"].set; + const id = addDots(rep.seal.id, 3); + setIncoming((s) => ({ ...s, [id]: rep })); + }, [lastChannelUpdate]); + const [incoming, setIncoming] = useState>({}); + + return ( + + + {Object.values({ ...thread.seal.replies, ...incoming }) + .sort((a, b) => a.memo.sent - b.memo.sent) + .map((p) => ( + + ))} + + ); +} + +import LinkIcon from "@mui/icons-material/Link"; +import ThumbUpIcon from "@mui/icons-material/ThumbUp"; +import ThumbDownIcon from "@mui/icons-material/ThumbDown"; +import ReplyIcon from "@mui/icons-material/Reply"; +import { ForumReplyModal } from "../modals/Modal"; +import { useQuery } from "@tanstack/react-query"; + +function ThreadPost({ + memo, + seal, + boardName, +}: { + memo: Memo; + seal: ReplySeal; + boardName: string; +}) { + const postStyle = { + paragraph: { + marginLeft: 0, + marginRight: 0, + }, + container: {}, + }; + const datetime = new Date(memo.sent).toLocaleString(); + + async function handleLink(e: React.MouseEvent) { + e.stopPropagation(); + const r = await navigator.clipboard.writeText(window.location.href); + } + useEffect(() => { + const s = Object.values(seal.reacts).reduce((acc, item) => { + return item === "👍" ? acc + 1 : item === "👎" ? acc - 1 : acc; + }, 0); + setScore(s); + }, [seal]); + const [score, setScore] = useState(0); + const [replying, setReplying] = useState(false); + const [input, setInput] = useState(""); + const { airlock, io, clientShip, addPending } = useStore([ + "airlock", + "io", + "clientShip", + "addPending", + ]); + const { sendDiaryReply, sendReplyReact, sendReact } = io(); + async function doReact(react: string) { + if (!canPoke) return; + setCanPoke(false); + const host = `~${airlock.ship}` as Ship; + const res = + seal.id === seal["parent-id"] + ? await sendReact( + clientShip, + "diary", + host, + boardName, + addDots(seal.id, 3), + react, + ) + : await sendReplyReact( + clientShip, + "diary", + host, + boardName, + addDots(seal["parent-id"], 3), + addDots(seal.id, 3), + react, + ); + console.log("react sent"); + if (res) { + setTimeout(() => { + setCanPoke(true); + }, 3000); + } + } + async function sendReply() { + setSending(true); + const host = `~${airlock.ship}` as Ship; + const content = tokenize(input); + const ts = Date.now(); + if (host !== clientShip) addPending(ts, content); + const res = await sendDiaryReply( + host, + // clientShip, + host, + boardName, + // WTF Can't nest replies! thanks Tlon + addDots(seal["parent-id"], 3), + content, + ts, + ); + if (res) { + setSending(false); + setReplying(false); + } + } + const [sending, setSending] = useState(false); + const [canPoke, setCanPoke] = useState(true); + return ( + + + + {memo.author} + + + + + Posted: {datetime} + + + + doReact("👍")} /> + = 0 ? "green" : "red"}> + {score} + + doReact("👎")} /> + setReplying(true)} /> + + + + {replying && ( + + setInput(e.currentTarget.value)} + /> + + + Replying as + + {clientShip} + + {sending ? ( + + ) : ( + + )} + + + )} + + + ); +} + +const styles = { + poast: { + border: "1px solid black", + gap: "1rem", + }, + postMeta: { + display: "flex", + alignItems: "center", + justifyContent: "space-between", + borderBottom: "1px solid black", + height: "2rem", + }, +}; diff --git a/site/src/site/Chat.tsx b/site/src/site/Chat.tsx new file mode 100644 index 0000000..6a57d56 --- /dev/null +++ b/site/src/site/Chat.tsx @@ -0,0 +1,157 @@ +import { + Box, + List, + ListItem, + ListItemText, + Stack, + Typography, +} from "@mui/material"; +import { RichMetadata, Site } from "../logic/types"; +import { Route, Switch } from "wouter"; +import { Group } from "../logic/types-tlon"; +import { useEffect, useState } from "react"; +import Chatroom from "./Chatroom"; +import { NotFound } from "./Home"; +import { WholeFlex } from "../ui/Components"; +import { scrollableStyle } from "../ui/theme"; + +const styles = { + logo: { + width: "64px", + height: "64px", + }, + navbar: { + backgroundColor: "black", + }, + appLinks: { + flexGrow: 1, + justifyContent: "space-evenly", + }, + appLink: { + color: "white", + textTransform: "uppercase", + }, + root: { + cursor: "pointer", + "&$selected": { + backgroundColor: "red", + color: "white", + "& .MuiListItemIcon-root": { + color: "white", + }, + }, + "&$selected:hover": { + backgroundColor: "purple", + color: "white", + "& .MuiListItemIcon-root": { + color: "white", + }, + }, + "&:hover": { + backgroundColor: "blue", + color: "white", + "& .MuiListItemIcon-root": { + color: "white", + }, + }, + }, +}; + +function ChatPage({ + chats, + active, +}: { + active: RichMetadata | null; + chats: RichMetadata[]; +}) { + useEffect(() => { + setActiveChat(active); + }, [active, chats]); + const [activeChat, setActiveChat] = useState(null); + async function openChat(meta: RichMetadata) { + setActiveChat(meta); + const p = window.location.pathname; + window.history.pushState({}, "", p + `/${meta.name}`); + } + return ( + + + + + Chats + + + {chats.map((c) => ( + + openChat(c)} primary={c.title} /> + + ))} + + + + + + {activeChat ? ( + + + {activeChat.title} + + + {activeChat.description} + + + ) : ( + <> + )} + + {activeChat ? : } + + + + + ); +} + +function ChatPlaceholder() { + return <>; +} +export default function Router({ + site, + group, + chats, +}: { + site: Site; + group: Group; + chats: RichMetadata[]; +}) { + return ( + + + {(params) => { + const chat = chats.find((c) => c.name == params.room); + if (!chat) return ; + else return ; + }} + + ChatPage({ chats, active: null })} /> + + ); +} diff --git a/site/src/site/Chatroom.tsx b/site/src/site/Chatroom.tsx new file mode 100644 index 0000000..fa71213 --- /dev/null +++ b/site/src/site/Chatroom.tsx @@ -0,0 +1,208 @@ +import { RichMetadata, Site, Ship } from "../logic/types"; +import useStore from "../logic/store"; +import Sigil from "../ui/Sigil"; +import { Group, PostsPage, Writ } from "../logic/types-tlon"; +import { + Box, + Button, + CircularProgress, + List, + ListItem, + TextField, + Typography, +} from "@mui/material"; +import { useEffect, useLayoutEffect, useRef, useState } from "react"; +import { NotFound } from "./Home"; +import { PostContent } from "./PostContent"; +import { Centered, WholeFlex } from "../ui/Components"; +import { tokenize } from "../logic/tlon-helpers"; +import { addDots, displayAnon } from "../logic/utils"; + +export default function Chatroom({ chat }: { chat: RichMetadata }) { + const { airlock, io } = useStore(["airlock", "io"]); + const [dead, setDead] = useState(false); + const [loading, setLoading] = useState(true); + const [page, setPage] = useState(); + useEffect(() => { + getData(); + }, [chat]); + async function getData() { + const { scryChatroom } = io(); + const ship = `~${airlock.ship}` as Ship; + const count = 300; + const res = await scryChatroom(chat.host, chat.name, count); + // const res2 = await scryGroups(); + // const channelName = `chat/${ship}/${name}`; + // const chat = res.channel[channelName]; + // if (!chat) return; + // const pending = chat.pending.posts; + // const pendingReplies = chat.pending.replies; + + if (res) { + setLoading(false); + setPage(res); + } + } + + if (dead) return ; + else if (loading) + return ( + + + + ); + else if (page) + return ( + <> + + + + ); + else return null; +} + +const styles = { + chatList: { + flexGrow: "1", + overflowY: "auto", + }, + reverseScroll: { + display: "flex", + flexDirection: "column", + justifyContent: "end", + }, + chatMessage: { + display: "flex", + gap: "1rem", + p: 1, + }, + chatInput: { + display: "flex", + width: "100%", + borderTop: "2px solid black", + }, + textInput: { + flexGrow: "1", + border: "none", + outline: "none", + padding: "0.5rem", + }, +}; + +function ChatLoader({ page, meta }: { page: PostsPage; meta: RichMetadata }) { + const { lastChannelUpdate } = useStore(["lastChannelUpdate"]); + const [incoming, setIncoming] = useState>({}); + useEffect(() => { + if (!lastChannelUpdate) return; + const { kind, host, name, update } = lastChannelUpdate; + if (kind !== "chat") return; + if (host !== meta.host || name !== meta.name) return; + const rpost = update; + if (!("set" in rpost)) return; + const writ: Writ = { essay: rpost.set.essay, seal: rpost.set.seal }; + const id = addDots(writ.seal.id, 3); + setIncoming((s) => ({ ...s, [id]: writ })); + }, [lastChannelUpdate]); + return ( + + ); +} +function PostList({ page, meta }: { page: PostsPage; meta: RichMetadata }) { + const [pages, setPages] = useState([]); + useLayoutEffect(() => { + scrollDown(); + }, [page]); + function scrollDown() { + bottomRef?.current?.scrollIntoView({ behavior: "instant" }); + } + const bottomRef = useRef(null); + return ( + + {Object.values(page.posts) + .sort((a, b) => a.essay.sent - b.essay.sent) + .map((p) => ( + + ))} +
      + + ); +} + +function ChatMessage({ post }: { post: Writ }) { + const time = new Date(post.essay.sent).toLocaleTimeString(); + const postStyles = { + container: { + lineHeight: "unset", + }, + paragraph: { + margin: 0, + fontWeight: 600, + }, + }; + return ( + + + + + + + {displayAnon(post.essay.author)} + {time} + + + + + ); +} + +function Input({ meta }: { meta: RichMetadata }) { + const { airlock, io, clientShip, addPending } = useStore([ + "airlock", + "io", + "clientShip", + "addPending", + ]); + const [input, setInput] = useState(""); + const inputRef = useRef(null); + function handleKeyboard(event: React.KeyboardEvent) { + if (event.key === "Enter" && event.shiftKey !== true && input) { + event.preventDefault(); + send(); + } + } + async function send() { + setInput(""); + const { sendChatMsg } = io(); + const content = tokenize(input); + const ts = Date.now(); + const host = `~${airlock.ship}` as Ship; + if (host !== clientShip) addPending(ts, content); + const res = await sendChatMsg(meta.host, meta.host, meta.name, content, ts); + inputRef?.current?.focus(); + } + return ( + + setInput(e.currentTarget.value)} + /> + + + ); +} diff --git a/site/src/site/Composer.tsx b/site/src/site/Composer.tsx new file mode 100644 index 0000000..05c4d7c --- /dev/null +++ b/site/src/site/Composer.tsx @@ -0,0 +1,125 @@ +import { + Container, + Typography, + Link as Lin, + Button, + Stack, + TextField, + CircularProgress, +} from "@mui/material"; +import { RichMetadata, Ship, Site } from "../logic/types"; +import useStore from "../logic/store"; +import { useEffect, useState } from "react"; +import { tokenize } from "../logic/tlon-helpers"; +import { WholeFlex } from "../ui/Components"; + +export default function Editor({ + kind, + meta, +}: { + kind: string; + meta: RichMetadata; +}) { + useEffect(() => { + const tit = localStorage.getItem("blogDraftTitle"); + if (tit) setTitle(tit); + const inp = localStorage.getItem("blogDraftInput"); + if (inp) setInput(inp); + const img = localStorage.getItem("blogDraftImage"); + if (img) setImage(img); + }, []); + const { io, airlock, addPending } = useStore([ + "airlock", + "sync", + "setModal", + "io", + "clientShip", + "addPending", + ]); + const [title, setTitle] = useState(""); + const [input, setInput] = useState(""); + const [image, setImage] = useState(""); + const [saving, setSaving] = useState(false); + const [error, setError] = useState(""); + const { sendDiaryPost } = io(); + async function save() { + setSaving(true); + const host = `~${airlock.ship}` as Ship; + const clientShip = (window as any).ship; + const content = tokenize(input); + const ts = Date.now(); + if (host !== clientShip) addPending(ts, content); + const res = await sendDiaryPost( + // clientShip, + host, + host, + meta.name, + title, + image, + content, + ts, + ); + console.log(res, "res"); + if (res) { + localStorage.removeItem("blogDraftTitle"); + localStorage.removeItem("blogDraftInput"); + localStorage.removeItem("blogDraftImage"); + history.back(); + } + } + useEffect(() => { + if (title) localStorage.setItem("blogDraftTitle", title); + }, [title]); + useEffect(() => { + if (input) localStorage.setItem("blogDraftInput", input); + }, [input]); + useEffect(() => { + if (input) localStorage.setItem("blogDraftImage", image); + }, [image]); + return ( + + + + + {kind} Editor + + {!saving ? ( + + ) : ( + + )} + + + setImage(e.currentTarget.value)} + /> + setTitle(e.currentTarget.value)} + /> + setInput(e.currentTarget.value)} + /> + + + + ); +} diff --git a/site/src/site/Forum.tsx b/site/src/site/Forum.tsx new file mode 100644 index 0000000..2efe7b0 --- /dev/null +++ b/site/src/site/Forum.tsx @@ -0,0 +1,205 @@ +import { + Avatar, + Box, + Card, + CardHeader, + CircularProgress, + Container, + List, + ListItem, + ListItemAvatar, + Typography, +} from "@mui/material"; +import { RichMetadata, Site } from "../logic/types"; +import { Link, Route, Switch, useLocation } from "wouter"; +import useStore from "../logic/store"; +import Sigil from "../ui/Sigil"; +import Board from "./Board"; +import { ChannelsRes, DiaryEssay, Group, Writ } from "../logic/types-tlon"; +import { useEffect, useState } from "react"; +import { scrollableStyle } from "../ui/theme"; +import { date_diff } from "../logic/utils"; +import { Centered } from "../ui/Components"; +import { useQuery } from "@tanstack/react-query"; + +type RichWrit = Writ & { chan: RichMetadata }; +function FPage({ + site, + forums, + group, + channelsState, +}: { + site: Site; + group: Group; + forums: RichMetadata[]; + channelsState: ChannelsRes; +}) { + const [_, navigate] = useLocation(); + const [loading, setLoading] = useState(true); + useEffect(() => { + const threads = Object.entries(channelsState).reduce( + (acc, [chan, state]) => { + const groupname = state.perms.group.split("/")[1]; + if (groupname !== site.groupname) return acc; + const [kind, _host, name] = chan.split("/"); + if (kind !== "diary") return acc; + if (chan.includes("ucm-ublog")) return acc; + const board = group.channels[chan]; + if (!board) return acc; + const chanmeta = { ...board.meta, name }; + const poasts = Object.entries(state.posts).map(([k, v]) => { + const nv = { ...v, chan: chanmeta }; + return [k, nv]; + }); + return { ...acc, ...Object.fromEntries(poasts) }; + }, + {} as Record, + ); + const sorted = Object.entries(threads).sort( + ([a, av], [b, bv]) => + Number(a.replaceAll(".", "")) - Number(b.replaceAll(".", "")), + ); + setThreads(sorted); + setLoading(false); + }, [channelsState]); + const [allThreads, setThreads] = useState>([]); + return ( + + + + + Forums + + + {forums.map((f) => ( + + + + + + ))} + + + + + Latest Threads + + {loading ? ( + + + + ) : ( + + {allThreads + .sort((a, b) => b[1].essay.sent - a[1].essay.sent) + .map((t) => ( + + + + + + ))} + + )} + + + + ); +} + +function ForumPreview({ meta }: { meta: RichMetadata }) { + return ( + + + {meta.title} + {meta.description} + + + ); +} +function ThreadPreview({ thread }: { thread: [string, RichWrit] }) { + const [id, writ] = thread; + const essay = writ.essay as unknown as DiaryEssay; + const repCount = writ.seal.meta.replyCount; + return ( + + + + + + + {essay["kind-data"].diary.title} + + {writ.chan.title} + + + {date_diff(essay.sent, "short")} + {repCount > 0 ? ( + {repCount} replies + ) : null} + + + ); +} +export default function Router({ + site, + group, + forums, +}: { + site: Site; + group: Group; + forums: RichMetadata[]; +}) { + const { io } = useStore(["io"]); + const { scryChannels } = io(); + const { isLoading, data } = useQuery({ + queryKey: ["channels"], + queryFn: scryChannels, + }); + if (!data) + return ( + + + + ); + else + return ( + + Board({ site, group, forums })} + /> + FPage({ site, forums, group, channelsState: data })} + /> + + ); +} diff --git a/site/src/site/Home.tsx b/site/src/site/Home.tsx new file mode 100644 index 0000000..645a495 --- /dev/null +++ b/site/src/site/Home.tsx @@ -0,0 +1,181 @@ +import { useEffect, useState } from "react"; +import { Channels, ChannelsBunt, Ship, Site } from "../logic/types"; +import { + Button, + Typography, + Box, + Container, + CircularProgress, + Divider, +} from "@mui/material"; +import useStore from "../logic/store"; +import ChatPage from "./Chat"; +import ForumPage from "./Forum"; +import BlogPage from "./Blog"; +import SearchPage from "./Search"; +import Radio from "./Radio"; +import Login from "./Login"; +import UserPage from "./User"; +import { ChannelType, Group } from "../logic/types-tlon"; +import Navbar from "./Navbar"; +import StaticPage, { MarkdownPage } from "./StaticPage"; +import { Router, Route, Link, Switch, useLocation, useParams } from "wouter"; +import { Centered, WholeFlex } from "../ui/Components"; +import { isValidPatp } from "../logic/ob/co"; +import { BASE_PATH } from "../logic/constants"; +import { useQueryClient } from "@tanstack/react-query"; + +export function Home({ site, group }: { site: Site; group: Group }) { + const { clientShip, io } = useStore(["clientShip", "io"]); + const { scryChannels } = io(); + const queryClient = useQueryClient(); + async function prefetch() { + // Not that prefetching does much in a single-threaded runtime... + await queryClient.prefetchQuery({ + queryKey: ["channels"], + queryFn: scryChannels, + }); + } + useEffect(() => { + prefetch(); + }, []); + + useEffect(() => { + let favicon = document.querySelector( + "link[rel~='icon']", + ) as HTMLLinkElement | null; + if (!favicon) { + favicon = document.createElement("link"); + favicon.rel = "icon"; + document.head.appendChild(favicon); + favicon.href = site.icon; + } + let title = document.querySelector("title"); + if (title) title.innerText = site.sitename; + }, [site]); + useEffect(() => { + setChans(); + }, [group]); + function setChans() { + const chans = Object.entries(group.channels); + const agg = chans.reduce((acc: Channels, [nam, chan]) => { + const [kind, ship, name] = nam.split("/"); + const host = ship as Ship; + const meta = { ...chan.meta, name, host, kind: kind as ChannelType }; + if (kind === "chat") return { ...acc, chats: [...acc.chats, meta] }; + else if (kind === "diary" && name.includes("ucm-ublog")) + return { ...acc, blog: meta }; + else if (kind === "diary") + return { ...acc, forums: [...acc.forums, meta] }; + else return acc; + }, ChannelsBunt); + setChannels(agg); + setLoading(false); + } + const [loading, setLoading] = useState(true); + const [channels, setChannels] = useState(ChannelsBunt); + + if (loading) + return ( + + + + ); + else + return ( + + <> + + + + + HomePage({ site, group })} /> + + + ChatPage({ site, group, chats: channels.chats }) + } + /> + + ForumPage({ site, group, forums: channels.forums }) + } + /> + + BlogPage({ site, group, meta: channels.blog! }) + } + /> + + SearchPage({ site })} + /> + + {(params) => { + const patp = params.patp as Ship; + if (clientShip.length > 28) + return ; + if (isValidPatp(patp)) return ; + else return ; + }} + + + {(params) => { + const text = site.apps.static[params.page]; + if (!text) return ; + else + return ( + + ); + }} + + + + + + + ); +} + +function HomePage({ site, group }: { site: Site; group: Group }) { + return ( + + + {site.sitename} + + + + {site.description} + + + + + + + ); +} + +export default Home; + +export function NotFound({ err }: { err: string }) { + return ( + + {err} not found + + + + + ); +} diff --git a/site/src/site/Login.tsx b/site/src/site/Login.tsx new file mode 100644 index 0000000..d744cc7 --- /dev/null +++ b/site/src/site/Login.tsx @@ -0,0 +1,119 @@ +import { Link, Redirect, Route, Router, useLocation } from "wouter"; +import useStore from "../logic/store.ts"; +import { + Box, + Button, + Card, + CardContent, + CardHeader, + Container, + Stack, + TextField, + Typography, +} from "@mui/material"; +import { useState } from "react"; +import { Ship } from "../logic/types.ts"; +import { BASE_PATH } from "../logic/constants.ts"; +import { isValidPatp } from "../logic/ob/co.ts"; + +export default function () { + const [input, setInput] = useState(""); + const [error, setError] = useState(""); + async function runEauth() { + const formBody = new URLSearchParams(); + formBody.append("name", input); + formBody.append("eauth", ""); + formBody.append("redirect", window.location.href); + const opts = { method: "POST", body: formBody }; + const res = await fetch("/~/login", opts); + console.log(res, "eauth res"); + } + function runMetamask() { + if (!isValidPatp(input)) setError("Not a valid Urbit ID name"); + else connectMetamask(input as Ship); + } + return ( + + + + +
      + setInput(e.currentTarget.value)} + /> + + + + + + +
      +
      +
      + ); +} + +async function fetchSecret() { + try { + const response = await fetch("/ucm/metamask"); + if (response.ok) { + const data = await response.json(); + return data.challenge; + } else { + throw new Error("Failed to retrieve secret"); + } + } catch (error) { + console.error("Error fetching secret:", error); + } +} +async function connectMetamask(who: Ship) { + const secret = await fetchSecret(); + console.log("metamask secret", secret); + try { + const eth = (window as any).ethereum; + const accounts = await eth.request({ method: "eth_requestAccounts" }); + const account = accounts[0]; + + const signature = await eth.request({ + method: "personal_sign", + params: [secret, account], + }); + + const response = await fetch("/ucm/auth", { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + who, + secret: secret, + address: account, + signature: signature, + }), + }); + + if (response.ok) { + // location.reload(); + window.location.replace(BASE_PATH); + } else { + alert("Login failed. Please try again."); + } + } catch (error) { + console.error("MetaMask login failed", error); + } +} diff --git a/site/src/site/Navbar.tsx b/site/src/site/Navbar.tsx new file mode 100644 index 0000000..0e36df7 --- /dev/null +++ b/site/src/site/Navbar.tsx @@ -0,0 +1,81 @@ +import { AppBar, Toolbar, Typography } from "@mui/material"; +import { Site } from "../logic/types"; +import { DEFAULT_ICON } from "../logic/constants"; +import useStore from "../logic/store"; +import Sigil from "../ui/Sigil"; +import { useEffect, useState } from "react"; +import { ThemeToggle } from "../ui/theme"; +import { Link } from "wouter"; + +const styles = { + logo: { + width: "64px", + height: "64px", + }, + navbar: { + backgroundColor: "black", + }, + appLinks: { + flexGrow: 1, + gap: "2rem", + justifyContent: "center", + }, + appLink: { + color: "white", + textTransform: "uppercase", + textDecoration: "none", + }, +}; +export default function Navbar({ site }: { site: Site }) { + useEffect(() => { + const ord: string[] = []; + for (const app of site["app-order"]) { + if (app.startsWith("static/")) ord.push(app.split("/")[1]); + if (app === "blog" && site.apps.blog) ord.push("blog"); + if (app === "radio" && site.apps.radio) ord.push("radio"); + if (app === "chat" && site.apps.chat.length > 0) ord.push("chat"); + if (app === "forum" && site.apps.forum.length > 0) ord.push("forum"); + if (app === "wiki" && site.apps.wiki.length > 0) ord.push("wiki"); + } + // ord.push("search"); + setOrder(ord); + }, [site]); + const { clientShip } = useStore(["clientShip"]); + const icon = site.icon || DEFAULT_ICON; + const [order, setOrder] = useState([]); + return ( + + + + + + + {order.map((page) => { + if (page === "wiki") + return ( + + {page} + + ); + else + return ( + + {page} + + ); + })} + + + {clientShip.length > 28 ? ( + + Login + + ) : ( + + + + )} + + + ); +} diff --git a/site/src/site/PostContent.tsx b/site/src/site/PostContent.tsx new file mode 100644 index 0000000..971ba4b --- /dev/null +++ b/site/src/site/PostContent.tsx @@ -0,0 +1,293 @@ +import { + Block, + ChannelCite, + Cite, + Content, + DiaryPost, + Inline, +} from "../logic/types-tlon"; +import { Box, Divider, Typography } from "@mui/material"; +import { retardedTlonTokens } from "../logic/utils"; +import { NotRetardedInline, Ship } from "../logic/types"; +import { CSSProperties } from "react"; +import { IMAGE_REGEX } from "../logic/constants"; + +const styles = { + logo: { + width: "64px", + height: "64px", + }, + navbar: { + backgroundColor: "black", + }, + appLinks: { + flexGrow: 1, + justifyContent: "space-evenly", + }, + appLink: { + color: "white", + textTransform: "uppercase", + }, + blogText: { + margin: "24px 0", + lineHeight: 1.61, + textAlign: "justify", + }, + snip: {}, + paragraph: {}, +}; + +export type PostStyles = { + container: CSSProperties; + paragraph: CSSProperties; +}; +export function PostContent({ + content, + style, +}: { + content: Content; + style?: PostStyles; +}) { + const containerStyle = style?.container ? style.container : styles.blogText; + const paragraphStyle = style?.paragraph ? style.paragraph : styles.paragraph; + return ( + + {content.map((v, i) => { + const key = JSON.stringify(v) + i; + if ("block" in v) return ; + else + return ( + + + + ); + })} + + ); +} +function BlockDiv({ block }: { block: Block }) { + if ("image" in block) + return ( + {block.image.alt} + ); + if ("header" in block) { + if (block.header.tag === "h1") + return ( +

      + +

      + ); + if (block.header.tag === "h2") + return ( +

      + +

      + ); + if (block.header.tag === "h3") + return ( +

      + +

      + ); + if (block.header.tag === "h4") + return ( +

      + +

      + ); + if (block.header.tag === "h5") + return ( +
      + +
      + ); + if (block.header.tag === "h6") + return ( +
      + +
      + ); + } + if ("rule" in block) return
      ; + if ("code" in block) + return ( +
      +        {block.code.code}
      +      
      + ); + if ("listing" in block) { + if ("item" in block.listing) + return ( +
    1. + +
    2. + ); + if (block.listing.list.type === "tasklist") + return ( +
      + {block.listing.list.items.map((l, i) => ( + + ))} +
      + ); + if (block.listing.list.type === "unordered") + return ( +
        + {block.listing.list.items.map((l, i) => ( + + ))} +
      + ); + if (block.listing.list.type === "ordered") + return ( +
        + {block.listing.list.items.map((l, i) => ( + + ))} +
      + ); + } +} +interface ReferenceProps { + cite: Cite; +} +function Reference({ cite }: ReferenceProps) { + if ("chan" in cite) return ; + // console.log(cite, "cite"); + // return ( + //
      + // {"group" in cite ? ( + //
      + // ) : "chan" in cite ? ( + // ) : "desk" in cite ? ( + //
      + // ) : "bait" in cite ? ( + //
      + // ) : null} + //
      + // ); +} + +function ChanRef({ cite }: { cite: ChannelCite }) { + //
      + // + //
      + return
      ; +} +type QuoteProps = { + post: DiaryPost; +}; +// export function Quote({ post }: QuoteProps) { +// // const profile = useProfile(post.essay.author); +// const name = profile?.nickname ? profile.nickname : post.essay.author; +// return ( +// <> +//

      {name}

      +//
      +// +//
      +// +// ); +// } + +export function Paragraph({ + inline, + inner, +}: { + inner?: boolean; + inline: Inline[]; +}) { + const paragraphs = retardedTlonTokens(inline); + return paragraphs.map((p, i) => ( + + )); +} +interface InlineProps { + inline: NotRetardedInline[]; + isPost?: boolean; +} +export function InlineText({ inline, isPost }: InlineProps) { + // const { setModal } = useStore(); + function openShipModal(s: Ship) {} + // return ; + return ( + + {inline.map((i, ind) => { + const key = JSON.stringify(i) + ind; + // console.log(i, 'inline'); + if ("text" in i) return {i.text}; + if ("bold" in i) + return ( + + + + ); + if ("italics" in i) + return ( + + + + ); + if ("strike" in i) + return ( + + + + ); + if ("link" in i) { + const containsProtocol = i.link.href.match(/https?:\/\//); + if (i.link.href.match(IMAGE_REGEX)) + return ( + + ); + else + return ( + + {i.link.content} + + ); + } + if ("blockquote" in i) + return ( +
      + +
      + ); + if ("code" in i) + return ( +
      +              {i.code}
      +            
      + ); + if ("task" in i) + return ( + + + + + ); + if ("inline-code" in i) + return ( + + {i["inline-code"]} + + ); + if ("ship" in i) + return ( + + {i.ship} + + ); + // if ("break" in i) return
      ; + })} +
      + ); +} diff --git a/site/src/site/Radio.tsx b/site/src/site/Radio.tsx new file mode 100644 index 0000000..9d28dd7 --- /dev/null +++ b/site/src/site/Radio.tsx @@ -0,0 +1,249 @@ +import { + AppBar, + Box, + Container, + Divider, + Toolbar, + Typography, + Link as Lin, + TextField, + Button, + List, + ListItem, + Stack, +} from "@mui/material"; +import { displayAnon } from "../logic/utils"; +import ReactPlayer from "react-player"; +import useStore from "../logic/store"; +import { useEffect, useLayoutEffect, useRef, useState } from "react"; +import { Centered } from "../ui/Components"; +import { Ship } from "../logic/types"; +import { OnProgressProps } from "react-player/base"; + +type Chatlog = Array<{ from: Ship; message: string; time: number }>; +export default function Radio() { + const { airlock, io, clientShip } = useStore(["airlock", "io", "clientShip"]); + const { radioSub, radioSub2, radioSpin, radioChat } = io(); + useEffect(() => { + // airlock.subscribeOnce("tower", "/personal").then((data) => { + // }); + radioSub((data) => { + console.log(data, "radio sub"); + if ("chat" in data) setChatlog((cl) => [...cl, data.chat]); + if ("spin" in data) { + setURL(data.spin.time); + setSpinTime(data.spin.time); + } + }); + // }); + }, []); + + useEffect(() => { + radioSub2((data) => { + console.log(data, "radio sub2"); + if (!("tower-update" in data)) return; + const tower = data["tower-update"]; + setTitle(tower.talk); + setTitleInput(tower.talk); + setDesc(tower.description); + setDescInput(tower.description); + setURL(tower.spin.url); + setInput(tower.spin.url); + setSpinTime(tower.spin.time); + setViewers(tower.viewers); + setChatlog(tower.chatlog); + }); + }, []); + async function submit() { + const res = await radioSpin(titleInput, descInput, input); + if (res) { + window.location.reload(); + } + } + const [error, setError] = useState(""); + // admin + const [input, setInput] = useState(""); + const [titleInput, setTitleInput] = useState(""); + const [descInput, setDescInput] = useState(""); + // radio + + const [chatlog, setChatlog] = useState([]); + const [mediaURL, setURL] = useState(""); + const [spinTime, setSpinTime] = useState(0); + const [title, setTitle] = useState(""); + const [desc, setDesc] = useState(""); + const [viewers, setViewers] = useState([]); + function handleReady(a: any) { + console.log(a, "radio ready"); + } + const playerRef = useRef(null); + function handleProgress(progress: OnProgressProps) { + if (!playerRef.current) return; + const duration = playerRef.current.getDuration(); + if (!duration) return; + const localProgress = progress.playedSeconds; + const ts = Date.now() / 1000; + let globalProgress = Math.ceil(ts - spinTime); + globalProgress = globalProgress % duration; + const outOfSync = Math.abs(localProgress - globalProgress); + if (outOfSync > 2) resync(); + } + useEffect(() => { + resync(); + }, [spinTime]); + function resync() { + if (!playerRef.current) return; + const ts = Date.now() / 1000; + const globalProgress = Math.ceil(ts - spinTime); + if (globalProgress > 10_000) return; + playerRef.current.seekTo(globalProgress, "seconds"); + } + // chatbox + useLayoutEffect(() => { + scrollDown(); + }, [chatlog]); + + function scrollDown() { + bottomRef?.current?.scrollIntoView({ behavior: "instant" }); + } + const bottomRef = useRef(null); + + return ( + + + + Radio + + + {`~${airlock.ship}` === clientShip && ( + + Choose what to play + + setTitleInput(e.currentTarget.value)} + /> + setDescInput(e.currentTarget.value)} + /> + setInput(e.currentTarget.value)} + /> + + + + )} + + Current Session: {title} + {desc} + + + + + + + + + Radio Chat + + + {chatlog.slice(-50).map((msg, i) => ( + + + + {displayAnon(msg.from)}: + + {msg.message} + + + ))} +
      + + + + + + ); +} +function Input() { + const { io, clientShip } = useStore(["io", "clientShip"]); + const [input, setInput] = useState(""); + const inputRef = useRef(null); + function handleKeyboard(event: React.KeyboardEvent) { + if (event.key === "Enter" && event.shiftKey !== true && input) { + event.preventDefault(); + send(); + } + } + async function send() { + setInput(""); + const { radioChat } = io(); + await radioChat(clientShip, input); + inputRef?.current?.focus(); + } + return ( + + setInput(e.currentTarget.value)} + /> + + + ); +} diff --git a/site/src/site/Search.tsx b/site/src/site/Search.tsx new file mode 100644 index 0000000..5892219 --- /dev/null +++ b/site/src/site/Search.tsx @@ -0,0 +1,88 @@ +import { + AppBar, + Box, + Container, + Divider, + Toolbar, + Typography, + Link as Lin, + TextField, + Button, + List, + ListItem, +} from '@mui/material'; +import { AppType, RichMetadata, Ship, Site } from '../logic/types'; +import { Link, Route, Switch, useLocation } from 'wouter'; +import useStore from '../logic/store'; +import { Content, DiaryPage, DiaryPost, Group } from '../logic/types-tlon'; +import { useEffect, useState } from 'react'; +import { tokenize, writToMD } from '../logic/tlon-helpers'; +import BlogPost from './BlogPost'; +import { PostContent } from './PostContent'; +import { Centered } from '../ui/Components'; +import { TypeSpecimenOutlined } from '@mui/icons-material'; + +export type SearchResults = {}; + +export default function BlogPage({ site }: { site: Site }) { + const { airlock, io } = useStore(['airlock', 'io']); + const { search } = io(); + const [error, setError] = useState(''); + const [input, setInput] = useState(''); + const [start, setStart] = useState(''); + const [end, setEbd] = useState(''); + const [apps, setApps] = useState([]); + const [mention, setMention] = useState(''); + const [results, setResults] = useState(); + + async function submit() { + const sts = new Date(start).getTime() || undefined; + const ets = new Date(end).getTime() || undefined; + const res = await search(input, apps, mention, sts, ets); + console.log(res, 'search result'); + if (res) setResults(res); + } + return ( + + + + Search + + + + + + + + {results && } + + ); +} + +function Results({ data }: { data: any }) { + const list: string[] = data.things; + return ( + <> + Results + + {list.map((i) => ( + + + + ))} + + + ); +} diff --git a/site/src/site/Snippets.tsx b/site/src/site/Snippets.tsx new file mode 100644 index 0000000..51edb47 --- /dev/null +++ b/site/src/site/Snippets.tsx @@ -0,0 +1,352 @@ +// import { fetchTweet, lurkTweet } from "@/logic/twatter/calls"; +// import { pokeDister, scryDister, scryGangs } from "@/logic/requests/tlon"; +// import { useEffect, useState } from "react"; +// import Tweet from "@/sections/twatter/Tweet"; +// import { toFlat } from "@/sections/feed/thread/helpers"; +// import PostData from "@/sections/feed/PostData"; +// import Post from "@/sections/feed/post/Post"; +// import { FullNode, SortugRef } from "@/types/trill"; +// import { useQuery, useQueryClient } from "@tanstack/react-query"; +// import { subscribe, unsub } from "@/logic/requests/generic"; +// import { AppData, GroupMetadata } from "@/types/tlon"; +// import comet from "@/assets/icons/comet.svg"; +// import Sigil from "@/ui/Sigil"; +// import { parseThread, parseTweet } from "@/logic/twatter/parser"; +// import { Tweet as TweetType } from "@/types/twatter"; +// import { scryRadio } from "@/logic/requests/trill"; +// import useLocalState from "@/state/state"; +// import { RadioTower, ScheduledRadio, radioLink } from "@/logic/requests/radio"; +// import { Ship } from "@/types/urbit"; +// import { RADIO } from "@/logic/constants"; +// import { SigilOnly } from "../Avatar"; +// import { date_diff } from "../logic/utils"; +// import ShipsModal from "../modals/ShipsModal"; + +// export function TweetSnippet({ +// link, +// giveBack, +// }: { +// link: string; +// giveBack?: Function; +// }) { +// const id = link.split("/")[5]; +// const { isLoading, isError, data } = useQuery({ +// queryKey: ["twatter-thread", id], +// queryFn: () => lurkTweet(id), +// }); +// const [tw, setTw] = useState(); +// useEffect(() => { +// if (data && "thread-lurk" in data) { +// const js = JSON.parse(data["thread-lurk"]).data.tweetResult; +// if (JSON.stringify(js) === "{}") return; +// if (giveBack) giveBack(JSON.stringify(parseTweet(js.result))); +// } +// }, [data]); +// if (isLoading || isError) +// return ( +//
      +//

      Fetching Tweet from your Urbit...

      +//
      +// ); +// else { +// if ("no-coki" in data) +// return ( +// +// ); +// if ("fail" in data) +// return ( +//

      +// Bad request. Please send some feedback (here) of what you were trying +// to fetch. +//

      +// ); +// if ("thread-lurk" in data) { +// const js = JSON.parse(data["thread-lurk"]).data.tweetResult; +// if (JSON.stringify(js) === "{}") +// return null; // TODO wtf +// else +// return ( +//
      +// +//
      +// ); +// } +// // else { +// // const head = parseThread(JSON.parse(data.thread)); +// // const tweet = head.thread.tweets[0] +// // giveBack(JSON.stringify(tweet)) +// // return ( +// //
      +// // +// //
      +// // ); +// // } +// } +// } + +// export function AppSnippet({ r }: { r: SortugRef }) { +// async function sub() { +// if (!subn) { +// const s = await subscribe( +// "treaty", +// "/treaties", +// (data: { add: AppData }) => { +// if ("ini" in data) { +// const app = Object.values(data.ini).find((d) => d.desk === name); +// setApp(app); +// } +// if ("add" in data && data.add.desk === name) setApp(data.add); +// if (appData) unsub(subn); +// }, +// ); +// setSub(s); +// const res = await pokeDister(ship); +// } +// } +// const { ship, path } = r; +// const name = path.slice(1); +// const [appData, setApp] = useState(); +// const [subn, setSub] = useState(); +// const { isLoading, data, isError } = useQuery({ +// queryKey: ["dister", ship], +// queryFn: () => scryDister(ship), +// }); +// if (isLoading || isError) return
      ...
      ; +// else { +// const app = Object.values(data.ini).find((d) => d.desk === name); +// if (!app && !appData) sub(); +// const a = app +// ? app +// : appData +// ? appData +// : { title: name, image: comet, info: "", ship }; +// return ( +//
      +// +//
      +// ); +// } +// } +// function AppDiv({ app }: { app: Partial }) { +// return ( +// <> +// +//
      +//

      {app.title}

      +//

      {app.info}

      +//

      App from {app.ship}

      +//
      +//

      +// +//

      +// +// ); +// } + +// export function TlonSnippet({ r }: { r: SortugRef }) { +// if (r.type === "app") return ; +// if (r.type === "groups") return ; +// } +// export function GroupSnippet({ r }: { r: SortugRef }) { +// const queryClient = useQueryClient(); +// async function sub() { +// if (!subn) { +// const path = `/gangs/index/${ship}`; +// const s = await subscribe("groups", path, (data: any) => { +// const key = `${ship}/${name}`; +// const val = data[key]; +// queryClient.setQueryData(["gangs"], (old: any) => { +// return { ...old, [key]: { preview: val } }; +// }); +// }); +// setSub(s); +// } +// } +// const { ship, path } = r; +// const name = path.slice(1); +// const [groupData, setGroup] = useState(); +// const [subn, setSub] = useState(); +// const { isLoading, data, isError } = useQuery({ +// queryKey: ["gangs"], +// queryFn: scryGangs, +// }); +// if (isLoading || isError) return
      ...
      ; +// else { +// const group = data[`${ship}/${name}`]; +// if (!group && !groupData) sub(); +// const a = +// group && group.preview +// ? group.preview.meta +// : groupData +// ? groupData +// : { title: name, image: comet, cover: "", description: "" }; +// return ( +//
      +// {a.image.startsWith("#") ? ( +//
      +// ) : ( +// +// )} +//
      +//

      {a.title}

      +//

      +// {a.description.length > 25 +// ? a.description.substring(0, 25) + "..." +// : a.description} +//

      +//

      Group by {ship}

      +//
      +// {/*

      +// +//

      */} +//
      +// ); +// } +// } + +// export function RadioSnippet({ ship }: { ship: Ship }) { +// const { our } = useLocalState(); +// return ship === our ? : ; +// } + +// function DudesRadio({ ship }: { ship }) { +// function onc() { +// radioLink(ship); +// } +// const { radioTowers } = useLocalState(); +// const tower = radioTowers.find((t) => t.location === ship); +// if (!tower) +// return ( +//
      +//

      {RADIO}

      +//
      +//

      Radio data not published. Click and check.

      ; +//
      +//
      +// ); +// else +// return ( +//
      +//

      {RADIO}

      +//
      +//

      Radio Session. Playing: {tower.description}

      +//

      Started {new Date(tower.time).toLocaleString()}

      +//
      +//
      +// +// +// {tower.viewers} +// 👀 +// +//
      +//
      +// ); +// } + +// function OwnRadio() { +// const { currentRadio, our, setModal, radioTowers } = useLocalState(); +// const [scheduled, setS] = useState(null); +// function onc() { +// radioLink(our); +// } +// useEffect(() => { +// scryRadio().then((r) => { +// if (r) setS(r.radio); +// }); +// }, []); +// function showViewers() { +// const modal = ( +// +// ); +// setModal(modal); +// } +// if (scheduled && scheduled.time > Date.now()) +// return ( +//
      +//

      {RADIO}

      +//
      +//

      +// Radio Session. Playing: +// +// {scheduled.desc} +// +//

      +//

      Starting at {new Date(scheduled.time).toLocaleString()}

      +//
      +//
      +// +//
      +//
      +// ); +// else if (!currentRadio) +// return ( +//
      +//

      {RADIO}

      +//
      +//

      Radio unavailable

      +//
      +//
      +// ); +// else +// return ( +//
      +//

      {RADIO}

      +//
      +//

      +// Radio Session. Playing: +// +// {currentRadio.description} +// +//

      +// {/*

      Started {date_diff(currentRadio.time, "long")}

      */} +//
      +//
      +// +// +// {currentRadio?.viewers?.length || ""} +// 👀 +// +//
      +//
      +// ); + +// // return ( +// // {scheduled > Date.now() +// // ? (<> +// //

      +// // Radio Session. Playing: +// // +// // {currentRadio.description} +// // +// //

      + +// //

      Starting at {new Date(scheduled).toLocaleString()}

      +// // + +// // ): scheduled !== 0() + +// // } +// //

      +// // Radio Session. Playing: +// // +// // {currentRadio.description} +// // +// //

      +// // {scheduled && scheduled > Date.now() ? ( +// //

      Starting at {new Date(scheduled).toLocaleString()}

      +// // ) : scheduled !== 0 ? ( +// //

      Started {date_diff(new Date(scheduled), "long")}. Click to join.

      +// // ) : ( +// //

      Unscheduled session. Click to join.

      +// // )} +// // ); +// } diff --git a/site/src/site/StaticPage.tsx b/site/src/site/StaticPage.tsx new file mode 100644 index 0000000..01f09d4 --- /dev/null +++ b/site/src/site/StaticPage.tsx @@ -0,0 +1,37 @@ +import { Box, Container, Typography } from "@mui/material"; +import { Site } from "../logic/types"; +import { marked } from "marked"; +import ReactHtmlParser from "react-html-parser"; +import { useEffect, useState } from "react"; + +export default function StaticPage({ + site, + title, + markdown, +}: { + site: Site; + title: string; + markdown: string; +}) { + useEffect(() => { + marked.parse(markdown, { async: true }).then((h) => setHTML(h)); + }, [markdown]); + const [html, setHTML] = useState(""); + return ( + + + + {title} + + + {ReactHtmlParser(html)} + + ); +} +export function MarkdownPage({ markdown }: { markdown: string }) { + useEffect(() => { + marked.parse(markdown, { async: true }).then((h) => setHTML(h)); + }, [markdown]); + const [html, setHTML] = useState(""); + return {ReactHtmlParser(html)}; +} diff --git a/site/src/site/User.tsx b/site/src/site/User.tsx new file mode 100644 index 0000000..46594c3 --- /dev/null +++ b/site/src/site/User.tsx @@ -0,0 +1,47 @@ +import { AppBar, Box, Button, Card, Container, Toolbar, Typography } from '@mui/material'; +import { Ship } from '../logic/types'; +import { Link } from 'wouter'; +import useStore from '../logic/store'; +import Sigil from '../ui/Sigil'; +import { BASE_PATH } from '../logic/constants'; +import { Centered } from '../ui/Components'; + +const styles: any = { + logo: { + width: '64px', + height: '64px', + }, + navbar: { + backgroundColor: 'black', + }, + appLinks: { + flexGrow: 1, + justifyContent: 'space-evenly', + }, + appLink: { + color: 'white', + textTransform: 'uppercase', + }, +}; +export default function Page({ patp }: { patp: Ship }) { + const redirect = BASE_PATH; + return ( + + + + + + + {patp} + + + + + + + ); +} diff --git a/site/src/site/Wiki.tsx b/site/src/site/Wiki.tsx new file mode 100644 index 0000000..da9afdc --- /dev/null +++ b/site/src/site/Wiki.tsx @@ -0,0 +1,26 @@ +import { AppBar, Box, Toolbar, Typography } from '@mui/material'; +import { Site } from '../logic/types'; +import { Link } from 'wouter'; +import useStore from '../logic/store'; +import Sigil from '../ui/Sigil'; + +const styles = { + logo: { + width: '64px', + height: '64px', + }, + navbar: { + backgroundColor: 'black', + }, + appLinks: { + flexGrow: 1, + justifyContent: 'space-evenly', + }, + appLink: { + color: 'white', + textTransform: 'uppercase', + }, +}; +export default function Page({ site }: { site: Site }) { + return ; +} diff --git a/site/src/ui/Components.tsx b/site/src/ui/Components.tsx new file mode 100644 index 0000000..59038f0 --- /dev/null +++ b/site/src/ui/Components.tsx @@ -0,0 +1,119 @@ +import { Box, Card, CircularProgress, SxProps, Theme } from "@mui/material"; +import { ReactNode } from "react"; +import useStore from "../logic/store"; + +export function WholeFlex({ + children, + sx, +}: { + sx?: SxProps; + children: ReactNode; +}) { + const style: any = { + display: "flex", + flexDirection: "column", + height: "100%", + ...sx, + }; + return {children}; +} + +export const styles = { + steady: { + overflow: "hidden", + }, +}; + +export function Flex({ + sx, + children, + dir = "row", + gap = "1rem", +}: { + sx?: SxProps; + children: ReactNode; + dir?: "row" | "column"; + gap?: string; +}) { + const styl: any = { display: "flex", flexDirection: dir, gap, ...sx }; + return {children}; +} +export function Row({ + sx, + children, +}: { + sx?: SxProps; + children: ReactNode; +}) { + const styl: any = { ...sx, display: "flex" }; + return {children}; +} +export function SpreadRow({ + children, + sx, +}: { + sx?: SxProps; + children: ReactNode; +}) { + const styl: any = { ...sx, display: "flex", justifyContent: "space-between" }; + return {children}; +} +export function Centered({ + children, + y = false, + sx, + fixed = false, +}: { + y?: boolean; + fixed?: boolean; + sx?: SxProps; + children: ReactNode; +}) { + if (!y) { + return ( + + {children} + + ); + } else { + const position = fixed ? "fixed" : "absolute"; + const styles = y + ? { + transform: "translate(-50%, -50%)", + top: "50%", + left: "50%", + } + : { transform: "translateX(-50%)", left: "50%" }; + + const styl: any = { ...sx, position, ...styles }; + return {children}; + } +} + +export function Scrollable({ + children, + x = false, + sx, +}: { + x?: boolean; + sx?: SxProps; + children: ReactNode; +}) { + const xstyles = x ? { overflowX: "auto" } : {}; + const styles: any = { ...sx, ...xstyles, overflowY: "auto" }; + return {children}; +} + +export function LoadingScreen() { + const { airlock } = useStore(["airlock"]); + return ( + + + + + +

      Loading...

      +
      +
      + ); +} diff --git a/site/src/ui/Sigil.tsx b/site/src/ui/Sigil.tsx new file mode 100644 index 0000000..ecb4f56 --- /dev/null +++ b/site/src/ui/Sigil.tsx @@ -0,0 +1,49 @@ +import { sigil, reactRenderer } from './sigil-ts'; +import { isValidPatp } from '../logic/ob/co'; +import comet from '../assets/icons/comet.svg'; +import { auraToHex } from '../logic/utils'; + +interface SigilProps { + patp: string; + size: number; + color?: string; +} + +const Sigil = (props: SigilProps) => { + const color = props.color ? auraToHex(props.color) : 'black'; + if (!isValidPatp(props.patp)) return
      X
      ; + else if (props.patp.length > 28) + return ( + + ); + else if (props.patp.length > 15) + // moons + return ( + <> + {sigil({ + patp: props.patp.substring(props.patp.length - 13), + renderer: reactRenderer, + size: props.size, + colors: ['grey', 'white'], + })} + + ); + else + return ( + <> + {sigil({ + patp: props.patp, + renderer: reactRenderer, + size: props.size, + colors: [color, 'white'], + })} + + ); +}; + +export default Sigil; diff --git a/site/src/ui/sigil-ts/index.json b/site/src/ui/sigil-ts/index.json new file mode 100644 index 0000000..3c8f95b --- /dev/null +++ b/site/src/ui/sigil-ts/index.json @@ -0,0 +1,24315 @@ +{ + "bac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32.0072", + "x2": "32.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64.0072", + "x2": "64.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96.0072", + "x2": "96.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ban": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 70.6924 70.6924 128 -1.52588e-05 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3462 99.3462 64 64 64C28.6538 64 0 35.3462 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ben": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "8", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ber": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bet": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C74.9807 96 32 53.0193 32 -4.19629e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0C32 70.6925 74.9807 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96", + "x2": "-8.87604e-09", + "y2": "96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-8.87604e-09", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bon": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 4.215e-07 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bot": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 64C16 90.5097 37.4903 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "bus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 110.327 17.6731 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "byl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M22.1288 22.6299C16.0075 28.7511 8.0234 31.874 0.00134547 31.9986M44.7562 45.2573C32.3866 57.6269 16.2133 63.8747 0.00134277 64.0005M67.3836 67.8847C48.7656 86.5027 24.403 95.8749 0.00134412 96.0012", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "byn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "byr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "byt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L-5.96046e-08 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "63.29", + "y2": "63.2929", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32.0072", + "x2": "32.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64.0072", + "x2": "64.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96.0072", + "x2": "96.7071", + "y2": "127.3", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dap": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.004", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.6274 86.6274C99.1242 74.1307 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M75.3137 75.3137C81.5621 69.0653 81.5621 58.9347 75.3137 52.6863C69.0653 46.4379 58.9347 46.4379 52.6863 52.6863", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M97.9411 97.9411C116.686 79.1959 116.686 48.804 97.9411 30.0589C79.196 11.3137 48.804 11.3137 30.0589 30.0589", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "das": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 -1.54503e-06 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "deb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 -6.35781e-07C64 35.3462 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "16", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "16", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "def": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128L128 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 94L94 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 64L64 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 32L32 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "deg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "del": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 -6.35781e-07C64 35.3462 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "den": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1216", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "der": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128L96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "des": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "det": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.996", + "x2": "47.9964", + "y2": "79.9964", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96.5", + "y1": "3.07317e-08", + "x2": "96.5", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32.5", + "y1": "3.07317e-08", + "x2": "32.5", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dib": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "8.74228e-08", + "y1": "64", + "x2": "128", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "5.25874e-08", + "y1": "32", + "x2": "128", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dif": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M60.1244 67.3837C41.5063 48.7657 32.1342 24.4031 32.0079 0.00145601M82.7518 44.7563C70.3822 32.3867 64.1344 16.2134 64.0086 0.00145196M105.379 22.1289C99.258 16.0077 96.1351 8.02351 96.0105 0.00145196", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dig": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64.5", + "y1": "-0.5", + "x2": "64.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9964", + "x2": "112.004", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "din": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dir": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 81.6731 81.6731 96 64 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.0029152 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "div": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-4.19629e-06 96C70.6924 96 128 53.0193 128 5.59506e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-2.79753e-06 64C70.6924 64 128 35.3462 128 5.59506e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "doc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M127.997 0L-0.00291443 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726C28.8758 53.8694 28.8758 74.1306 41.3726 86.6274", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-4.19629e-06 16C26.5097 16 48 37.4903 48 64C48 90.5097 26.5097 112 0 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "don": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-3.8147e-06 128C-7.24632e-07 92.6538 28.6538 64 64 64C99.3462 64 128 92.6538 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "63.5", + "x2": "128", + "y2": "63.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.6274 86.6274C99.1242 74.1306 99.1242 53.8693 86.6274 41.3725C74.1306 28.8758 53.8694 28.8758 41.3726 41.3725", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dot": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dov": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.701724 31.9914C25.6281 31.9914 49.4822 42.5913 66.8261 59.7565M-0.701723 63.9914C16.7916 63.9914 32.6456 71.0098 44.1982 82.3844M-0.701722 95.9914C7.955 95.9914 15.8089 99.4288 21.5694 105.013", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "doz": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128L0 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M30.0589 30.0589C48.804 11.3137 79.196 11.3137 97.9411 30.0589C116.686 48.804 116.686 79.196 97.9411 97.9411", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M52.6863 52.6863C58.9347 46.4379 69.0653 46.4379 75.3137 52.6863C81.5621 58.9347 81.5621 69.0653 75.3137 75.3137", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M41.3726 41.3726C53.8694 28.8758 74.1306 28.8758 86.6274 41.3726C99.1242 53.8694 99.1242 74.1306 86.6274 86.6274", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "duc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C90.5097 16 112 37.4903 112 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 64L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dun": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 -3.05151e-06C32 53.0193 74.9807 96 128 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dux": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-2.79795e-06 -3.55988e-06C70.6924 -4.40288e-06 128 57.3075 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dyn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dyr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dys": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-3.8147e-06 1.11901e-05C-7.24633e-07 35.3462 28.6538 64 64 64C99.3462 64 128 35.3462 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "dyt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fad": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128L128 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 32C26.5077 32 50.5061 42.7436 67.8783 60.1138", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 64C17.6721 64 33.6713 71.1626 45.2529 82.7432", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 95.6284C8.83603 95.6284 16.8356 99.2097 22.6264 105", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fam": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fas": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "feb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fed": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fen": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fer": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fet": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00291443 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fig": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "98", + "y1": "2.18557e-08", + "x2": "98", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fip": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fir": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fog": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.6274 86.6274C99.1242 74.1306 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fon": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 64C16 90.5097 37.4903 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "for": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 53.0193 53.0193 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 35.3462 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0C32 17.6731 17.6731 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fot": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ful": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fun": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.8823 41.6275C74.3855 29.1307 54.1242 29.1307 41.6274 41.6275C29.1307 54.1243 29.1307 74.3855 41.6274 86.8823", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 110.327 17.6731 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M22.1288 22.6299C16.0075 28.7511 8.0234 31.874 0.00134547 31.9986M44.7562 45.2573C32.3866 57.6269 16.2133 63.8747 0.00134277 64.0005M67.3836 67.8847C48.7656 86.5027 24.403 95.8749 0.00134412 96.0012", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fyn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "fyr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00268555 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M60.1244 67.3837C41.5063 48.7657 32.1342 24.4031 32.0079 0.00145601M82.7518 44.7563C70.3822 32.3867 64.1344 16.2134 64.0086 0.00145196M105.379 22.1289C99.258 16.0077 96.1351 8.02351 96.0105 0.00145196", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "had": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64.5", + "y1": "-0.5", + "x2": "64.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 64C16 90.5097 37.4903 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "han": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hap": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "har": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "has": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "8", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M48 32C48 40.8366 40.8366 48 32 48C23.1634 48 16 40.8366 16 32C16 23.1634 23.1634 16 32 16C40.8366 16 48 23.1634 48 32ZM32 40C36.4183 40 40 36.4183 40 32C40 27.5817 36.4183 24 32 24C27.5817 24 24 27.5817 24 32C24 36.4183 27.5817 40 32 40Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "heb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.00285417", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M48 96C48 104.837 40.8366 112 32 112C23.1634 112 16 104.837 16 96C16 87.1634 23.1634 80 32 80C40.8366 80 48 87.1634 48 96ZM32 104C36.4183 104 40 100.418 40 96C40 91.5817 36.4183 88 32 88C27.5817 88 24 91.5817 24 96C24 100.418 27.5817 104 32 104Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "het": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128L96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "8.74228e-08", + "y1": "64", + "x2": "128", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M48 64C48 72.8366 40.8366 80 32 80C23.1634 80 16 72.8366 16 64C16 55.1634 23.1634 48 32 48C40.8366 48 48 55.1634 48 64ZM32 72C36.4183 72 40 68.4183 40 64C40 59.5817 36.4183 56 32 56C27.5817 56 24 59.5817 24 64C24 68.4183 27.5817 72 32 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hob": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hoc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "47", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "47", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "81", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "81", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C46.3269 96 32 81.6731 32 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "hut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 -9.40976e-06C64 70.6924 92.6538 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 -7.63193e-07C32 70.6924 74.9807 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lad": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "95.35", + "y1": "32.7071", + "x2": "32.0571", + "y2": "96", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lag": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 112C90.5097 112 112 90.5097 112 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lap": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "2.78181e-08", + "y1": "64", + "x2": "128", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "las": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "leb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-1.64036e-05 32C53.0193 32 96 74.9807 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "led": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "leg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M7.63192e-07 32C17.6731 32 32 46.3269 32 64C32 81.6731 17.6731 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "len": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 110.327 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ler": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "let": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9965", + "y1": "111.997", + "x2": "47.9965", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lib": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lig": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "128", + "x2": "64", + "y2": "-6.55671e-08", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "64", + "r": "8", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-4.70488e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00286865 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "liv": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-5.21346e-06 32C70.6924 32 128 17.6731 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M3.4331e-06 96C70.6924 96 128 53.0193 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "loc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C74.9807 96 32 53.0193 32 -4.19629e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 64C16 90.5097 37.4903 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lom": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lon": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-8.87604e-09", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "los": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "luc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lug": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lun": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lup": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lux": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lyd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lyn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lyr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00268555 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lys": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lyt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "lyx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mag": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.004", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "map": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.0029152 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 64L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M86.6274 86.6274C99.1242 74.1307 99.1242 53.8694 86.6274 41.3726C74.1306 28.8758 53.8694 28.8758 41.3726 41.3726", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M75.3137 75.3137C81.5621 69.0653 81.5621 58.9347 75.3137 52.6863C69.0653 46.4379 58.9347 46.4379 52.6863 52.6863", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M97.9411 97.9411C116.686 79.1959 116.686 48.804 97.9411 30.0589C79.196 11.3137 48.804 11.3137 30.0589 30.0589", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mas": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C110.327 32 96 17.6731 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "meb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 -3.05151e-06C32 53.0193 74.9807 96 128 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "med": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "meg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mer": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.996", + "x2": "47.9964", + "y2": "79.9964", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "met": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128L32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-2.09815e-06 80C26.5097 80 48 101.49 48 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mig": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-4.37114e-08", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96", + "x2": "-4.37114e-08", + "y2": "96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "min": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mip": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6538 128 64 99.3462 64 64C64 28.6538 92.6538 4.215e-07 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mir": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9964", + "x2": "48.0036", + "y2": "47.9964", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00286865 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "moc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 96L128 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mog": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 90.5097 90.5097 112 64 112C37.4903 112 16 90.5097 16 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 0C112 26.5097 90.5097 48 64 48C37.4903 48 16 26.5097 16 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mon": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9964", + "x2": "48.0035", + "y2": "47.9964", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.996", + "x2": "47.9964", + "y2": "79.9964", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mot": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mug": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.003", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mun": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 74.9807 53.0193 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "mut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "myl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "myn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 1.52638e-06C57.3076 -7.74381e-06 9.2702e-06 57.3075 0 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C74.9807 32 32 74.9807 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 110.327 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "myr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.82114e-06 110C60.7513 110 110 60.7513 110 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-5.09828e-06 73C40.3168 73 73 40.3168 73 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-6.63647e-07 37C20.4345 37 37 20.4345 37 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nam": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "8.74228e-08", + "y1": "64", + "x2": "128", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nap": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "8", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-1.52588e-05 128C-9.07866e-06 57.3075 57.3076 1.44926e-06 128 7.62939e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "neb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C74.9807 32 32 74.9807 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ned": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00268555 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 1.90735e-06C96 53.0193 53.0193 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C57.3076 128 3.09007e-06 70.6925 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C74.9807 96 32 53.0193 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C110.327 32 96 17.6731 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ner": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9965", + "y1": "111.997", + "x2": "47.9965", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "net": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 64L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.003", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nib": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6538 128 64 70.6925 64 7.63192e-07", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-8.87604e-09", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nim": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C74.9807 32 32 74.9807 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00285435 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "noc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "1.51277e-05", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nom": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C46.3269 96 32 81.6731 32 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nov": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M2.03434e-06 128C70.6924 128 128 70.6925 128 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nub": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "num": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nup": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0.000105172 128C35.3582 128 67.3679 113.664 90.5332 90.4863", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "31", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "31", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.003", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.6499 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nux": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nyd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128C4.63574e-06 92.6489 14.3309 60.6449 37.5 37.4807", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1217", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nym": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nyr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00268555 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.9984 0C95.9984 26.3298 85.3985 50.1839 68.2332 67.5278M63.9983 0C63.9983 17.4933 56.9799 33.3473 45.6054 44.8999M31.9983 0C31.9983 8.65672 28.5609 16.5106 22.9766 22.2711", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nys": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nyt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 32C81.6731 32 96 46.3269 96 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C90.5097 16 112 37.4903 112 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "nyx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pad": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pag": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M41.3726 86.6274C28.8758 74.1306 28.8758 53.8693 41.3726 41.3725C53.8694 28.8758 74.1306 28.8758 86.6274 41.3725", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "par": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.693 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pas": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 -2.67054e-06C32 53.0193 74.9807 96 128 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 -1.78036e-06C64 35.3462 92.6538 64 128 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 -8.9018e-07C96 17.6731 110.327 32 128 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ped": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "peg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 17.6731 81.6731 32 64 32C46.3269 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pen": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 17.6731 81.6731 32 64 32C46.3269 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "per": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 112C90.5097 112 112 90.5097 112 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.00285417", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pet": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.003", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 74.9807 53.0193 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 110.327 17.6731 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "poc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64.5", + "y1": "-0.5", + "x2": "64.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96.5", + "y1": "-0.5", + "x2": "96.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32.5", + "y1": "-0.5", + "x2": "32.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96", + "x2": "-8.87604e-09", + "y2": "96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-8.87604e-09", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pon": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pos": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pub": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pun": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M80 64C80 55.1634 72.8366 48 64 48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M3.73284e-05 64C17.6633 64 33.6554 56.8445 45.2356 45.2741", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "put": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-5.59506e-06 128C35.3462 128 64 99.3462 64 64C64 28.6538 35.3462 1.54503e-06 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "pyx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9965", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rad": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rag": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ral": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ram": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ran": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00291443 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rap": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "-1.29797e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "reb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 -9.40976e-06C57.3075 -6.31969e-06 -3.09007e-06 57.3075 0 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "red": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ref": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "reg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ren": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 74.9807 74.9807 32 128 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "res": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ret": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9965", + "y1": "111.997", + "x2": "53.9965", + "y2": "73.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rib": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "8.74228e-08", + "y1": "64", + "x2": "128", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ric": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 74.9807 53.0193 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rig": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ril": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.693 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rip": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ris": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "riv": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "roc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "16", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "16", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C90.5097 16 112 37.4903 112 64C112 90.5097 90.5097 112 64 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ron": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 70.6924 70.6925 128 0 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ros": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rov": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ruc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9964", + "x2": "112.003", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rum": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "run": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rup": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rux": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 64C32 81.6731 46.3269 96 64 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 81.6731 81.6731 96 64 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryg": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-2.79795e-06 -3.55988e-06C70.6924 -4.40288e-06 128 57.3075 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0035", + "y1": "15.9965", + "x2": "48.0035", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rym": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C57.3075 128 -3.09007e-06 70.6925 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryp": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "rys": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 -7.62939e-06L64 -2.03434e-06C99.3462 1.05573e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ryx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128L128 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.701724 31.9914C25.6281 31.9914 49.4822 42.5913 66.8261 59.7565M-0.701723 63.9914C16.7916 63.9914 32.6456 71.0098 44.1982 82.3844M-0.701722 95.9914C7.955 95.9914 15.8089 99.4288 21.5694 105.013", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sam": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "san": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sap": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "8", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 0 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sav": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "seb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sed": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sef": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "seg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 110.327 46.3269 96 64 96C81.6731 96 96 110.327 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "8", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sen": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 110.327 81.6731 96 64 96C46.3269 96 32 110.327 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128L64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128L32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128L96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ser": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "set": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 64L128 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sib": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 9.40976e-06C64 35.3462 92.6538 64 128 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C110.327 128 96 113.673 96 96C96 78.3269 110.327 64 128 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sig": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sil": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "16.0036", + "y1": "15.9965", + "x2": "48.0036", + "y2": "47.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sim": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sip": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 64C16 37.4903 37.4903 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "siv": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "soc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "16", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sog": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C81.6731 96 96 81.6731 96 64C96 46.3269 81.6731 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L-5.96046e-08 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "som": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "son": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "127.553", + "y1": "128.224", + "x2": "63.5528", + "y2": "0.223598", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sop": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0C128 35.3511 113.669 67.3551 90.5 90.5193", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0C96 26.5077 85.2564 50.5061 67.8862 67.8783", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0C64 17.6721 56.8374 33.6713 45.2568 45.2529", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32.3716 0C32.3716 8.83603 28.7903 16.8356 23 22.6264", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sov": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128L128 0", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C92.6489 128 60.6449 113.669 37.4807 90.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C101.492 96 77.4939 85.2564 60.1217 67.8862", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C110.328 64 94.3287 56.8374 82.7471 45.2568", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32.3716C119.164 32.3716 111.164 28.7903 105.374 23", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sub": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sug": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C46.3269 96 32 81.6731 32 64C32 46.3269 46.3269 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sum": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sun": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sup": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 112C90.5097 112 112 90.5097 112 64C112 37.4903 90.5097 16 64 16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sur": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M3.73284e-05 64.0001C17.6633 64.0001 33.6554 56.8446 45.2356 45.2742", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0.000105172 128C35.3582 128 67.3679 113.664 90.5332 90.4863", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sut": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 16C37.4903 16 16 37.4903 16 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "sym": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96.5", + "y1": "3.07317e-08", + "x2": "96.5", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0C35.3511 0 67.3551 14.3309 90.5193 37.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 32C26.5077 32 50.5061 42.7436 67.8783 60.1138", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 64C17.6721 64 33.6713 71.1626 45.2529 82.7432", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 95.6284C8.83603 95.6284 16.8356 99.2097 22.6264 105", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syp": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "syx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 128C4.63574e-06 92.6488 14.3309 60.6449 37.5 37.4807", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 101.492 42.7436 77.4939 60.1138 60.1216", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 110.328 71.1626 94.3287 82.7432 82.7471", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M95.6284 128C95.6284 119.164 99.2097 111.164 105 105.374", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tab": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "8", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tad": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tag": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9964", + "x2": "112.004", + "y2": "111.996", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "0.5", + "y1": "-0.5", + "x2": "181.5", + "y2": "-0.5", + "transform": "matrix(-0.707107 0.707107 0.707107 0.707107 128.71 0)", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 74.9807 53.0193 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tam": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96", + "x2": "-8.87604e-09", + "y2": "96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "32", + "x2": "-8.87604e-09", + "y2": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 128C96 74.9807 53.0193 32 0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 128C64 92.6538 35.3462 64 0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M48 128C48 101.49 26.5097 80 0 80", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 128C32 110.327 17.6731 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 128C16 119.163 8.83656 112 0 112", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3075 70.6925 0 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tap": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-8.87604e-09", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 32C81.6731 32 96 46.3269 96 64C96 81.6731 81.6731 96 64 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tar": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tas": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 32C81.6731 32 96 46.3269 96 64C96 81.6731 81.6731 96 64 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "teb": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tec": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ted": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "teg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 80C119.163 80 112 72.8366 112 64C112 55.1634 119.163 48 128 48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "15", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "15", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0L127.986 127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L128 96", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L128 64", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 0L128 32", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tem": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.00285417", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ten": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "48", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "80", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "48", + "cy": "80", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.14479e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ter": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96.5", + "y1": "3.07317e-08", + "x2": "96.5", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tev": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9965", + "y1": "111.997", + "x2": "47.9965", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C110.327 32 96 17.6731 96 -1.39876e-06", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M112 32C112 40.8366 104.837 48 96 48C87.1634 48 80 40.8366 80 32C80 23.1634 87.1634 16 96 16C104.837 16 112 23.1634 112 32ZM96 40C100.418 40 104 36.4183 104 32C104 27.5817 100.418 24 96 24C91.5817 24 88 27.5817 88 32C88 36.4183 91.5817 40 96 40Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "til": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0036", + "y1": "79.9965", + "x2": "112.004", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tim": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00291443 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tin": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tip": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 0L64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tir": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tob": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "toc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "96", + "x2": "-8.87604e-09", + "y2": "96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tod": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tog": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C46.3269 96 32 81.6731 32 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "128", + "y1": "64", + "x2": "-4.37114e-08", + "y2": "64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M16 128C16 101.49 37.4903 80 64 80C90.5097 80 112 101.49 112 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tom": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "ton": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C74.9807 32 32 74.9807 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 110.327 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "top": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "16", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tuc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96L0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tud": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tug": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tul": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tun": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 64V128H0L2.79753e-06 64C4.34256e-06 28.6538 28.6538 -1.54503e-06 64 0C99.3462 1.54503e-06 128 28.6538 128 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tus": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tux": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00280762 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.6499)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "15.9964", + "y1": "111.997", + "x2": "47.9964", + "y2": "79.9965", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M7.37542e-06 -3.56072e-06C1.19529e-06 70.6924 57.3075 128 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 -2.28831e-06C57.3076 -3.13131e-06 8.42999e-07 57.3075 0 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "typ": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M96 1.90735e-06C96 53.0193 53.0193 96 0 96", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyr": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0L128 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 64C35.3462 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "tyv": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M256 0L128 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wac": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "11.5", + "fill": "@BG", + "stroke": "@BG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "112", + "r": "9", + "fill": "@FG", + "stroke": "@FG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wal": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64.5", + "y1": "-0.5", + "x2": "64.5", + "y2": "127.5", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wan": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wat": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "web": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3075 70.6925 0 0 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wed": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "weg": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M79.5254 0C79.5254 8.83656 72.3619 16 63.5254 16C54.6888 16 47.5254 8.83656 47.5254 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wel": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32C74.9807 32 32 74.9807 32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64C92.6538 64 64 92.6538 64 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 110.327 96 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wen": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wep": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wer": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 64L5.59506e-06 0L128 1.11901e-05V64C128 99.3462 99.3462 128 64 128C28.6538 128 -4.6351e-06 99.3462 0 64Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 0L32 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wes": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "80.0035", + "y1": "79.9965", + "x2": "112.003", + "y2": "111.997", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "112", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "112", + "cy": "112", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wet": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 64H0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wex": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wic": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 0C57.3075 8.42999e-07 -8.42999e-07 57.3075 0 128H128V0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wid": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "48.0035", + "y1": "80.0036", + "x2": "16.0035", + "y2": "112.004", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "fill-rule": "evenodd", + "clip-rule": "evenodd", + "d": "M80 64C80 72.8366 72.8366 80 64 80C55.1634 80 48 72.8366 48 64C48 55.1634 55.1634 48 64 48C72.8366 48 80 55.1634 80 64ZM64 72C68.4183 72 72 68.4183 72 64C72 59.5817 68.4183 56 64 56C59.5817 56 56 59.5817 56 64C56 68.4183 59.5817 72 64 72Z", + "fill": "@BG" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "win": { + "children": [ + { + "name": "rect", + "attributes": { + "width": "128", + "height": "128", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wis": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 0C0 70.6925 57.3075 128 128 128V0H0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 64L0 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 32L0 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wit": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0 127.946C0.0292286 57.2783 57.3256 3.08928e-06 128 0C128 70.6823 70.7089 127.984 0.0305092 128C0.0203397 128 0.01017 128 2.36469e-09 128L0 127.946Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "64", + "y1": "2.18557e-08", + "x2": "64", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "32", + "y1": "2.18557e-08", + "x2": "32", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "96", + "y1": "2.18557e-08", + "x2": "96", + "y2": "128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wol": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M0 64L128 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 96C110.327 96 96 81.6731 96 64C96 46.3269 110.327 32 128 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wor": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 0H128V128H64C28.6538 128 0 99.3462 0 64C0 28.6538 28.6538 0 64 0Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "y1": "-0.5", + "x2": "45.2548", + "y2": "-0.5", + "transform": "matrix(0.707107 -0.707107 -0.707107 -0.707107 79.65 47.65)", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "line", + "attributes": { + "x1": "-0.0029152", + "x2": "127.983", + "y2": "127.986", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M64 96C46.3269 96 32 81.6731 32 64", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyc": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyd": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M0.0541 0C70.7217 0.0292317 128 57.3256 128 128C57.3177 128 0.0164917 70.7089 7.62806e-06 0.0305091C7.62851e-06 0.0203397 -4.44317e-10 0.01017 0 0H0.0541Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M32 64C32 46.3269 46.3269 32 64 32", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyl": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M128 128C128 57.3076 70.6925 6.18013e-06 1.11901e-05 0L0 128L128 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-3.8147e-06 128C-7.24633e-07 92.6538 28.6538 64 64 64C99.3462 64 128 92.6538 128 128", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyn": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.52575e-06 96C53.0193 96 96 53.0193 96 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M1.01717e-06 64C35.3462 64 64 35.3462 64 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M5.08584e-07 32C17.6731 32 32 17.6731 32 0", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyt": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M64 128H0L5.59506e-06 0L64 5.59506e-06C99.3462 8.68512e-06 128 28.6538 128 64C128 99.3462 99.3462 128 64 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M128 0L0 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "48", + "stroke": "@BG", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "16", + "cy": "64", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "wyx": { + "children": [ + { + "name": "path", + "attributes": { + "d": "M5.59506e-06 128C70.6925 128 128 70.6925 128 0L0 5.59506e-06L5.59506e-06 128Z", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + }, + { + "name": "path", + "attributes": { + "d": "M-0.00292969 0L127.997 128", + "stroke": "@BG", + "stroke-linecap": "square", + "fill": "none" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "96", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "32", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "11.5", + "fill": "@FG", + "stroke": "@FG" + }, + "children": [] + }, + { + "name": "circle", + "attributes": { + "cx": "96", + "cy": "32", + "r": "9", + "fill": "@BG", + "stroke": "@BG", + "stroke-width": "2" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + }, + "zod": { + "children": [ + { + "name": "circle", + "attributes": { + "cx": "64", + "cy": "64", + "r": "64", + "fill": "@FG", + "stroke": "@BG", + "stroke-width": "0.5", + "dataisgeon": "true" + }, + "children": [] + } + ], + "name": "g", + "attributes": { + "fill": "none" + } + } +} diff --git a/site/src/ui/sigil-ts/index.ts b/site/src/ui/sigil-ts/index.ts new file mode 100644 index 0000000..a9b5ac5 --- /dev/null +++ b/site/src/ui/sigil-ts/index.ts @@ -0,0 +1,296 @@ +import { scale, translate, transform, toString } from 'transformation-matrix'; +import invariant from 'invariant'; + +import stringRenderer from './stringRenderer'; +import reactRenderer from './reactRenderer'; +import reactImageRenderer from './reactImageRenderer'; +import { Ast, Config } from './types'; +import { deepClone, chunkStr, isUndefined } from './lib'; +import index from './index.json'; + +const FG = 1; +const BG = 0; + +const COLOR_CODES = { + FG: '@FG', + BG: '@BG', +}; + +const UNIT_GRIDS = { + 4: [ + { x: 0, y: 0 }, + { x: 128, y: 0 }, + { x: 0, y: 128 }, + { x: 128, y: 128 }, + ], + 2: [ + { x: 0, y: 0 }, + { x: 128, y: 0 }, + ], + 1: [{ x: 0, y: 0 }], +}; + +const TILEMAP = { + 4: { x: 2, y: 2 }, + 2: { x: 2, y: 1 }, + 1: { x: 1, y: 1 }, +}; + +// class ConfigError extends Error {} + +// apply color preference +const paint = (node: Ast, colors: [string, string], strokeWidth: number): Ast => { + const fillIndex = node.attributes.fill === COLOR_CODES.FG ? FG : BG; + const strokeIndex = node.attributes.stroke === COLOR_CODES.FG ? FG : BG; + + if (node.attributes.fill !== undefined && node.attributes.fill !== 'none') { + node.attributes.fill = colors[fillIndex]; + } + + if (node.attributes.stroke !== undefined && node.attributes.stroke !== 'none') { + node.attributes.stroke = colors[strokeIndex]; + node.attributes['stroke-width'] = strokeWidth + 'px'; + node.attributes['stroke-linecap'] = 'square'; + // non-scaling-stroke is used to prevent the stroke from scaling when a scaling transformation is applied by sigil() + node.attributes['vector-effect'] = 'non-scaling-stroke'; + } + + return { + ...node, + ...{ + name: node.name, + attributes: node.attributes, + children: node.children.map((n) => paint(n, colors, strokeWidth)), + }, + }; +}; + +const sigil = (props: Config) => { + props = { ...props }; + + // Set default values from config + if (typeof props.colors === 'undefined') { + props.colors = ['#000', '#fff']; + } + + if (typeof props.attributes === 'undefined') { + props.attributes = {}; + } + + if (typeof props.style === 'undefined') { + props.style = {}; + } + + if (typeof props.class === 'undefined') { + props.class = ''; + } + + // if props.size is defined, set width and height + if (!(typeof props.size === 'undefined')) { + props.width = props.size; + props.height = props.size; + } + + // if width and height are undefined, set default size + if (typeof props.width === 'undefined' || typeof props.height === 'undefined') { + props.width = 128; + props.height = 128; + } + + if (typeof props.margin === 'undefined') { + props.margin = true; + } + + if (props.icon === true) { + props.margin = false; + } + + // get phonemes as array from patp input and split into array + let phonemes = chunkStr(props.patp.replace(/[\^~-]/g, ''), 3); + + invariant(Array.isArray(phonemes), `Invalid patp argument`); + + // Throw an error if the phoneme length is not a 32, 16 or 8 bit point. + const phonemeLengthDidPass = + phonemes.length === 1 || phonemes.length === 2 || phonemes.length === 4; + + invariant( + phonemeLengthDidPass, + `@tlon/sigil-js cannot render @p of length ${phonemes.length}. Only lengths of 1 (galaxy), 2 (star), and 4 (planet) are supported at this time.`, + ); + + // get symbols and clone them. If no symbol is found, the @p prop was invalid. + let patpDidPass; + + let symbols = phonemes.map((phoneme) => { + // @ts-ignore + const ast = index[phoneme]; + if (isUndefined(ast)) { + patpDidPass = false; + return {}; + } else { + patpDidPass = true; + return deepClone(ast); + } + }); + + invariant( + patpDidPass, + `@tlon/sigil-js needs a valid patp (point name). Patp field is invalid. Recieved ${props.patp}`, + ); + + if (props.icon === true) { + symbols = symbols.map((s: Ast) => { + return { + ...s, + children: s.children.filter((c: Ast) => c.attributes['dataisgeon']), + }; + }); + } + + const tier = symbols.length === 4 ? 4 : symbols.length === 2 ? 2 : 1; + + // get a grid according to the point's tier (planet, start, galaxy) + const grid = UNIT_GRIDS[tier]; + + // Move each symbol into it's new x/y position on a unit rectangle sized 256 by 256. + for (let i = 0; i < grid.length; i++) { + const positionTransform = toString(translate(grid[i].x, grid[i].y)); + if (symbols[i].attributes === undefined) { + symbols[i].attributes = {}; + } + symbols[i].attributes.transform = positionTransform; + } + + // Create a variable that will store a ratio used to scale the symbolsGroup to its final size driven primarily by props.size, or props.width fallback. + let resizeRatio; + + if (tier === 1) { + // If there is only 1 symbol being drawn + if (props.margin === true) { + // If this symbol will be drawn with a margin + resizeRatio = 0.5 * 0.8; + } else { + // If this symbol will be drawn without a margin + resizeRatio = 1; + } + } else { + // If the sigils is 2 symbols wide + if (props.margin === true) { + // If this symbol will be drawn with a margin + resizeRatio = 0.5 * 0.8; + } else { + // If this symbol will be drawn without a margin + resizeRatio = 0.5; + } + } + + // Calculate the size of each symbol - IE, for planets, there are four symbols. + const symbolSize = { + x: props.width * resizeRatio, + y: props.height * resizeRatio, + }; + + // Calculate the left and top margins that will be used to transform the symbolsGroup. + const marginPx = { + x: (props.width - TILEMAP[tier].x * symbolSize.x) / 2, + y: (props.height - TILEMAP[tier].y * symbolSize.y) / 2, + }; + + if (props.margin === false || props.icon === true) { + marginPx.x = 0; + if (props.icon !== true) { + marginPx.y = 0; + } + } + + // Calculate how much the symbolsGroups should change in scale. 128 is the unit size of the SVGs as drawn in their source file. + const symbolsGroupScale = symbolSize.x / 128; + + // First translate the symbols group to a centered x/y position, then scale the group to it's final size. + const scaleAndCenteringTransform = toString( + transform( + translate(marginPx.x, marginPx.y), + scale(symbolsGroupScale, symbolsGroupScale), + ), + ); + + // Create a SVG AST group and assign the transformation and child symbols to it. + const symbolsGroup = { + name: 'g', + type: '', + value: '', + attributes: { + transform: scaleAndCenteringTransform, + }, + children: symbols, + }; + + if (props.style === undefined) { + props.style = {}; + } + + if (props.style.width === undefined) { + props.style.width = `${props.width}px`; + } + + if (props.style.height === undefined) { + props.style.height = `${props.height}px`; + } + + const wrapped = { + name: 'svg', + type: '', + value: '', + attributes: { + style: { + // prevent bottom margin on svg tag + display: 'block', + ...props.style, + }, + viewBox: `0 0 ${props.width} ${props.height}`, + version: '1.1', + xmlns: 'http://www.w3.org/2000/svg', + class: props.class, + ...props.attributes, + }, + children: [ + // Background rectangle + { + name: 'rect', + type: '', + value: '', + attributes: { + fill: COLOR_CODES.BG, + width: `${props.width}px`, + height: `${props.height}px`, + x: 0 + 'px', + y: 0 + 'px', + }, + children: [], + }, + symbolsGroup, + ], + }; + + // Calculate a strokeWidth based on props.size + let strokeWidth; + + if (props.strokeScalingFunction) { + strokeWidth = props.strokeScalingFunction(props.size); + } else { + strokeWidth = props.width / 128 + 0.33; + } + + if (props.icon === true) { + strokeWidth = 0.8; + } + + // Recursively apply color and other style attributes. + const out = paint(wrapped, props.colors, strokeWidth); + + // If a renderer function has been provided, call this renderer with provided AST. If there is no renderer, return the AST. + return props.renderer === undefined ? out : props.renderer(out); +}; + +export { sigil, stringRenderer, reactRenderer, reactImageRenderer }; diff --git a/site/src/ui/sigil-ts/lib.ts b/site/src/ui/sigil-ts/lib.ts new file mode 100644 index 0000000..b27775b --- /dev/null +++ b/site/src/ui/sigil-ts/lib.ts @@ -0,0 +1,17 @@ +const deepClone = (v: any) => JSON.parse(JSON.stringify(v)); + +const chunkStr = (str: string, size: number) => { + const r = new RegExp(`.{1,${size}}`, 'g'); + return str.match(r); +}; + +const compose = (...fns: Array) => { + return fns.reduce((f, g) => (...xs: any) => { + const r = g(...xs); + return Array.isArray(r) ? f(...r) : f(r); + }); +}; + +const isUndefined = (v: any) => typeof v === 'undefined'; + +export { deepClone, chunkStr, compose, isUndefined }; diff --git a/site/src/ui/sigil-ts/reactImageRenderer.ts b/site/src/ui/sigil-ts/reactImageRenderer.ts new file mode 100644 index 0000000..f67025d --- /dev/null +++ b/site/src/ui/sigil-ts/reactImageRenderer.ts @@ -0,0 +1,24 @@ +import React from 'react'; +import stringRenderer from './stringRenderer'; +import { Ast } from './types'; + +const reactImageRenderer = (node: Ast) => { + let w; + let h; + + if (node.attributes.style) { + w = node.attributes.style.width || ''; + h = node.attributes.style.height || ''; + } + + return React.createElement('div', { + style: { + backgroundRepeat: 'no-repeat', + width: w, + height: h, + backgroundImage: `url(data:image/svg+xml;base64,${btoa(stringRenderer(node))})`, + }, + }); +}; + +export default reactImageRenderer; diff --git a/site/src/ui/sigil-ts/reactRenderer.ts b/site/src/ui/sigil-ts/reactRenderer.ts new file mode 100644 index 0000000..01b57c5 --- /dev/null +++ b/site/src/ui/sigil-ts/reactRenderer.ts @@ -0,0 +1,21 @@ +import * as React from 'react'; +import { Ast } from './types'; + +const toCamelCase = (s: string) => s.replace(/-([a-z])/g, (g) => g[1].toUpperCase()); + +const attributesToProps = (o: {}) => + Object.entries(o).reduce((a, [k, v]) => { + if (k === 'class') k = 'className'; + return { ...a, [`${toCamelCase(k)}`]: v }; + }, {}); + +const reactRenderer = (node: Ast, i: string): JSX.Element => { + if (i === undefined) i = ''; + return React.createElement( + node.name, + { ...attributesToProps(node.attributes), key: `${i}` }, + node.children.map((child, j) => reactRenderer(child, `${i}:${j}`)), + ); +}; + +export default reactRenderer; diff --git a/site/src/ui/sigil-ts/stringRenderer.ts b/site/src/ui/sigil-ts/stringRenderer.ts new file mode 100644 index 0000000..c70a0de --- /dev/null +++ b/site/src/ui/sigil-ts/stringRenderer.ts @@ -0,0 +1,10 @@ +// @ts-ignore +import { stringify } from 'svgson'; +import { Ast } from './types'; + +const stringRenderer = (ast: Ast) => { + if (ast.attributes.style !== undefined) delete ast.attributes.style; + return stringify(ast as any); +}; + +export default stringRenderer; diff --git a/site/src/ui/sigil-ts/types.ts b/site/src/ui/sigil-ts/types.ts new file mode 100644 index 0000000..06f0b57 --- /dev/null +++ b/site/src/ui/sigil-ts/types.ts @@ -0,0 +1,54 @@ +export type Attributes = { + style?: { + [key: string]: string; + }; + version?: string; + class?: string; + width?: string; + height?: string; + viewBox?: string; + fill?: string; + xmlns?: string; + id?: string; + 'clip-path'?: string; + d?: string; + stroke?: string; + 'stroke-width'?: string; + x1?: string; + x2?: string; + y2?: string; + 'stroke-linecap'?: string; + cx?: string; + cy?: string; + r?: string; + x?: string; + y?: string; + transform?: string; + 'vector-effect'?: string; + dataisgeon?: string; +}; + +export type Ast = { + name: string; + type: string; + value: string; + attributes: Attributes; + children: Ast[]; +}; + +export type Config = { + patp: string; + colors?: [string, string]; + attributes?: Attributes; + style?: { + [key: string]: string; + }; + class?: string; + size?: number; + width?: number; + height?: number; + margin?: boolean; + strokeScalingFunction?: Function; + renderer?: Function; + icon?: boolean; +}; diff --git a/site/src/ui/theme.tsx b/site/src/ui/theme.tsx new file mode 100644 index 0000000..9c76184 --- /dev/null +++ b/site/src/ui/theme.tsx @@ -0,0 +1,52 @@ +import Box from "@mui/material/Box"; +import { DarkMode, LightMode } from "@mui/icons-material"; +import { IconButton, IconButtonProps } from "@mui/material"; + +import { useColorScheme } from "@mui/material/styles"; +export function ThemeToggle() { + const { mode, systemMode, setMode } = useColorScheme(); + const handleClick = (event: React.MouseEvent) => { + const nmode = mode === "dark" ? "light" : "dark"; + setMode(nmode); + }; + if (!mode) { + return ( + ({ + verticalAlign: "bottom", + display: "inline-flex", + width: "2.25rem", + height: "2.25rem", + borderRadius: (theme.vars || theme).shape.borderRadius, + border: "1px solid", + borderColor: (theme.vars || theme).palette.divider, + })} + /> + ); + } + const resolvedMode = (systemMode || mode) as "light" | "dark"; + const icon = { + light: , + dark: , + }[resolvedMode]; + return ( + + {icon} + + ); +} + +export const scrollableStyle = { + overflowY: "auto", + overflowX: "hidden", + scrollbarWidth: "none", + "&::-webkit-scrollbar": { + display: "none", + }, +}; diff --git a/site/src/ui/theme/AppTheme.tsx b/site/src/ui/theme/AppTheme.tsx new file mode 100644 index 0000000..caa3c70 --- /dev/null +++ b/site/src/ui/theme/AppTheme.tsx @@ -0,0 +1,57 @@ +import * as React from 'react'; +import { ThemeProvider, createTheme, responsiveFontSizes } from '@mui/material/styles'; +import type { ThemeOptions } from '@mui/material/styles'; +import { inputsCustomizations } from './customizations/inputs'; +import { dataDisplayCustomizations } from './customizations/dataDisplay'; +import { feedbackCustomizations } from './customizations/feedback'; +import { navigationCustomizations } from './customizations/navigation'; +import { surfacesCustomizations } from './customizations/surfaces'; +import { colorSchemes, typography, shadows, shape } from './themePrimitives'; + +interface AppThemeProps { + children: React.ReactNode; + /** + * This is for the docs site. You can ignore it or remove it. + */ + disableCustomTheme?: boolean; + themeComponents?: ThemeOptions['components']; +} + +export default function AppTheme({ + children, + disableCustomTheme, + themeComponents, +}: AppThemeProps) { + // Mmm hope this works + let t1 = createTheme({ + // For more details about CSS variables configuration, see https://mui.com/material-ui/customization/css-theme-variables/configuration/ + cssVariables: { + colorSchemeSelector: 'data-mui-color-scheme', + cssVarPrefix: 'template', + }, + colorSchemes, // Recently added in v6 for building light & dark mode app, see https://mui.com/material-ui/customization/palette/#color-schemes + typography, + shadows, + shape, + components: { + ...inputsCustomizations, + ...dataDisplayCustomizations, + ...feedbackCustomizations, + ...navigationCustomizations, + ...surfacesCustomizations, + ...themeComponents, + }, + }); + t1 = responsiveFontSizes(t1, {}); + const theme = React.useMemo(() => { + return disableCustomTheme ? {} : t1; + }, [disableCustomTheme, themeComponents]); + if (disableCustomTheme) { + return {children}; + } + return ( + + {children} + + ); +} diff --git a/site/src/ui/theme/ColorModeIconDropdown.tsx b/site/src/ui/theme/ColorModeIconDropdown.tsx new file mode 100644 index 0000000..db0f9c4 --- /dev/null +++ b/site/src/ui/theme/ColorModeIconDropdown.tsx @@ -0,0 +1,87 @@ +import * as React from "react"; +import DarkModeIcon from "@mui/icons-material/DarkModeOutlined"; +import LightModeIcon from "@mui/icons-material/LightModeOutlined"; +import Box from "@mui/material/Box"; +import IconButton from "@mui/material/IconButton"; +import Menu from "@mui/material/Menu"; +import MenuItem from "@mui/material/MenuItem"; +import { useColorScheme } from "@mui/material/styles"; + +export default function ColorModeIconDropdown() { + const { mode, systemMode, setMode } = useColorScheme(); + const [anchorEl, setAnchorEl] = React.useState(null); + const open = Boolean(anchorEl); + const handleClick = (event: React.MouseEvent) => { + setAnchorEl(event.currentTarget); + }; + const handleClose = () => { + setAnchorEl(null); + }; + const handleMode = (targetMode: "system" | "light" | "dark") => () => { + setMode(targetMode); + handleClose(); + }; + if (!mode) { + return ( + ({ + verticalAlign: "bottom", + display: "inline-flex", + width: "2.25rem", + height: "2.25rem", + borderRadius: (theme.cssVariables || theme).shape.borderRadius, + border: "1px solid", + borderColor: (theme.cssVariables || theme).palette.divider, + })} + /> + ); + } + const resolvedMode = (systemMode || mode) as "light" | "dark"; + const icon = { + light: , + dark: , + }[resolvedMode]; + return ( + + + {icon} + + + + System + + + Light + + + Dark + + + + ); +} diff --git a/site/src/ui/theme/ColorModeSelect.tsx b/site/src/ui/theme/ColorModeSelect.tsx new file mode 100644 index 0000000..4bb20df --- /dev/null +++ b/site/src/ui/theme/ColorModeSelect.tsx @@ -0,0 +1,26 @@ +import * as React from 'react'; +import { useColorScheme } from '@mui/material/styles'; +import MenuItem from '@mui/material/MenuItem'; +import Select, { SelectProps } from '@mui/material/Select'; + +export default function ColorModeSelect(props: SelectProps) { + const { mode, setMode } = useColorScheme(); + if (!mode) { + return null; + } + return ( + + ); +} diff --git a/site/src/ui/theme/customizations/dataDisplay.tsx b/site/src/ui/theme/customizations/dataDisplay.tsx new file mode 100644 index 0000000..3534d55 --- /dev/null +++ b/site/src/ui/theme/customizations/dataDisplay.tsx @@ -0,0 +1,233 @@ +import { Theme, alpha, Components } from "@mui/material/styles"; +import { svgIconClasses } from "@mui/material/SvgIcon"; +import { typographyClasses } from "@mui/material/Typography"; +import { buttonBaseClasses } from "@mui/material/ButtonBase"; +import { chipClasses } from "@mui/material/Chip"; +import { iconButtonClasses } from "@mui/material/IconButton"; +import { gray, red, green } from "../themePrimitives"; + +/* eslint-disable import/prefer-default-export */ +export const dataDisplayCustomizations: Components = { + MuiList: { + styleOverrides: { + root: { + padding: "8px", + display: "flex", + flexDirection: "column", + gap: 0, + }, + }, + }, + MuiListItem: { + styleOverrides: { + root: ({ theme }) => ({ + [`& .${svgIconClasses.root}`]: { + width: "1rem", + height: "1rem", + color: (theme.cssVariables || theme).palette.text.secondary, + }, + [`& .${typographyClasses.root}`]: { + fontWeight: 500, + }, + [`& .${buttonBaseClasses.root}`]: { + display: "flex", + gap: 8, + padding: "2px 8px", + borderRadius: (theme.cssVariables || theme).shape.borderRadius, + opacity: 0.7, + "&.Mui-selected": { + opacity: 1, + backgroundColor: alpha(theme.palette.action.selected, 0.3), + [`& .${svgIconClasses.root}`]: { + color: (theme.cssVariables || theme).palette.text.primary, + }, + "&:focus-visible": { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + "&:hover": { + backgroundColor: alpha(theme.palette.action.selected, 0.5), + }, + }, + "&:focus-visible": { + backgroundColor: "transparent", + }, + }, + }), + }, + }, + MuiListItemText: { + styleOverrides: { + primary: ({ theme }) => ({ + fontSize: theme.typography.body2.fontSize, + fontWeight: 500, + lineHeight: theme.typography.body2.lineHeight, + }), + secondary: ({ theme }) => ({ + fontSize: theme.typography.caption.fontSize, + lineHeight: theme.typography.caption.lineHeight, + }), + }, + }, + MuiListSubheader: { + styleOverrides: { + root: ({ theme }) => ({ + backgroundColor: "transparent", + padding: "4px 8px", + fontSize: theme.typography.caption.fontSize, + fontWeight: 500, + lineHeight: theme.typography.caption.lineHeight, + }), + }, + }, + MuiListItemIcon: { + styleOverrides: { + root: { + minWidth: 0, + }, + }, + }, + MuiChip: { + defaultProps: { + size: "small", + }, + styleOverrides: { + root: ({ theme }) => ({ + border: "1px solid", + borderRadius: "999px", + [`& .${chipClasses.label}`]: { + fontWeight: 600, + }, + variants: [ + { + props: { + color: "default", + }, + style: { + borderColor: gray[200], + backgroundColor: gray[100], + [`& .${chipClasses.label}`]: { + color: gray[500], + }, + [`& .${chipClasses.icon}`]: { + color: gray[500], + }, + ...theme.applyStyles("dark", { + borderColor: gray[700], + backgroundColor: gray[800], + [`& .${chipClasses.label}`]: { + color: gray[300], + }, + [`& .${chipClasses.icon}`]: { + color: gray[300], + }, + }), + }, + }, + { + props: { + color: "success", + }, + style: { + borderColor: green[200], + backgroundColor: green[50], + [`& .${chipClasses.label}`]: { + color: green[500], + }, + [`& .${chipClasses.icon}`]: { + color: green[500], + }, + ...theme.applyStyles("dark", { + borderColor: green[800], + backgroundColor: green[900], + [`& .${chipClasses.label}`]: { + color: green[300], + }, + [`& .${chipClasses.icon}`]: { + color: green[300], + }, + }), + }, + }, + { + props: { + color: "error", + }, + style: { + borderColor: red[100], + backgroundColor: red[50], + [`& .${chipClasses.label}`]: { + color: red[500], + }, + [`& .${chipClasses.icon}`]: { + color: red[500], + }, + ...theme.applyStyles("dark", { + borderColor: red[800], + backgroundColor: red[900], + [`& .${chipClasses.label}`]: { + color: red[200], + }, + [`& .${chipClasses.icon}`]: { + color: red[300], + }, + }), + }, + }, + { + props: { size: "small" }, + style: { + maxHeight: 20, + [`& .${chipClasses.label}`]: { + fontSize: theme.typography.caption.fontSize, + }, + [`& .${svgIconClasses.root}`]: { + fontSize: theme.typography.caption.fontSize, + }, + }, + }, + { + props: { size: "medium" }, + style: { + [`& .${chipClasses.label}`]: { + fontSize: theme.typography.caption.fontSize, + }, + }, + }, + ], + }), + }, + }, + MuiTablePagination: { + styleOverrides: { + actions: { + display: "flex", + gap: 8, + marginRight: 6, + [`& .${iconButtonClasses.root}`]: { + minWidth: 0, + width: 36, + height: 36, + }, + }, + }, + }, + MuiIcon: { + defaultProps: { + fontSize: "small", + }, + styleOverrides: { + root: { + variants: [ + { + props: { + fontSize: "small", + }, + style: { + fontSize: "1rem", + }, + }, + ], + }, + }, + }, +}; diff --git a/site/src/ui/theme/customizations/feedback.tsx b/site/src/ui/theme/customizations/feedback.tsx new file mode 100644 index 0000000..4548b4a --- /dev/null +++ b/site/src/ui/theme/customizations/feedback.tsx @@ -0,0 +1,46 @@ +import { Theme, alpha, Components } from "@mui/material/styles"; +import { gray, orange } from "../themePrimitives"; + +/* eslint-disable import/prefer-default-export */ +export const feedbackCustomizations: Components = { + MuiAlert: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: 10, + backgroundColor: orange[100], + color: (theme.cssVariables || theme).palette.text.primary, + border: `1px solid ${alpha(orange[300], 0.5)}`, + "& .MuiAlert-icon": { + color: orange[500], + }, + ...theme.applyStyles("dark", { + backgroundColor: `${alpha(orange[900], 0.5)}`, + border: `1px solid ${alpha(orange[800], 0.5)}`, + }), + }), + }, + }, + MuiDialog: { + styleOverrides: { + root: ({ theme }) => ({ + "& .MuiDialog-paper": { + borderRadius: "10px", + border: "1px solid", + borderColor: (theme.cssVariables || theme).palette.divider, + }, + }), + }, + }, + MuiLinearProgress: { + styleOverrides: { + root: ({ theme }) => ({ + height: 8, + borderRadius: 8, + backgroundColor: gray[200], + ...theme.applyStyles("dark", { + backgroundColor: gray[800], + }), + }), + }, + }, +}; diff --git a/site/src/ui/theme/customizations/inputs.tsx b/site/src/ui/theme/customizations/inputs.tsx new file mode 100644 index 0000000..f301695 --- /dev/null +++ b/site/src/ui/theme/customizations/inputs.tsx @@ -0,0 +1,449 @@ +import * as React from "react"; +import { alpha, Theme, Components } from "@mui/material/styles"; +import { outlinedInputClasses } from "@mui/material/OutlinedInput"; +import { svgIconClasses } from "@mui/material/SvgIcon"; +import { toggleButtonGroupClasses } from "@mui/material/ToggleButtonGroup"; +import { toggleButtonClasses } from "@mui/material/ToggleButton"; +import CheckBoxOutlineBlankRoundedIcon from "@mui/icons-material/CheckBoxOutlineBlankRounded"; +import CheckRoundedIcon from "@mui/icons-material/CheckRounded"; +import RemoveRoundedIcon from "@mui/icons-material/RemoveRounded"; +import { gray, brand } from "../themePrimitives"; + +/* eslint-disable import/prefer-default-export */ +export const inputsCustomizations: Components = { + MuiButtonBase: { + defaultProps: { + disableTouchRipple: true, + disableRipple: true, + }, + styleOverrides: { + root: ({ theme }) => ({ + boxSizing: "border-box", + transition: "all 100ms ease-in", + "&:focus-visible": { + outline: `3px solid ${alpha(theme.palette.primary.main, 0.5)}`, + outlineOffset: "2px", + }, + }), + }, + }, + MuiButton: { + styleOverrides: { + root: ({ theme }) => ({ + boxShadow: "none", + // borderRadius: (theme.cssVariables || theme).shape.borderRadius, + borderRadius: "none", + textTransform: "none", + variants: [ + { + props: { + size: "small", + }, + style: { + height: "2.25rem", + padding: "8px 12px", + }, + }, + { + props: { + size: "medium", + }, + style: { + height: "2.5rem", // 40px + }, + }, + { + props: { + color: "primary", + variant: "contained", + }, + style: { + color: "white", + backgroundColor: gray[900], + backgroundImage: `linear-gradient(to bottom, ${gray[700]}, ${gray[800]})`, + boxShadow: `inset 0 1px 0 ${gray[600]}, inset 0 -1px 0 1px hsl(220, 0%, 0%)`, + border: `1px solid ${gray[700]}`, + "&:hover": { + backgroundImage: "none", + backgroundColor: gray[700], + boxShadow: "none", + }, + "&:active": { + backgroundColor: gray[800], + }, + ...theme.applyStyles("dark", { + color: "black", + backgroundColor: gray[50], + backgroundImage: `linear-gradient(to bottom, ${gray[100]}, ${gray[50]})`, + boxShadow: "inset 0 -1px 0 hsl(220, 30%, 80%)", + border: `1px solid ${gray[50]}`, + "&:hover": { + backgroundImage: "none", + backgroundColor: gray[300], + boxShadow: "none", + }, + "&:active": { + backgroundColor: gray[400], + }, + }), + }, + }, + { + props: { + color: "secondary", + variant: "contained", + }, + style: { + color: "white", + backgroundColor: brand[300], + backgroundImage: `linear-gradient(to bottom, ${alpha(brand[400], 0.8)}, ${brand[500]})`, + boxShadow: `inset 0 2px 0 ${alpha(brand[200], 0.2)}, inset 0 -2px 0 ${alpha(brand[700], 0.4)}`, + border: `1px solid ${brand[500]}`, + "&:hover": { + backgroundColor: brand[700], + boxShadow: "none", + }, + "&:active": { + backgroundColor: brand[700], + backgroundImage: "none", + }, + }, + }, + { + props: { + variant: "outlined", + }, + style: { + color: (theme.cssVariables || theme).palette.text.primary, + border: "1px solid", + borderColor: gray[200], + backgroundColor: alpha(gray[50], 0.3), + "&:hover": { + backgroundColor: gray[100], + borderColor: gray[300], + }, + "&:active": { + backgroundColor: gray[200], + }, + ...theme.applyStyles("dark", { + backgroundColor: gray[800], + borderColor: gray[700], + + "&:hover": { + backgroundColor: gray[900], + borderColor: gray[600], + }, + "&:active": { + backgroundColor: gray[900], + }, + }), + }, + }, + { + props: { + color: "secondary", + variant: "outlined", + }, + style: { + color: brand[700], + border: "1px solid", + borderColor: brand[200], + backgroundColor: brand[50], + "&:hover": { + backgroundColor: brand[100], + borderColor: brand[400], + }, + "&:active": { + backgroundColor: alpha(brand[200], 0.7), + }, + ...theme.applyStyles("dark", { + color: brand[50], + border: "1px solid", + borderColor: brand[900], + backgroundColor: alpha(brand[900], 0.3), + "&:hover": { + borderColor: brand[700], + backgroundColor: alpha(brand[900], 0.6), + }, + "&:active": { + backgroundColor: alpha(brand[900], 0.5), + }, + }), + }, + }, + { + props: { + variant: "text", + }, + style: { + color: gray[600], + "&:hover": { + backgroundColor: gray[100], + }, + "&:active": { + backgroundColor: gray[200], + }, + ...theme.applyStyles("dark", { + color: gray[50], + "&:hover": { + backgroundColor: gray[700], + }, + "&:active": { + backgroundColor: alpha(gray[700], 0.7), + }, + }), + }, + }, + { + props: { + color: "secondary", + variant: "text", + }, + style: { + color: brand[700], + "&:hover": { + backgroundColor: alpha(brand[100], 0.5), + }, + "&:active": { + backgroundColor: alpha(brand[200], 0.7), + }, + ...theme.applyStyles("dark", { + color: brand[100], + "&:hover": { + backgroundColor: alpha(brand[900], 0.5), + }, + "&:active": { + backgroundColor: alpha(brand[900], 0.3), + }, + }), + }, + }, + ], + }), + }, + }, + MuiIconButton: { + styleOverrides: { + root: ({ theme }) => ({ + boxShadow: "none", + borderRadius: (theme.cssVariables || theme).shape.borderRadius, + textTransform: "none", + fontWeight: theme.typography.fontWeightMedium, + letterSpacing: 0, + color: (theme.cssVariables || theme).palette.text.primary, + border: "1px solid ", + borderColor: gray[200], + backgroundColor: alpha(gray[50], 0.3), + "&:hover": { + backgroundColor: gray[100], + borderColor: gray[300], + }, + "&:active": { + backgroundColor: gray[200], + }, + ...theme.applyStyles("dark", { + backgroundColor: gray[800], + borderColor: gray[700], + "&:hover": { + backgroundColor: gray[900], + borderColor: gray[600], + }, + "&:active": { + backgroundColor: gray[900], + }, + }), + variants: [ + { + props: { + size: "small", + }, + style: { + width: "2.25rem", + height: "2.25rem", + padding: "0.25rem", + [`& .${svgIconClasses.root}`]: { fontSize: "1rem" }, + }, + }, + { + props: { + size: "medium", + }, + style: { + width: "2.5rem", + height: "2.5rem", + }, + }, + ], + }), + }, + }, + MuiToggleButtonGroup: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: "10px", + boxShadow: `0 4px 16px ${alpha(gray[400], 0.2)}`, + [`& .${toggleButtonGroupClasses.selected}`]: { + color: brand[500], + }, + ...theme.applyStyles("dark", { + [`& .${toggleButtonGroupClasses.selected}`]: { + color: "#fff", + }, + boxShadow: `0 4px 16px ${alpha(brand[700], 0.5)}`, + }), + }), + }, + }, + MuiToggleButton: { + styleOverrides: { + root: ({ theme }) => ({ + padding: "12px 16px", + textTransform: "none", + borderRadius: "10px", + fontWeight: 500, + ...theme.applyStyles("dark", { + color: gray[400], + boxShadow: "0 4px 16px rgba(0, 0, 0, 0.5)", + [`&.${toggleButtonClasses.selected}`]: { + color: brand[300], + }, + }), + }), + }, + }, + MuiCheckbox: { + defaultProps: { + disableRipple: true, + icon: ( + + ), + checkedIcon: , + indeterminateIcon: , + }, + styleOverrides: { + root: ({ theme }) => ({ + margin: 10, + height: 16, + width: 16, + borderRadius: 5, + border: "1px solid ", + borderColor: alpha(gray[300], 0.8), + boxShadow: "0 0 0 1.5px hsla(210, 0%, 0%, 0.04) inset", + backgroundColor: alpha(gray[100], 0.4), + transition: "border-color, background-color, 120ms ease-in", + "&:hover": { + borderColor: brand[300], + }, + "&.Mui-focusVisible": { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: "2px", + borderColor: brand[400], + }, + "&.Mui-checked": { + color: "white", + backgroundColor: brand[500], + borderColor: brand[500], + boxShadow: `none`, + "&:hover": { + backgroundColor: brand[600], + }, + }, + ...theme.applyStyles("dark", { + borderColor: alpha(gray[700], 0.8), + boxShadow: "0 0 0 1.5px hsl(210, 0%, 0%) inset", + backgroundColor: alpha(gray[900], 0.8), + "&:hover": { + borderColor: brand[300], + }, + "&.Mui-focusVisible": { + borderColor: brand[400], + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: "2px", + }, + }), + }), + }, + }, + MuiInputBase: { + styleOverrides: { + root: { + border: "none", + }, + input: { + "&::placeholder": { + opacity: 0.7, + color: gray[500], + }, + }, + }, + }, + MuiOutlinedInput: { + styleOverrides: { + input: { + padding: 0, + }, + root: ({ theme }) => ({ + padding: "8px 12px", + color: (theme.cssVariables || theme).palette.text.primary, + borderRadius: (theme.cssVariables || theme).shape.borderRadius, + border: `1px solid ${(theme.cssVariables || theme).palette.divider}`, + backgroundColor: (theme.cssVariables || theme).palette.background + .default, + transition: "border 120ms ease-in", + "&:hover": { + borderColor: gray[400], + }, + [`&.${outlinedInputClasses.focused}`]: { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + borderColor: brand[400], + }, + ...theme.applyStyles("dark", { + "&:hover": { + borderColor: gray[500], + }, + }), + variants: [ + { + props: { + size: "small", + }, + style: { + height: "2.25rem", + }, + }, + { + props: { + size: "medium", + }, + style: { + height: "2.5rem", + }, + }, + ], + }), + notchedOutline: { + border: "none", + }, + }, + }, + MuiInputAdornment: { + styleOverrides: { + root: ({ theme }) => ({ + color: (theme.cssVariables || theme).palette.grey[500], + ...theme.applyStyles("dark", { + color: (theme.cssVariables || theme).palette.grey[400], + }), + }), + }, + }, + MuiFormLabel: { + styleOverrides: { + root: ({ theme }) => ({ + typography: theme.typography.caption, + marginBottom: 8, + }), + }, + }, +}; diff --git a/site/src/ui/theme/customizations/navigation.tsx b/site/src/ui/theme/customizations/navigation.tsx new file mode 100644 index 0000000..0b4632d --- /dev/null +++ b/site/src/ui/theme/customizations/navigation.tsx @@ -0,0 +1,285 @@ +import * as React from "react"; +import { Theme, alpha, Components } from "@mui/material/styles"; +import { SvgIconProps } from "@mui/material/SvgIcon"; +import { buttonBaseClasses } from "@mui/material/ButtonBase"; +import { dividerClasses } from "@mui/material/Divider"; +import { menuItemClasses } from "@mui/material/MenuItem"; +import { selectClasses } from "@mui/material/Select"; +import { tabClasses } from "@mui/material/Tab"; +import UnfoldMoreRoundedIcon from "@mui/icons-material/UnfoldMoreRounded"; +import { gray, brand } from "../themePrimitives"; + +/* eslint-disable import/prefer-default-export */ +export const navigationCustomizations: Components = { + MuiMenuItem: { + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: (theme.cssVariables || theme).shape.borderRadius, + padding: "6px 8px", + [`&.${menuItemClasses.focusVisible}`]: { + backgroundColor: "transparent", + }, + [`&.${menuItemClasses.selected}`]: { + [`&.${menuItemClasses.focusVisible}`]: { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + }, + }), + }, + }, + MuiMenu: { + styleOverrides: { + list: { + gap: "0px", + [`&.${dividerClasses.root}`]: { + margin: "0 -8px", + }, + }, + paper: ({ theme }) => ({ + marginTop: "4px", + borderRadius: (theme.cssVariables || theme).shape.borderRadius, + border: `1px solid ${(theme.cssVariables || theme).palette.divider}`, + backgroundImage: "none", + background: "hsl(0, 0%, 100%)", + boxShadow: + "hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px", + [`& .${buttonBaseClasses.root}`]: { + "&.Mui-selected": { + backgroundColor: alpha(theme.palette.action.selected, 0.3), + }, + }, + ...theme.applyStyles("dark", { + background: gray[900], + boxShadow: + "hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px", + }), + }), + }, + }, + MuiSelect: { + defaultProps: { + IconComponent: React.forwardRef( + (props, ref) => ( + + ), + ), + }, + styleOverrides: { + root: ({ theme }) => ({ + borderRadius: (theme.cssVariables || theme).shape.borderRadius, + border: "1px solid", + borderColor: gray[200], + backgroundColor: (theme.cssVariables || theme).palette.background.paper, + boxShadow: `inset 0 1px 0 1px hsla(220, 0%, 100%, 0.6), inset 0 -1px 0 1px hsla(220, 35%, 90%, 0.5)`, + "&:hover": { + borderColor: gray[300], + backgroundColor: (theme.cssVariables || theme).palette.background + .paper, + boxShadow: "none", + }, + [`&.${selectClasses.focused}`]: { + outlineOffset: 0, + borderColor: gray[400], + }, + "&:before, &:after": { + display: "none", + }, + + ...theme.applyStyles("dark", { + borderRadius: (theme.cssVariables || theme).shape.borderRadius, + borderColor: gray[700], + backgroundColor: (theme.cssVariables || theme).palette.background + .paper, + boxShadow: `inset 0 1px 0 1px ${alpha(gray[700], 0.15)}, inset 0 -1px 0 1px hsla(220, 0%, 0%, 0.7)`, + "&:hover": { + borderColor: alpha(gray[700], 0.7), + backgroundColor: (theme.cssVariables || theme).palette.background + .paper, + boxShadow: "none", + }, + [`&.${selectClasses.focused}`]: { + outlineOffset: 0, + borderColor: gray[900], + }, + "&:before, &:after": { + display: "none", + }, + }), + }), + select: ({ theme }) => ({ + display: "flex", + alignItems: "center", + ...theme.applyStyles("dark", { + display: "flex", + alignItems: "center", + "&:focus-visible": { + backgroundColor: gray[900], + }, + }), + }), + }, + }, + MuiLink: { + defaultProps: { + underline: "none", + }, + styleOverrides: { + root: ({ theme }) => ({ + color: (theme.cssVariables || theme).palette.text.primary, + fontWeight: 500, + position: "relative", + textDecoration: "none", + width: "fit-content", + "&::before": { + content: '""', + position: "absolute", + width: "100%", + height: "1px", + bottom: 0, + left: 0, + backgroundColor: (theme.cssVariables || theme).palette.text.secondary, + opacity: 0.3, + transition: "width 0.3s ease, opacity 0.3s ease", + }, + "&:hover::before": { + width: 0, + }, + "&:focus-visible": { + outline: `3px solid ${alpha(brand[500], 0.5)}`, + outlineOffset: "4px", + borderRadius: "2px", + }, + }), + }, + }, + MuiDrawer: { + styleOverrides: { + paper: ({ theme }) => ({ + backgroundColor: (theme.cssVariables || theme).palette.background + .default, + }), + }, + }, + MuiPaginationItem: { + styleOverrides: { + root: ({ theme }) => ({ + "&.Mui-selected": { + color: "white", + backgroundColor: (theme.cssVariables || theme).palette.grey[900], + }, + ...theme.applyStyles("dark", { + "&.Mui-selected": { + color: "black", + backgroundColor: (theme.cssVariables || theme).palette.grey[50], + }, + }), + }), + }, + }, + MuiTabs: { + styleOverrides: { + root: { minHeight: "fit-content" }, + indicator: ({ theme }) => ({ + backgroundColor: (theme.cssVariables || theme).palette.grey[800], + ...theme.applyStyles("dark", { + backgroundColor: (theme.cssVariables || theme).palette.grey[200], + }), + }), + }, + }, + MuiTab: { + styleOverrides: { + root: ({ theme }) => ({ + padding: "6px 8px", + marginBottom: "8px", + textTransform: "none", + minWidth: "fit-content", + minHeight: "fit-content", + color: (theme.cssVariables || theme).palette.text.secondary, + borderRadius: (theme.cssVariables || theme).shape.borderRadius, + border: "1px solid", + borderColor: "transparent", + ":hover": { + color: (theme.cssVariables || theme).palette.text.primary, + backgroundColor: gray[100], + borderColor: gray[200], + }, + [`&.${tabClasses.selected}`]: { + color: gray[900], + }, + ...theme.applyStyles("dark", { + ":hover": { + color: (theme.cssVariables || theme).palette.text.primary, + backgroundColor: gray[800], + borderColor: gray[700], + }, + [`&.${tabClasses.selected}`]: { + color: "#fff", + }, + }), + }), + }, + }, + MuiStepConnector: { + styleOverrides: { + line: ({ theme }) => ({ + borderTop: "1px solid", + borderColor: (theme.cssVariables || theme).palette.divider, + flex: 1, + borderRadius: "99px", + }), + }, + }, + MuiStepIcon: { + styleOverrides: { + root: ({ theme }) => ({ + color: "transparent", + border: `1px solid ${gray[400]}`, + width: 12, + height: 12, + borderRadius: "50%", + "& text": { + display: "none", + }, + "&.Mui-active": { + border: "none", + color: (theme.cssVariables || theme).palette.primary.main, + }, + "&.Mui-completed": { + border: "none", + color: (theme.cssVariables || theme).palette.success.main, + }, + ...theme.applyStyles("dark", { + border: `1px solid ${gray[700]}`, + "&.Mui-active": { + border: "none", + color: (theme.cssVariables || theme).palette.primary.light, + }, + "&.Mui-completed": { + border: "none", + color: (theme.cssVariables || theme).palette.success.light, + }, + }), + variants: [ + { + props: { completed: true }, + style: { + width: 12, + height: 12, + }, + }, + ], + }), + }, + }, + MuiStepLabel: { + styleOverrides: { + label: ({ theme }) => ({ + "&.Mui-completed": { + opacity: 0.6, + ...theme.applyStyles("dark", { opacity: 0.5 }), + }, + }), + }, + }, +}; diff --git a/site/src/ui/theme/customizations/surfaces.ts b/site/src/ui/theme/customizations/surfaces.ts new file mode 100644 index 0000000..2d4be8a --- /dev/null +++ b/site/src/ui/theme/customizations/surfaces.ts @@ -0,0 +1,117 @@ +import { alpha, Theme, Components } from "@mui/material/styles"; +import { gray } from "../themePrimitives"; + +/* eslint-disable import/prefer-default-export */ +export const surfacesCustomizations: Components = { + MuiAccordion: { + defaultProps: { + elevation: 0, + disableGutters: true, + }, + styleOverrides: { + root: ({ theme }) => ({ + padding: 4, + overflow: "clip", + backgroundColor: (theme.cssVariables || theme).palette.background + .default, + border: "1px solid", + borderColor: (theme.cssVariables || theme).palette.divider, + ":before": { + backgroundColor: "transparent", + }, + "&:not(:last-of-type)": { + borderBottom: "none", + }, + "&:first-of-type": { + borderTopLeftRadius: (theme.cssVariables || theme).shape.borderRadius, + borderTopRightRadius: (theme.cssVariables || theme).shape + .borderRadius, + }, + "&:last-of-type": { + borderBottomLeftRadius: (theme.cssVariables || theme).shape + .borderRadius, + borderBottomRightRadius: (theme.cssVariables || theme).shape + .borderRadius, + }, + }), + }, + }, + MuiAccordionSummary: { + styleOverrides: { + root: ({ theme }) => ({ + border: "none", + borderRadius: 8, + "&:hover": { backgroundColor: gray[50] }, + "&:focus-visible": { backgroundColor: "transparent" }, + ...theme.applyStyles("dark", { + "&:hover": { backgroundColor: gray[800] }, + }), + }), + }, + }, + MuiAccordionDetails: { + styleOverrides: { + root: { mb: 20, border: "none" }, + }, + }, + MuiPaper: { + defaultProps: { + elevation: 0, + }, + }, + MuiCard: { + styleOverrides: { + root: ({ theme }) => { + return { + padding: 16, + gap: 16, + transition: "all 100ms ease", + backgroundColor: gray[50], + borderRadius: (theme.cssVariables || theme).shape.borderRadius, + border: `1px solid ${(theme.cssVariables || theme).palette.divider}`, + boxShadow: "none", + ...theme.applyStyles("dark", { + backgroundColor: gray[800], + }), + variants: [ + { + props: { + variant: "outlined", + }, + style: { + border: `1px solid ${(theme.cssVariables || theme).palette.divider}`, + boxShadow: "none", + background: "hsl(0, 0%, 100%)", + ...theme.applyStyles("dark", { + background: alpha(gray[900], 0.4), + }), + }, + }, + ], + }; + }, + }, + }, + MuiCardContent: { + styleOverrides: { + root: { + padding: 0, + "&:last-child": { paddingBottom: 0 }, + }, + }, + }, + MuiCardHeader: { + styleOverrides: { + root: { + padding: 0, + }, + }, + }, + MuiCardActions: { + styleOverrides: { + root: { + padding: 0, + }, + }, + }, +}; diff --git a/site/src/ui/theme/themePrimitives.ts b/site/src/ui/theme/themePrimitives.ts new file mode 100644 index 0000000..b9b8a04 --- /dev/null +++ b/site/src/ui/theme/themePrimitives.ts @@ -0,0 +1,399 @@ +import { createTheme, alpha, PaletteMode, Shadows } from '@mui/material/styles'; + +declare module '@mui/material/Paper' { + interface PaperPropsVariantOverrides { + highlighted: true; + } +} +declare module '@mui/material/styles/createPalette' { + interface ColorRange { + 50: string; + 100: string; + 200: string; + 300: string; + 400: string; + 500: string; + 600: string; + 700: string; + 800: string; + 900: string; + } + + interface PaletteColor extends ColorRange {} + + interface Palette { + baseShadow: string; + } +} + +const defaultTheme = createTheme(); + +const customShadows: Shadows = [...defaultTheme.shadows]; + +export const brand = { + 50: 'hsl(210, 100%, 95%)', + 100: 'hsl(210, 100%, 92%)', + 200: 'hsl(210, 100%, 80%)', + 300: 'hsl(210, 100%, 65%)', + 400: 'hsl(210, 98%, 48%)', + 500: 'hsl(210, 98%, 42%)', + 600: 'hsl(210, 98%, 55%)', + 700: 'hsl(210, 100%, 35%)', + 800: 'hsl(210, 100%, 16%)', + 900: 'hsl(210, 100%, 21%)', +}; + +export const gray = { + 50: 'hsl(220, 35%, 97%)', + 100: 'hsl(220, 30%, 94%)', + 200: 'hsl(220, 20%, 88%)', + 300: 'hsl(220, 20%, 80%)', + 400: 'hsl(220, 20%, 65%)', + 500: 'hsl(220, 20%, 42%)', + 600: 'hsl(220, 20%, 35%)', + 700: 'hsl(220, 20%, 25%)', + 800: 'hsl(220, 30%, 6%)', + 900: 'hsl(220, 35%, 3%)', +}; + +export const green = { + 50: 'hsl(120, 80%, 98%)', + 100: 'hsl(120, 75%, 94%)', + 200: 'hsl(120, 75%, 87%)', + 300: 'hsl(120, 61%, 77%)', + 400: 'hsl(120, 44%, 53%)', + 500: 'hsl(120, 59%, 30%)', + 600: 'hsl(120, 70%, 25%)', + 700: 'hsl(120, 75%, 16%)', + 800: 'hsl(120, 84%, 10%)', + 900: 'hsl(120, 87%, 6%)', +}; + +export const orange = { + 50: 'hsl(45, 100%, 97%)', + 100: 'hsl(45, 92%, 90%)', + 200: 'hsl(45, 94%, 80%)', + 300: 'hsl(45, 90%, 65%)', + 400: 'hsl(45, 90%, 40%)', + 500: 'hsl(45, 90%, 35%)', + 600: 'hsl(45, 91%, 25%)', + 700: 'hsl(45, 94%, 20%)', + 800: 'hsl(45, 95%, 16%)', + 900: 'hsl(45, 93%, 12%)', +}; + +export const red = { + 50: 'hsl(0, 100%, 97%)', + 100: 'hsl(0, 92%, 90%)', + 200: 'hsl(0, 94%, 80%)', + 300: 'hsl(0, 90%, 65%)', + 400: 'hsl(0, 90%, 40%)', + 500: 'hsl(0, 90%, 30%)', + 600: 'hsl(0, 91%, 25%)', + 700: 'hsl(0, 94%, 18%)', + 800: 'hsl(0, 95%, 12%)', + 900: 'hsl(0, 93%, 6%)', +}; + +export const getDesignTokens = (mode: PaletteMode) => { + customShadows[1] = + mode === 'dark' + ? 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px' + : 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px'; + + return { + palette: { + mode, + primary: { + light: brand[200], + main: brand[400], + dark: brand[700], + contrastText: brand[50], + ...(mode === 'dark' && { + contrastText: brand[50], + light: brand[300], + main: brand[400], + dark: brand[700], + }), + }, + info: { + light: brand[100], + main: brand[300], + dark: brand[600], + contrastText: gray[50], + ...(mode === 'dark' && { + contrastText: brand[300], + light: brand[500], + main: brand[700], + dark: brand[900], + }), + }, + warning: { + light: orange[300], + main: orange[400], + dark: orange[800], + ...(mode === 'dark' && { + light: orange[400], + main: orange[500], + dark: orange[700], + }), + }, + error: { + light: red[300], + main: red[400], + dark: red[800], + ...(mode === 'dark' && { + light: red[400], + main: red[500], + dark: red[700], + }), + }, + success: { + light: green[300], + main: green[400], + dark: green[800], + ...(mode === 'dark' && { + light: green[400], + main: green[500], + dark: green[700], + }), + }, + grey: { + ...gray, + }, + divider: mode === 'dark' ? alpha(gray[700], 0.6) : alpha(gray[300], 0.4), + background: { + default: 'hsl(0, 0%, 99%)', + paper: 'hsl(220, 35%, 97%)', + ...(mode === 'dark' && { default: gray[900], paper: 'hsl(220, 30%, 7%)' }), + }, + text: { + primary: gray[800], + secondary: gray[600], + warning: orange[400], + ...(mode === 'dark' && { primary: 'hsl(0, 0%, 100%)', secondary: gray[400] }), + }, + action: { + hover: alpha(gray[200], 0.2), + selected: `${alpha(gray[200], 0.3)}`, + ...(mode === 'dark' && { + hover: alpha(gray[600], 0.2), + selected: alpha(gray[600], 0.3), + }), + }, + }, + typography: { + fontFamily: ['"Inter", "sans-serif"'].join(','), + h1: { + fontSize: defaultTheme.typography.pxToRem(48), + fontWeight: 600, + lineHeight: 1.2, + letterSpacing: -0.5, + }, + h2: { + fontSize: defaultTheme.typography.pxToRem(36), + fontWeight: 600, + lineHeight: 1.2, + }, + h3: { + fontSize: defaultTheme.typography.pxToRem(30), + lineHeight: 1.2, + }, + h4: { + fontSize: defaultTheme.typography.pxToRem(24), + fontWeight: 600, + lineHeight: 1.5, + }, + h5: { + fontSize: defaultTheme.typography.pxToRem(20), + fontWeight: 600, + }, + h6: { + fontSize: defaultTheme.typography.pxToRem(18), + fontWeight: 600, + }, + subtitle1: { + fontSize: defaultTheme.typography.pxToRem(18), + }, + subtitle2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 500, + }, + body1: { + fontSize: defaultTheme.typography.pxToRem(14), + }, + body2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 400, + }, + caption: { + fontSize: defaultTheme.typography.pxToRem(12), + fontWeight: 400, + }, + }, + shape: { + borderRadius: 8, + }, + shadows: customShadows, + }; +}; + +export const colorSchemes = { + light: { + palette: { + primary: { + light: brand[200], + main: brand[400], + dark: brand[700], + contrastText: brand[50], + }, + info: { + light: brand[100], + main: brand[300], + dark: brand[600], + contrastText: gray[50], + }, + warning: { + light: orange[300], + main: orange[400], + dark: orange[800], + }, + error: { + light: red[300], + main: red[400], + dark: red[800], + }, + success: { + light: green[300], + main: green[400], + dark: green[800], + }, + grey: { + ...gray, + }, + divider: alpha(gray[300], 0.4), + background: { + default: 'hsl(0, 0%, 99%)', + paper: 'hsl(220, 35%, 97%)', + }, + text: { + primary: gray[800], + secondary: gray[600], + warning: orange[400], + }, + action: { + hover: alpha(gray[200], 0.2), + selected: `${alpha(gray[200], 0.3)}`, + }, + baseShadow: + 'hsla(220, 30%, 5%, 0.07) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.07) 0px 8px 16px -5px', + }, + }, + dark: { + palette: { + primary: { + contrastText: brand[50], + light: brand[300], + main: brand[400], + dark: brand[700], + }, + info: { + contrastText: brand[300], + light: brand[500], + main: brand[700], + dark: brand[900], + }, + warning: { + light: orange[400], + main: orange[500], + dark: orange[700], + }, + error: { + light: red[400], + main: red[500], + dark: red[700], + }, + success: { + light: green[400], + main: green[500], + dark: green[700], + }, + grey: { + ...gray, + }, + divider: alpha(gray[700], 0.6), + background: { + default: gray[900], + paper: 'hsl(220, 30%, 7%)', + }, + text: { + primary: 'hsl(0, 0%, 100%)', + secondary: gray[400], + }, + action: { + hover: alpha(gray[600], 0.2), + selected: alpha(gray[600], 0.3), + }, + baseShadow: + 'hsla(220, 30%, 5%, 0.7) 0px 4px 16px 0px, hsla(220, 25%, 10%, 0.8) 0px 8px 16px -5px', + }, + }, +}; + +export const typography = { + fontFamily: ['"Inter", "sans-serif"'].join(','), + h1: { + fontSize: defaultTheme.typography.pxToRem(48), + fontWeight: 600, + lineHeight: 1.2, + letterSpacing: -0.5, + }, + h2: { + fontSize: defaultTheme.typography.pxToRem(36), + fontWeight: 600, + lineHeight: 1.2, + }, + h3: { + fontSize: defaultTheme.typography.pxToRem(30), + lineHeight: 1.2, + }, + h4: { + fontSize: defaultTheme.typography.pxToRem(24), + fontWeight: 600, + lineHeight: 1.5, + }, + h5: { + fontSize: defaultTheme.typography.pxToRem(20), + fontWeight: 600, + }, + h6: { + fontSize: defaultTheme.typography.pxToRem(18), + fontWeight: 600, + }, + subtitle1: { + fontSize: defaultTheme.typography.pxToRem(18), + }, + subtitle2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 500, + }, + body1: { + fontSize: defaultTheme.typography.pxToRem(14), + }, + body2: { + fontSize: defaultTheme.typography.pxToRem(14), + fontWeight: 400, + }, + caption: { + fontSize: defaultTheme.typography.pxToRem(12), + fontWeight: 400, + }, +}; + +export const shape = { + borderRadius: 8, +}; + +// @ts-ignore +const defaultShadows: Shadows = ['var(--mui-palette-baseShadow)', ...defaultTheme.shadows.slice(1)]; +export const shadows = defaultShadows; diff --git a/site/src/vite-env.d.ts b/site/src/vite-env.d.ts new file mode 100644 index 0000000..11f02fe --- /dev/null +++ b/site/src/vite-env.d.ts @@ -0,0 +1 @@ +/// diff --git a/site/tsconfig.app.json b/site/tsconfig.app.json new file mode 100644 index 0000000..588add2 --- /dev/null +++ b/site/tsconfig.app.json @@ -0,0 +1,29 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "lib": ["ES2020", "DOM", "DOM.Iterable", "WebWorker", "ES2021.String"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "react-jsx", + + /* Linting */ + "strict": true, + "noUnusedLocals": false, + "noUnusedParameters": false, + "noFallthroughCasesInSwitch": false + }, + "include": ["src"], + "types": ["vite/client", "vite-plugin-pwa/client"], + "baseUrl": "./src", + "paths": { + "@/*": ["*"] + } +} diff --git a/site/tsconfig.app.tsbuildinfo b/site/tsconfig.app.tsbuildinfo new file mode 100644 index 0000000..91a32e1 --- /dev/null +++ b/site/tsconfig.app.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./src/App.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/logic/comms.ts","./src/logic/constants.ts","./src/logic/store.ts","./src/logic/tlon-helpers.ts","./src/logic/types-tlon.ts","./src/logic/types.ts","./src/logic/utils.ts","./src/logic/ob/co.ts","./src/logic/ob/muk.ts","./src/logic/ob/ob.ts","./src/logic/ob/types.ts","./src/modals/Modal.tsx","./src/site/Blog.tsx","./src/site/BlogPost.tsx","./src/site/Board.tsx","./src/site/BoardThread.tsx","./src/site/Chat.tsx","./src/site/Chatroom.tsx","./src/site/Composer.tsx","./src/site/Forum.tsx","./src/site/Home.tsx","./src/site/Login.tsx","./src/site/Navbar.tsx","./src/site/PostContent.tsx","./src/site/Radio.tsx","./src/site/Search.tsx","./src/site/Snippets.tsx","./src/site/StaticPage.tsx","./src/site/User.tsx","./src/site/Wiki.tsx","./src/ui/Components.tsx","./src/ui/Sigil.tsx","./src/ui/theme.tsx","./src/ui/sigil-ts/index.ts","./src/ui/sigil-ts/lib.ts","./src/ui/sigil-ts/reactImageRenderer.ts","./src/ui/sigil-ts/reactRenderer.ts","./src/ui/sigil-ts/stringRenderer.ts","./src/ui/sigil-ts/types.ts","./src/ui/theme/AppTheme.tsx","./src/ui/theme/ColorModeIconDropdown.tsx","./src/ui/theme/ColorModeSelect.tsx","./src/ui/theme/themePrimitives.ts","./src/ui/theme/customizations/dataDisplay.tsx","./src/ui/theme/customizations/feedback.tsx","./src/ui/theme/customizations/inputs.tsx","./src/ui/theme/customizations/navigation.tsx","./src/ui/theme/customizations/surfaces.ts"],"version":"5.6.2"} \ No newline at end of file diff --git a/site/tsconfig.json b/site/tsconfig.json new file mode 100644 index 0000000..1ffef60 --- /dev/null +++ b/site/tsconfig.json @@ -0,0 +1,7 @@ +{ + "files": [], + "references": [ + { "path": "./tsconfig.app.json" }, + { "path": "./tsconfig.node.json" } + ] +} diff --git a/site/tsconfig.node.json b/site/tsconfig.node.json new file mode 100644 index 0000000..0d3d714 --- /dev/null +++ b/site/tsconfig.node.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + + /* Bundler mode */ + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + + /* Linting */ + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/site/tsconfig.node.tsbuildinfo b/site/tsconfig.node.tsbuildinfo new file mode 100644 index 0000000..98ef2f9 --- /dev/null +++ b/site/tsconfig.node.tsbuildinfo @@ -0,0 +1 @@ +{"root":["./vite.config.ts"],"version":"5.6.2"} \ No newline at end of file diff --git a/site/vite.config.ts b/site/vite.config.ts new file mode 100644 index 0000000..c38a21f --- /dev/null +++ b/site/vite.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; +// import { createHash } from "crypto"; + +// https://vitejs.dev/config/ +export default defineConfig({ + base: "/ublog", + plugins: [react()], +});