diff --git a/.deco/blocks/Sunset%20Glow.json b/.deco/blocks/Sunset%20Glow.json
index 5d7f1e7..8aeabfd 100644
--- a/.deco/blocks/Sunset%20Glow.json
+++ b/.deco/blocks/Sunset%20Glow.json
@@ -1 +1,38 @@
-{"__resolveType":"site/sections/Theme/Theme.tsx","buttonStyle":{"--border-btn":"1px","--rounded-btn":"0.2rem","--btn-focus-scale":"0.95","--animation-btn":"0.25s"},"otherStyles":{"--rounded-box":"1rem","--rounded-badge":"1.9rem","--animation-input":"0.2s","--tab-border":"1px","--tab-radius":"0.5rem"},"mainColors":{"base-100":"#FFF7D2","primary":"#A73C5A","secondary":"#FFBC55","tertiary":"#FF9900","neutral":"#4F3000","success":"#008060","warning":"#FFC453","error":"#D82C0D","info":"#2E72D2"},"font":{"__resolveType":"website/loaders/fonts/googleFonts.ts","fonts":[{"variations":[],"family":"Special Elite"}]},"colorScheme":"any"}
\ No newline at end of file
+{
+ "__resolveType": "site/sections/Theme/Theme.tsx",
+ "buttonStyle": {
+ "--border-btn": "1px",
+ "--rounded-btn": "0.2rem",
+ "--btn-focus-scale": "0.95",
+ "--animation-btn": "0.25s"
+ },
+ "otherStyles": {
+ "--rounded-box": "1rem",
+ "--rounded-badge": "1.9rem",
+ "--animation-input": "0.2s",
+ "--tab-border": "1px",
+ "--tab-radius": "0.5rem"
+ },
+ "mainColors": {
+ "base-100": "#FFF7D2",
+ "primary": "#A73C5A",
+ "secondary": "#FFBC55",
+ "tertiary": "#FF9900",
+ "neutral": "#4F3000",
+ "success": "#008060",
+ "warning": "#FFC453",
+ "error": "#D82C0D",
+ "info": "#2E72D2"
+ },
+ "font": {
+ "__resolveType": "website/loaders/fonts/googleFonts.ts",
+ "fonts": [
+ {
+ "variations": [],
+ "family": "Special Elite"
+ }
+ ]
+ },
+ "colorScheme": "any",
+ "mode": "light"
+}
\ No newline at end of file
diff --git a/.deco/blocks/pages-404-480700.json b/.deco/blocks/pages-404-480700.json
index 892fd9a..30895c8 100644
--- a/.deco/blocks/pages-404-480700.json
+++ b/.deco/blocks/pages-404-480700.json
@@ -7,7 +7,7 @@
"game": {},
"name": "
Yay! You found the Capy 🦫
Now help him find all the food it needs.
",
"heading": "Yay! You found the Capy 🦫
",
- "subText": "\n He has been hungry since this time.\n
\n\n Now help him navigate safely to his home :)\n
",
+ "subText": " \n He has been hungry since this time.\n
\n \n Now help him navigate safely to his home :)\n
",
"customizeAssets": {
"trex": {
"image": "https://ozksgdmyrqcxcwhnbepg.supabase.co/storage/v1/object/public/assets/11683/78d05b4c-680b-436e-a397-a1dbda2d6be7",
@@ -18,12 +18,14 @@
"image": "https://ozksgdmyrqcxcwhnbepg.supabase.co/storage/v1/object/public/assets/11683/78d05b4c-680b-436e-a397-a1dbda2d6be7"
},
"characterSprite2x": {
- "image": "https://ozksgdmyrqcxcwhnbepg.supabase.co/storage/v1/object/public/assets/11683/4ae5657f-673c-4f78-92ee-90ea5e008b06"
+ "image": "https://ozksgdmyrqcxcwhnbepg.supabase.co/storage/v1/object/public/assets/11683/4ae5657f-673c-4f78-92ee-90ea5e008b06",
+ "alt": "hello"
}
},
"gameProperties": {
"acceleration": 0.003
- }
+ },
+ "instructions": "Press 'Space' to jump your Capy and start the game."
}
],
"seo": {
diff --git a/.deco/blocks/site.json b/.deco/blocks/site.json
index bf3fbe3..9407540 100644
--- a/.deco/blocks/site.json
+++ b/.deco/blocks/site.json
@@ -29,6 +29,6 @@
"__resolveType": "site/apps/site.ts",
"firstByteThresholdMS": true,
"theme": {
- "__resolveType": "Neutral"
+ "__resolveType": "Sunset Glow"
}
}
\ No newline at end of file
diff --git a/.deco/metadata/spaces.json b/.deco/metadata/spaces.json
index 48b0e56..073f9e0 100644
--- a/.deco/metadata/spaces.json
+++ b/.deco/metadata/spaces.json
@@ -520,7 +520,7 @@
"content": [
{
"type": "stack",
- "width": 50,
+ "width": 60.217983651226156,
"isClosable": true,
"reorderEnabled": true,
"title": "",
@@ -541,7 +541,7 @@
},
{
"type": "stack",
- "width": 50,
+ "width": 39.782016348773844,
"isClosable": true,
"reorderEnabled": true,
"title": "",
@@ -606,7 +606,115 @@
"name": "Themes",
"pinned": true,
"icon": "palette",
- "layout": [],
+ "layout": {
+ "settings": {
+ "hasHeaders": true,
+ "constrainDragToContainer": true,
+ "reorderEnabled": true,
+ "selectionEnabled": false,
+ "popoutWholeStack": false,
+ "blockedPopoutsThrowError": true,
+ "closePopoutsOnUnload": true,
+ "showPopoutIcon": false,
+ "showMaximiseIcon": false,
+ "showCloseIcon": false,
+ "responsiveMode": "onload"
+ },
+ "dimensions": {
+ "borderWidth": 8,
+ "minItemHeight": 10,
+ "minItemWidth": 10,
+ "headerHeight": 40,
+ "dragProxyWidth": 300,
+ "dragProxyHeight": 200
+ },
+ "labels": {
+ "close": "close",
+ "maximise": "maximise",
+ "minimise": "minimise",
+ "popout": "open in new window",
+ "popin": "pop in",
+ "tabDropdown": "additional tabs"
+ },
+ "content": [
+ {
+ "type": "row",
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "content": [
+ {
+ "type": "stack",
+ "width": 33.333333333333336,
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "activeItemIndex": 0,
+ "content": [
+ {
+ "id": "themes::Theme%20Selector::palette::Theme%20Selector::%7B%7D",
+ "title": "",
+ "type": "component",
+ "componentName": "component",
+ "componentState": {
+ "id": "themes::Theme%20Selector::palette::Theme%20Selector::%7B%7D"
+ },
+ "isClosable": true,
+ "reorderEnabled": true
+ }
+ ]
+ },
+ {
+ "type": "stack",
+ "width": 33.333333333333336,
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "activeItemIndex": 0,
+ "content": [
+ {
+ "id": "themes::Theme%20Viewer::palette::Theme%20Viewer::%7B%7D",
+ "title": "",
+ "type": "component",
+ "componentName": "component",
+ "componentState": {
+ "id": "themes::Theme%20Viewer::palette::Theme%20Viewer::%7B%7D"
+ },
+ "isClosable": true,
+ "reorderEnabled": true
+ }
+ ]
+ },
+ {
+ "type": "stack",
+ "width": 33.33333333333333,
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "activeItemIndex": 0,
+ "content": [
+ {
+ "id": "themes::Theme%20Preview::palette::Theme%20Preview::%7B%7D",
+ "title": "",
+ "type": "component",
+ "componentName": "component",
+ "componentState": {
+ "id": "themes::Theme%20Preview::palette::Theme%20Preview::%7B%7D"
+ },
+ "isClosable": true,
+ "reorderEnabled": true
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "openPopouts": [],
+ "maximisedItemId": null
+ },
"tabs": {
"themes::Theme%20Selector::palette::Theme%20Selector::%7B%7D": {
"name": "Theme Selector",
@@ -615,7 +723,8 @@
"viewId": "Theme Selector",
"id": "themes::Theme%20Selector::palette::Theme%20Selector::%7B%7D",
"state": {
- "__signal": null
+ "__signal": null,
+ "value": null
}
},
"themes::Theme%20Viewer::palette::Theme%20Viewer::%7B%7D": {
@@ -648,7 +757,73 @@
"name": "Redirects",
"pinned": true,
"icon": "redirect",
- "layout": [],
+ "layout": {
+ "settings": {
+ "hasHeaders": true,
+ "constrainDragToContainer": true,
+ "reorderEnabled": true,
+ "selectionEnabled": false,
+ "popoutWholeStack": false,
+ "blockedPopoutsThrowError": true,
+ "closePopoutsOnUnload": true,
+ "showPopoutIcon": false,
+ "showMaximiseIcon": false,
+ "showCloseIcon": false,
+ "responsiveMode": "onload"
+ },
+ "dimensions": {
+ "borderWidth": 8,
+ "minItemHeight": 10,
+ "minItemWidth": 10,
+ "headerHeight": 40,
+ "dragProxyWidth": 300,
+ "dragProxyHeight": 200
+ },
+ "labels": {
+ "close": "close",
+ "maximise": "maximise",
+ "minimise": "minimise",
+ "popout": "open in new window",
+ "popin": "pop in",
+ "tabDropdown": "additional tabs"
+ },
+ "content": [
+ {
+ "type": "row",
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "content": [
+ {
+ "type": "stack",
+ "width": 100,
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "activeItemIndex": 0,
+ "content": [
+ {
+ "id": "redirects::List::list::List::%7B%7D",
+ "title": "",
+ "type": "component",
+ "componentName": "component",
+ "componentState": {
+ "id": "redirects::List::list::List::%7B%7D"
+ },
+ "isClosable": true,
+ "reorderEnabled": true
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "openPopouts": [],
+ "maximisedItemId": null
+ },
"tabs": {
"redirects::List::list::List::%7B%7D": {
"name": "List",
@@ -668,7 +843,73 @@
"name": "Loaders",
"pinned": true,
"icon": "block",
- "layout": [],
+ "layout": {
+ "settings": {
+ "hasHeaders": true,
+ "constrainDragToContainer": true,
+ "reorderEnabled": true,
+ "selectionEnabled": false,
+ "popoutWholeStack": false,
+ "blockedPopoutsThrowError": true,
+ "closePopoutsOnUnload": true,
+ "showPopoutIcon": false,
+ "showMaximiseIcon": false,
+ "showCloseIcon": false,
+ "responsiveMode": "onload"
+ },
+ "dimensions": {
+ "borderWidth": 8,
+ "minItemHeight": 10,
+ "minItemWidth": 10,
+ "headerHeight": 40,
+ "dragProxyWidth": 300,
+ "dragProxyHeight": 200
+ },
+ "labels": {
+ "close": "close",
+ "maximise": "maximise",
+ "minimise": "minimise",
+ "popout": "open in new window",
+ "popin": "pop in",
+ "tabDropdown": "additional tabs"
+ },
+ "content": [
+ {
+ "type": "row",
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "content": [
+ {
+ "type": "stack",
+ "width": 100,
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "activeItemIndex": 0,
+ "content": [
+ {
+ "id": "loaders::List::list::List::%7B%7D",
+ "title": "",
+ "type": "component",
+ "componentName": "component",
+ "componentState": {
+ "id": "loaders::List::list::List::%7B%7D"
+ },
+ "isClosable": true,
+ "reorderEnabled": true
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "openPopouts": [],
+ "maximisedItemId": null
+ },
"tabs": {
"loaders::List::list::List::%7B%7D": {
"name": "List",
@@ -688,7 +929,73 @@
"name": "Actions",
"pinned": true,
"icon": "block",
- "layout": [],
+ "layout": {
+ "settings": {
+ "hasHeaders": true,
+ "constrainDragToContainer": true,
+ "reorderEnabled": true,
+ "selectionEnabled": false,
+ "popoutWholeStack": false,
+ "blockedPopoutsThrowError": true,
+ "closePopoutsOnUnload": true,
+ "showPopoutIcon": false,
+ "showMaximiseIcon": false,
+ "showCloseIcon": false,
+ "responsiveMode": "onload"
+ },
+ "dimensions": {
+ "borderWidth": 8,
+ "minItemHeight": 10,
+ "minItemWidth": 10,
+ "headerHeight": 40,
+ "dragProxyWidth": 300,
+ "dragProxyHeight": 200
+ },
+ "labels": {
+ "close": "close",
+ "maximise": "maximise",
+ "minimise": "minimise",
+ "popout": "open in new window",
+ "popin": "pop in",
+ "tabDropdown": "additional tabs"
+ },
+ "content": [
+ {
+ "type": "row",
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "content": [
+ {
+ "type": "stack",
+ "width": 100,
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "activeItemIndex": 0,
+ "content": [
+ {
+ "id": "actions::List::list::List::%7B%7D",
+ "title": "",
+ "type": "component",
+ "componentName": "component",
+ "componentState": {
+ "id": "actions::List::list::List::%7B%7D"
+ },
+ "isClosable": true,
+ "reorderEnabled": true
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "openPopouts": [],
+ "maximisedItemId": null
+ },
"tabs": {
"actions::List::list::List::%7B%7D": {
"name": "List",
@@ -708,7 +1015,73 @@
"name": "Segments",
"pinned": true,
"icon": "users",
- "layout": [],
+ "layout": {
+ "settings": {
+ "hasHeaders": true,
+ "constrainDragToContainer": true,
+ "reorderEnabled": true,
+ "selectionEnabled": false,
+ "popoutWholeStack": false,
+ "blockedPopoutsThrowError": true,
+ "closePopoutsOnUnload": true,
+ "showPopoutIcon": false,
+ "showMaximiseIcon": false,
+ "showCloseIcon": false,
+ "responsiveMode": "onload"
+ },
+ "dimensions": {
+ "borderWidth": 8,
+ "minItemHeight": 10,
+ "minItemWidth": 10,
+ "headerHeight": 40,
+ "dragProxyWidth": 300,
+ "dragProxyHeight": 200
+ },
+ "labels": {
+ "close": "close",
+ "maximise": "maximise",
+ "minimise": "minimise",
+ "popout": "open in new window",
+ "popin": "pop in",
+ "tabDropdown": "additional tabs"
+ },
+ "content": [
+ {
+ "type": "row",
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "content": [
+ {
+ "type": "stack",
+ "width": 100,
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "activeItemIndex": 0,
+ "content": [
+ {
+ "id": "segments::segments::experiment::segments::%7B%7D",
+ "title": "",
+ "type": "component",
+ "componentName": "component",
+ "componentState": {
+ "id": "segments::segments::experiment::segments::%7B%7D"
+ },
+ "isClosable": true,
+ "reorderEnabled": true
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "openPopouts": [],
+ "maximisedItemId": null
+ },
"tabs": {
"segments::segments::experiment::segments::%7B%7D": {
"name": "segments",
@@ -927,7 +1300,73 @@
"name": "Logs",
"pinned": true,
"icon": "manage-search",
- "layout": [],
+ "layout": {
+ "settings": {
+ "hasHeaders": true,
+ "constrainDragToContainer": true,
+ "reorderEnabled": true,
+ "selectionEnabled": false,
+ "popoutWholeStack": false,
+ "blockedPopoutsThrowError": true,
+ "closePopoutsOnUnload": true,
+ "showPopoutIcon": false,
+ "showMaximiseIcon": false,
+ "showCloseIcon": false,
+ "responsiveMode": "onload"
+ },
+ "dimensions": {
+ "borderWidth": 8,
+ "minItemHeight": 10,
+ "minItemWidth": 10,
+ "headerHeight": 40,
+ "dragProxyWidth": 300,
+ "dragProxyHeight": 200
+ },
+ "labels": {
+ "close": "close",
+ "maximise": "maximise",
+ "minimise": "minimise",
+ "popout": "open in new window",
+ "popin": "pop in",
+ "tabDropdown": "additional tabs"
+ },
+ "content": [
+ {
+ "type": "row",
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "content": [
+ {
+ "type": "stack",
+ "width": 100,
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "activeItemIndex": 0,
+ "content": [
+ {
+ "id": "logs::logs::manage-search::logs::%7B%7D",
+ "title": "",
+ "type": "component",
+ "componentName": "component",
+ "componentState": {
+ "id": "logs::logs::manage-search::logs::%7B%7D"
+ },
+ "isClosable": true,
+ "reorderEnabled": true
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "isClosable": true,
+ "reorderEnabled": true,
+ "title": "",
+ "openPopouts": [],
+ "maximisedItemId": null
+ },
"tabs": {
"logs::logs::manage-search::logs::%7B%7D": {
"name": "logs",
@@ -1157,73 +1596,7 @@
"name": "Publish",
"pinned": false,
"icon": "rocket-launch",
- "layout": {
- "settings": {
- "hasHeaders": true,
- "constrainDragToContainer": true,
- "reorderEnabled": true,
- "selectionEnabled": false,
- "popoutWholeStack": false,
- "blockedPopoutsThrowError": true,
- "closePopoutsOnUnload": true,
- "showPopoutIcon": false,
- "showMaximiseIcon": false,
- "showCloseIcon": false,
- "responsiveMode": "onload"
- },
- "dimensions": {
- "borderWidth": 8,
- "minItemHeight": 10,
- "minItemWidth": 10,
- "headerHeight": 40,
- "dragProxyWidth": 300,
- "dragProxyHeight": 200
- },
- "labels": {
- "close": "close",
- "maximise": "maximise",
- "minimise": "minimise",
- "popout": "open in new window",
- "popin": "pop in",
- "tabDropdown": "additional tabs"
- },
- "content": [
- {
- "type": "row",
- "isClosable": true,
- "reorderEnabled": true,
- "title": "",
- "content": [
- {
- "type": "stack",
- "width": 100,
- "isClosable": true,
- "reorderEnabled": true,
- "title": "",
- "activeItemIndex": 0,
- "content": [
- {
- "id": "Publish::Environment::rocket-launch::Environment::%7B%7D",
- "title": "",
- "type": "component",
- "componentName": "component",
- "componentState": {
- "id": "Publish::Environment::rocket-launch::Environment::%7B%7D"
- },
- "isClosable": true,
- "reorderEnabled": true
- }
- ]
- }
- ]
- }
- ],
- "isClosable": true,
- "reorderEnabled": true,
- "title": "",
- "openPopouts": [],
- "maximisedItemId": null
- },
+ "layout": [],
"tabs": {
"Publish::Environment::rocket-launch::Environment::%7B%7D": {
"name": "Environment",
diff --git a/sections/404Game.tsx b/sections/404Game.tsx
index b370659..ed73756 100644
--- a/sections/404Game.tsx
+++ b/sections/404Game.tsx
@@ -1,5 +1,5 @@
import { useSection } from "deco/hooks/useSection.ts";
-import base64Images from "./imagesAndCss.tsx";
+import base64Images, { backgroundSvg } from "./imagesAndCss.tsx";
import { dinoGameStyles } from "./imagesAndCss.tsx";
// import { TRexGameLogic } from "./dino.ts";
import { useScript } from "deco/hooks/useScript.ts";
@@ -7,28 +7,152 @@ import { useScript } from "deco/hooks/useScript.ts";
import { ImageWidget } from "apps/admin/widgets.ts";
import Image from "apps/website/components/Image.tsx";
+const imagesID = {
+ x1obstaclelarge: "1x-obstacle-large",
+ x1obstaclesmall: "1x-obstacle-small",
+ x1cloud: "1x-cloud",
+ x1text: "1x-text",
+ x1horizon: "1x-horizon",
+ x1trex: "1x-trex",
+ x1restart: "1x-restart",
+ x2obstaclelarge: "2x-obstacle-large",
+ x2obstaclesmall: "2x-obstacle-small",
+ x2cloud: "2x-cloud",
+ x2text: "2x-text",
+ x2horizon: "2x-horizon",
+ x2trex: "2x-trex",
+ x2restart: "2x-restart",
+ offlinesoundpress: "offline-sound-press",
+ offlinesoundhit: "offline-sound-hit",
+ offlinesoundreached: "offline-sound-reached",
+};
+
interface Sprite {
base64Sprite?: string;
// image?: ImageWidget;
alt?: string;
- width?: number;
- height?: number;
+ // width?: number;
+ // height?: number;
}
+const dimension2x = {
+ x2: {
+ obstacleLarge: { width: 300, height: 100, id: imagesID.x2obstaclelarge },
+ obstacleSmall: {
+ width: 204,
+ height: 70,
+ id: imagesID.x2obstaclesmall,
+ },
+ gameText: {
+ width: 382,
+ height: 48,
+ id: imagesID.x2text,
+ },
+ cloud: {
+ width: 92,
+ height: 28,
+ id: imagesID.x2cloud,
+ },
+ horizon: {
+ width: 2400,
+ height: 24,
+ id: imagesID.x2horizon,
+ },
+ characterSprite: {
+ width: 528,
+ height: 94,
+ id: imagesID.x2trex,
+ },
+ restart: {
+ width: 72,
+ height: 64,
+ id: imagesID.x2restart,
+ },
+ },
+};
+
+const dimension1x = { x1: {} };
+Object.keys(dimension2x.x2).forEach((key) => {
+ const { width, height, id } = dimension2x.x2[key];
+ dimension1x.x1[key] = {
+ width: width / 2,
+ height: height / 2,
+ id: id?.replace("2x", "1x"),
+ };
+});
+
+console.log(dimension1x, dimension2x);
+
interface Assets {
+ /**
+ * @format text
+ * @description The obstacleLarge is the trees/cactus that you see in the game. Obstacle sprite should be of dimension 150X50px (W x H) for 1x and 300x100px for 2x. You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
obstacleLarge?: Sprite;
+ /**
+ * @format text
+ * @description The obstacleSmall includes smaller obstacles in the game. Sprite should be of dimension 102x35px (W x H) for 1x and 204x70px for 2x. You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
obstacleSmall?: Sprite;
+ /**
+ * @format text
+ * @description The cloud sprite appears in the background. It should be of dimension 46x14px (W x H) for 1x and 92x28px for 2x. You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
cloud?: Sprite;
+ /**
+ * @format text
+ * @description The gameText includes text elements like scores. Sprite should be of dimension 191x24px (W x H) for 1x and 382x48px for 2x. You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
gameText?: Sprite;
+ /**
+ * @format text
+ * @description The horizon is the ground line sprite. It should be of dimension 1200x12px (W x H) for 1x and 2400x24px for 2x. You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
horizon?: Sprite;
+ /**
+ * @format text
+ * @description The characterSprite is the main character of the game. Sprite should be of dimension 264x47px (W x H) for 1x and 528x94px for 2x. You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
characterSprite?: Sprite;
+ /**
+ * @format text
+ * @description The restart button sprite. It should be of dimension 36x32px (W x H) for 1x and 72x64px for 2x. You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
restart?: Sprite;
+ /**
+ * @format text
+ * @description The 2x version of obstacleLarge sprite for high-resolution displays. Dimension is 300x100px (W x H). You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
obstacleLarge2x?: Sprite;
+ /**
+ * @format text
+ * @description The 2x version of obstacleSmall sprite for high-resolution displays. Dimension is 204x70px (W x H). You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
obstacleSmall2x?: Sprite;
+ /**
+ * @format text
+ * @description The 2x version of cloud sprite for high-resolution displays. Dimension is 92x28px (W x H). You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
cloud2x?: Sprite;
+ /**
+ * @format text
+ * @description The 2x version of gameText sprite for high-resolution displays. Dimension is 382x48px (W x H). You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
gameText2x?: Sprite;
+ /**
+ * @format text
+ * @description The 2x version of horizon sprite for high-resolution displays. Dimension is 2400x24px (W x H). You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
horizon2x?: Sprite;
+ /**
+ * @format text
+ * @description The 2x version of characterSprite for high-resolution displays. Dimension is 528x94px (W x H). You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
characterSprite2x?: Sprite;
+ /**
+ * @format text
+ * @description The 2x version of restart button sprite for high-resolution displays. Dimension is 72x64px (W x H). You can create base64 string by using this tool - https://base64.guru/converter/encode/image/png
+ */
restart2x?: Sprite;
}
@@ -175,6 +299,7 @@ export interface Props {
instructions?: string;
gameProperties?: Game;
customizeAssets?: Assets;
+ motivationBehindTheProject?: string;
// acceleration?: number;
// bgCloudSpeed?: number;
// bottomPad?: number;
@@ -200,6 +325,32 @@ export default function Section({
instructions = "Press 'Space' to jump your Capy and start the game.",
gameProperties,
customizeAssets,
+ motivationBehindTheProject = `
+ Motivation behind - Find my Capy | 404 page game
+
+
+ I wanted to explore the below things deco.cx
+
+ A fun and interactive game (Yes making a working game in deco is
+ hard :(
+
+
+ Make something innovative (in Open category) rather than a simple
+ boring static regular submission
+
+
+ Test if game assets and properties to be fully customizable (in deco admin)
+
+
+
+
+ Submitting this under the open category. I wanted to see whether I
+ can push the limits of deco's capabilities and create interactive
+ game website that can capture the keyboard events, mouse events, load game
+ assets and not just create a static site.
+
+
+ Hope you like my Capy :)
`,
}: Props) {
/**
* useSection is a nice hook for getting the HTMX link to render this section,
@@ -216,26 +367,6 @@ export default function Section({
customizeAssets,
});
- const imagesID = {
- x1obstaclelarge: "1x-obstacle-large",
- x1obstaclesmall: "1x-obstacle-small",
- x1cloud: "1x-cloud",
- x1text: "1x-text",
- x1horizon: "1x-horizon",
- x1trex: "1x-trex",
- x1restart: "1x-restart",
- x2obstaclelarge: "2x-obstacle-large",
- x2obstaclesmall: "2x-obstacle-small",
- x2cloud: "2x-cloud",
- x2text: "2x-text",
- x2horizon: "2x-horizon",
- x2trex: "2x-trex",
- x2restart: "2x-restart",
- offlinesoundpress: "offline-sound-press",
- offlinesoundhit: "offline-sound-hit",
- offlinesoundreached: "offline-sound-reached",
- };
-
const onLoad = (props) => {
console.log("Window loaded", props);
@@ -303,7 +434,7 @@ export default function Section({
* Default game width.
* @const
*/
- var DEFAULT_WIDTH = window.innerWidth - 20;
+ var DEFAULT_WIDTH = 600;
/**
* Frames per second.
* @const
@@ -2352,99 +2483,184 @@ export default function Section({
}
};
- const TCapy = `T-Capy`;
+ interface CharacterSpriteProps {
+ size: "1x" | "2x";
+ spriteName: string;
+ }
+
+ const CharacterSprite: React.FC = ({
+ size,
+ spriteName,
+ }) => {
+ const dimensions = {
+ "1x": dimension1x.x1,
+ "2x": dimension2x.x2,
+ };
+
+ const { height, width, id } = dimensions[size][spriteName];
+ console.log({ height, width, id });
+
+ return customizeAssets[spriteName] ? (
+
+ ) : (
+
+ );
+ };
return (
-
-
{" "}
+
+ {/*
+
+
*/}
+ {/* */}
-
-
-
- {/*
- -
-
-
-
{count} */}
- {/*
- +
-
- */}
-
- {/*
+
{" "}
+ {/*
+
+
+
+
+
+
+
+
+
+
+
+
+ */}
+
+
+
+
+ {/*
He has been hungry since this time.
- Now help him collect all the food he wants :)
+ Now help him navigate safely to his home :)
*/}
-
- {/* <-- TCapy --> */}
-
-
-
+ {/* <-- TCapy --> */}
+
+
+
- {/* {TCapy} game
- from Google Chrome offline mode ripped
- */}
- {instructions}
-
-
-
- Sorry, this game only runs on the Google Chrome!
-
-
-
-
-
-
-
-
- {/*
*/}
- {customizeAssets?.characterSprite && (
-
- )}
-
+ {instructions}
+
+
+ Sorry, this game only runs on the Google Chrome!
-
-
-
-
-
-
-
- {customizeAssets?.characterSprite2x && (
-
- )}
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
+
Powered by HTMX
-
Powered by HTMX
+
+
+ {/* */}
+
+
+
);
diff --git a/sections/ItWorks.tsx b/sections/ItWorks.tsx
index f65d6d5..e2c6f77 100644
--- a/sections/ItWorks.tsx
+++ b/sections/ItWorks.tsx
@@ -1,5 +1,6 @@
import { useSection } from "deco/hooks/useSection.ts";
import Section404 from "./404Game.tsx";
+import { backgroundSvg } from "./imagesAndCss.tsx";
export interface Props {
/**
@@ -37,7 +38,7 @@ export default function Section({
}: Props) {
const propLink = (place) => {
return {
- heading: `Oops! Capy 🦫 is not here in ${place}`,
+ heading: `Oops! 404 Capy 🦫 not found in ${place}`,
subText: "Try searching 🔎 him in another place.",
place: place,
};
@@ -93,112 +94,140 @@ export default function Section({
props: propLink(PLACES.MOJAVE_DESERT),
});
+ const styleButton = `
+ color: black;
+ font-family: Inter;
+ background: #04b85f45;
+ border: 3px solid black;
+ border-radius: 12px;
+ text-align: left;
+ width: 100%;
+ height: 90px;
+ line-height: 1.4rem;
+ flex:1;
+ min-width: 200px;
+ `;
+
return (
-
+
-
-
- Search in {PLACES.AMAZON_JUNGLE}
-
-
- He might be in {PLACES.GREAT_BARRIER_REEF}
-
-
- He must be in {PLACES.HIMALAYAS}
-
-
- Please be here in {PLACES.SERENGETI_PLAINS}
-
-
- Surely he is here in {PLACES.DEATH_VALLEY}
-
-
- Maybe he is in {PLACES.SIBERIAN_TUNDRA}
-
-
- He could be in {PLACES.SAHARA_DESERT}
-
-
- Hopefully he should be in {PLACES.ROCKY_MOUNTAINS}
-
-
- Definitely he is in {PLACES.GRAND_CANYON}
-
-
- He should be in {PLACES.MOJAVE_DESERT} then
-
+ style={{ zIndex: 1, position: "relative", height: "fit-content" }}
+ class="container py-10 flex flex-col h-screen w-full items-center justify-center gap-16">
+
+
+
+
+ Search in {PLACES.AMAZON_JUNGLE}
+
+
+ He might be in {PLACES.GREAT_BARRIER_REEF}
+
+
+ He must be in {PLACES.HIMALAYAS}
+
+
+ Please be here in {PLACES.SERENGETI_PLAINS}
+
+
+ Surely he is here in {PLACES.DEATH_VALLEY}
+
+
+ Maybe he is in {PLACES.SIBERIAN_TUNDRA}
+
+
+ He could be in {PLACES.SAHARA_DESERT}
+
+
+ Hopefully he should be in {PLACES.ROCKY_MOUNTAINS}
+
+
+ Definitely he is in {PLACES.GRAND_CANYON}
+
+
+ He should be in {PLACES.MOJAVE_DESERT} then
+
+
+
+ {/*
Powered by HTMX
*/}
-
- {/*
Powered by HTMX
*/}
);
}
diff --git a/sections/imagesAndCss.tsx b/sections/imagesAndCss.tsx
index a21c2dd..b1feee8 100644
--- a/sections/imagesAndCss.tsx
+++ b/sections/imagesAndCss.tsx
@@ -12,7 +12,7 @@ const base64Images = {
"1x-trex":
"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQgAAAAvAgMAAABiRrxWAAAADFBMVEX///9TU1P39/f///+TS9URAAAAAXRSTlMAQObYZgAAAPpJREFUeF7d0jFKRkEMhdGLMM307itNLALyVmHvJuzTDMjdn72E95PGFEZSmeoU4YMMgxhskvQec8YSVFX1NhGcS5ywtbmC8khcZeKq+ZWJ4F8Sr2+ZCErjkJFEfcjAc/6/BMlfcz6xHdhRthYzIZhIHMcTVY1scUUiAphK8CMSPUbieTBhvD9Lj0vyV4wklEGzHpciKGOJoBp7XDcFs4kWxxM7Ey3iZ8JbzASAvMS7XLOJHTTvEkEZSeQl7DMuwVyCasqK5+XzQRYLUJlMbPXjFcn3m8eKBSjWZMJwvGIOvViAzCbUj1VEDoqFOEQGE3SyInJQLOQMJL4B7enP1UbLXJQAAAAASUVORK5CYII=",
"1x-restart":
- "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAgCAYAAAB6kdqOAAAACXBIWXMAAAWJAAAFiQFtaJ36AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADTSURBVHgB7ZjBDYMwDEVtxBLdricW6BxdgFO36xZt5UqWIlTVP8qHWCj/FCXBftg4BlQKra/nWzpomS7q41kKmNt1kR4y3w6lvWFc98f6jZRmgHEZ1CTJdC4gCzFbzRFiQ1FSxoSa0Y2RU1vfVmt5DVrJUITQCPzbh9oIgWrSEUUBsQWn7JfDKCU+V3NTlIeaedI3A7HbThPQHj1w9LJIAyhS1Tm0R3ffKowQs5IQW1DKGFCoDThlR713jyqLNIAipQPK9yntEz2hHMbGWi5k+B3zAZ8/VnrvUJJKAAAAAElFTkSuQmCC",
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACQAAAAgCAYAAAB6kdqOAAAACXBIWXMAAAWJAAAFiQFtaJ36AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAADUSURBVHgB7ZgxDsIwDEVt1BMwcT4WRs7CyML5mLhCkZEsRRWqf5TfxqrypyhJ7Ve7jtuqFPrM71k66KwX9fEkBcz9dZMeMt8Opb1hXI/r8xcpzQDjMqiTJNOxgCzEbDVHiA1FSRkTakI3Rk5tfVmt5TVoJUMRQiOwtg+1EQLVpCOKAmILTtk/h1FKfK7mpigPNfOkbwZit50moC164OhlkQZQpKpzaIvuvlQYIWYlIbaglDGgUBtwyvZ67x5VFmkARUoHlO9T2id6QjmMjbVcyPA75gvzSFdhGHXGhAAAAABJRU5ErkJggg==",
"2x-obstacle-large":
"data:image/png;base64,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",
"2x-obstacle-small":
@@ -26,7 +26,7 @@ const base64Images = {
"2x-trex":
"data:image/png;base64,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",
"2x-restart":
- "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABACAYAAAC5vjEqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFHSURBVHgB7ZzBbcJAEADPiCbSXV40kDrSAK90ly4AAVoeB2ZA3sMHnvkgGSzEaOTFHPZQRtju/vdlQWxWX8Ot7asid1nXG6Kcn+9NWRLxueuSLAi42FpqOTW/f9vTY5RkQcBgObeJkiwIUBCgIEBBgIKA2QQdp0RMip6xIGB2Qb2XZEFAN4J6LcmCgHVJZmoFsT+dG469T/Y5pQUBaQVlHz8eLSlrvzEsCJhcUKvJM7WArJIsCEifYkHrKVS/rlXJFgQ0K+hZev1N3IKA2QvqfTXFgoDZCnqXdTgLAhQEKAhQEKAgQEGAggAFAQoCmn2Tfod190ewIGByQXFO1Vsxrmq8iLRjUC8lubL6YtKn2Kf939qCAAUBCgIUBCgIUBCgIEBBgIIABQEKArzqucKrnp/k6n4VSy2pLiewIGAYe8K7v5yxIOAAk5ZjVkXFTKwAAAAASUVORK5CYII=",
+ "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAEgAAABACAYAAAC5vjEqAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAFJSURBVHgB7ZwxbsJAEADvIl6QKu9LkzJvSZkm70uVLxABWooDMyDv4QPPNEgGCzEaeTGHXcsEf9vfbVkRr/Wtntv+UuQim3ZDlPP581HWRHzutiQLAo621lpOy9f79/4xSrIgoFrOeaIkCwIUBCgIUBCgIGAxQbspEZNiZCwIWFzQ6CVZEDCMoFFLsiBgU5KZW0HsT+eGU++TfU5pQUBaQdnHj2tLytpvCgsCZhfUa/LMLSCrJAsC0qdY0HsKta/rVbIFAd0KupVRfxO3IGDxgkZfTbEgYLGCHmUdzoIABQEKAhQEKAhQEKAgQEGAgoBu36QfYd39GiwImF1QnFONVoyrGnci7Rg0SkmurN6Z9Cn2bP+3tiBAQYCCAAUBCgIUBCgIUBCgIEBBgIIAr3pu8KrnGzm5X8VaS2rLCSwIqFNPePeXAxYE/AMbuGPHtt2lLQAAAABJRU5ErkJggg==",
"offline-sound-press":
"data:audio/mpeg;base64,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",
"offline-sound-hit":
@@ -675,3 +675,3272 @@ html[subframe] body {
margin-top: 30px;
}
}`;
+
+export const backgroundSvg = `
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ `;