From 96722fde4bfe99eda210d06c29b5bc492f3468d2 Mon Sep 17 00:00:00 2001 From: Elena Torro Date: Tue, 21 Apr 2026 16:10:18 +0200 Subject: [PATCH] :bug: Support EvenOdd SVG attribute across all path operations --- .../render-wasm/get-file-paths-evenodd.json | 822 ++++++++++++++++++ .../ui/render-wasm-specs/shapes.spec.js | 16 + .../Renders-svg-paths-with-evenodd-1.png | Bin 0 -> 23531 bytes render-wasm/src/render/fills.rs | 4 +- render-wasm/src/render/strokes.rs | 12 +- render-wasm/src/shapes.rs | 7 +- render-wasm/src/shapes/paths.rs | 11 +- render-wasm/src/shapes/stroke_paths.rs | 2 +- 8 files changed, 860 insertions(+), 14 deletions(-) create mode 100644 frontend/playwright/data/render-wasm/get-file-paths-evenodd.json create mode 100644 frontend/playwright/ui/render-wasm-specs/shapes.spec.js-snapshots/Renders-svg-paths-with-evenodd-1.png diff --git a/frontend/playwright/data/render-wasm/get-file-paths-evenodd.json b/frontend/playwright/data/render-wasm/get-file-paths-evenodd.json new file mode 100644 index 0000000000..fb2a5f3f40 --- /dev/null +++ b/frontend/playwright/data/render-wasm/get-file-paths-evenodd.json @@ -0,0 +1,822 @@ +{ + "~:features": { + "~#set": [ + "fdata/path-data", + "plugins/runtime", + "design-tokens/v1", + "variants/v1", + "layout/grid", + "styles/v2", + "fdata/objects-map", + "render-wasm/v1", + "text-editor-wasm/v1", + "components/v2", + "fdata/shape-data-type" + ] + }, + "~:team-id": "~u6bd7c17d-4f59-815e-8006-5c1f6882469a", + "~:permissions": { + "~:type": "~:membership", + "~:is-owner": true, + "~:is-admin": true, + "~:can-edit": true, + "~:can-read": true, + "~:is-logged": true + }, + "~:has-media-trimmed": false, + "~:comment-thread-seqn": 0, + "~:name": "svg_path_evenodd", + "~:revn": 18, + "~:modified-at": "~m1776843383797", + "~:vern": 0, + "~:id": "~u3e84615b-5628-818c-8007-e7563bb081fb", + "~:is-shared": false, + "~:migrations": { + "~#ordered-set": [ + "legacy-2", + "legacy-3", + "legacy-5", + "legacy-6", + "legacy-7", + "legacy-8", + "legacy-9", + "legacy-10", + "legacy-11", + "legacy-12", + "legacy-13", + "legacy-14", + "legacy-16", + "legacy-17", + "legacy-18", + "legacy-19", + "legacy-25", + "legacy-26", + "legacy-27", + "legacy-28", + "legacy-29", + "legacy-31", + "legacy-32", + "legacy-33", + "legacy-34", + "legacy-36", + "legacy-37", + "legacy-38", + "legacy-39", + "legacy-40", + "legacy-41", + "legacy-42", + "legacy-43", + "legacy-44", + "legacy-45", + "legacy-46", + "legacy-47", + "legacy-48", + "legacy-49", + "legacy-50", + "legacy-51", + "legacy-52", + "legacy-53", + "legacy-54", + "legacy-55", + "legacy-56", + "legacy-57", + "legacy-59", + "legacy-62", + "legacy-65", + "legacy-66", + "legacy-67", + "0001-remove-tokens-from-groups", + "0002-normalize-bool-content-v2", + "0002-clean-shape-interactions", + "0003-fix-root-shape", + "0003-convert-path-content-v2", + "0005-deprecate-image-type", + "0006-fix-old-texts-fills", + "0008-fix-library-colors-v4", + "0009-clean-library-colors", + "0009-add-partial-text-touched-flags", + "0010-fix-swap-slots-pointing-non-existent-shapes", + "0011-fix-invalid-text-touched-flags", + "0012-fix-position-data", + "0013-fix-component-path", + "0013-clear-invalid-strokes-and-fills", + "0014-fix-tokens-lib-duplicate-ids", + "0014-clear-components-nil-objects", + "0015-fix-text-attrs-blank-strings", + "0015-clean-shadow-color", + "0016-copy-fills-from-position-data-to-text-node", + "0017-fix-layout-flex-dir" + ] + }, + "~:version": 67, + "~:project-id": "~u6bd7c17d-4f59-815e-8006-5c1f68846e43", + "~:created-at": "~m1776779037378", + "~:backend": "legacy-db", + "~:data": { + "~:pages": ["~u3e84615b-5628-818c-8007-e7563bb081fc"], + "~:pages-index": { + "~u3e84615b-5628-818c-8007-e7563bb081fc": { + "~:objects": { + "~#penpot/objects-map/v2": { + "~u00000000-0000-0000-0000-000000000000": "[\"~#shape\",[\"^ \",\"~:y\",0,\"~:hide-fill-on-export\",false,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:name\",\"Root Frame\",\"~:width\",0.01,\"~:type\",\"~:frame\",\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",0.0,\"~:y\",0.0]],[\"^:\",[\"^ \",\"~:x\",0.01,\"~:y\",0.0]],[\"^:\",[\"^ \",\"~:x\",0.01,\"~:y\",0.01]],[\"^:\",[\"^ \",\"~:x\",0.0,\"~:y\",0.01]]],\"~:r2\",0,\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^3\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:r3\",0,\"~:r1\",0,\"~:id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:parent-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[],\"~:x\",0,\"~:proportion\",1.0,\"~:r4\",0,\"~:selrect\",[\"~#rect\",[\"^ \",\"~:x\",0,\"~:y\",0,\"^6\",0.01,\"~:height\",0.01,\"~:x1\",0,\"~:y1\",0,\"~:x2\",0.01,\"~:y2\",0.01]],\"~:fills\",[[\"^ \",\"~:fill-color\",\"#FFFFFF\",\"~:fill-opacity\",1]],\"~:flip-x\",null,\"^H\",0.01,\"~:flip-y\",null,\"~:shapes\",[\"~ud0a635f7-639e-80f3-8007-e84b7399e693\",\"~ud0a635f7-639e-80f3-8007-e84b73ad74f4\",\"~ud0a635f7-639e-80f3-8007-e84b73bdd7da\",\"~ud0a635f7-639e-80f3-8007-e84b73ce5ead\",\"~ud0a635f7-639e-80f3-8007-e84b73d4a494\"]]]", + "~ud0a635f7-639e-80f3-8007-e84b73ce5ead": "[\"~#shape\",[\"^ \",\"~:y\",-840.999998986721,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:name\",\"04-venn-circles\",\"~:width\",99.99999761581421,\"~:type\",\"~:group\",\"~:svg-attrs\",[\"^ \",\"^5\",\"120\",\"~:height\",\"120\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",89.00000085433328,\"~:y\",-840.999998986721]],[\"^;\",[\"^ \",\"~:x\",188.9999984701475,\"~:y\",-840.999998986721]],[\"^;\",[\"^ \",\"~:x\",188.9999984701475,\"~:y\",-741.0000013709068]],[\"^;\",[\"^ \",\"~:x\",89.00000085433328,\"~:y\",-741.0000013709068]]],\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:id\",\"~ud0a635f7-639e-80f3-8007-e84b73ce5ead\",\"~:parent-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[],\"~:x\",89.00000085433328,\"~:proportion\",1,\"~:selrect\",[\"~#rect\",[\"^ \",\"~:x\",89.00000085433328,\"~:y\",-840.999998986721,\"^5\",99.99999761581421,\"^9\",99.99999761581421,\"~:x1\",89.00000085433328,\"~:y1\",-840.999998986721,\"~:x2\",188.9999984701475,\"~:y2\",-741.0000013709068]],\"~:fills\",[],\"~:flip-x\",null,\"^9\",99.99999761581421,\"~:flip-y\",null,\"~:shapes\",[\"~ud0a635f7-639e-80f3-8007-e84b73ce9306\",\"~ud0a635f7-639e-80f3-8007-e84b73cf1ec2\"]]]", + "~ud0a635f7-639e-80f3-8007-e84b739a1146": "[\"~#shape\",[\"^ \",\"~:y\",-725.9999912977219,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:name\",\"base-background\",\"~:width\",100,\"~:type\",\"~:rect\",\"~:svg-attrs\",[\"^ \",\"~:fill\",\"none\",\"~:id\",\"base-background\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",257.9999885559082,\"~:y\",-725.9999912977219]],[\"^<\",[\"^ \",\"~:x\",357.9999885559082,\"~:y\",-725.9999912977219]],[\"^<\",[\"^ \",\"~:x\",357.9999885559082,\"~:y\",-625.9999912977219]],[\"^<\",[\"^ \",\"~:x\",257.9999885559082,\"~:y\",-625.9999912977219]]],\"~:r2\",0,\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:r3\",0,\"~:r1\",0,\"~:hidden\",true,\"^:\",\"~ud0a635f7-639e-80f3-8007-e84b739a1146\",\"~:parent-id\",\"~ud0a635f7-639e-80f3-8007-e84b7399e693\",\"~:svg-viewbox\",[\"~#rect\",[\"^ \",\"~:x\",0,\"~:y\",0,\"^5\",100,\"~:height\",100,\"~:x1\",0,\"~:y1\",0,\"~:x2\",100,\"~:y2\",100]],\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[],\"~:x\",257.9999885559082,\"~:proportion\",1,\"~:r4\",0,\"~:selrect\",[\"^E\",[\"^ \",\"~:x\",257.9999885559082,\"~:y\",-725.9999912977219,\"^5\",100,\"^F\",100,\"^G\",257.9999885559082,\"^H\",-725.9999912977219,\"^I\",357.9999885559082,\"^J\",-625.9999912977219]],\"~:fills\",[],\"~:flip-x\",null,\"^F\",100,\"~:flip-y\",null]]", + "~ud0a635f7-639e-80f3-8007-e84b73ce9306": "[\"~#shape\",[\"^ \",\"~:y\",-840.999998986721,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:name\",\"base-background\",\"~:width\",99.99999761581421,\"~:type\",\"~:rect\",\"~:svg-attrs\",[\"^ \",\"~:fill\",\"none\",\"~:id\",\"base-background\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",89.00000085433328,\"~:y\",-840.999998986721]],[\"^<\",[\"^ \",\"~:x\",188.9999984701475,\"~:y\",-840.999998986721]],[\"^<\",[\"^ \",\"~:x\",188.9999984701475,\"~:y\",-741.0000013709068]],[\"^<\",[\"^ \",\"~:x\",89.00000085433328,\"~:y\",-741.0000013709068]]],\"~:r2\",0,\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:r3\",0,\"~:r1\",0,\"~:hidden\",true,\"^:\",\"~ud0a635f7-639e-80f3-8007-e84b73ce9306\",\"~:parent-id\",\"~ud0a635f7-639e-80f3-8007-e84b73ce5ead\",\"~:svg-viewbox\",[\"~#rect\",[\"^ \",\"~:x\",0,\"~:y\",0,\"^5\",120,\"~:height\",120,\"~:x1\",0,\"~:y1\",0,\"~:x2\",120,\"~:y2\",120]],\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[],\"~:x\",89.00000085433328,\"~:proportion\",1,\"~:r4\",0,\"~:selrect\",[\"^E\",[\"^ \",\"~:x\",89.00000085433328,\"~:y\",-840.999998986721,\"^5\",99.99999761581421,\"^F\",99.99999761581421,\"^G\",89.00000085433328,\"^H\",-840.999998986721,\"^I\",188.9999984701475,\"^J\",-741.0000013709068]],\"~:fills\",[],\"~:flip-x\",null,\"^F\",99.99999761581421,\"~:flip-y\",null]]", + "~ud0a635f7-639e-80f3-8007-e84b73be6505": "[\"~#shape\",[\"^ \",\"~:y\",-841,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:name\",\"base-background\",\"~:width\",99.99998211860657,\"~:type\",\"~:rect\",\"~:svg-attrs\",[\"^ \",\"~:fill\",\"none\",\"~:id\",\"base-background\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",188.9999989271164,\"~:y\",-841]],[\"^<\",[\"^ \",\"~:x\",288.99998104572296,\"~:y\",-841]],[\"^<\",[\"^ \",\"~:x\",288.99998104572296,\"~:y\",-741]],[\"^<\",[\"^ \",\"~:x\",188.9999989271164,\"~:y\",-741]]],\"~:r2\",0,\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:r3\",0,\"~:r1\",0,\"~:hidden\",true,\"^:\",\"~ud0a635f7-639e-80f3-8007-e84b73be6505\",\"~:parent-id\",\"~ud0a635f7-639e-80f3-8007-e84b73bdd7da\",\"~:svg-viewbox\",[\"~#rect\",[\"^ \",\"~:x\",0,\"~:y\",0,\"^5\",100,\"~:height\",100,\"~:x1\",0,\"~:y1\",0,\"~:x2\",100,\"~:y2\",100]],\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[],\"~:x\",188.9999989271164,\"~:proportion\",1,\"~:r4\",0,\"~:selrect\",[\"^E\",[\"^ \",\"~:x\",188.9999989271164,\"~:y\",-841,\"^5\",99.99998211860657,\"^F\",100,\"^G\",188.9999989271164,\"^H\",-841,\"^I\",288.99998104572296,\"^J\",-741]],\"~:fills\",[],\"~:flip-x\",null,\"^F\",100,\"~:flip-y\",null]]", + "~ud0a635f7-639e-80f3-8007-e84b73ae0f65": "[\"~#shape\",[\"^ \",\"~:y\",null,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:content\",[\"~#penpot/path-data\",\"~bAQAAAAAAAAAAAAAAAAAAAAAAAAAAgJpDAMBPxAIAAAAAAAAAAAAAAAAAAAAAAAAAAIDCQwDAT8QCAAAAAAAAAAAAAAAAAAAAAAAAAACAwkMAwDvEAgAAAAAAAAAAAAAAAAAAAAAAAAAAgJpDAMA7xAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAAAAokMAAEzEAgAAAAAAAAAAAAAAAAAAAAAAAAAAALtDAABMxAIAAAAAAAAAAAAAAAAAAAAAAAAAAAC7QwCAP8QCAAAAAAAAAAAAAAAAAAAAAAAAAAAAokMAgD/EBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAICpQwBASMQCAAAAAAAAAAAAAAAAAAAAAAAAAACAs0MAQEjEAgAAAAAAAAAAAAAAAAAAAAAAAAAAgLNDAEBDxAIAAAAAAAAAAAAAAAAAAAAAAAAAAICpQwBAQ8QEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"],\"~:name\",\"svg-path\",\"~:width\",null,\"~:type\",\"~:path\",\"~:svg-attrs\",[\"^ \",\"~:fillRule\",\"evenodd\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",309,\"~:y\",-831]],[\"^=\",[\"^ \",\"~:x\",389,\"~:y\",-831]],[\"^=\",[\"^ \",\"~:x\",389,\"~:y\",-751]],[\"^=\",[\"^ \",\"~:x\",309,\"~:y\",-751]]],\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:svg-transform\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:id\",\"~ud0a635f7-639e-80f3-8007-e84b73ae0f65\",\"~:parent-id\",\"~ud0a635f7-639e-80f3-8007-e84b73ad74f4\",\"~:svg-viewbox\",[\"~#rect\",[\"^ \",\"~:x\",10,\"~:y\",10,\"^7\",80,\"~:height\",80,\"~:x1\",10,\"~:y1\",10,\"~:x2\",90,\"~:y2\",90]],\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[[\"^ \",\"~:stroke-color\",\"#1a6a3a\",\"~:stroke-opacity\",1,\"~:stroke-width\",3]],\"~:x\",null,\"~:proportion\",1,\"~:selrect\",[\"^D\",[\"^ \",\"~:x\",309,\"~:y\",-831,\"^7\",80,\"^E\",80,\"^F\",309,\"^G\",-831,\"^H\",389,\"^I\",-751]],\"~:fills\",[[\"^ \",\"~:fill-color\",\"#4ae290\"]],\"~:flip-x\",null,\"^E\",null,\"~:flip-y\",null]]", + "~ud0a635f7-639e-80f3-8007-e84b73d53705": "[\"~#shape\",[\"^ \",\"~:y\",null,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:content\",[\"~#penpot/path-data\",\"~bAQAAAAAAAAAAAAAAAAAAAAAAAAABACpDq2ozxAMAAAD2/BJDq2ozxFVVAEPDwC7EVVUAQwAAKcQDAAAAVVUAQz4/I8T2/BJDVpUexAEAKkNWlR7EAwAAAAoDQUNWlR7EqqpTQz4/I8SqqlNDAAApxAMAAACqqlNDw8AuxAoDQUOrajPEAQAqQ6tqM8QCAAAAAAAAAAAAAAAAAAAAAAAAAAEAKkOrajPEAQAAAAAAAAAAAAAAAAAAAAAAAAABACpDAEAvxAMAAAAmeiRDAEAvxAEAIEN3IS7EAQAgQwDALMQDAAAAAQAgQ4leK8QmeiRDAEAqxAEAKkMAQCrEAwAAANuFL0MAQCrEAQA0Q4leK8QBADRDAMAsxAMAAAABADRDdyEuxNuFL0MAQC/EAQAqQwBAL8QCAAAAAAAAAAAAAAAAAAAAAAAAAAEAKkMAQC/EAQAAAAAAAAAAAAAAAAAAAAAAAABWVRRDrKogxAMAAABWVRRDrGokxKuqHEOr6ibEAQAqQ6vqJsQDAAAAVVU3Q6vqJsSqqj9DrGokxKqqP0OsqiDEAwAAAKqqP0MBQCDE//89Q1bVH8RVVTxDVtUfxAIAAAAAAAAAAAAAAAAAAAAAAAAAq6oXQ1bVH8QDAAAAAQAWQ1bVH8RWVRRDAUAgxFZVFEOsqiDEAgAAAAAAAAAAAAAAAAAAAAAAAABWVRRDrKogxA==\"],\"~:name\",\"svg-path\",\"~:width\",null,\"~:type\",\"~:path\",\"~:svg-attrs\",[\"^ \",\"~:fillRule\",\"evenodd\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",128.33333949247913,\"~:y\",-717.6666545867935]],[\"^=\",[\"^ \",\"~:x\",211.6666658719356,\"~:y\",-717.6666545867935]],[\"^=\",[\"^ \",\"~:x\",211.6666658719356,\"~:y\",-634.3333282073353]],[\"^=\",[\"^ \",\"~:x\",128.33333949247913,\"~:y\",-634.3333282073353]]],\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:svg-transform\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:id\",\"~ud0a635f7-639e-80f3-8007-e84b73d53705\",\"~:parent-id\",\"~ud0a635f7-639e-80f3-8007-e84b73d4a494\",\"~:svg-viewbox\",[\"~#rect\",[\"^ \",\"~:x\",5,\"~:y\",5,\"^7\",50,\"~:height\",50,\"~:x1\",5,\"~:y1\",5,\"~:x2\",55,\"~:y2\",55]],\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[[\"^ \",\"~:stroke-color\",\"#6a4a1a\",\"~:stroke-opacity\",1,\"~:stroke-width\",2]],\"~:x\",null,\"~:proportion\",1,\"~:selrect\",[\"^D\",[\"^ \",\"~:x\",128.33333949247913,\"~:y\",-717.6666545867935,\"^7\",83.33332637945648,\"^E\",83.33332637945819,\"^F\",128.33333949247913,\"^G\",-717.6666545867935,\"^H\",211.6666658719356,\"^I\",-634.3333282073353]],\"~:fills\",[[\"^ \",\"~:fill-color\",\"#e2a04a\"]],\"~:flip-x\",null,\"^E\",null,\"~:flip-y\",null]]", + "~ud0a635f7-639e-80f3-8007-e84b73cf1ec2": "[\"~#shape\",[\"^ \",\"~:y\",null,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:content\",[\"~#penpot/path-data\",\"~bAQAAAAAAAAAAAAAAAAAAAAAAAAAAAMtCAOBIxAMAAAAAAMtCnv9FxKKn3UKqqkPEqqr0QqqqQ8QDAAAA29YFQ6qqQ8SrKg9Dnv9FxKsqD0MA4EjEAwAAAKsqD0NhwEvE29YFQ1UVTsSqqvRCVRVOxAMAAACip91CVRVOxAAAy0JhwEvEAADLQgDgSMQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAABV1QZDAOBIxAMAAABV1QZDnv9FxCUpEEOqqkPEqqobQ6qqQ8QDAAAAMCwnQ6qqQ8QAgDBDnv9FxACAMEMA4EjEAwAAAACAMENhwEvEMCwnQ1UVTsSqqhtDVRVOxAMAAAAlKRBDVRVOxFXVBkNhwEvEVdUGQwDgSMQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAABWVexCVZVBxAMAAABWVexC9LQ+xPb8/kIAYDzEAAALQwBgPMQDAAAAhYEWQwBgPMRV1R9D9LQ+xFXVH0NVlUHEAwAAAFXVH0O2dUTEhYEWQ6rKRsQAAAtDqspGxAMAAAD2/P5CqspGxFZV7EK2dUTEVlXsQlWVQcQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"],\"~:name\",\"svg-path\",\"~:width\",null,\"~:type\",\"~:path\",\"~:svg-attrs\",[\"^ \",\"~:fillRule\",\"evenodd\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",101.50000055631006,\"~:y\",-824.3333327174187]],[\"^=\",[\"^ \",\"~:x\",176.4999987681707,\"~:y\",-824.3333327174187]],[\"^=\",[\"^ \",\"~:x\",176.4999987681707,\"~:y\",-753.5000010728836]],[\"^=\",[\"^ \",\"~:x\",101.50000055631006,\"~:y\",-753.5000010728836]]],\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:svg-transform\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:id\",\"~ud0a635f7-639e-80f3-8007-e84b73cf1ec2\",\"~:parent-id\",\"~ud0a635f7-639e-80f3-8007-e84b73ce5ead\",\"~:svg-viewbox\",[\"~#rect\",[\"^ \",\"~:x\",15,\"~:y\",20,\"^7\",90,\"~:height\",85,\"~:x1\",15,\"~:y1\",20,\"~:x2\",105,\"~:y2\",105]],\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[[\"^ \",\"~:stroke-color\",\"#3a1a6a\",\"~:stroke-opacity\",1,\"~:stroke-width\",3]],\"~:x\",null,\"~:proportion\",1,\"~:selrect\",[\"^D\",[\"^ \",\"~:x\",101.50000055631006,\"~:y\",-824.3333327174187,\"^7\",74.99999821186066,\"^E\",70.83333164453506,\"^F\",101.50000055631006,\"^G\",-824.3333327174187,\"^H\",176.4999987681707,\"^I\",-753.5000010728836]],\"~:fills\",[[\"^ \",\"~:fill-color\",\"#9a4ae2\"]],\"~:flip-x\",null,\"^E\",null,\"~:flip-y\",null]]", + "~ud0a635f7-639e-80f3-8007-e84b73bea73d": "[\"~#shape\",[\"^ \",\"~:y\",null,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:content\",[\"~#penpot/path-data\",\"~bAQAAAAAAAAAAAAAAAAAAAAAAAAD//25DAABRxAIAAAAAAAAAAAAAAAAAAAAAAAAAAABVQwDAPMQCAAAAAAAAAAAAAAAAAAAAAAAAAP//jEMAQEnEAgAAAAAAAAAAAAAAAAAAAAAAAAAAAERDAEBJxAIAAAAAAAAAAAAAAAAAAAAAAAAAAICEQwDAPMQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"],\"~:name\",\"svg-path\",\"~:width\",null,\"~:type\",\"~:path\",\"~:svg-attrs\",[\"^ \",\"~:fillRule\",\"evenodd\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",195.99999767541885,\"~:y\",-836]],[\"^=\",[\"^ \",\"~:x\",281.9999822974205,\"~:y\",-836]],[\"^=\",[\"^ \",\"~:x\",281.9999822974205,\"~:y\",-755]],[\"^=\",[\"^ \",\"~:x\",195.99999767541885,\"~:y\",-755]]],\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:svg-transform\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:id\",\"~ud0a635f7-639e-80f3-8007-e84b73bea73d\",\"~:parent-id\",\"~ud0a635f7-639e-80f3-8007-e84b73bdd7da\",\"~:svg-viewbox\",[\"~#rect\",[\"^ \",\"~:x\",7,\"~:y\",5,\"^7\",86,\"~:height\",81,\"~:x1\",7,\"~:y1\",5,\"~:x2\",93,\"~:y2\",86]],\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[[\"^ \",\"~:stroke-color\",\"#6a1a1a\",\"~:stroke-opacity\",1,\"~:stroke-width\",3]],\"~:x\",null,\"~:proportion\",1,\"~:selrect\",[\"^D\",[\"^ \",\"~:x\",195.99999767541885,\"~:y\",-836,\"^7\",85.99998462200165,\"^E\",81,\"^F\",195.99999767541885,\"^G\",-836,\"^H\",281.9999822974205,\"^I\",-755]],\"~:fills\",[[\"^ \",\"~:fill-color\",\"#e24a4a\"]],\"~:flip-x\",null,\"^E\",null,\"~:flip-y\",null]]", + "~ud0a635f7-639e-80f3-8007-e84b73d4e3fc": "[\"~#shape\",[\"^ \",\"~:y\",-725.9999872247394,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:name\",\"base-background\",\"~:width\",99.99999165534774,\"~:type\",\"~:rect\",\"~:svg-attrs\",[\"^ \",\"~:fill\",\"none\",\"~:id\",\"base-background\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",120.0000068545335,\"~:y\",-725.9999872247394]],[\"^<\",[\"^ \",\"~:x\",219.99999850988124,\"~:y\",-725.9999872247394]],[\"^<\",[\"^ \",\"~:x\",219.99999850988124,\"~:y\",-625.9999955693894]],[\"^<\",[\"^ \",\"~:x\",120.0000068545335,\"~:y\",-625.9999955693894]]],\"~:r2\",0,\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:r3\",0,\"~:r1\",0,\"~:hidden\",true,\"^:\",\"~ud0a635f7-639e-80f3-8007-e84b73d4e3fc\",\"~:parent-id\",\"~ud0a635f7-639e-80f3-8007-e84b73d4a494\",\"~:svg-viewbox\",[\"~#rect\",[\"^ \",\"~:x\",0,\"~:y\",0,\"^5\",60,\"~:height\",60,\"~:x1\",0,\"~:y1\",0,\"~:x2\",60,\"~:y2\",60]],\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[],\"~:x\",120.0000068545335,\"~:proportion\",1,\"~:r4\",0,\"~:selrect\",[\"^E\",[\"^ \",\"~:x\",120.0000068545335,\"~:y\",-725.9999872247394,\"^5\",99.99999165534774,\"^F\",99.99999165534996,\"^G\",120.0000068545335,\"^H\",-725.9999872247394,\"^I\",219.99999850988124,\"^J\",-625.9999955693894]],\"~:fills\",[],\"~:flip-x\",null,\"^F\",99.99999165534996,\"~:flip-y\",null]]", + "~ud0a635f7-639e-80f3-8007-e84b73ada09b": "[\"~#shape\",[\"^ \",\"~:y\",-841,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:name\",\"base-background\",\"~:width\",100,\"~:type\",\"~:rect\",\"~:svg-attrs\",[\"^ \",\"~:fill\",\"none\",\"~:id\",\"base-background\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",299,\"~:y\",-841]],[\"^<\",[\"^ \",\"~:x\",399,\"~:y\",-841]],[\"^<\",[\"^ \",\"~:x\",399,\"~:y\",-741]],[\"^<\",[\"^ \",\"~:x\",299,\"~:y\",-741]]],\"~:r2\",0,\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:r3\",0,\"~:r1\",0,\"~:hidden\",true,\"^:\",\"~ud0a635f7-639e-80f3-8007-e84b73ada09b\",\"~:parent-id\",\"~ud0a635f7-639e-80f3-8007-e84b73ad74f4\",\"~:svg-viewbox\",[\"~#rect\",[\"^ \",\"~:x\",0,\"~:y\",0,\"^5\",100,\"~:height\",100,\"~:x1\",0,\"~:y1\",0,\"~:x2\",100,\"~:y2\",100]],\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[],\"~:x\",299,\"~:proportion\",1,\"~:r4\",0,\"~:selrect\",[\"^E\",[\"^ \",\"~:x\",299,\"~:y\",-841,\"^5\",100,\"^F\",100,\"^G\",299,\"^H\",-841,\"^I\",399,\"^J\",-741]],\"~:fills\",[],\"~:flip-x\",null,\"^F\",100,\"~:flip-y\",null]]", + "~ud0a635f7-639e-80f3-8007-e84b73bdd7da": "[\"~#shape\",[\"^ \",\"~:y\",-841,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:name\",\"03-pentagram\",\"~:width\",99.99998211860657,\"~:type\",\"~:group\",\"~:svg-attrs\",[\"^ \",\"^5\",\"100\",\"~:height\",\"100\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",188.9999989271164,\"~:y\",-841]],[\"^;\",[\"^ \",\"~:x\",288.99998104572296,\"~:y\",-841]],[\"^;\",[\"^ \",\"~:x\",288.99998104572296,\"~:y\",-741]],[\"^;\",[\"^ \",\"~:x\",188.9999989271164,\"~:y\",-741]]],\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:id\",\"~ud0a635f7-639e-80f3-8007-e84b73bdd7da\",\"~:parent-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[],\"~:x\",188.9999989271164,\"~:proportion\",1,\"~:selrect\",[\"~#rect\",[\"^ \",\"~:x\",188.9999989271164,\"~:y\",-841,\"^5\",99.99998211860657,\"^9\",100,\"~:x1\",188.9999989271164,\"~:y1\",-841,\"~:x2\",288.99998104572296,\"~:y2\",-741]],\"~:fills\",[],\"~:flip-x\",null,\"^9\",100,\"~:flip-y\",null,\"~:shapes\",[\"~ud0a635f7-639e-80f3-8007-e84b73be6505\",\"~ud0a635f7-639e-80f3-8007-e84b73bea73d\"]]]", + "~ud0a635f7-639e-80f3-8007-e84b739aa576": "[\"~#shape\",[\"^ \",\"~:y\",null,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:content\",[\"~#penpot/path-data\",\"~bAQAAAAAAAAAAAAAAAAAAAAAAAAAAAJpDAAAzxAMAAABN9I5DAAAzxAAAhkPZhS7EAACGQwAAKcQDAAAAAACGQyd6I8RN9I5DAAAfxAAAmkMAAB/EAwAAALMLpUMAAB/EAACuQyd6I8QAAK5DAAApxAMAAAAAAK5D2YUuxLMLpUMAADPEAACaQwAAM8QEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAJpDAAAuxAMAAAAnepRDAAAuxAAAkEPtwivEAACQQwAAKcQDAAAAAACQQxM9JsQnepRDAAAkxAAAmkMAACTEAwAAANmFn0MAACTEAACkQxM9JsQAAKRDAAApxAMAAAAAAKRD7cIrxNmFn0MAAC7EAACaQwAALsQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA\"],\"~:name\",\"svg-path\",\"~:width\",null,\"~:type\",\"~:path\",\"~:svg-attrs\",[\"^ \",\"~:fillRule\",\"evenodd\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",267.9999885559082,\"~:y\",-715.9999912977219]],[\"^=\",[\"^ \",\"~:x\",347.9999885559082,\"~:y\",-715.9999912977219]],[\"^=\",[\"^ \",\"~:x\",347.9999885559082,\"~:y\",-635.9999912977219]],[\"^=\",[\"^ \",\"~:x\",267.9999885559082,\"~:y\",-635.9999912977219]]],\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:svg-transform\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:id\",\"~ud0a635f7-639e-80f3-8007-e84b739aa576\",\"~:parent-id\",\"~ud0a635f7-639e-80f3-8007-e84b7399e693\",\"~:svg-viewbox\",[\"~#rect\",[\"^ \",\"~:x\",10,\"~:y\",10,\"^7\",80,\"~:height\",80,\"~:x1\",10,\"~:y1\",10,\"~:x2\",90,\"~:y2\",90]],\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[[\"^ \",\"~:stroke-color\",\"#1a3a6a\",\"~:stroke-opacity\",1,\"~:stroke-width\",3]],\"~:x\",null,\"~:proportion\",1,\"~:selrect\",[\"^D\",[\"^ \",\"~:x\",267.9999885559082,\"~:y\",-715.9999912977219,\"^7\",80,\"^E\",80,\"^F\",267.9999885559082,\"^G\",-715.9999912977219,\"^H\",347.9999885559082,\"^I\",-635.9999912977219]],\"~:fills\",[[\"^ \",\"~:fill-color\",\"#4a90e2\"]],\"~:flip-x\",null,\"^E\",null,\"~:flip-y\",null]]", + "~ud0a635f7-639e-80f3-8007-e84b73ad74f4": "[\"~#shape\",[\"^ \",\"~:y\",-841,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:name\",\"02-nested-squares\",\"~:width\",100,\"~:type\",\"~:group\",\"~:svg-attrs\",[\"^ \",\"^5\",\"100\",\"~:height\",\"100\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",299,\"~:y\",-841]],[\"^;\",[\"^ \",\"~:x\",399,\"~:y\",-841]],[\"^;\",[\"^ \",\"~:x\",399,\"~:y\",-741]],[\"^;\",[\"^ \",\"~:x\",299,\"~:y\",-741]]],\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:id\",\"~ud0a635f7-639e-80f3-8007-e84b73ad74f4\",\"~:parent-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[],\"~:x\",299,\"~:proportion\",1,\"~:selrect\",[\"~#rect\",[\"^ \",\"~:x\",299,\"~:y\",-841,\"^5\",100,\"^9\",100,\"~:x1\",299,\"~:y1\",-841,\"~:x2\",399,\"~:y2\",-741]],\"~:fills\",[],\"~:flip-x\",null,\"^9\",100,\"~:flip-y\",null,\"~:shapes\",[\"~ud0a635f7-639e-80f3-8007-e84b73ada09b\",\"~ud0a635f7-639e-80f3-8007-e84b73ae0f65\"]]]", + "~ud0a635f7-639e-80f3-8007-e84b73d4a494": "[\"~#shape\",[\"^ \",\"~:y\",-725.9999872247394,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:name\",\"05-person-icon\",\"~:width\",99.99999165534774,\"~:type\",\"~:group\",\"~:svg-attrs\",[\"^ \",\"^5\",\"60\",\"~:height\",\"60\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",120.0000068545335,\"~:y\",-725.9999872247394]],[\"^;\",[\"^ \",\"~:x\",219.99999850988124,\"~:y\",-725.9999872247394]],[\"^;\",[\"^ \",\"~:x\",219.99999850988124,\"~:y\",-625.9999955693894]],[\"^;\",[\"^ \",\"~:x\",120.0000068545335,\"~:y\",-625.9999955693894]]],\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:id\",\"~ud0a635f7-639e-80f3-8007-e84b73d4a494\",\"~:parent-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[],\"~:x\",120.0000068545335,\"~:proportion\",1,\"~:selrect\",[\"~#rect\",[\"^ \",\"~:x\",120.0000068545335,\"~:y\",-725.9999872247394,\"^5\",99.99999165534774,\"^9\",99.99999165534996,\"~:x1\",120.0000068545335,\"~:y1\",-725.9999872247394,\"~:x2\",219.99999850988124,\"~:y2\",-625.9999955693894]],\"~:fills\",[],\"~:flip-x\",null,\"^9\",99.99999165534996,\"~:flip-y\",null,\"~:shapes\",[\"~ud0a635f7-639e-80f3-8007-e84b73d4e3fc\",\"~ud0a635f7-639e-80f3-8007-e84b73d53705\"]]]", + "~ud0a635f7-639e-80f3-8007-e84b7399e693": "[\"~#shape\",[\"^ \",\"~:y\",-725.9999912977219,\"~:transform\",[\"~#matrix\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:rotation\",0,\"~:name\",\"01-ring\",\"~:width\",100,\"~:type\",\"~:group\",\"~:svg-attrs\",[\"^ \",\"^5\",\"100\",\"~:height\",\"100\"],\"~:points\",[[\"~#point\",[\"^ \",\"~:x\",257.9999885559082,\"~:y\",-725.9999912977219]],[\"^;\",[\"^ \",\"~:x\",357.9999885559082,\"~:y\",-725.9999912977219]],[\"^;\",[\"^ \",\"~:x\",357.9999885559082,\"~:y\",-625.9999912977219]],[\"^;\",[\"^ \",\"~:x\",257.9999885559082,\"~:y\",-625.9999912977219]]],\"~:proportion-lock\",false,\"~:transform-inverse\",[\"^2\",[\"^ \",\"~:a\",1.0,\"~:b\",0.0,\"~:c\",0.0,\"~:d\",1.0,\"~:e\",0.0,\"~:f\",0.0]],\"~:id\",\"~ud0a635f7-639e-80f3-8007-e84b7399e693\",\"~:parent-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:svg-defs\",[\"^ \"],\"~:frame-id\",\"~u00000000-0000-0000-0000-000000000000\",\"~:strokes\",[],\"~:x\",257.9999885559082,\"~:proportion\",1,\"~:selrect\",[\"~#rect\",[\"^ \",\"~:x\",257.9999885559082,\"~:y\",-725.9999912977219,\"^5\",100,\"^9\",100,\"~:x1\",257.9999885559082,\"~:y1\",-725.9999912977219,\"~:x2\",357.9999885559082,\"~:y2\",-625.9999912977219]],\"~:fills\",[],\"~:flip-x\",null,\"^9\",100,\"~:flip-y\",null,\"~:shapes\",[\"~ud0a635f7-639e-80f3-8007-e84b739a1146\",\"~ud0a635f7-639e-80f3-8007-e84b739aa576\"]]]" + } + }, + "~:id": "~u3e84615b-5628-818c-8007-e7563bb081fc", + "~:name": "Page 1" + } + }, + "~:id": "~u3e84615b-5628-818c-8007-e7563bb081fb", + "~:options": { "~:components-v2": true, "~:base-font-size": "16px" }, + "~:components": { + "~u7c8614ca-087a-80b1-8007-e75c161f105c": { + "~:path": "Icons / 16", + "~:deleted": true, + "~:main-instance-id": "~u7c8614ca-087a-80b1-8007-e75c161ef12f", + "~:objects": { + "~u7c8614ca-087a-80b1-8007-e75c161ef12f": { + "~#shape": { + "~:y": -622.2015816167936, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:hide-in-viewer": true, + "~:name": "Icons / 16 / profile", + "~:width": 16, + "~:type": "~:frame", + "~:points": [ + { + "~#point": { + "~:x": 185.68057966317429, + "~:y": -622.2015816167936 + } + }, + { + "~#point": { + "~:x": 201.68057966317429, + "~:y": -622.2015816167936 + } + }, + { + "~#point": { + "~:x": 201.68057966317429, + "~:y": -606.2015816167934 + } + }, + { + "~#point": { + "~:x": 185.68057966317429, + "~:y": -606.2015816167934 + } + } + ], + "~:component-root": true, + "~:show-content": true, + "~:proportion-lock": true, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:page-id": "~u34c33767-b561-80aa-8007-e7024082d3b1", + "~:id": "~u7c8614ca-087a-80b1-8007-e75c161ef12f", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:applied-tokens": { + "~:width": "xx.alias.icon.size.s", + "~:height": "xx.alias.icon.size.s" + }, + "~:component-id": "~u7c8614ca-087a-80b1-8007-e75c161f105c", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 185.68057966317429, + "~:main-instance": true, + "~:proportion": 0.999999999999981, + "~:selrect": { + "~#rect": { + "~:x": 185.68057966317429, + "~:y": -622.2015816167936, + "~:width": 16, + "~:height": 16.000000000000227, + "~:x1": 185.68057966317429, + "~:y1": -622.2015816167936, + "~:x2": 201.68057966317429, + "~:y2": -606.2015816167934 + } + }, + "~:fills": [], + "~:flip-x": null, + "~:height": 16.000000000000227, + "~:component-file": "~u3e84615b-5628-818c-8007-e7563bb081fb", + "~:flip-y": null, + "~:shapes": [ + "~u7c8614ca-087a-80b1-8007-e75c161ef130", + "~u7c8614ca-087a-80b1-8007-e75c161ef131" + ] + } + }, + "~u7c8614ca-087a-80b1-8007-e75c161ef130": { + "~#shape": { + "~:y": null, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:content": { + "~#penpot/path-data": "~bAQAAAAAAAAAAAAAAAAAAAAAAAADmWERD5wwaxAMAAADmWERDpa4ZxD4nQ0M9YhnEOq5BQz1iGcQDAAAAMjVAQz1iGcSOAz9Dpa4ZxI4DP0PnDBrEAwAAAI4DP0MpaxrEMjVAQ5G3GsQ6rkFDkbcaxAMAAAA+J0NDkbcaxOZYREMpaxrE5lhEQ+cMGsQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAACOA0ND5wwaxAMAAACOA0NDxd0ZxL5qQkORtxnEOq5BQ5G3GcQDAAAAtvFAQ5G3GcTmWEBDxd0ZxOZYQEPnDBrEAwAAAOZYQEMHPBrEtvFAQz1iGsQ6rkFDPWIaxAMAAAC+akJDPWIaxI4DQ0MHPBrEjgNDQ+cMGsQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "~:name": "svg-path", + "~:width": null, + "~:type": "~:path", + "~:svg-attrs": { + "~:fill-rule": "evenodd", + "~:clip-rule": "evenodd" + }, + "~:points": [ + { + "~#point": { + "~:x": 191.01391299650777, + "~:y": -618.8682482834602 + } + }, + { + "~#point": { + "~:x": 196.34724632984125, + "~:y": -618.8682482834602 + } + }, + { + "~#point": { + "~:x": 196.34724632984125, + "~:y": -613.5349149501269 + } + }, + { + "~#point": { + "~:x": 191.01391299650777, + "~:y": -613.5349149501269 + } + } + ], + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:page-id": "~u34c33767-b561-80aa-8007-e7024082d3b1", + "~:constraints-v": "~:scale", + "~:svg-transform": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + }, + "~:constraints-h": "~:scale", + "~:id": "~u7c8614ca-087a-80b1-8007-e75c161ef130", + "~:parent-id": "~u7c8614ca-087a-80b1-8007-e75c161ef12f", + "~:svg-viewbox": { + "~:y": 5, + "~:y1": 5, + "~:width": 8, + "~:x": 8, + "~:x1": 8, + "~:y2": 13, + "~:x2": 16, + "~:height": 8 + }, + "~:applied-tokens": {}, + "~:svg-defs": {}, + "~:frame-id": "~u7c8614ca-087a-80b1-8007-e75c161ef12f", + "~:strokes": [ + { + "~:stroke-style": "~:solid", + "~:stroke-alignment": "~:inner", + "~:stroke-width": 1, + "~:stroke-color": "#121270", + "~:stroke-opacity": 1 + } + ], + "~:x": null, + "~:proportion": 1, + "~:selrect": { + "~#rect": { + "~:x": 191.01391299650777, + "~:y": -618.8682482834604, + "~:width": 5.333333333333485, + "~:height": 5.3333333333332575, + "~:x1": 191.01391299650777, + "~:y1": -618.8682482834604, + "~:x2": 196.34724632984125, + "~:y2": -613.5349149501271 + } + }, + "~:fills": [], + "~:flip-x": null, + "~:height": null, + "~:flip-y": null + } + }, + "~u7c8614ca-087a-80b1-8007-e75c161ef131": { + "~#shape": { + "~:y": null, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:content": { + "~#penpot/path-data": "~bAQAAAAAAAAAAAAAAAAAAAAAAAAA6rkFDPWIbxAMAAABmoT1DPWIbxOZYOkMbkBrE5lg6Q+eMGcQDAAAA5lg6Q7OJGMRmoT1DkbcXxDquQUORtxfEAwAAAAq7RUORtxfEjgNJQ7OJGMSOA0lD54wZxAMAAACOA0lDG5AaxAq7RUM9YhvEOq5BQz1iG8QCAAAAAAAAAAAAAAAAAAAAAAAAADquQUM9YhvEAQAAAAAAAAAAAAAAAAAAAAAAAAA6rjtD54wZxAMAAAA6rjtDuTMZxNYnPEOj4RjE2vM8Q3WgGMQDAAAAggw+Q0/8GMQyxz9DkTcZxD65QUORNxnEAwAAAM6kQ0ORNxnEdlpFQ9f9GMSac0ZDA6QYxAMAAAD6OEdDneQYxDquR0NVNRnEOq5HQ+eMGcQDAAAAOq5HQ/tgGsSK/kRD5wwbxDquQUPnDBvEAwAAAOpdPkPnDBvEOq47Q/tgGsQ6rjtD54wZxAIAAAAAAAAAAAAAAAAAAAAAAAAAOq47Q+eMGcQBAAAAAAAAAAAAAAAAAAAAAAAAADquQUPnDBjEAwAAAEI/QEPnDBjEVu4+QxMtGMQm5j1DwWIYxAMAAAAuvj5D168YxCokQEM94hjEPrlBQz3iGMQDAAAAQklDQz3iGMRiq0RDFbEYxDaERUOdZRjEAwAAAP55REM5LhjEqiNDQ+cMGMQ6rkFD5wwYxAIAAAAAAAAAAAAAAAAAAAAAAAAAOq5BQ+cMGMQ=" + }, + "~:name": "svg-path", + "~:width": null, + "~:type": "~:path", + "~:svg-attrs": { + "~:fill-rule": "evenodd", + "~:clip-rule": "evenodd" + }, + "~:points": [ + { + "~#point": { + "~:x": 186.34724632984103, + "~:y": -621.5349149501271 + } + }, + { + "~#point": { + "~:x": 201.01391299650777, + "~:y": -621.5349149501271 + } + }, + { + "~#point": { + "~:x": 201.01391299650777, + "~:y": -606.8682482834602 + } + }, + { + "~#point": { + "~:x": 186.34724632984103, + "~:y": -606.8682482834602 + } + } + ], + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:page-id": "~u34c33767-b561-80aa-8007-e7024082d3b1", + "~:constraints-v": "~:scale", + "~:svg-transform": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + }, + "~:constraints-h": "~:scale", + "~:id": "~u7c8614ca-087a-80b1-8007-e75c161ef131", + "~:parent-id": "~u7c8614ca-087a-80b1-8007-e75c161ef12f", + "~:svg-viewbox": { + "~:y": 1, + "~:y1": 1, + "~:width": 22, + "~:x": 1, + "~:x1": 1, + "~:y2": 23, + "~:x2": 23, + "~:height": 22 + }, + "~:applied-tokens": {}, + "~:svg-defs": {}, + "~:frame-id": "~u7c8614ca-087a-80b1-8007-e75c161ef12f", + "~:strokes": [ + { + "~:stroke-style": "~:solid", + "~:stroke-alignment": "~:inner", + "~:stroke-width": 1, + "~:stroke-color": "#121270", + "~:stroke-opacity": 1 + } + ], + "~:x": null, + "~:proportion": 1, + "~:selrect": { + "~#rect": { + "~:x": 186.3472463298408, + "~:y": -621.5349149501271, + "~:width": 14.666666666666742, + "~:height": 14.66666666666697, + "~:x1": 186.3472463298408, + "~:y1": -621.5349149501271, + "~:x2": 201.01391299650754, + "~:y2": -606.8682482834602 + } + }, + "~:fills": [], + "~:flip-x": null, + "~:height": null, + "~:flip-y": null + } + } + }, + "~:name": "profile", + "~:modified-at": "~m1776843284702", + "~:main-instance-page": "~u3e84615b-5628-818c-8007-e7563bb081fc", + "~:id": "~u7c8614ca-087a-80b1-8007-e75c161f105c" + }, + "~u2094e2d4-1854-804d-8007-e761fd29d15c": { + "~:path": "Icons / 16", + "~:deleted": true, + "~:main-instance-id": "~u2094e2d4-1854-804d-8007-e761fd24f93e", + "~:objects": { + "~u2094e2d4-1854-804d-8007-e761fd24f93e": { + "~#shape": { + "~:y": -623.0000079548252, + "~:hide-fill-on-export": false, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:hide-in-viewer": true, + "~:name": "Icons / 16 / profile", + "~:width": 16, + "~:type": "~:frame", + "~:points": [ + { + "~#point": { + "~:x": 214.0000008841555, + "~:y": -623.0000079548252 + } + }, + { + "~#point": { + "~:x": 230.0000008841555, + "~:y": -623.0000079548252 + } + }, + { + "~#point": { + "~:x": 230.0000008841555, + "~:y": -607.0000079548249 + } + }, + { + "~#point": { + "~:x": 214.0000008841555, + "~:y": -607.0000079548249 + } + } + ], + "~:component-root": true, + "~:show-content": true, + "~:proportion-lock": true, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:page-id": "~u34c33767-b561-80aa-8007-e7024082d3b1", + "~:id": "~u2094e2d4-1854-804d-8007-e761fd24f93e", + "~:parent-id": "~u00000000-0000-0000-0000-000000000000", + "~:applied-tokens": { + "~:width": "xx.alias.icon.size.s", + "~:height": "xx.alias.icon.size.s" + }, + "~:component-id": "~u2094e2d4-1854-804d-8007-e761fd29d15c", + "~:frame-id": "~u00000000-0000-0000-0000-000000000000", + "~:strokes": [], + "~:x": 214.0000008841555, + "~:main-instance": true, + "~:proportion": 0.999999999999981, + "~:selrect": { + "~#rect": { + "~:x": 214.0000008841555, + "~:y": -623.0000079548252, + "~:width": 16, + "~:height": 16.000000000000227, + "~:x1": 214.0000008841555, + "~:y1": -623.0000079548252, + "~:x2": 230.0000008841555, + "~:y2": -607.0000079548249 + } + }, + "~:fills": [], + "~:flip-x": null, + "~:height": 16.000000000000227, + "~:component-file": "~u3e84615b-5628-818c-8007-e7563bb081fb", + "~:flip-y": null, + "~:shapes": [ + "~u2094e2d4-1854-804d-8007-e761fd24f93f", + "~u2094e2d4-1854-804d-8007-e761fd24f940" + ] + } + }, + "~u2094e2d4-1854-804d-8007-e761fd24f93f": { + "~#shape": { + "~:y": null, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:content": { + "~#penpot/path-data": "~bAQAAAAAAAAAAAAAAAAAAAAAAAACrqmBDAEAaxAMAAACrqmBDvuEZxAN5X0NWlRnE//9dQ1aVGcQDAAAA94ZcQ1aVGcRTVVtDvuEZxFNVW0MAQBrEAwAAAFNVW0NCnhrE94ZcQ6rqGsT//11DquoaxAMAAAADeV9DquoaxKuqYENCnhrEq6pgQwBAGsQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAABTVV9DAEAaxAMAAABTVV9D3hAaxIO8XkOq6hnE//9dQ6rqGcQDAAAAe0NdQ6rqGcSrqlxD3hAaxKuqXEMAQBrEAwAAAKuqXEMgbxrEe0NdQ1aVGsT//11DVpUaxAMAAACDvF5DVpUaxFNVX0MgbxrEU1VfQwBAGsQEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA" + }, + "~:name": "svg-path", + "~:width": null, + "~:type": "~:path", + "~:svg-attrs": { + "~:fill-rule": "evenodd", + "~:clip-rule": "evenodd" + }, + "~:points": [ + { + "~#point": { + "~:x": 219.33333421748898, + "~:y": -619.6666746214917 + } + }, + { + "~#point": { + "~:x": 224.66666755082247, + "~:y": -619.6666746214917 + } + }, + { + "~#point": { + "~:x": 224.66666755082247, + "~:y": -614.3333412881584 + } + }, + { + "~#point": { + "~:x": 219.33333421748898, + "~:y": -614.3333412881584 + } + } + ], + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:page-id": "~u34c33767-b561-80aa-8007-e7024082d3b1", + "~:constraints-v": "~:scale", + "~:svg-transform": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + }, + "~:constraints-h": "~:scale", + "~:id": "~u2094e2d4-1854-804d-8007-e761fd24f93f", + "~:parent-id": "~u2094e2d4-1854-804d-8007-e761fd24f93e", + "~:svg-viewbox": { + "~:y": 5, + "~:y1": 5, + "~:width": 8, + "~:x": 8, + "~:x1": 8, + "~:y2": 13, + "~:x2": 16, + "~:height": 8 + }, + "~:applied-tokens": {}, + "~:svg-defs": {}, + "~:frame-id": "~u2094e2d4-1854-804d-8007-e761fd24f93e", + "~:strokes": [ + { + "~:stroke-style": "~:solid", + "~:stroke-alignment": "~:inner", + "~:stroke-width": 1, + "~:stroke-color": "#121270", + "~:stroke-opacity": 1 + } + ], + "~:x": null, + "~:proportion": 1, + "~:selrect": { + "~#rect": { + "~:x": 219.33333421748898, + "~:y": -619.6666746214919, + "~:width": 5.333333333333485, + "~:height": 5.3333333333332575, + "~:x1": 219.33333421748898, + "~:y1": -619.6666746214919, + "~:x2": 224.66666755082247, + "~:y2": -614.3333412881586 + } + }, + "~:fills": [], + "~:flip-x": null, + "~:height": null, + "~:flip-y": null + } + }, + "~u2094e2d4-1854-804d-8007-e761fd24f940": { + "~#shape": { + "~:y": null, + "~:transform": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:rotation": 0, + "~:content": { + "~#penpot/path-data": "~bAQAAAAAAAAAAAAAAAAAAAAAAAAD//11DVpUbxAMAAAAr81lDVpUbxKuqVkM0wxrEq6pWQwDAGcQDAAAAq6pWQ8y8GMQr81lDquoXxP//XUOq6hfEAwAAAM8MYkOq6hfEU1VlQ8y8GMRTVWVDAMAZxAMAAABTVWVDNMMaxM8MYkNWlRvE//9dQ1aVG8QCAAAAAAAAAAAAAAAAAAAAAAAAAP//XUNWlRvEAQAAAAAAAAAAAAAAAAAAAAAAAAD//1dDAMAZxAMAAAD//1dD0mYZxJt5WEO8FBnEn0VZQ47TGMQDAAAAR15aQ2gvGcT3GFxDqmoZxAMLXkOqahnEAwAAAJP2X0OqahnEO6xhQ/AwGcRfxWJDHNcYxAMAAAC/imNDthcZxP//Y0NuaBnE//9jQwDAGcQDAAAA//9jQxSUGsRPUGFDAEAbxP//XUMAQBvEAwAAAK+vWkMAQBvE//9XQxSUGsT//1dDAMAZxAIAAAAAAAAAAAAAAAAAAAAAAAAA//9XQwDAGcQBAAAAAAAAAAAAAAAAAAAAAAAAAP//XUMAQBjEAwAAAAeRXEMAQBjEG0BbQyxgGMTrN1pD2pUYxAMAAADzD1tD8OIYxO91XENWFRnEAwteQ1YVGcQDAAAAB5tfQ1YVGcQn/WBDLuQYxPvVYUO2mBjEAwAAAMPLYENSYRjEb3VfQwBAGMT//11DAEAYxAIAAAAAAAAAAAAAAAAAAAAAAAAA//9dQwBAGMQ=" + }, + "~:name": "svg-path", + "~:width": null, + "~:type": "~:path", + "~:svg-attrs": { + "~:fill-rule": "evenodd", + "~:clip-rule": "evenodd" + }, + "~:points": [ + { + "~#point": { + "~:x": 214.66666755082224, + "~:y": -622.3333412881586 + } + }, + { + "~#point": { + "~:x": 229.33333421748898, + "~:y": -622.3333412881586 + } + }, + { + "~#point": { + "~:x": 229.33333421748898, + "~:y": -607.6666746214917 + } + }, + { + "~#point": { + "~:x": 214.66666755082224, + "~:y": -607.6666746214917 + } + } + ], + "~:proportion-lock": false, + "~:transform-inverse": { + "~#matrix": { + "~:a": 1.0, + "~:b": 0.0, + "~:c": 0.0, + "~:d": 1.0, + "~:e": 0.0, + "~:f": 0.0 + } + }, + "~:page-id": "~u34c33767-b561-80aa-8007-e7024082d3b1", + "~:constraints-v": "~:scale", + "~:svg-transform": { + "~:a": 1, + "~:b": 0, + "~:c": 0, + "~:d": 1, + "~:e": 0, + "~:f": 0 + }, + "~:constraints-h": "~:scale", + "~:id": "~u2094e2d4-1854-804d-8007-e761fd24f940", + "~:parent-id": "~u2094e2d4-1854-804d-8007-e761fd24f93e", + "~:svg-viewbox": { + "~:y": 1, + "~:y1": 1, + "~:width": 22, + "~:x": 1, + "~:x1": 1, + "~:y2": 23, + "~:x2": 23, + "~:height": 22 + }, + "~:applied-tokens": {}, + "~:svg-defs": {}, + "~:frame-id": "~u2094e2d4-1854-804d-8007-e761fd24f93e", + "~:strokes": [ + { + "~:stroke-style": "~:solid", + "~:stroke-alignment": "~:inner", + "~:stroke-width": 1, + "~:stroke-color": "#121270", + "~:stroke-opacity": 1 + } + ], + "~:x": null, + "~:proportion": 1, + "~:selrect": { + "~#rect": { + "~:x": 214.666667550822, + "~:y": -622.3333412881586, + "~:width": 14.666666666666742, + "~:height": 14.66666666666697, + "~:x1": 214.666667550822, + "~:y1": -622.3333412881586, + "~:x2": 229.33333421748875, + "~:y2": -607.6666746214917 + } + }, + "~:fills": [], + "~:flip-x": null, + "~:height": null, + "~:flip-y": null + } + } + }, + "~:name": "profile", + "~:modified-at": "~m1776782297854", + "~:main-instance-page": "~u3e84615b-5628-818c-8007-e7563bb081fc", + "~:id": "~u2094e2d4-1854-804d-8007-e761fd29d15c" + } + } + } +} diff --git a/frontend/playwright/ui/render-wasm-specs/shapes.spec.js b/frontend/playwright/ui/render-wasm-specs/shapes.spec.js index 21fb267806..55158b9564 100644 --- a/frontend/playwright/ui/render-wasm-specs/shapes.spec.js +++ b/frontend/playwright/ui/render-wasm-specs/shapes.spec.js @@ -243,6 +243,22 @@ test("Renders a file with a closed path shape with multiple segments using strok await expect(workspace.canvas).toHaveScreenshot(); }); +test("Renders svg paths with evenodd", async ({ + page, +}) => { + const workspace = new WasmWorkspacePage(page); + await workspace.setupEmptyFile(); + await workspace.mockGetFile("render-wasm/get-file-paths-evenodd.json"); + + await workspace.goToWorkspace({ + id: "3e84615b-5628-818c-8007-e7563bb081fb", + pageId: "u3e84615b-5628-818c-8007-e7563bb081fc", + }); + await workspace.waitForFirstRenderWithoutUI(); + + await expect(workspace.canvas).toHaveScreenshot(); +}); + test("Renders solid shadows after select all and zoom to selected", async ({ page, }) => { diff --git a/frontend/playwright/ui/render-wasm-specs/shapes.spec.js-snapshots/Renders-svg-paths-with-evenodd-1.png b/frontend/playwright/ui/render-wasm-specs/shapes.spec.js-snapshots/Renders-svg-paths-with-evenodd-1.png new file mode 100644 index 0000000000000000000000000000000000000000..64617666a1e60cfd3531326a1c64486f705f193d GIT binary patch literal 23531 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, shadow: Option<&ImageFilter>, blur: Option<&ImageFilter>, + svg_attrs: Option<&SvgAttrs>, antialias: bool, ) { let is_open = path.is_open(); @@ -229,7 +231,7 @@ fn draw_stroke_on_path( if let Some(pt) = path_transform { canvas.concat(pt); } - let skia_path = path.to_skia_path(); + let skia_path = path.to_skia_path(svg_attrs); match stroke.render_kind(is_open) { StrokeKind::Inner => { @@ -510,7 +512,7 @@ fn draw_image_stroke_in_container( if let Some(p) = shape_type.path() { canvas.save(); - let path = p.to_skia_path().make_transform( + let path = p.to_skia_path(svg_attrs).make_transform( &path_transform.ok_or(Error::CriticalError("No path transform".to_string()))?, ); let stroke_kind = stroke.render_kind(p.is_open()); @@ -574,7 +576,7 @@ fn draw_image_stroke_in_container( // Clear outer stroke for paths if necessary. When adding an outer stroke we need to empty the stroke added too in the inner area. if let Type::Path(p) = &shape.shape_type { if stroke.render_kind(p.is_open()) == StrokeKind::Outer { - let path = p.to_skia_path().make_transform( + let path = p.to_skia_path(svg_attrs).make_transform( &path_transform.ok_or(Error::CriticalError("No path transform".to_string()))?, ); let mut clear_paint = skia::Paint::default(); @@ -846,6 +848,7 @@ fn render_merged( path_transform.as_ref(), None, blur_filter.as_ref(), + svg_attrs, antialias, ); } @@ -1016,6 +1019,7 @@ fn render_single_internal( path_transform.as_ref(), shadow, blur.as_ref(), + svg_attrs, antialias, ); } diff --git a/render-wasm/src/shapes.rs b/render-wasm/src/shapes.rs index 9e17de41ee..98c2d13c9c 100644 --- a/render-wasm/src/shapes.rs +++ b/render-wasm/src/shapes.rs @@ -1349,15 +1349,10 @@ impl Shape { pub fn get_skia_path(&self) -> Option { if let Some(path) = self.shape_type.path() { - let mut skia_path = path.to_skia_path(); + let mut skia_path = path.to_skia_path(self.svg_attrs.as_ref()); if let Some(path_transform) = self.to_path_transform() { skia_path = skia_path.make_transform(&path_transform); } - if let Some(svg_attrs) = &self.svg_attrs { - if svg_attrs.fill_rule == FillRule::Evenodd { - skia_path.set_fill_type(skia::PathFillType::EvenOdd); - } - } Some(skia_path) } else { None diff --git a/render-wasm/src/shapes/paths.rs b/render-wasm/src/shapes/paths.rs index 2debf44958..40d0d80067 100644 --- a/render-wasm/src/shapes/paths.rs +++ b/render-wasm/src/shapes/paths.rs @@ -1,6 +1,7 @@ use skia_safe::{self as skia, Matrix}; use crate::math; +use crate::shapes::svg_attrs::{FillRule, SvgAttrs}; mod subpaths; @@ -217,8 +218,14 @@ impl Path { Path::new(segments) } - pub fn to_skia_path(&self) -> skia::Path { - self.skia_path.snapshot() + pub fn to_skia_path(&self, svg_attrs: Option<&SvgAttrs>) -> skia::Path { + let mut path = self.skia_path.snapshot(); + if let Some(attrs) = svg_attrs { + if attrs.fill_rule == FillRule::Evenodd { + path.set_fill_type(skia::PathFillType::EvenOdd); + } + } + path } pub fn contains(&self, p: skia::Point) -> bool { diff --git a/render-wasm/src/shapes/stroke_paths.rs b/render-wasm/src/shapes/stroke_paths.rs index 14f9c09229..f98c01ca0f 100644 --- a/render-wasm/src/shapes/stroke_paths.rs +++ b/render-wasm/src/shapes/stroke_paths.rs @@ -17,7 +17,7 @@ pub fn stroke_to_path( selrect: &Rect, svg_attrs: Option<&SvgAttrs>, ) -> Option { - let skia_shape_path = shape_path.to_skia_path(); + let skia_shape_path = shape_path.to_skia_path(svg_attrs); let transformed_shape_path = if let Some(pt) = path_transform { skia_shape_path.make_transform(pt)