From bfed9520fcaf0795ca2ed09fb0fd6758f492ea0e Mon Sep 17 00:00:00 2001 From: Daniel Collin Date: Sun, 19 Jan 2025 15:15:32 +0100 Subject: [PATCH 1/3] SetMesureText and SetQueryScrollOffset takes userData --- clay.h | 32 +++++++++++-------- examples/SDL2-video-demo/main.c | 12 ++++--- examples/SDL3-simple-demo/main.c | 6 ++-- examples/introducing-clay-video-demo/main.c | 2 +- examples/raylib-multi-context/main.c | 2 +- .../raylib-sidebar-scrolling-container/main.c | 2 +- renderers/SDL2/clay_renderer_SDL2.c | 11 ++++--- renderers/raylib/clay_renderer_raylib.c | 2 +- 8 files changed, 41 insertions(+), 28 deletions(-) diff --git a/clay.h b/clay.h index df42f876..23cbef65 100644 --- a/clay.h +++ b/clay.h @@ -1,4 +1,4 @@ -// VERSION: 0.11 +// VERSION: 0.12 /* NOTE: In order to use this library you must define @@ -527,8 +527,8 @@ bool Clay_Hovered(void); void Clay_OnHover(void (*onHoverFunction)(Clay_ElementId elementId, Clay_PointerData pointerData, intptr_t userData), intptr_t userData); bool Clay_PointerOver(Clay_ElementId elementId); Clay_ScrollContainerData Clay_GetScrollContainerData(Clay_ElementId id); -void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_String *text, Clay_TextElementConfig *config)); -void Clay_SetQueryScrollOffsetFunction(Clay_Vector2 (*queryScrollOffsetFunction)(uint32_t elementId)); +void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData), uintptr_t userData); +void Clay_SetQueryScrollOffsetFunction(Clay_Vector2 (*queryScrollOffsetFunction)(uint32_t elementId, uintptr_t userData), uintptr_t userData); Clay_RenderCommand * Clay_RenderCommandArray_Get(Clay_RenderCommandArray* array, int32_t index); void Clay_SetDebugModeEnabled(bool enabled); bool Clay_IsDebugModeEnabled(void); @@ -1407,6 +1407,8 @@ struct Clay_Context { uint32_t debugSelectedElementId; uint32_t generation; uintptr_t arenaResetOffset; + uintptr_t mesureTextUserData; + uintptr_t queryScrollOffsetUserData; Clay_Arena internalArena; // Layout Elements / Render Commands Clay_LayoutElementArray layoutElements; @@ -1480,11 +1482,11 @@ Clay_String Clay__WriteStringToCharBuffer(Clay__CharArray *buffer, Clay_String s } #ifdef CLAY_WASM - __attribute__((import_module("clay"), import_name("measureTextFunction"))) Clay_Dimensions Clay__MeasureText(Clay_String *text, Clay_TextElementConfig *config); - __attribute__((import_module("clay"), import_name("queryScrollOffsetFunction"))) Clay_Vector2 Clay__QueryScrollOffset(uint32_t elementId); + __attribute__((import_module("clay"), import_name("measureTextFunction"))) Clay_Dimensions Clay__MeasureText(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData); + __attribute__((import_module("clay"), import_name("queryScrollOffsetFunction"))) Clay_Vector2 Clay__QueryScrollOffset(uint32_t elementId, uintptr_t userData); #else - Clay_Dimensions (*Clay__MeasureText)(Clay_String *text, Clay_TextElementConfig *config); - Clay_Vector2 (*Clay__QueryScrollOffset)(uint32_t elementId); + Clay_Dimensions (*Clay__MeasureText)(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData); + Clay_Vector2 (*Clay__QueryScrollOffset)(uint32_t elementId, uintptr_t userData); #endif Clay_LayoutElement* Clay__GetOpenLayoutElement(void) { @@ -1699,7 +1701,7 @@ Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_Text float lineWidth = 0; float measuredWidth = 0; float measuredHeight = 0; - float spaceWidth = Clay__MeasureText(&CLAY__SPACECHAR, config).width; + float spaceWidth = Clay__MeasureText(&CLAY__SPACECHAR, config, context->mesureTextUserData).width; Clay__MeasuredWord tempWord = { .next = -1 }; Clay__MeasuredWord *previousWord = &tempWord; while (end < text->length) { @@ -1717,7 +1719,7 @@ Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_Text if (current == ' ' || current == '\n') { int32_t length = end - start; Clay_String word = { .length = length, .chars = &text->chars[start] }; - Clay_Dimensions dimensions = Clay__MeasureText(&word, config); + Clay_Dimensions dimensions = Clay__MeasureText(&word, config, context->mesureTextUserData); measuredHeight = CLAY__MAX(measuredHeight, dimensions.height); if (current == ' ') { dimensions.width += spaceWidth; @@ -1740,7 +1742,7 @@ Clay__MeasureTextCacheItem *Clay__MeasureTextCached(Clay_String *text, Clay_Text } if (end - start > 0) { Clay_String lastWord = { .length = end - start, .chars = &text->chars[start] }; - Clay_Dimensions dimensions = Clay__MeasureText(&lastWord, config); + Clay_Dimensions dimensions = Clay__MeasureText(&lastWord, config, context->mesureTextUserData); Clay__AddMeasuredWord(CLAY__INIT(Clay__MeasuredWord) { .startOffset = start, .length = end - start, .width = dimensions.width, .next = -1 }, previousWord); lineWidth += dimensions.width; measuredHeight = CLAY__MAX(measuredHeight, dimensions.height); @@ -1902,7 +1904,7 @@ void Clay__ElementPostConfiguration(void) { scrollOffset = Clay__ScrollContainerDataInternalArray_Add(&context->scrollContainerDatas, CLAY__INIT(Clay__ScrollContainerDataInternal){.layoutElement = openLayoutElement, .scrollOrigin = {-1,-1}, .elementId = openLayoutElement->id, .openThisFrame = true}); } if (context->externalScrollHandlingEnabled) { - scrollOffset->scrollPosition = Clay__QueryScrollOffset(scrollOffset->elementId); + scrollOffset->scrollPosition = Clay__QueryScrollOffset(scrollOffset->elementId, context->queryScrollOffsetUserData); } break; } @@ -3678,11 +3680,15 @@ Clay_Arena Clay_CreateArenaWithCapacityAndMemory(uint32_t capacity, void *offset } #ifndef CLAY_WASM -void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_String *text, Clay_TextElementConfig *config)) { +void Clay_SetMeasureTextFunction(Clay_Dimensions (*measureTextFunction)(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData), uintptr_t userData) { + Clay_Context* context = Clay_GetCurrentContext(); Clay__MeasureText = measureTextFunction; + context->mesureTextUserData = userData; } -void Clay_SetQueryScrollOffsetFunction(Clay_Vector2 (*queryScrollOffsetFunction)(uint32_t elementId)) { +void Clay_SetQueryScrollOffsetFunction(Clay_Vector2 (*queryScrollOffsetFunction)(uint32_t elementId, uintptr_t userData), uintptr_t userData) { + Clay_Context* context = Clay_GetCurrentContext(); Clay__QueryScrollOffset = queryScrollOffsetFunction; + context->queryScrollOffsetUserData = userData; } #endif diff --git a/examples/SDL2-video-demo/main.c b/examples/SDL2-video-demo/main.c index 3bcd24d2..e8c3413e 100644 --- a/examples/SDL2-video-demo/main.c +++ b/examples/SDL2-video-demo/main.c @@ -299,7 +299,10 @@ int main(int argc, char *argv[]) { fprintf(stderr, "Error: could not load font: %s\n", TTF_GetError()); return 1; } - SDL2_fonts[FONT_ID_BODY_16] = (SDL2_Font) { + + SDL2_Font fonts[1] = {}; + + fonts[FONT_ID_BODY_16] = (SDL2_Font) { .fontId = FONT_ID_BODY_16, .font = font, }; @@ -315,12 +318,13 @@ int main(int argc, char *argv[]) { uint64_t totalMemorySize = Clay_MinMemorySize(); Clay_Arena clayMemory = Clay_CreateArenaWithCapacityAndMemory(totalMemorySize, malloc(totalMemorySize)); - Clay_SetMeasureTextFunction(SDL2_MeasureText); - int windowWidth = 0; int windowHeight = 0; SDL_GetWindowSize(window, &windowWidth, &windowHeight); Clay_Initialize(clayMemory, (Clay_Dimensions) { (float)windowWidth, (float)windowHeight }, (Clay_ErrorHandler) { HandleClayErrors }); + + Clay_SetMeasureTextFunction(SDL2_MeasureText, (uintptr_t)&fonts); + Uint64 NOW = SDL_GetPerformanceCounter(); Uint64 LAST = 0; double deltaTime = 0; @@ -361,7 +365,7 @@ int main(int argc, char *argv[]) { SDL_SetRenderDrawColor(renderer, 0, 0, 0, 255); SDL_RenderClear(renderer); - Clay_SDL2_Render(renderer, renderCommands); + Clay_SDL2_Render(renderer, renderCommands, fonts); SDL_RenderPresent(renderer); } diff --git a/examples/SDL3-simple-demo/main.c b/examples/SDL3-simple-demo/main.c index e2d7fb60..a1bfd157 100644 --- a/examples/SDL3-simple-demo/main.c +++ b/examples/SDL3-simple-demo/main.c @@ -21,8 +21,10 @@ typedef struct app_state { SDL_Renderer *renderer; } AppState; -static inline Clay_Dimensions SDL_MeasureText(Clay_String *text, Clay_TextElementConfig *config) +static inline Clay_Dimensions SDL_MeasureText(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData) { + + TTF_Font *font = gFonts[config->fontId]; int width, height; @@ -114,7 +116,7 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) int width, height; SDL_GetWindowSize(state->window, &width, &height); - Clay_SetMeasureTextFunction(SDL_MeasureText); + Clay_SetMeasureTextFunction(SDL_MeasureText, 0); Clay_Initialize(clayMemory, (Clay_Dimensions) { (float) width, (float) height }, (Clay_ErrorHandler) { HandleClayErrors }); *appstate = state; diff --git a/examples/introducing-clay-video-demo/main.c b/examples/introducing-clay-video-demo/main.c index 9f6d526c..2e7b2274 100644 --- a/examples/introducing-clay-video-demo/main.c +++ b/examples/introducing-clay-video-demo/main.c @@ -84,7 +84,7 @@ int main(void) { .width = GetScreenWidth(), .height = GetScreenHeight() }, (Clay_ErrorHandler) { HandleClayErrors }); // This final argument is new since the video was published - Clay_SetMeasureTextFunction(Raylib_MeasureText); + Clay_SetMeasureTextFunction(Raylib_MeasureText, 0); Raylib_fonts[FONT_ID_BODY_16] = (Raylib_Font) { .font = LoadFontEx("resources/Roboto-Regular.ttf", 48, 0, 400), .fontId = FONT_ID_BODY_16 diff --git a/examples/raylib-multi-context/main.c b/examples/raylib-multi-context/main.c index 7ae697a0..84904475 100644 --- a/examples/raylib-multi-context/main.c +++ b/examples/raylib-multi-context/main.c @@ -247,7 +247,7 @@ int main(void) { .height = GetScreenHeight() / 2 }, (Clay_ErrorHandler) { HandleClayErrors }); // This final argument is new since the video was published - Clay_SetMeasureTextFunction(Raylib_MeasureText); + Clay_SetMeasureTextFunction(Raylib_MeasureText, 0); Raylib_fonts[FONT_ID_BODY_16] = (Raylib_Font) { .font = LoadFontEx("resources/Roboto-Regular.ttf", 48, 0, 400), .fontId = FONT_ID_BODY_16 diff --git a/examples/raylib-sidebar-scrolling-container/main.c b/examples/raylib-sidebar-scrolling-container/main.c index b7d7ec46..630eaa02 100644 --- a/examples/raylib-sidebar-scrolling-container/main.c +++ b/examples/raylib-sidebar-scrolling-container/main.c @@ -218,7 +218,7 @@ void HandleClayErrors(Clay_ErrorData errorData) { int main(void) { uint64_t totalMemorySize = Clay_MinMemorySize(); Clay_Arena clayMemory = Clay_CreateArenaWithCapacityAndMemory(totalMemorySize, malloc(totalMemorySize)); - Clay_SetMeasureTextFunction(Raylib_MeasureText); + Clay_SetMeasureTextFunction(Raylib_MeasureText, 0); Clay_Initialize(clayMemory, (Clay_Dimensions) { (float)GetScreenWidth(), (float)GetScreenHeight() }, (Clay_ErrorHandler) { HandleClayErrors }); Clay_Raylib_Initialize(1024, 768, "Clay - Raylib Renderer Example", FLAG_VSYNC_HINT | FLAG_WINDOW_RESIZABLE | FLAG_WINDOW_HIGHDPI | FLAG_MSAA_4X_HINT); profilePicture = LoadTextureFromImage(LoadImage("resources/profile-picture.png")); diff --git a/renderers/SDL2/clay_renderer_SDL2.c b/renderers/SDL2/clay_renderer_SDL2.c index 30eb8a4c..c78a9163 100644 --- a/renderers/SDL2/clay_renderer_SDL2.c +++ b/renderers/SDL2/clay_renderer_SDL2.c @@ -12,11 +12,12 @@ typedef struct TTF_Font *font; } SDL2_Font; -static SDL2_Font SDL2_fonts[1]; -static Clay_Dimensions SDL2_MeasureText(Clay_String *text, Clay_TextElementConfig *config) +static Clay_Dimensions SDL2_MeasureText(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData) { - TTF_Font *font = SDL2_fonts[config->fontId].font; + SDL2_Font *fonts = (SDL2_Font*)userData; + + TTF_Font *font = fonts[config->fontId].font; char *chars = (char *)calloc(text->length + 1, 1); memcpy(chars, text->chars, text->length); int width = 0; @@ -34,7 +35,7 @@ static Clay_Dimensions SDL2_MeasureText(Clay_String *text, Clay_TextElementConfi SDL_Rect currentClippingRectangle; -static void Clay_SDL2_Render(SDL_Renderer *renderer, Clay_RenderCommandArray renderCommands) +static void Clay_SDL2_Render(SDL_Renderer *renderer, Clay_RenderCommandArray renderCommands, SDL2_Font *fonts) { for (uint32_t i = 0; i < renderCommands.length; i++) { @@ -60,7 +61,7 @@ static void Clay_SDL2_Render(SDL_Renderer *renderer, Clay_RenderCommandArray ren Clay_String text = renderCommand->text; char *cloned = (char *)calloc(text.length + 1, 1); memcpy(cloned, text.chars, text.length); - TTF_Font* font = SDL2_fonts[config->fontId].font; + TTF_Font* font = fonts[config->fontId].font; SDL_Surface *surface = TTF_RenderUTF8_Blended(font, cloned, (SDL_Color) { .r = (Uint8)config->textColor.r, .g = (Uint8)config->textColor.g, diff --git a/renderers/raylib/clay_renderer_raylib.c b/renderers/raylib/clay_renderer_raylib.c index 0fe545a6..4fc4bd94 100644 --- a/renderers/raylib/clay_renderer_raylib.c +++ b/renderers/raylib/clay_renderer_raylib.c @@ -89,7 +89,7 @@ Ray GetScreenToWorldPointWithZDistance(Vector2 position, Camera camera, int scre uint32_t measureCalls = 0; -static inline Clay_Dimensions Raylib_MeasureText(Clay_String *text, Clay_TextElementConfig *config) { +static inline Clay_Dimensions Raylib_MeasureText(Clay_String *text, Clay_TextElementConfig *config, uintptr_t userData) { measureCalls++; // Measure string size for Font Clay_Dimensions textSize = { 0 }; From 49b46a007b7b28c464ab482d8cfade62ae4b9d73 Mon Sep 17 00:00:00 2001 From: Daniel Collin Date: Sun, 19 Jan 2025 15:21:11 +0100 Subject: [PATCH 2/3] Fixed init ordering --- examples/SDL3-simple-demo/main.c | 2 +- examples/raylib-sidebar-scrolling-container/main.c | 2 +- renderers/cairo/clay_renderer_cairo.c | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/SDL3-simple-demo/main.c b/examples/SDL3-simple-demo/main.c index a1bfd157..4e74ab56 100644 --- a/examples/SDL3-simple-demo/main.c +++ b/examples/SDL3-simple-demo/main.c @@ -116,8 +116,8 @@ SDL_AppResult SDL_AppInit(void **appstate, int argc, char *argv[]) int width, height; SDL_GetWindowSize(state->window, &width, &height); - Clay_SetMeasureTextFunction(SDL_MeasureText, 0); Clay_Initialize(clayMemory, (Clay_Dimensions) { (float) width, (float) height }, (Clay_ErrorHandler) { HandleClayErrors }); + Clay_SetMeasureTextFunction(SDL_MeasureText, 0); *appstate = state; return SDL_APP_CONTINUE; diff --git a/examples/raylib-sidebar-scrolling-container/main.c b/examples/raylib-sidebar-scrolling-container/main.c index 630eaa02..1b486d72 100644 --- a/examples/raylib-sidebar-scrolling-container/main.c +++ b/examples/raylib-sidebar-scrolling-container/main.c @@ -218,8 +218,8 @@ void HandleClayErrors(Clay_ErrorData errorData) { int main(void) { uint64_t totalMemorySize = Clay_MinMemorySize(); Clay_Arena clayMemory = Clay_CreateArenaWithCapacityAndMemory(totalMemorySize, malloc(totalMemorySize)); - Clay_SetMeasureTextFunction(Raylib_MeasureText, 0); Clay_Initialize(clayMemory, (Clay_Dimensions) { (float)GetScreenWidth(), (float)GetScreenHeight() }, (Clay_ErrorHandler) { HandleClayErrors }); + Clay_SetMeasureTextFunction(Raylib_MeasureText, 0); Clay_Raylib_Initialize(1024, 768, "Clay - Raylib Renderer Example", FLAG_VSYNC_HINT | FLAG_WINDOW_RESIZABLE | FLAG_WINDOW_HIGHDPI | FLAG_MSAA_4X_HINT); profilePicture = LoadTextureFromImage(LoadImage("resources/profile-picture.png")); Raylib_fonts[FONT_ID_BODY_24] = (Raylib_Font) { diff --git a/renderers/cairo/clay_renderer_cairo.c b/renderers/cairo/clay_renderer_cairo.c index 5fceffbf..c8e3c16b 100644 --- a/renderers/cairo/clay_renderer_cairo.c +++ b/renderers/cairo/clay_renderer_cairo.c @@ -83,7 +83,7 @@ static inline char *Clay_Cairo__NullTerminate(Clay_String *str) { } // Measure text using cairo's *toy* text API. -static inline Clay_Dimensions Clay_Cairo_MeasureText(Clay_String *str, Clay_TextElementConfig *config) { +static inline Clay_Dimensions Clay_Cairo_MeasureText(Clay_String *str, Clay_TextElementConfig *config, uintptr_t userData) { // Edge case: Clay computes the width of a whitespace character // once. Cairo does not factor in whitespaces when computing text // extents, this edge-case serves as a short-circuit to introduce From 0ba1416f51e15216f527dd3aa99a04afb2c6ae6b Mon Sep 17 00:00:00 2001 From: Nic Barker Date: Mon, 20 Jan 2025 09:29:25 +1300 Subject: [PATCH 3/3] update html renderer for measuretext userdata --- .../build/clay/index.html | 2 +- .../build/clay/index.wasm | Bin 167381 -> 167614 bytes examples/clay-official-website/index.html | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/clay-official-website/build/clay/index.html b/examples/clay-official-website/build/clay/index.html index 497f52ab..07eff3f6 100644 --- a/examples/clay-official-website/build/clay/index.html +++ b/examples/clay-official-website/build/clay/index.html @@ -314,7 +314,7 @@ const importObject = { clay: { - measureTextFunction: (addressOfDimensions, textToMeasure, addressOfConfig) => { + measureTextFunction: (addressOfDimensions, textToMeasure, addressOfConfig, userData) => { let stringLength = memoryDataView.getUint32(textToMeasure, true); let pointerToString = memoryDataView.getUint32(textToMeasure + 4, true); let textConfig = readStructAtAddress(addressOfConfig, textConfigDefinition); diff --git a/examples/clay-official-website/build/clay/index.wasm b/examples/clay-official-website/build/clay/index.wasm index 9847ded4c2dbf47055b21b7eca464c53c9290415..1ac9753c7a037871861522ec6c8b651791fa3933 100755 GIT binary patch delta 40536 zcmdVDd0>>q{Xf1lyUFIxCge^a&n^K%Ae@qL33<40x#W~vR047cC@Pwus8NFkCOT2k zMny$MO$`VtwV|Q~iyA9hY-t-cYP6`>qNR%ZeZA*-cK1oL*$w*n{qe(gpKG3(_kGPg zllLBodgZ~Wijx8Z-`wul(Kfq${F zc)tC|)Z~hn9ML5WMC1;c0Ay_zUmGMv9+#Ivoq}X+5 zDc$6{ZCtF4?rzffgjg1>*>qR29#M?ud#cf*fZK4(mdhJOZS1)C>I1mvW-(}pcQ%Wt zxQ?u`HaBhtOEE^V=knurk3(nFtzEAd+vAfnkJ~X~0Uq!o`cHEhqoVC$aVTB`m>2{x+NX4du(V6sBxH(=>afD#C5I#XkX)+)%lnm4;>qd-F5{Iy@xj( z1w4j^pv%Led&1SuBX*<9#}m5D!8@uMy{E6mtI-ukk2phhVGj;>DSaV6n5bXM2; zX};3Kjc2;eZC7+q#B}I;?8WXd1Djl4Cpsr~XZ2!oVm8|)u1s_T#Jdxh^xtjQqV=p* z#qPLh&5_IJxFZ2tTrPKM;bTFcI4!b(r^VQ#RX>sRBu#Yg(2X4t6FX2JS9Vwee!tzJ zYjP63s+z^%Mf6pTuEmrNom8t-QIs?y+!#%iC1rISVJigV9Mo`^-4hEaKt&uTWESvU z;!siws}m=Z+>TwKhozVP$rDP@i(SDS8;v&rU=ooRpaBFenkW_-Yl}AViS<&T#_owU zm>#A@`sB+UX24Km2tbWj0KyCbFwh87a>w-sPJ$ z2ry5i77Mar7zjj?7O907fS?$(fJbPN2IhD+*cRg>KqTG-0dRmA0i|7{Hl?>Y%J(Vb zv%Foq<1iLUk0M*7qO(|(`m7hAwBeT$Kzd^>sR1>{5WpM44N4j?MxHN>3Nv#=dRM5naF=I2u*+ zV*G-x8dJTw3@PuR@jSkZdy*Eq9kHvvg~EfatJ9*tf~HiMd)P0s%DB5ptn*~!we6lM zrb$;e6i+sbuRL>DlNj51@z4__I8aH~tpsxh&g;FFGWs|1Jidh8Xxhmdw$fuW>?AKT zyv4_zhs`SGg&W$CGvlHIBz|?Zgod%N+s3 z8)+{xjUT!@Ew0Jw2iTv=nI6CO1(HX@{^#;DBD%{mkYP=iWVT7%(uD}~c$euWhA~7> z<+Pk#=SA+}9(A=_6n7Uin#*=XpT0Tz;wOl6Qe- zaq4dJe|S)eG3j`Y`-iE_TM<#J?ryb{@uf z%?8Hcz}x`JPGD6t`rXNNPCSJ)=~W`3=R~-@1wFIVb~7ztrJ`#PYw zyY_?L9a#hgK|r8F{M08KveKz<3P2yww=ltslAs(O#q|y1hQ8$`n}~v&fn`q^W}Dvg zTr`;I3#B%ZrzeiJGF2J!oT!y`a3y4WPb`#;Z4h!^`WjNHpSD(a~b+65%i!!MZ9yJ9~n zh#JY(o!dZUdI`!EPFKWIimwXzUWh?1KOhcXkmo$0&i9HhFUTjk9xzbR438_s`~m4D zWf9C?V(PtXrH7fJ6T-w?en|npLQ`iHS|U0FB2BhpkKJ`MAzZ-sFp4I@3>-CB@?Gkv z_e4uyo6Sa(O-73iAfBUGZ-mivJ%~=ke+Kj^X)?QMG`ndqx{0uMbH;1~30Fg%3eW}y zN`Z6EY;)FV(+r$)vrQR}1oBp{d2pg@*1@XGM)01hQH3~E*r8;Xc^AG^-QB5<&EJHH zQ6RwVs5ZNeHV`8}MGl&64w!BB8f}QaKB^rt+Z;CA)NySkfqBMeZFSsiRd2RBrjB|u z!Zny}PMU2_7;RkEeomQfn#?wh3g5Hl-81Ih)9R?FS>N0W|3wl2E2Qu}XS8XCOEuU) zZFVYl6!0o_RPyA*x6*7=VYVq}nwT*#p#;*a-i1V~{%h2+`MZbBHg#s3gGQSiE1YF! zo2_P>QlkxQl%M8hkZ%%+QuDagp_LHLn<3L^A`E+~8lP0h=56ZD!H$`O9We%L*3U_^ z%?Y#3aidK$fGQpF2KE&uMCD@5pxa;z>SB^a^x#D$&6E+I#5N+T5Ppat(}!BoM>wL$ zhh0bQhdBpq}c@WEDA|0^x{yR=^LdwtAAa_tR#ZQ|eg(Z!+36 z)52=9W+as+ZL4rBA***q0ly^r=?F(e3BSRP|C`3K-nPhhI86 z79Am_Hd0BP*eOxUE+0%0#M7iMa% zdz9ovmiR=6GIwB~3vL9Fov8N7PDHU5g&3pI4u*M!2N3zr>AsSpk``hVMVLVuykdly zJ4%Dh#zRWn30gd^oTkKp5THP&Cwd^*l>h;9CtwKBIRj#HWyt`Wau)++{4@|PTs}b zl-krWrEp;|d6kSvOOk~Ux;rmth4wmP5?(5`i_=9^7+kE+=u=H*!R?J?;VZ`yC%MggSJMqsD#5c^kWkgKF#@<6id- zNbqeRKgfj7*J14k;|FoPPLJ~@U5w^lbf&gMWyjSkf;vWdGns!rf{64V#Z zPl-{}G@$qLQli$a(`HyHf#;h=)3o`MIoV9j*_)+!9At1DweAQSAS@3yIYNnm#`A4d z1jMZfEgV0K&``aGUYfX(y)>$%@6b}pEq6^{t*28u=8m6zX-e zEQ@wWkQa#GEu}2tu^Ci?bk59=M%OCuMc1Ow;w(JdvM5!opLvO|^Y>?78;Mr2G*qLQ zb1}U?^^#O^*TqwOZ9cxZDmD<1kIq`|YZE_vNI*EcciK6t9Sh0Cdif-tom)+1yC#n`|1jK=;U83S>Gbstdv|$K;ZC%wk z#rEaIj^T4sc})0Ni11F>O1w486^hOlp({D&ENwuEu6}C(8?H6;;h;obm&yO18&!Wo1Qqhr#Nz1 znzPlV%XqpVb0FRhL)MF^kb)2>6ajfrERP|PrVjBVJPVR~kjMb)^MX88+_zw8cAL-} z1B){YdUu9&I{&2uL4l*a;Yz%5=;ZwjlW@iB12I~-(t3?RP`sJTxA+Z++br*#W0)Aayf72>R#+}bBu2Jccc;dMdk$H5ur}hf zop_ExA6}5HGD+NMMrjSPRt|*GsLVP|Y>_vUSs~Ur$;5@hs({ZZjw9qFJ{T^TV3-1( zWzg9a&Dot_P{>_)Cl;1fXB2-bBXGeEHyXr>6_-Ubr`UK|@9yQQXopC^pFP0-CgBDA z*PGQv3}IhU;cl;Z^RoMZ%H@~ON+|=DFw_KLDrONq9LC4(5FcKyWvT*b?Lf?t!RUK0 zVo2)BMA{YEvp~HxcZT7)ln+q;n|uHQ4e|j%iF|+xK{8d?;m*?15qN+FI5^x9zzV(O zfCr9sDi{G{wq3ER6=U3@+lq7_b9kG~fr}IsE1aOmhf_O=7gnSUGB}Xkj04%kf$R_* z5Mjl)DB$#nb)FbQ7UKdlRkOasd$VQPe#eq0(<>KWl*E`EFu|soU16GgC zb9T3@iD$Z@ZkHK_^OlETK zfe?RtT}O!6m+Ol0JLjri_`U5ay^v;=+-{vAWVGpZ5uiKO&gvp4kOwDVZek%0Zj}H5 zS~D356F*mdoDh^Dd=vX>~ zW0<&g!=elWRyYRK(jcBVi6K<=vs_GDn!00ktUQ>*Bh#IhpvQ!mTm?EAy|EC6?}m+O zok;pHHv{wPm;3O1+cdZ}2C=Q(*o8Zz(~4^aWi1f`VOR{xT8ZfB*3APT zod-9sOh&#JZe+b0vTjHc!cV&xdPA28RNY`KL4*}Ilu=yypBwrB&72!A!%XF!H&XfJ z_csn@r)tmLc#M@CpmG3)@g<6PpDIO%6)sqdf>)%Ee>-J(Xc1r@*Tg~0#NiVf)F;vZs@H-s4 zQas_lDOEhZWvCezs~LLqgDLd?ZlQ%A?whV)W#W#TYBCMwM}%j1OIWl4*4fDDx=H-;=JDxG>b#NZxtLy_Lq^Kfb+PB^O!!0!>KeqvtyLj=_T1v{dF?HF zke*|o&zk9n)9oSyRvN9cp9CGV#Jl%`u&QoLSJlQx21y2FWfexv!M&L7K%8zSxZ#9&;evqYJhuXwLQ!Fux<)N#Ru2jYD6Vx zST`2!sxlxjXnXVR`vTK8-p{pb?id?oa*e_1Uw`+MR^(0gF|PNWRH>PCXJ&#Tq$kBs zO7TO zpkg#I!|xfaQdddcf$$XuS3ci1R;%R1&I80wcM3hL;(!1PTM*0OL5-MtS05+t;Yp>q z?XDgfiWku209-kCS9V~csX+}<&%4_%kelwF){0^QMO{ui!a8``L<`Df8DT+%e}tzi zCOA!H5;YHzv>bVe_|SKIT6_zE7IU_1JzL!K3b~eGtj_@v5aucoK$uH{{m1QNDb&S- za*@2_niRyhsu9Vbj`)_0f?h5j+0p+O$$5mhFfc`ZVz|<0IF?im$!=*l5=;&7nvb59 zg#Gx+`H_&USVOX&soX%isiZ3Rp6}93siHLkz@Z%BnL=WZD7d%pXvKX*W_JDM2Ou&i z6GY-X1~rRF{rrUQ?R&k#r-&X%_^O);-<2|`@I5a*AxM=YI#l^Z1LSHYeE*l~y3$8f ztExVCf1!njCo2^V&qjcTSbusZ;yh_M<$?30;i(6DVSed1z6TMQ^A4 zMy01pXOH~mrnYo;adp>RpH*&wKIOcC(Qlrgt@bNX_lNiUO!H?ClWER=Bdk1EF6z9^f`ypN}4BKL{zfeno%psRSoZ)pDU#IRO|rkR%$ zQ+Frp0mZ`_Uil@^>d}=1LXyom>*#KOoR#|IKwq3S>&ej}VD2LR_T(6!CgnagAvnxw zc7zyI6;a}1iQdF3Pi2J|Do3P0?I+LWPxlNuR5n&KAA7nlYfwQzXOv3)ln5dav-kJ~ z;;}uWXoywsJs+)EZ#Ym>NH#& z6YqSL0^a`j;0hv*odyPJihp+%kp&m!;^W^bUxjmj{gl4BLVS7sD_u-q#jN^a_o9jk zC|C+4;*?69{zInt_?0;npWynq81Z}Muc*zAx`IAR7ogsT9 zb$B_5*+~eiS`XMDO8%HHwjNfpiu+CC;M*QTShWc#tAub2YpCu0+5jG+XJvj=umAg_ zGMmAB4R6~M+yG%x8hlhaoMvND9njFW2al53d+BIqf=X09Sa68q zp&?A49-W~XVVVQc2o`V{H3&oE!<58xQToRWvHp!&K9R3~LuJp@NIdwb0j6^iC0{#3 zP$ypuIHm+mQK2pZ zpu`K`>N~5YBO+N;OMWOGqm>)2J#IUih)>=ckz?4I7OXG?N|nI4Ud=?pu{5#l?dhaS z0I~g&C3?Tsv9_T8D;7+whyA(8Brl4hMkx$F5n`<>$PMDYKd+&Iaj!|lzpF%AJ@<+< zP17rZkg*r?O!;*z3x@$-_3nqk2EF`v4meVN{9^ombi6-Yb;^4>&gZ=6bukIHArFo$39nbDJ#blJah*N)wAj3psiXZ;63|@NCiQ%BoZ%)iGzgqGZna>IK zL03G_{oqkvx=+0ML0#^t;Io1VQ(~#--D2NgH&d8`^BOVmZ=;V8VD6XbP zqQgI)p%CC7LqedCFGl@S6$|ke8EW~Qi=~Ta|Jln2vSB{9pGy}>4INmOc)20nRiQ$v zPKEZ;Ov4UNYgl1C!Y4}aHK-U$@gFv(@2SpW)`zMXg)z!Sr=RAEA3y9$wg%UJTSK!+ zur-4|LPRZAel#~E;4vR7KSO|vc^|9VG|v5*RkN5#Io7G69INYoRcbY?cC!Ty0Rt9d zL59R9a*1L_qvC@KTOMxwg!rIr__j|5g+OEjSr&!FC7(`fMRl*BeE#Y1L=}CZ<<>w- zweT}PiT8Y_OgWmiB5%K@;l47DP2Y2SDV54jWs9g3hBUm@ z&+xIpSjm5}6FwFfA!Wbt%l@sgzwXORLr74*==zl(`zilXxf#aux_+Ozk!}Yo6xm;g zrR?R!!2A8UV%IGs@orQ327m2MXDty&V4^?#wO??vP7kFhkB0Qk3|X}=ucXQ-7n#IX z=A+PFmI0Lq7-bnWnM1~}tXZ>CL&DW{2FriH*=k) z0TN$-gD^{U`S;GCWPay=IXnK-jLJb!2F3d|cZ`_+)O{YQnL&pmQp;0z8>TYm%vhf{ zns??xpEr8wOn_i8Flzv+$p6+4>-FENI!~MINmfC4u9;qeA@y0s8kTCic6%qD%*ih! z$`hI2b)vX5psp_Xu1{bxVqF3`O@i&%cYfG1{yU}>9b>&=h5TJ1%WON0-}B!tCFLX| z`cC?#DY@zdt*gN*B#|K`Zl&{|wW!@P8DlU;n?! zWJVO-OgH-N|NIg>^85SRa-skJK7bh+@PoURZE1stq3mtl4{B})I5deswzenREnYd7 z?oy!)+0^=U1F_G}%{LygYO&zQG0m-HXHoy7AH7aLt!oRt$9@WcUeiw(#FaN&hbZ!X z&R~1R=%2k4RV|c7MSsZke#jAre)ciwo_IEzYP8K5M7E3@k?uWfSWi|Z-HchHpxp+3 z_q@jDo6lH<#HS`LF_h0T)(l0j4U!u;`%PduQno>XDW}`fK4SFE{>m+KvD2%vnc8>@5QBs6TAD7p}vvJ-eNxmM> zFbO7qif8V?%ICKca-qwje0y9>RfSqv3B%5z25Z)}WZwkVMkZtF`)Got@6<%ro?NC) zwsW%(AYkc#Ju&vfYw&JlG(EUW(k9WKgaj;mdAr2CsWhd?*fZ97D4(9LWguV+yq0_Sn#!m z7YveihD%!DWP)Mb!f)ffnFNJ=KAm0eQ4(xKL{#Xq%rtq+w6ZRZC4~m&u8dy=OnxR? z9gHITGTG~(+~zFy5DV50dvH7&3fL|(HJc6l<&@jMFPlwa7X~Mt#||?dGQF zd!VD=YQ`!v2#aqp7!^Y%KkUOandb4SUJKt~6@?m)A?d_q`IEa9Cm$BDZjHD+ZBpeIdXOGd80O{J39BYVXrZ5wF zw`btzdY|{e*Y)vP(IA4$`u-ZTvA?=+2o|5}$0mfLtJjwQ0wcOV>4FddEFQr22cv)A zg7zpuQsMd1fB!!V*`c87_tIeIF{)_TUa(C=rKUe9q(MMKlR|-}NThoRrUo13h#_oB zNsVKrcULkb;Ys9wb~?xp+Gwvp>@P&oMZ@!OHrO-LxN0=6nyo!x7*ey*#DL9%qMnP+ z@d8y^b|bFbfMZOt>mkbRjnkdRX(aY)ax>hjk!eF2)(OiIL)qZz7E4Pe8DnELfgRrw zqI*Xn&*4~eM{^J!ln|-dV%Kx%Lr}*Et?Y?cXyG#UCdBH0&4DW{CqrdjzBQDMM)ye< zvgzg$W%cm`o^7?ut1pCHG|DG0WEZnC`SXP=6Nk)UECYvvVQdE5B<~oei1zd_=KX|U zEwIJ=oA<{IXVEP3lpWuu;<`y{MGW6=%Hc(9zLNmQQV02P5!;4)y>+$$o$k_EQ4FYS zZtGaaM0I2`9%HA|3FbHNHi}iKd%0)?TMlI9>m%4a_N8=>L9_<}F? zjCnOg{&-xewqrvcN*4$Guhq$;qp;xUfbkfgzT(@?J~XF;k2&rg&G6-*>@=G7!eR1g z)+rWWi^0 z3w`RWVs|IGU61+(r9tkR#MGo4ZZ^q`$!yvTip#8ynRb})WdN!VGkd}Yo8D#97!^CH z={E1KXCR=OF+;R~<2m`tWF;PdpUh_XHky+Ir?B2xKQP9<`-aihI4lQhQVRY71bOom zwvcU=A5CG4;z}8PH;Wx(XvefNIpreu39pprD9L?s8UoN$^3!ST0{<&#WzKZtmFalJ__9xp zf>+MT7pF7KjLC-SY)8o)n}NU0_~I3t=2q1LC;CE9ePBgsU^`v#$v}ucYp~%%B*@HQ zn=&Ny^_>@6+H29cj&>PzA(N-!6M(7FasC_mxa^=V3l)~s+xo$_X)RxxZhZ;HE4m|N zB?h_Qp20GWEhX`_E~Y-c_s`8>X(em1znf1CAl`tUHeI6Q5%WmfEzxxi&8C5YUIoHw zon39=$Dw;lKw&IN_fTbl!N!NNsx@?!J_}M>Wsg1_&%^wCNlMR5=KYW&uq1yulc`#{ zlH@BcW(z0`3M|R;9~ZN%d_x!_Akywg?{^INY=-uBG3Egy)I4CMhT}2WZ5CTk`7JJv z%ZFz%wPuD|$VIaud=2v6+3b+HPNfBa4g#Zr$wTv4Px+fUM!v7W{9+E9IJ700#(o~Y zT9|Th)T77YD_lhQ3K#3IWOX#&i*3DzDFU9A!ze?s^ts?#f8G zP|&hRPP>C8(_(vt&M{fD2tw+ul2rW6GUb@XOnnc7Vd~|!#i~^D+G6%(J0N^vi3LK( zQloT)e*8(5A3_uNilr>eT++>~e67U9Z7)`zEeGwq$mHL~vgORnSXUoLTP|Zkr%+$Nj6EF^lD-e70*Ac;CyxS8N65=ovOk!Sf>jt0 zDHxh4_0a8hc4J zz94the%ats-vBIMSOY=z3I`LqIY+MMwz}^nqsD!z0qY~x| zuU3bbu2#a_{~EUOR|)g!YuGzMq25vohDKg%fqM3}L2bEdDNkI>-V5C^jH7?DXyo-q z?WGNq7Tifh`J4oouiOZqH#3>1%bHtYc&|(5ZlBXwyO~|&FRgE8g)QcRnz?JMCc~^N zhlzQh-)uqu^KP(+%aZ3|0VmzYTyphqS&C26&)mSC4NZhEZnO|#U*W^aI>ZwCsQeiKvQ<>6)j z#Er2MLq2{J^MBK3(_g&Da4HnX#>1)D+wD|Lo{hWNVmNy4u(-$%Z)SPH0--Kj*%iT_ z4-+g+{(dXl9-19hw-^zovOXW*!qhtUHe`~7-Lg_?FV-T!VyZ1%6KMOV;Q9EfOUl?g!M*R=J0Rg3Z@0+htG5T3O!CJ^K5+^a!L7N&62Uc7 z#-ck_@V4nrmTQJs$R_-uvsKQ0x+ss_iSE1vYeNg~E@#iS1KnG;SB_p;LSSGw2lWru^Bnd+UOHS(i$+2j9hJw)Vu`(YFnT=V@?gPdG z(c=`cLICQ|Cty|3r#=Mey;ej8theX#IC1oGvf-&jZ-U(KcmF(QRwV1XgAATUGRy zFQ-3ZAxg9NPd&nhoJVx6NWA$`OK%`?wk&<#5?!b43T|Jr_QHQ(wJU`GR*E(8F-w|U z^%$EGgau}>+VyeYB#o6Ie(R( zXuQG%VS|au)7vbV)IawNbboctFVX#jHRqxG2&A#>=eMj!03P`b0J_YV9iF$4rw|AIy9GxwjD z)+;i8yT6@UUv}WvYJL2R>~)i`E#~Ca!n_7~`bD39Fvu4AETLm;XD8MfWfI z9p*_xL6$Giy#k3t5U9YJ@cRIZ`M9qd-S;1;{=WTt7VZlKn11L!m4BTG!}JKYy*eId zMuOa$NLVQYiC2_CQvc112xG?786pn=s$}Vh@KUvPhL^&fO4(57vk2B+;3xd_&6lSS zS+E%P2g45FeSclK85RLzfRle<9s3&I+-uW^_rzO5LpE#3Y<}| z2R8)?A0Y~O_;n^ii_+#lTA1+0AK4_b2W>OK5G6#?*eWR_aPNvD4f0R#z%=e_gwe07 zhx__lqha*Xb(3UAneNjdhIO+>p#=-&<&8(#%@31U+ zpozu%p!Vy1nq2!1a{zSqCR2<26#=09O3ZHk+}rD(&(W)QneU(9Wb50q1@qrxeOgr8 z+AT9*eBm7~?rlsFV=Mm=2A$6d|!Rix2Loe`vlE;71|f$s=Gu+%^S|{h9Utr4*d^ zHDF!)E?{j%y!1ASC)sh9TB1_zfOJxmtHGDP{rV;jVwHU0ID0*SsqzUsldpUM^Y`R? zz8RL*9*(~s(8FcQ%JhqkZ^O?$fX~!f3yS8vcFmk z)cb!m;$BEV8(zX^pcekkSJnxwJ@Vnd8L^jNTZWvpIJ7HHvLo$)b<^K1u)hBHkREM; zl9&LCjiH4fKc;+iBl+kHFazoJ(d~D1^0)u+1-zkMTRX{DdA$(FhK_dl^zcHzVhwC%s#pLzXPid^xTuY4K|Wq2_^P_VLNf*IIr zz64~xaMj>29F{7dDkFRR^R|ubf-hK~K4x{X-SHzSTE2vrQWKwkZTtViH@)$%wzz0U zp*Nf|YN-IDNrF~|vgenX-P&{2i0rJ8T9H68y25oBWQ*by;jO6&jeqf z^sh5)rb!itTKtFwV%Ql42F=(yMb7&cF1FFwE=3;ymdz!-rWVGIFmlp&jKb#?-?0T` zYt%B+WAg3q@D|F=SlfAAj{h%vi);-ptg*7%7G{s^eU@!7sTgKW1FhhIifU6G3U1Fb z-)=K<4)Ic z2={!&^QCsq7w!aH+0~A@gNPr4&mE|7vVStnFRGQlay6G_>foNQc~3dwXY?F!=HTBy z)6Bs=c|2(O2jKbV4OTF&KAQxX{y54%OW9(&R$?O!OxNxT(`$GN%#!7%2%Zvbj&64Z556vEbtG37ND&{4%tFl<`07pg zE6m0!x;<2YPQl+__QtU76`)U}xPPIPT17Xw6Zfy8D~aYo*OV#Qxjlxf4`3De$7A@! zAcaqwaWZx&4G^1i^Xu^@xjB~iVDHM^bT}@L$MRk{*yDKjuJ2Ovj1NUZWY2+T9|GTv zAHb94GjaSm(@g}PfcdZkWNTMEZ+jUlR?n&GC8>VPMJ^6m?&9NOj1|i?fSbuB3B14T zkihRufc00Z=iRZUR89-S+My!}e1_9I-|k7|s>X@l{WVT=70lj5PV?=bCi37DAHczH zsV+(4q1NPCW;#qu)kJ~@OV!wZL6Z-61m&<8s)eO$wj%GVBl z{t^QgP{ciuVd<>3m71Q(gRX^@ znf$5HvVVIPOoi7)yq^_Pcp#7qJM!~b00LCj`{uw~+oH=m1-C^~X(-k&rO6x9c&v0{ zO|TE%gW3NVX6aH*nWYN2N!X(oHD#8X@K;}domraa=IvQSf0-wU@%gMqK_?C!!F%wkPIBWW)7ukQ+R^h!#nZXp9ANXk>) z&PP(zvi3~Ijb-gcxmaC^+yIubN@C4kw!AIZ;=}gh@1C{;Xsp06y1Vcp%Oq-I-Y>8; zHF><_`7faOF)z5KdAKL{FQ7QqgAWg&vMTBa9V#Sx%a_a3OcLFh1{c?-oW=O))U3BJ zd-BlB|9i?)`4+ymWBGsU1q6TW#XGj&wkb9b>TR)Y$|^Kl6#Z`R;I=KT4{y(x7?FJ~ z#%)&LkRcdEwy`hY)egC;?`MgQGW+xMS+k*-_-%i5;9IkC0dI57M%e}YSFYJWB;;Mx zA8>=ND2t;n=N|c1A-Be_~kP2>1UPBn@rM)F%)kXPAvv@Dl3qripKB7RX@l-*pU zDEn-Y&lEeXr`TapLuNh&4 zeCVx7o)^+R<G%kIcdS`|Z677_<-4OX zZa{LZ921-zHDkDUi!>{xQKvFC*CpM{m&s!-g7Ez$uKolH2oy-5r%dKuRMY>USBNx^A6ZW8xykr{->dnTP1jn|wf zc@w8t$h&xog}iS}`6c8{l;bZ#kAY}BZz?ae2=`v2+SC*S;l{V$jWOpb+ddBqnrZ-SUCsGR<6LP-bs{! z#aw+ChsX8uu3}zjtopE{D2OQ=+O5U)Co2BA-c-MD(=S%jyrZt(r(Y~KbG@N1kE!3c z=od}u)zy3I_b>DtvVN$RjPwm|v8WB1Gy;zPAUQ=T8&~ps*f|-!icdH9oxtuHr{v|U zIQCyG1xHjKj0jGU7^(J?mw!EBV*mjh$~DZAD$!0$1^DH6{;b4Vre`^vRkeV3;uy}a>y z-C86h7VS=w+3WbSwybB>xT+*7FNu z8|bzcv%|v&!UfD<&oiUdEpU*c-!1ETht8!h(W@ovXh=Vub8uWN| z1D|SgP;CK&XQ!oSBkwW>JLyE5e-$3%hY#eZjfq(;Y#={Hr&>Jr0C9If|>#@)7&_h+Z&p^ZGb;4D4CAMeFZ9{4jn2k|)tZ9o#Q+w#mF!-N)_$M<44 zz&yT(-BU?V&d8Xn`Bt`DZoisq(TWJzdp-}uJ9sruPdcGgB37?w#l}7@(b50e|M}H? ibu#TKG`E~z!nG{9r5st?2j#qz{7*Tg>49y0@c#p~wDsNq delta 39734 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 z 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 diff --git a/examples/clay-official-website/index.html b/examples/clay-official-website/index.html index 497f52ab..07eff3f6 100644 --- a/examples/clay-official-website/index.html +++ b/examples/clay-official-website/index.html @@ -314,7 +314,7 @@ const importObject = { clay: { - measureTextFunction: (addressOfDimensions, textToMeasure, addressOfConfig) => { + measureTextFunction: (addressOfDimensions, textToMeasure, addressOfConfig, userData) => { let stringLength = memoryDataView.getUint32(textToMeasure, true); let pointerToString = memoryDataView.getUint32(textToMeasure + 4, true); let textConfig = readStructAtAddress(addressOfConfig, textConfigDefinition);