diff --git a/src/__data__/categories.ts b/src/__data__/categories.ts
index cf9c772a..8fab00fe 100644
--- a/src/__data__/categories.ts
+++ b/src/__data__/categories.ts
@@ -1,16 +1,10 @@
-import { CategoryAttributes } from "../entities/Category/types"
-
-export const categories: CategoryAttributes[] = [
+export const categoriesWithPlacesCount = [
{
name: "Art",
- active: true,
- created_at: new Date("2023-04-01T04:53:07.000Z"),
- updated_at: new Date("2023-04-01T04:53:07.000Z"),
+ count: "10",
},
{
name: "music",
- active: true,
- created_at: new Date("2023-04-01T04:53:07.000Z"),
- updated_at: new Date("2023-04-01T04:53:07.000Z"),
+ count: "10",
},
]
diff --git a/src/__data__/placeGenesisPlaza.ts b/src/__data__/placeGenesisPlaza.ts
index 1df5654f..0043edac 100644
--- a/src/__data__/placeGenesisPlaza.ts
+++ b/src/__data__/placeGenesisPlaza.ts
@@ -11,11 +11,8 @@ export const placeGenesisPlaza: PlaceAttributes = {
like_score: 0,
highlighted: false,
highlighted_image: null,
- featured: false,
- featured_image: null,
disabled: false,
updated_at: new Date("2023-03-28T18:37:39.918Z"),
- categories: [],
world: false,
world_name: null,
title: "Genesis Plaza",
@@ -23,7 +20,6 @@ export const placeGenesisPlaza: PlaceAttributes = {
"Jump in to strike up a chat with other visitors, retake the commands tutorial with a cute floating robot, or dive into the swirling portal to get to Decentraland's visitor center.",
owner: null,
image: "https://decentraland.org/images/thumbnail/genesis-plaza.png",
- tags: ["plaza"],
base_position: "-9,-9",
positions: [
"-1,-1",
@@ -415,4 +411,5 @@ export const placeGenesisPlaza: PlaceAttributes = {
deployed_at: new Date("2022-11-14T17:22:05.307Z"),
hidden: false,
textsearch: undefined,
+ categories: [],
}
diff --git a/src/__data__/placeGenesisPlazaWithAggregatedAttributes.ts b/src/__data__/placeGenesisPlazaWithAggregatedAttributes.ts
index a14abfae..3f578161 100644
--- a/src/__data__/placeGenesisPlazaWithAggregatedAttributes.ts
+++ b/src/__data__/placeGenesisPlazaWithAggregatedAttributes.ts
@@ -10,7 +10,6 @@ export const placeGenesisPlazaWithAggregatedAttributes: AggregatePlaceAttributes
"Jump in to strike up a chat with other visitors, retake the commands tutorial with a cute floating robot, or dive into the swirling portal to get to Decentraland's visitor center.",
image: "https://localhost:8000/images/places/genesis_plaza.jpg",
owner: null,
- tags: [],
positions: [
"-1,-1",
"-1,-2",
@@ -408,8 +407,6 @@ export const placeGenesisPlazaWithAggregatedAttributes: AggregatePlaceAttributes
like_score: 0,
highlighted: true,
highlighted_image: "/images/places/genesis_plaza_banner.jpg",
- featured: false,
- featured_image: null,
user_favorite: false,
user_like: false,
user_dislike: false,
diff --git a/src/__data__/placeRoad.ts b/src/__data__/placeRoad.ts
index d2be41f2..1f4b7d2e 100644
--- a/src/__data__/placeRoad.ts
+++ b/src/__data__/placeRoad.ts
@@ -11,18 +11,14 @@ export const placeRoad: PlaceAttributes = {
like_score: 0,
highlighted: false,
highlighted_image: null,
- featured: false,
- featured_image: null,
disabled: false,
updated_at: new Date("2023-03-28T18:37:39.918Z"),
- categories: [],
world: false,
world_name: null,
title: "Road at -89,11 (open road OpenRoad_C)",
description: null,
owner: null,
image: "https://decentraland.org/images/thumbnail/road.png",
- tags: ["road"],
base_position: "-89,11",
positions: ["-89,11"],
contact_name: "Decentraland Foundation",
@@ -33,4 +29,5 @@ export const placeRoad: PlaceAttributes = {
deployed_at: new Date("2022-11-14T17:22:05.307Z"),
hidden: false,
textsearch: undefined,
+ categories: [],
}
diff --git a/src/__data__/world.ts b/src/__data__/world.ts
index 7ba97737..f64c12ec 100644
--- a/src/__data__/world.ts
+++ b/src/__data__/world.ts
@@ -17,7 +17,6 @@ export const worldPlaceParalax: PlaceAttributes = {
image:
"https://api.decentraland.org/v2/map.png?height=1024&width=1024&selected=0%2C0¢er=0%2C0&size=20",
owner: null,
- tags: [],
positions: ["0,0"],
base_position: "0,0",
contact_name: "paralax",
@@ -31,17 +30,15 @@ export const worldPlaceParalax: PlaceAttributes = {
likes: 0,
dislikes: 0,
like_score: 0,
- categories: [],
like_rate: 0.5,
highlighted: false,
highlighted_image: null,
- featured: false,
- featured_image: null,
world: true,
world_name: "paralax.dcl.eth",
deployed_at: new Date("2023-03-28T13:05:45.437Z"),
hidden: false,
textsearch: undefined,
+ categories: [],
}
export const worldPlaceParalaxWithAggregated: AggregatePlaceAttributes = {
@@ -51,7 +48,6 @@ export const worldPlaceParalaxWithAggregated: AggregatePlaceAttributes = {
image:
"https://api.decentraland.org/v2/map.png?height=1024&width=1024&selected=0%2C0¢er=0%2C0&size=20",
owner: null,
- tags: [],
positions: ["0,0"],
base_position: "0,0",
contact_name: "paralax",
@@ -64,13 +60,10 @@ export const worldPlaceParalaxWithAggregated: AggregatePlaceAttributes = {
favorites: 0,
likes: 0,
dislikes: 0,
- categories: [],
like_rate: 0.5,
like_score: 0,
highlighted: false,
highlighted_image: null,
- featured: false,
- featured_image: null,
world: true,
world_name: "paralax.dcl.eth",
deployed_at: new Date("2023-03-28T13:05:45.437Z"),
@@ -79,6 +72,7 @@ export const worldPlaceParalaxWithAggregated: AggregatePlaceAttributes = {
user_like: false,
user_dislike: false,
textsearch: undefined,
+ categories: [],
}
export const worldContentEntitySceneParalax: ContentEntityScene = {
@@ -199,7 +193,6 @@ export const worldPlaceTemplegame: AggregatePlaceAttributes = {
image:
"https://peer.decentraland.org/content/contents/bafkreiag7fylur5qlntcxb2oyaw3asmchxsbhoxnw6iipayfgj4wwmqkli",
owner: null,
- tags: [],
positions: [
"-1,0",
"-1,1",
@@ -273,13 +266,10 @@ export const worldPlaceTemplegame: AggregatePlaceAttributes = {
favorites: 0,
likes: 0,
dislikes: 0,
- categories: [],
like_rate: 0.5,
like_score: 0,
highlighted: false,
highlighted_image: null,
- featured: false,
- featured_image: null,
world: true,
world_name: "templegame.dcl.eth",
deployed_at: new Date("2023-05-16T15:44:26.395Z"),
@@ -289,4 +279,5 @@ export const worldPlaceTemplegame: AggregatePlaceAttributes = {
user_dislike: false,
user_count: 3,
textsearch: undefined,
+ categories: [],
}
diff --git a/src/api/Places.ts b/src/api/Places.ts
index 33fb9976..671d716b 100644
--- a/src/api/Places.ts
+++ b/src/api/Places.ts
@@ -4,9 +4,11 @@ import Options from "decentraland-gatsby/dist/utils/api/Options"
import Time from "decentraland-gatsby/dist/utils/date/Time"
import env from "decentraland-gatsby/dist/utils/env"
+import { DecentralandCategories } from "../entities/Category/types"
import {
AggregatePlaceAttributes,
PlaceListOptions,
+ PlaceListOrderBy,
} from "../entities/Place/types"
import { UpdateUserFavoriteResponse } from "../entities/UserFavorite/types"
import { UpdateUserLikeResponse } from "../entities/UserLikes/types"
@@ -121,7 +123,7 @@ export default class Places extends API {
async getPlacesHightRated(options?: { limit: number; offset: number }) {
return this.getPlaces({
- order_by: "like_rate",
+ order_by: PlaceListOrderBy.LIKE_SCORE_BEST,
order: "desc",
...options,
})
@@ -137,7 +139,7 @@ export default class Places extends API {
async getPlacesMostActive(options?: { limit: number; offset: number }) {
return this.getPlaces({
- order_by: "most_active",
+ order_by: PlaceListOrderBy.MOST_ACTIVE,
order: "desc",
...options,
})
@@ -145,8 +147,8 @@ export default class Places extends API {
async getPlacesFeatured(options?: { limit: number; offset: number }) {
return this.getPlaces({
- only_featured: true,
...options,
+ categories: [DecentralandCategories.FEATURED],
})
}
@@ -192,4 +194,22 @@ export default class Places extends API {
this.options({ method: "PUT" }).json(params).authorization({ sign: true })
)
}
+
+ async getCategories() {
+ const result = await super.fetch<{
+ ok: boolean
+ data: { name: string; count: number }[]
+ }>("/categories")
+
+ return result.data
+ }
+
+ async getPlaceCategories(placeId: string) {
+ const result = await super.fetch<{
+ ok: boolean
+ data: { categories: string[] }
+ }>(`/places/${placeId}/categories`)
+
+ return result.data
+ }
}
diff --git a/src/components/Button/CategoryButtons.css b/src/components/Button/CategoryButtons.css
new file mode 100644
index 00000000..3b2b3bcf
--- /dev/null
+++ b/src/components/Button/CategoryButtons.css
@@ -0,0 +1,15 @@
+.category-buttons__container {
+ display: flex;
+ flex-wrap: wrap;
+ width: 100%;
+}
+
+.category-buttons__container > .category-button {
+ margin: 0 17px 17px 0;
+}
+
+.category-buttons__container > .dg.Link.ui.button.category-button {
+ background-color: var(--text-on-primary);
+ font-weight: normal;
+ color: var(--text-on-secondary);
+}
diff --git a/src/components/Button/CategoryButtons.tsx b/src/components/Button/CategoryButtons.tsx
new file mode 100644
index 00000000..f2bb9c94
--- /dev/null
+++ b/src/components/Button/CategoryButtons.tsx
@@ -0,0 +1,38 @@
+import React from "react"
+
+import useFormatMessage from "decentraland-gatsby/dist/hooks/useFormatMessage"
+import { Link } from "decentraland-gatsby/dist/plugins/intl"
+import TokenList from "decentraland-gatsby/dist/utils/dom/TokenList"
+import { Button } from "decentraland-ui/dist/components/Button/Button"
+
+import { PlaceListOrderBy } from "../../entities/Place/types"
+import locations from "../../modules/locations"
+
+import "./CategoryButtons.css"
+
+type CategoryButtonsProps = {
+ categories: string[]
+ className?: string
+}
+
+export const CategoryButtons = (props: CategoryButtonsProps) => {
+ const { categories, className } = props
+ const l = useFormatMessage()
+
+ return (
+
+ {categories.map((category) => (
+
+ ))}
+
+ )
+}
diff --git a/src/components/Category/CategoryFilter.css b/src/components/Category/CategoryFilter.css
new file mode 100644
index 00000000..a950e5c6
--- /dev/null
+++ b/src/components/Category/CategoryFilter.css
@@ -0,0 +1,33 @@
+.category-filter__box {
+ margin-right: 8px;
+ margin-bottom: 8px;
+}
+
+.category-filter__box .dcl.filter .filter-background {
+ background-color: var(--primary);
+ opacity: 1;
+}
+
+.category-filter__box--not-active .dcl.filter .filter-background {
+ background-color: var(--background);
+}
+
+.category-filter__box .dcl.filter > span {
+ color: var(--text-on-primary);
+ display: flex;
+ align-items: center;
+}
+
+.category-filter__box.category-filter__box--not-active .dcl.filter > span {
+ color: var(--text);
+}
+
+.category-filter__icon {
+ width: 20px;
+ height: 20px;
+ margin-left: 2px;
+}
+
+.category-filter__box > .dcl.filter {
+ margin-bottom: 2px;
+}
diff --git a/src/components/Category/CategoryFilter.tsx b/src/components/Category/CategoryFilter.tsx
new file mode 100644
index 00000000..ec0884e2
--- /dev/null
+++ b/src/components/Category/CategoryFilter.tsx
@@ -0,0 +1,41 @@
+import React, { useCallback } from "react"
+
+import useFormatMessage from "decentraland-gatsby/dist/hooks/useFormatMessage"
+import TokenList from "decentraland-gatsby/dist/utils/dom/TokenList"
+import { Filter } from "decentraland-ui/dist/components/Filter/Filter"
+
+import "./CategoryFilter.css"
+
+export type CategoryFilterProps = {
+ category: string
+ onChange?: (
+ e: React.MouseEvent,
+ props: CategoryFilterProps
+ ) => void
+ active?: boolean
+ actionIcon?: React.ReactNode
+}
+
+export const CategoryFilter = (props: CategoryFilterProps) => {
+ const { category, active, onChange, actionIcon } = props
+ const l = useFormatMessage()
+
+ const handleClick = useCallback(
+ (e) => onChange && onChange(e, { active: !active, category }),
+ [active, onChange, category]
+ )
+ return (
+
+
+ {l(`categories.${category}`)}
+ {active && {actionIcon}}
+
+
+ )
+}
diff --git a/src/components/Category/CategoryFilters.tsx b/src/components/Category/CategoryFilters.tsx
new file mode 100644
index 00000000..540846b4
--- /dev/null
+++ b/src/components/Category/CategoryFilters.tsx
@@ -0,0 +1,45 @@
+import React from "react"
+
+import { Category } from "../../entities/Category/types"
+import { CategoryFilter, CategoryFilterProps } from "./CategoryFilter"
+
+type CategoryFiltersProps = {
+ categories: Category[]
+ onChange: (
+ e: React.MouseEvent,
+ props: CategoryFilterProps
+ ) => void
+ onlyActives?: boolean
+ filtersIcon?: React.ReactNode
+ unremovableFilters?: boolean
+ className?: string
+}
+
+export const CategoryFilters = (props: CategoryFiltersProps) => {
+ const {
+ categories,
+ onChange,
+ filtersIcon,
+ onlyActives,
+ // TODO: review a way to do this or if this is needed (@lauti7)
+ // unremovableFilters,
+ className,
+ } = props
+
+ return (
+
+ {categories
+ .filter(({ active }) => (onlyActives ? active : true))
+ .sort((a, b) => (a.name === b.name ? 0 : a.name < b.name ? -1 : 1))
+ .map((category) => (
+
+ ))}
+
+ )
+}
diff --git a/src/components/Category/CategoryList.css b/src/components/Category/CategoryList.css
new file mode 100644
index 00000000..5d09098c
--- /dev/null
+++ b/src/components/Category/CategoryList.css
@@ -0,0 +1,41 @@
+.category-list__box {
+ background-color: var(--secondary-on-modal-hover);
+ width: 248px;
+ padding: 16px;
+ border-radius: 10px;
+}
+
+.category-list__title {
+ margin-bottom: 15px;
+ display: flex;
+ align-items: center;
+}
+
+.category-list__title > p {
+ color: var(--secondary-text);
+ letter-spacing: 1px;
+ font-weight: 700;
+ font-size: 14px;
+ margin: 0 16px 0 0;
+ text-transform: uppercase;
+}
+
+.category-list__title > .ui.label {
+ font-weight: 700;
+ font-size: 8px;
+ background-color: var(--primary);
+ padding: 2px 5px;
+ line-height: normal;
+ border-radius: 3px;
+ color: var(--text-on-primary);
+}
+
+.category-list__listing {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.category-list__listing > .category-filter__box {
+ margin-bottom: 8px;
+ margin-right: 8px;
+}
diff --git a/src/components/Category/CategoryList.tsx b/src/components/Category/CategoryList.tsx
new file mode 100644
index 00000000..ba7a0f5d
--- /dev/null
+++ b/src/components/Category/CategoryList.tsx
@@ -0,0 +1,41 @@
+import React from "react"
+
+import useFormatMessage from "decentraland-gatsby/dist/hooks/useFormatMessage"
+
+import { Category } from "../../entities/Category/types"
+import { Check } from "../Icon/Check"
+import { NewLabel } from "../Label/NewLabel/NewLabel"
+import { CategoryFilterProps } from "./CategoryFilter"
+import { CategoryFilters } from "./CategoryFilters"
+
+import "./CategoryList.css"
+
+type CategoryList = {
+ onChange: (
+ e: React.MouseEvent,
+ props: CategoryFilterProps
+ ) => void
+ categories: Category[]
+ applyfilter?: boolean
+}
+
+export const CategoryList = React.memo((props: CategoryList) => {
+ const { categories, onChange } = props
+ const l = useFormatMessage()
+
+ return (
+
+
+ }
+ unremovableFilters
+ className="category-list__listing"
+ />
+
+ )
+})
diff --git a/src/components/Category/CategorySections.css b/src/components/Category/CategorySections.css
new file mode 100644
index 00000000..69c8cdee
--- /dev/null
+++ b/src/components/Category/CategorySections.css
@@ -0,0 +1,30 @@
+.category-sections__box {
+ background-color: var(--secondary-on-modal-hover);
+ width: 100%;
+ padding: 35px;
+}
+
+.category-sections__title {
+ margin-bottom: 25px;
+ display: flex;
+ align-items: center;
+}
+
+.category-sections__title > p {
+ color: var(--secondary-text);
+ letter-spacing: 1px;
+ font-weight: 700;
+ font-size: 14px;
+ margin: 0 16px 0 0;
+ text-transform: uppercase;
+}
+
+.category-sections__title > .ui.label {
+ font-weight: 700;
+ font-size: 8px;
+ background-color: var(--primary);
+ line-height: normal;
+ padding: 2px 5px;
+ border-radius: 3px;
+ color: var(--text-on-primary);
+}
diff --git a/src/components/Category/CategorySections.tsx b/src/components/Category/CategorySections.tsx
new file mode 100644
index 00000000..bd90ff67
--- /dev/null
+++ b/src/components/Category/CategorySections.tsx
@@ -0,0 +1,27 @@
+import React from "react"
+
+import useFormatMessage from "decentraland-gatsby/dist/hooks/useFormatMessage"
+
+import { CategoryButtons } from "../Button/CategoryButtons"
+import { NewLabel } from "../Label/NewLabel/NewLabel"
+
+import "./CategorySections.css"
+
+type CategorySectionsProps = {
+ categories: string[]
+}
+
+export const CategorySections = (props: CategorySectionsProps) => {
+ const { categories } = props
+ const l = useFormatMessage()
+
+ return (
+
+
+
+
+ )
+}
diff --git a/src/components/Icon/Check.tsx b/src/components/Icon/Check.tsx
new file mode 100644
index 00000000..91e5c58d
--- /dev/null
+++ b/src/components/Icon/Check.tsx
@@ -0,0 +1,15 @@
+import React from "react"
+
+export type CheckIconProps = React.SVGAttributes
+
+export const Check = React.memo((props: CheckIconProps) => (
+
+))
diff --git a/src/components/Icon/Close.tsx b/src/components/Icon/Close.tsx
new file mode 100644
index 00000000..0466c0d0
--- /dev/null
+++ b/src/components/Icon/Close.tsx
@@ -0,0 +1,37 @@
+import React from "react"
+
+type CloseProps = React.SVGAttributes & {
+ type?: "primary" | "secondary"
+}
+
+export const Close = React.memo(
+ ({ type = "primary", ...props }: CloseProps) => {
+ return (
+ <>
+ {type === "primary" && (
+
+ )}
+ {type !== "primary" && (
+
+ )}
+ >
+ )
+ }
+)
diff --git a/src/components/Icon/Filter.tsx b/src/components/Icon/Filter.tsx
new file mode 100644
index 00000000..f7208757
--- /dev/null
+++ b/src/components/Icon/Filter.tsx
@@ -0,0 +1,36 @@
+import React from "react"
+
+export type FilterProps = React.SVGAttributes
+
+export const Filter = React.memo((props: FilterProps) => (
+
+))
diff --git a/src/components/Icon/Trash.tsx b/src/components/Icon/Trash.tsx
new file mode 100644
index 00000000..d233b6dc
--- /dev/null
+++ b/src/components/Icon/Trash.tsx
@@ -0,0 +1,15 @@
+import React from "react"
+
+export const Trash = React.memo((props: React.SVGAttributes) => (
+
+))
diff --git a/src/components/Label/NewLabel/NewLabel.tsx b/src/components/Label/NewLabel/NewLabel.tsx
new file mode 100644
index 00000000..d9d28527
--- /dev/null
+++ b/src/components/Label/NewLabel/NewLabel.tsx
@@ -0,0 +1,20 @@
+import React from "react"
+
+import useFormatMessage from "decentraland-gatsby/dist/hooks/useFormatMessage"
+import Label from "semantic-ui-react/dist/commonjs/elements/Label"
+
+export type NewLabelProps = {
+ title: string
+ className?: string
+}
+
+export const NewLabel = React.memo(({ title, className }: NewLabelProps) => {
+ const l = useFormatMessage()
+
+ return (
+
+
{title}
+
+
+ )
+})
diff --git a/src/components/Layout/Navigation.tsx b/src/components/Layout/Navigation.tsx
index d16d295c..a4d2670b 100644
--- a/src/components/Layout/Navigation.tsx
+++ b/src/components/Layout/Navigation.tsx
@@ -1,19 +1,16 @@
-import React, { useCallback, useMemo } from "react"
+import React from "react"
-import { useLocation } from "@gatsbyjs/reach-router"
import NavigationMenu from "decentraland-gatsby/dist/components/Layout/NavigationMenu"
import useAuthContext from "decentraland-gatsby/dist/context/Auth/useAuthContext"
import useFeatureFlagContext from "decentraland-gatsby/dist/context/FeatureFlag/useFeatureFlagContext"
import useTrackLinkContext from "decentraland-gatsby/dist/context/Track/useTrackLinkContext"
import useFormatMessage from "decentraland-gatsby/dist/hooks/useFormatMessage"
-import { navigate } from "decentraland-gatsby/dist/plugins/intl"
import { PlaceListOrderBy } from "../../entities/Place/types"
import { WorldListOrderBy } from "../../entities/World/types"
import { FeatureFlags } from "../../modules/ff"
import locations from "../../modules/locations"
import { OpenBlank } from "../Icon/OpenBlank"
-import SearchInput from "./SearchInput"
import "./Navigation.css"
@@ -34,35 +31,6 @@ export default function Navigation(props: NavigationProps) {
const track = useTrackLinkContext()
const [ff] = useFeatureFlagContext()
- const location = useLocation()
-
- const params = useMemo(
- () => new URLSearchParams(location.search),
- [location.search]
- )
-
- const handleSearchChange = useCallback(
- (e: React.ChangeEvent) => {
- const newParams = new URLSearchParams(params)
- if (e.target.value) {
- newParams.set("search", e.target.value)
- } else {
- newParams.delete("search")
- }
-
- let target = location.pathname
- const search = newParams.toString()
- // location
- // navigate to /search+=?search=${search}
- if (search) {
- target += "?" + search
- }
-
- navigate(target)
- },
- [location.pathname, params]
- )
-
return (
>
}
- rightMenu={
- props.activeTab && (
-
- )
- }
/>
)
}
diff --git a/src/components/Layout/OverviewList.tsx b/src/components/Layout/OverviewList.tsx
index a0b4b26f..d775f278 100644
--- a/src/components/Layout/OverviewList.tsx
+++ b/src/components/Layout/OverviewList.tsx
@@ -16,10 +16,9 @@ import PlaceList from "../Place/PlaceList/PlaceList"
import "./OverviewList.css"
-export type OverviewListProps = {
+type BaseOverviewListProps = {
places: AggregatePlaceAttributes[]
title: string | React.ReactNode
- href: string
loading: boolean
onClickFavorite: (
e: React.MouseEvent,
@@ -32,12 +31,24 @@ export type OverviewListProps = {
searchResultCount?: number
}
+type OverviewListPropsWithHref = BaseOverviewListProps & {
+ href: string
+ onClick?: never
+}
+type OverviewListPropsWithOnClick = BaseOverviewListProps & {
+ onClick: () => void
+ href?: never
+}
+
+export type OverviewListProps =
+ | OverviewListPropsWithHref
+ | OverviewListPropsWithOnClick
+
export default React.memo(function OverviewList(props: OverviewListProps) {
const {
places,
title,
loading,
- href,
onClickFavorite,
loadingFavorites,
dataPlace,
@@ -68,18 +79,39 @@ export default React.memo(function OverviewList(props: OverviewListProps) {
)}
-
+ {props.href && (
+
+ )}
+ {props.onClick && (
+
+ )}
diff --git a/src/components/Layout/SearchInput.css b/src/components/Layout/SearchInput.css
index 72a4fa06..0b0e22ef 100644
--- a/src/components/Layout/SearchInput.css
+++ b/src/components/Layout/SearchInput.css
@@ -5,6 +5,7 @@
background: white no-repeat 8px center;
background-image: url("../../images/magnify.svg");
min-width: 356px;
+ width: 95%;
height: 40px;
}
diff --git a/src/components/Layout/SearchList.tsx b/src/components/Layout/SearchList.tsx
index 0e41e756..b40e9928 100644
--- a/src/components/Layout/SearchList.tsx
+++ b/src/components/Layout/SearchList.tsx
@@ -2,12 +2,7 @@ import React from "react"
import useFormatMessage from "decentraland-gatsby/dist/hooks/useFormatMessage"
-import {
- AggregatePlaceAttributes,
- PlaceListOrderBy,
-} from "../../entities/Place/types"
-import { WorldListOrderBy } from "../../entities/World/types"
-import watermelonIcon from "../../images/watermelon-icon.svg"
+import { AggregatePlaceAttributes } from "../../entities/Place/types"
import locations from "../../modules/locations"
import { SegmentPlace } from "../../modules/segment"
import NoResults from "./NoResults"
diff --git a/src/components/Modal/CategoryModal.css b/src/components/Modal/CategoryModal.css
new file mode 100644
index 00000000..5da1620f
--- /dev/null
+++ b/src/components/Modal/CategoryModal.css
@@ -0,0 +1,123 @@
+.categories-modal__layer {
+ height: 100vh;
+ width: 100%;
+ position: absolute;
+ top: 0;
+ background-color: rgba(0, 0, 0, 0.248);
+ z-index: 21; /* due to navbar */
+}
+
+.ui.grid > .categories-modal__layer {
+ padding: 0;
+}
+
+.ui.grid > .categories-modal__layer > .categories-modal__box {
+ padding: 0;
+}
+
+.ui.page.modals.dimmer.transition.visible.active {
+ z-index: 2147483004;
+}
+
+.ui.modal.categories-modal__box {
+ animation: slide-up 0.3s ease-out;
+ display: flex !important;
+ flex-direction: column;
+ border-radius: 16px 16px 0 0;
+ height: 50vh;
+ position: fixed;
+ bottom: 0;
+ background-color: #ecebed;
+ justify-content: space-between;
+}
+
+.ui.modal .header.categories-modal__header .categories-modal__text--smaller {
+ width: 160px;
+ margin-left: 0;
+}
+
+.ui.modal .header.categories-modal__header {
+ display: flex;
+ justify-content: space-between;
+ border-radius: 16px 16px 0 0;
+ align-items: center;
+ background-color: white;
+ padding: 10px 0 !important;
+ margin: 0;
+}
+
+.ui.modal .header.categories-modal__header > .clear-all {
+ width: 86px;
+}
+
+.ui.modal .header.categories-modal__header > p {
+ margin-bottom: 0;
+ color: #a09ba8;
+ font-size: 14px;
+ width: 240px;
+ margin-left: 16px;
+}
+
+.ui.modal .header.categories-modal__header > .close-btn {
+ height: 24px;
+ margin-bottom: 2px;
+ width: 24px;
+ padding: 0;
+ margin-right: 16px;
+}
+
+.ui.modal .content.categories-modal__content {
+ display: flex;
+ flex-wrap: wrap;
+ align-content: baseline;
+ width: 100%;
+ padding: 10px 8px;
+ background: none;
+ margin: 0;
+ flex-grow: 1;
+}
+
+.ui.modal .content.categories-modal__content .category-filter__box {
+ margin: 8px;
+ display: inline-block;
+}
+
+.ui.modal .actions.categories-modal__footer {
+ width: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ background: none;
+ margin: 0;
+}
+
+.ui.modal .actions.categories-modal__footer > .ui.button {
+ width: 75%;
+ margin: 0 0 10px 0;
+}
+
+.ui.page.dimmer {
+ perspective: none;
+}
+
+@keyframes slide-up {
+ 0% {
+ transform: translateY(100%);
+ opacity: 0;
+ }
+ 100% {
+ transform: translateY(0);
+ opacity: 1;
+ }
+}
+
+@keyframes slide-down {
+ 0% {
+ transform: translateY(0);
+ opacity: 1;
+ }
+ 100% {
+ transform: translateY(100%);
+ opacity: 0;
+ }
+}
diff --git a/src/components/Modal/CategoryModal.tsx b/src/components/Modal/CategoryModal.tsx
new file mode 100644
index 00000000..bb8cc180
--- /dev/null
+++ b/src/components/Modal/CategoryModal.tsx
@@ -0,0 +1,95 @@
+import React, { useCallback, useMemo } from "react"
+
+import useFormatMessage from "decentraland-gatsby/dist/hooks/useFormatMessage"
+import TokenList from "decentraland-gatsby/dist/utils/dom/TokenList"
+import { Button } from "decentraland-ui/dist/components/Button/Button"
+import { Modal, ModalProps } from "decentraland-ui/dist/components/Modal/Modal"
+
+import { Category } from "../../entities/Category/types"
+import { CategoryFilterProps } from "../Category/CategoryFilter"
+import { CategoryFilters } from "../Category/CategoryFilters"
+import { Check } from "../Icon/Check"
+import { Close } from "../Icon/Close"
+
+import "./CategoryModal.css"
+
+export type CategoryModalProps = ModalProps & {
+ categories: Category[]
+ onChange: (
+ e: React.MouseEvent,
+ props: CategoryFilterProps
+ ) => void
+ onClearAll: () => void
+}
+
+export const CategoryModal = React.memo((props: CategoryModalProps) => {
+ const { categories, onChange, onClearAll, onClose, onActionClick, ...rest } =
+ props
+
+ const l = useFormatMessage()
+
+ const selectedCategories = useMemo(
+ () =>
+ new Set(
+ categories.filter(({ active }) => active).map(({ name }) => name)
+ ),
+ [categories]
+ )
+
+ const handleClose = useCallback(
+ (e) => onClose && onClose(e, { ...props, open: false }),
+ [onClose]
+ )
+
+ const handleAction = useCallback(
+ (e) => onActionClick && onActionClick(e, props),
+ [onActionClick]
+ )
+
+ return (
+
+
+
+ 0 && "categories-modal__text--smaller",
+ ])}
+ >
+ {selectedCategories.size
+ ? l("components.modal.category.quantity_selected", {
+ quantity: selectedCategories.size,
+ })
+ : l("components.modal.category.one_or_more")}
+
+ }
+ onClick={handleClose}
+ />
+
+
+ }
+ />
+
+
+
+
+
+ )
+})
diff --git a/src/components/Place/PlaceDetails/PlaceDetails.css b/src/components/Place/PlaceDetails/PlaceDetails.css
index e8fa0505..c3787c59 100644
--- a/src/components/Place/PlaceDetails/PlaceDetails.css
+++ b/src/components/Place/PlaceDetails/PlaceDetails.css
@@ -37,7 +37,7 @@
border-radius: 8px;
}
-.place-details__container .place-details__description-container h3 {
+.place-details__container h3 {
text-transform: uppercase;
font-size: 14px;
color: var(--secondary-text);
@@ -98,6 +98,19 @@
justify-content: flex-start;
}
+.place-details__categories-container {
+ border-top: solid 1px rgba(115, 110, 125, 0.24);
+ width: 100%;
+ padding: 25px 20px;
+}
+
+.place-details__categories-container
+ .category-filter__box
+ .dcl.filter
+ .filter-background {
+ background: var(--secondary-on-modal);
+}
+
@media (max-width: 768px) {
.place-details__container
> .dcl.tabs
diff --git a/src/components/Place/PlaceDetails/PlaceDetails.tsx b/src/components/Place/PlaceDetails/PlaceDetails.tsx
index 1d5b1db7..74cdc752 100644
--- a/src/components/Place/PlaceDetails/PlaceDetails.tsx
+++ b/src/components/Place/PlaceDetails/PlaceDetails.tsx
@@ -21,6 +21,7 @@ import { FeatureFlags } from "../../../modules/ff"
import { getPois } from "../../../modules/pois"
import { getRating } from "../../../modules/rating"
import RatingButton, { RatingButtonProps } from "../../Button/RatingButton"
+import { CategoryFilter } from "../../Category/CategoryFilter"
import PlaceStats from "../PlaceStats/PlaceStats"
import "./PlaceDetails.css"
@@ -103,6 +104,14 @@ export default React.memo(function PlaceDetails(props: PlaceDetailsProps) {
+ {place?.categories.length && (
+
+
{l("components.place_detail.appears_on")}
+ {place.categories.map((id) => (
+
+ ))}
+
+ )}
>
)}
diff --git a/src/components/Place/PlaceList/PlaceList.css b/src/components/Place/PlaceList/PlaceList.css
index 5e238a35..24e676cd 100644
--- a/src/components/Place/PlaceList/PlaceList.css
+++ b/src/components/Place/PlaceList/PlaceList.css
@@ -38,6 +38,6 @@
}
.place-list__container .ui.card:first-child {
- margin-top: 0;
+ margin-top: 10px;
}
}
diff --git a/src/entities/Category/getCategories.test.ts b/src/entities/Category/getCategories.test.ts
index e56d2944..3eded32c 100644
--- a/src/entities/Category/getCategories.test.ts
+++ b/src/entities/Category/getCategories.test.ts
@@ -3,7 +3,7 @@ import { getCategoryList } from "./routes"
const findCategoriesWithPlaces = jest.spyOn(
CategoryModel,
- "findCategoriesWithPlaces"
+ "findActiveCategoriesWithPlaces"
)
test("should return list of categories", async () => {
diff --git a/src/entities/Category/model.test.ts b/src/entities/Category/model.test.ts
index f5957dd6..4b151cc9 100644
--- a/src/entities/Category/model.test.ts
+++ b/src/entities/Category/model.test.ts
@@ -1,12 +1,14 @@
-import { categories } from "../../__data__/categories"
+import { categoriesWithPlacesCount } from "../../__data__/categories"
import CategoryModel from "./model"
const find = jest.spyOn(CategoryModel, "namedQuery")
describe("CategoryModel", () => {
test("should find categories with places", async () => {
- find.mockResolvedValueOnce(Promise.resolve(categories))
- const categoriesFound = await CategoryModel.findCategoriesWithPlaces()
- expect(categoriesFound).toEqual(categories)
+ find.mockResolvedValueOnce(Promise.resolve(categoriesWithPlacesCount))
+ const categoriesFound = await CategoryModel.findActiveCategoriesWithPlaces()
+ expect(categoriesFound).toEqual(
+ categoriesWithPlacesCount.map((c) => ({ ...c, count: Number(c.count) }))
+ )
})
})
diff --git a/src/entities/Category/model.ts b/src/entities/Category/model.ts
index cccfa24d..dbdd7eee 100644
--- a/src/entities/Category/model.ts
+++ b/src/entities/Category/model.ts
@@ -1,21 +1,43 @@
import { Model } from "decentraland-gatsby/dist/entities/Database/model"
import { SQL, table } from "decentraland-gatsby/dist/entities/Database/utils"
-import { CategoryAttributes } from "./types"
+import PlaceCategories from "../PlaceCategories/model"
+import { CategoryAttributes, CategoryWithPlaceCount } from "./types"
export default class CategoryModel extends Model {
static tableName = "categories"
static primaryKey = "name"
- static findCategoriesWithPlaces = async () => {
- const query = SQL`SELECT * FROM ${table(CategoryModel)}
- WHERE places_counter != 0
- AND active is true
- ORDER BY name ASC`
- const categoriesFound = await CategoryModel.namedQuery(
- "find_categories_with_places",
+ static findActiveCategories = async () => {
+ const query = SQL`
+ SELECT c.name FROM ${table(CategoryModel)} WHERE c.active IS true
+ `
+
+ return await CategoryModel.namedQuery<{ name: string }>(
+ "find_active_categories",
query
)
- return categoriesFound
+ }
+
+ static async findActiveCategoriesWithPlaces(): Promise<
+ CategoryWithPlaceCount[]
+ > {
+ const query = SQL`
+ SELECT c.name, count(pc.place_id) as count FROM ${table(CategoryModel)} c
+ LEFT JOIN ${table(PlaceCategories)} pc ON pc.category_id = c.name
+ WHERE c.active IS true
+ GROUP BY c.name
+ ORDER BY count DESC
+ `
+
+ const categories = await CategoryModel.namedQuery<{
+ name: string
+ count: string
+ }>("find_active_categories_with_places_count", query)
+
+ return categories.map((category) => ({
+ ...category,
+ count: Number(category.count),
+ }))
}
}
diff --git a/src/entities/Category/routes.ts b/src/entities/Category/routes.ts
index 58fd0d8e..a8918837 100644
--- a/src/entities/Category/routes.ts
+++ b/src/entities/Category/routes.ts
@@ -1,6 +1,7 @@
import ApiResponse from "decentraland-gatsby/dist/entities/Route/wkc/response/ApiResponse"
import routes from "decentraland-gatsby/dist/entities/Route/wkc/routes"
+import { categories as CategoryTranslations } from "../../intl/en.json"
import CategoryModel from "./model"
export default routes((router) => {
@@ -8,7 +9,16 @@ export default routes((router) => {
})
export async function getCategoryList() {
- const categories = await CategoryModel.findCategoriesWithPlaces()
+ const categories = await CategoryModel.findActiveCategoriesWithPlaces()
- return new ApiResponse(categories)
+ const withTranslations = categories.map((category) => ({
+ ...category,
+ i18n: {
+ en: CategoryTranslations[
+ category.name as keyof typeof CategoryTranslations
+ ],
+ },
+ }))
+
+ return new ApiResponse(withTranslations)
}
diff --git a/src/entities/Category/types.ts b/src/entities/Category/types.ts
index e5b13772..847e3377 100644
--- a/src/entities/Category/types.ts
+++ b/src/entities/Category/types.ts
@@ -5,4 +5,15 @@ export type CategoryAttributes = {
updated_at: Date
}
-export const ALL_PLACE_CATEGORY = "all"
+export type CategoryWithPlaceCount = {
+ name: string
+ count: number
+}
+
+export enum DecentralandCategories {
+ POI = "poi",
+ FEATURED = "featured",
+}
+
+// TODO: review this type with the other ones: naming and maybe we can merge some (@lauti7)
+export type Category = { name: string; active: boolean; count?: number }
diff --git a/src/entities/CheckScenes/task/processContentEntityScene.ts b/src/entities/CheckScenes/task/processContentEntityScene.ts
index 44e22d4c..9315548c 100644
--- a/src/entities/CheckScenes/task/processContentEntityScene.ts
+++ b/src/entities/CheckScenes/task/processContentEntityScene.ts
@@ -90,9 +90,6 @@ export function createPlaceFromContentEntityScene(
const now = new Date()
const title = contentEntityScene?.metadata?.display?.title || null
const positions = (contentEntityScene?.pointers || []).sort()
- const tags = (contentEntityScene?.metadata?.tags || [])
- .slice(0, 100)
- .map((tag) => tag.slice(0, 25))
const thumbnail = getThumbnailFromContentEntityScene(
contentEntityScene,
@@ -139,11 +136,8 @@ export function createPlaceFromContentEntityScene(
like_score: 0,
highlighted: false,
highlighted_image: null,
- featured: false,
- featured_image: null,
disabled: false,
updated_at: now,
- categories: [],
world: !!contentEntityScene?.metadata?.worldConfiguration,
world_name: worldName,
hidden: !!contentEntityScene?.metadata?.worldConfiguration,
@@ -152,7 +146,6 @@ export function createPlaceFromContentEntityScene(
description: contentEntityScene?.metadata?.display?.description || null,
owner: contentEntityScene?.metadata?.owner || null,
image: thumbnail,
- tags,
base_position: contentEntityScene?.metadata?.scene?.base || positions[0],
positions,
contact_name,
@@ -163,6 +156,7 @@ export function createPlaceFromContentEntityScene(
disabled_at:
!!data.disabled && !data.disabled_at ? now : data.disabled_at || null,
textsearch: undefined,
+ categories: [],
}
placeParsed.textsearch = PlaceModel.textsearch(placeParsed)
diff --git a/src/entities/CheckScenes/task/taskRunnerSqs.ts b/src/entities/CheckScenes/task/taskRunnerSqs.ts
index df1b9dae..205ad149 100644
--- a/src/entities/CheckScenes/task/taskRunnerSqs.ts
+++ b/src/entities/CheckScenes/task/taskRunnerSqs.ts
@@ -1,7 +1,10 @@
import { randomUUID } from "crypto"
+import CategoryModel from "../../Category/model"
+import { DecentralandCategories } from "../../Category/types"
import PlaceModel from "../../Place/model"
import { PlaceAttributes } from "../../Place/types"
+import PlaceCategories from "../../PlaceCategories/model"
import PlaceContentRatingModel from "../../PlaceContentRating/model"
import PlacePositionModel from "../../PlacePosition/model"
import {
@@ -26,7 +29,6 @@ const placesAttributes: Array = [
"description",
"image",
"owner",
- "tags",
"positions",
"base_position",
"contact_name",
@@ -37,7 +39,6 @@ const placesAttributes: Array = [
"created_at",
"updated_at",
"deployed_at",
- "categories",
"world",
"world_name",
"hidden",
@@ -145,10 +146,7 @@ export async function taskRunnerSqs(job: DeploymentToSqs) {
const places = await PlaceModel.findEnabledByPositions(
contentEntityScene.pointers
)
- placesToProcess = await processContentEntityScene(
- contentEntityScene,
- places
- )
+ placesToProcess = processContentEntityScene(contentEntityScene, places)
}
if (!placesToProcess) {
@@ -167,6 +165,11 @@ export async function taskRunnerSqs(job: DeploymentToSqs) {
!contentEntityScene.metadata.worldConfiguration &&
(await PlacePositionModel.syncBasePosition(placesToProcess.new))
+ await overridePlaceCategories(
+ placesToProcess.new.id,
+ contentEntityScene.metadata.tags || []
+ )
+
notifyNewPlace(placesToProcess.new)
CheckScenesModel.createOne({
entity_id: job.entity.entityId,
@@ -183,6 +186,11 @@ export async function taskRunnerSqs(job: DeploymentToSqs) {
!contentEntityScene.metadata.worldConfiguration &&
(await PlacePositionModel.syncBasePosition(placesToProcess.update))
+ await overridePlaceCategories(
+ placesToProcess.update.id,
+ contentEntityScene.metadata.tags || []
+ )
+
notifyUpdatePlace(placesToProcess.update)
CheckScenesModel.createOne({
entity_id: job.entity.entityId,
@@ -227,3 +235,55 @@ export async function taskRunnerSqs(job: DeploymentToSqs) {
CheckScenesModel.createMany(placesToDisable)
}
}
+
+async function getValidCategories(creatorTags: string[]) {
+ const forbidden = [
+ DecentralandCategories.POI,
+ DecentralandCategories.FEATURED,
+ ] as string[]
+
+ const availableCategories = await CategoryModel.findActiveCategories()
+
+ const validCategories = new Set()
+
+ for (const tag of creatorTags) {
+ if (forbidden.includes(tag)) continue
+
+ if (availableCategories.find(({ name }) => name === tag)) {
+ validCategories.add(tag)
+ }
+
+ if (validCategories.size === 3) break
+ }
+
+ return validCategories
+}
+
+async function overridePlaceCategories(placeId: string, creatorTags: string[]) {
+ if (!creatorTags.length) return
+
+ const validCategories = await getValidCategories(creatorTags)
+
+ if (!validCategories.size) return
+
+ const currentCategories = new Set(
+ ...(await PlaceCategories.findCategoriesByPlaceId(placeId)).map(
+ ({ category_id }) => category_id
+ )
+ )
+
+ if (currentCategories.has(DecentralandCategories.POI)) {
+ validCategories.add(DecentralandCategories.POI)
+ }
+
+ if (currentCategories.has(DecentralandCategories.FEATURED)) {
+ validCategories.add(DecentralandCategories.FEATURED)
+ }
+
+ await PlaceCategories.cleanPlaceCategories(placeId)
+ await PlaceModel.overrideCategories(placeId, [...validCategories])
+
+ await PlaceCategories.addCategoriesToPlaces(
+ [...validCategories].map((category) => [placeId, category])
+ )
+}
diff --git a/src/entities/Place/migration.test.ts b/src/entities/Place/migration.test.ts
index d7150ebb..445c5883 100644
--- a/src/entities/Place/migration.test.ts
+++ b/src/entities/Place/migration.test.ts
@@ -16,9 +16,7 @@ export const attributes: Array = [
"description",
"image",
"highlighted_image",
- "featured_image",
"owner",
- "tags",
"positions",
"base_position",
"world_name",
@@ -26,7 +24,6 @@ export const attributes: Array = [
"contact_email",
"content_rating",
"highlighted",
- "featured",
"disabled",
"disabled_at",
]
@@ -40,11 +37,9 @@ describe("validatePlacesWorlds", () => {
const validatePlacesWorldsResult = validatePlacesWorlds([
{
base_position: "0,0",
- featured: true,
},
{
world_name: "paralax.dcl.eth",
- featured: true,
},
])
expect(validatePlacesWorldsResult).toBeUndefined()
@@ -55,7 +50,6 @@ describe("validatePlacesWorlds", () => {
validatePlacesWorlds([
{
base_position: "0,0",
- featured: true,
world_name: "paralax.dcl.eth",
},
])
@@ -67,15 +61,12 @@ describe("createPlaceFromEntityScene", () => {
test("should return a place with the correct data", async () => {
const place = createPlaceFromEntityScene(entitySceneGenesisPlaza, {
base_position: "-9,-9",
- featured: true,
})
expect({ ...place, deployed_at: placeGenesisPlaza.deployed_at }).toEqual({
...placeGenesisPlaza,
id: place.id,
- featured: true,
created_at: place.created_at,
updated_at: place.updated_at,
- featured_image: place.featured_image,
highlighted_image: place.highlighted_image,
})
})
@@ -93,17 +84,14 @@ describe("createPlaceFromEntityScene", () => {
},
{
base_position: "-9,-9",
- featured: true,
}
)
expect({ ...place, deployed_at: placeGenesisPlaza.deployed_at }).toEqual({
...placeGenesisPlaza,
id: place.id,
- featured: true,
contact_name: null,
created_at: place.created_at,
updated_at: place.updated_at,
- featured_image: place.featured_image,
highlighted_image: place.highlighted_image,
})
})
@@ -114,9 +102,9 @@ describe("createInsertQuery", () => {
const query = createInsertQuery(attributes)
const insertQuery =
"INSERT INTO places \
- (title,description,image,highlighted_image,featured_image,owner,tags,positions,\
- base_position,world_name,contact_name,contact_email,content_rating,highlighted,featured,disabled,disabled_at) \
- VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14,$15,$16,$17)"
+ (title,description,image,highlighted_image,owner,positions,\
+ base_position,world_name,contact_name,contact_email,content_rating,highlighted,disabled,disabled_at) \
+ VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14)"
expect(query.replace(/\n|\r|\s/g, "")).toEqual(
insertQuery.replace(/\n|\r|\s/g, "")
)
@@ -128,9 +116,9 @@ describe("createUpdateQuery", () => {
const query = createUpdateQuery("-9,-9", attributes)
const updateQuery =
"UPDATE places SET \
- title=$1, description=$2, image=$3, highlighted_image=$4, featured_image=$5, owner=$6, tags=$7, positions=$8, \
- base_position=$9, world_name=$10, contact_name=$11, contact_email=$12, content_rating=$13, highlighted=$14, featured=$15, \
- disabled=$16, disabled_at=$17 \
+ title=$1, description=$2, image=$3, highlighted_image=$4, owner=$5, positions=$6, \
+ base_position=$7, world_name=$8, contact_name=$9, contact_email=$10, content_rating=$11, highlighted=$12, \
+ disabled=$13, disabled_at=$14 \
WHERE positions &&'{\"-9,-9\"}'"
expect(query.replace(/\n|\r|\s/g, "")).toEqual(
updateQuery.replace(/\n|\r|\s/g, "")
@@ -153,12 +141,11 @@ describe("createUpdatePlacesAndWorldsQuery", () => {
test("should return a query with the correct query string for updating a Place", async () => {
const place = {
base_position: "-9,-9",
- featured: true,
}
const keys = attributes.filter((attr) => attr in place)
const query = createUpdatePlacesAndWorldsQuery(place, keys)
const deleteQuery =
- "UPDATE places SET base_position=$1, featured=$2 WHERE '-9,-9' = ANY(\"positions\")"
+ "UPDATE places SET base_position=$1 WHERE '-9,-9' = ANY(\"positions\")"
expect(query.replace(/\n|\r|\s/g, "")).toEqual(
deleteQuery.replace(/\n|\r|\s/g, "")
)
@@ -166,12 +153,11 @@ describe("createUpdatePlacesAndWorldsQuery", () => {
test("should return a query with the correct query string for updating a World", async () => {
const place = {
world_name: "paralax.dcl.eth",
- featured: true,
}
const keys = attributes.filter((attr) => attr in place)
const query = createUpdatePlacesAndWorldsQuery(place, keys)
const deleteQuery =
- "UPDATE places SET world_name=$1, featured=$2 WHERE world_name = 'paralax.dcl.eth'"
+ "UPDATE places SET world_name=$1 WHERE world_name = 'paralax.dcl.eth'"
expect(query.replace(/\n|\r|\s/g, "")).toEqual(
deleteQuery.replace(/\n|\r|\s/g, "")
)
@@ -187,7 +173,6 @@ describe("createPlaceFromDefaultPlaces", () => {
expect(data).toEqual([
{
...placeGenesisPlaza,
- tags: data[0].tags,
created_at: data[0].created_at,
updated_at: data[0].updated_at,
deployed_at: data[0].deployed_at,
diff --git a/src/entities/Place/migration.ts b/src/entities/Place/migration.ts
index 24c740bd..5c3b8abd 100644
--- a/src/entities/Place/migration.ts
+++ b/src/entities/Place/migration.ts
@@ -33,9 +33,6 @@ export function createPlaceFromEntityScene(
const now = Time.from().format("YYYYMMDD hh:mm:ss ZZ")
const title = entityScene?.metadata?.display?.title || null
const positions = (entityScene?.pointers || []).sort()
- const tags = (entityScene?.metadata?.tags || [])
- .slice(0, 100)
- .map((tag) => tag.slice(0, 25))
const thumbnail = getThumbnailFromDeployment(entityScene)
let contact_name = entityScene?.metadata?.contact?.name || null
@@ -63,7 +60,6 @@ export function createPlaceFromEntityScene(
description: entityScene?.metadata?.display?.description || null,
image: thumbnail,
positions,
- tags,
likes: 0,
dislikes: 0,
favorites: 0,
@@ -75,18 +71,17 @@ export function createPlaceFromEntityScene(
content_rating: getContentRating(entityScene, data),
highlighted: false,
highlighted_image: null,
- featured: false,
- featured_image: null,
disabled: false,
disabled_at:
!!data.disabled && !data.disabled_at ? now : data.disabled_at || null,
created_at: now,
updated_at: now,
deployed_at: now,
- categories: [],
world: false,
world_name: null,
hidden: false,
+ categories: [],
+ textsearch: undefined,
...data,
}
diff --git a/src/entities/Place/model.test.ts b/src/entities/Place/model.test.ts
index ff5e710f..973343ba 100644
--- a/src/entities/Place/model.test.ts
+++ b/src/entities/Place/model.test.ts
@@ -15,7 +15,6 @@ const placesAttributes: Array = [
"description",
"image",
"owner",
- "tags",
"positions",
"base_position",
"contact_name",
@@ -26,7 +25,6 @@ const placesAttributes: Array = [
"created_at",
"updated_at",
"deployed_at",
- "categories",
"world",
"world_name",
"hidden",
@@ -155,12 +153,12 @@ describe(`findWithAggregates`, () => {
offset: 0,
limit: 1,
only_favorites: false,
- only_featured: false,
only_highlighted: false,
positions: ["-9,-9"],
order_by: "created_at",
order: "desc",
search: "",
+ categories: [],
})
).toEqual([placeGenesisPlazaWithAggregatedAttributes])
expect(namedQuery.mock.calls.length).toBe(1)
@@ -192,13 +190,13 @@ describe(`findWithAggregates`, () => {
offset: 0,
limit: 1,
only_favorites: false,
- only_featured: false,
only_highlighted: false,
positions: ["-9,-9"],
order_by: "created_at",
order: "desc",
user: userLikeTrue.user,
search: "",
+ categories: [],
})
).toEqual([placeGenesisPlazaWithAggregatedAttributes])
expect(namedQuery.mock.calls.length).toBe(1)
@@ -236,13 +234,13 @@ describe(`findWithAggregates`, () => {
offset: 0,
limit: 1000,
only_favorites: false,
- only_featured: false,
only_highlighted: false,
positions: ["-9,-9"],
order_by: "created_at",
order: "desc",
user: userLikeTrue.user,
search: "decentraland atlas",
+ categories: [],
})
).toEqual([placeGenesisPlazaWithAggregatedAttributes])
expect(namedQuery.mock.calls.length).toBe(1)
@@ -284,13 +282,13 @@ describe(`findWithAggregates`, () => {
offset: 0,
limit: 1000,
only_favorites: false,
- only_featured: false,
only_highlighted: false,
positions: ["-9,-9"],
order_by: "created_at",
order: "desc",
user: userLikeTrue.user,
search: "de",
+ categories: [],
})
).toEqual([])
expect(namedQuery.mock.calls.length).toBe(0)
@@ -303,10 +301,10 @@ describe(`countPlaces`, () => {
expect(
await PlaceModel.countPlaces({
only_favorites: false,
- only_featured: false,
only_highlighted: false,
positions: ["-9,-9"],
search: "",
+ categories: [],
})
).toEqual(1)
expect(namedQuery.mock.calls.length).toBe(1)
@@ -316,7 +314,7 @@ describe(`countPlaces`, () => {
expect(sql.text.trim().replace(/\s{2,}/gi, " ")).toEqual(
`
SELECT
- count(*) as "total"
+ count(DISTINCT p.id) as "total"
FROM "places" p
WHERE
p."disabled" is false
@@ -334,10 +332,10 @@ describe(`countPlaces`, () => {
expect(
await PlaceModel.countPlaces({
only_favorites: false,
- only_featured: false,
only_highlighted: false,
positions: ["-9,-9"],
search: "decentraland atlas",
+ categories: [],
})
).toEqual(1)
expect(namedQuery.mock.calls.length).toBe(1)
@@ -347,7 +345,7 @@ describe(`countPlaces`, () => {
expect(sql.text.trim().replace(/\s{2,}/gi, " ")).toEqual(
`
SELECT
- count(*) as "total"
+ count(DISTINCT p.id) as "total"
FROM "places" p , ts_rank_cd(p.textsearch, to_tsquery($1)) as rank
WHERE
p."disabled" is false
@@ -365,11 +363,11 @@ describe(`countPlaces`, () => {
expect(
await PlaceModel.countPlaces({
only_favorites: false,
- only_featured: false,
only_highlighted: false,
positions: ["-9,-9"],
user: "ABC",
search: "asdads",
+ categories: [],
})
).toEqual(0)
expect(namedQuery.mock.calls.length).toBe(0)
@@ -378,11 +376,11 @@ describe(`countPlaces`, () => {
expect(
await PlaceModel.countPlaces({
only_favorites: false,
- only_featured: false,
only_highlighted: false,
positions: ["-9,-9"],
user: "ABC",
search: "",
+ categories: [],
})
).toEqual(0)
})
@@ -478,12 +476,13 @@ describe(`findWithHotScenes`, () => {
offset: 0,
limit: 1,
only_favorites: false,
- only_featured: false,
+
only_highlighted: false,
positions: ["-9,-9"],
order_by: "created_at",
order: "desc",
search: "",
+ categories: [],
},
[hotSceneGenesisPlaza]
)
@@ -527,8 +526,8 @@ describe(`insertPlace`, () => {
expect(name).toBe("insert_place")
expect(sql.text.trim().replace(/\s{2,}/gi, " ")).toEqual(
`
- INSERT INTO "places" ("title", "description", "image", "owner", "tags", "positions", "base_position", "contact_name", "contact_email", "content_rating", "disabled", "disabled_at", "created_at", "updated_at", "deployed_at", "categories", "world", "world_name", "hidden", "id")
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20)
+ INSERT INTO "places" ("title", "description", "image", "owner", "positions", "base_position", "contact_name", "contact_email", "content_rating", "disabled", "disabled_at", "created_at", "updated_at", "deployed_at", "world", "world_name", "hidden", "id")
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18)
`
.trim()
.replace(/\s{2,}/gi, " ")
@@ -547,11 +546,11 @@ describe(`updatePlace`, () => {
expect(name).toBe("update_place")
expect(sql.text.trim().replace(/\s{2,}/gi, " ")).toEqual(
`
- UPDATE "places" SET "title" = $1, "description" = $2, "image" = $3, "owner" = $4, "tags" = $5, "positions" = $6, "base_position" = $7, "contact_name" = $8, "contact_email" = $9, "content_rating" = $10, "disabled" = $11, "disabled_at" = $12, "updated_at" = $13, "deployed_at" = $14, "categories" = $15, "world" = $16, "world_name" = $17, "hidden" = $18
+ UPDATE "places" SET "title" = $1, "description" = $2, "image" = $3, "owner" = $4, "positions" = $5, "base_position" = $6, "contact_name" = $7, "contact_email" = $8, "content_rating" = $9, "disabled" = $10, "disabled_at" = $11, "updated_at" = $12, "deployed_at" = $13, "world" = $14, "world_name" = $15, "hidden" = $16
WHERE disabled is false AND world is false AND "base_position" IN
(
SELECT DISTINCT("base_position")
- FROM "place_positions" "pp" WHERE "pp"."position" = $19
+ FROM "place_positions" "pp" WHERE "pp"."position" = $17
)
`
.trim()
@@ -773,8 +772,8 @@ describe(`insertPlace`, () => {
expect(name).toBe("insert_place")
expect(sql.text.trim().replace(/\s{2,}/gi, " ")).toEqual(
`
- INSERT INTO "places" ("title", "description", "image", "owner", "tags", "positions", "base_position", "contact_name", "contact_email", "content_rating", "disabled", "disabled_at", "created_at", "updated_at", "deployed_at", "categories", "world", "world_name", "hidden", "id")
- VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18, $19, $20)
+ INSERT INTO "places" ("title", "description", "image", "owner", "positions", "base_position", "contact_name", "contact_email", "content_rating", "disabled", "disabled_at", "created_at", "updated_at", "deployed_at", "world", "world_name", "hidden", "id")
+ VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17, $18)
`
.trim()
.replace(/\s{2,}/gi, " ")
@@ -793,11 +792,11 @@ describe(`updatePlace`, () => {
expect(name).toBe("update_place")
expect(sql.text.trim().replace(/\s{2,}/gi, " ")).toEqual(
`
- UPDATE "places" SET "title" = $1, "description" = $2, "image" = $3, "owner" = $4, "tags" = $5, "positions" = $6, "base_position" = $7, "contact_name" = $8, "contact_email" = $9, "content_rating" = $10, "disabled" = $11, "disabled_at" = $12, "updated_at" = $13, "deployed_at" = $14, "categories" = $15, "world" = $16, "world_name" = $17, "hidden" = $18
+ UPDATE "places" SET "title" = $1, "description" = $2, "image" = $3, "owner" = $4, "positions" = $5, "base_position" = $6, "contact_name" = $7, "contact_email" = $8, "content_rating" = $9, "disabled" = $10, "disabled_at" = $11, "updated_at" = $12, "deployed_at" = $13, "world" = $14, "world_name" = $15, "hidden" = $16
WHERE disabled is false AND world is false AND "base_position" IN
(
SELECT DISTINCT("base_position")
- FROM "place_positions" "pp" WHERE "pp"."position" = $19
+ FROM "place_positions" "pp" WHERE "pp"."position" = $17
)
`
.trim()
diff --git a/src/entities/Place/model.ts b/src/entities/Place/model.ts
index f7a5453a..48035391 100644
--- a/src/entities/Place/model.ts
+++ b/src/entities/Place/model.ts
@@ -18,6 +18,7 @@ import { numeric, oneOf } from "decentraland-gatsby/dist/entities/Schema/utils"
import { diff, unique } from "radash/dist/array"
import isEthereumAddress from "validator/lib/isEthereumAddress"
+import PlaceCategories from "../PlaceCategories/model"
import PlacePositionModel from "../PlacePosition/model"
import UserFavoriteModel from "../UserFavorite/model"
import UserLikesModel from "../UserLikes/model"
@@ -50,7 +51,6 @@ export default class PlaceModel extends Model {
place.description || ""
)}), 'B')`,
SQL`setweight(to_tsvector(coalesce(${place.owner}, '')), 'C')`,
- SQL`setweight(to_tsvector(concat(coalesce(${place.tags}, '{}'))), 'D')`,
],
SQL` || `
)})`
@@ -186,17 +186,25 @@ export default class PlaceModel extends Model {
UserLikesModel
)} ul on p.id = ul.place_id AND ul."user" = ${options.user}`
)}
+ ${conditional(
+ !!options.categories.length,
+ SQL`INNER JOIN ${table(
+ PlaceCategories
+ )} pc ON p.id = pc.place_id AND pc.category_id IN ${values(
+ options.categories
+ )}`
+ )}
+
${conditional(
!!options.search,
SQL`, ts_rank_cd(p.textsearch, to_tsquery(${tsquery(
options.search || ""
)})) as rank`
)}
+
WHERE
p."disabled" is false AND "world" is false
${conditional(!!options.search, SQL`AND rank > 0`)}
- ${conditional(options.only_featured, SQL`AND featured = TRUE`)}
- ${conditional(options.only_highlighted, SQL`AND highlighted = TRUE`)}
${conditional(
options.positions?.length > 0,
SQL`AND p.base_position IN (
@@ -205,14 +213,16 @@ export default class PlaceModel extends Model {
WHERE position IN ${values(options.positions)}
)`
)}
- ORDER BY
+ ORDER BY
${conditional(!!options.search, SQL`rank DESC, `)}
${order}
${limit(options.limit, { max: 100 })}
${offset(options.offset)}
`
- const queryResult = await this.namedQuery("find_with_agregates", sql)
+ const queryResult = await this.namedQuery<
+ AggregatePlaceAttributes & { category_id?: string }
+ >("find_with_agregates", sql)
return queryResult
}
@@ -222,21 +232,22 @@ export default class PlaceModel extends Model {
| "user"
| "only_favorites"
| "positions"
- | "only_featured"
| "only_highlighted"
| "search"
+ | "categories"
>
) {
const isMissingEthereumAddress =
options.user && !isEthereumAddress(options.user)
const searchIsEmpty = options.search && options.search.length < 3
+
if (isMissingEthereumAddress || searchIsEmpty) {
return 0
}
const query = SQL`
SELECT
- count(*) as "total"
+ count(DISTINCT p.id) as "total"
FROM ${table(this)} p
${conditional(
!!options.user && options.only_favorites,
@@ -244,17 +255,24 @@ export default class PlaceModel extends Model {
UserFavoriteModel
)} uf on p.id = uf.place_id AND uf."user" = ${options.user}`
)}
+ ${conditional(
+ !!options.categories.length,
+ SQL`INNER JOIN ${table(
+ PlaceCategories
+ )} pc ON p.id = pc.place_id AND pc.category_id IN ${values(
+ options.categories
+ )}`
+ )}
+
${conditional(
!!options.search,
SQL`, ts_rank_cd(p.textsearch, to_tsquery(${tsquery(
options.search || ""
)})) as rank`
)}
+
WHERE
- p."disabled" is false
- AND "world" is false
- ${conditional(options.only_featured, SQL`AND featured = TRUE`)}
- ${conditional(options.only_highlighted, SQL`AND highlighted = TRUE`)}
+ p."disabled" is false AND "world" is false
${conditional(
options.positions?.length > 0,
SQL`AND p.base_position IN (
@@ -265,12 +283,12 @@ export default class PlaceModel extends Model {
)}
${conditional(!!options.search, SQL` AND rank > 0`)}
`
- const results: { total: number }[] = await this.namedQuery(
+ const results: { total: string }[] = await this.namedQuery(
"count_places",
query
)
- return results[0].total
+ return Number(results[0].total)
}
static async disablePlaces(placesIds: string[]) {
@@ -397,6 +415,18 @@ export default class PlaceModel extends Model {
return this.namedQuery("update_place", sql)
}
+ static overrideCategories(placeId: string, newCategories: string[]) {
+ const categories = newCategories
+ .map((category) => `'${category}'`)
+ .join(",")
+
+ const sql = SQL`UPDATE ${table(
+ this
+ )} SET categories = ARRAY [${categories}] WHERE id = ${placeId}`
+
+ return this.namedQuery("override_categories", sql)
+ }
+
static async findWorlds(): Promise {
const sql = SQL`
SELECT * FROM ${table(this)}
@@ -554,6 +584,21 @@ export default class PlaceModel extends Model {
return results[0].total
}
+ static async findEnabledByCategory(
+ category: string
+ ): Promise {
+ const sql = SQL`
+ SELECT p.*
+ FROM ${table(this)} p
+ ${SQL`INNER JOIN ${table(
+ PlaceCategories
+ )} pc ON p.id = pc.place_id AND pc.category_id = ${SQL`${category}`}`}
+ WHERE
+ p."disabled" is false AND "world" is false
+ `
+ return await this.namedQuery("find_enabled_by_category", sql)
+ }
+
/**
* For reference: https://www.evanmiller.org/how-not-to-sort-by-average-rating.html
* We're calculating the lower bound of a 95% confidence interval
diff --git a/src/entities/Place/routes/getPlace.test.ts b/src/entities/Place/routes/getPlace.test.ts
index 54fab435..7b9b707d 100644
--- a/src/entities/Place/routes/getPlace.test.ts
+++ b/src/entities/Place/routes/getPlace.test.ts
@@ -7,16 +7,19 @@ import { placeGenesisPlazaWithAggregatedAttributes } from "../../../__data__/pla
import { sceneStatsGenesisPlaza } from "../../../__data__/sceneStatsGenesisPlaza"
import DataTeam from "../../../api/DataTeam"
import RealmProvider from "../../../api/RealmProvider"
+import PlaceCategories from "../../PlaceCategories/model"
import PlaceModel from "../model"
import { getPlace } from "./getPlace"
const place_id = randomUUID()
const findOne = jest.spyOn(PlaceModel, "namedQuery")
const catalystHotScenes = jest.spyOn(RealmProvider.get(), "getHotScenes")
+const findPC = jest.spyOn(PlaceCategories, "namedQuery")
const catalystSceneStats = jest.spyOn(DataTeam.get(), "getSceneStats")
afterEach(() => {
findOne.mockReset()
+ findPC.mockReset()
})
test("should return 400 when UUID is incorrect", async () => {
const request = new Request("/")
@@ -28,6 +31,8 @@ test("should return 400 when UUID is incorrect", async () => {
})
test("should return 404 when UUID do not exist in the model", async () => {
findOne.mockResolvedValueOnce(Promise.resolve([]))
+ findPC.mockResolvedValueOnce(Promise.resolve([]))
+
const request = new Request("/")
const url = new URL("https://localhost/")
await expect(async () =>
@@ -40,6 +45,8 @@ test("should return place if the module found it", async () => {
Promise.resolve([placeGenesisPlazaWithAggregatedAttributes])
)
+ findPC.mockResolvedValueOnce(Promise.resolve([]))
+
catalystHotScenes.mockResolvedValueOnce(
Promise.resolve([hotSceneGenesisPlaza])
)
@@ -69,6 +76,7 @@ test("should return place with Realms detail", async () => {
findOne.mockResolvedValueOnce(
Promise.resolve([placeGenesisPlazaWithAggregatedAttributes])
)
+ findPC.mockResolvedValueOnce(Promise.resolve([]))
catalystHotScenes.mockResolvedValueOnce(
Promise.resolve([hotSceneGenesisPlaza])
diff --git a/src/entities/Place/routes/getPlaceCategories.ts b/src/entities/Place/routes/getPlaceCategories.ts
new file mode 100644
index 00000000..352f3391
--- /dev/null
+++ b/src/entities/Place/routes/getPlaceCategories.ts
@@ -0,0 +1,26 @@
+import Context from "decentraland-gatsby/dist/entities/Route/wkc/context/Context"
+import ApiResponse from "decentraland-gatsby/dist/entities/Route/wkc/response/ApiResponse"
+import Router from "decentraland-gatsby/dist/entities/Route/wkc/routes/Router"
+
+import PlaceCategories from "../../PlaceCategories/model"
+import { getPlaceParamsSchema } from "../schemas"
+import { GetPlaceParams } from "../types"
+
+export const validateGetPlaceParams =
+ Router.validator(getPlaceParamsSchema)
+
+export const getPlaceCategories = Router.memo(
+ async (
+ ctx: Context<{ place_id: string }, "params" | "url" | "request">
+ ): Promise> => {
+ const params = await validateGetPlaceParams(ctx.params)
+
+ const placeCategories = await PlaceCategories.findCategoriesByPlaceId(
+ params.place_id
+ )
+
+ return new ApiResponse({
+ categories: placeCategories.map(({ category_id }) => category_id),
+ })
+ }
+)
diff --git a/src/entities/Place/routes/getPlaceList.ts b/src/entities/Place/routes/getPlaceList.ts
index 626e6946..c61de4ca 100644
--- a/src/entities/Place/routes/getPlaceList.ts
+++ b/src/entities/Place/routes/getPlaceList.ts
@@ -51,6 +51,7 @@ export const getPlaceList = Router.memo(
oneOf(ctx.url.searchParams.get("order"), ["asc", "desc"]) || "desc",
with_realms_detail: ctx.url.searchParams.get("with_realms_detail"),
search: ctx.url.searchParams.get("search"),
+ categories: ctx.url.searchParams.getAll("categories"),
})
const userAuth = await withAuthOptional(ctx)
@@ -64,12 +65,12 @@ export const getPlaceList = Router.memo(
offset: numeric(query.offset, { min: 0 }) ?? 0,
limit: numeric(query.limit, { min: 0, max: 100 }) ?? 100,
only_favorites: !!bool(query.only_favorites),
- only_featured: !!bool(query.only_featured),
only_highlighted: !!bool(query.only_highlighted),
positions: query.positions,
order_by: query.order_by,
order: query.order,
search: query.search,
+ categories: query.categories,
}
const [data, total, hotScenes, sceneStats] = await Promise.all([
diff --git a/src/entities/Place/routes/getPlaceMostActiveList.ts b/src/entities/Place/routes/getPlaceMostActiveList.ts
index 0723e34b..7197329f 100644
--- a/src/entities/Place/routes/getPlaceMostActiveList.ts
+++ b/src/entities/Place/routes/getPlaceMostActiveList.ts
@@ -30,6 +30,7 @@ export const getPlaceMostActiveList = Router.memo(
oneOf(ctx.url.searchParams.get("order"), ["asc", "desc"]) || "desc",
with_realms_detail: ctx.url.searchParams.get("with_realms_detail"),
search: ctx.url.searchParams.get("search"),
+ categories: ctx.url.searchParams.getAll("categories"),
})
const [hotScenes, sceneStats] = await Promise.all([
@@ -59,7 +60,6 @@ export const getPlaceMostActiveList = Router.memo(
offset: numeric(query.offset, { min: 0 }) ?? 0,
limit: numeric(query.limit, { min: 0, max: 100 }) ?? 100,
only_favorites: !!bool(query.only_favorites),
- only_featured: !!bool(query.only_featured),
only_highlighted: !!bool(query.only_highlighted),
positions: query.positions.length
? hotScenesPositions.filter((position) => positions.has(position))
@@ -67,6 +67,7 @@ export const getPlaceMostActiveList = Router.memo(
order_by: PlaceListOrderBy.MOST_ACTIVE,
order: query.order,
search: query.search,
+ categories: query.categories,
}
const { offset, limit, order, ...extraOptions } = options
diff --git a/src/entities/Place/routes/getPlaceUserVisitsList.ts b/src/entities/Place/routes/getPlaceUserVisitsList.ts
index 9febbbbf..ca4b84e0 100644
--- a/src/entities/Place/routes/getPlaceUserVisitsList.ts
+++ b/src/entities/Place/routes/getPlaceUserVisitsList.ts
@@ -26,6 +26,7 @@ export const getPlaceUserVisitsList = Router.memo(
order: ctx.url.searchParams.get("order") || "desc",
with_realms_detail: ctx.url.searchParams.get("with_realms_detail"),
search: ctx.url.searchParams.get("search"),
+ categories: ctx.url.searchParams.getAll("categories"),
})
const [hotScenes, sceneStats] = await Promise.all([
@@ -47,12 +48,12 @@ export const getPlaceUserVisitsList = Router.memo(
offset: numeric(query.offset, { min: 0 }) ?? 0,
limit: numeric(query.limit, { min: 0, max: 100 }) ?? 100,
only_favorites: !!bool(query.only_favorites),
- only_featured: !!bool(query.only_featured),
only_highlighted: !!bool(query.only_highlighted),
positions: ctx.url.searchParams.getAll("positions"),
order_by: PlaceListOrderBy.MOST_ACTIVE,
order: query.order,
search: query.order,
+ categories: query.categories,
}
const { offset, limit, order, ...extraOptions } = options
diff --git a/src/entities/Place/routes/index.ts b/src/entities/Place/routes/index.ts
index e2732daf..1fc4850d 100644
--- a/src/entities/Place/routes/index.ts
+++ b/src/entities/Place/routes/index.ts
@@ -3,6 +3,7 @@ import routes from "decentraland-gatsby/dist/entities/Route/wkc/routes"
import env from "decentraland-gatsby/dist/utils/env"
import { getPlace } from "./getPlace"
+import { getPlaceCategories } from "./getPlaceCategories"
import { getPlaceList } from "./getPlaceList"
import { updateRating } from "./updateRating"
@@ -28,4 +29,6 @@ export default routes((router) => {
router.get("/places/:place_id", getPlace)
router.get("/places", getPlaceList)
router.put("/places/:place_id/rating", updateRating)
+ router.get("/places/:place_id/categories", getPlaceCategories)
+ router.put("/places/:place_id/rating", updateRating)
}, {})
diff --git a/src/entities/Place/schemas.ts b/src/entities/Place/schemas.ts
index 3c4eebaa..419131df 100644
--- a/src/entities/Place/schemas.ts
+++ b/src/entities/Place/schemas.ts
@@ -37,12 +37,6 @@ export const getPlaceListQuerySchema = schema({
description: "True if shows only favorite places",
nullable: true as any,
},
- only_featured: {
- type: "string",
- format: "boolean",
- description: "True if shows only featured places",
- nullable: true as any,
- },
only_highlighted: {
type: "string",
format: "boolean",
@@ -74,6 +68,12 @@ export const getPlaceListQuerySchema = schema({
"Filter places that contains a text expression, should have at least 3 characters otherwise the resultant list will be empty",
nullable: true as any,
},
+ categories: {
+ type: "array",
+ items: { type: "string" },
+ description: "Filter places by available categories",
+ nullable: true as any,
+ },
},
})
@@ -141,13 +141,6 @@ export const placeSchema = schema({
maxLength: 42,
description: "The owner's name",
},
- tags: {
- type: "array",
- description: "A list of tags for the place",
- items: {
- type: "string",
- },
- },
positions: {
type: "array",
description: "A list of positions of the place",
@@ -266,6 +259,11 @@ export const placeSchema = schema({
description:
"The number of users that had visited the place in the last 30 days",
},
+ categories: {
+ type: "array",
+ description: "A list of the Place's categories",
+ items: { type: "string" },
+ },
},
})
diff --git a/src/entities/Place/types.ts b/src/entities/Place/types.ts
index a22c31a0..48cbdf80 100644
--- a/src/entities/Place/types.ts
+++ b/src/entities/Place/types.ts
@@ -22,9 +22,7 @@ export type PlaceAttributes = {
description: string | null
image: string | null
highlighted_image: string | null
- featured_image: string | null
owner: string | null
- tags: string[]
positions: string[]
base_position: string
contact_name: string | null
@@ -36,17 +34,16 @@ export type PlaceAttributes = {
like_rate: number | null
like_score: number | null
highlighted: boolean
- featured: boolean
disabled: boolean
disabled_at: Date | null
created_at: Date
updated_at: Date
- categories: string[]
world: boolean
world_name: string | null
hidden: boolean
deployed_at: Date
textsearch: SQLStatement | string | null | undefined
+ categories: string[]
}
export type AggregatePlaceAttributes = PlaceAttributes & {
@@ -74,24 +71,24 @@ export type GetPlaceListQuery = {
offset: string
positions: string[]
only_favorites: string
- only_featured: string
only_highlighted: string
order_by: string
order: string
with_realms_detail: string
search: string
+ categories: string[]
}
export type PlaceListOptions = {
offset: number
limit: number
only_favorites: boolean
- only_featured: boolean
only_highlighted: boolean
positions: string[]
order_by: string
order: string
search: string
+ categories: string[]
}
export type FindWithAggregatesOptions = PlaceListOptions & {
diff --git a/src/entities/PlaceCategories/model.ts b/src/entities/PlaceCategories/model.ts
new file mode 100644
index 00000000..ffffc59d
--- /dev/null
+++ b/src/entities/PlaceCategories/model.ts
@@ -0,0 +1,73 @@
+import { Model } from "decentraland-gatsby/dist/entities/Database/model"
+import {
+ SQL,
+ join,
+ table,
+ values,
+} from "decentraland-gatsby/dist/entities/Database/utils"
+
+import { PlaceCategoriesAttributes } from "./types"
+
+export default class PlaceCategories extends Model {
+ static tableName: string = "place_categories"
+
+ static async getCountPerCategory() {
+ const query = SQL`SELECT category_id, COUNT(place_id) as count FROM ${table(
+ PlaceCategories
+ )} GROUP BY category_id`
+
+ const result = await PlaceCategories.namedQuery<{
+ category_id: string
+ count: number
+ }>("get_count_per_category", query)
+
+ return result
+ }
+
+ static async removeCategoryFromPlace(placeId: string, category: string) {
+ const query = SQL`DELETE FROM ${table(
+ PlaceCategories
+ )} WHERE place_id = ${placeId} AND category_id = ${category}`
+
+ await PlaceCategories.namedQuery("remove_place_category", query)
+ }
+
+ static async addCategoryToPlace(placeId: string, category: string) {
+ const query = SQL`INSERT INTO ${table(
+ PlaceCategories
+ )} (place_id, category_id) VALUES (${placeId}, ${category})`
+
+ await PlaceCategories.namedQuery("add_category_to_place", query)
+ }
+
+ static async addCategoriesToPlaces(bulk: string[][]) {
+ const mappedValues = bulk.map((val) => values(val))
+
+ const valuesInBulk = join(mappedValues)
+
+ const query = SQL`INSERT INTO ${table(
+ PlaceCategories
+ )} (place_id, category_id) VALUES ${valuesInBulk}`
+
+ await PlaceCategories.namedQuery("add_categories_to_places", query)
+ }
+
+ static async cleanPlaceCategories(placeId: string) {
+ const query = SQL`DELETE FROM ${table(
+ PlaceCategories
+ )} WHERE place_id = ${placeId}`
+
+ await PlaceCategories.namedQuery("clean_place_categories", query)
+ }
+
+ static async findCategoriesByPlaceId(placeId: string) {
+ const query = SQL`SELECT category_id FROM ${table(
+ PlaceCategories
+ )} WHERE place_id = ${placeId}`
+
+ return await PlaceCategories.namedQuery<{ category_id: string }>(
+ "find_categories_by_place_id",
+ query
+ )
+ }
+}
diff --git a/src/entities/PlaceCategories/tasks/poi.ts b/src/entities/PlaceCategories/tasks/poi.ts
new file mode 100644
index 00000000..6c53aa25
--- /dev/null
+++ b/src/entities/PlaceCategories/tasks/poi.ts
@@ -0,0 +1,74 @@
+import { Logger } from "decentraland-gatsby/dist/entities/Development/logger"
+import { Task } from "decentraland-gatsby/dist/entities/Task"
+import { diff } from "radash"
+
+import { getPois } from "../../../modules/pois"
+import { DecentralandCategories } from "../../Category/types"
+import PlaceModel from "../../Place/model"
+import PlaceCategories from "../model"
+
+export const checkPoisForCategoryUpdate = new Task({
+ name: "places_poi_category_update",
+ repeat: Task.Repeat.Daily,
+ task: async (ctx) => {
+ const pois = await getPois()
+ await processNewPois(pois, ctx.logger)
+ },
+})
+
+const processNewPois = async (pois: string[], logger: Logger) => {
+ logger.log("> Processing new PoIs")
+ const categorizedPlaces = await PlaceModel.findEnabledByCategory(
+ DecentralandCategories.POI
+ )
+ logger.log(
+ `> Processing new PoIs > categorized places ${categorizedPlaces.length}`
+ )
+ const poiPlaces = await PlaceModel.findEnabledByPositions(pois)
+ logger.log(`> Processing new PoIs > poi Places ${poiPlaces.length}`)
+
+ // Places to be removed from POI category
+ const toBeRemoved = diff(categorizedPlaces, poiPlaces)
+
+ // Places to be added to POI Category
+ const toBeAdded = diff(poiPlaces, categorizedPlaces).map((poiPlace) => [
+ poiPlace.id,
+ DecentralandCategories.POI,
+ ])
+
+ logger.log(`> Processing new PoIs > to be removed ${toBeRemoved.length}`)
+
+ // TODO: review, reduce queries?
+ for (const removable of toBeRemoved) {
+ logger.log(`> Processing new PoIs > removing: ${removable.id}`)
+ await PlaceCategories.removeCategoryFromPlace(
+ removable.id,
+ DecentralandCategories.POI
+ )
+ const currentCategories = await PlaceCategories.findCategoriesByPlaceId(
+ removable.id
+ )
+ await PlaceModel.overrideCategories(
+ removable.id,
+ currentCategories.map(({ category_id }) => category_id)
+ )
+ }
+
+ logger.log(`> Processing new PoIs > to be added ${toBeAdded.length}`)
+
+ if (toBeAdded.length) {
+ await PlaceCategories.addCategoriesToPlaces(toBeAdded)
+ for (const [placeId] of toBeAdded) {
+ const currentCategories = await PlaceCategories.findCategoriesByPlaceId(
+ placeId
+ )
+
+ await PlaceModel.overrideCategories(
+ placeId,
+ currentCategories.map(({ category_id }) => category_id)
+ )
+ }
+ }
+
+ logger.log("> Processing new PoIs > processed succesffully!")
+}
diff --git a/src/entities/PlaceCategories/types.ts b/src/entities/PlaceCategories/types.ts
new file mode 100644
index 00000000..c4a6a9bb
--- /dev/null
+++ b/src/entities/PlaceCategories/types.ts
@@ -0,0 +1,4 @@
+export type PlaceCategoriesAttributes = {
+ place_id: string
+ category_id: string
+}
diff --git a/src/entities/Social/routes.ts b/src/entities/Social/routes.ts
index 6b8f31c0..b2caf252 100644
--- a/src/entities/Social/routes.ts
+++ b/src/entities/Social/routes.ts
@@ -46,11 +46,11 @@ export async function injectPlaceMetadata(req: Request, res: Response) {
offset: 0,
limit: 1,
only_favorites: false,
- only_featured: false,
only_highlighted: false,
order_by: PlaceListOrderBy.LIKE_SCORE_BEST,
order: "asc",
search: "",
+ categories: [],
})
)[0]
}
diff --git a/src/entities/World/schemas.ts b/src/entities/World/schemas.ts
index b714deb6..72639ea7 100644
--- a/src/entities/World/schemas.ts
+++ b/src/entities/World/schemas.ts
@@ -83,13 +83,6 @@ export const worldSchema = schema({
maxLength: 42,
description: "The owner's name",
},
- tags: {
- type: "array",
- description: "A list of tags for the world",
- items: {
- type: "string",
- },
- },
positions: {
type: "array",
description: "A list of positions of the world",
diff --git a/src/hooks/usePlaceCategories.ts b/src/hooks/usePlaceCategories.ts
new file mode 100644
index 00000000..cf98a260
--- /dev/null
+++ b/src/hooks/usePlaceCategories.ts
@@ -0,0 +1,21 @@
+import useAsyncMemo from "decentraland-gatsby/dist/hooks/useAsyncMemo"
+
+import Places from "../api/Places"
+import { Category } from "../entities/Category/types"
+
+/** @deprecated use isePlaceCategories instead */
+export default function usePlaceCategories(activeCategories?: string[]) {
+ return useAsyncMemo(
+ async () => {
+ const categories = await Places.get().getCategories()
+ return categories.map((category) => ({
+ ...category,
+ active: activeCategories
+ ? activeCategories.includes(category.name)
+ : false,
+ })) as Category[]
+ },
+ activeCategories ? [activeCategories] : [],
+ { initialValue: [] as Category[] }
+ )
+}
diff --git a/src/hooks/usePlaceCategoriesManager.ts b/src/hooks/usePlaceCategoriesManager.ts
new file mode 100644
index 00000000..08fb5232
--- /dev/null
+++ b/src/hooks/usePlaceCategoriesManager.ts
@@ -0,0 +1,72 @@
+import { useCallback, useEffect, useMemo, useState } from "react"
+
+import useAsyncMemo from "decentraland-gatsby/dist/hooks/useAsyncMemo"
+
+import Places from "../api/Places"
+import { Category } from "../entities/Category/types"
+
+export default function usePlaceCategoriesManager(
+ initActiveCategories?: string[]
+) {
+ const [originalCategories] = useAsyncMemo(
+ async () => {
+ const categories = await Places.get().getCategories()
+ return categories.map((category) => ({
+ ...category,
+ active: initActiveCategories?.includes(category.name) || false,
+ })) as Category[]
+ },
+ [initActiveCategories],
+ { initialValue: [] as Category[] }
+ )
+
+ const [categories, setCategories] = useState([] as Category[])
+
+ useEffect(() => {
+ originalCategories.length > 0 && setCategories(originalCategories)
+ }, [originalCategories])
+
+ const previousActiveCategories = useMemo(
+ () => categories.filter(({ active }) => active),
+ [initActiveCategories]
+ )
+
+ const handleAddCategory = useCallback(
+ (categoryToActive: string) => {
+ setCategories((prevCategories) =>
+ prevCategories.map((category) => ({
+ ...category,
+ active: categoryToActive === category.name || category.active,
+ }))
+ )
+ },
+ [setCategories]
+ )
+
+ const handleRemoveCategory = useCallback(
+ (categoryToRemove: string) => {
+ setCategories((prevCategories) =>
+ prevCategories.map((category) => ({
+ ...category,
+ active: categoryToRemove === category.name ? false : category.active,
+ }))
+ )
+ },
+ [setCategories]
+ )
+
+ const handleSyncCategory = useCallback(
+ (newCategoriesState: Category[]) => setCategories(newCategoriesState),
+ [setCategories]
+ )
+
+ return [
+ categories,
+ previousActiveCategories,
+ {
+ handleAddCategory,
+ handleRemoveCategory,
+ handleSyncCategory,
+ },
+ ] as const
+}
diff --git a/src/hooks/usePlaceFromParams.ts b/src/hooks/usePlaceFromParams.ts
index 9ae01a46..160e7ceb 100644
--- a/src/hooks/usePlaceFromParams.ts
+++ b/src/hooks/usePlaceFromParams.ts
@@ -24,7 +24,10 @@ export function usePlaceFromParams(params: URLSearchParams) {
offset: 0,
limit: 1,
})
- return places.data[0]
+
+ const place = places.data[0]
+
+ return place
}
return null
diff --git a/src/hooks/usePlaceListPois.ts b/src/hooks/usePlaceListPois.ts
index be64aa36..474ddfde 100644
--- a/src/hooks/usePlaceListPois.ts
+++ b/src/hooks/usePlaceListPois.ts
@@ -2,20 +2,15 @@ import useAsyncMemo from "decentraland-gatsby/dist/hooks/useAsyncMemo"
import shuffle from "lodash/shuffle"
import Places from "../api/Places"
+import { DecentralandCategories } from "../entities/Category/types"
import { AggregatePlaceAttributes } from "../entities/Place/types"
-import { getPois } from "../modules/pois"
export function usePlaceListPois(options: { limit: number; offset: number }) {
return useAsyncMemo(
async () => {
- const pois = await getPois()
- if (!pois || pois.length === 0) {
- return []
- }
-
const result = await Places.get().getPlaces({
...options,
- positions: pois,
+ categories: [DecentralandCategories.POI],
})
return shuffle(result.data).filter(
(place) => !place.image?.startsWith("https://api.decentraland.org")
diff --git a/src/intl/en.json b/src/intl/en.json
index 8df37ef1..816af035 100644
--- a/src/intl/en.json
+++ b/src/intl/en.json
@@ -65,7 +65,8 @@
"description": "description",
"location": "location",
"content_moderation": "Content Moderation",
- "rate_label": "Please rate this scene"
+ "rate_label": "Please rate this scene",
+ "appears_on": "Appears On"
},
"rating_button": {
"rating_t": "T",
@@ -104,6 +105,11 @@
"description_a": "The rating for {scene_name} has been successful changed to Adult (PG 18+). This content is now only available to users aged 18 and above.",
"description_r": "The rating for {scene_name} has been successful changed to Restricted. This content is now no longer visible in Decentraland.",
"button_label": "OK"
+ },
+ "category": {
+ "clear_all": "Clear All",
+ "one_or_more": "Select one or more Categories",
+ "quantity_selected": "{quantity} Category Selected"
}
}
},
@@ -132,7 +138,10 @@
"pois": "Point of interest",
"featured": "Featured",
"show_more": "Show More",
- "search_results_title": "Search results for"
+ "search_results_title": "Search results for",
+ "clear_all": "Clear All",
+ "category_filter_title": "Categories",
+ "categories_selected": "Selected"
},
"favorites": {
"title": "Favorites",
@@ -190,5 +199,23 @@
},
"user_menu": {
"api": "API"
+ },
+ "categories": {
+ "poi": "📍Point of Interest",
+ "featured": "✨ Featured",
+ "art": "🎨 Art",
+ "game": "🕹️ Game",
+ "casino": "🃏 Casino",
+ "social": "👥 Social",
+ "music": "🎶 Music",
+ "fashion": "👠 Fashion",
+ "crypto": "🪙 Crypto",
+ "education": "📚 Education",
+ "shop": "🛍️ Shop",
+ "business": "🏢 Business",
+ "sports": "🏅 Sports",
+ "title": "Categories",
+ "new_label": "NEW",
+ "explore": "Explore Categories"
}
}
diff --git a/src/migrations/1660567567429_create-places-table copy.ts b/src/migrations/1660567567429_create-places-table copy.ts
index ad930e07..f4a3aeb8 100644
--- a/src/migrations/1660567567429_create-places-table copy.ts
+++ b/src/migrations/1660567567429_create-places-table copy.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1660567567430_create-entities-places.ts b/src/migrations/1660567567430_create-entities-places.ts
index 03937ac7..70036d33 100644
--- a/src/migrations/1660567567430_create-entities-places.ts
+++ b/src/migrations/1660567567430_create-entities-places.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1661265333848_create-users-table.ts b/src/migrations/1661265333848_create-users-table.ts
index 2fa7e958..6d6ca367 100644
--- a/src/migrations/1661265333848_create-users-table.ts
+++ b/src/migrations/1661265333848_create-users-table.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
import isEthereumAddress from "validator/lib/isEthereumAddress"
diff --git a/src/migrations/1661267835648_create-deploy-tracks-table.ts.ts b/src/migrations/1661267835648_create-deploy-tracks-table.ts.ts
index 5ad90332..40fcb253 100644
--- a/src/migrations/1661267835648_create-deploy-tracks-table.ts.ts
+++ b/src/migrations/1661267835648_create-deploy-tracks-table.ts.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1661341679835_create-place-activity-table.ts b/src/migrations/1661341679835_create-place-activity-table.ts
index 64f67a43..8820d60a 100644
--- a/src/migrations/1661341679835_create-place-activity-table.ts
+++ b/src/migrations/1661341679835_create-place-activity-table.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1661342995402_create-user-favorites-table.ts b/src/migrations/1661342995402_create-user-favorites-table.ts
index 295bd189..cd3006c4 100644
--- a/src/migrations/1661342995402_create-user-favorites-table.ts
+++ b/src/migrations/1661342995402_create-user-favorites-table.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1661343007272_create-user-likes-table.ts b/src/migrations/1661343007272_create-user-likes-table.ts
index 8d83af2c..798f5e9b 100644
--- a/src/migrations/1661343007272_create-user-likes-table.ts
+++ b/src/migrations/1661343007272_create-user-likes-table.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1661433479418_create-place-activity-daily-table.ts b/src/migrations/1661433479418_create-place-activity-daily-table.ts
index 7031f5ab..cce93551 100644
--- a/src/migrations/1661433479418_create-place-activity-daily-table.ts
+++ b/src/migrations/1661433479418_create-place-activity-daily-table.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1662121657764_add-stats-to-places.ts b/src/migrations/1662121657764_add-stats-to-places.ts
index 18db8b6e..cd179b9e 100644
--- a/src/migrations/1662121657764_add-stats-to-places.ts
+++ b/src/migrations/1662121657764_add-stats-to-places.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1662726073097_create-categories.ts b/src/migrations/1662726073097_create-categories.ts
index a7eeefe2..ae5bd09f 100644
--- a/src/migrations/1662726073097_create-categories.ts
+++ b/src/migrations/1662726073097_create-categories.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
import Model from "../entities/Category/model"
diff --git a/src/migrations/1664364229612_add-activity-and-popularity-fields-to-places.ts b/src/migrations/1664364229612_add-activity-and-popularity-fields-to-places.ts
index e8db4715..cf929efd 100644
--- a/src/migrations/1664364229612_add-activity-and-popularity-fields-to-places.ts
+++ b/src/migrations/1664364229612_add-activity-and-popularity-fields-to-places.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1664367704847_add-index-to-places.ts b/src/migrations/1664367704847_add-index-to-places.ts
index e4fc0fe4..f4fffcf0 100644
--- a/src/migrations/1664367704847_add-index-to-places.ts
+++ b/src/migrations/1664367704847_add-index-to-places.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { MigrationBuilder } from "node-pg-migrate"
import PlaceModel from "../entities/Place/model"
diff --git a/src/migrations/1666884606987_add-default-places.ts b/src/migrations/1666884606987_add-default-places.ts
index 441c4391..ee8be902 100644
--- a/src/migrations/1666884606987_add-default-places.ts
+++ b/src/migrations/1666884606987_add-default-places.ts
@@ -1,5 +1,5 @@
/* eslint-disable @typescript-eslint/no-unused-vars */
-/* eslint-disable @typescript-eslint/naming-convention */
+
import { MigrationBuilder } from "node-pg-migrate"
export async function up(pgm: MigrationBuilder): Promise {}
diff --git a/src/migrations/1666984055037_add-default-places.ts b/src/migrations/1666984055037_add-default-places.ts
index 6c4acc1e..324e1d79 100644
--- a/src/migrations/1666984055037_add-default-places.ts
+++ b/src/migrations/1666984055037_add-default-places.ts
@@ -1,21 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/01_places.json"
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(pgm: MigrationBuilder): Promise {}
+
+export async function down(pgm: MigrationBuilder): Promise {}
diff --git a/src/migrations/1667326512314_add-update-static-places.ts b/src/migrations/1667326512314_add-update-static-places.ts
index 4bd86aac..324e1d79 100644
--- a/src/migrations/1667326512314_add-update-static-places.ts
+++ b/src/migrations/1667326512314_add-update-static-places.ts
@@ -1,21 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/02_places.json"
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(pgm: MigrationBuilder): Promise {}
+
+export async function down(pgm: MigrationBuilder): Promise {}
diff --git a/src/migrations/1667407333574_automatic-update-static-places.ts b/src/migrations/1667407333574_automatic-update-static-places.ts
index 89116204..324e1d79 100644
--- a/src/migrations/1667407333574_automatic-update-static-places.ts
+++ b/src/migrations/1667407333574_automatic-update-static-places.ts
@@ -1,21 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/03_places.json"
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(pgm: MigrationBuilder): Promise {}
+
+export async function down(pgm: MigrationBuilder): Promise {}
diff --git a/src/migrations/1667826308625_automatic-update-static-places.ts b/src/migrations/1667826308625_automatic-update-static-places.ts
index 0c944072..324e1d79 100644
--- a/src/migrations/1667826308625_automatic-update-static-places.ts
+++ b/src/migrations/1667826308625_automatic-update-static-places.ts
@@ -1,22 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/04_places.json"
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(pgm: MigrationBuilder): Promise {}
+
+export async function down(pgm: MigrationBuilder): Promise {}
diff --git a/src/migrations/1667854790636_automatic-update-static-places.ts b/src/migrations/1667854790636_automatic-update-static-places.ts
index 3c437625..3c553668 100644
--- a/src/migrations/1667854790636_automatic-update-static-places.ts
+++ b/src/migrations/1667854790636_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/05_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1668011471669_automatic-update-static-places.ts b/src/migrations/1668011471669_automatic-update-static-places.ts
index 2cac0845..3c553668 100644
--- a/src/migrations/1668011471669_automatic-update-static-places.ts
+++ b/src/migrations/1668011471669_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/06_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1668177496363_automatic-update-static-places.ts b/src/migrations/1668177496363_automatic-update-static-places.ts
index 73cd48d7..3c553668 100644
--- a/src/migrations/1668177496363_automatic-update-static-places.ts
+++ b/src/migrations/1668177496363_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/07_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1668189003142_automatic-update-static-places.ts b/src/migrations/1668189003142_automatic-update-static-places.ts
index 01c0350f..3c553668 100644
--- a/src/migrations/1668189003142_automatic-update-static-places.ts
+++ b/src/migrations/1668189003142_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/08_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1668191619253_automatic-update-static-places.ts b/src/migrations/1668191619253_automatic-update-static-places.ts
index 03db6a33..3c553668 100644
--- a/src/migrations/1668191619253_automatic-update-static-places.ts
+++ b/src/migrations/1668191619253_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/09_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1668694049337_automatic-update-static-places.ts b/src/migrations/1668694049337_automatic-update-static-places.ts
index d8c4b615..3c553668 100644
--- a/src/migrations/1668694049337_automatic-update-static-places.ts
+++ b/src/migrations/1668694049337_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/10_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1669376178912_automatic-update-static-places.ts b/src/migrations/1669376178912_automatic-update-static-places.ts
index 01c0350f..3c553668 100644
--- a/src/migrations/1669376178912_automatic-update-static-places.ts
+++ b/src/migrations/1669376178912_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/08_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1669640960739_automatic-update-static-places.ts b/src/migrations/1669640960739_automatic-update-static-places.ts
index dc7a91b5..3c553668 100644
--- a/src/migrations/1669640960739_automatic-update-static-places.ts
+++ b/src/migrations/1669640960739_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/11_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1669652989218_automatic-update-static-places.ts b/src/migrations/1669652989218_automatic-update-static-places.ts
index ab5c4089..3c553668 100644
--- a/src/migrations/1669652989218_automatic-update-static-places.ts
+++ b/src/migrations/1669652989218_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/12_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1670601965054_automatic-update-static-places.ts b/src/migrations/1670601965054_automatic-update-static-places.ts
index 8df62e0e..3c553668 100644
--- a/src/migrations/1670601965054_automatic-update-static-places.ts
+++ b/src/migrations/1670601965054_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/13_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1671103653369_automatic-update-static-places.ts b/src/migrations/1671103653369_automatic-update-static-places.ts
index 58ba1e92..3c553668 100644
--- a/src/migrations/1671103653369_automatic-update-static-places.ts
+++ b/src/migrations/1671103653369_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/14_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1671445408574_automatic-update-static-places.ts b/src/migrations/1671445408574_automatic-update-static-places.ts
index 7f508fc2..3c553668 100644
--- a/src/migrations/1671445408574_automatic-update-static-places.ts
+++ b/src/migrations/1671445408574_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/15_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1671460713493_automatic-update-static-places.ts b/src/migrations/1671460713493_automatic-update-static-places.ts
index 42ae3d5c..3c553668 100644
--- a/src/migrations/1671460713493_automatic-update-static-places.ts
+++ b/src/migrations/1671460713493_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/16_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1673351326639_automatic-update-static-places.ts b/src/migrations/1673351326639_automatic-update-static-places.ts
index b903bdbf..3c553668 100644
--- a/src/migrations/1673351326639_automatic-update-static-places.ts
+++ b/src/migrations/1673351326639_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/17_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1673362637437_automatic-update-static-places.ts b/src/migrations/1673362637437_automatic-update-static-places.ts
index 7daa1886..3c553668 100644
--- a/src/migrations/1673362637437_automatic-update-static-places.ts
+++ b/src/migrations/1673362637437_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/18_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1676460517867_automatic-update-static-places.ts b/src/migrations/1676460517867_automatic-update-static-places.ts
index 184ee2b1..3c553668 100644
--- a/src/migrations/1676460517867_automatic-update-static-places.ts
+++ b/src/migrations/1676460517867_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/19_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1678121928868_automatic-update-static-places.ts b/src/migrations/1678121928868_automatic-update-static-places.ts
index 49ceb1b3..3c553668 100644
--- a/src/migrations/1678121928868_automatic-update-static-places.ts
+++ b/src/migrations/1678121928868_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/20_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1678278187782_automatic-update-static-places.ts b/src/migrations/1678278187782_automatic-update-static-places.ts
index 8ebd5b22..3c553668 100644
--- a/src/migrations/1678278187782_automatic-update-static-places.ts
+++ b/src/migrations/1678278187782_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/21_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1678965395372_automatic-update-static-places.ts b/src/migrations/1678965395372_automatic-update-static-places.ts
index 6f7f170a..3c553668 100644
--- a/src/migrations/1678965395372_automatic-update-static-places.ts
+++ b/src/migrations/1678965395372_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/22_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1679913417466_automatic-update-static-places.ts b/src/migrations/1679913417466_automatic-update-static-places.ts
index f0bc5597..3c553668 100644
--- a/src/migrations/1679913417466_automatic-update-static-places.ts
+++ b/src/migrations/1679913417466_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/23_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1679928966517_automatic-update-static-places.ts b/src/migrations/1679928966517_automatic-update-static-places.ts
index 60cf0aa8..3c553668 100644
--- a/src/migrations/1679928966517_automatic-update-static-places.ts
+++ b/src/migrations/1679928966517_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/24_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1680108182797_automatic-update-static-places.ts b/src/migrations/1680108182797_automatic-update-static-places.ts
index 52660465..3c553668 100644
--- a/src/migrations/1680108182797_automatic-update-static-places.ts
+++ b/src/migrations/1680108182797_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/25_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1680117659843_automatic-update-static-places.ts b/src/migrations/1680117659843_automatic-update-static-places.ts
index 7f0d408e..3c553668 100644
--- a/src/migrations/1680117659843_automatic-update-static-places.ts
+++ b/src/migrations/1680117659843_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/26_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1680120436022_automatic-update-static-places.ts b/src/migrations/1680120436022_automatic-update-static-places.ts
index a277f011..3c553668 100644
--- a/src/migrations/1680120436022_automatic-update-static-places.ts
+++ b/src/migrations/1680120436022_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/27_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1680188822272_automatic-update-static-places.ts b/src/migrations/1680188822272_automatic-update-static-places.ts
index b3039167..3c553668 100644
--- a/src/migrations/1680188822272_automatic-update-static-places.ts
+++ b/src/migrations/1680188822272_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/28_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1680192724848_automatic-update-static-places.ts b/src/migrations/1680192724848_automatic-update-static-places.ts
index e87cd8fa..3c553668 100644
--- a/src/migrations/1680192724848_automatic-update-static-places.ts
+++ b/src/migrations/1680192724848_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/29_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1680712434879_automatic-update-static-places.ts b/src/migrations/1680712434879_automatic-update-static-places.ts
index f5dd0c1d..3c553668 100644
--- a/src/migrations/1680712434879_automatic-update-static-places.ts
+++ b/src/migrations/1680712434879_automatic-update-static-places.ts
@@ -1,24 +1,7 @@
-import { createPlaceMigration } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/30_places.json"
+import { ColumnDefinitions } from "node-pg-migrate"
-const attributes: Array = [
- "title",
- "description",
- "image",
- "highlighted_image",
- "featured_image",
- "owner",
- "tags",
- "positions",
- "base_position",
- "contact_name",
- "contact_email",
- "content_rating",
- "highlighted",
- "featured",
- "disabled",
- "disabled_at",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceMigration(defaultPlace, attributes)
+export async function up(): Promise {}
+
+export async function down(): Promise {}
diff --git a/src/migrations/1680794073381_change-like-rate-default.ts b/src/migrations/1680794073381_change-like-rate-default.ts
index 7a8e8599..35c3a099 100644
--- a/src/migrations/1680794073381_change-like-rate-default.ts
+++ b/src/migrations/1680794073381_change-like-rate-default.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { MigrationBuilder } from "node-pg-migrate"
import PlaceModel from "../entities/Place/model"
diff --git a/src/migrations/1683125607211_automatic-update-static-places.ts b/src/migrations/1683125607211_automatic-update-static-places.ts
index 485ae91f..324e1d79 100644
--- a/src/migrations/1683125607211_automatic-update-static-places.ts
+++ b/src/migrations/1683125607211_automatic-update-static-places.ts
@@ -1,17 +1,7 @@
-import { createPlaceNewMigrationUpdate } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/31_places_new.json"
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
-const attributes: Array = [
- "base_position",
- "highlighted_image",
- "highlighted",
- "featured",
- "featured_image",
- "world_name",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceNewMigrationUpdate(
- defaultPlace,
- attributes
-)
+export async function up(pgm: MigrationBuilder): Promise {}
+
+export async function down(pgm: MigrationBuilder): Promise {}
diff --git a/src/migrations/1683548296968_automatic-update-static-places.ts b/src/migrations/1683548296968_automatic-update-static-places.ts
index 60da9273..324e1d79 100644
--- a/src/migrations/1683548296968_automatic-update-static-places.ts
+++ b/src/migrations/1683548296968_automatic-update-static-places.ts
@@ -1,17 +1,7 @@
-import { createPlaceNewMigrationUpdate } from "../entities/Place/migration"
-import { PlaceAttributes } from "../entities/Place/types"
-import defaultPlace from "../seed/32_places_new.json"
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
-const attributes: Array = [
- "base_position",
- "highlighted_image",
- "highlighted",
- "featured",
- "featured_image",
- "world_name",
-]
+export const shorthands: ColumnDefinitions | undefined = undefined
-export const { up, down } = createPlaceNewMigrationUpdate(
- defaultPlace,
- attributes
-)
+export async function up(pgm: MigrationBuilder): Promise {}
+
+export async function down(pgm: MigrationBuilder): Promise {}
diff --git a/src/migrations/1684281224568_create-secondary-table-for-positions.ts b/src/migrations/1684281224568_create-secondary-table-for-positions.ts
index a1ca8527..37e37509 100644
--- a/src/migrations/1684281224568_create-secondary-table-for-positions.ts
+++ b/src/migrations/1684281224568_create-secondary-table-for-positions.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1690312213298_add-like-score-field-to-places-table.ts b/src/migrations/1690312213298_add-like-score-field-to-places-table.ts
index e40eb687..59063287 100644
--- a/src/migrations/1690312213298_add-like-score-field-to-places-table.ts
+++ b/src/migrations/1690312213298_add-like-score-field-to-places-table.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { Type } from "decentraland-gatsby/dist/entities/Database/types"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1690314551081_compute-like-score-places-table.ts b/src/migrations/1690314551081_compute-like-score-places-table.ts
index 74355fa7..cb4c7b44 100644
--- a/src/migrations/1690314551081_compute-like-score-places-table.ts
+++ b/src/migrations/1690314551081_compute-like-score-places-table.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { SQL, table } from "decentraland-gatsby/dist/entities/Database/utils"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1692121352544_change-like-score-field.ts b/src/migrations/1692121352544_change-like-score-field.ts
index b1c6ec21..a37f1151 100644
--- a/src/migrations/1692121352544_change-like-score-field.ts
+++ b/src/migrations/1692121352544_change-like-score-field.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
import PlaceModel from "../entities/Place/model"
diff --git a/src/migrations/1692122298274_replace-0-with-null-on-like-score.ts b/src/migrations/1692122298274_replace-0-with-null-on-like-score.ts
index fc364d85..db17fedc 100644
--- a/src/migrations/1692122298274_replace-0-with-null-on-like-score.ts
+++ b/src/migrations/1692122298274_replace-0-with-null-on-like-score.ts
@@ -1,4 +1,3 @@
-/* eslint-disable @typescript-eslint/naming-convention */
import { SQL, table } from "decentraland-gatsby/dist/entities/Database/utils"
import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
diff --git a/src/migrations/1696625541164_update-place-content-rating.ts b/src/migrations/1696625541164_update-place-content-rating.ts
index 9d967272..d2064aef 100644
--- a/src/migrations/1696625541164_update-place-content-rating.ts
+++ b/src/migrations/1696625541164_update-place-content-rating.ts
@@ -9,6 +9,9 @@ export async function up(pgm: MigrationBuilder): Promise {
}
export async function down(pgm: MigrationBuilder): Promise {
+ pgm.sql(
+ `UPDATE "${PlaceContentRatingModel.tableName}" SET moderator = '-' WHERE moderator IS NULL`
+ )
pgm.alterColumn(PlaceContentRatingModel.tableName, "moderator", {
notNull: true,
})
diff --git a/src/migrations/1696876576229_update-categories-table.ts b/src/migrations/1696876576229_update-categories-table.ts
new file mode 100644
index 00000000..78d9a3fe
--- /dev/null
+++ b/src/migrations/1696876576229_update-categories-table.ts
@@ -0,0 +1,43 @@
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
+
+import CategoryModel from "../entities/Category/model"
+
+export const shorthands: ColumnDefinitions | undefined = undefined
+
+const INITIAL_CATEGORIES = [
+ "poi",
+ "featured",
+ "game", // gaming
+ "casino", // gambling
+ "social",
+ "music",
+ "art",
+ "fashion",
+ "crypto",
+ "education",
+ "shop", // commercial
+ "sports", // sport
+ "business",
+]
+
+export async function up(pgm: MigrationBuilder): Promise {
+ pgm.dropColumn(CategoryModel.tableName, "places_counter")
+
+ for (const category of INITIAL_CATEGORIES) {
+ pgm.sql(
+ `INSERT INTO "${CategoryModel.tableName}" (name, active) VALUES ('${category}', TRUE)`
+ )
+ }
+}
+
+export async function down(pgm: MigrationBuilder): Promise {
+ pgm.addColumn(CategoryModel.tableName, {
+ places_counter: {
+ type: "INTEGER",
+ notNull: true,
+ default: 0,
+ },
+ })
+
+ pgm.sql(`TRUNCATE "${CategoryModel.tableName}"`)
+}
diff --git a/src/migrations/1696876576230_place-category-pivot-table.ts b/src/migrations/1696876576230_place-category-pivot-table.ts
new file mode 100644
index 00000000..0924d853
--- /dev/null
+++ b/src/migrations/1696876576230_place-category-pivot-table.ts
@@ -0,0 +1,25 @@
+import { Type } from "decentraland-gatsby/dist/entities/Database/types"
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
+
+import PlaceCategories from "../entities/PlaceCategories/model"
+
+export const shorthands: ColumnDefinitions | undefined = undefined
+
+export async function up(pgm: MigrationBuilder): Promise {
+ pgm.createTable(
+ PlaceCategories.tableName,
+ {
+ place_id: {
+ type: Type.UUID,
+ },
+ category_id: {
+ type: Type.Varchar(50),
+ },
+ },
+ { constraints: { primaryKey: ["category_id", "place_id"] } }
+ )
+}
+
+export async function down(pgm: MigrationBuilder): Promise {
+ pgm.dropTable(PlaceCategories.tableName)
+}
diff --git a/src/migrations/1696876576231_migrate-featured-to-category.ts b/src/migrations/1696876576231_migrate-featured-to-category.ts
new file mode 100644
index 00000000..5813c648
--- /dev/null
+++ b/src/migrations/1696876576231_migrate-featured-to-category.ts
@@ -0,0 +1,69 @@
+import { Type } from "decentraland-gatsby/dist/entities/Database/types"
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
+
+import PlaceModel from "../entities/Place/model"
+import PlaceCategories from "../entities/PlaceCategories/model"
+
+export const shorthands: ColumnDefinitions | undefined = undefined
+
+export async function up(pgm: MigrationBuilder): Promise {
+ const currentFeaturedPlaces: { id: string }[] = await pgm.db.select(
+ `SELECT id FROM ${PlaceModel.tableName} WHERE featured IS TRUE`
+ )
+
+ const ids = currentFeaturedPlaces.map(({ id }) => `'${id}'`).join(",")
+
+ const featuredPlaces = currentFeaturedPlaces
+ .map(({ id }) => `('${id}', 'featured')`)
+ .join(",")
+
+ if (featuredPlaces.length) {
+ pgm.sql(
+ `INSERT INTO ${PlaceCategories.tableName} (place_id, category_id) VALUES ${featuredPlaces}`
+ )
+ }
+
+ if (ids.length) {
+ pgm.sql(
+ `UPDATE ${PlaceModel.tableName} SET categories = array_append(categories, 'featured') WHERE id IN (${ids})`
+ )
+ }
+
+ pgm.dropColumns(PlaceModel.tableName, ["featured", "featured_image"])
+}
+
+export async function down(pgm: MigrationBuilder): Promise {
+ pgm.addColumns(PlaceModel.tableName, {
+ featured: {
+ notNull: true,
+ type: Type.Boolean,
+ default: false,
+ },
+ featured_image: {
+ notNull: false,
+ type: Type.Text,
+ },
+ })
+
+ const currentFeaturedPlaces = (
+ (await pgm.db.select(
+ `SELECT place_id as id FROM ${PlaceCategories.tableName} WHERE category_id = 'featured'`
+ )) as { id: string }[]
+ )
+ .map(({ id }) => `'${id}'`)
+ .join(",")
+
+ if (currentFeaturedPlaces.length) {
+ pgm.sql(
+ `UPDATE ${PlaceModel.tableName} SET featured = true WHERE id IN (${currentFeaturedPlaces})`
+ )
+ }
+
+ pgm.sql(
+ `DELETE FROM ${PlaceCategories.tableName} WHERE category_id = 'featured'`
+ )
+
+ pgm.sql(
+ `UPDATE ${PlaceModel.tableName} SET categories = array_remove(categories, 'featured')`
+ )
+}
diff --git a/src/migrations/1696876576232_compute-poi-to-category.ts b/src/migrations/1696876576232_compute-poi-to-category.ts
new file mode 100644
index 00000000..7cbb3682
--- /dev/null
+++ b/src/migrations/1696876576232_compute-poi-to-category.ts
@@ -0,0 +1,45 @@
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
+
+import PlaceModel from "../entities/Place/model"
+import PlaceCategories from "../entities/PlaceCategories/model"
+import PlacePositionModel from "../entities/PlacePosition/model"
+import { getPois } from "../modules/pois"
+
+export const shorthands: ColumnDefinitions | undefined = undefined
+
+export async function up(pgm: MigrationBuilder): Promise {
+ const pois = (await getPois()).map((poi) => `'${poi}'`).join(",")
+
+ const findEnabledByPositionsSQL = `
+ SELECT id FROM ${PlaceModel.tableName}
+ WHERE "disabled" is false
+ AND "world" is false
+ AND "base_position" IN (
+ SELECT DISTINCT("base_position")
+ FROM ${PlacePositionModel.tableName} "pp"
+ WHERE "pp"."position" IN (${pois})
+ )
+ `
+
+ const currentPois: { id: string }[] = await pgm.db.select(
+ findEnabledByPositionsSQL
+ )
+
+ const poiPlaces = currentPois.map(({ id }) => `('${id}', 'poi')`).join(",")
+ const ids = currentPois.map(({ id }) => `'${id}'`).join(",")
+
+ pgm.sql(
+ `INSERT INTO ${PlaceCategories.tableName} (place_id, category_id) VALUES ${poiPlaces}`
+ )
+
+ pgm.sql(
+ `UPDATE ${PlaceModel.tableName} SET categories = array_append(categories, 'poi') WHERE id IN (${ids})`
+ )
+}
+
+export async function down(pgm: MigrationBuilder): Promise {
+ pgm.sql(`DELETE FROM ${PlaceCategories.tableName} WHERE category_id = 'poi'`)
+ pgm.sql(
+ `UPDATE ${PlaceModel.tableName} SET categories = array_remove(categories, 'poi')`
+ )
+}
diff --git a/src/migrations/1696876576233_remove-tags-field-from-places-table.ts b/src/migrations/1696876576233_remove-tags-field-from-places-table.ts
new file mode 100644
index 00000000..01a117f2
--- /dev/null
+++ b/src/migrations/1696876576233_remove-tags-field-from-places-table.ts
@@ -0,0 +1,37 @@
+import { Type } from "decentraland-gatsby/dist/entities/Database/types"
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
+
+import PlaceModel from "../entities/Place/model"
+
+export const shorthands: ColumnDefinitions | undefined = undefined
+
+export async function up(pgm: MigrationBuilder): Promise {
+ pgm.sql(`
+ UPDATE "${PlaceModel.tableName}"
+ SET "textsearch" = (
+ setweight(to_tsvector(coalesce("title", '')), 'A') ||
+ setweight(to_tsvector(coalesce("description", '')), 'B') ||
+ setweight(to_tsvector(coalesce("owner", '')), 'C')
+ )`)
+
+ pgm.dropColumn(PlaceModel.tableName, "tags")
+}
+
+export async function down(pgm: MigrationBuilder): Promise {
+ pgm.addColumn(PlaceModel.tableName, {
+ tags: {
+ type: Type.Array(Type.Varchar(25)),
+ default: "{}",
+ notNull: true,
+ },
+ })
+
+ pgm.sql(`
+ UPDATE "${PlaceModel.tableName}"
+ SET "textsearch" = (
+ setweight(to_tsvector(coalesce("title", '')), 'A') ||
+ setweight(to_tsvector(coalesce("description", '')), 'B') ||
+ setweight(to_tsvector(coalesce("owner", '')), 'C') ||
+ setweight(to_tsvector(coalesce(concat("tags"), '')), 'D')
+ )`)
+}
diff --git a/src/migrations/1696876576234_compute-places-with-categories.ts b/src/migrations/1696876576234_compute-places-with-categories.ts
new file mode 100644
index 00000000..5606f8fc
--- /dev/null
+++ b/src/migrations/1696876576234_compute-places-with-categories.ts
@@ -0,0 +1,78 @@
+import { ColumnDefinitions, MigrationBuilder } from "node-pg-migrate"
+
+import PlaceModel from "../entities/Place/model"
+import PlaceCategoriesModel from "../entities/PlaceCategories/model"
+import PlacePositionModel from "../entities/PlacePosition/model"
+
+export const shorthands: ColumnDefinitions | undefined = undefined
+
+export async function up(pgm: MigrationBuilder): Promise {
+ const { content } = await import("../seed/base_categorized_content.json")
+
+ const processed = content.reduce((acc, curr) => {
+ if (acc[curr.category_id]) {
+ acc[curr.category_id].push(curr.base_position)
+ } else {
+ acc[curr.category_id] = [curr.base_position]
+ }
+ return acc
+ }, {} as Record)
+
+ for (const [category, positions] of Object.entries(processed)) {
+ pgm.sql(`UPDATE ${PlaceModel.tableName}
+ SET categories = array_append(categories, '${category}')
+ WHERE
+ disabled is false AND base_position IN (
+ SELECT DISTINCT(pp.base_position)
+ FROM ${PlacePositionModel.tableName} pp
+ WHERE pp.position IN (${positions.map((pos) => `'${pos}'`).join(",")})
+ )
+ `)
+
+ pgm.sql(`
+ INSERT INTO ${PlaceCategoriesModel.tableName} (category_id, place_id)
+ SELECT
+ '${category}', p.id
+ FROM ${PlaceModel.tableName} p
+ WHERE
+ p.disabled is false
+ AND p.base_position IN (
+ SELECT DISTINCT(pp.base_position)
+ FROM ${PlacePositionModel.tableName} pp
+ WHERE pp.position IN (${positions.map((pos) => `'${pos}'`).join(",")})
+ )
+ `)
+ }
+}
+
+export async function down(pgm: MigrationBuilder): Promise {
+ const { content } = await import("../seed/base_categorized_content.json")
+
+ for (const value of content) {
+ pgm.sql(`UPDATE ${PlaceModel.tableName} p
+ SET categories = array_remove(categories, '${value.category_id}')
+ WHERE
+ disabled is false
+ AND base_position IN (
+ SELECT DISTINCT(pp.base_position)
+ FROM ${PlacePositionModel.tableName} pp
+ WHERE '${value.base_position}' = pp.position
+ )
+ `)
+ pgm.sql(`
+ DELETE FROM ${PlaceCategoriesModel.tableName}
+ WHERE category_id = '${value.category_id}' AND place_id IN (
+ SELECT
+ p.id
+ FROM ${PlaceModel.tableName} p
+ WHERE
+ p.disabled is false
+ AND p.base_position IN (
+ SELECT DISTINCT(pp.base_position)
+ FROM ${PlacePositionModel.tableName} pp
+ WHERE '${value.base_position}' = pp.position
+ )
+ )
+ `)
+ }
+}
diff --git a/src/modules/categories.ts b/src/modules/categories.ts
new file mode 100644
index 00000000..9f73905b
--- /dev/null
+++ b/src/modules/categories.ts
@@ -0,0 +1,26 @@
+import { Category } from "../entities/Category/types"
+
+export const getCurrentCategories = (
+ categories: Category[],
+ action: "add" | "remove",
+ categoryId: string
+) => {
+ let currentCategories = categories.filter(({ active }) => active)
+ if (action === "add") {
+ if (!currentCategories.find(({ name }) => name === categoryId)) {
+ const category = {
+ ...categories.find(({ name }) => name === categoryId)!,
+ }
+ category.active = true
+ currentCategories.push(category)
+ }
+ }
+
+ if (action === "remove") {
+ currentCategories = currentCategories.filter(
+ ({ name }) => name !== categoryId
+ )
+ }
+
+ return currentCategories
+}
diff --git a/src/modules/locations.ts b/src/modules/locations.ts
index 5e45e4f7..4ffcdbb3 100644
--- a/src/modules/locations.ts
+++ b/src/modules/locations.ts
@@ -14,14 +14,14 @@ import toCanonicalPosition from "../utils/position/toCanonicalPosition"
const GATSBY_BASE_URL = process.env.GATSBY_BASE_URL || "/"
export type PlacesPageOptions = {
- only_pois: boolean
only_favorites: boolean
- only_featured: boolean
only_highlighted: boolean
order_by: PlaceListOrderBy
order: "asc" | "desc"
page: number
search: string
+ categories: string[]
+ only_view_category: string
}
export type WorldsPageOptions = {
@@ -34,13 +34,13 @@ export type WorldsPageOptions = {
const pageOptionsDefault: PlacesPageOptions = {
only_favorites: false,
- only_pois: false,
- only_featured: false,
only_highlighted: false,
order_by: PlaceListOrderBy.MOST_ACTIVE,
order: "desc",
page: 1,
search: "",
+ categories: [],
+ only_view_category: "",
}
const pageWorldsOptionsDefault: WorldsPageOptions = {
@@ -53,9 +53,6 @@ const pageWorldsOptionsDefault: WorldsPageOptions = {
export function toPlacesOptions(params: URLSearchParams): PlacesPageOptions {
return {
- only_pois: bool(params.get("only_pois")) ?? pageOptionsDefault.only_pois,
- only_featured:
- bool(params.get("only_featured")) ?? pageOptionsDefault.only_featured,
only_highlighted:
bool(params.get("only_highlighted")) ??
pageOptionsDefault.only_highlighted,
@@ -70,6 +67,8 @@ export function toPlacesOptions(params: URLSearchParams): PlacesPageOptions {
oneOf(params.get("order"), ["asc", "desc"]) ?? pageOptionsDefault.order,
page: numeric(params.get("page"), { min: 1 }) ?? pageOptionsDefault.page,
search: params.get("search") ?? "",
+ categories: [...new Set(params.getAll("categories"))] ?? [],
+ only_view_category: params.get("only_view_category") ?? "",
}
}
diff --git a/src/pages/index.css b/src/pages/index.css
index 41e2ca88..fd070d3b 100644
--- a/src/pages/index.css
+++ b/src/pages/index.css
@@ -36,7 +36,6 @@
.overview__carousel2 {
margin-top: -24px;
- margin-bottom: 22px;
}
/* TODO: Check if we need this into carousel2 */
diff --git a/src/pages/index.tsx b/src/pages/index.tsx
index fad9e5be..962d5023 100644
--- a/src/pages/index.tsx
+++ b/src/pages/index.tsx
@@ -12,12 +12,15 @@ import useFeatureFlagContext from "decentraland-gatsby/dist/context/FeatureFlag/
import useFormatMessage from "decentraland-gatsby/dist/hooks/useFormatMessage"
import { Container } from "decentraland-ui/dist/components/Container/Container"
+import { CategorySections } from "../components/Category/CategorySections"
import Navigation, { NavigationTab } from "../components/Layout/Navigation"
import OverviewList from "../components/Layout/OverviewList"
import SearchList from "../components/Layout/SearchList"
import PlaceFeatured from "../components/Place/PlaceFeatured/PlaceFeatured"
import WorldLabel from "../components/World/WorldLabel/WorldLabel"
+import { DecentralandCategories } from "../entities/Category/types"
import { PlaceListOrderBy } from "../entities/Place/types"
+import usePlaceCategories from "../hooks/usePlaceCategories"
import { usePlaceListFeatured } from "../hooks/usePlaceListFeatured"
import { usePlaceListHighlighted } from "../hooks/usePlaceListHighlighted"
import { usePlaceListHightRated } from "../hooks/usePlaceListHightRated"
@@ -68,6 +71,8 @@ export default function OverviewPage() {
search
)
+ const [categories] = usePlaceCategories()
+
const [placeListSearch, worldListSearch] = useMemo(
() => [placeSearch.data, worldSearch.data],
[placeSearch.data, worldSearch.data]
@@ -138,7 +143,8 @@ export default function OverviewPage() {
places={featuredList}
title={l("pages.overview.featured")}
href={locations.places({
- only_featured: true,
+ categories: [DecentralandCategories.FEATURED],
+ order_by: PlaceListOrderBy.LIKE_SCORE_BEST,
})}
onClickFavorite={(e, place) =>
handleFavorite(place.id, place, {
@@ -210,7 +216,10 @@ export default function OverviewPage() {
handleFavorite(place.id, place, {
place: e.currentTarget.dataset.place!,
@@ -244,14 +253,17 @@ export default function OverviewPage() {
const renderCarousel = () => (
<>
{(placeListHighlightedState.loading || highlightedList.length > 0) && (
-
+ <>
+
+ name)} />
+ >
)}
>
)
diff --git a/src/pages/place.tsx b/src/pages/place.tsx
index 1582459d..007fabb9 100644
--- a/src/pages/place.tsx
+++ b/src/pages/place.tsx
@@ -118,7 +118,7 @@ export default function PlacePage() {
setOpenContentModerationModal(false)
- await handleRating(place.id, selectedRate as SceneContentRating)
+ await handleRating(place.id, selectedRate)
setOpenConfirmModal(true)
},
diff --git a/src/pages/places.css b/src/pages/places.css
index b04641c5..c34a002b 100644
--- a/src/pages/places.css
+++ b/src/pages/places.css
@@ -1,4 +1,53 @@
-.places-page {
+.places-page__search-input--mobile {
+ margin-bottom: 8px;
+}
+
+.places-page__category-filters-box-container {
+ display: flex;
+ flex-direction: column;
+}
+
+.places-page__category-filters-info {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ margin-bottom: 10px;
+}
+
+.places-page__category-filters-info p {
+ color: var(--secondary-text);
+ font-size: 14px;
+ font-weight: 700;
+ margin-bottom: 0;
+}
+
+.places-page__category-filters-info > div {
+ display: flex;
+ align-items: center;
+}
+
+.places-page__category-filters-info > div > .ui.basic.button {
+ margin-left: 5px;
+}
+
+.places-page__category-filters_box--mobile > .dcl.box-children {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.places-page__category-filters_box--mobile
+ > .dcl.box-children
+ .category-filter__box {
+ margin-bottom: 5px;
+}
+
+.places-page__category-filters-box {
+ display: flex;
+ flex-wrap: wrap;
+}
+
+.places-page__category-filters-box .dcl.filter {
+ margin: 2px 0;
}
.places-page .places-page__filters {
@@ -65,6 +114,35 @@
margin-bottom: 20px;
}
+.only-view-category-navbar__box {
+ display: flex;
+ align-items: center;
+}
+
+.only-view-category-navbar__box > .dcl.back {
+ margin-right: 5px;
+}
+
+.ui.overview-list {
+ flex-direction: column;
+}
+
+.ui.overview-list span {
+ color: #a09ba8;
+ font-weight: 600;
+}
+
+.clear-all-filter-btn .dcl.filter > span {
+ display: flex;
+ align-items: center;
+}
+
+.clear-all-filter-btn .dcl.filter > span > p {
+ color: inherit;
+ font-weight: 700;
+ margin-left: 8px;
+}
+
@media only screen and (min-width: 768px) {
.places-page .places-page__filters .ui.header {
margin-left: 22px;
@@ -76,6 +154,14 @@
.place-list__container {
width: calc(100% + 28px);
}
+
+ .ui.overview-list
+ > .ui.container.full
+ > .dcl.header-menu
+ > .dcl.header-menu-left
+ > .ui.header {
+ font-size: 20px;
+ }
}
@media only screen and (max-width: 435px) {
@@ -95,4 +181,16 @@
margin-right: 0;
margin-left: 0;
}
+
+ .ui.overview-list
+ > .ui.container.full
+ > .dcl.header-menu
+ > .dcl.header-menu-left
+ > .ui.header {
+ font-size: 20px;
+ }
+}
+
+.ui.modal .ui.button.category-btn {
+ background-color: var(--text-on-primary);
}
diff --git a/src/pages/places.tsx b/src/pages/places.tsx
index f2b06ea6..0595563a 100644
--- a/src/pages/places.tsx
+++ b/src/pages/places.tsx
@@ -4,7 +4,6 @@ import { Helmet } from "react-helmet"
import { useLocation } from "@gatsbyjs/reach-router"
import MaintenancePage from "decentraland-gatsby/dist/components/Layout/MaintenancePage"
-import FilterContainerModal from "decentraland-gatsby/dist/components/Modal/FilterContainerModal"
import useFeatureFlagContext from "decentraland-gatsby/dist/context/FeatureFlag/useFeatureFlagContext"
import useTrackContext from "decentraland-gatsby/dist/context/Track/useTrackContext"
import { oneOf } from "decentraland-gatsby/dist/entities/Schema/utils"
@@ -12,30 +11,42 @@ import useAsyncTask from "decentraland-gatsby/dist/hooks/useAsyncTask"
import useFormatMessage from "decentraland-gatsby/dist/hooks/useFormatMessage"
import { navigate } from "decentraland-gatsby/dist/plugins/intl"
import API from "decentraland-gatsby/dist/utils/api/API"
-import { Box } from "decentraland-ui/dist/components/Box/Box"
+import { Back } from "decentraland-ui/dist/components/Back/Back"
import { Button } from "decentraland-ui/dist/components/Button/Button"
import { Dropdown } from "decentraland-ui/dist/components/Dropdown/Dropdown"
import { Filter } from "decentraland-ui/dist/components/Filter/Filter"
import { HeaderMenu } from "decentraland-ui/dist/components/HeaderMenu/HeaderMenu"
import { useMobileMediaQuery } from "decentraland-ui/dist/components/Media/Media"
-import Select from "semantic-ui-react/dist/commonjs/addons/Select"
import Grid from "semantic-ui-react/dist/commonjs/collections/Grid"
-import Icon from "semantic-ui-react/dist/commonjs/elements/Icon"
import Places from "../api/Places"
+import {
+ CategoryFilter,
+ CategoryFilterProps,
+} from "../components/Category/CategoryFilter"
+import { CategoryFilters } from "../components/Category/CategoryFilters"
+import { CategoryList } from "../components/Category/CategoryList"
+import { Close } from "../components/Icon/Close"
+import { Filter as FilterIcon } from "../components/Icon/Filter"
+import { Trash } from "../components/Icon/Trash"
import Navigation, { NavigationTab } from "../components/Layout/Navigation"
import NoResults from "../components/Layout/NoResults"
+import OverviewList from "../components/Layout/OverviewList"
+import SearchInput from "../components/Layout/SearchInput"
+import { CategoryModal } from "../components/Modal/CategoryModal"
import PlaceList from "../components/Place/PlaceList/PlaceList"
import { getPlaceListQuerySchema } from "../entities/Place/schemas"
import {
AggregatePlaceAttributes,
- PlaceListOptions,
PlaceListOrderBy,
} from "../entities/Place/types"
+import usePlaceCategoriesManager from "../hooks/usePlaceCategoriesManager"
import usePlacesManager from "../hooks/usePlacesManager"
import { FeatureFlags } from "../modules/ff"
-import locations, { toPlacesOptions } from "../modules/locations"
-import { getPois } from "../modules/pois"
+import locations, {
+ PlacesPageOptions,
+ toPlacesOptions,
+} from "../modules/locations"
import { SegmentPlace } from "../modules/segment"
import "./places.css"
@@ -47,53 +58,112 @@ export default function IndexPage() {
const isMobile = useMobileMediaQuery()
const location = useLocation()
const track = useTrackContext()
+
+ // TODO: remove one of these params
const params = useMemo(
() => toPlacesOptions(new URLSearchParams(location.search)),
[location.search]
)
+ const searchParams = useMemo(
+ () => new URLSearchParams(location.search),
+ [location.search]
+ )
const [offset, setOffset] = useState(0)
const isSearching = !!params.search && params.search.length > 2
const search = (isSearching && params.search) || ""
+ const [isCategoriesModalVisible, setIsCategoriesModalVisible] =
+ useState(false)
+
const [totalPlaces, setTotalPlaces] = useState(0)
const [allPlaces, setAllPlaces] = useState([])
+ const isFilteringByCategory = params.categories.length > 0
+
+ const [
+ categories,
+ previousActiveCategories,
+ { handleAddCategory, handleRemoveCategory, handleSyncCategory },
+ ] = usePlaceCategoriesManager(params.categories)
+
const [loadingPlaces, loadPlaces] = useAsyncTask(async () => {
- const { only_pois, ...extra } = API.fromPagination(params, {
+ const options = API.fromPagination(params, {
pageSize: PAGE_SIZE,
})
- const options: Partial = extra
- if (only_pois) {
- const pois = await getPois()
- options.positions = pois
- }
+
track(SegmentPlace.FilterChange, {
filters: options,
place: SegmentPlace.Places,
})
- const placesFetch = await Places.get().getPlaces({
- ...options,
- offset,
- search: isSearching ? search : undefined,
- })
+ const only_view_places: AggregatePlaceAttributes[] = []
+
+ if (params.only_view_category) {
+ const placesFetch = await Places.get().getPlaces({
+ ...options,
+ offset,
+ categories: [params.only_view_category],
+ search: isSearching ? search : undefined,
+ })
+ only_view_places.push(...placesFetch.data)
+ }
+
+ let response = {
+ total: 0,
+ data: [] as AggregatePlaceAttributes[],
+ ok: false,
+ }
+ if (params.categories.length) {
+ const categoriesFetch = []
+ for (const category of params.categories) {
+ const placesFetch = Places.get().getPlaces({
+ ...options,
+ offset,
+ limit: 15,
+ categories: [category],
+ search: isSearching ? search : undefined,
+ })
+ categoriesFetch.push(placesFetch)
+ }
+ const responses = await Promise.all(categoriesFetch)
+
+ for (const res of responses) {
+ response.total += res.total
+ response.data.push(...res.data)
+ }
+ } else {
+ const placesFetch = await Places.get().getPlaces({
+ ...options,
+ offset,
+ search: isSearching ? search : undefined,
+ })
+ response = placesFetch
+ }
if (isSearching) {
track(SegmentPlace.PlacesSearch, {
- resultsCount: placesFetch.total,
- top10: placesFetch.data.slice(0, 10),
+ resultsCount: response.total,
+ top10: response.data.slice(0, 10),
search,
place: SegmentPlace.Places,
})
- setAllPlaces(placesFetch.data)
+ if (params.only_view_category) {
+ setAllPlaces(only_view_places)
+ } else {
+ setAllPlaces(response.data)
+ }
} else {
- setAllPlaces((allPlaces) => [...allPlaces, ...placesFetch.data])
+ setAllPlaces((allPlaces) => [
+ ...allPlaces,
+ ...only_view_places,
+ ...response.data,
+ ])
}
- if (Number.isSafeInteger(placesFetch.total)) {
- setTotalPlaces(placesFetch.total)
+ if (Number.isSafeInteger(response.total)) {
+ setTotalPlaces(response.total)
}
}, [params, track, offset])
@@ -103,11 +173,10 @@ export default function IndexPage() {
}
}, [
params.only_favorites,
- params.only_featured,
params.only_highlighted,
- params.only_pois,
params.order,
params.order_by,
+ params.categories,
])
useEffect(() => {
@@ -121,11 +190,10 @@ export default function IndexPage() {
search,
isSearching,
params.only_favorites,
- params.only_featured,
params.only_highlighted,
- params.only_pois,
params.order,
params.order_by,
+ params.categories,
])
useEffect(() => {
@@ -159,80 +227,140 @@ export default function IndexPage() {
[params, track, offset]
)
- const handleChangePois = useCallback(
- (e: React.SyntheticEvent, props: { value?: any }) => {
- e.preventDefault()
- e.stopPropagation()
- const newParams = {
- ...params,
- only_featured: false,
- only_pois: !!props.value,
- }
-
- if (newParams.order_by && newParams.only_pois) {
- newParams.order_by = PlaceListOrderBy.LIKE_SCORE_BEST
- }
-
+ const handleChangeOrder = useCallback(
+ (_: React.SyntheticEvent, props: { value?: any }) => {
+ const value =
+ oneOf(props.value, getPlaceListQuerySchema.properties.order_by.enum) ??
+ PlaceListOrderBy.LIKE_SCORE_BEST
+ const newParams = { ...params, order_by: value, page: 1 }
setAllPlaces([])
track(SegmentPlace.FilterChange, {
filters: newParams,
- place: SegmentPlace.PlacesChangePois,
+ place: SegmentPlace.PlacesChangeOrder,
})
navigate(locations.places(newParams))
},
[params, track]
)
- const handleChangeFeatured = useCallback(
- (e: React.SyntheticEvent, props: { value?: any }) => {
- e.preventDefault()
- e.stopPropagation()
- const newParams = {
- ...params,
- only_pois: false,
- only_featured: !!props.value,
+ const handleSearchChange = useCallback(
+ (e: React.ChangeEvent) => {
+ const newParams = new URLSearchParams(searchParams)
+ if (e.target.value) {
+ newParams.set("search", e.target.value)
+ } else {
+ newParams.delete("search")
+ }
+
+ let target = location.pathname
+ const search = newParams.toString()
+ // location
+ // navigate to /search+=?search=${search}
+ if (search) {
+ target += "?" + search
}
- if (newParams.order_by && newParams.only_featured) {
+ navigate(target)
+ },
+ [location.pathname, params, location.search]
+ )
+
+ const handleCategoriesFilterChange = useCallback(
+ (newCategories: string[]) => {
+ // change sorting when filter by categories
+ const newParams: PlacesPageOptions = {
+ ...params,
+ categories: newCategories,
+ }
+ if (
+ (!newParams.order_by ||
+ newParams.order_by !== PlaceListOrderBy.LIKE_SCORE_BEST) &&
+ newCategories.length > 0
+ ) {
newParams.order_by = PlaceListOrderBy.LIKE_SCORE_BEST
+ } else if (!newCategories.length) {
+ newParams.order_by = PlaceListOrderBy.MOST_ACTIVE
}
setAllPlaces([])
- track(SegmentPlace.FilterChange, {
- filters: newParams,
- place: SegmentPlace.PlacesChangeFeatured,
- })
navigate(locations.places(newParams))
},
- [params, track]
+ [params.categories, params.order_by]
)
- const handleChangeOrder = useCallback(
- (_: React.SyntheticEvent, props: { value?: any }) => {
- const value =
- oneOf(props.value, getPlaceListQuerySchema.properties.order_by.enum) ??
- PlaceListOrderBy.LIKE_SCORE_BEST
- const newParams = { ...params, order_by: value, page: 1 }
+ const [ff] = useFeatureFlagContext()
+
+ const toggleViewAllCategory = useCallback(
+ (categoryId?: string) => {
+ const newParams = { ...params }
+ if (params.only_view_category) {
+ newParams.only_view_category = ""
+ } else {
+ newParams.only_view_category = categoryId!
+ }
+
setAllPlaces([])
- track(SegmentPlace.FilterChange, {
- filters: newParams,
- place: SegmentPlace.PlacesChangeOrder,
- })
navigate(locations.places(newParams))
},
- [params, track]
+ [params.only_view_category]
)
- const handleClearFilter = useCallback(() => {
- track(SegmentPlace.FilterClear)
- navigate(
- locations.places({
- order_by: PlaceListOrderBy.LIKE_SCORE_BEST,
- })
- )
- }, [params, track])
+ const handleApplyCategoryListChange = useCallback(
+ (
+ e: React.MouseEvent,
+ props: CategoryFilterProps
+ ) => {
+ const { active, category } = props
- const [ff] = useFeatureFlagContext()
+ const names = categories
+ .filter(({ active }) => active)
+ .map(({ name }) => name)
+
+ if (active) {
+ handleAddCategory(category)
+ names.push(category)
+ }
+
+ if (!active) {
+ handleRemoveCategory(category)
+
+ names.splice(names.indexOf(category), 1)
+ }
+
+ handleCategoriesFilterChange(names)
+ },
+ [
+ categories,
+ handleAddCategory,
+ handleRemoveCategory,
+ handleCategoriesFilterChange,
+ ]
+ )
+
+ const handleCategoryModalChange = useCallback(
+ (
+ e: React.MouseEvent,
+ props: CategoryFilterProps
+ ) => {
+ const { active, category } = props
+ active && handleAddCategory(category)
+ !active && handleRemoveCategory(category)
+ },
+ [handleAddCategory, handleRemoveCategory]
+ )
+
+ const handleApplyModalChange = useCallback(
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
+ (e: React.MouseEvent) => {
+ const names = categories
+ .filter(({ active }) => active)
+ .map(({ name }) => name)
+
+ handleCategoriesFilterChange(names)
+ setIsCategoriesModalVisible(false)
+ },
+ [categories, handleCategoriesFilterChange]
+ )
if (ff.flags[FeatureFlags.Maintenance]) {
return
@@ -271,87 +399,63 @@ export default function IndexPage() {
- {isMobile && (
-
-
- {l("pages.places.filters_title")}
- >
- }
- onClear={handleClearFilter}
- >
-
-
-
-
- handleChangePois(e, { value: !params.only_pois })
- }
- className="places-page__filter-container"
- >
-
- {l("pages.places.pois")}
-
-
-
- handleChangeFeatured(e, { value: !params.only_featured })
- }
- className="places-page__filter-container"
- >
-
- {l("pages.places.featured")}
-
-
-
-
+ {!isMobile && (
+
+
)}
-
+
+ {isMobile && (
+
+
+
+ )}
{!isMobile && (
-
-
-
-
- handleChangePois(e, { value: !params.only_pois })
- }
- className="places-page__filter-container"
- >
-
- {l("pages.places.pois")}
-
-
-
- handleChangeFeatured(e, {
- value: !params.only_featured,
- })
- }
- className="places-page__filter-container"
- >
-
- {l("pages.places.featured")}
-
-
-
-
+
+
+
+
+
+
+
+ {getPlaceListQuerySchema.properties.order_by.enum.map(
+ (orderBy) => {
+ return (
+
+ )
+ }
+ )}
+
+
+
+
+ )}
+
+
+
+ {totalPlaces} {l("social.places.title")}
+
+ {isMobile && (
+
{
return (
-
-
+ }
+ size="tiny"
+ basic
+ onClick={() => setIsCategoriesModalVisible(true)}
+ />
+
+ )}
- )}
- {allPlaces.length > 0 && (
-
handleFavorite(place.id, place)}
- loadingFavorites={handlingFavorite}
- dataPlace={SegmentPlace.Places}
- search={search}
- />
- )}
+ {isFilteringByCategory && !params.only_view_category && (
+
+
}
+ />
+
handleCategoriesFilterChange([])}
+ >
+
+ {" "}
+ {l("pages.places.clear_all")}
+
+
+
+ )}
+ {params.only_view_category && (
+
+
toggleViewAllCategory()} />
+
+ toggleViewAllCategory()}
+ actionIcon={}
+ />
+
+
+ )}
+
+ {allPlaces.length > 0 &&
+ (!isFilteringByCategory || params.only_view_category) && (
+
+ handleFavorite(place.id, place)
+ }
+ loadingFavorites={handlingFavorite}
+ dataPlace={SegmentPlace.Places}
+ search={search}
+ />
+ )}
+ {isFilteringByCategory &&
+ !params.only_view_category &&
+ categories
+ .filter(({ active }) => active)
+ .map((category) => (
+
+ {l(`categories.${category.name}`)}{" "}
+ {category.count}
+ >
+ }
+ places={places.filter((place) =>
+ place.categories.includes(category.name)
+ )}
+ onClick={() => toggleViewAllCategory(category.name)}
+ loadingFavorites={handlingFavorite}
+ search={search}
+ dataPlace={SegmentPlace.Places}
+ onClickFavorite={(_, place) => {
+ handleFavorite(place.id, place)
+ }}
+ loading={loadingPlaces}
+ />
+ ))}
{loading && (
)}
- {!loading && totalPlaces > places.length && (
-
-
-
- )}
+ {!loading &&
+ totalPlaces > places.length &&
+ (!isFilteringByCategory || params.only_view_category) && (
+
+
+
+ )}
{!loading && isSearching && totalPlaces === 0 && (
)}
+ {isMobile && (
+ {
+ setIsCategoriesModalVisible(false)
+ handleSyncCategory(
+ categories.map((category) => ({
+ ...category,
+ active: !!previousActiveCategories.find(
+ ({ name }) => name === category.name
+ ),
+ }))
+ )
+ }}
+ onClearAll={() => {
+ setIsCategoriesModalVisible(false)
+ handleCategoriesFilterChange([])
+ }}
+ onChange={handleCategoryModalChange}
+ onActionClick={handleApplyModalChange}
+ />
+ )}
>
)
diff --git a/src/seed/base_categorized_content.json b/src/seed/base_categorized_content.json
new file mode 100644
index 00000000..6a8f06f9
--- /dev/null
+++ b/src/seed/base_categorized_content.json
@@ -0,0 +1,11349 @@
+{
+ "content": [
+ {
+ "place_id": "80a17033-6d38-4de4-8421-7bea478bb62a",
+ "base_position": "-102,129",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "59cfc6be-d101-47df-aff7-b20067b7b645",
+ "base_position": "-29,55",
+ "category_id": "game"
+ },
+ {
+ "place_id": "59cfc6be-d101-47df-aff7-b20067b7b645",
+ "base_position": "-29,55",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "86f32fce-240b-42d2-8a8e-0d9db79b2fcf",
+ "base_position": "96,-132",
+ "category_id": "game"
+ },
+ {
+ "place_id": "86f32fce-240b-42d2-8a8e-0d9db79b2fcf",
+ "base_position": "96,-132",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b6523d8c-8e54-4729-ac7a-a9491da02c41",
+ "base_position": "-115,133",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "b2f5688c-cb36-44ea-b3ed-c918e128c9b0",
+ "base_position": "145,60",
+ "category_id": "game"
+ },
+ {
+ "place_id": "e69cecea-c8b4-4d8b-b4a2-9f826b60a715",
+ "base_position": "-29,80",
+ "category_id": "game"
+ },
+ {
+ "place_id": "e69cecea-c8b4-4d8b-b4a2-9f826b60a715",
+ "base_position": "-29,80",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "9b251529-2305-4c5a-8b7e-6d9522133168",
+ "base_position": "-33,54",
+ "category_id": "music"
+ },
+ {
+ "place_id": "316a0714-c295-47fc-82f5-4ba7d6b22d13",
+ "base_position": "47,-45",
+ "category_id": "game"
+ },
+ {
+ "place_id": "9257a6a1-1ab1-4a80-8e53-f02fdad2f582",
+ "base_position": "-6,131",
+ "category_id": "game"
+ },
+ {
+ "place_id": "9257a6a1-1ab1-4a80-8e53-f02fdad2f582",
+ "base_position": "-6,131",
+ "category_id": "education"
+ },
+ {
+ "place_id": "e0b15f79-96b3-4be6-b2b1-8369d19aa2bd",
+ "base_position": "-104,138",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "f888b899-c509-44d1-af21-717a4cef654e",
+ "base_position": "144,-7",
+ "category_id": "game"
+ },
+ {
+ "place_id": "8f38ed26-447f-49ba-bcbb-76917e2119b4",
+ "base_position": "-102,-97",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ba98b756-5c71-4cbc-85b3-bc3333cbf848",
+ "base_position": "125,41",
+ "category_id": "game"
+ },
+ {
+ "place_id": "49c341fe-d45a-4573-94e8-0af63acbde0d",
+ "base_position": "-107,-94",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ac6503b3-377e-4127-b647-6f7a0841abeb",
+ "base_position": "-109,-93",
+ "category_id": "social"
+ },
+ {
+ "place_id": "094bc489-2422-410b-802a-e17febe5ecf1",
+ "base_position": "-100,-94",
+ "category_id": "social"
+ },
+ {
+ "place_id": "707d150a-c5c7-4d4b-be4d-77ed20756667",
+ "base_position": "-26,88",
+ "category_id": "game"
+ },
+ {
+ "place_id": "60c29712-2ee8-4617-af20-b6e816cc12ab",
+ "base_position": "-40,-59",
+ "category_id": "social"
+ },
+ {
+ "place_id": "60c29712-2ee8-4617-af20-b6e816cc12ab",
+ "base_position": "-40,-59",
+ "category_id": "game"
+ },
+ {
+ "place_id": "ac3ee74f-2d27-4040-a2fd-703016814fc5",
+ "base_position": "117,-25",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "9fe317e1-17f8-4ef8-b590-590140c444c4",
+ "base_position": "-30,80",
+ "category_id": "game"
+ },
+ {
+ "place_id": "50778cbb-0101-4be8-ab07-ce3840d59ef3",
+ "base_position": "-46,53",
+ "category_id": "game"
+ },
+ {
+ "place_id": "c9cd9477-1749-4408-9b1a-26e1b8646e88",
+ "base_position": "137,-3",
+ "category_id": "social"
+ },
+ {
+ "place_id": "c9cd9477-1749-4408-9b1a-26e1b8646e88",
+ "base_position": "137,-3",
+ "category_id": "music"
+ },
+ {
+ "place_id": "ad70a84d-c186-43f0-8a47-f04aea7742f5",
+ "base_position": "95,98",
+ "category_id": "education"
+ },
+ {
+ "place_id": "410ffad8-9af4-4d20-a8c5-d221d970da44",
+ "base_position": "129,130",
+ "category_id": "education"
+ },
+ {
+ "place_id": "50e8fe14-4b00-4902-a5d2-3c58a3e6ae61",
+ "base_position": "99,-112",
+ "category_id": "game"
+ },
+ {
+ "place_id": "7f67c110-a2a9-48f2-a742-6a6419a3d8f0",
+ "base_position": "-30,76",
+ "category_id": "game"
+ },
+ {
+ "place_id": "69886a84-6268-49b7-9307-e372eebdbb41",
+ "base_position": "111,-102",
+ "category_id": "education"
+ },
+ {
+ "place_id": "bb4991b5-fe47-4e6f-bb76-fd56f08ed0c9",
+ "base_position": "100,-131",
+ "category_id": "education"
+ },
+ {
+ "place_id": "ed4cde99-6563-4eb8-a148-c9f61c704246",
+ "base_position": "-76,77",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "cfbd6033-a530-438e-bf66-8d21fce520c6",
+ "base_position": "110,-102",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "e3611a79-e866-4518-b796-888ae14ab9a0",
+ "base_position": "-31,-27",
+ "category_id": "social"
+ },
+ {
+ "place_id": "e3611a79-e866-4518-b796-888ae14ab9a0",
+ "base_position": "-31,-27",
+ "category_id": "music"
+ },
+ {
+ "place_id": "812a2d07-4e1a-4067-8bd1-11263cd21b90",
+ "base_position": "-39,58",
+ "category_id": "education"
+ },
+ {
+ "place_id": "e6a92c66-81ed-405d-80ac-d2f816bc6179",
+ "base_position": "98,-112",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "6e5b5780-9469-4693-8a23-8a0ae9a9e42d",
+ "base_position": "-111,137",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "ba5f7b67-1e5d-488f-97f8-cdf058ad3ff1",
+ "base_position": "-108,129",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "0e7265d4-c530-4077-97e6-712d4473835f",
+ "base_position": "100,77",
+ "category_id": "music"
+ },
+ {
+ "place_id": "0e7265d4-c530-4077-97e6-712d4473835f",
+ "base_position": "100,77",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d8a26e5d-8206-4a88-9a13-dbc4a440ba5c",
+ "base_position": "83,74",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d8a26e5d-8206-4a88-9a13-dbc4a440ba5c",
+ "base_position": "83,74",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e1b44ad1-5a30-4537-a995-8731456fe3dc",
+ "base_position": "14,100",
+ "category_id": "social"
+ },
+ {
+ "place_id": "e1b44ad1-5a30-4537-a995-8731456fe3dc",
+ "base_position": "14,100",
+ "category_id": "music"
+ },
+ {
+ "place_id": "e1b44ad1-5a30-4537-a995-8731456fe3dc",
+ "base_position": "14,100",
+ "category_id": "education"
+ },
+ {
+ "place_id": "75bfd642-0743-45f3-b3ba-5d3de8b3f6a2",
+ "base_position": "-100,37",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "75bfd642-0743-45f3-b3ba-5d3de8b3f6a2",
+ "base_position": "-100,37",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "75bfd642-0743-45f3-b3ba-5d3de8b3f6a2",
+ "base_position": "-100,37",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "06721806-6a40-4c6d-ae74-27d701ef5086",
+ "base_position": "143,-148",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "06721806-6a40-4c6d-ae74-27d701ef5086",
+ "base_position": "143,-148",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "06721806-6a40-4c6d-ae74-27d701ef5086",
+ "base_position": "143,-148",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "433af23d-bb74-4394-b822-f315e1532751",
+ "base_position": "26,111",
+ "category_id": "social"
+ },
+ {
+ "place_id": "433af23d-bb74-4394-b822-f315e1532751",
+ "base_position": "26,111",
+ "category_id": "education"
+ },
+ {
+ "place_id": "433af23d-bb74-4394-b822-f315e1532751",
+ "base_position": "26,111",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8b7c1147-c885-4556-94fc-3639d223813a",
+ "base_position": "-118,6",
+ "category_id": "game"
+ },
+ {
+ "place_id": "8b7c1147-c885-4556-94fc-3639d223813a",
+ "base_position": "-118,6",
+ "category_id": "music"
+ },
+ {
+ "place_id": "8b7c1147-c885-4556-94fc-3639d223813a",
+ "base_position": "-118,6",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d7221f60-52c4-4410-b34b-8eeb16e73d4d",
+ "base_position": "-69,28",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d7221f60-52c4-4410-b34b-8eeb16e73d4d",
+ "base_position": "-69,28",
+ "category_id": "education"
+ },
+ {
+ "place_id": "0e94eed3-c7a9-420b-9e5b-efb4d3f611b2",
+ "base_position": "-70,-150",
+ "category_id": "education"
+ },
+ {
+ "place_id": "00169a6d-a8f2-4a53-9b23-7624a32c8407",
+ "base_position": "-29,91",
+ "category_id": "game"
+ },
+ {
+ "place_id": "cbf4e5d6-0122-4ed8-8b25-a3291c5b7c88",
+ "base_position": "13,75",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cbf4e5d6-0122-4ed8-8b25-a3291c5b7c88",
+ "base_position": "13,75",
+ "category_id": "education"
+ },
+ {
+ "place_id": "68c0ae7e-a6bd-42c6-9a55-5cb30600c6e6",
+ "base_position": "155,65",
+ "category_id": "game"
+ },
+ {
+ "place_id": "68c0ae7e-a6bd-42c6-9a55-5cb30600c6e6",
+ "base_position": "155,65",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "057b2e26-9ea3-4ced-bbaa-ff321f14ec5e",
+ "base_position": "-68,-150",
+ "category_id": "education"
+ },
+ {
+ "place_id": "fad594d8-a89c-4071-a282-b888a5f81193",
+ "base_position": "-107,-97",
+ "category_id": "social"
+ },
+ {
+ "place_id": "7285bc8a-b116-4470-80a3-ed1f495f4634",
+ "base_position": "38,-3",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "7285bc8a-b116-4470-80a3-ed1f495f4634",
+ "base_position": "38,-3",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "e861dae4-2f56-4781-8475-ba7460062c67",
+ "base_position": "-118,130",
+ "category_id": "social"
+ },
+ {
+ "place_id": "e861dae4-2f56-4781-8475-ba7460062c67",
+ "base_position": "-118,130",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ae8237fe-16f0-40fa-937e-cd224db66484",
+ "base_position": "-35,105",
+ "category_id": "education"
+ },
+ {
+ "place_id": "1d40c91c-63b3-473b-9ed7-d77277dffcca",
+ "base_position": "-28,76",
+ "category_id": "education"
+ },
+ {
+ "place_id": "3b50e33f-c730-407a-a0d4-dcd69d33d680",
+ "base_position": "47,-46",
+ "category_id": "game"
+ },
+ {
+ "place_id": "e0409dad-3f56-41ee-870b-45d66a36926c",
+ "base_position": "49,-46",
+ "category_id": "game"
+ },
+ {
+ "place_id": "6c335122-224b-4afd-8ee0-1bd4deb08954",
+ "base_position": "-12,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "44e7ecd6-640f-4d82-ad60-e24d6f89a892",
+ "base_position": "61,-27",
+ "category_id": "game"
+ },
+ {
+ "place_id": "72e7564e-3239-4044-8e31-16264a9e8455",
+ "base_position": "63,-127",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "7b297a66-b5e2-4044-9d29-47157fae5958",
+ "base_position": "91,-148",
+ "category_id": "game"
+ },
+ {
+ "place_id": "7b297a66-b5e2-4044-9d29-47157fae5958",
+ "base_position": "91,-148",
+ "category_id": "social"
+ },
+ {
+ "place_id": "183c652b-4331-4f0c-8f8f-ed191b35f10b",
+ "base_position": "97,-116",
+ "category_id": "game"
+ },
+ {
+ "place_id": "45ad08d6-4bc7-40fd-8a78-faef87325c84",
+ "base_position": "14,-135",
+ "category_id": "social"
+ },
+ {
+ "place_id": "45ad08d6-4bc7-40fd-8a78-faef87325c84",
+ "base_position": "14,-135",
+ "category_id": "music"
+ },
+ {
+ "place_id": "45ad08d6-4bc7-40fd-8a78-faef87325c84",
+ "base_position": "14,-135",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "cc7eb5a6-2bfe-4763-a4db-b0b6fbbb7464",
+ "base_position": "-80,112",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "cc7eb5a6-2bfe-4763-a4db-b0b6fbbb7464",
+ "base_position": "-80,112",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "9e938130-caba-4d42-a14a-f2b70c70d8ed",
+ "base_position": "119,-12",
+ "category_id": "game"
+ },
+ {
+ "place_id": "9e938130-caba-4d42-a14a-f2b70c70d8ed",
+ "base_position": "119,-12",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "579910f5-5c28-45a0-aadb-5c2288a852d4",
+ "base_position": "-101,-95",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "ae20a1b8-5d62-4ee3-b26e-acdd85cbed41",
+ "base_position": "-77,71",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e874c6aa-aef4-4b1a-86cb-702d5dbc5769",
+ "base_position": "-51,91",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4a147b9a-64ae-4222-8ba6-6b97fcb328cf",
+ "base_position": "-23,101",
+ "category_id": "education"
+ },
+ {
+ "place_id": "8b7122b9-1d93-4582-bfcb-7d1862feb6be",
+ "base_position": "-72,-150",
+ "category_id": "education"
+ },
+ {
+ "place_id": "963d8362-98fd-47eb-af27-a9ab17a15636",
+ "base_position": "-62,1",
+ "category_id": "game"
+ },
+ {
+ "place_id": "963d8362-98fd-47eb-af27-a9ab17a15636",
+ "base_position": "-62,1",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "fccd7bde-197b-4263-a7e6-0e552a8b814c",
+ "base_position": "-75,109",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "fccd7bde-197b-4263-a7e6-0e552a8b814c",
+ "base_position": "-75,109",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d87fc7ba-be3b-4bbf-a84e-a4546538262e",
+ "base_position": "-64,74",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d87fc7ba-be3b-4bbf-a84e-a4546538262e",
+ "base_position": "-64,74",
+ "category_id": "music"
+ },
+ {
+ "place_id": "870f6ba6-4aca-4fc9-a1c8-0d5901617079",
+ "base_position": "-15,80",
+ "category_id": "game"
+ },
+ {
+ "place_id": "870f6ba6-4aca-4fc9-a1c8-0d5901617079",
+ "base_position": "-15,80",
+ "category_id": "social"
+ },
+ {
+ "place_id": "a977a236-01fd-4e00-bcef-3006e1b02f37",
+ "base_position": "-43,102",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "a977a236-01fd-4e00-bcef-3006e1b02f37",
+ "base_position": "-43,102",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a977a236-01fd-4e00-bcef-3006e1b02f37",
+ "base_position": "-43,102",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d42bacec-5665-4e6b-a1b3-8ad9c1930730",
+ "base_position": "24,-28",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ba4a0cf1-a575-45cf-b6b0-978694fbabd9",
+ "base_position": "-49,69",
+ "category_id": "music"
+ },
+ {
+ "place_id": "ba4a0cf1-a575-45cf-b6b0-978694fbabd9",
+ "base_position": "-49,69",
+ "category_id": "social"
+ },
+ {
+ "place_id": "aa658ce8-d658-434a-afc3-1b4e4af65c1e",
+ "base_position": "-150,126",
+ "category_id": "education"
+ },
+ {
+ "place_id": "8c7bd4b9-ec45-4cc4-b6bc-857c15b70ddd",
+ "base_position": "77,-102",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b8506f47-e6c3-43c9-a0f2-96a3483879a8",
+ "base_position": "-22,87",
+ "category_id": "game"
+ },
+ {
+ "place_id": "c13d8657-ea5e-4802-9085-27fec8ea33c6",
+ "base_position": "125,-6",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "b3bdd170-867a-4e93-bda5-52a017734aa6",
+ "base_position": "-99,-6",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "1cd27706-1025-4be6-ad47-66ed79b80974",
+ "base_position": "101,-132",
+ "category_id": "education"
+ },
+ {
+ "place_id": "1cd27706-1025-4be6-ad47-66ed79b80974",
+ "base_position": "101,-132",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1cd27706-1025-4be6-ad47-66ed79b80974",
+ "base_position": "101,-132",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "91a1a6fe-3ea6-4524-8b0c-6f3d85cc5453",
+ "base_position": "-45,106",
+ "category_id": "game"
+ },
+ {
+ "place_id": "a6262cc2-bd2c-4363-8526-cbe6ca6d625e",
+ "base_position": "69,28",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "54f29440-5a4c-4aed-b6db-bc238d0b57e3",
+ "base_position": "-148,131",
+ "category_id": "education"
+ },
+ {
+ "place_id": "18d8404e-1744-4e85-9165-31a2fe4082d8",
+ "base_position": "5,100",
+ "category_id": "art"
+ },
+ {
+ "place_id": "18d8404e-1744-4e85-9165-31a2fe4082d8",
+ "base_position": "5,100",
+ "category_id": "social"
+ },
+ {
+ "place_id": "18d8404e-1744-4e85-9165-31a2fe4082d8",
+ "base_position": "5,100",
+ "category_id": "education"
+ },
+ {
+ "place_id": "b5aba2ec-b179-477d-a12d-ca7cd3b37c39",
+ "base_position": "-113,-38",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b5aba2ec-b179-477d-a12d-ca7cd3b37c39",
+ "base_position": "-113,-38",
+ "category_id": "music"
+ },
+ {
+ "place_id": "3b9ac301-6051-4382-9c10-12f9e66fdde1",
+ "base_position": "-108,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "56b106b9-c311-4f0a-89aa-f741d8d86a14",
+ "base_position": "14,141",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "56b106b9-c311-4f0a-89aa-f741d8d86a14",
+ "base_position": "14,141",
+ "category_id": "art"
+ },
+ {
+ "place_id": "68d07aeb-e344-4d41-a6df-d0c5d4ada0cf",
+ "base_position": "-62,128",
+ "category_id": "social"
+ },
+ {
+ "place_id": "80ca5613-2dd4-4742-bd04-1403eda259cc",
+ "base_position": "-22,83",
+ "category_id": "game"
+ },
+ {
+ "place_id": "be32f0b0-8ca7-4410-962d-294f867f15f1",
+ "base_position": "-148,126",
+ "category_id": "education"
+ },
+ {
+ "place_id": "04919bde-ea00-4719-bd89-b943555f87ac",
+ "base_position": "87,-16",
+ "category_id": "social"
+ },
+ {
+ "place_id": "04919bde-ea00-4719-bd89-b943555f87ac",
+ "base_position": "87,-16",
+ "category_id": "music"
+ },
+ {
+ "place_id": "834717d4-9e4a-4558-867f-9ef4b45be146",
+ "base_position": "-150,131",
+ "category_id": "education"
+ },
+ {
+ "place_id": "238012f8-183f-47ee-b70b-58976920e533",
+ "base_position": "-23,84",
+ "category_id": "game"
+ },
+ {
+ "place_id": "0a4a0233-1f23-4193-a3f6-c16d9d1b41d8",
+ "base_position": "-87,68",
+ "category_id": "art"
+ },
+ {
+ "place_id": "336efed0-c9f4-47bf-ade5-b7a6884c5565",
+ "base_position": "138,1",
+ "category_id": "education"
+ },
+ {
+ "place_id": "c6b7b5ce-ce08-4992-932c-fd2e99346665",
+ "base_position": "-30,88",
+ "category_id": "game"
+ },
+ {
+ "place_id": "726dd492-3472-4fe7-a933-180854ebb559",
+ "base_position": "11,95",
+ "category_id": "social"
+ },
+ {
+ "place_id": "726dd492-3472-4fe7-a933-180854ebb559",
+ "base_position": "11,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "c1000708-3bff-46fe-b724-88ec049ec92e",
+ "base_position": "74,51",
+ "category_id": "game"
+ },
+ {
+ "place_id": "c1000708-3bff-46fe-b724-88ec049ec92e",
+ "base_position": "74,51",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c1000708-3bff-46fe-b724-88ec049ec92e",
+ "base_position": "74,51",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c340e646-ef69-4cc0-ad42-9584ea7e4726",
+ "base_position": "-26,76",
+ "category_id": "social"
+ },
+ {
+ "place_id": "c340e646-ef69-4cc0-ad42-9584ea7e4726",
+ "base_position": "-26,76",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c340e646-ef69-4cc0-ad42-9584ea7e4726",
+ "base_position": "-26,76",
+ "category_id": "education"
+ },
+ {
+ "place_id": "1f9eea3a-840a-4bd5-8fce-6ba55d748ceb",
+ "base_position": "13,-1",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ec920e05-68cc-4602-8ec1-6971c810ecbc",
+ "base_position": "-8,-43",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "0b5c1538-150b-4bf9-9138-bd940d2fe111",
+ "base_position": "26,105",
+ "category_id": "social"
+ },
+ {
+ "place_id": "0b5c1538-150b-4bf9-9138-bd940d2fe111",
+ "base_position": "26,105",
+ "category_id": "education"
+ },
+ {
+ "place_id": "34c0168b-9809-42d2-aa60-bf3a463f85d7",
+ "base_position": "14,53",
+ "category_id": "art"
+ },
+ {
+ "place_id": "34c0168b-9809-42d2-aa60-bf3a463f85d7",
+ "base_position": "14,53",
+ "category_id": "education"
+ },
+ {
+ "place_id": "6e140df9-29b7-4afa-84e8-66f3161ab4f7",
+ "base_position": "7,97",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6e140df9-29b7-4afa-84e8-66f3161ab4f7",
+ "base_position": "7,97",
+ "category_id": "social"
+ },
+ {
+ "place_id": "6e140df9-29b7-4afa-84e8-66f3161ab4f7",
+ "base_position": "7,97",
+ "category_id": "education"
+ },
+ {
+ "place_id": "38f2586e-8804-44d0-bced-37bbd32191fd",
+ "base_position": "61,-123",
+ "category_id": "game"
+ },
+ {
+ "place_id": "38f2586e-8804-44d0-bced-37bbd32191fd",
+ "base_position": "61,-123",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "60c3e342-4046-4b23-bc64-d29ac7e20404",
+ "base_position": "109,-102",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "43de3fbe-9cac-46bc-9df6-704ecbe33858",
+ "base_position": "-27,89",
+ "category_id": "game"
+ },
+ {
+ "place_id": "27d2fa1a-1024-423e-aa23-df874130cc18",
+ "base_position": "-68,-116",
+ "category_id": "art"
+ },
+ {
+ "place_id": "27d2fa1a-1024-423e-aa23-df874130cc18",
+ "base_position": "-68,-116",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "7dcc8c23-25a6-487f-97f7-93643e9dca3d",
+ "base_position": "-71,82",
+ "category_id": "music"
+ },
+ {
+ "place_id": "7dcc8c23-25a6-487f-97f7-93643e9dca3d",
+ "base_position": "-71,82",
+ "category_id": "social"
+ },
+ {
+ "place_id": "05560170-0a6d-40b1-970b-7d3ab0453dea",
+ "base_position": "-18,101",
+ "category_id": "education"
+ },
+ {
+ "place_id": "cd705bf4-4d49-4b06-8a97-aa7d5ee7d89c",
+ "base_position": "-131,79",
+ "category_id": "game"
+ },
+ {
+ "place_id": "cd705bf4-4d49-4b06-8a97-aa7d5ee7d89c",
+ "base_position": "-131,79",
+ "category_id": "social"
+ },
+ {
+ "place_id": "cd705bf4-4d49-4b06-8a97-aa7d5ee7d89c",
+ "base_position": "-131,79",
+ "category_id": "music"
+ },
+ {
+ "place_id": "cbb0070a-5762-478f-9a09-8f609336082f",
+ "base_position": "95,-7",
+ "category_id": "social"
+ },
+ {
+ "place_id": "cbb0070a-5762-478f-9a09-8f609336082f",
+ "base_position": "95,-7",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a211d72d-f1c5-4b7f-9fd5-14dc5df73780",
+ "base_position": "-12,101",
+ "category_id": "education"
+ },
+ {
+ "place_id": "8c6535c3-7783-4751-ba7a-804574f64442",
+ "base_position": "-12,101",
+ "category_id": "education"
+ },
+ {
+ "place_id": "0a587a0f-cb64-4c36-aec9-a0819bdeb634",
+ "base_position": "-79,56",
+ "category_id": "music"
+ },
+ {
+ "place_id": "0a587a0f-cb64-4c36-aec9-a0819bdeb634",
+ "base_position": "-79,56",
+ "category_id": "social"
+ },
+ {
+ "place_id": "85e9b314-9aea-44f9-a6c1-c327aacdc3ee",
+ "base_position": "52,95",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1ad31619-106c-4824-890f-7dcb34b54045",
+ "base_position": "-50,102",
+ "category_id": "art"
+ },
+ {
+ "place_id": "10333474-c461-4912-8a77-db43087faedf",
+ "base_position": "87,129",
+ "category_id": "game"
+ },
+ {
+ "place_id": "10333474-c461-4912-8a77-db43087faedf",
+ "base_position": "87,129",
+ "category_id": "social"
+ },
+ {
+ "place_id": "10333474-c461-4912-8a77-db43087faedf",
+ "base_position": "87,129",
+ "category_id": "music"
+ },
+ {
+ "place_id": "c04e722b-65be-4a6b-8b5f-8ae5408fbe1d",
+ "base_position": "110,-103",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "fe0266b1-abaa-4e81-a5be-9839747bb894",
+ "base_position": "18,111",
+ "category_id": "social"
+ },
+ {
+ "place_id": "fe0266b1-abaa-4e81-a5be-9839747bb894",
+ "base_position": "18,111",
+ "category_id": "education"
+ },
+ {
+ "place_id": "3c9bc0e1-6b14-4d98-90a2-3b196a0e969b",
+ "base_position": "-80,116",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "3c9bc0e1-6b14-4d98-90a2-3b196a0e969b",
+ "base_position": "-80,116",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "19f2ea87-6895-4433-ad3e-fc2f655bbf4e",
+ "base_position": "-115,-67",
+ "category_id": "game"
+ },
+ {
+ "place_id": "19f2ea87-6895-4433-ad3e-fc2f655bbf4e",
+ "base_position": "-115,-67",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "19f2ea87-6895-4433-ad3e-fc2f655bbf4e",
+ "base_position": "-115,-67",
+ "category_id": "social"
+ },
+ {
+ "place_id": "8e5141ba-5243-475f-a2f9-8b3de59afecf",
+ "base_position": "12,53",
+ "category_id": "social"
+ },
+ {
+ "place_id": "8e5141ba-5243-475f-a2f9-8b3de59afecf",
+ "base_position": "12,53",
+ "category_id": "music"
+ },
+ {
+ "place_id": "eca7eed1-0f70-46bf-8148-9d78c4fe51e3",
+ "base_position": "50,99",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "eca7eed1-0f70-46bf-8148-9d78c4fe51e3",
+ "base_position": "50,99",
+ "category_id": "game"
+ },
+ {
+ "place_id": "eca7eed1-0f70-46bf-8148-9d78c4fe51e3",
+ "base_position": "50,99",
+ "category_id": "music"
+ },
+ {
+ "place_id": "ac379fbd-ac2c-4af5-b7b9-6ecfbe558f0d",
+ "base_position": "-103,-19",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "cb77d265-0f0c-443c-a5c0-772caca0126c",
+ "base_position": "-35,-60",
+ "category_id": "game"
+ },
+ {
+ "place_id": "59cad9e7-f38e-4501-a837-67ef6b6d6836",
+ "base_position": "-29,86",
+ "category_id": "game"
+ },
+ {
+ "place_id": "60769433-dfd6-494e-b6ae-202b7d7579f2",
+ "base_position": "12,99",
+ "category_id": "social"
+ },
+ {
+ "place_id": "60769433-dfd6-494e-b6ae-202b7d7579f2",
+ "base_position": "12,99",
+ "category_id": "education"
+ },
+ {
+ "place_id": "99039c3e-8bbf-41fc-8e67-43f0d7683a05",
+ "base_position": "-13,1",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "4516a546-55b5-45c4-9fb8-ce4a60c8d88e",
+ "base_position": "-74,-150",
+ "category_id": "education"
+ },
+ {
+ "place_id": "b4deb331-8aed-4aa4-a0f7-df66b67db764",
+ "base_position": "-123,143",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "78870c7a-f75a-4e09-8506-8f2b62638fa4",
+ "base_position": "-30,84",
+ "category_id": "game"
+ },
+ {
+ "place_id": "5301ddb3-6dc7-473c-9347-28640cb135a6",
+ "base_position": "-22,91",
+ "category_id": "game"
+ },
+ {
+ "place_id": "eda7a41a-02aa-4471-aa32-e6f7a10181d6",
+ "base_position": "25,111",
+ "category_id": "education"
+ },
+ {
+ "place_id": "eda7a41a-02aa-4471-aa32-e6f7a10181d6",
+ "base_position": "25,111",
+ "category_id": "social"
+ },
+ {
+ "place_id": "5a165db2-1201-40d4-94ba-2ae58f1857c0",
+ "base_position": "-16,-112",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ef071ada-a95b-4948-905a-da212668da83",
+ "base_position": "2,-18",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3e35a588-20fa-4525-b4a5-716f5869ac99",
+ "base_position": "-30,92",
+ "category_id": "game"
+ },
+ {
+ "place_id": "7af23f37-9988-4dcb-82e6-49d9e6c8f7e7",
+ "base_position": "-8,96",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7af23f37-9988-4dcb-82e6-49d9e6c8f7e7",
+ "base_position": "-8,96",
+ "category_id": "education"
+ },
+ {
+ "place_id": "79cf8455-2545-4314-8f32-c189ca34478c",
+ "base_position": "-55,1",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b493d80f-cc91-4661-8e47-029125a03d09",
+ "base_position": "61,-129",
+ "category_id": "art"
+ },
+ {
+ "place_id": "11bd50df-6b0c-4dbb-ad48-3687d36c9975",
+ "base_position": "-80,111",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "11bd50df-6b0c-4dbb-ad48-3687d36c9975",
+ "base_position": "-80,111",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "6f0332d0-a3db-4d81-8caf-b188e4a1f814",
+ "base_position": "52,22",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6f0332d0-a3db-4d81-8caf-b188e4a1f814",
+ "base_position": "52,22",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "bd42b6b5-d0f5-4f07-b220-038ebf0a37d2",
+ "base_position": "19,105",
+ "category_id": "social"
+ },
+ {
+ "place_id": "bd42b6b5-d0f5-4f07-b220-038ebf0a37d2",
+ "base_position": "19,105",
+ "category_id": "education"
+ },
+ {
+ "place_id": "3cfd0998-0dd7-4512-847d-99c3d061535a",
+ "base_position": "-39,-63",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e981741e-3297-45a2-9ea5-d2264da12c72",
+ "base_position": "-42,-58",
+ "category_id": "art"
+ },
+ {
+ "place_id": "600eb04f-6075-4c24-90d3-4452ecb85262",
+ "base_position": "55,94",
+ "category_id": "art"
+ },
+ {
+ "place_id": "600eb04f-6075-4c24-90d3-4452ecb85262",
+ "base_position": "55,94",
+ "category_id": "education"
+ },
+ {
+ "place_id": "7a02bfbf-98c6-4d7c-9f1c-13e5bc540cd2",
+ "base_position": "-23,83",
+ "category_id": "game"
+ },
+ {
+ "place_id": "6b01ffba-e59e-4b07-8150-b660a40aef9b",
+ "base_position": "56,26",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a430989f-817b-4e74-8282-7d547c1e209f",
+ "base_position": "54,103",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a430989f-817b-4e74-8282-7d547c1e209f",
+ "base_position": "54,103",
+ "category_id": "education"
+ },
+ {
+ "place_id": "a430989f-817b-4e74-8282-7d547c1e209f",
+ "base_position": "54,103",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ef72645a-c630-4579-85db-b750ed4796c1",
+ "base_position": "58,94",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ef72645a-c630-4579-85db-b750ed4796c1",
+ "base_position": "58,94",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "35b18e4d-d470-4088-a325-5a9c1dba83e2",
+ "base_position": "-68,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "35b18e4d-d470-4088-a325-5a9c1dba83e2",
+ "base_position": "-68,-125",
+ "category_id": "social"
+ },
+ {
+ "place_id": "35b18e4d-d470-4088-a325-5a9c1dba83e2",
+ "base_position": "-68,-125",
+ "category_id": "music"
+ },
+ {
+ "place_id": "3f95b1b0-cbb9-4538-aab6-00ec35df11dc",
+ "base_position": "-22,92",
+ "category_id": "game"
+ },
+ {
+ "place_id": "bea033a3-f176-4c1d-a70d-bff74dcbd8dc",
+ "base_position": "128,131",
+ "category_id": "game"
+ },
+ {
+ "place_id": "bea033a3-f176-4c1d-a70d-bff74dcbd8dc",
+ "base_position": "128,131",
+ "category_id": "art"
+ },
+ {
+ "place_id": "bea033a3-f176-4c1d-a70d-bff74dcbd8dc",
+ "base_position": "128,131",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b5b6dfec-a5fb-42dd-8438-37309ebbdc55",
+ "base_position": "-26,-47",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "587697ac-233f-4845-8e6f-fde942e9c0ec",
+ "base_position": "68,29",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "a8252125-66ea-4b7f-a669-cb55d2249698",
+ "base_position": "-78,108",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a8252125-66ea-4b7f-a669-cb55d2249698",
+ "base_position": "-78,108",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "f9094a8c-5e36-408d-afe9-5b3fad041997",
+ "base_position": "-16,82",
+ "category_id": "game"
+ },
+ {
+ "place_id": "065120d9-2265-4311-ad1f-f9ffc8307487",
+ "base_position": "67,29",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "83165a39-da7c-46c1-98a2-98385c4d5f1c",
+ "base_position": "74,47",
+ "category_id": "game"
+ },
+ {
+ "place_id": "83165a39-da7c-46c1-98a2-98385c4d5f1c",
+ "base_position": "74,47",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "83165a39-da7c-46c1-98a2-98385c4d5f1c",
+ "base_position": "74,47",
+ "category_id": "art"
+ },
+ {
+ "place_id": "983e51df-6587-4166-af7c-1ac792bc270b",
+ "base_position": "-26,-45",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f099ee9e-4ba6-40e8-b8ae-e6446d8eb86b",
+ "base_position": "3,135",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "180e6282-cb9f-4f84-8c3e-ebe19573e882",
+ "base_position": "-31,5",
+ "category_id": "art"
+ },
+ {
+ "place_id": "165b122a-2f29-4172-992c-51eec94163c0",
+ "base_position": "129,-4",
+ "category_id": "game"
+ },
+ {
+ "place_id": "165b122a-2f29-4172-992c-51eec94163c0",
+ "base_position": "129,-4",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6fd0ef3e-1534-45fa-8467-01ae9f7ae408",
+ "base_position": "-69,-122",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4ac41095-efd6-4949-9c4d-6e0ad79b1f47",
+ "base_position": "-19,143",
+ "category_id": "education"
+ },
+ {
+ "place_id": "a2e474f5-1ef6-4a4b-b08f-01836345b2da",
+ "base_position": "-15,77",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "cef55b5b-ee59-416c-8697-f92f15e27ba9",
+ "base_position": "123,130",
+ "category_id": "game"
+ },
+ {
+ "place_id": "cef55b5b-ee59-416c-8697-f92f15e27ba9",
+ "base_position": "123,130",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cef55b5b-ee59-416c-8697-f92f15e27ba9",
+ "base_position": "123,130",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e3ab3eda-3e2a-4ba1-bf4b-34e0f8e7bf0f",
+ "base_position": "-28,90",
+ "category_id": "game"
+ },
+ {
+ "place_id": "123ce593-920b-4a81-8895-9b19d74c1972",
+ "base_position": "13,11",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "279d6c5b-2cd0-4b00-bec2-ae615543a1f8",
+ "base_position": "25,74",
+ "category_id": "art"
+ },
+ {
+ "place_id": "279d6c5b-2cd0-4b00-bec2-ae615543a1f8",
+ "base_position": "25,74",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "279d6c5b-2cd0-4b00-bec2-ae615543a1f8",
+ "base_position": "25,74",
+ "category_id": "education"
+ },
+ {
+ "place_id": "dca3f3b2-1f7d-4a7d-b909-b8c9470d1cf9",
+ "base_position": "94,-31",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7bae560f-4cd3-4615-9725-9b6747708505",
+ "base_position": "57,29",
+ "category_id": "art"
+ },
+ {
+ "place_id": "37d8877c-5e68-4ff3-a3d5-e9c1543ffb9c",
+ "base_position": "12,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "37d8877c-5e68-4ff3-a3d5-e9c1543ffb9c",
+ "base_position": "12,95",
+ "category_id": "social"
+ },
+ {
+ "place_id": "37d8877c-5e68-4ff3-a3d5-e9c1543ffb9c",
+ "base_position": "12,95",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ab0dea65-cca4-4c51-9b85-d4bfb4051f52",
+ "base_position": "-13,106",
+ "category_id": "education"
+ },
+ {
+ "place_id": "ab0dea65-cca4-4c51-9b85-d4bfb4051f52",
+ "base_position": "-13,106",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "e0740835-fbda-4650-a8af-7369d062f2dc",
+ "base_position": "-10,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "68d7a064-5305-45e6-941c-a18de992c0ca",
+ "base_position": "-20,-130",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "68d7a064-5305-45e6-941c-a18de992c0ca",
+ "base_position": "-20,-130",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "e0cf5ebf-462e-4487-a637-ba32334870ce",
+ "base_position": "-71,-121",
+ "category_id": "game"
+ },
+ {
+ "place_id": "7a26f9a2-4519-4824-be32-b25c4d92142c",
+ "base_position": "-132,81",
+ "category_id": "social"
+ },
+ {
+ "place_id": "7a26f9a2-4519-4824-be32-b25c4d92142c",
+ "base_position": "-132,81",
+ "category_id": "music"
+ },
+ {
+ "place_id": "6658c7d0-7929-478f-9f15-6c8b77d1751b",
+ "base_position": "-31,-29",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "aeab9bd8-97e0-44f5-ad09-3c8b7bbcf8ef",
+ "base_position": "-87,56",
+ "category_id": "art"
+ },
+ {
+ "place_id": "aeab9bd8-97e0-44f5-ad09-3c8b7bbcf8ef",
+ "base_position": "-87,56",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "bb03b26d-a591-4f1a-a7e8-6bc2359aae36",
+ "base_position": "38,103",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b24a3ccf-9a9d-4e29-b176-add5c444c7eb",
+ "base_position": "125,123",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b24a3ccf-9a9d-4e29-b176-add5c444c7eb",
+ "base_position": "125,123",
+ "category_id": "education"
+ },
+ {
+ "place_id": "ac915fee-e09e-4676-8359-4effa12b5180",
+ "base_position": "-29,90",
+ "category_id": "game"
+ },
+ {
+ "place_id": "178a1d5b-172b-44c6-9f23-f005d806ba42",
+ "base_position": "143,-149",
+ "category_id": "social"
+ },
+ {
+ "place_id": "2b52c5e6-26dc-4334-8bef-b696b91aa621",
+ "base_position": "-99,86",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "d3708d04-150a-4450-a96e-7b539383a2a5",
+ "base_position": "-85,86",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "2e2157f6-d874-421c-9416-d016529d0399",
+ "base_position": "-83,113",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2e2157f6-d874-421c-9416-d016529d0399",
+ "base_position": "-83,113",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "d9bdead1-b422-48ea-9266-f465c7362569",
+ "base_position": "159,124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "d9bdead1-b422-48ea-9266-f465c7362569",
+ "base_position": "159,124",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "a1d69c9a-8721-4340-afb2-409b9ecea8de",
+ "base_position": "28,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a1d69c9a-8721-4340-afb2-409b9ecea8de",
+ "base_position": "28,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6be33cd5-9315-439f-b7a0-8b8e0190b1d1",
+ "base_position": "-101,40",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "6be33cd5-9315-439f-b7a0-8b8e0190b1d1",
+ "base_position": "-101,40",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6be33cd5-9315-439f-b7a0-8b8e0190b1d1",
+ "base_position": "-101,40",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "369f7926-506c-4612-8f1c-00d686cad723",
+ "base_position": "-82,108",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "369f7926-506c-4612-8f1c-00d686cad723",
+ "base_position": "-82,108",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "becf8862-2799-41aa-9d8f-bea02accd242",
+ "base_position": "5,-13",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "e47d13de-5079-498e-978f-7424fda80511",
+ "base_position": "-80,108",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "e47d13de-5079-498e-978f-7424fda80511",
+ "base_position": "-80,108",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "a108d6f6-d12b-4a60-87e7-afc7ff9390b3",
+ "base_position": "-97,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "372696d0-e7ea-4b5d-ab7e-b50661aacabc",
+ "base_position": "100,-138",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d6451e56-7ec9-4efc-8380-04a8fdba1573",
+ "base_position": "-120,-43",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b9217454-deb8-4714-b6b1-d33270a2f219",
+ "base_position": "-107,-15",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b9217454-deb8-4714-b6b1-d33270a2f219",
+ "base_position": "-107,-15",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b9217454-deb8-4714-b6b1-d33270a2f219",
+ "base_position": "-107,-15",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "4d8b1e09-2f3a-4f3a-be21-5d5e42c8ffe0",
+ "base_position": "-68,-120",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4407eeda-2779-4bf8-8ceb-ce2560ac8a2b",
+ "base_position": "13,-13",
+ "category_id": "social"
+ },
+ {
+ "place_id": "4407eeda-2779-4bf8-8ceb-ce2560ac8a2b",
+ "base_position": "13,-13",
+ "category_id": "music"
+ },
+ {
+ "place_id": "6b027b8d-df44-4af6-9cfa-1b0e0544e567",
+ "base_position": "-79,110",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "6b027b8d-df44-4af6-9cfa-1b0e0544e567",
+ "base_position": "-79,110",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "1783660b-fca9-4d7e-a6e7-0f5dc96e88f3",
+ "base_position": "-8,100",
+ "category_id": "education"
+ },
+ {
+ "place_id": "1a286c06-e99e-4c6f-920b-e97bac307298",
+ "base_position": "109,-103",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "c6e02ab3-28fc-48e8-8d4e-30a350b97b74",
+ "base_position": "-79,108",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "c6e02ab3-28fc-48e8-8d4e-30a350b97b74",
+ "base_position": "-79,108",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "64f63087-885f-47a5-9af2-2ce78c1c04ce",
+ "base_position": "-17,-133",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f832401d-51a6-4f69-a334-e09d2a1e40c3",
+ "base_position": "-80,110",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f832401d-51a6-4f69-a334-e09d2a1e40c3",
+ "base_position": "-80,110",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "987c2be8-ede6-465b-b4db-0908a788a71b",
+ "base_position": "-71,-117",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c4c76df8-de0f-4b10-b1b7-71614b6b518c",
+ "base_position": "-100,36",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "c4c76df8-de0f-4b10-b1b7-71614b6b518c",
+ "base_position": "-100,36",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c4c76df8-de0f-4b10-b1b7-71614b6b518c",
+ "base_position": "-100,36",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "4335bf61-8513-46d7-88dc-e91a2025d25e",
+ "base_position": "-77,108",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "4335bf61-8513-46d7-88dc-e91a2025d25e",
+ "base_position": "-77,108",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "bb829cda-f469-4131-a0d8-d2f0dbcdb20b",
+ "base_position": "-16,81",
+ "category_id": "game"
+ },
+ {
+ "place_id": "c9a7c128-5d3d-45b4-81b7-05056cafffce",
+ "base_position": "-13,105",
+ "category_id": "education"
+ },
+ {
+ "place_id": "c9a7c128-5d3d-45b4-81b7-05056cafffce",
+ "base_position": "-13,105",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "0342ef72-93da-49a0-9811-d1e68d713903",
+ "base_position": "97,-94",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "f43f7c6a-75a8-4299-b9d6-7d3a125eb16e",
+ "base_position": "12,-16",
+ "category_id": "social"
+ },
+ {
+ "place_id": "f43f7c6a-75a8-4299-b9d6-7d3a125eb16e",
+ "base_position": "12,-16",
+ "category_id": "music"
+ },
+ {
+ "place_id": "35677fbb-9062-477f-b930-ad31ac82aeb4",
+ "base_position": "-16,-113",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "96a7e9fe-bd43-40cd-8db6-3cc5baa3e4e5",
+ "base_position": "82,-32",
+ "category_id": "music"
+ },
+ {
+ "place_id": "96a7e9fe-bd43-40cd-8db6-3cc5baa3e4e5",
+ "base_position": "82,-32",
+ "category_id": "art"
+ },
+ {
+ "place_id": "96a7e9fe-bd43-40cd-8db6-3cc5baa3e4e5",
+ "base_position": "82,-32",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "b88e141e-3af8-4b7e-aea4-0dc0e9155e69",
+ "base_position": "-2,13",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b88e141e-3af8-4b7e-aea4-0dc0e9155e69",
+ "base_position": "-2,13",
+ "category_id": "music"
+ },
+ {
+ "place_id": "d7aaa3e8-90f0-404d-87ff-d54665473603",
+ "base_position": "26,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d7aaa3e8-90f0-404d-87ff-d54665473603",
+ "base_position": "26,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "2dbc46eb-2145-4d0f-b06e-8aac87572add",
+ "base_position": "2,-40",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b0f57565-6ff5-4513-97da-a72abb0b1827",
+ "base_position": "6,135",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b0f57565-6ff5-4513-97da-a72abb0b1827",
+ "base_position": "6,135",
+ "category_id": "education"
+ },
+ {
+ "place_id": "a77981d1-766c-4bfc-a370-b631a9cf7fc5",
+ "base_position": "16,-16",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a77981d1-766c-4bfc-a370-b631a9cf7fc5",
+ "base_position": "16,-16",
+ "category_id": "social"
+ },
+ {
+ "place_id": "3c5c3ce1-6f95-498a-af5f-e1da76b5b32a",
+ "base_position": "-49,81",
+ "category_id": "social"
+ },
+ {
+ "place_id": "3c5c3ce1-6f95-498a-af5f-e1da76b5b32a",
+ "base_position": "-49,81",
+ "category_id": "music"
+ },
+ {
+ "place_id": "379bda60-7b14-4d07-a367-49aad208f47f",
+ "base_position": "6,-12",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "7204740d-a17d-4e86-9293-a024950a8852",
+ "base_position": "71,-128",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "973d0cc8-d781-426c-b6ab-82638a0160cf",
+ "base_position": "119,51",
+ "category_id": "game"
+ },
+ {
+ "place_id": "be108e63-13ec-4b0c-8dfa-8e5190a9f901",
+ "base_position": "-37,-59",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7c66fbd2-864e-4f81-bd74-d5a97789d6bc",
+ "base_position": "2,95",
+ "category_id": "social"
+ },
+ {
+ "place_id": "7c66fbd2-864e-4f81-bd74-d5a97789d6bc",
+ "base_position": "2,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "7c66fbd2-864e-4f81-bd74-d5a97789d6bc",
+ "base_position": "2,95",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "1273c8e7-b63b-420d-8f94-68eeb7c9d47b",
+ "base_position": "40,9",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cfa228b2-eef7-4f78-a9d1-9bdc3941664b",
+ "base_position": "-49,-114",
+ "category_id": "game"
+ },
+ {
+ "place_id": "cfa228b2-eef7-4f78-a9d1-9bdc3941664b",
+ "base_position": "-49,-114",
+ "category_id": "social"
+ },
+ {
+ "place_id": "cfa228b2-eef7-4f78-a9d1-9bdc3941664b",
+ "base_position": "-49,-114",
+ "category_id": "music"
+ },
+ {
+ "place_id": "35608607-f766-4ec3-90df-80997623eeb3",
+ "base_position": "-22,77",
+ "category_id": "game"
+ },
+ {
+ "place_id": "1353a479-6d71-421f-b25a-26bab275225a",
+ "base_position": "58,89",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1b4947f4-df1e-4dc0-90f5-e54a6d176eca",
+ "base_position": "-43,-52",
+ "category_id": "game"
+ },
+ {
+ "place_id": "1b4947f4-df1e-4dc0-90f5-e54a6d176eca",
+ "base_position": "-43,-52",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "8e0ca758-7e44-4753-9050-e12ba051f0b7",
+ "base_position": "-69,36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "aed9dd1e-b285-4191-8df9-b1cb593d143d",
+ "base_position": "-13,-5",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "bf32cf43-7df3-48e3-aed2-10a86295276d",
+ "base_position": "-7,100",
+ "category_id": "education"
+ },
+ {
+ "place_id": "c4173b42-cd60-4a80-95e9-24ec72c4364a",
+ "base_position": "59,-22",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "6ad395fa-8d66-4cb1-b2f5-b0cbafade05f",
+ "base_position": "40,36",
+ "category_id": "music"
+ },
+ {
+ "place_id": "599cee94-9b8c-424c-acb0-89c183c4bf17",
+ "base_position": "-118,83",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "cc71e732-6ef7-4bce-82d3-5aff9c8da577",
+ "base_position": "-36,71",
+ "category_id": "social"
+ },
+ {
+ "place_id": "cc71e732-6ef7-4bce-82d3-5aff9c8da577",
+ "base_position": "-36,71",
+ "category_id": "music"
+ },
+ {
+ "place_id": "f1a5835c-694b-49eb-ab35-e061c30f392c",
+ "base_position": "-82,110",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f1a5835c-694b-49eb-ab35-e061c30f392c",
+ "base_position": "-82,110",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e96b13b7-1417-4a23-90c5-f10390c4dde8",
+ "base_position": "-67,-116",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e96b13b7-1417-4a23-90c5-f10390c4dde8",
+ "base_position": "-67,-116",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "45d78f8a-030d-4748-b290-d1b1f3bb0908",
+ "base_position": "128,-115",
+ "category_id": "social"
+ },
+ {
+ "place_id": "45d78f8a-030d-4748-b290-d1b1f3bb0908",
+ "base_position": "128,-115",
+ "category_id": "music"
+ },
+ {
+ "place_id": "d8937e2c-9ca3-4eda-903c-22c38cf2dff5",
+ "base_position": "16,-13",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d8937e2c-9ca3-4eda-903c-22c38cf2dff5",
+ "base_position": "16,-13",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a5f96c50-95ea-4c3e-a7be-88a2de75dc31",
+ "base_position": "-16,80",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4c8fcfc5-4a49-40f1-be71-275515bb076d",
+ "base_position": "-81,108",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "4c8fcfc5-4a49-40f1-be71-275515bb076d",
+ "base_position": "-81,108",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c690818d-c06b-483e-8e2d-354030667131",
+ "base_position": "-3,65",
+ "category_id": "art"
+ },
+ {
+ "place_id": "692af894-4058-4c08-9342-c9d3d0130107",
+ "base_position": "29,100",
+ "category_id": "social"
+ },
+ {
+ "place_id": "692af894-4058-4c08-9342-c9d3d0130107",
+ "base_position": "29,100",
+ "category_id": "music"
+ },
+ {
+ "place_id": "692af894-4058-4c08-9342-c9d3d0130107",
+ "base_position": "29,100",
+ "category_id": "education"
+ },
+ {
+ "place_id": "b0e46ccb-b170-4d06-a1d4-9c17711d5169",
+ "base_position": "74,40",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b0e46ccb-b170-4d06-a1d4-9c17711d5169",
+ "base_position": "74,40",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b0e46ccb-b170-4d06-a1d4-9c17711d5169",
+ "base_position": "74,40",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2908e1ee-c07d-4d21-9070-9ff5ef11280d",
+ "base_position": "5,19",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "582edc46-55bd-4b26-a8d8-5f4d996731ba",
+ "base_position": "35,10",
+ "category_id": "art"
+ },
+ {
+ "place_id": "582edc46-55bd-4b26-a8d8-5f4d996731ba",
+ "base_position": "35,10",
+ "category_id": "education"
+ },
+ {
+ "place_id": "c292844a-5a40-4c71-a43b-61403cb93969",
+ "base_position": "118,-121",
+ "category_id": "social"
+ },
+ {
+ "place_id": "cd2eb748-90ec-4cd9-ba20-348bf594eb87",
+ "base_position": "19,-1",
+ "category_id": "art"
+ },
+ {
+ "place_id": "822e3d70-b803-4980-a509-86dec23bbd4e",
+ "base_position": "-81,110",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "822e3d70-b803-4980-a509-86dec23bbd4e",
+ "base_position": "-81,110",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6aabd058-092c-43cc-ae59-6fb06ae3642d",
+ "base_position": "-97,-92",
+ "category_id": "game"
+ },
+ {
+ "place_id": "02b3afee-78a3-4c18-aa64-0eb60677115f",
+ "base_position": "121,-24",
+ "category_id": "game"
+ },
+ {
+ "place_id": "db215dcd-6996-4087-96fa-ad81f29a22cb",
+ "base_position": "-108,-41",
+ "category_id": "game"
+ },
+ {
+ "place_id": "db215dcd-6996-4087-96fa-ad81f29a22cb",
+ "base_position": "-108,-41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "97d9dffc-4936-453f-ac91-60317e61fdcb",
+ "base_position": "-113,-56",
+ "category_id": "game"
+ },
+ {
+ "place_id": "97d9dffc-4936-453f-ac91-60317e61fdcb",
+ "base_position": "-113,-56",
+ "category_id": "social"
+ },
+ {
+ "place_id": "97d9dffc-4936-453f-ac91-60317e61fdcb",
+ "base_position": "-113,-56",
+ "category_id": "music"
+ },
+ {
+ "place_id": "f03706aa-9f4c-4555-a532-3020919dd886",
+ "base_position": "7,-13",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "7708236c-e4fe-4038-9c40-44a6e18428a2",
+ "base_position": "-49,-106",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "8a487bf7-c4f2-42fb-8efc-277f2fe36faa",
+ "base_position": "37,-2",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "beff6093-d96f-441b-8bc4-763ecd9100b2",
+ "base_position": "148,-34",
+ "category_id": "game"
+ },
+ {
+ "place_id": "beff6093-d96f-441b-8bc4-763ecd9100b2",
+ "base_position": "148,-34",
+ "category_id": "art"
+ },
+ {
+ "place_id": "beff6093-d96f-441b-8bc4-763ecd9100b2",
+ "base_position": "148,-34",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "8b72e92f-0979-41df-a390-1f43d0d17902",
+ "base_position": "-45,43",
+ "category_id": "game"
+ },
+ {
+ "place_id": "8b72e92f-0979-41df-a390-1f43d0d17902",
+ "base_position": "-45,43",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "456a193f-5130-4458-aa52-b37d8642c9a4",
+ "base_position": "-35,110",
+ "category_id": "education"
+ },
+ {
+ "place_id": "ace783ac-d80a-4afd-93e6-e0cc33151bb3",
+ "base_position": "63,16",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "a88fcf37-4478-4bda-bb36-c71707edd07e",
+ "base_position": "89,-84",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "fcf678be-186a-43a0-afed-fa08b1d2f0d6",
+ "base_position": "131,-4",
+ "category_id": "game"
+ },
+ {
+ "place_id": "fcf678be-186a-43a0-afed-fa08b1d2f0d6",
+ "base_position": "131,-4",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "24443c62-fabd-41dc-a081-80f605566609",
+ "base_position": "70,28",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "abd81cb5-7258-43d0-a639-3e900e0975f7",
+ "base_position": "58,-24",
+ "category_id": "game"
+ },
+ {
+ "place_id": "516f1d0b-5c94-4bc6-8524-ca44795e834c",
+ "base_position": "-98,-140",
+ "category_id": "game"
+ },
+ {
+ "place_id": "516f1d0b-5c94-4bc6-8524-ca44795e834c",
+ "base_position": "-98,-140",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5f654640-1957-4934-a071-0040c2c5179a",
+ "base_position": "37,-1",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b23ab2cc-67ab-4b2b-8e07-96df861dcf6a",
+ "base_position": "8,-12",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "5aeaa471-b6a5-4561-9725-973e42c3166f",
+ "base_position": "-76,79",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5aeaa471-b6a5-4561-9725-973e42c3166f",
+ "base_position": "-76,79",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "677f2f00-8a1c-456c-9ee2-7d60027b3c36",
+ "base_position": "19,-10",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5ff3e215-8692-4df8-a63d-170840e722d3",
+ "base_position": "46,33",
+ "category_id": "game"
+ },
+ {
+ "place_id": "cd4cf21d-fbca-4e15-9393-80ee90cf89f2",
+ "base_position": "-37,26",
+ "category_id": "game"
+ },
+ {
+ "place_id": "cd4cf21d-fbca-4e15-9393-80ee90cf89f2",
+ "base_position": "-37,26",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d707dad4-0fd1-4bd8-9a36-9dabe0433f3a",
+ "base_position": "-69,-125",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e1bfc3c1-c3ea-43e5-9799-121117871490",
+ "base_position": "63,-27",
+ "category_id": "social"
+ },
+ {
+ "place_id": "7af11382-1cb2-4381-bf67-3e114d98ebba",
+ "base_position": "60,-126",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9fa9d371-17ca-4a37-bd13-9ef8d1c8a9a9",
+ "base_position": "-130,90",
+ "category_id": "art"
+ },
+ {
+ "place_id": "eaf0b949-2ee5-489f-9f0d-c86ac52c80ad",
+ "base_position": "-67,-110",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "07f5fd80-2799-4e12-b6c5-af36adb48856",
+ "base_position": "-65,-123",
+ "category_id": "art"
+ },
+ {
+ "place_id": "07f5fd80-2799-4e12-b6c5-af36adb48856",
+ "base_position": "-65,-123",
+ "category_id": "education"
+ },
+ {
+ "place_id": "dfd20956-9605-462a-86b4-7e5e6172927c",
+ "base_position": "-83,116",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "dfd20956-9605-462a-86b4-7e5e6172927c",
+ "base_position": "-83,116",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "0c7fcf73-b088-4241-a403-489bdaece9b9",
+ "base_position": "144,-34",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0c7fcf73-b088-4241-a403-489bdaece9b9",
+ "base_position": "144,-34",
+ "category_id": "education"
+ },
+ {
+ "place_id": "0cf657a3-b64a-4d5d-87f6-ca96155628a4",
+ "base_position": "-67,79",
+ "category_id": "music"
+ },
+ {
+ "place_id": "957a0e18-9bdc-407f-9986-e800667f0c54",
+ "base_position": "59,-24",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0ca8d0d7-bab9-493b-b2d7-99fc9dd8e3ef",
+ "base_position": "-13,79",
+ "category_id": "game"
+ },
+ {
+ "place_id": "dbbc21e9-a12f-4275-9fc1-771ef45df07d",
+ "base_position": "-33,48",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "1a0e2fbb-c049-4300-97a5-cc7e2b324ff0",
+ "base_position": "-96,-19",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "1a0e2fbb-c049-4300-97a5-cc7e2b324ff0",
+ "base_position": "-96,-19",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "9d754ee8-d5da-43cc-ae9a-3a52dc740bcb",
+ "base_position": "-71,-125",
+ "category_id": "social"
+ },
+ {
+ "place_id": "9d754ee8-d5da-43cc-ae9a-3a52dc740bcb",
+ "base_position": "-71,-125",
+ "category_id": "music"
+ },
+ {
+ "place_id": "b40d3bf5-88b7-4bb5-a4e4-44cba64376d7",
+ "base_position": "-146,126",
+ "category_id": "education"
+ },
+ {
+ "place_id": "2121d5d2-72b4-4cae-b809-a2e502b38803",
+ "base_position": "8,105",
+ "category_id": "education"
+ },
+ {
+ "place_id": "2121d5d2-72b4-4cae-b809-a2e502b38803",
+ "base_position": "8,105",
+ "category_id": "social"
+ },
+ {
+ "place_id": "03b91eed-fcff-4b45-89ed-694203a9776b",
+ "base_position": "-126,124",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "52f7eb30-ffbf-4ce3-be61-c2832cd5d64f",
+ "base_position": "-132,74",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "1ba5468c-e9cd-4063-803c-8d8c2e91c54d",
+ "base_position": "-135,77",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b2afbb72-6be9-43b8-82c3-c89fa286c3f0",
+ "base_position": "-78,110",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "b2afbb72-6be9-43b8-82c3-c89fa286c3f0",
+ "base_position": "-78,110",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "11eb3611-ec8b-49a7-b932-9a7f17d51afe",
+ "base_position": "-71,84",
+ "category_id": "music"
+ },
+ {
+ "place_id": "123d8381-1139-449a-8724-6243c4b4eeba",
+ "base_position": "91,-32",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ff3e9195-47fe-4d1c-ad9f-18b30ae4cd92",
+ "base_position": "10,111",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ff3e9195-47fe-4d1c-ad9f-18b30ae4cd92",
+ "base_position": "10,111",
+ "category_id": "education"
+ },
+ {
+ "place_id": "4b4b765c-4a5e-4bbc-80a7-12ecac5328b2",
+ "base_position": "60,-148",
+ "category_id": "game"
+ },
+ {
+ "place_id": "d285543f-8df9-4dba-b07d-feea9591deb2",
+ "base_position": "-30,141",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "e6cd7835-4c30-4203-8559-a311e6b7d281",
+ "base_position": "-105,-142",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "48184758-5d87-4012-a120-87019696704c",
+ "base_position": "-16,78",
+ "category_id": "game"
+ },
+ {
+ "place_id": "655b71fd-7789-4bbd-9a38-5a222f769806",
+ "base_position": "1,112",
+ "category_id": "social"
+ },
+ {
+ "place_id": "655b71fd-7789-4bbd-9a38-5a222f769806",
+ "base_position": "1,112",
+ "category_id": "education"
+ },
+ {
+ "place_id": "655b71fd-7789-4bbd-9a38-5a222f769806",
+ "base_position": "1,112",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b99ef894-c1ca-4b1e-a696-aaa4b06c1d25",
+ "base_position": "-123,149",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "1485b2a5-b4ab-4965-a05f-7045307d8f4b",
+ "base_position": "10,-12",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "874ea1e0-c911-4864-a47e-20798467ebb9",
+ "base_position": "149,-12",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "3357158f-bea6-402b-919d-3f328090d3a8",
+ "base_position": "-72,-125",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "1cee0874-8391-4107-af0b-db7358b82c54",
+ "base_position": "-72,-118",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "17562ca6-0762-4fe5-b104-81a60b0fb9ae",
+ "base_position": "19,-13",
+ "category_id": "social"
+ },
+ {
+ "place_id": "17562ca6-0762-4fe5-b104-81a60b0fb9ae",
+ "base_position": "19,-13",
+ "category_id": "music"
+ },
+ {
+ "place_id": "e0681b82-ff45-4eed-90d0-2d91bbf98332",
+ "base_position": "-17,79",
+ "category_id": "game"
+ },
+ {
+ "place_id": "79c38c8b-a36a-4c66-b4ab-d1a711f650eb",
+ "base_position": "11,-13",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "c5fdb555-763e-49d3-ad72-1bcd464cdb48",
+ "base_position": "32,36",
+ "category_id": "game"
+ },
+ {
+ "place_id": "fc141f20-a697-4585-b453-7a649855cb1c",
+ "base_position": "67,20",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7eb9b85f-1c4c-46fb-978c-2388415a8657",
+ "base_position": "-52,49",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "54964566-86b8-4242-bdc2-95ccf2427472",
+ "base_position": "45,11",
+ "category_id": "game"
+ },
+ {
+ "place_id": "54964566-86b8-4242-bdc2-95ccf2427472",
+ "base_position": "45,11",
+ "category_id": "art"
+ },
+ {
+ "place_id": "eb8f536b-4bcd-496c-aa5e-2f20ae99ce6d",
+ "base_position": "-14,-6",
+ "category_id": "art"
+ },
+ {
+ "place_id": "06513218-dc43-488f-9243-beca400adc01",
+ "base_position": "3,-19",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6091bd23-0250-4c0a-aee8-e55ee1a27d70",
+ "base_position": "15,-19",
+ "category_id": "social"
+ },
+ {
+ "place_id": "6091bd23-0250-4c0a-aee8-e55ee1a27d70",
+ "base_position": "15,-19",
+ "category_id": "music"
+ },
+ {
+ "place_id": "f9b2682c-5a32-415c-a146-015f22caffe7",
+ "base_position": "-30,74",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "bfe535ef-a9f0-4603-bd84-94ec39e873ac",
+ "base_position": "-133,77",
+ "category_id": "social"
+ },
+ {
+ "place_id": "bfe535ef-a9f0-4603-bd84-94ec39e873ac",
+ "base_position": "-133,77",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "bd442cdb-1931-4b19-8f05-6674b2e844e4",
+ "base_position": "-74,36",
+ "category_id": "education"
+ },
+ {
+ "place_id": "627281b1-0b31-4e74-8faf-d94c5bd0ef09",
+ "base_position": "-91,-84",
+ "category_id": "art"
+ },
+ {
+ "place_id": "72a48f4c-dba3-4431-9707-dbcf7f9f6344",
+ "base_position": "140,1",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d4a85a5f-533c-4a58-86b2-ef3069229ab3",
+ "base_position": "-61,46",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d4a85a5f-533c-4a58-86b2-ef3069229ab3",
+ "base_position": "-61,46",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "878b2375-05bc-427a-b946-6f74bab61e01",
+ "base_position": "-102,-142",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "2793a306-3d22-4d82-8219-b42e268aed4a",
+ "base_position": "59,-122",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0ab582b3-f809-4da9-842f-0bbbae3cd320",
+ "base_position": "-29,48",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "3748cdb8-95ab-41b1-ba3e-880539a93985",
+ "base_position": "-16,79",
+ "category_id": "game"
+ },
+ {
+ "place_id": "1e79b4fd-d1e1-474c-ad6b-c255ea91b1ab",
+ "base_position": "34,-115",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "ccb08c7a-23f0-4844-a01d-2d5860f0d62e",
+ "base_position": "13,95",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ccb08c7a-23f0-4844-a01d-2d5860f0d62e",
+ "base_position": "13,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "ccb08c7a-23f0-4844-a01d-2d5860f0d62e",
+ "base_position": "13,95",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "6f4ab7a5-8ce3-4155-b7f0-c8c7c081e9f8",
+ "base_position": "-106,-5",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6f4ab7a5-8ce3-4155-b7f0-c8c7c081e9f8",
+ "base_position": "-106,-5",
+ "category_id": "education"
+ },
+ {
+ "place_id": "d61ddabd-6f92-4088-9b46-1e570c727183",
+ "base_position": "21,-115",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d37adb82-c56f-49ce-9cf1-e13a005ae772",
+ "base_position": "13,140",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8ad248b4-b2a7-41f5-abd1-a3f36306dde2",
+ "base_position": "44,-12",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ca168cda-8a35-4b59-973c-ad714f5f0615",
+ "base_position": "-80,71",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1c53ca08-3319-4114-84a5-47bf55b1071b",
+ "base_position": "-32,-3",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a4dc93a8-c3e6-4b07-89d8-e1392076903e",
+ "base_position": "-80,-117",
+ "category_id": "game"
+ },
+ {
+ "place_id": "a4dc93a8-c3e6-4b07-89d8-e1392076903e",
+ "base_position": "-80,-117",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "857c10b3-e656-41ce-8a84-7972bc0c5dff",
+ "base_position": "9,-13",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "c537a7d7-5ad1-40ca-9704-573a2f884da1",
+ "base_position": "55,-41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "efe6612f-8b91-4771-97d8-a6c37abeec91",
+ "base_position": "-112,-40",
+ "category_id": "social"
+ },
+ {
+ "place_id": "efe6612f-8b91-4771-97d8-a6c37abeec91",
+ "base_position": "-112,-40",
+ "category_id": "music"
+ },
+ {
+ "place_id": "0c54a904-ff7a-48eb-9612-b87e52cd1cba",
+ "base_position": "20,-123",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4c973aba-1226-42ef-adb9-17bde108a950",
+ "base_position": "-140,-119",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4c973aba-1226-42ef-adb9-17bde108a950",
+ "base_position": "-140,-119",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "0a772602-a28f-4fb0-bd8d-3fda0ebf1c00",
+ "base_position": "-17,-108",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "1aa9baca-c6f7-4a45-951b-c904c9a5fd4a",
+ "base_position": "-60,125",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a22c502a-e6f0-47aa-b6f4-6b09a374ba30",
+ "base_position": "-116,142",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "a17ca55b-fcc5-4058-8ddc-778ba9a36ace",
+ "base_position": "-75,-121",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "59002df4-f08d-428c-b527-7d486425ef09",
+ "base_position": "-24,15",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "59002df4-f08d-428c-b527-7d486425ef09",
+ "base_position": "-24,15",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "42351cf6-9fc9-46bb-a090-8a4cce650516",
+ "base_position": "-12,79",
+ "category_id": "game"
+ },
+ {
+ "place_id": "7948e0d4-a6af-445d-bbe7-68fd0882113a",
+ "base_position": "-13,68",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "7948e0d4-a6af-445d-bbe7-68fd0882113a",
+ "base_position": "-13,68",
+ "category_id": "education"
+ },
+ {
+ "place_id": "79904235-f821-4ada-a812-f5696fc236af",
+ "base_position": "-16,76",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4fb7c159-cea1-44f3-80be-4b8485297de2",
+ "base_position": "-115,-63",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "73a54bb6-b782-4a41-93c0-983c66f14269",
+ "base_position": "89,-138",
+ "category_id": "art"
+ },
+ {
+ "place_id": "21e69206-71b2-4825-b701-af4316e97913",
+ "base_position": "-57,-105",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "79f4026d-8740-40d5-bd66-1002bc9a5a4d",
+ "base_position": "139,-9",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a6336bb2-8cc0-41bb-ba0a-3347bc6b2fd5",
+ "base_position": "-113,10",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5917af48-4279-4c7f-a48b-d041bc3e2c55",
+ "base_position": "19,-16",
+ "category_id": "social"
+ },
+ {
+ "place_id": "5917af48-4279-4c7f-a48b-d041bc3e2c55",
+ "base_position": "19,-16",
+ "category_id": "music"
+ },
+ {
+ "place_id": "ee39714c-1781-46ec-9795-dbced48a35f5",
+ "base_position": "47,62",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ea84f0b9-0c83-439a-be4f-e3f74e18f4fe",
+ "base_position": "91,-35",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2b4270ce-93b5-41d7-809d-c1ae48a672ec",
+ "base_position": "-12,-18",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "944da168-d1d8-46dd-8987-1d447ab77efd",
+ "base_position": "139,-5",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "a581ffd3-0d56-4571-b521-10c6e1869fbb",
+ "base_position": "15,95",
+ "category_id": "social"
+ },
+ {
+ "place_id": "a581ffd3-0d56-4571-b521-10c6e1869fbb",
+ "base_position": "15,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "a581ffd3-0d56-4571-b521-10c6e1869fbb",
+ "base_position": "15,95",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "48b40671-bfda-45d7-9e24-46a4da7bad42",
+ "base_position": "-52,48",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "20275fca-107d-405c-9cf5-263908d6829b",
+ "base_position": "-93,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "81690fd4-8bb9-4536-8066-eac6d5aa081d",
+ "base_position": "25,43",
+ "category_id": "art"
+ },
+ {
+ "place_id": "81690fd4-8bb9-4536-8066-eac6d5aa081d",
+ "base_position": "25,43",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ee8b434e-1f9e-4653-8338-487c317c13b8",
+ "base_position": "13,14",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "9d509bae-b01b-4fb3-9d10-0b43c114a808",
+ "base_position": "-5,-94",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "485dd0ff-4028-4844-a4aa-5df7b8c170e9",
+ "base_position": "-62,79",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a42b917c-3a8b-4fca-8d7d-93beebd9dec5",
+ "base_position": "-10,68",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a42b917c-3a8b-4fca-8d7d-93beebd9dec5",
+ "base_position": "-10,68",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "f996b50d-e7e3-443f-8301-6bfbfedf8202",
+ "base_position": "-76,-119",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f996b50d-e7e3-443f-8301-6bfbfedf8202",
+ "base_position": "-76,-119",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "45e61f16-d6e7-41db-81d1-19de130f75ea",
+ "base_position": "12,-19",
+ "category_id": "social"
+ },
+ {
+ "place_id": "45e61f16-d6e7-41db-81d1-19de130f75ea",
+ "base_position": "12,-19",
+ "category_id": "music"
+ },
+ {
+ "place_id": "8e1ddb40-4757-4b89-8fc1-84a92acefa8e",
+ "base_position": "6,20",
+ "category_id": "art"
+ },
+ {
+ "place_id": "92608522-610f-4085-a98f-f1c52557446e",
+ "base_position": "-142,-116",
+ "category_id": "game"
+ },
+ {
+ "place_id": "92608522-610f-4085-a98f-f1c52557446e",
+ "base_position": "-142,-116",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "201945a8-b2ec-4fa6-a1ca-ec44ce589153",
+ "base_position": "7,-19",
+ "category_id": "art"
+ },
+ {
+ "place_id": "adf993d7-e3d3-4f34-b97a-69fa34a79990",
+ "base_position": "-71,76",
+ "category_id": "social"
+ },
+ {
+ "place_id": "adf993d7-e3d3-4f34-b97a-69fa34a79990",
+ "base_position": "-71,76",
+ "category_id": "music"
+ },
+ {
+ "place_id": "52f90fdc-b336-4469-978a-0bb5a0427282",
+ "base_position": "87,-130",
+ "category_id": "game"
+ },
+ {
+ "place_id": "52f90fdc-b336-4469-978a-0bb5a0427282",
+ "base_position": "87,-130",
+ "category_id": "social"
+ },
+ {
+ "place_id": "590c1d96-9dca-48b8-b385-3c030dfd0460",
+ "base_position": "108,105",
+ "category_id": "social"
+ },
+ {
+ "place_id": "590c1d96-9dca-48b8-b385-3c030dfd0460",
+ "base_position": "108,105",
+ "category_id": "music"
+ },
+ {
+ "place_id": "60fab3d8-dcde-477a-8bcd-d789b19955eb",
+ "base_position": "-145,122",
+ "category_id": "art"
+ },
+ {
+ "place_id": "60fab3d8-dcde-477a-8bcd-d789b19955eb",
+ "base_position": "-145,122",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6b4f4fc5-3075-46b6-9824-b59cd1d6b39c",
+ "base_position": "-135,65",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "21b227b9-8503-4691-9f0c-4346b4be16c7",
+ "base_position": "-95,-95",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a89c95ab-40ba-469f-a890-620f7ae08ad8",
+ "base_position": "82,40",
+ "category_id": "game"
+ },
+ {
+ "place_id": "a89c95ab-40ba-469f-a890-620f7ae08ad8",
+ "base_position": "82,40",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "a89c95ab-40ba-469f-a890-620f7ae08ad8",
+ "base_position": "82,40",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a42777aa-e21b-4c82-9be8-668e9b74c0a0",
+ "base_position": "-109,-19",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "5a999b9e-0008-4a36-85f3-db9520ebeb61",
+ "base_position": "-132,70",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "5a999b9e-0008-4a36-85f3-db9520ebeb61",
+ "base_position": "-132,70",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "9bf54146-645e-456d-924a-f152ce923f8b",
+ "base_position": "40,-116",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7d59cc80-3d2a-4644-b99c-279482ae82e1",
+ "base_position": "37,11",
+ "category_id": "social"
+ },
+ {
+ "place_id": "0e9dd867-c82d-4b00-9e73-b60993f2ca7a",
+ "base_position": "-39,101",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5a76d982-6d70-4689-8b81-be21a2bd91cf",
+ "base_position": "-130,69",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "6bf93188-b93d-411d-84fb-c74629ce567a",
+ "base_position": "-104,-140",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "66c13dd5-7e0c-48ac-b49f-419c95320b54",
+ "base_position": "135,-4",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a07fe533-a649-42e7-b4bb-a48b21c5c415",
+ "base_position": "-25,6",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e883a707-4a89-4c57-8f59-b7ed0cff7b18",
+ "base_position": "-43,97",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6e4b83b6-7033-43a8-b93e-4fc395697fe5",
+ "base_position": "50,87",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6e4b83b6-7033-43a8-b93e-4fc395697fe5",
+ "base_position": "50,87",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6e4b83b6-7033-43a8-b93e-4fc395697fe5",
+ "base_position": "50,87",
+ "category_id": "education"
+ },
+ {
+ "place_id": "b7b9f60c-f395-4562-a23c-4e0f76849417",
+ "base_position": "96,25",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7477c162-0bb4-498e-ae33-e3e835a5bd3e",
+ "base_position": "3,69",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "3b869300-3f2c-472e-a0b2-f9bd9303cbd9",
+ "base_position": "-113,-35",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2b037d7f-fd36-4237-99d4-877ea1461372",
+ "base_position": "-35,49",
+ "category_id": "social"
+ },
+ {
+ "place_id": "84697c4c-b7d6-4ec4-9d64-da6afd347528",
+ "base_position": "-136,64",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "83a5a590-425e-4b7b-bc6a-035a4b694952",
+ "base_position": "83,-16",
+ "category_id": "game"
+ },
+ {
+ "place_id": "58357a3b-5d70-42ad-b0f7-a214030e4610",
+ "base_position": "-17,78",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b79715ab-20c2-45b1-80dc-afc8130d1ca5",
+ "base_position": "-40,106",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b79715ab-20c2-45b1-80dc-afc8130d1ca5",
+ "base_position": "-40,106",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "2c266944-b0ad-4ba7-9ab5-593c2298fd6e",
+ "base_position": "-114,-40",
+ "category_id": "social"
+ },
+ {
+ "place_id": "02aa656d-fe45-400f-827f-ce9ed4dc71db",
+ "base_position": "-66,3",
+ "category_id": "social"
+ },
+ {
+ "place_id": "6db1b539-c55e-4814-8b47-093ad4425f7c",
+ "base_position": "-96,-89",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "88b6ae2c-d320-4473-a61b-a85359e3dcee",
+ "base_position": "-16,77",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "86a8ba1c-b088-4d1e-8de5-4e35b5bd2b51",
+ "base_position": "66,24",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "9dcfe47d-4a18-4024-8bd8-7a35e5866872",
+ "base_position": "136,-144",
+ "category_id": "social"
+ },
+ {
+ "place_id": "e3300dd4-56bc-4fe8-87f6-c72458ac0879",
+ "base_position": "24,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e3300dd4-56bc-4fe8-87f6-c72458ac0879",
+ "base_position": "24,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5a18977a-ece2-4a4f-aff9-2c43d736dc26",
+ "base_position": "-70,-139",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5b8bf691-049d-4db7-be26-281f157e9826",
+ "base_position": "74,-103",
+ "category_id": "social"
+ },
+ {
+ "place_id": "5b8bf691-049d-4db7-be26-281f157e9826",
+ "base_position": "74,-103",
+ "category_id": "music"
+ },
+ {
+ "place_id": "81761096-cc40-47c0-89c5-b4509ac2ddd2",
+ "base_position": "-32,74",
+ "category_id": "art"
+ },
+ {
+ "place_id": "fcd1ea27-286b-449f-b8f2-2a640fd04b7b",
+ "base_position": "-26,-48",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3160f5b2-2880-44b2-b1d5-18c37306c7f0",
+ "base_position": "-150,108",
+ "category_id": "art"
+ },
+ {
+ "place_id": "78e9d658-1717-4d31-ac80-eb936c555e56",
+ "base_position": "7,-16",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d90aab15-cbd5-4c0f-928e-0ef283e1db56",
+ "base_position": "-58,84",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d90aab15-cbd5-4c0f-928e-0ef283e1db56",
+ "base_position": "-58,84",
+ "category_id": "music"
+ },
+ {
+ "place_id": "44b8a696-608f-48b0-8395-12c31b8cc67b",
+ "base_position": "64,-30",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e12fef0b-298c-4ab8-afaa-d07d8df05f8c",
+ "base_position": "-32,140",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0aa23bcc-b109-4a6b-be0f-52dda7d69b45",
+ "base_position": "13,-130",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "b23d83de-214d-4086-bf32-6e9a7fc96796",
+ "base_position": "-135,74",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "b23d83de-214d-4086-bf32-6e9a7fc96796",
+ "base_position": "-135,74",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b23d83de-214d-4086-bf32-6e9a7fc96796",
+ "base_position": "-135,74",
+ "category_id": "music"
+ },
+ {
+ "place_id": "9bff16ac-4e96-48d4-897d-58e0c202252a",
+ "base_position": "-90,15",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "00faf2aa-6c39-49aa-81ff-82304468ca26",
+ "base_position": "1,107",
+ "category_id": "social"
+ },
+ {
+ "place_id": "00faf2aa-6c39-49aa-81ff-82304468ca26",
+ "base_position": "1,107",
+ "category_id": "education"
+ },
+ {
+ "place_id": "0d1273ca-47b2-4eab-b2a0-9c0ee845fa14",
+ "base_position": "66,15",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e948b38e-7bfd-4d4d-9629-ad4ac6c3e41c",
+ "base_position": "-30,-108",
+ "category_id": "social"
+ },
+ {
+ "place_id": "e948b38e-7bfd-4d4d-9629-ad4ac6c3e41c",
+ "base_position": "-30,-108",
+ "category_id": "music"
+ },
+ {
+ "place_id": "6075a22c-1e63-43f4-8f8c-cfdc1083384c",
+ "base_position": "-67,33",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "78e2c80f-b954-4f08-a951-50f8646535de",
+ "base_position": "-74,-116",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4dba75f5-9dc3-4936-b0df-548ad1de2012",
+ "base_position": "11,150",
+ "category_id": "social"
+ },
+ {
+ "place_id": "52e9003d-677e-40cd-9361-9c5d727e77fd",
+ "base_position": "-146,-120",
+ "category_id": "game"
+ },
+ {
+ "place_id": "52e9003d-677e-40cd-9361-9c5d727e77fd",
+ "base_position": "-146,-120",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d876cd42-e0b3-46f2-981b-c3c867cc4554",
+ "base_position": "-26,22",
+ "category_id": "game"
+ },
+ {
+ "place_id": "d908ee4e-9b6f-47d6-b3f9-99b0c55e5456",
+ "base_position": "63,24",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "79602298-416c-4bd4-9455-c323cea7b467",
+ "base_position": "35,8",
+ "category_id": "social"
+ },
+ {
+ "place_id": "79602298-416c-4bd4-9455-c323cea7b467",
+ "base_position": "35,8",
+ "category_id": "music"
+ },
+ {
+ "place_id": "e1f986eb-19a8-4557-9fc0-77b1d00d62e1",
+ "base_position": "-77,-119",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "074af5a2-c59d-4605-b77c-2875996e0a5f",
+ "base_position": "-14,-12",
+ "category_id": "art"
+ },
+ {
+ "place_id": "12b601b5-c743-46eb-a01e-043e46f00b28",
+ "base_position": "-24,1",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "1e7f4ccb-fc58-41e8-a7f7-f4cc5dba0050",
+ "base_position": "46,87",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1e7f4ccb-fc58-41e8-a7f7-f4cc5dba0050",
+ "base_position": "46,87",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "1e7f4ccb-fc58-41e8-a7f7-f4cc5dba0050",
+ "base_position": "46,87",
+ "category_id": "education"
+ },
+ {
+ "place_id": "b1b7f9c2-4543-4914-aedb-420be29e5a06",
+ "base_position": "-62,84",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b1b7f9c2-4543-4914-aedb-420be29e5a06",
+ "base_position": "-62,84",
+ "category_id": "music"
+ },
+ {
+ "place_id": "43233a23-2eda-4aae-840e-2bcab1844aa2",
+ "base_position": "79,-138",
+ "category_id": "art"
+ },
+ {
+ "place_id": "43233a23-2eda-4aae-840e-2bcab1844aa2",
+ "base_position": "79,-138",
+ "category_id": "education"
+ },
+ {
+ "place_id": "e66a14c0-c7dc-4ab8-8467-b107938b055a",
+ "base_position": "98,-111",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "04030778-7806-4dd8-810f-c462facf0d29",
+ "base_position": "-119,5",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "1c42ffa3-3626-4e24-9ac8-51e88493bf65",
+ "base_position": "104,60",
+ "category_id": "social"
+ },
+ {
+ "place_id": "aac0af53-f895-486b-92f9-0be70234c27d",
+ "base_position": "-25,-39",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9341932a-3808-4c3f-934f-9aa52ec00670",
+ "base_position": "18,142",
+ "category_id": "music"
+ },
+ {
+ "place_id": "650a9487-f27b-4799-9d3f-dd46f7d1c33c",
+ "base_position": "4,23",
+ "category_id": "art"
+ },
+ {
+ "place_id": "650a9487-f27b-4799-9d3f-dd46f7d1c33c",
+ "base_position": "4,23",
+ "category_id": "social"
+ },
+ {
+ "place_id": "650a9487-f27b-4799-9d3f-dd46f7d1c33c",
+ "base_position": "4,23",
+ "category_id": "music"
+ },
+ {
+ "place_id": "42683650-5099-4c57-a426-15879808f719",
+ "base_position": "-58,79",
+ "category_id": "social"
+ },
+ {
+ "place_id": "846702a9-f8c6-469a-a4d1-956aa69e508e",
+ "base_position": "2,30",
+ "category_id": "education"
+ },
+ {
+ "place_id": "a8dac399-9388-4990-b773-8bef3344e04d",
+ "base_position": "-109,-6",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "3bac40ca-f479-41f0-9677-d123ad93c881",
+ "base_position": "32,23",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5936402b-4339-4c57-93d8-13410716a752",
+ "base_position": "-71,89",
+ "category_id": "music"
+ },
+ {
+ "place_id": "e92a5f67-8ad7-4d53-9ece-0941aa3c2974",
+ "base_position": "-89,-80",
+ "category_id": "art"
+ },
+ {
+ "place_id": "79d30e71-41ef-4266-ad43-17229456bf2d",
+ "base_position": "25,49",
+ "category_id": "art"
+ },
+ {
+ "place_id": "79d30e71-41ef-4266-ad43-17229456bf2d",
+ "base_position": "25,49",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "42a77f0f-ed1f-4230-86a6-685189f1d89c",
+ "base_position": "59,114",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a3f67442-99d4-4a27-baea-abc8e16b8f9c",
+ "base_position": "83,16",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "55151d3e-81da-46de-bbfc-0fc9d2cf8866",
+ "base_position": "89,-33",
+ "category_id": "art"
+ },
+ {
+ "place_id": "55151d3e-81da-46de-bbfc-0fc9d2cf8866",
+ "base_position": "89,-33",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "cb54427d-2b0f-4d12-bf8e-4b0266263530",
+ "base_position": "-32,67",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f79aa29b-2686-428c-bfe7-32a52cbcac38",
+ "base_position": "-149,149",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e403d276-bca4-419b-9dfe-8bbc90367e96",
+ "base_position": "-89,-80",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5f4ac94f-76e2-4ccd-b580-e4cd55a8b17d",
+ "base_position": "29,95",
+ "category_id": "social"
+ },
+ {
+ "place_id": "5f4ac94f-76e2-4ccd-b580-e4cd55a8b17d",
+ "base_position": "29,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "5f4ac94f-76e2-4ccd-b580-e4cd55a8b17d",
+ "base_position": "29,95",
+ "category_id": "art"
+ },
+ {
+ "place_id": "37edef9d-163c-4eb4-b09b-77138e7aeceb",
+ "base_position": "35,-65",
+ "category_id": "art"
+ },
+ {
+ "place_id": "98cc55cb-4e4d-4735-b8b4-aa2f771d517a",
+ "base_position": "25,46",
+ "category_id": "art"
+ },
+ {
+ "place_id": "98cc55cb-4e4d-4735-b8b4-aa2f771d517a",
+ "base_position": "25,46",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "551e28da-ed5b-474d-a4a0-e7bf5ad0a84c",
+ "base_position": "8,19",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "1d3748e9-596f-4115-bc7d-392e84064294",
+ "base_position": "2,52",
+ "category_id": "education"
+ },
+ {
+ "place_id": "a84e7c2f-c5ea-4358-a7c5-0e06901dfe74",
+ "base_position": "-17,77",
+ "category_id": "game"
+ },
+ {
+ "place_id": "705dfa0f-ece2-43bc-bc7d-a767ca4935de",
+ "base_position": "-127,10",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6ec6fd9a-5205-422a-8d2c-e545a464f00e",
+ "base_position": "-58,-116",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e143f248-89a9-4b1c-b2af-0b8df82fcf64",
+ "base_position": "-96,-15",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "e143f248-89a9-4b1c-b2af-0b8df82fcf64",
+ "base_position": "-96,-15",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "65cb3f3e-89dd-4435-b7de-5dfb24f33163",
+ "base_position": "12,-132",
+ "category_id": "art"
+ },
+ {
+ "place_id": "58d7913d-55d2-40e2-ac5c-2847e95975d9",
+ "base_position": "59,-123",
+ "category_id": "game"
+ },
+ {
+ "place_id": "e10c07cb-0218-4c86-9e99-022e996ab9f4",
+ "base_position": "-92,-97",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e10c07cb-0218-4c86-9e99-022e996ab9f4",
+ "base_position": "-92,-97",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "273f9277-cfa6-404c-be47-516e2949e442",
+ "base_position": "56,-26",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "2699c125-be13-4473-a4a2-e49c0d3deb60",
+ "base_position": "105,-109",
+ "category_id": "social"
+ },
+ {
+ "place_id": "2699c125-be13-4473-a4a2-e49c0d3deb60",
+ "base_position": "105,-109",
+ "category_id": "music"
+ },
+ {
+ "place_id": "794ea2a3-60b8-45f1-8c06-3dd0fa0bf0be",
+ "base_position": "-104,-41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "57b7fc85-93d6-4e32-a4e7-a9f706af25f7",
+ "base_position": "-108,-13",
+ "category_id": "game"
+ },
+ {
+ "place_id": "82b86636-267c-45b8-aaec-c61e66986710",
+ "base_position": "-70,117",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7eb9e40a-bfd8-44a8-8f0d-e86c75fe2b28",
+ "base_position": "-52,47",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "801b8b82-deaa-4303-afc6-835952e05b6c",
+ "base_position": "-17,-18",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ec39999c-5f20-4e12-ba83-505a1df08d7c",
+ "base_position": "-136,-37",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "ec706e4d-50bc-41b0-99f1-efaa53273fda",
+ "base_position": "25,102",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ec706e4d-50bc-41b0-99f1-efaa53273fda",
+ "base_position": "25,102",
+ "category_id": "education"
+ },
+ {
+ "place_id": "0e265ea8-07b5-4a5f-af07-263fae79fb1d",
+ "base_position": "-132,66",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "cdd8fbdf-649a-4f7b-9321-7f79a868487a",
+ "base_position": "-69,125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "5d5cebb3-9917-48dd-ba5e-c7920b2335e7",
+ "base_position": "97,-112",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "b9328aa5-91a6-4eeb-be96-c6baab3e1953",
+ "base_position": "-1,120",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b9328aa5-91a6-4eeb-be96-c6baab3e1953",
+ "base_position": "-1,120",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "00f8a854-51c2-425d-80c1-c49216f238de",
+ "base_position": "-23,69",
+ "category_id": "art"
+ },
+ {
+ "place_id": "00f8a854-51c2-425d-80c1-c49216f238de",
+ "base_position": "-23,69",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "33bef3d9-4464-4eea-a569-9d4314a97a5f",
+ "base_position": "-14,-13",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "4b2d245a-b60c-47d5-9c95-83ce956dd8ac",
+ "base_position": "104,-109",
+ "category_id": "social"
+ },
+ {
+ "place_id": "4b2d245a-b60c-47d5-9c95-83ce956dd8ac",
+ "base_position": "104,-109",
+ "category_id": "music"
+ },
+ {
+ "place_id": "17b1027c-d61d-46de-b8fa-9bc1c774cdd4",
+ "base_position": "89,-29",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6cc19086-6124-4b46-88f8-259f80f343f2",
+ "base_position": "-67,5",
+ "category_id": "art"
+ },
+ {
+ "place_id": "43b63a29-eba7-4c9f-bdca-9f85e3ea538d",
+ "base_position": "-58,127",
+ "category_id": "education"
+ },
+ {
+ "place_id": "25018871-dd51-48e2-b92a-c0294633ddb8",
+ "base_position": "-8,-69",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "25018871-dd51-48e2-b92a-c0294633ddb8",
+ "base_position": "-8,-69",
+ "category_id": "game"
+ },
+ {
+ "place_id": "6bed88ef-ccf4-4ace-8f7d-63f7b5bba7ab",
+ "base_position": "-4,-94",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "fc25194b-9872-4cf8-adb4-879c30c33e6d",
+ "base_position": "-149,-144",
+ "category_id": "music"
+ },
+ {
+ "place_id": "4dcf25a4-bf4d-4fd6-bf5a-ae953f15f704",
+ "base_position": "62,-1",
+ "category_id": "social"
+ },
+ {
+ "place_id": "4dcf25a4-bf4d-4fd6-bf5a-ae953f15f704",
+ "base_position": "62,-1",
+ "category_id": "music"
+ },
+ {
+ "place_id": "101beeb0-d649-4758-9cf4-558205447139",
+ "base_position": "-33,67",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "fdfca393-784b-4364-8bee-6ebe6f3146af",
+ "base_position": "-52,-108",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "4d2178b7-68da-4879-933e-6bc7098c3d38",
+ "base_position": "-32,-9",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "93ae20e5-5a63-4f7d-bfd5-1e3447fce638",
+ "base_position": "35,11",
+ "category_id": "art"
+ },
+ {
+ "place_id": "51cfdee5-3ea9-40f6-b1ae-8495fa69593b",
+ "base_position": "-64,-113",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "e75ff84a-1e04-4942-8d5b-5dfdd9f10cd7",
+ "base_position": "-3,105",
+ "category_id": "education"
+ },
+ {
+ "place_id": "f2a09d3d-e4b7-4beb-be2f-965d031e958d",
+ "base_position": "108,-115",
+ "category_id": "art"
+ },
+ {
+ "place_id": "124b0d16-74b7-4d24-bd45-957a7a94d746",
+ "base_position": "-45,-53",
+ "category_id": "art"
+ },
+ {
+ "place_id": "124b0d16-74b7-4d24-bd45-957a7a94d746",
+ "base_position": "-45,-53",
+ "category_id": "social"
+ },
+ {
+ "place_id": "124b0d16-74b7-4d24-bd45-957a7a94d746",
+ "base_position": "-45,-53",
+ "category_id": "music"
+ },
+ {
+ "place_id": "9413494d-57f3-4ed9-9e8b-22edd8b96497",
+ "base_position": "82,-33",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "bbfbf20d-47a2-4dc2-ad51-7298f9f38742",
+ "base_position": "-37,77",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "6e7c729b-bd95-4556-982e-258df10a78ba",
+ "base_position": "139,-123",
+ "category_id": "art"
+ },
+ {
+ "place_id": "eddd3eb9-38bb-41cd-90c7-7ccaacdcb2cd",
+ "base_position": "-5,-95",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ed0774fd-fb3c-4ea1-aed8-3a2a40973257",
+ "base_position": "17,16",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c7575b11-e855-4ced-9d92-2225a0172e19",
+ "base_position": "-2,-60",
+ "category_id": "art"
+ },
+ {
+ "place_id": "058e4784-f7e2-47d5-a346-778da2e38b25",
+ "base_position": "142,-143",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "058e4784-f7e2-47d5-a346-778da2e38b25",
+ "base_position": "142,-143",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "058e4784-f7e2-47d5-a346-778da2e38b25",
+ "base_position": "142,-143",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "c16bd296-aed3-40b3-804c-6163797160eb",
+ "base_position": "13,74",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c16bd296-aed3-40b3-804c-6163797160eb",
+ "base_position": "13,74",
+ "category_id": "education"
+ },
+ {
+ "place_id": "dac72c4b-f3f3-4d14-950e-62299cc46e74",
+ "base_position": "2,-110",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "2d5abe6e-914a-4f2b-8d90-796415bdef94",
+ "base_position": "-22,75",
+ "category_id": "game"
+ },
+ {
+ "place_id": "72732b42-9cb6-4c09-95b3-663ca9750137",
+ "base_position": "123,-97",
+ "category_id": "game"
+ },
+ {
+ "place_id": "72732b42-9cb6-4c09-95b3-663ca9750137",
+ "base_position": "123,-97",
+ "category_id": "social"
+ },
+ {
+ "place_id": "6305ad78-a906-46ee-ba55-bcc414c85244",
+ "base_position": "29,-10",
+ "category_id": "social"
+ },
+ {
+ "place_id": "de6844a1-31b4-4178-a43f-ec9bd65a85bd",
+ "base_position": "-141,-25",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e6b1f8d6-95b3-43d7-b796-b9b6d6e3da5a",
+ "base_position": "-90,-73",
+ "category_id": "education"
+ },
+ {
+ "place_id": "305faa3a-17bc-4105-be94-89bd30e8407e",
+ "base_position": "-69,-142",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ed01d7dd-47a6-4992-9a14-31d3ca1069a1",
+ "base_position": "-58,-5",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ed01d7dd-47a6-4992-9a14-31d3ca1069a1",
+ "base_position": "-58,-5",
+ "category_id": "music"
+ },
+ {
+ "place_id": "9e0a5701-70c5-4691-bdb4-9cf6163f7e0a",
+ "base_position": "-70,-142",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "fe537ac0-e525-40fa-8cc7-7a43f3a0672a",
+ "base_position": "30,2",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "a21f79ab-0c4a-4a91-8111-853209ca9485",
+ "base_position": "25,95",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a21f79ab-0c4a-4a91-8111-853209ca9485",
+ "base_position": "25,95",
+ "category_id": "social"
+ },
+ {
+ "place_id": "a21f79ab-0c4a-4a91-8111-853209ca9485",
+ "base_position": "25,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "79f92147-87ca-4499-8ea7-8b1598c42b3d",
+ "base_position": "-67,35",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "3e950243-b75e-41ff-bb18-cc929d603d68",
+ "base_position": "-20,69",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3e8f5261-59e4-4337-b10d-994eafe7fc1f",
+ "base_position": "-30,-2",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "7067c719-335c-4838-9d44-ede1c5cd3a81",
+ "base_position": "-148,122",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "da2c0da9-2593-4431-a4c1-9c5d95dc372b",
+ "base_position": "-18,77",
+ "category_id": "game"
+ },
+ {
+ "place_id": "cc52b663-60b8-4049-811d-f8ee87c31016",
+ "base_position": "118,-125",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e0b53baf-8dd4-4ef2-94bf-993ea13f6fa3",
+ "base_position": "57,43",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b014608d-11a7-44ad-a8e7-7bb8cd79e358",
+ "base_position": "-56,120",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "78dd38df-fc1e-4b08-8df1-b032521217a9",
+ "base_position": "2,69",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "301cb06d-a49b-4340-b50c-569363f85efc",
+ "base_position": "90,18",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "09a0a247-2ecf-40c0-a8e6-d030f1983317",
+ "base_position": "144,70",
+ "category_id": "art"
+ },
+ {
+ "place_id": "dca4a134-63d5-4881-8284-6cb4e3715443",
+ "base_position": "18,-117",
+ "category_id": "art"
+ },
+ {
+ "place_id": "dca4a134-63d5-4881-8284-6cb4e3715443",
+ "base_position": "18,-117",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "3b87ce5a-438b-474d-a2f2-425d422ef040",
+ "base_position": "48,-56",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2d647cd3-69af-40fb-9475-c0c4f73190fd",
+ "base_position": "-92,-94",
+ "category_id": "social"
+ },
+ {
+ "place_id": "2d647cd3-69af-40fb-9475-c0c4f73190fd",
+ "base_position": "-92,-94",
+ "category_id": "music"
+ },
+ {
+ "place_id": "95a917dd-7658-4c92-9cd4-9e046af5e52c",
+ "base_position": "-21,76",
+ "category_id": "game"
+ },
+ {
+ "place_id": "3845282c-958e-4ae3-85fb-0439047899e9",
+ "base_position": "105,146",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3845282c-958e-4ae3-85fb-0439047899e9",
+ "base_position": "105,146",
+ "category_id": "education"
+ },
+ {
+ "place_id": "e598eef4-e020-431e-bd82-d2b5eb917047",
+ "base_position": "52,-32",
+ "category_id": "art"
+ },
+ {
+ "place_id": "77ccdc80-8d2f-4644-b6c4-6b96a7c2f207",
+ "base_position": "19,-19",
+ "category_id": "social"
+ },
+ {
+ "place_id": "77ccdc80-8d2f-4644-b6c4-6b96a7c2f207",
+ "base_position": "19,-19",
+ "category_id": "music"
+ },
+ {
+ "place_id": "303c9484-f4e7-4a8f-bb0b-9cdc517b4e82",
+ "base_position": "-60,-6",
+ "category_id": "art"
+ },
+ {
+ "place_id": "823c2f2e-45bf-4d0a-b627-767ecafbfbf9",
+ "base_position": "-75,-31",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "f4f13f4e-5ff0-46cf-9663-0453a1b88690",
+ "base_position": "-114,-41",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "cd13f88c-6da4-4898-a3fb-2da978d8be7f",
+ "base_position": "-133,91",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1c533a9e-e5c8-40b5-a01c-385a7816792b",
+ "base_position": "-20,76",
+ "category_id": "game"
+ },
+ {
+ "place_id": "2c9c0c13-df4e-414f-b2c1-15a942659de0",
+ "base_position": "36,104",
+ "category_id": "social"
+ },
+ {
+ "place_id": "2c9c0c13-df4e-414f-b2c1-15a942659de0",
+ "base_position": "36,104",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2c9c0c13-df4e-414f-b2c1-15a942659de0",
+ "base_position": "36,104",
+ "category_id": "education"
+ },
+ {
+ "place_id": "19ba3151-4fea-4912-b2b2-b9aa6c1f5976",
+ "base_position": "19,140",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "19ba3151-4fea-4912-b2b2-b9aa6c1f5976",
+ "base_position": "19,140",
+ "category_id": "education"
+ },
+ {
+ "place_id": "ecbc7a69-6e55-4c87-b53d-98128575723e",
+ "base_position": "49,87",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ecbc7a69-6e55-4c87-b53d-98128575723e",
+ "base_position": "49,87",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ecbc7a69-6e55-4c87-b53d-98128575723e",
+ "base_position": "49,87",
+ "category_id": "education"
+ },
+ {
+ "place_id": "3e477430-b735-4928-bf76-e49243ee893c",
+ "base_position": "4,-36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5d49ac72-7ec7-46ae-a9fc-8542ad333155",
+ "base_position": "3,68",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "cbf0b90c-9c99-4752-92ab-78aa48e26d5a",
+ "base_position": "-115,-70",
+ "category_id": "art"
+ },
+ {
+ "place_id": "654ca0a2-fcf6-4874-8cf8-8fdbf1b3650d",
+ "base_position": "35,36",
+ "category_id": "game"
+ },
+ {
+ "place_id": "c40467ab-1be3-491f-9bc9-8bcecd566d81",
+ "base_position": "7,21",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "c537bf28-30fa-4a11-89eb-72ded5bc2fe6",
+ "base_position": "100,23",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d1f906c2-d6ed-47b4-a364-e6cd0fea78ee",
+ "base_position": "2,-25",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ba7e9c66-9b5e-401a-b579-06b09a007cef",
+ "base_position": "-130,65",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "3afe0a6e-2dde-4186-937f-d35bbc5dad7e",
+ "base_position": "-17,76",
+ "category_id": "game"
+ },
+ {
+ "place_id": "06638b5b-3d6b-458a-ac5f-7a51b24f881a",
+ "base_position": "130,-140",
+ "category_id": "social"
+ },
+ {
+ "place_id": "06638b5b-3d6b-458a-ac5f-7a51b24f881a",
+ "base_position": "130,-140",
+ "category_id": "music"
+ },
+ {
+ "place_id": "06638b5b-3d6b-458a-ac5f-7a51b24f881a",
+ "base_position": "130,-140",
+ "category_id": "art"
+ },
+ {
+ "place_id": "999335b9-3251-4390-b2a2-b96ed053fbd5",
+ "base_position": "-88,-66",
+ "category_id": "art"
+ },
+ {
+ "place_id": "53250428-7672-4654-83d1-9a4be5c63865",
+ "base_position": "19,101",
+ "category_id": "social"
+ },
+ {
+ "place_id": "53250428-7672-4654-83d1-9a4be5c63865",
+ "base_position": "19,101",
+ "category_id": "education"
+ },
+ {
+ "place_id": "53250428-7672-4654-83d1-9a4be5c63865",
+ "base_position": "19,101",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "456e8067-6b4b-4a30-a3b8-beb8d86ffae7",
+ "base_position": "-65,-125",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c189a726-34f1-4a51-9e66-41fac221e167",
+ "base_position": "-149,148",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4d0bfa6d-bb57-4862-869f-7571ebf173d9",
+ "base_position": "15,55",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4d0bfa6d-bb57-4862-869f-7571ebf173d9",
+ "base_position": "15,55",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "a10606ff-0344-484c-a3b6-ec21c781f5d1",
+ "base_position": "32,34",
+ "category_id": "game"
+ },
+ {
+ "place_id": "cd758878-25e5-452d-8a85-86b68585d52d",
+ "base_position": "-58,78",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cd758878-25e5-452d-8a85-86b68585d52d",
+ "base_position": "-58,78",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "1bb45bd6-1743-4b25-aa71-4b463e44c597",
+ "base_position": "14,31",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1bb45bd6-1743-4b25-aa71-4b463e44c597",
+ "base_position": "14,31",
+ "category_id": "education"
+ },
+ {
+ "place_id": "68a7ee0e-fbf2-477d-af07-73a9edebb2c9",
+ "base_position": "-72,-105",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d906b45d-6c46-4f82-946a-164829226fc5",
+ "base_position": "137,48",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b900666e-8b07-493f-8f63-66c3f9df762c",
+ "base_position": "105,-24",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4b04aa39-2c3f-4906-824e-70969acac1de",
+ "base_position": "45,42",
+ "category_id": "game"
+ },
+ {
+ "place_id": "834fc84a-7028-4aec-aab6-66725e60c239",
+ "base_position": "-95,32",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "db8edbad-a172-4608-bece-846f75bd7480",
+ "base_position": "149,-1",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "72659218-d9b0-4d8d-a215-10a785c85192",
+ "base_position": "-63,-128",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "9d726273-94ce-4344-8c0c-cfebeaa5be95",
+ "base_position": "35,90",
+ "category_id": "education"
+ },
+ {
+ "place_id": "a4171e11-3e33-4a67-81cb-40acc4d7bb3f",
+ "base_position": "57,-43",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ad1dba65-c606-4e62-9eeb-6cb5364a9932",
+ "base_position": "-63,43",
+ "category_id": "art"
+ },
+ {
+ "place_id": "74642270-2937-4620-8c16-09b3f8edf91d",
+ "base_position": "93,-24",
+ "category_id": "art"
+ },
+ {
+ "place_id": "540a1a58-c85d-46be-a2be-7dcd119dbce9",
+ "base_position": "116,-119",
+ "category_id": "art"
+ },
+ {
+ "place_id": "43285e0e-5259-4446-b28f-8639287d3271",
+ "base_position": "61,18",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "39521556-caf5-427a-a3e1-79c89b845235",
+ "base_position": "-118,4",
+ "category_id": "social"
+ },
+ {
+ "place_id": "39521556-caf5-427a-a3e1-79c89b845235",
+ "base_position": "-118,4",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a485b836-1185-4832-a52c-00c192406fa0",
+ "base_position": "5,69",
+ "category_id": "art"
+ },
+ {
+ "place_id": "227f232f-0121-47bd-82d6-ee8b245606cb",
+ "base_position": "-113,-45",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "4fed3360-7acf-4d6f-a711-17a6102800d8",
+ "base_position": "70,24",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "348705a5-4537-41c2-a80e-5458f026eeea",
+ "base_position": "56,-129",
+ "category_id": "art"
+ },
+ {
+ "place_id": "348705a5-4537-41c2-a80e-5458f026eeea",
+ "base_position": "56,-129",
+ "category_id": "music"
+ },
+ {
+ "place_id": "0dec02fe-fd11-4a47-929f-44b423c1e019",
+ "base_position": "28,75",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0dec02fe-fd11-4a47-929f-44b423c1e019",
+ "base_position": "28,75",
+ "category_id": "education"
+ },
+ {
+ "place_id": "0c0f2c30-ad3b-45a1-9aa8-cba3d0ce9560",
+ "base_position": "-40,64",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0c0f2c30-ad3b-45a1-9aa8-cba3d0ce9560",
+ "base_position": "-40,64",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "81d8a76d-646f-455c-a97b-c6cabf6fff7f",
+ "base_position": "-67,34",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "51e49a44-4bc2-4646-a2e3-de340d8b0af8",
+ "base_position": "6,-113",
+ "category_id": "social"
+ },
+ {
+ "place_id": "51e49a44-4bc2-4646-a2e3-de340d8b0af8",
+ "base_position": "6,-113",
+ "category_id": "music"
+ },
+ {
+ "place_id": "7d09c97a-6ede-4cd3-91f9-d18c99000ca8",
+ "base_position": "-71,117",
+ "category_id": "social"
+ },
+ {
+ "place_id": "1d8c54a2-34af-46b2-8601-91894efbf8e9",
+ "base_position": "36,8",
+ "category_id": "game"
+ },
+ {
+ "place_id": "1d8c54a2-34af-46b2-8601-91894efbf8e9",
+ "base_position": "36,8",
+ "category_id": "social"
+ },
+ {
+ "place_id": "1d8c54a2-34af-46b2-8601-91894efbf8e9",
+ "base_position": "36,8",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6224055b-24e4-42ef-a85c-e4e0483bc850",
+ "base_position": "56,118",
+ "category_id": "game"
+ },
+ {
+ "place_id": "6224055b-24e4-42ef-a85c-e4e0483bc850",
+ "base_position": "56,118",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "2cd1f0a1-17df-4730-996f-592e01ca9f85",
+ "base_position": "-26,140",
+ "category_id": "art"
+ },
+ {
+ "place_id": "60a7628c-89cd-459b-b297-1c54b38734fc",
+ "base_position": "-133,-33",
+ "category_id": "social"
+ },
+ {
+ "place_id": "60a7628c-89cd-459b-b297-1c54b38734fc",
+ "base_position": "-133,-33",
+ "category_id": "music"
+ },
+ {
+ "place_id": "7b2b7651-16ff-4818-bdea-7a09347d7894",
+ "base_position": "57,-111",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "53e0bf01-b212-4c44-95c0-b398f38b1632",
+ "base_position": "-23,140",
+ "category_id": "game"
+ },
+ {
+ "place_id": "72c809a6-91fc-437b-a16b-605d44542523",
+ "base_position": "21,9",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ba5b62af-0209-4b0e-a65e-0a87736ba7b2",
+ "base_position": "55,90",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0e308be6-49c3-47c0-956a-9021f260ee93",
+ "base_position": "91,17",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "4b3e6117-a561-4e35-bf7a-596885e795bd",
+ "base_position": "-79,-114",
+ "category_id": "social"
+ },
+ {
+ "place_id": "8aac007e-1d18-4ed5-afe6-64791ef0355c",
+ "base_position": "-16,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "bac41b71-19a9-4ad0-962b-30fe50eefff9",
+ "base_position": "37,121",
+ "category_id": "social"
+ },
+ {
+ "place_id": "bac41b71-19a9-4ad0-962b-30fe50eefff9",
+ "base_position": "37,121",
+ "category_id": "education"
+ },
+ {
+ "place_id": "8f7e819e-2af2-4476-a0c7-eb41c46df0f4",
+ "base_position": "28,-34",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8f7e819e-2af2-4476-a0c7-eb41c46df0f4",
+ "base_position": "28,-34",
+ "category_id": "social"
+ },
+ {
+ "place_id": "8f7e819e-2af2-4476-a0c7-eb41c46df0f4",
+ "base_position": "28,-34",
+ "category_id": "music"
+ },
+ {
+ "place_id": "0925ac41-0b18-42c1-94a1-0468752e2633",
+ "base_position": "1,95",
+ "category_id": "social"
+ },
+ {
+ "place_id": "0925ac41-0b18-42c1-94a1-0468752e2633",
+ "base_position": "1,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "0925ac41-0b18-42c1-94a1-0468752e2633",
+ "base_position": "1,95",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "18531df2-8704-449b-a0b5-93583b65b64f",
+ "base_position": "-68,-103",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "2b46f8f2-e425-46b2-b16d-c6db5f815afe",
+ "base_position": "-114,-50",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "5721647e-cd77-46b2-9bc5-0ac905ba58ad",
+ "base_position": "141,-60",
+ "category_id": "game"
+ },
+ {
+ "place_id": "5721647e-cd77-46b2-9bc5-0ac905ba58ad",
+ "base_position": "141,-60",
+ "category_id": "social"
+ },
+ {
+ "place_id": "5721647e-cd77-46b2-9bc5-0ac905ba58ad",
+ "base_position": "141,-60",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f393e5ff-6349-4502-a310-d7364d01df8a",
+ "base_position": "29,4",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "6a94231e-6623-4824-8981-f1ed3af8280b",
+ "base_position": "38,-5",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "9929b877-d61d-4ecf-8773-f2ceefc72de5",
+ "base_position": "27,86",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "3ac7160b-6d49-4fc8-ab0d-025edcc1276e",
+ "base_position": "42,-6",
+ "category_id": "music"
+ },
+ {
+ "place_id": "6cf6cfab-cb70-45b0-b392-fe140a1edb34",
+ "base_position": "94,28",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7265faed-3e74-43a6-b896-ca9511493080",
+ "base_position": "-25,5",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6310c62c-4f94-4c5b-869f-bfb78ea7bb55",
+ "base_position": "-22,74",
+ "category_id": "game"
+ },
+ {
+ "place_id": "81b9ec6d-a721-4351-937e-17dd9db2a244",
+ "base_position": "-55,127",
+ "category_id": "education"
+ },
+ {
+ "place_id": "847b4309-ee24-4d5f-9c31-5e81153bb73e",
+ "base_position": "48,-19",
+ "category_id": "social"
+ },
+ {
+ "place_id": "eaf719ad-6c4a-4060-a2e9-a91bab48058c",
+ "base_position": "-93,12",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "4ba02474-44b2-49b4-8567-5f1a24a6dded",
+ "base_position": "25,99",
+ "category_id": "social"
+ },
+ {
+ "place_id": "4ba02474-44b2-49b4-8567-5f1a24a6dded",
+ "base_position": "25,99",
+ "category_id": "education"
+ },
+ {
+ "place_id": "649f8c50-3739-45b3-8034-0e0bf885a191",
+ "base_position": "63,94",
+ "category_id": "game"
+ },
+ {
+ "place_id": "5eb2fdad-1c02-4647-b3a5-d4ce45f5501a",
+ "base_position": "65,-143",
+ "category_id": "art"
+ },
+ {
+ "place_id": "dfca0dcd-69e1-4bc4-9445-89c682a51724",
+ "base_position": "90,-35",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6d171659-bb5d-487a-aeb8-3e61abd17dd1",
+ "base_position": "41,8",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5c4b5aa7-1153-4338-89e4-afcfa5902c37",
+ "base_position": "87,-28",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5c4b5aa7-1153-4338-89e4-afcfa5902c37",
+ "base_position": "87,-28",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "78f823eb-41af-4de5-99e9-9f9e8c23d20a",
+ "base_position": "39,71",
+ "category_id": "art"
+ },
+ {
+ "place_id": "89b22595-afc2-4537-9d10-1ee0d4eed2e5",
+ "base_position": "55,-25",
+ "category_id": "social"
+ },
+ {
+ "place_id": "89b22595-afc2-4537-9d10-1ee0d4eed2e5",
+ "base_position": "55,-25",
+ "category_id": "art"
+ },
+ {
+ "place_id": "89b22595-afc2-4537-9d10-1ee0d4eed2e5",
+ "base_position": "55,-25",
+ "category_id": "education"
+ },
+ {
+ "place_id": "62aa0101-f326-4612-bf39-84b33a8007e3",
+ "base_position": "-69,32",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "5c99d712-fe95-4ba8-9848-4c2fa0e16332",
+ "base_position": "55,-7",
+ "category_id": "education"
+ },
+ {
+ "place_id": "0ecb268a-a7b3-468e-acc8-c9d75010e1fb",
+ "base_position": "91,-129",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0ecb268a-a7b3-468e-acc8-c9d75010e1fb",
+ "base_position": "91,-129",
+ "category_id": "social"
+ },
+ {
+ "place_id": "0ecb268a-a7b3-468e-acc8-c9d75010e1fb",
+ "base_position": "91,-129",
+ "category_id": "music"
+ },
+ {
+ "place_id": "eb1e602f-9f5e-4182-9263-6426e51ce365",
+ "base_position": "-32,13",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "18b14fdf-951d-4a85-b1b2-dc2bcbb6b548",
+ "base_position": "8,45",
+ "category_id": "art"
+ },
+ {
+ "place_id": "18b14fdf-951d-4a85-b1b2-dc2bcbb6b548",
+ "base_position": "8,45",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "3c00569a-02ae-4098-88b6-0e1853d4d279",
+ "base_position": "126,-8",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "dc457714-82ef-4cff-bf8b-69b8aa0dc891",
+ "base_position": "52,15",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ba3099ba-926b-4edb-b066-518e60601432",
+ "base_position": "-97,41",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ba3099ba-926b-4edb-b066-518e60601432",
+ "base_position": "-97,41",
+ "category_id": "music"
+ },
+ {
+ "place_id": "ba3099ba-926b-4edb-b066-518e60601432",
+ "base_position": "-97,41",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "6fb39d86-7cfc-46a0-8046-ccd29761dec3",
+ "base_position": "-6,-95",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "3b6d1288-c6f9-4281-910e-1e400c02e0cb",
+ "base_position": "145,-51",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f0edd4ce-c4e2-4b1e-9d62-588946c34aaa",
+ "base_position": "-93,88",
+ "category_id": "social"
+ },
+ {
+ "place_id": "0de26b3c-8124-4342-bf9c-2853e0c31cef",
+ "base_position": "-116,-99",
+ "category_id": "art"
+ },
+ {
+ "place_id": "eeda9084-51a0-4568-a2eb-f6fb510212c3",
+ "base_position": "27,-125",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f20dc7f8-b198-4651-8f56-c20b533268b3",
+ "base_position": "8,47",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f20dc7f8-b198-4651-8f56-c20b533268b3",
+ "base_position": "8,47",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "98712c92-8dca-4f82-8ae0-92cc7ac220a1",
+ "base_position": "-38,76",
+ "category_id": "game"
+ },
+ {
+ "place_id": "15656e41-7d10-4242-84ae-f51a971c434e",
+ "base_position": "69,-145",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4fef6a3e-c629-4a51-9392-238a6dcc03c9",
+ "base_position": "26,-10",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b3d0171e-7b8d-4ac0-b340-b2e5353bcdba",
+ "base_position": "137,-145",
+ "category_id": "game"
+ },
+ {
+ "place_id": "8af6a082-1ee3-4f8f-b8ab-384b89f8852a",
+ "base_position": "-44,74",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "27ce295e-01ab-4798-b1a8-1dd1a06d96b2",
+ "base_position": "-14,-57",
+ "category_id": "social"
+ },
+ {
+ "place_id": "27ce295e-01ab-4798-b1a8-1dd1a06d96b2",
+ "base_position": "-14,-57",
+ "category_id": "music"
+ },
+ {
+ "place_id": "3907c9c5-5ce2-430b-9df8-2bd152e4db2d",
+ "base_position": "-52,147",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3907c9c5-5ce2-430b-9df8-2bd152e4db2d",
+ "base_position": "-52,147",
+ "category_id": "education"
+ },
+ {
+ "place_id": "7031be33-970a-44a0-afe5-37172afced7c",
+ "base_position": "-67,38",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "c2b1a505-da94-467f-8a2a-2d4122337f1d",
+ "base_position": "-56,49",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "f46d505b-38a4-43ee-b7e1-58310a96be8e",
+ "base_position": "2,-47",
+ "category_id": "social"
+ },
+ {
+ "place_id": "f46d505b-38a4-43ee-b7e1-58310a96be8e",
+ "base_position": "2,-47",
+ "category_id": "music"
+ },
+ {
+ "place_id": "6661f20c-056d-41c6-b685-9b989a079213",
+ "base_position": "87,-22",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4ddf404a-37df-4048-a67e-102ec2b1b6a2",
+ "base_position": "-48,116",
+ "category_id": "social"
+ },
+ {
+ "place_id": "4ddf404a-37df-4048-a67e-102ec2b1b6a2",
+ "base_position": "-48,116",
+ "category_id": "music"
+ },
+ {
+ "place_id": "093646d8-774d-4d38-a152-ec6ef86d9b29",
+ "base_position": "-6,-94",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "4e2fb017-22c1-44e5-aff0-a7de6a042683",
+ "base_position": "85,-24",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2689e440-0085-41cf-bc9c-c188f936f00a",
+ "base_position": "-7,36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "63040b92-3856-40a1-aff6-5dbc33f194e7",
+ "base_position": "-84,14",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "9b0edbc7-13df-4651-a7d7-61604bcc4202",
+ "base_position": "130,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "9b0edbc7-13df-4651-a7d7-61604bcc4202",
+ "base_position": "130,-126",
+ "category_id": "education"
+ },
+ {
+ "place_id": "49190c9b-5939-4290-8158-fb08b4f7699b",
+ "base_position": "-91,12",
+ "category_id": "education"
+ },
+ {
+ "place_id": "5ce7e5b2-1a34-41a0-86b3-81e86975c0bb",
+ "base_position": "-66,32",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "58285615-e7d0-4f75-ae7e-6797edc05ab4",
+ "base_position": "131,-140",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "95ae93f9-a7a1-4742-a4c1-5e31f6ff2c85",
+ "base_position": "69,-27",
+ "category_id": "social"
+ },
+ {
+ "place_id": "5e981e0b-bdb7-4f3c-84d1-821ac94de12a",
+ "base_position": "36,11",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9c7dd4a5-73c7-4bac-a3f0-b011fce47d17",
+ "base_position": "139,-118",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "73935af8-9f74-42ea-858f-162774ba213d",
+ "base_position": "-32,68",
+ "category_id": "art"
+ },
+ {
+ "place_id": "73935af8-9f74-42ea-858f-162774ba213d",
+ "base_position": "-32,68",
+ "category_id": "social"
+ },
+ {
+ "place_id": "73935af8-9f74-42ea-858f-162774ba213d",
+ "base_position": "-32,68",
+ "category_id": "music"
+ },
+ {
+ "place_id": "cd4471e9-8748-4113-82c8-ba907e04fed2",
+ "base_position": "91,-22",
+ "category_id": "art"
+ },
+ {
+ "place_id": "fc126db9-8b3c-4ae9-a69f-f9bf30659f90",
+ "base_position": "-19,76",
+ "category_id": "game"
+ },
+ {
+ "place_id": "246dd2fe-ffb3-4ff7-8624-92413bfec8fe",
+ "base_position": "-4,-123",
+ "category_id": "social"
+ },
+ {
+ "place_id": "246dd2fe-ffb3-4ff7-8624-92413bfec8fe",
+ "base_position": "-4,-123",
+ "category_id": "music"
+ },
+ {
+ "place_id": "c7e283b9-b943-477c-b3e3-27bf6588ed70",
+ "base_position": "34,21",
+ "category_id": "social"
+ },
+ {
+ "place_id": "c7e283b9-b943-477c-b3e3-27bf6588ed70",
+ "base_position": "34,21",
+ "category_id": "music"
+ },
+ {
+ "place_id": "4735cfa4-68d2-4109-a53c-a2a8155ac8e0",
+ "base_position": "-64,148",
+ "category_id": "social"
+ },
+ {
+ "place_id": "4735cfa4-68d2-4109-a53c-a2a8155ac8e0",
+ "base_position": "-64,148",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4735cfa4-68d2-4109-a53c-a2a8155ac8e0",
+ "base_position": "-64,148",
+ "category_id": "education"
+ },
+ {
+ "place_id": "ec3ba705-887c-45f2-8f82-c3bac08762b7",
+ "base_position": "100,-102",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "7d95fcb8-d168-4cf4-9aba-6922e5090f16",
+ "base_position": "-104,-45",
+ "category_id": "social"
+ },
+ {
+ "place_id": "7d95fcb8-d168-4cf4-9aba-6922e5090f16",
+ "base_position": "-104,-45",
+ "category_id": "music"
+ },
+ {
+ "place_id": "5c81d6b0-9fc1-4615-b612-91d2b9a3201c",
+ "base_position": "-116,-30",
+ "category_id": "social"
+ },
+ {
+ "place_id": "68730c66-a633-4ca2-b54b-70673cc7df72",
+ "base_position": "-33,92",
+ "category_id": "education"
+ },
+ {
+ "place_id": "25947cb5-c779-4fff-b556-aed0752c5f55",
+ "base_position": "-19,-18",
+ "category_id": "art"
+ },
+ {
+ "place_id": "25947cb5-c779-4fff-b556-aed0752c5f55",
+ "base_position": "-19,-18",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e7d36b5e-7301-408d-a1df-1e6c09d28e8d",
+ "base_position": "2,67",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "91be4e68-e3f8-4bb0-bb5c-b4824beb22ac",
+ "base_position": "-17,73",
+ "category_id": "game"
+ },
+ {
+ "place_id": "ac592f9d-12d7-480d-b469-f25c525c798c",
+ "base_position": "-32,-53",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a5187814-a8fe-42f0-a74b-0d63c28fc2d5",
+ "base_position": "138,47",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9ce975bb-f33c-49d8-afd2-6bbf17c9d7a8",
+ "base_position": "2,70",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "c63cbf77-e21f-44dd-8238-7efd4b65efcb",
+ "base_position": "3,70",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "3f7e8072-0528-46f3-9930-433486c858fd",
+ "base_position": "16,86",
+ "category_id": "art"
+ },
+ {
+ "place_id": "057b1f8d-da48-46b0-8ab8-fd9514051707",
+ "base_position": "48,-70",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6765eefc-586d-4adc-978d-855c7e6f5508",
+ "base_position": "-24,23",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6765eefc-586d-4adc-978d-855c7e6f5508",
+ "base_position": "-24,23",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6765eefc-586d-4adc-978d-855c7e6f5508",
+ "base_position": "-24,23",
+ "category_id": "education"
+ },
+ {
+ "place_id": "c244e2d6-ca2c-43eb-83a0-93dee034871a",
+ "base_position": "6,61",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e97881ad-4de1-4bdb-a0ef-ed82cb28aede",
+ "base_position": "10,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e97881ad-4de1-4bdb-a0ef-ed82cb28aede",
+ "base_position": "10,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d925958b-8ac1-4e1b-97e6-f63ce40c99d9",
+ "base_position": "107,-133",
+ "category_id": "music"
+ },
+ {
+ "place_id": "33cea38d-2727-4ac3-85bf-73ee78104029",
+ "base_position": "-19,75",
+ "category_id": "game"
+ },
+ {
+ "place_id": "23503206-ce4c-44c6-ba21-3c75aceb8006",
+ "base_position": "90,-140",
+ "category_id": "art"
+ },
+ {
+ "place_id": "23503206-ce4c-44c6-ba21-3c75aceb8006",
+ "base_position": "90,-140",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "23503206-ce4c-44c6-ba21-3c75aceb8006",
+ "base_position": "90,-140",
+ "category_id": "education"
+ },
+ {
+ "place_id": "1c9eaf98-4b5a-4f07-9519-bc257a71b11d",
+ "base_position": "21,72",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d7f0f9e8-2961-4184-b824-035267330a48",
+ "base_position": "96,-111",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "0c405980-b44a-4f04-be63-919cb39cb2c1",
+ "base_position": "75,76",
+ "category_id": "social"
+ },
+ {
+ "place_id": "f769e32a-8ae1-4080-85af-7e1c1672fd57",
+ "base_position": "87,39",
+ "category_id": "game"
+ },
+ {
+ "place_id": "523755ba-401d-412a-8d05-c9b7c3c6a90a",
+ "base_position": "6,-69",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ab8b3cbe-7a45-406c-8a74-d5231596afe1",
+ "base_position": "-136,-34",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ab8b3cbe-7a45-406c-8a74-d5231596afe1",
+ "base_position": "-136,-34",
+ "category_id": "game"
+ },
+ {
+ "place_id": "8deada12-8600-40bd-8e79-79bcbd07f2e0",
+ "base_position": "-18,76",
+ "category_id": "game"
+ },
+ {
+ "place_id": "15503557-20d6-4076-9d5f-b26e22076a30",
+ "base_position": "-116,-47",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ab039fba-5136-4704-9333-57f8d56ae965",
+ "base_position": "-126,-74",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ab039fba-5136-4704-9333-57f8d56ae965",
+ "base_position": "-126,-74",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d32660b1-c977-4d99-a84d-a7f766518962",
+ "base_position": "-125,-94",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a7b67cd5-40ff-482f-a203-2eda8fb04fb3",
+ "base_position": "25,-48",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a7b67cd5-40ff-482f-a203-2eda8fb04fb3",
+ "base_position": "25,-48",
+ "category_id": "education"
+ },
+ {
+ "place_id": "68400b61-5c55-49d8-b940-8d8baa492076",
+ "base_position": "-79,-113",
+ "category_id": "art"
+ },
+ {
+ "place_id": "68400b61-5c55-49d8-b940-8d8baa492076",
+ "base_position": "-79,-113",
+ "category_id": "education"
+ },
+ {
+ "place_id": "2ab6b38d-8ef8-429e-86a5-9e2f71cc485c",
+ "base_position": "30,25",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2ab6b38d-8ef8-429e-86a5-9e2f71cc485c",
+ "base_position": "30,25",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "39b89da0-5a5e-445b-8ab9-ae55c463d268",
+ "base_position": "-29,7",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "f0cf4ca4-258e-406c-8c96-2890fc90a44f",
+ "base_position": "106,-133",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6f3095c3-119b-44bc-87f9-fbc551645a35",
+ "base_position": "44,87",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6f3095c3-119b-44bc-87f9-fbc551645a35",
+ "base_position": "44,87",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6f3095c3-119b-44bc-87f9-fbc551645a35",
+ "base_position": "44,87",
+ "category_id": "education"
+ },
+ {
+ "place_id": "f2f9cde3-45d4-4dfa-85cd-7bd9fa8319b5",
+ "base_position": "-37,84",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "c16987b5-28f7-44b7-addd-8942e259da1e",
+ "base_position": "14,40",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c16987b5-28f7-44b7-addd-8942e259da1e",
+ "base_position": "14,40",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "9e416bf9-283b-4cb6-86cb-fdfc56455266",
+ "base_position": "128,-101",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "9e416bf9-283b-4cb6-86cb-fdfc56455266",
+ "base_position": "128,-101",
+ "category_id": "art"
+ },
+ {
+ "place_id": "27ee4160-552e-4955-a89d-1f96db9e0306",
+ "base_position": "21,-113",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "8fe0009e-ea16-444e-b120-752c1242fbf9",
+ "base_position": "23,-140",
+ "category_id": "education"
+ },
+ {
+ "place_id": "7ee7f031-1f53-46ef-b51b-325caa0fdd34",
+ "base_position": "39,-7",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e3056b78-64f9-4854-9102-bda3592101df",
+ "base_position": "-1,-115",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "05a6fa30-4b20-4e13-9d3f-27ffd367c79b",
+ "base_position": "51,-121",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "284138aa-d203-4d80-aa1c-5e77daba10e7",
+ "base_position": "-95,7",
+ "category_id": "social"
+ },
+ {
+ "place_id": "284138aa-d203-4d80-aa1c-5e77daba10e7",
+ "base_position": "-95,7",
+ "category_id": "music"
+ },
+ {
+ "place_id": "d4af5a36-cfb9-4957-b945-580f3b5bae1f",
+ "base_position": "23,49",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d4af5a36-cfb9-4957-b945-580f3b5bae1f",
+ "base_position": "23,49",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d4af5a36-cfb9-4957-b945-580f3b5bae1f",
+ "base_position": "23,49",
+ "category_id": "music"
+ },
+ {
+ "place_id": "fa8e6541-3c2a-4616-ba3e-21dc4fd0b692",
+ "base_position": "-64,6",
+ "category_id": "art"
+ },
+ {
+ "place_id": "86e7af34-86e7-4512-b4c2-4f8ff61fbd54",
+ "base_position": "48,72",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c093813e-975a-4386-9507-18d925aa3b0b",
+ "base_position": "33,6",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "cdf7d911-61a6-4047-8179-bd7cd4c71dba",
+ "base_position": "-67,119",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6284cda6-3687-4333-b038-e1174b7aaffd",
+ "base_position": "-108,21",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "bf7e4827-a99a-4e72-a343-a68cce0d24b4",
+ "base_position": "-6,-120",
+ "category_id": "game"
+ },
+ {
+ "place_id": "59fc02f8-1380-421e-a1b5-007823f80551",
+ "base_position": "-46,67",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "3b4f364f-89e2-46e6-8a56-11bdd8369052",
+ "base_position": "78,-138",
+ "category_id": "social"
+ },
+ {
+ "place_id": "3b4f364f-89e2-46e6-8a56-11bdd8369052",
+ "base_position": "78,-138",
+ "category_id": "music"
+ },
+ {
+ "place_id": "c31db85a-c9bf-4dd5-ba11-e950f4529c49",
+ "base_position": "35,-130",
+ "category_id": "music"
+ },
+ {
+ "place_id": "4bdc1be2-e1bd-4db9-b187-6132d9000dd3",
+ "base_position": "43,86",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4bdc1be2-e1bd-4db9-b187-6132d9000dd3",
+ "base_position": "43,86",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "4bdc1be2-e1bd-4db9-b187-6132d9000dd3",
+ "base_position": "43,86",
+ "category_id": "education"
+ },
+ {
+ "place_id": "6d03fa4c-2b20-46c5-84f5-774675c19d59",
+ "base_position": "-66,120",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f6b417a2-c400-4eb6-b9ba-b5b5a2e4a22d",
+ "base_position": "25,-60",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0cf121c3-c377-490c-abb5-7c458df6a0bd",
+ "base_position": "25,-125",
+ "category_id": "social"
+ },
+ {
+ "place_id": "0cf121c3-c377-490c-abb5-7c458df6a0bd",
+ "base_position": "25,-125",
+ "category_id": "education"
+ },
+ {
+ "place_id": "917208a7-3353-44d1-a252-388f7d48b63c",
+ "base_position": "30,-25",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "46ac6557-eebb-4d7e-8475-6258aa375096",
+ "base_position": "-21,-107",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c70766ea-12e0-4926-b5f6-0f318a3c77e6",
+ "base_position": "12,54",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "e83d1399-ca90-4031-a1b7-3e82a147fa4f",
+ "base_position": "89,-85",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "946014df-30f4-4404-bb85-e71bc7450bbf",
+ "base_position": "-86,-38",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "a73e7143-361d-4599-ae34-d3271b5baee1",
+ "base_position": "35,-70",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d027893b-4f57-4ef9-bbcb-1b877ed4dce8",
+ "base_position": "120,-21",
+ "category_id": "art"
+ },
+ {
+ "place_id": "10a12b20-6891-49a8-8c24-2a85e0bc2215",
+ "base_position": "35,-29",
+ "category_id": "art"
+ },
+ {
+ "place_id": "162b38d5-c875-47db-ad87-1c52b8a9d44b",
+ "base_position": "6,144",
+ "category_id": "education"
+ },
+ {
+ "place_id": "b7d1943b-e0d7-4d2f-9a8f-12c6e5f2cefe",
+ "base_position": "143,-58",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b7d1943b-e0d7-4d2f-9a8f-12c6e5f2cefe",
+ "base_position": "143,-58",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4452c16d-6dff-49a1-a75c-cec43326181e",
+ "base_position": "59,132",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "281cdede-0827-442b-a673-e13c3141b9f9",
+ "base_position": "6,62",
+ "category_id": "art"
+ },
+ {
+ "place_id": "281cdede-0827-442b-a673-e13c3141b9f9",
+ "base_position": "6,62",
+ "category_id": "social"
+ },
+ {
+ "place_id": "281cdede-0827-442b-a673-e13c3141b9f9",
+ "base_position": "6,62",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a2431dd1-f304-4fa1-8961-c1013b99c602",
+ "base_position": "6,-40",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "f0706d97-c57b-4251-b868-535338bccab1",
+ "base_position": "94,-94",
+ "category_id": "social"
+ },
+ {
+ "place_id": "f0706d97-c57b-4251-b868-535338bccab1",
+ "base_position": "94,-94",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "12bf8632-c0df-4494-905c-a0987f0ba926",
+ "base_position": "-48,33",
+ "category_id": "social"
+ },
+ {
+ "place_id": "12bf8632-c0df-4494-905c-a0987f0ba926",
+ "base_position": "-48,33",
+ "category_id": "music"
+ },
+ {
+ "place_id": "3ae3c4c7-4ff6-4ae7-ab0b-1380ccfc29a7",
+ "base_position": "-15,-55",
+ "category_id": "social"
+ },
+ {
+ "place_id": "3ae3c4c7-4ff6-4ae7-ab0b-1380ccfc29a7",
+ "base_position": "-15,-55",
+ "category_id": "music"
+ },
+ {
+ "place_id": "544c0214-50e0-4031-8298-1c9c9f7a8da3",
+ "base_position": "-43,74",
+ "category_id": "art"
+ },
+ {
+ "place_id": "58f58d4b-8286-46b2-91dd-dd58b501a3b2",
+ "base_position": "135,-25",
+ "category_id": "education"
+ },
+ {
+ "place_id": "9f1232ca-1041-4ec3-8823-a6c2986e6843",
+ "base_position": "-134,-120",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b11a41bd-dbef-44e1-84a9-2db7b4133b0d",
+ "base_position": "-63,-5",
+ "category_id": "social"
+ },
+ {
+ "place_id": "450d81ce-cab4-493d-b73b-959150c6fbcc",
+ "base_position": "12,-117",
+ "category_id": "social"
+ },
+ {
+ "place_id": "450d81ce-cab4-493d-b73b-959150c6fbcc",
+ "base_position": "12,-117",
+ "category_id": "music"
+ },
+ {
+ "place_id": "b2fd5677-f84e-4a70-8ea1-f545a234a08e",
+ "base_position": "8,-112",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b2fd5677-f84e-4a70-8ea1-f545a234a08e",
+ "base_position": "8,-112",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a2a05d3f-bf1f-4085-96f6-19100d5ec5fa",
+ "base_position": "-80,-68",
+ "category_id": "art"
+ },
+ {
+ "place_id": "57b4ce12-5a53-4e69-aa39-b1f82e517f39",
+ "base_position": "70,-17",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "531f7664-11a5-4eb8-985b-15418455feaf",
+ "base_position": "58,-8",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d47a0b10-ed04-48bb-9277-9249ba9dc016",
+ "base_position": "-20,30",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9585be80-e043-4857-9ddb-d209717174eb",
+ "base_position": "144,-14",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "8f9e2f1f-5039-4c2b-9f68-8c6dd1e7adf9",
+ "base_position": "109,-31",
+ "category_id": "music"
+ },
+ {
+ "place_id": "ba1faab6-4b41-4533-b7d6-cb1ac063c999",
+ "base_position": "59,-139",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ba1faab6-4b41-4533-b7d6-cb1ac063c999",
+ "base_position": "59,-139",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e563a368-b93f-429c-8dcd-d450f8046f3a",
+ "base_position": "86,-149",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "1f37a875-0bb6-46c7-90e6-093c44e961d3",
+ "base_position": "21,43",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1f37a875-0bb6-46c7-90e6-093c44e961d3",
+ "base_position": "21,43",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b6a53165-3499-4f0a-9db5-a84a64e7248f",
+ "base_position": "-64,41",
+ "category_id": "game"
+ },
+ {
+ "place_id": "571b0cd4-5b45-4f79-b205-b5b0b3ac0bb2",
+ "base_position": "72,13",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "0cb5cc7b-2689-4d7b-b248-ba09d2795efe",
+ "base_position": "108,-34",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9761b830-d751-467e-8b2f-a60dccf69fdd",
+ "base_position": "4,68",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "3874949a-a818-4a5b-893e-cd7c05f35f32",
+ "base_position": "35,12",
+ "category_id": "art"
+ },
+ {
+ "place_id": "731834a6-68b2-4c83-9bd0-f3027cd07456",
+ "base_position": "-8,29",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "f79a51e2-afee-455c-b9cd-7a1c72c14e90",
+ "base_position": "8,43",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f79a51e2-afee-455c-b9cd-7a1c72c14e90",
+ "base_position": "8,43",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ae24066f-85a3-49fa-addc-48928ebd1adc",
+ "base_position": "-42,110",
+ "category_id": "game"
+ },
+ {
+ "place_id": "96ae58e6-e7dc-4c04-8661-04ceca0a8c8a",
+ "base_position": "8,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "96ae58e6-e7dc-4c04-8661-04ceca0a8c8a",
+ "base_position": "8,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "0f1cd992-cbed-496e-b803-51ed86fa9c93",
+ "base_position": "36,110",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "8e8f9ed9-4cae-4814-a550-502770301c6b",
+ "base_position": "-59,30",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7353a69d-8085-4311-becf-ee2c96b1a7b8",
+ "base_position": "-114,-44",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d863dc60-b9d2-4cea-977e-607638ba8527",
+ "base_position": "-20,-21",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2558b6a9-35cc-428d-9234-cc3abc922601",
+ "base_position": "-120,-24",
+ "category_id": "education"
+ },
+ {
+ "place_id": "2fe2b98d-e8c0-4bb3-9f5d-2f64b9298416",
+ "base_position": "30,9",
+ "category_id": "social"
+ },
+ {
+ "place_id": "150f1e6a-6996-4a51-8556-cd2bbdce75ab",
+ "base_position": "-123,32",
+ "category_id": "art"
+ },
+ {
+ "place_id": "150f1e6a-6996-4a51-8556-cd2bbdce75ab",
+ "base_position": "-123,32",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d7c3fe0a-a08f-4b4c-b1bc-a70e5b22def7",
+ "base_position": "4,70",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "47a03b3f-bc35-46ae-82ef-829589fc472e",
+ "base_position": "2,68",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "424a1713-94e0-4962-a52f-591b058f5476",
+ "base_position": "-139,-123",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "c9c559dc-df48-4017-8352-845e69b8811d",
+ "base_position": "74,39",
+ "category_id": "game"
+ },
+ {
+ "place_id": "f6b11c7b-5a79-4537-8e8c-7ec3c5775a47",
+ "base_position": "4,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f6b11c7b-5a79-4537-8e8c-7ec3c5775a47",
+ "base_position": "4,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "dd020b62-a8a7-43f0-b680-41b99855b181",
+ "base_position": "8,30",
+ "category_id": "art"
+ },
+ {
+ "place_id": "dd020b62-a8a7-43f0-b680-41b99855b181",
+ "base_position": "8,30",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "1ad719bf-6b40-46c8-b5e0-b801cf8af76c",
+ "base_position": "91,-130",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1ad719bf-6b40-46c8-b5e0-b801cf8af76c",
+ "base_position": "91,-130",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "62f114e7-7452-443b-969b-172d9ef0acf2",
+ "base_position": "98,33",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f4b14897-14b4-404a-b6a2-6a559f7025c1",
+ "base_position": "-10,-53",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f4b14897-14b4-404a-b6a2-6a559f7025c1",
+ "base_position": "-10,-53",
+ "category_id": "social"
+ },
+ {
+ "place_id": "f4b14897-14b4-404a-b6a2-6a559f7025c1",
+ "base_position": "-10,-53",
+ "category_id": "music"
+ },
+ {
+ "place_id": "d015a7ce-b330-4765-a95d-6d5de52a3406",
+ "base_position": "-57,132",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d015a7ce-b330-4765-a95d-6d5de52a3406",
+ "base_position": "-57,132",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e60a6fba-aea8-4ffc-8353-025b53420402",
+ "base_position": "-130,-27",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "b2079222-af62-44ff-940e-76378239b3c4",
+ "base_position": "-134,-27",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "0a137e5e-81a5-4db3-b810-dc46e0c5acd0",
+ "base_position": "127,-14",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "749eeb56-74fa-4181-b10c-f766036364dc",
+ "base_position": "-49,107",
+ "category_id": "social"
+ },
+ {
+ "place_id": "749eeb56-74fa-4181-b10c-f766036364dc",
+ "base_position": "-49,107",
+ "category_id": "music"
+ },
+ {
+ "place_id": "9838b32c-f82b-487e-a1de-71ddd581d99c",
+ "base_position": "-70,112",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "d3d3c75f-796a-4db3-b3e0-23669b61491b",
+ "base_position": "129,-9",
+ "category_id": "game"
+ },
+ {
+ "place_id": "01dcb569-d3d5-4f21-8cda-851f21ae1452",
+ "base_position": "74,-144",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f49ca139-bf72-4eae-b0de-c2ddaa1ad3ff",
+ "base_position": "121,-13",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d50a87c9-efe2-4d75-b03f-20ecf9d9e15b",
+ "base_position": "87,-25",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a1877f85-02ff-411e-bcbd-e250cc6258bb",
+ "base_position": "12,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a1877f85-02ff-411e-bcbd-e250cc6258bb",
+ "base_position": "12,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ec954d37-a48b-4e90-8431-2cbd668acd6b",
+ "base_position": "-37,48",
+ "category_id": "education"
+ },
+ {
+ "place_id": "73d51044-048c-46f6-b2f6-01355a421031",
+ "base_position": "88,18",
+ "category_id": "art"
+ },
+ {
+ "place_id": "083ae13c-6c2c-4427-9521-cf1ab42002ba",
+ "base_position": "-128,32",
+ "category_id": "art"
+ },
+ {
+ "place_id": "083ae13c-6c2c-4427-9521-cf1ab42002ba",
+ "base_position": "-128,32",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "22f42f3d-0008-4fb0-878e-042b6b024283",
+ "base_position": "-60,-13",
+ "category_id": "game"
+ },
+ {
+ "place_id": "83399b43-51f1-4f18-a3d4-511606c67fa8",
+ "base_position": "145,-31",
+ "category_id": "art"
+ },
+ {
+ "place_id": "337f16ee-d953-408d-887f-37ebe89c4af4",
+ "base_position": "-65,32",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "e6e4122d-c4b9-4004-8134-0a9c9a228852",
+ "base_position": "139,47",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5694dd9d-2114-4e13-b7e1-1f95c5fdb814",
+ "base_position": "73,13",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "5694dd9d-2114-4e13-b7e1-1f95c5fdb814",
+ "base_position": "73,13",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ce2a9fff-40f9-4547-933a-ac784009f79b",
+ "base_position": "43,79",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b354b80f-0fee-4902-a87d-937ff99b6545",
+ "base_position": "18,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b354b80f-0fee-4902-a87d-937ff99b6545",
+ "base_position": "18,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5aa62e97-af6a-42f6-8751-8f10852d5e5b",
+ "base_position": "20,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5aa62e97-af6a-42f6-8751-8f10852d5e5b",
+ "base_position": "20,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "43a15d70-aae6-4337-a80f-130d2472f56c",
+ "base_position": "-66,34",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "593c7106-9f56-419d-8cd2-3c4aaee8814b",
+ "base_position": "22,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "593c7106-9f56-419d-8cd2-3c4aaee8814b",
+ "base_position": "22,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "3c07e01c-2ece-492c-9eea-0bf4fdcf5974",
+ "base_position": "14,42",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3c07e01c-2ece-492c-9eea-0bf4fdcf5974",
+ "base_position": "14,42",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "429e14a2-9f26-4552-85a8-838a1c2ada40",
+ "base_position": "21,-52",
+ "category_id": "education"
+ },
+ {
+ "place_id": "f2680907-9d87-44a9-9e66-ec3b0e6ce87d",
+ "base_position": "-67,32",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ba1655ee-14dc-4c57-8823-fd6518c46541",
+ "base_position": "4,69",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "470cafce-89be-48b8-8afe-a58d1823f928",
+ "base_position": "16,-120",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f2eef089-d2cf-436d-a86c-8c3b92fcded4",
+ "base_position": "36,12",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8dfd0b44-0fff-4f0e-95d1-2cd840ef09c0",
+ "base_position": "-68,32",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "057bc513-82c6-4efa-aecf-ec502f339f74",
+ "base_position": "8,27",
+ "category_id": "art"
+ },
+ {
+ "place_id": "057bc513-82c6-4efa-aecf-ec502f339f74",
+ "base_position": "8,27",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "0daeedf8-5290-464b-876e-7e7c893dc4f1",
+ "base_position": "-86,-81",
+ "category_id": "art"
+ },
+ {
+ "place_id": "70b4c1de-b022-4ba1-aebd-a858d1e49928",
+ "base_position": "-129,65",
+ "category_id": "social"
+ },
+ {
+ "place_id": "70b4c1de-b022-4ba1-aebd-a858d1e49928",
+ "base_position": "-129,65",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "1a1fbe0c-04da-4e2a-b595-00b87cb0734c",
+ "base_position": "35,85",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "b8326584-e2bc-4ae0-873d-f47d6241fc35",
+ "base_position": "-116,-95",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "630babc8-ba65-457b-beca-c7918b4ccd54",
+ "base_position": "111,-30",
+ "category_id": "social"
+ },
+ {
+ "place_id": "630babc8-ba65-457b-beca-c7918b4ccd54",
+ "base_position": "111,-30",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a3e5622b-271d-4235-a2d1-13b2c1b74274",
+ "base_position": "32,-118",
+ "category_id": "art"
+ },
+ {
+ "place_id": "98a1e748-5925-4550-b48b-be351a22deb6",
+ "base_position": "85,-27",
+ "category_id": "art"
+ },
+ {
+ "place_id": "bebf1f83-6ebb-4a18-9b9f-da6062aa0e76",
+ "base_position": "-130,91",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a6e4c9a2-a692-459c-b2e3-ef4f7490e11a",
+ "base_position": "34,-49",
+ "category_id": "social"
+ },
+ {
+ "place_id": "bf961c3d-7c72-4565-8fcd-7284b08c5f67",
+ "base_position": "-120,21",
+ "category_id": "art"
+ },
+ {
+ "place_id": "24bf213f-57e1-4402-9abe-50e3d0894e4f",
+ "base_position": "-64,32",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "0b5a1d46-0074-465c-b024-29db62b5941c",
+ "base_position": "-31,44",
+ "category_id": "social"
+ },
+ {
+ "place_id": "082dc2ca-01d9-4a70-8689-fe9d25a8b809",
+ "base_position": "38,-55",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5d5fcf1b-cb63-4edb-b607-79cfb62eb6f4",
+ "base_position": "-26,-4",
+ "category_id": "social"
+ },
+ {
+ "place_id": "5d5fcf1b-cb63-4edb-b607-79cfb62eb6f4",
+ "base_position": "-26,-4",
+ "category_id": "music"
+ },
+ {
+ "place_id": "8e45983b-cfed-46a0-985f-c66232ea4f61",
+ "base_position": "56,40",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a0f5b01e-80a0-48d8-8f83-93ca60604c84",
+ "base_position": "-21,73",
+ "category_id": "game"
+ },
+ {
+ "place_id": "09d462ed-87de-40d0-9eea-8bc57779dcbe",
+ "base_position": "44,101",
+ "category_id": "art"
+ },
+ {
+ "place_id": "09d462ed-87de-40d0-9eea-8bc57779dcbe",
+ "base_position": "44,101",
+ "category_id": "music"
+ },
+ {
+ "place_id": "5314a72f-9a3c-47e6-a358-a4fc55a2c51c",
+ "base_position": "33,-83",
+ "category_id": "game"
+ },
+ {
+ "place_id": "9b7510a4-e65e-4c4e-9c64-832895c169ba",
+ "base_position": "128,-8",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "5936883c-5bbe-408d-a85e-b2e05203d4e6",
+ "base_position": "-93,25",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2ea06276-263b-407d-9c9a-dabe2fb08355",
+ "base_position": "-83,-37",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "f47d9f82-fb04-46e9-93db-f4b38f16b006",
+ "base_position": "-49,148",
+ "category_id": "social"
+ },
+ {
+ "place_id": "a511e392-5222-4123-a9d0-bf4e640c62b7",
+ "base_position": "101,-28",
+ "category_id": "game"
+ },
+ {
+ "place_id": "a511e392-5222-4123-a9d0-bf4e640c62b7",
+ "base_position": "101,-28",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "f2a8435d-8b6b-48d5-aaf9-d8f891f2ea4a",
+ "base_position": "-29,-33",
+ "category_id": "art"
+ },
+ {
+ "place_id": "31c562bf-df90-4372-bfec-df330bfbbabc",
+ "base_position": "-28,30",
+ "category_id": "social"
+ },
+ {
+ "place_id": "31c562bf-df90-4372-bfec-df330bfbbabc",
+ "base_position": "-28,30",
+ "category_id": "music"
+ },
+ {
+ "place_id": "e25012e1-f68d-4d76-bf65-8fc6d08e1d16",
+ "base_position": "128,-125",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "8614c363-e660-489f-b147-37c442e50383",
+ "base_position": "-31,19",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "0425582b-1ffa-4a82-9706-5ee4aeaa1cf3",
+ "base_position": "23,142",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "6fcac2b1-a4da-418d-894a-99827e2cc96e",
+ "base_position": "-22,73",
+ "category_id": "game"
+ },
+ {
+ "place_id": "5e5a241d-3a7d-474c-9f53-36b5fbd6e195",
+ "base_position": "89,-30",
+ "category_id": "art"
+ },
+ {
+ "place_id": "854b1d89-59b0-490d-adde-387aa751e152",
+ "base_position": "-74,-48",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2febc08a-9876-450a-a852-4938a07113b0",
+ "base_position": "-136,25",
+ "category_id": "game"
+ },
+ {
+ "place_id": "3db58d21-db07-431a-9c9f-80691b188325",
+ "base_position": "21,-103",
+ "category_id": "social"
+ },
+ {
+ "place_id": "3db58d21-db07-431a-9c9f-80691b188325",
+ "base_position": "21,-103",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3db58d21-db07-431a-9c9f-80691b188325",
+ "base_position": "21,-103",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ed66cabd-7d94-415a-91b3-6a4413609241",
+ "base_position": "121,35",
+ "category_id": "game"
+ },
+ {
+ "place_id": "376f46dd-470b-49ed-b795-678e8add6888",
+ "base_position": "-22,22",
+ "category_id": "social"
+ },
+ {
+ "place_id": "376f46dd-470b-49ed-b795-678e8add6888",
+ "base_position": "-22,22",
+ "category_id": "music"
+ },
+ {
+ "place_id": "1c3d63db-feb4-4848-b53a-6a86591f3392",
+ "base_position": "40,-57",
+ "category_id": "social"
+ },
+ {
+ "place_id": "1c3d63db-feb4-4848-b53a-6a86591f3392",
+ "base_position": "40,-57",
+ "category_id": "music"
+ },
+ {
+ "place_id": "1d971802-a0c2-4a3b-832d-cd2f27aa8d52",
+ "base_position": "55,132",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e9730bbe-843a-4ea3-a351-5b554b8a6ca3",
+ "base_position": "-32,-117",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "37236f4f-c833-408a-985f-f49df58fb7a1",
+ "base_position": "-45,118",
+ "category_id": "social"
+ },
+ {
+ "place_id": "37236f4f-c833-408a-985f-f49df58fb7a1",
+ "base_position": "-45,118",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a2a04fe2-23e7-4940-ba6b-9c8e31d1ecfe",
+ "base_position": "80,-137",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e2be8ef2-e796-48c0-b0e3-9f5141e66e74",
+ "base_position": "14,38",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e2be8ef2-e796-48c0-b0e3-9f5141e66e74",
+ "base_position": "14,38",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e39011a8-e7a9-4cbf-a807-fa43cb901d0e",
+ "base_position": "45,39",
+ "category_id": "education"
+ },
+ {
+ "place_id": "45d73061-28a8-4c01-8ee5-ca14feac38f0",
+ "base_position": "-93,22",
+ "category_id": "social"
+ },
+ {
+ "place_id": "45d73061-28a8-4c01-8ee5-ca14feac38f0",
+ "base_position": "-93,22",
+ "category_id": "art"
+ },
+ {
+ "place_id": "45d73061-28a8-4c01-8ee5-ca14feac38f0",
+ "base_position": "-93,22",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "bef1dc7a-7759-4a23-bc67-8f7a2582d8ad",
+ "base_position": "70,18",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "1e1e89e2-5318-41c4-b02d-e46e1a03e703",
+ "base_position": "-62,32",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "5c368080-4f5c-4b42-8c25-c06431ab4d22",
+ "base_position": "-24,-12",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "9e064e58-2903-4a19-8dc7-36dd8aa190b6",
+ "base_position": "-4,-95",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "8202002d-b99c-4c7c-9819-ed34b8e8f80f",
+ "base_position": "27,-113",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5cca0c5f-fdf9-4597-8244-aeb884b83d64",
+ "base_position": "28,9",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "7c5df44a-7a4a-45aa-8958-028a6ff2b2fc",
+ "base_position": "100,33",
+ "category_id": "game"
+ },
+ {
+ "place_id": "a3efdd96-7dc3-4321-942b-fb9d8188dda1",
+ "base_position": "-57,145",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "7ec26cba-9316-4595-a3f2-388ca3f06c2b",
+ "base_position": "73,15",
+ "category_id": "art"
+ },
+ {
+ "place_id": "afc34d9e-9c45-42d0-9aa7-cfd90c5656b0",
+ "base_position": "74,38",
+ "category_id": "game"
+ },
+ {
+ "place_id": "a849cee6-1008-48aa-a5d0-b5de2f85f2b9",
+ "base_position": "135,-149",
+ "category_id": "education"
+ },
+ {
+ "place_id": "714a246f-117e-4eff-b638-7fb718d306a9",
+ "base_position": "-76,36",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "e2d5c19d-3ed7-4f9b-9d40-1560ff4cd572",
+ "base_position": "-127,65",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "9a6cb501-e2d7-42ca-b589-3d992dd331f0",
+ "base_position": "-113,-62",
+ "category_id": "social"
+ },
+ {
+ "place_id": "32103cc9-847c-4b49-a4b2-738149d006a4",
+ "base_position": "-149,22",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ce9716b2-3d16-4bc8-b345-d0f6bf83d0e0",
+ "base_position": "58,47",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9c0bf003-0d7e-474c-9daa-4f5c4f24ebec",
+ "base_position": "90,-149",
+ "category_id": "art"
+ },
+ {
+ "place_id": "bc41c0ea-26e1-489f-af45-636fb6b1bd64",
+ "base_position": "58,139",
+ "category_id": "social"
+ },
+ {
+ "place_id": "bc41c0ea-26e1-489f-af45-636fb6b1bd64",
+ "base_position": "58,139",
+ "category_id": "music"
+ },
+ {
+ "place_id": "739e7a61-8c62-496d-afc7-9632a8273d2a",
+ "base_position": "37,-29",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1d658322-164d-4917-b7aa-141ca3995853",
+ "base_position": "57,-128",
+ "category_id": "music"
+ },
+ {
+ "place_id": "7faf6586-9ca8-4126-85b2-bfb4e33509b8",
+ "base_position": "-66,35",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "0a400782-7351-4489-a63c-f84799e790a4",
+ "base_position": "-64,-7",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "58ccd241-0120-4aa6-b6fa-3014cd6deee1",
+ "base_position": "19,-145",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "0a80fe50-f0bd-4fa5-9d17-a431ec158421",
+ "base_position": "85,55",
+ "category_id": "game"
+ },
+ {
+ "place_id": "dedabe87-a409-4c70-9333-d455a641d222",
+ "base_position": "-112,3",
+ "category_id": "game"
+ },
+ {
+ "place_id": "baeb1666-a8c4-449c-a6c1-365e13dcd096",
+ "base_position": "-27,23",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "baeb1666-a8c4-449c-a6c1-365e13dcd096",
+ "base_position": "-27,23",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "5d48a4c7-9da6-4662-86aa-7e0e18c96be2",
+ "base_position": "-19,74",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4e7ade69-301c-478e-a825-0ff2b31bf897",
+ "base_position": "48,14",
+ "category_id": "art"
+ },
+ {
+ "place_id": "069dece3-5968-4f39-8421-e9f371f0dc9e",
+ "base_position": "-45,129",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4ca00b41-92c2-4b1b-9e05-999307a1de39",
+ "base_position": "81,-138",
+ "category_id": "social"
+ },
+ {
+ "place_id": "4ca00b41-92c2-4b1b-9e05-999307a1de39",
+ "base_position": "81,-138",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a3be4c42-8a51-450a-9fd1-655e34e63a86",
+ "base_position": "-39,-100",
+ "category_id": "social"
+ },
+ {
+ "place_id": "a3be4c42-8a51-450a-9fd1-655e34e63a86",
+ "base_position": "-39,-100",
+ "category_id": "music"
+ },
+ {
+ "place_id": "efdac151-30f0-4d75-8d63-1b66eddb6c6f",
+ "base_position": "45,61",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1935285a-d018-4725-a70b-d4f5cc10a044",
+ "base_position": "140,-17",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8c65314f-a437-44a7-a47c-0acc4f705fa7",
+ "base_position": "-56,119",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f7ca0bd1-e5ae-466b-b096-8355eab2c3e7",
+ "base_position": "95,-26",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2f08e6ac-36d3-4828-b4fd-756cbd1f3328",
+ "base_position": "-109,-27",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "12a8dcbe-2350-45f3-a396-cf9136baecbb",
+ "base_position": "25,-4",
+ "category_id": "art"
+ },
+ {
+ "place_id": "97031387-fd29-4677-b059-ea213afddffc",
+ "base_position": "136,63",
+ "category_id": "social"
+ },
+ {
+ "place_id": "29e3b375-f54d-48fe-a63c-540eab5b08b1",
+ "base_position": "-39,11",
+ "category_id": "art"
+ },
+ {
+ "place_id": "fa67f1fb-beeb-46d8-af13-dda6e418c4a7",
+ "base_position": "-79,42",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "7e32b775-a588-46d9-b239-8674479b1537",
+ "base_position": "19,55",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7e32b775-a588-46d9-b239-8674479b1537",
+ "base_position": "19,55",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "227a8ff7-2b93-436c-98d1-a6ac188ad7ff",
+ "base_position": "-19,47",
+ "category_id": "social"
+ },
+ {
+ "place_id": "227a8ff7-2b93-436c-98d1-a6ac188ad7ff",
+ "base_position": "-19,47",
+ "category_id": "music"
+ },
+ {
+ "place_id": "74ddfe29-8273-4d78-8d1f-15f399982010",
+ "base_position": "-117,-33",
+ "category_id": "art"
+ },
+ {
+ "place_id": "74ddfe29-8273-4d78-8d1f-15f399982010",
+ "base_position": "-117,-33",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "231d2ab8-10ea-4203-a5d5-715c25225bae",
+ "base_position": "-56,-11",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "4a787d5a-98bc-43f8-950a-12d3a7905082",
+ "base_position": "13,-94",
+ "category_id": "art"
+ },
+ {
+ "place_id": "84f5f6e1-449c-4da4-8337-97709f1bd237",
+ "base_position": "-65,34",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "c4c979f3-a306-4203-932a-49ea647584ed",
+ "base_position": "58,-9",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f237c50a-0292-4f46-a02b-fa6c242236fc",
+ "base_position": "130,-113",
+ "category_id": "art"
+ },
+ {
+ "place_id": "dc4e5d17-7961-41dd-b8e4-0e0355904ac0",
+ "base_position": "-63,32",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "8c68d1df-6012-4457-bdc7-f7b07bd77902",
+ "base_position": "-64,-6",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6e374c99-a01a-4185-ab0c-afa881260d39",
+ "base_position": "20,103",
+ "category_id": "social"
+ },
+ {
+ "place_id": "6e374c99-a01a-4185-ab0c-afa881260d39",
+ "base_position": "20,103",
+ "category_id": "education"
+ },
+ {
+ "place_id": "6e374c99-a01a-4185-ab0c-afa881260d39",
+ "base_position": "20,103",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "e9ac780b-042f-4792-bf22-579675224316",
+ "base_position": "-144,26",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7dbe561f-c1fc-4708-8336-e44e477104f6",
+ "base_position": "-79,-25",
+ "category_id": "social"
+ },
+ {
+ "place_id": "7dbe561f-c1fc-4708-8336-e44e477104f6",
+ "base_position": "-79,-25",
+ "category_id": "music"
+ },
+ {
+ "place_id": "7c555971-7802-4aa3-89af-a10690d855fa",
+ "base_position": "111,-2",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "0e170e13-2db7-4992-8c22-d6836d73bdeb",
+ "base_position": "43,124",
+ "category_id": "music"
+ },
+ {
+ "place_id": "86080c15-607f-4375-a27b-b683f7535f85",
+ "base_position": "-133,96",
+ "category_id": "art"
+ },
+ {
+ "place_id": "25bb8807-36ab-4c18-ba7e-35fe12c9265e",
+ "base_position": "42,12",
+ "category_id": "art"
+ },
+ {
+ "place_id": "25bb8807-36ab-4c18-ba7e-35fe12c9265e",
+ "base_position": "42,12",
+ "category_id": "education"
+ },
+ {
+ "place_id": "e9d79971-d131-4192-af14-81b7d4714874",
+ "base_position": "-67,-4",
+ "category_id": "social"
+ },
+ {
+ "place_id": "e9d79971-d131-4192-af14-81b7d4714874",
+ "base_position": "-67,-4",
+ "category_id": "music"
+ },
+ {
+ "place_id": "2ce3522d-a200-413a-8941-42273f661b79",
+ "base_position": "-19,-14",
+ "category_id": "game"
+ },
+ {
+ "place_id": "5af560b3-1730-44b7-8187-67812cf73f41",
+ "base_position": "135,-27",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5af560b3-1730-44b7-8187-67812cf73f41",
+ "base_position": "135,-27",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "992ce89c-e978-4df2-b19e-a94a5791e210",
+ "base_position": "8,36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "992ce89c-e978-4df2-b19e-a94a5791e210",
+ "base_position": "8,36",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5ee2b06b-ec76-47fe-a000-5810814da482",
+ "base_position": "21,49",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5ee2b06b-ec76-47fe-a000-5810814da482",
+ "base_position": "21,49",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "4d043e88-960d-4b82-96ea-1de8e227233d",
+ "base_position": "-114,-43",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "dace3830-0756-4f4a-a505-942a706a9ffe",
+ "base_position": "143,-22",
+ "category_id": "art"
+ },
+ {
+ "place_id": "fa9af751-b039-4d2e-9eff-8855f13ed4eb",
+ "base_position": "40,69",
+ "category_id": "social"
+ },
+ {
+ "place_id": "fa9af751-b039-4d2e-9eff-8855f13ed4eb",
+ "base_position": "40,69",
+ "category_id": "music"
+ },
+ {
+ "place_id": "d079e961-a358-4b07-8944-9aa7dda8b521",
+ "base_position": "-38,97",
+ "category_id": "education"
+ },
+ {
+ "place_id": "609c8f02-5e45-4bc2-9831-5b67b4c95438",
+ "base_position": "-9,-123",
+ "category_id": "music"
+ },
+ {
+ "place_id": "05600d0f-1ee3-4da6-bfaa-29d07c61f718",
+ "base_position": "61,-35",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "9dfb3c70-0713-4374-b940-d06751ed17c8",
+ "base_position": "19,103",
+ "category_id": "social"
+ },
+ {
+ "place_id": "9dfb3c70-0713-4374-b940-d06751ed17c8",
+ "base_position": "19,103",
+ "category_id": "education"
+ },
+ {
+ "place_id": "aa4e7ff6-d851-40d5-8124-f7a02ad351f2",
+ "base_position": "-112,-57",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c69b6891-7f32-48e9-baf8-094a6d1dab7f",
+ "base_position": "-33,-6",
+ "category_id": "social"
+ },
+ {
+ "place_id": "c69b6891-7f32-48e9-baf8-094a6d1dab7f",
+ "base_position": "-33,-6",
+ "category_id": "music"
+ },
+ {
+ "place_id": "ac512070-abab-4642-8a6d-d8409b06d144",
+ "base_position": "-145,-119",
+ "category_id": "art"
+ },
+ {
+ "place_id": "332e47b2-0e84-4894-a84d-c21fa383d8c5",
+ "base_position": "31,89",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "8913fdf8-d16c-4ffe-9a00-e9d689f2d3e3",
+ "base_position": "-102,36",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "8913fdf8-d16c-4ffe-9a00-e9d689f2d3e3",
+ "base_position": "-102,36",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "04dde9c0-b5e0-4760-bccb-4bfbe7cfa37f",
+ "base_position": "-75,-64",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "89743f0e-50a9-42fe-84c3-3a064c6ecdd2",
+ "base_position": "25,124",
+ "category_id": "art"
+ },
+ {
+ "place_id": "783c4f75-7ab4-4b01-94a9-6c89df857c52",
+ "base_position": "73,18",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ed4b7221-a788-44db-afd0-ff535f9994d4",
+ "base_position": "-133,95",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9b781b2b-cc9e-4e73-8392-42b02a09ae7b",
+ "base_position": "14,36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9b781b2b-cc9e-4e73-8392-42b02a09ae7b",
+ "base_position": "14,36",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "88b90baa-586d-4bb0-81b4-1140a3029b57",
+ "base_position": "33,143",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "bff2d31a-148f-49dc-a584-19107f35ba0e",
+ "base_position": "21,71",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "dbcd9dfb-2afe-4779-979f-f85486c20d2b",
+ "base_position": "-9,-140",
+ "category_id": "art"
+ },
+ {
+ "place_id": "dbcd9dfb-2afe-4779-979f-f85486c20d2b",
+ "base_position": "-9,-140",
+ "category_id": "education"
+ },
+ {
+ "place_id": "32c1d3f9-0e69-41c9-9bfb-322f91bf317d",
+ "base_position": "97,-111",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "74429784-7761-4616-8a98-62ba073b3ad3",
+ "base_position": "39,-32",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "3682adc8-d947-4359-822a-49cea810c5f7",
+ "base_position": "89,-94",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3682adc8-d947-4359-822a-49cea810c5f7",
+ "base_position": "89,-94",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "3682adc8-d947-4359-822a-49cea810c5f7",
+ "base_position": "89,-94",
+ "category_id": "education"
+ },
+ {
+ "place_id": "585cb4ce-c1f9-4ef1-8131-aefb5282afff",
+ "base_position": "19,-29",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "65fa553d-bd3a-4abf-b735-0982c29e6fca",
+ "base_position": "-1,-110",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "40bd7069-321c-425a-80ca-3abd8a3562c4",
+ "base_position": "34,22",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "0bdcbc23-fd8b-48c0-9fb0-21b8d2f4f8c7",
+ "base_position": "-24,-119",
+ "category_id": "social"
+ },
+ {
+ "place_id": "4e6006e8-837e-419c-b8d4-8f21dbb28610",
+ "base_position": "-49,-73",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "4682906d-64c6-41f2-86d2-c529f2457aee",
+ "base_position": "88,-26",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5d82be80-ca52-4f55-9588-2c3e371a9a8d",
+ "base_position": "149,-37",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "be81a79c-1468-49ad-bb92-fbf2a2874961",
+ "base_position": "56,112",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "60b24be4-caa3-48e8-9984-31e8d4c6873d",
+ "base_position": "95,-87",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "88fe3057-16a2-4148-8cf6-0af0c95a2f91",
+ "base_position": "-24,35",
+ "category_id": "art"
+ },
+ {
+ "place_id": "88fe3057-16a2-4148-8cf6-0af0c95a2f91",
+ "base_position": "-24,35",
+ "category_id": "social"
+ },
+ {
+ "place_id": "88fe3057-16a2-4148-8cf6-0af0c95a2f91",
+ "base_position": "-24,35",
+ "category_id": "music"
+ },
+ {
+ "place_id": "74212cce-942d-40db-816c-847188c6e34e",
+ "base_position": "-40,93",
+ "category_id": "education"
+ },
+ {
+ "place_id": "5b939053-ddd2-4914-a338-5bde9071beb5",
+ "base_position": "-37,45",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5b939053-ddd2-4914-a338-5bde9071beb5",
+ "base_position": "-37,45",
+ "category_id": "education"
+ },
+ {
+ "place_id": "5e0dfb98-2a36-4508-8f81-a2f18123f8cc",
+ "base_position": "3,52",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "2528bbb0-f11a-49c5-a412-bd50a87b1f9d",
+ "base_position": "-54,107",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f78a2f52-c046-448d-9693-b9625702fda9",
+ "base_position": "40,73",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ce7feabb-286f-42b6-9767-89a88ebf04c7",
+ "base_position": "8,33",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ce7feabb-286f-42b6-9767-89a88ebf04c7",
+ "base_position": "8,33",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ad4b1e16-4504-4bd3-9fbf-0e0096c6c9ce",
+ "base_position": "16,-49",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ad4b1e16-4504-4bd3-9fbf-0e0096c6c9ce",
+ "base_position": "16,-49",
+ "category_id": "music"
+ },
+ {
+ "place_id": "70d45dd9-0927-4e29-9f9d-e1c980499cde",
+ "base_position": "89,-87",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "c276d39c-b72a-45cd-a491-31228aaf7cb9",
+ "base_position": "128,-135",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f771d041-8bb6-4458-883d-bc9d50c9a771",
+ "base_position": "-61,32",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "e8abd110-69af-462c-ad72-2fa401d04def",
+ "base_position": "-51,125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "733a7f05-7779-4e36-a0dd-c32e43ad1365",
+ "base_position": "126,105",
+ "category_id": "art"
+ },
+ {
+ "place_id": "57dd3383-d819-43db-8f21-8b381ec54d7d",
+ "base_position": "-119,-150",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "39e92611-b334-4506-b691-249913a42c0e",
+ "base_position": "-70,-107",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e22431c0-ca1f-4adf-9b8c-e715a8207259",
+ "base_position": "133,2",
+ "category_id": "social"
+ },
+ {
+ "place_id": "e22431c0-ca1f-4adf-9b8c-e715a8207259",
+ "base_position": "133,2",
+ "category_id": "music"
+ },
+ {
+ "place_id": "e37751a4-3f60-4f8a-980e-d2d7e49b5f98",
+ "base_position": "33,-4",
+ "category_id": "social"
+ },
+ {
+ "place_id": "2fc6239f-ce98-4e0b-8605-f19df411c38f",
+ "base_position": "-117,-47",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e1e01dfd-b3a2-4bc8-9be1-88147bd9bdee",
+ "base_position": "14,34",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e1e01dfd-b3a2-4bc8-9be1-88147bd9bdee",
+ "base_position": "14,34",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "14456155-5f6d-44c9-9e20-cbc6a9d63509",
+ "base_position": "16,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "14456155-5f6d-44c9-9e20-cbc6a9d63509",
+ "base_position": "16,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6ff6669d-ec1b-4592-9417-04c71ecd342f",
+ "base_position": "136,-21",
+ "category_id": "social"
+ },
+ {
+ "place_id": "8bb736da-e31c-400c-8e2a-a676d331c1ac",
+ "base_position": "7,66",
+ "category_id": "game"
+ },
+ {
+ "place_id": "a989299c-c4af-4e1d-a3ae-36f95db46386",
+ "base_position": "35,84",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a4482138-5a4c-4911-a02e-d7ec3624751f",
+ "base_position": "-93,26",
+ "category_id": "art"
+ },
+ {
+ "place_id": "da064056-d9ef-4970-b992-1237493c8f0a",
+ "base_position": "49,-72",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "82f52724-33ba-4a5a-9a01-05ba1b99ae6b",
+ "base_position": "46,54",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "8228810e-915c-4a8f-a2e6-3830c133cf67",
+ "base_position": "117,-13",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8228810e-915c-4a8f-a2e6-3830c133cf67",
+ "base_position": "117,-13",
+ "category_id": "education"
+ },
+ {
+ "place_id": "b8594084-fa71-4f00-8ae7-a41438e5f6f4",
+ "base_position": "37,-10",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "1854ce68-71f6-44d1-9cfb-95b4ef5c7429",
+ "base_position": "-53,119",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "7555bf0f-455f-4319-ab89-485c50348302",
+ "base_position": "-124,83",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c53497e2-9e58-4119-a062-7851ce10a5b2",
+ "base_position": "34,13",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4e8d51de-3ee3-446d-a648-a6385e81ea11",
+ "base_position": "-126,83",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "4e8d51de-3ee3-446d-a648-a6385e81ea11",
+ "base_position": "-126,83",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a061ac1a-9e5c-43e0-8327-0710ab71f105",
+ "base_position": "-123,83",
+ "category_id": "art"
+ },
+ {
+ "place_id": "71410677-89cb-43d5-a51a-92ad4c4c028b",
+ "base_position": "86,-36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "71410677-89cb-43d5-a51a-92ad4c4c028b",
+ "base_position": "86,-36",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "fecdaec0-614e-4f3a-a9cf-dd2813efae19",
+ "base_position": "85,-20",
+ "category_id": "game"
+ },
+ {
+ "place_id": "5c8eea1d-ee0d-429e-b630-bdec4e103117",
+ "base_position": "-109,-26",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "c3a25773-5472-487e-898e-a4c59e583d3a",
+ "base_position": "-133,93",
+ "category_id": "art"
+ },
+ {
+ "place_id": "de3c9fc9-bd02-40c0-8f5b-4e2eeef0caac",
+ "base_position": "7,23",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "85c998a6-26ff-4f47-8f38-288fe19db850",
+ "base_position": "-36,90",
+ "category_id": "education"
+ },
+ {
+ "place_id": "0d1e65a2-04db-414d-ba04-006e5f2fa650",
+ "base_position": "-42,31",
+ "category_id": "game"
+ },
+ {
+ "place_id": "a7b48ff8-e425-4a85-9831-9f2c7500dc5a",
+ "base_position": "47,141",
+ "category_id": "art"
+ },
+ {
+ "place_id": "dea59db6-a1ec-4527-94c5-6858a28639dd",
+ "base_position": "15,30",
+ "category_id": "social"
+ },
+ {
+ "place_id": "942310ec-8255-401e-8e0e-06358e9da041",
+ "base_position": "-91,-21",
+ "category_id": "social"
+ },
+ {
+ "place_id": "942310ec-8255-401e-8e0e-06358e9da041",
+ "base_position": "-91,-21",
+ "category_id": "music"
+ },
+ {
+ "place_id": "dba9c88e-1239-4c74-a5b5-3ecb85e4a374",
+ "base_position": "-15,-118",
+ "category_id": "art"
+ },
+ {
+ "place_id": "782930bd-53ee-4f8a-8f41-fdaa5545a497",
+ "base_position": "6,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "782930bd-53ee-4f8a-8f41-fdaa5545a497",
+ "base_position": "6,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "99b03532-c064-4dc5-965c-40b8abcd61a4",
+ "base_position": "-57,-28",
+ "category_id": "art"
+ },
+ {
+ "place_id": "99b03532-c064-4dc5-965c-40b8abcd61a4",
+ "base_position": "-57,-28",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "7f397e4c-4756-49f1-abb3-86ad29eb4268",
+ "base_position": "-114,-28",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7f397e4c-4756-49f1-abb3-86ad29eb4268",
+ "base_position": "-114,-28",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "215564ca-89d7-41b8-876a-ab2bd0bf681e",
+ "base_position": "22,140",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a52af22e-4556-42f4-9d8e-92293b624f96",
+ "base_position": "-57,-129",
+ "category_id": "art"
+ },
+ {
+ "place_id": "977515b2-67ab-4e92-838c-576681d34582",
+ "base_position": "-43,-114",
+ "category_id": "social"
+ },
+ {
+ "place_id": "977515b2-67ab-4e92-838c-576681d34582",
+ "base_position": "-43,-114",
+ "category_id": "education"
+ },
+ {
+ "place_id": "f986e7fb-01ac-47cd-9a88-a670d9526364",
+ "base_position": "141,126",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "236b295e-b555-4834-a465-c4cade3d1341",
+ "base_position": "37,130",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0e24d9c5-de13-4639-be06-3e3beb9fa1bf",
+ "base_position": "-44,87",
+ "category_id": "art"
+ },
+ {
+ "place_id": "fdacc519-7372-4f73-a711-cd7cf96ebeb7",
+ "base_position": "96,-19",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b26534f6-9b03-4f91-8689-bb5a3890a914",
+ "base_position": "33,54",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "31d21ae8-88a9-48b8-a6a6-2ae006d9c044",
+ "base_position": "-60,113",
+ "category_id": "social"
+ },
+ {
+ "place_id": "31d21ae8-88a9-48b8-a6a6-2ae006d9c044",
+ "base_position": "-60,113",
+ "category_id": "music"
+ },
+ {
+ "place_id": "4edb422f-232c-42eb-9c59-68327b71e0fd",
+ "base_position": "26,-33",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "bd780398-c5c7-41c8-aab2-36229223236b",
+ "base_position": "-120,20",
+ "category_id": "social"
+ },
+ {
+ "place_id": "bd780398-c5c7-41c8-aab2-36229223236b",
+ "base_position": "-120,20",
+ "category_id": "music"
+ },
+ {
+ "place_id": "1eb60ee1-b458-4cc8-94ed-4bf17a3ad9b1",
+ "base_position": "-73,18",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "25446b83-d247-45cb-bcdd-4b57355cae7a",
+ "base_position": "42,96",
+ "category_id": "social"
+ },
+ {
+ "place_id": "02eac55f-9213-4e16-aefd-ea2927e22c54",
+ "base_position": "-19,73",
+ "category_id": "game"
+ },
+ {
+ "place_id": "151500e5-02e6-4996-b950-be57ad8e78af",
+ "base_position": "-18,-23",
+ "category_id": "art"
+ },
+ {
+ "place_id": "151500e5-02e6-4996-b950-be57ad8e78af",
+ "base_position": "-18,-23",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "f7c8d06e-2faf-4a0c-9bdf-3db1e7f88efd",
+ "base_position": "88,-110",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6f5f4941-944e-448c-bcc3-736d9850bcc4",
+ "base_position": "145,-47",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9a6e8b21-ed0b-49b0-8ff3-467d9a73548f",
+ "base_position": "21,-32",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "59713743-3b4b-4a7c-97ec-bfab1076c952",
+ "base_position": "-126,19",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "59713743-3b4b-4a7c-97ec-bfab1076c952",
+ "base_position": "-126,19",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "07ffd456-cd0e-4f0e-a740-ded189c7a9e0",
+ "base_position": "-116,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "0d9c988f-9d94-4ee6-af34-83a6a53e6577",
+ "base_position": "24,86",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0d9c988f-9d94-4ee6-af34-83a6a53e6577",
+ "base_position": "24,86",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "61248778-4a25-45b4-9a05-8ddfe67055e2",
+ "base_position": "99,-149",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c379348e-259a-4b7f-9aa4-9ae3785acf8f",
+ "base_position": "-131,-61",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "c379348e-259a-4b7f-9aa4-9ae3785acf8f",
+ "base_position": "-131,-61",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "b274f723-edf4-41e3-8110-68660ab67400",
+ "base_position": "97,60",
+ "category_id": "social"
+ },
+ {
+ "place_id": "48bf7423-442c-4a65-9f8f-667ea0939bcd",
+ "base_position": "15,-37",
+ "category_id": "art"
+ },
+ {
+ "place_id": "48bf7423-442c-4a65-9f8f-667ea0939bcd",
+ "base_position": "15,-37",
+ "category_id": "education"
+ },
+ {
+ "place_id": "28460b8a-8489-44de-b122-82a1c0ad54d5",
+ "base_position": "113,44",
+ "category_id": "game"
+ },
+ {
+ "place_id": "ca1260e4-30e2-4c3e-a6f0-0274968bc949",
+ "base_position": "96,60",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5c77df96-7f4e-48f3-b217-256fdd568ca9",
+ "base_position": "8,-49",
+ "category_id": "art"
+ },
+ {
+ "place_id": "bb02a2b3-6d38-41f7-9a07-979495d65d7b",
+ "base_position": "-45,112",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "6caa8e06-47a8-4ab6-aa6b-569888ac5d2a",
+ "base_position": "-28,-108",
+ "category_id": "art"
+ },
+ {
+ "place_id": "74238c03-f473-44cb-887c-b2bdd35e494d",
+ "base_position": "147,-36",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "e3f4dd4d-c854-4bba-92ef-8c8ff03189c6",
+ "base_position": "-34,-26",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "f93caed6-5522-484c-a5c0-9f1df439e829",
+ "base_position": "-119,12",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "ff14c241-588c-427c-8529-d62ddaa87391",
+ "base_position": "-112,-33",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5beacf9c-2e1e-497d-b911-1baf329c2cc2",
+ "base_position": "40,12",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ff381726-443d-4249-9300-2f50474de91e",
+ "base_position": "-76,12",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "5fd49de1-2b29-4d7b-846b-d810da60417e",
+ "base_position": "4,-69",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "50de523b-9a83-49b9-810f-454b3568c6af",
+ "base_position": "2,41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "50de523b-9a83-49b9-810f-454b3568c6af",
+ "base_position": "2,41",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6064421c-8b4e-407b-a30a-9564af41b193",
+ "base_position": "17,87",
+ "category_id": "game"
+ },
+ {
+ "place_id": "6605020d-7918-4dde-bad6-0b9bf4b3d5e7",
+ "base_position": "52,-3",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6605020d-7918-4dde-bad6-0b9bf4b3d5e7",
+ "base_position": "52,-3",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "250a04ae-7de7-48b6-9352-24a5715d9630",
+ "base_position": "-6,-123",
+ "category_id": "art"
+ },
+ {
+ "place_id": "44dc6f45-7b87-4e34-ac1d-4c18d4d04ee4",
+ "base_position": "-55,-34",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "3785146e-9ceb-4bda-ad8a-0b4842d5e04a",
+ "base_position": "133,-14",
+ "category_id": "art"
+ },
+ {
+ "place_id": "534f5fc8-45fe-46f2-969f-1d40128ddfa8",
+ "base_position": "-65,33",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "a040d8bc-5934-4d6d-8140-e435b1c36e74",
+ "base_position": "-40,94",
+ "category_id": "education"
+ },
+ {
+ "place_id": "43e48165-d456-40a5-9408-53192da9ca4c",
+ "base_position": "29,-95",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "f4b44efa-c482-459e-aff8-33228c56baf4",
+ "base_position": "38,83",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f4b44efa-c482-459e-aff8-33228c56baf4",
+ "base_position": "38,83",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "aed9a8f3-8887-47f7-b018-6e86e3619253",
+ "base_position": "-66,33",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "e6c75d58-f7c5-4227-aa62-63207a284797",
+ "base_position": "-41,149",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6d916c90-da22-4704-9aad-91818692edef",
+ "base_position": "6,141",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "7b2517d9-7d56-443a-ae2e-8b899999e29c",
+ "base_position": "38,-79",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7b2517d9-7d56-443a-ae2e-8b899999e29c",
+ "base_position": "38,-79",
+ "category_id": "social"
+ },
+ {
+ "place_id": "7b2517d9-7d56-443a-ae2e-8b899999e29c",
+ "base_position": "38,-79",
+ "category_id": "music"
+ },
+ {
+ "place_id": "c87b8078-7e23-4809-9ee2-ab188ece6d0d",
+ "base_position": "-55,19",
+ "category_id": "social"
+ },
+ {
+ "place_id": "c87b8078-7e23-4809-9ee2-ab188ece6d0d",
+ "base_position": "-55,19",
+ "category_id": "music"
+ },
+ {
+ "place_id": "d308602f-42c8-4282-9668-4efcf67e030b",
+ "base_position": "-87,28",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d308602f-42c8-4282-9668-4efcf67e030b",
+ "base_position": "-87,28",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c2120878-c22f-4761-a2df-60d121e12c60",
+ "base_position": "-80,-13",
+ "category_id": "art"
+ },
+ {
+ "place_id": "99a7c596-4a9d-4cf7-9688-0ef932f5004f",
+ "base_position": "-108,-63",
+ "category_id": "art"
+ },
+ {
+ "place_id": "82680322-e436-48a0-8785-482d124696e0",
+ "base_position": "-55,-6",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "f614f3bb-8d74-4d96-8770-480034f9ca3a",
+ "base_position": "149,6",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f614f3bb-8d74-4d96-8770-480034f9ca3a",
+ "base_position": "149,6",
+ "category_id": "social"
+ },
+ {
+ "place_id": "f614f3bb-8d74-4d96-8770-480034f9ca3a",
+ "base_position": "149,6",
+ "category_id": "music"
+ },
+ {
+ "place_id": "4927cd41-2733-4bd8-be33-a5332ba69e8c",
+ "base_position": "-33,43",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cc13956d-7162-4dcc-add3-1bde49f530ff",
+ "base_position": "-93,-58",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cc1fde5d-8f91-4be4-9a63-81a56bada835",
+ "base_position": "140,46",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cc1fde5d-8f91-4be4-9a63-81a56bada835",
+ "base_position": "140,46",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "41e9d6bf-365d-446a-9200-dab340de73fb",
+ "base_position": "60,-75",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "149a6510-1127-49f7-a61c-fa88258fb8d5",
+ "base_position": "20,-33",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "c6adcb1d-ace6-48b6-9efe-95d23350e611",
+ "base_position": "-129,-85",
+ "category_id": "game"
+ },
+ {
+ "place_id": "5f96071b-89a5-4407-be8e-75dd691361f8",
+ "base_position": "-39,90",
+ "category_id": "education"
+ },
+ {
+ "place_id": "8215fc75-136e-4652-8588-fabfdef1b73e",
+ "base_position": "139,-78",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3a0bebac-89ef-46eb-bc93-8085353d3bd6",
+ "base_position": "-133,-26",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "4c813700-6188-4252-863b-f6a1ea61d98d",
+ "base_position": "-33,91",
+ "category_id": "education"
+ },
+ {
+ "place_id": "7d61c4a4-aa90-4163-b23f-49086220a3be",
+ "base_position": "42,71",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2e1d561d-af83-443b-8a70-bde45da3f3f3",
+ "base_position": "37,70",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2e1d561d-af83-443b-8a70-bde45da3f3f3",
+ "base_position": "37,70",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5c2c73fb-38ed-470a-a643-c95919b4f1d9",
+ "base_position": "-56,14",
+ "category_id": "art"
+ },
+ {
+ "place_id": "08b4571c-9f34-4ccf-aded-0faa328311b9",
+ "base_position": "-66,-102",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6dc1c145-2e2b-49fa-9eb1-39013630d4a5",
+ "base_position": "-78,-51",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b2a7d530-012b-4405-af3b-e06e838f8294",
+ "base_position": "-42,111",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b2a7d530-012b-4405-af3b-e06e838f8294",
+ "base_position": "-42,111",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "a481d274-1ca0-48fc-bfea-cabb1e53bda4",
+ "base_position": "133,-15",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e97c83dc-cf4c-4953-9ccf-38ffd1b9f90a",
+ "base_position": "3,-34",
+ "category_id": "game"
+ },
+ {
+ "place_id": "3102dc82-dfa3-4148-b885-5a06c2ad8983",
+ "base_position": "-42,127",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "3aa87b51-4a25-47f5-a37d-28635ca8c22d",
+ "base_position": "44,58",
+ "category_id": "art"
+ },
+ {
+ "place_id": "49964e9b-13c3-430c-aedb-dc2b4fc1b804",
+ "base_position": "-19,-57",
+ "category_id": "game"
+ },
+ {
+ "place_id": "24a8280a-c0d2-4cf6-a89b-b1367175c692",
+ "base_position": "-90,26",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "24a8280a-c0d2-4cf6-a89b-b1367175c692",
+ "base_position": "-90,26",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "24a8280a-c0d2-4cf6-a89b-b1367175c692",
+ "base_position": "-90,26",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "3b02cab6-c37c-479d-900f-b2a79c6221d0",
+ "base_position": "-54,132",
+ "category_id": "game"
+ },
+ {
+ "place_id": "3b02cab6-c37c-479d-900f-b2a79c6221d0",
+ "base_position": "-54,132",
+ "category_id": "music"
+ },
+ {
+ "place_id": "3b02cab6-c37c-479d-900f-b2a79c6221d0",
+ "base_position": "-54,132",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c1a17c76-3e7d-4d20-88a1-1abb622fbc8b",
+ "base_position": "95,88",
+ "category_id": "social"
+ },
+ {
+ "place_id": "c1a17c76-3e7d-4d20-88a1-1abb622fbc8b",
+ "base_position": "95,88",
+ "category_id": "music"
+ },
+ {
+ "place_id": "eb96e572-33a0-4b75-be51-cb7876444764",
+ "base_position": "128,32",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f532ca2a-8ec0-48e0-933d-570ce948ef63",
+ "base_position": "10,-48",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "0efd486d-3784-4d44-85f4-89e7a0237833",
+ "base_position": "-138,-40",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a676011f-9227-4371-be3a-a84c6f5a10cd",
+ "base_position": "149,-30",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "0c186e88-44f2-4668-a43a-59e6a9d2e928",
+ "base_position": "-1,-94",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "8eafc3c5-e58e-40fa-8e18-e7e045b05033",
+ "base_position": "-48,-73",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "ab7bc26f-0f3f-4f0a-8a87-2337b36bab5b",
+ "base_position": "29,-96",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "15f044d2-e130-4a59-a080-f7a323115439",
+ "base_position": "-131,30",
+ "category_id": "social"
+ },
+ {
+ "place_id": "15f044d2-e130-4a59-a080-f7a323115439",
+ "base_position": "-131,30",
+ "category_id": "music"
+ },
+ {
+ "place_id": "15e566c4-ae5f-437d-bb3f-7b3bc8f900a2",
+ "base_position": "-116,-43",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "4f729ebe-8469-49c4-8bb7-3d7efec8a1d8",
+ "base_position": "-38,90",
+ "category_id": "education"
+ },
+ {
+ "place_id": "d47f2f84-60d3-478d-b3f1-8df208ac4cdf",
+ "base_position": "-12,-120",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "0615ddc6-b447-4a95-bac7-6e46c3c242df",
+ "base_position": "33,-64",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "53b9cd41-8e7e-499c-a020-1d79f594f1b1",
+ "base_position": "59,106",
+ "category_id": "education"
+ },
+ {
+ "place_id": "2ef7957c-826d-4ce0-a9fb-120ba3eba22f",
+ "base_position": "142,-58",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "2ef7957c-826d-4ce0-a9fb-120ba3eba22f",
+ "base_position": "142,-58",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "bf9200d7-a76d-4dd0-98c5-d75e81c95f4e",
+ "base_position": "-112,-36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "462ed13c-ed8c-4bc5-a308-a544870fbe70",
+ "base_position": "18,-146",
+ "category_id": "art"
+ },
+ {
+ "place_id": "462ed13c-ed8c-4bc5-a308-a544870fbe70",
+ "base_position": "18,-146",
+ "category_id": "social"
+ },
+ {
+ "place_id": "462ed13c-ed8c-4bc5-a308-a544870fbe70",
+ "base_position": "18,-146",
+ "category_id": "music"
+ },
+ {
+ "place_id": "2342469a-34af-426a-ab78-1ef219232d5d",
+ "base_position": "-20,-102",
+ "category_id": "music"
+ },
+ {
+ "place_id": "9e0323c2-14cc-491d-bb1d-4fc51868c3ce",
+ "base_position": "66,-135",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "68569022-b83d-4d6e-8645-49da35d346fa",
+ "base_position": "15,57",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "bcb73990-db27-4a48-8d22-7b1fc93e1f84",
+ "base_position": "127,19",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8cc9ef00-2e52-477a-affc-9c7ecc7e5952",
+ "base_position": "129,152",
+ "category_id": "social"
+ },
+ {
+ "place_id": "3931fd1c-c4de-46d5-b762-549173ab4649",
+ "base_position": "-36,-112",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a90ba9ca-b824-4a1c-8af9-e549dcfc20df",
+ "base_position": "-80,-110",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a90ba9ca-b824-4a1c-8af9-e549dcfc20df",
+ "base_position": "-80,-110",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "3c4f9b90-7aa4-4b6f-aa6d-83c19818ebba",
+ "base_position": "-49,43",
+ "category_id": "art"
+ },
+ {
+ "place_id": "248436d0-c29b-4084-9dc1-7e2480010adf",
+ "base_position": "-63,34",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "fe6dbdfd-14a2-49ab-abbe-26d817fd4172",
+ "base_position": "42,71",
+ "category_id": "social"
+ },
+ {
+ "place_id": "fe6dbdfd-14a2-49ab-abbe-26d817fd4172",
+ "base_position": "42,71",
+ "category_id": "music"
+ },
+ {
+ "place_id": "c4d89c17-8e74-4277-b1bb-f4c8887d8d25",
+ "base_position": "54,-132",
+ "category_id": "art"
+ },
+ {
+ "place_id": "dd56dd10-d819-4c3e-ac5d-80e3e914bcf6",
+ "base_position": "-64,34",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "6a57ab85-416c-475e-af1f-522655c953cd",
+ "base_position": "-63,35",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "f00677f5-83b7-4bc7-a402-ac5a5f5bcb04",
+ "base_position": "50,124",
+ "category_id": "art"
+ },
+ {
+ "place_id": "34c874c1-be40-4820-aaf7-4b75cd373174",
+ "base_position": "-65,35",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "fade0931-094c-42c6-8c31-82f74d8ae8d4",
+ "base_position": "140,-123",
+ "category_id": "music"
+ },
+ {
+ "place_id": "c73e6b49-c884-49da-a7cd-144a6e8a9c72",
+ "base_position": "-32,24",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c77cdbdd-b3cc-4e59-9539-fc0f323bb274",
+ "base_position": "-93,20",
+ "category_id": "social"
+ },
+ {
+ "place_id": "c77cdbdd-b3cc-4e59-9539-fc0f323bb274",
+ "base_position": "-93,20",
+ "category_id": "education"
+ },
+ {
+ "place_id": "702de63c-78d1-459f-ad0f-56385717a055",
+ "base_position": "-75,-105",
+ "category_id": "art"
+ },
+ {
+ "place_id": "85694081-36f4-4427-89f9-bbf0600173a8",
+ "base_position": "-20,28",
+ "category_id": "art"
+ },
+ {
+ "place_id": "21a04b89-3266-4b56-b32f-eddd0e608c52",
+ "base_position": "-138,-41",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e65d7257-07a0-4111-93a3-13de5d459117",
+ "base_position": "-39,31",
+ "category_id": "game"
+ },
+ {
+ "place_id": "8e582431-d340-4ac1-98e0-e2351e0eef62",
+ "base_position": "-120,-39",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8e582431-d340-4ac1-98e0-e2351e0eef62",
+ "base_position": "-120,-39",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "8e582431-d340-4ac1-98e0-e2351e0eef62",
+ "base_position": "-120,-39",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "21634574-7ba7-4a6e-a9b1-d00eea90facd",
+ "base_position": "-46,-108",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "78db6066-0056-40c0-a25c-314dcf6fbbb2",
+ "base_position": "44,12",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ada5911d-a887-4fc9-a880-6d149557b059",
+ "base_position": "-70,19",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "df29aa64-c0bc-413d-a0d7-ac3ec8f219ca",
+ "base_position": "-125,-32",
+ "category_id": "art"
+ },
+ {
+ "place_id": "df29aa64-c0bc-413d-a0d7-ac3ec8f219ca",
+ "base_position": "-125,-32",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "df29aa64-c0bc-413d-a0d7-ac3ec8f219ca",
+ "base_position": "-125,-32",
+ "category_id": "education"
+ },
+ {
+ "place_id": "211cb02d-769a-4866-b1eb-f1774248e67b",
+ "base_position": "-55,7",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "bc407e59-0788-4e1a-9e8f-999ba7ddc69c",
+ "base_position": "-40,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "49d2c5d6-c280-4a5a-a848-7dad33b78b4e",
+ "base_position": "-127,93",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ed8bc4c8-a308-47ba-a0c2-5f14c0e75dad",
+ "base_position": "35,-122",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "234482ee-0700-4299-b798-31e78e925e36",
+ "base_position": "-125,89",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6dd0f0ab-c66d-4376-8276-efced73434b4",
+ "base_position": "-79,-17",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "fee3cec6-7fda-4c31-9298-63352a701260",
+ "base_position": "-71,135",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "d1993a95-9c71-4565-a15f-dc6140c709d1",
+ "base_position": "85,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "85351fd1-2a05-48c4-801b-2bcc51dc2f22",
+ "base_position": "-146,13",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "fea243b8-b81f-48e3-a11e-51ec7bdb16da",
+ "base_position": "-18,73",
+ "category_id": "game"
+ },
+ {
+ "place_id": "7c016641-74fc-4d21-a1e2-95503af4b1e9",
+ "base_position": "-87,12",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f103ab36-8a8c-4388-a536-89f04950da4b",
+ "base_position": "-127,95",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f103ab36-8a8c-4388-a536-89f04950da4b",
+ "base_position": "-127,95",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "7336f01f-173f-48ed-864e-36510a305591",
+ "base_position": "131,-8",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "8fbc11e9-a38d-4c58-b41b-8d463a8d65f0",
+ "base_position": "16,39",
+ "category_id": "art"
+ },
+ {
+ "place_id": "15ededf6-de48-4cb8-b43a-ded77522ce45",
+ "base_position": "-139,-8",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ba27c568-808b-41fd-9a91-c054c46d7740",
+ "base_position": "31,79",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9e1846a2-e81b-48c7-8da9-0c4f7d0eee4e",
+ "base_position": "128,-124",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "a689af8a-35b6-469e-880e-f50fa1949567",
+ "base_position": "-20,73",
+ "category_id": "game"
+ },
+ {
+ "place_id": "01c2ef80-ce8c-4854-92e3-20c3fe8f18f3",
+ "base_position": "-1,-121",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "65d72112-6910-4326-8eca-4a0d45bf23d9",
+ "base_position": "-60,-18",
+ "category_id": "education"
+ },
+ {
+ "place_id": "b2a0a473-f68c-4cb4-9fff-a11156040a75",
+ "base_position": "2,-56",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d491f364-1f5d-4d71-9539-fb647cfcbb7e",
+ "base_position": "-137,22",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d491f364-1f5d-4d71-9539-fb647cfcbb7e",
+ "base_position": "-137,22",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d491f364-1f5d-4d71-9539-fb647cfcbb7e",
+ "base_position": "-137,22",
+ "category_id": "music"
+ },
+ {
+ "place_id": "ff0db6eb-b872-4e43-801a-9d8dc3113ceb",
+ "base_position": "-39,97",
+ "category_id": "education"
+ },
+ {
+ "place_id": "8a560618-80e9-463d-aaed-b77943e53540",
+ "base_position": "-81,-68",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "12a2006d-2202-4aa5-b5dd-bfe8c1b35ebf",
+ "base_position": "-36,23",
+ "category_id": "music"
+ },
+ {
+ "place_id": "12a2006d-2202-4aa5-b5dd-bfe8c1b35ebf",
+ "base_position": "-36,23",
+ "category_id": "art"
+ },
+ {
+ "place_id": "67e39677-279c-484e-965e-db20894fe98f",
+ "base_position": "135,4",
+ "category_id": "social"
+ },
+ {
+ "place_id": "548b7ac8-6310-404d-98f6-0420ab368e86",
+ "base_position": "-132,21",
+ "category_id": "art"
+ },
+ {
+ "place_id": "63b39542-3263-46b4-8e23-85d458e49fc4",
+ "base_position": "8,39",
+ "category_id": "art"
+ },
+ {
+ "place_id": "63b39542-3263-46b4-8e23-85d458e49fc4",
+ "base_position": "8,39",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "14f33f48-8411-40e8-ba99-e2f318f85b6c",
+ "base_position": "-127,98",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9a74adc4-9539-45a8-ab2c-2489be61f8a6",
+ "base_position": "-57,-139",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "7489127c-ecd8-4545-961b-88a6a8894e95",
+ "base_position": "-55,-137",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "4d64dc8a-37b1-4016-9119-178501158ba6",
+ "base_position": "-83,-38",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "3ede756b-d249-4ace-8abd-cdc8b62dcb6d",
+ "base_position": "38,108",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3ede756b-d249-4ace-8abd-cdc8b62dcb6d",
+ "base_position": "38,108",
+ "category_id": "education"
+ },
+ {
+ "place_id": "202a2cb0-5f3e-466b-8464-bfbe92317e9f",
+ "base_position": "89,-88",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "dbb2faef-0c5c-4fb7-809f-3fef0d69cddc",
+ "base_position": "129,-124",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "27eea339-f223-4e0d-b340-faae57b09092",
+ "base_position": "-17,46",
+ "category_id": "social"
+ },
+ {
+ "place_id": "27eea339-f223-4e0d-b340-faae57b09092",
+ "base_position": "-17,46",
+ "category_id": "music"
+ },
+ {
+ "place_id": "d55c0fbc-30b9-459e-936a-27df298d16b7",
+ "base_position": "147,3",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "c2da4afa-400c-4406-ba82-f808770e6392",
+ "base_position": "-86,31",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8682b28b-e079-4d5b-9890-1fb1d5afad14",
+ "base_position": "-118,90",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "d260f5a9-4912-4419-93d5-db01c22d78ae",
+ "base_position": "-10,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "23fe91ea-2dfa-4b0e-8bfc-9e8c07a1df4b",
+ "base_position": "-87,-74",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a59b4ceb-a4b5-4996-968c-4f3af0f8579b",
+ "base_position": "71,-37",
+ "category_id": "social"
+ },
+ {
+ "place_id": "a59b4ceb-a4b5-4996-968c-4f3af0f8579b",
+ "base_position": "71,-37",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a59b4ceb-a4b5-4996-968c-4f3af0f8579b",
+ "base_position": "71,-37",
+ "category_id": "education"
+ },
+ {
+ "place_id": "6eca965d-8a0f-458d-bf50-c01a9311f196",
+ "base_position": "-40,90",
+ "category_id": "education"
+ },
+ {
+ "place_id": "49e5386a-7660-4318-82d8-200414df1c65",
+ "base_position": "-122,80",
+ "category_id": "art"
+ },
+ {
+ "place_id": "001dadad-3946-4572-b933-2dcfac78f64e",
+ "base_position": "-30,24",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b0ff555a-2f48-44cb-8612-c94ae8c62e12",
+ "base_position": "-115,-26",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b0ff555a-2f48-44cb-8612-c94ae8c62e12",
+ "base_position": "-115,-26",
+ "category_id": "music"
+ },
+ {
+ "place_id": "b0ff555a-2f48-44cb-8612-c94ae8c62e12",
+ "base_position": "-115,-26",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "4baaa38b-677e-4a6f-8fb2-2ee7154cf635",
+ "base_position": "-19,48",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c490caf0-b20f-4a82-803a-505f5af909e1",
+ "base_position": "116,-15",
+ "category_id": "art"
+ },
+ {
+ "place_id": "67c2593f-89ec-415c-8982-ab90595f6756",
+ "base_position": "146,-119",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5fc465fd-bc2d-4a35-9b19-f2ad84a943ec",
+ "base_position": "-78,-65",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d7c9fed3-7f17-4bd7-9da5-242b9dceb6f8",
+ "base_position": "-55,-102",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6a4338e9-3bbe-4b70-bbcb-465718ff270b",
+ "base_position": "56,-7",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "42d65372-efe7-4ed3-a09a-f498ed8b4928",
+ "base_position": "-150,32",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "cff5ffaf-2f32-4983-96da-6e06872b9779",
+ "base_position": "-64,35",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "a50a0802-d65e-41a7-a202-30eaeb61de17",
+ "base_position": "-62,33",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "8d438537-e3fb-450c-b56a-aea75bcacd7b",
+ "base_position": "43,134",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8d438537-e3fb-450c-b56a-aea75bcacd7b",
+ "base_position": "43,134",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "4de43dd9-624f-448b-884d-07a1c4331986",
+ "base_position": "-126,48",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "8fd506ee-dd0c-4d56-9033-f38e7cd4e057",
+ "base_position": "-146,-145",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1223c4b3-abfc-4602-b94a-8086d62c9eaa",
+ "base_position": "-127,83",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7ad01719-03c6-4649-8b66-03821520d246",
+ "base_position": "129,-125",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "8ddb2f5f-f3eb-475b-9a19-d5c586886886",
+ "base_position": "-106,-61",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "a59186b2-dc14-48a3-8b23-6334042dda38",
+ "base_position": "-18,49",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7ab99b08-11d5-4bbf-8006-09ba099ffc7d",
+ "base_position": "-67,-128",
+ "category_id": "music"
+ },
+ {
+ "place_id": "b50676b6-400d-4da9-b8ac-f6c3a50d6ed9",
+ "base_position": "-106,-80",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "7f894843-5f1a-4bf3-a462-f40f96c541cf",
+ "base_position": "104,-28",
+ "category_id": "art"
+ },
+ {
+ "place_id": "305cefbb-dc87-41cf-a091-600aa9930291",
+ "base_position": "-140,-41",
+ "category_id": "social"
+ },
+ {
+ "place_id": "305cefbb-dc87-41cf-a091-600aa9930291",
+ "base_position": "-140,-41",
+ "category_id": "music"
+ },
+ {
+ "place_id": "6188f789-bcb6-4a11-93df-47175069c11a",
+ "base_position": "-50,81",
+ "category_id": "music"
+ },
+ {
+ "place_id": "7c0eb60a-2d82-489c-b8a7-19d98098fbd9",
+ "base_position": "40,-71",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "ba20b2f7-16bd-4de0-8511-94f8647701d9",
+ "base_position": "-44,96",
+ "category_id": "social"
+ },
+ {
+ "place_id": "28dc655e-7351-4158-8c56-266f4287c342",
+ "base_position": "-38,-105",
+ "category_id": "art"
+ },
+ {
+ "place_id": "70e41ef0-57d0-4547-92b5-de4e7b9690c4",
+ "base_position": "-44,-117",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "670a0ab4-48e6-4a13-9560-ed751cde8065",
+ "base_position": "-71,41",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "670a0ab4-48e6-4a13-9560-ed751cde8065",
+ "base_position": "-71,41",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "61466ead-2dec-4aa0-b3f9-d6972dd38583",
+ "base_position": "-70,110",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e1ad0b84-2dff-4c68-b2cd-a8d815e46d71",
+ "base_position": "79,-36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1ce23149-c124-4a0a-aca5-f955d5aae0d7",
+ "base_position": "-40,126",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1ce23149-c124-4a0a-aca5-f955d5aae0d7",
+ "base_position": "-40,126",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "1ce23149-c124-4a0a-aca5-f955d5aae0d7",
+ "base_position": "-40,126",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "2cf26c29-20df-46ea-8f1d-114aa44031ed",
+ "base_position": "-61,33",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "cfac71c5-7d73-4b2c-a99c-f8104e03b0dd",
+ "base_position": "-86,-125",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "2139d8bf-067d-47bc-9e7e-38e37ed74c15",
+ "base_position": "14,30",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2139d8bf-067d-47bc-9e7e-38e37ed74c15",
+ "base_position": "14,30",
+ "category_id": "education"
+ },
+ {
+ "place_id": "a63fa9a1-789e-4eae-9436-23ad3183e746",
+ "base_position": "-127,89",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f386c700-5702-4aa3-95ed-8dad718203cc",
+ "base_position": "-64,33",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "22e7b19b-2744-410b-ae26-14de5016d1e1",
+ "base_position": "128,-110",
+ "category_id": "social"
+ },
+ {
+ "place_id": "22e7b19b-2744-410b-ae26-14de5016d1e1",
+ "base_position": "128,-110",
+ "category_id": "music"
+ },
+ {
+ "place_id": "beb073c5-518d-4da5-b878-16cc28526564",
+ "base_position": "79,-127",
+ "category_id": "art"
+ },
+ {
+ "place_id": "beb073c5-518d-4da5-b878-16cc28526564",
+ "base_position": "79,-127",
+ "category_id": "education"
+ },
+ {
+ "place_id": "beb073c5-518d-4da5-b878-16cc28526564",
+ "base_position": "79,-127",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "c4f5cd9b-b7a4-4845-8f9b-ca95080561bf",
+ "base_position": "-98,-142",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "10408bf8-fc01-425f-a27c-9a00f3c9c442",
+ "base_position": "-133,-35",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "10408bf8-fc01-425f-a27c-9a00f3c9c442",
+ "base_position": "-133,-35",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "7a75e0c4-fb91-45bf-8d97-e175326cc9db",
+ "base_position": "-58,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "54514031-e4f6-4170-974f-abfa3177b797",
+ "base_position": "-77,-32",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d53b2613-f3d7-4b34-ace4-58f963c6bb66",
+ "base_position": "-128,-78",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cbaa9a04-c74b-42c4-ab7d-cca5791c0a95",
+ "base_position": "-128,89",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3817e1d0-0fc3-4a1d-a76e-518aeecd9992",
+ "base_position": "-43,-97",
+ "category_id": "art"
+ },
+ {
+ "place_id": "44d021cb-4636-45c2-990f-5e537f1e2085",
+ "base_position": "6,-52",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d2ada229-158e-439e-ae05-46b49e8f89a5",
+ "base_position": "117,56",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d2ada229-158e-439e-ae05-46b49e8f89a5",
+ "base_position": "117,56",
+ "category_id": "music"
+ },
+ {
+ "place_id": "1e666bd4-0ad2-44e4-bf0f-8695e4e55f5e",
+ "base_position": "-40,114",
+ "category_id": "art"
+ },
+ {
+ "place_id": "11ccdd60-203c-4905-bd79-e89d3e078def",
+ "base_position": "-40,91",
+ "category_id": "education"
+ },
+ {
+ "place_id": "b92a0cbe-42e9-40d7-bc6a-56886f3248d3",
+ "base_position": "-38,-111",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "375f58c9-a45f-485b-ae25-71a006f5a3a8",
+ "base_position": "-40,85",
+ "category_id": "art"
+ },
+ {
+ "place_id": "12219489-9482-405c-9aa1-5a0098d283f4",
+ "base_position": "-35,90",
+ "category_id": "education"
+ },
+ {
+ "place_id": "2e2a1b4f-9f2c-4a7d-8709-73e22e6efc7e",
+ "base_position": "-12,-146",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f70560c2-450d-48e6-b1a8-9075227ce6ca",
+ "base_position": "-21,70",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f70560c2-450d-48e6-b1a8-9075227ce6ca",
+ "base_position": "-21,70",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "688c5d0d-584f-4287-b89b-74488ea7cf00",
+ "base_position": "56,-112",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "1e047fa6-8802-449e-9aba-95ca559f5f1e",
+ "base_position": "62,-35",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e97e3e1e-0f97-4f7f-adf8-6057a863eaf1",
+ "base_position": "-54,109",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "27966bc8-1c9d-4ee1-90c7-e0e5d1a2318c",
+ "base_position": "-127,-34",
+ "category_id": "social"
+ },
+ {
+ "place_id": "27966bc8-1c9d-4ee1-90c7-e0e5d1a2318c",
+ "base_position": "-127,-34",
+ "category_id": "music"
+ },
+ {
+ "place_id": "27966bc8-1c9d-4ee1-90c7-e0e5d1a2318c",
+ "base_position": "-127,-34",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4a2aca76-efdb-499f-a6e3-dee1cc6700ca",
+ "base_position": "-53,79",
+ "category_id": "music"
+ },
+ {
+ "place_id": "76145a2b-dfb1-4124-9f46-0b856e2eb696",
+ "base_position": "29,-13",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "468a2140-79d0-4824-987c-e70e78e43350",
+ "base_position": "83,-127",
+ "category_id": "game"
+ },
+ {
+ "place_id": "65bcfac5-d754-4dc0-8dd0-33c481b06d01",
+ "base_position": "38,30",
+ "category_id": "social"
+ },
+ {
+ "place_id": "65bcfac5-d754-4dc0-8dd0-33c481b06d01",
+ "base_position": "38,30",
+ "category_id": "music"
+ },
+ {
+ "place_id": "fd3e9154-1ce9-4d3c-8136-0ad92219f696",
+ "base_position": "-118,89",
+ "category_id": "art"
+ },
+ {
+ "place_id": "dc810bf5-6117-4e8d-b243-b6ea8b25328c",
+ "base_position": "-82,-36",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "f57caffd-dda4-40ac-9039-a8bc191dd3c8",
+ "base_position": "-149,147",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b6d259ed-1b14-4f14-b489-f3ccac11c2fb",
+ "base_position": "66,-48",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b6d259ed-1b14-4f14-b489-f3ccac11c2fb",
+ "base_position": "66,-48",
+ "category_id": "music"
+ },
+ {
+ "place_id": "59165997-0209-41e6-9806-d20517b1cc82",
+ "base_position": "82,-36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "59165997-0209-41e6-9806-d20517b1cc82",
+ "base_position": "82,-36",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "59165997-0209-41e6-9806-d20517b1cc82",
+ "base_position": "82,-36",
+ "category_id": "education"
+ },
+ {
+ "place_id": "362f6fd9-613b-41c5-8ee7-09e1aa8d0bb3",
+ "base_position": "-12,-145",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "3d84f6e0-ca5e-47db-bef0-fd3d27307a01",
+ "base_position": "-129,-46",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1ad38711-5018-4205-8405-7372e76a38b0",
+ "base_position": "117,55",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "f0b33174-bcfb-4d7c-a9b8-b466e7d4ba58",
+ "base_position": "-117,-45",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e32fe1a2-ae58-44cf-b7c3-8c8b161483fd",
+ "base_position": "-2,-95",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "ce20c8eb-7dd5-4d6d-9a93-0ae36caff240",
+ "base_position": "-119,-65",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f6e01ccd-79b5-41c8-befa-bb6f648b0b66",
+ "base_position": "-32,-6",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "dfb4efc3-d6d0-475c-89f8-348d72474e2e",
+ "base_position": "-109,-25",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "da7f53af-b736-4cf9-b5dc-04145a5c7ead",
+ "base_position": "-119,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "00d879c7-210b-4ab3-97cd-e8f356fe5bcc",
+ "base_position": "-53,127",
+ "category_id": "education"
+ },
+ {
+ "place_id": "0f90db53-bced-4aff-b3db-0d1deddf6417",
+ "base_position": "-37,90",
+ "category_id": "education"
+ },
+ {
+ "place_id": "e61913ab-5d70-47c4-96a1-86c407767d92",
+ "base_position": "40,123",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "9be7987b-80a4-40a0-9941-7f8720bd5a88",
+ "base_position": "39,122",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cfbac69a-4071-4a9e-9cb2-778057bf2840",
+ "base_position": "-74,29",
+ "category_id": "social"
+ },
+ {
+ "place_id": "cfbac69a-4071-4a9e-9cb2-778057bf2840",
+ "base_position": "-74,29",
+ "category_id": "music"
+ },
+ {
+ "place_id": "dc07e9eb-7d9d-4f26-8522-b5ace2b5f15d",
+ "base_position": "6,63",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a66b6954-e5d5-4ac0-a427-c51ddab6c522",
+ "base_position": "63,-115",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "014f105f-cac1-4385-8c28-d01fbb41399a",
+ "base_position": "-60,-107",
+ "category_id": "art"
+ },
+ {
+ "place_id": "43efb89e-760a-42f0-ac78-99fe78c3a19c",
+ "base_position": "127,-17",
+ "category_id": "art"
+ },
+ {
+ "place_id": "43efb89e-760a-42f0-ac78-99fe78c3a19c",
+ "base_position": "127,-17",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "43efb89e-760a-42f0-ac78-99fe78c3a19c",
+ "base_position": "127,-17",
+ "category_id": "education"
+ },
+ {
+ "place_id": "49ca00a0-541d-4c0b-ab16-15c6f50525d0",
+ "base_position": "129,19",
+ "category_id": "game"
+ },
+ {
+ "place_id": "49ca00a0-541d-4c0b-ab16-15c6f50525d0",
+ "base_position": "129,19",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d10ceb58-7eef-46b5-8056-b32508e7a8d6",
+ "base_position": "51,-114",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b5d14d4c-ffbb-475d-9a10-65d5d4999adb",
+ "base_position": "-78,12",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "4bac7fe5-a923-4ee2-9eae-42d0cba54c47",
+ "base_position": "74,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "c5a616fb-04dd-4a3f-8e2d-ae1343da6263",
+ "base_position": "15,63",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3f4df577-c01f-4c64-98ff-85448ef5af86",
+ "base_position": "-87,25",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "f2c6972d-9046-42ab-bf12-1c40dd6a0d97",
+ "base_position": "-63,39",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "852bdd2b-c2c5-4ad0-93aa-b3a21cd03fd3",
+ "base_position": "-40,92",
+ "category_id": "education"
+ },
+ {
+ "place_id": "ae4f156b-b09e-4529-86fb-259841273dca",
+ "base_position": "144,1",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "8981658a-eae8-4286-821b-9c07f27b1ddb",
+ "base_position": "-76,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "24200720-96c9-4198-a1ca-5933b61c87f4",
+ "base_position": "-130,92",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d6a52477-8f65-4d44-8c70-af9af7c8f102",
+ "base_position": "-11,-120",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "0a228b63-37b7-48a3-afd2-0b956d5978d6",
+ "base_position": "-127,-78",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0a228b63-37b7-48a3-afd2-0b956d5978d6",
+ "base_position": "-127,-78",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "a8dc1c60-116d-420e-82bc-c913b9239d48",
+ "base_position": "138,-15",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "2d6daacb-f169-4812-b2fc-bfe3eb5ac2e6",
+ "base_position": "-131,98",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2511cdb0-8b14-486d-aeb2-7e55d879d951",
+ "base_position": "-127,85",
+ "category_id": "art"
+ },
+ {
+ "place_id": "035b1c0a-b2d3-4f20-a8f6-dd147a347a15",
+ "base_position": "-46,-16",
+ "category_id": "art"
+ },
+ {
+ "place_id": "85090f67-2c12-4aee-a273-f03701df27dc",
+ "base_position": "-124,89",
+ "category_id": "art"
+ },
+ {
+ "place_id": "19890d90-0bde-4089-9cda-f7ed6f4e718d",
+ "base_position": "-134,-37",
+ "category_id": "social"
+ },
+ {
+ "place_id": "19890d90-0bde-4089-9cda-f7ed6f4e718d",
+ "base_position": "-134,-37",
+ "category_id": "music"
+ },
+ {
+ "place_id": "d5765387-c954-498b-9679-188d8ea7c152",
+ "base_position": "27,128",
+ "category_id": "education"
+ },
+ {
+ "place_id": "a03bf50c-31cc-45d4-9288-edd9ab208db0",
+ "base_position": "-63,33",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "e2f6d1f8-c4ab-499b-b7ea-8a55c669ab4f",
+ "base_position": "75,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "516d0138-36ed-4c80-98e6-cbbe842e50ba",
+ "base_position": "-129,-22",
+ "category_id": "art"
+ },
+ {
+ "place_id": "516d0138-36ed-4c80-98e6-cbbe842e50ba",
+ "base_position": "-129,-22",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "88f4092d-1401-4611-8c8e-86f108e092e1",
+ "base_position": "-128,92",
+ "category_id": "game"
+ },
+ {
+ "place_id": "88f4092d-1401-4611-8c8e-86f108e092e1",
+ "base_position": "-128,92",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "78439a8a-0686-4e24-8ed7-2e9f3aeea3af",
+ "base_position": "21,-37",
+ "category_id": "art"
+ },
+ {
+ "place_id": "577b7882-0d50-4dad-b775-3abed7516b01",
+ "base_position": "-20,42",
+ "category_id": "art"
+ },
+ {
+ "place_id": "577b7882-0d50-4dad-b775-3abed7516b01",
+ "base_position": "-20,42",
+ "category_id": "social"
+ },
+ {
+ "place_id": "577b7882-0d50-4dad-b775-3abed7516b01",
+ "base_position": "-20,42",
+ "category_id": "music"
+ },
+ {
+ "place_id": "db0abafa-6977-4c62-a57a-955191e6363e",
+ "base_position": "48,13",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "cfe26ed6-9a83-437f-a9a8-0399d7bf71be",
+ "base_position": "2,-121",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "b7854f2d-a1e4-4eee-82c0-b7fde507f8e8",
+ "base_position": "15,-100",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "21197a91-9b71-40cf-920f-d611a266f0eb",
+ "base_position": "7,-114",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "1a7bbcd3-984a-4167-acdb-942d51ca8682",
+ "base_position": "-22,37",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1a7bbcd3-984a-4167-acdb-942d51ca8682",
+ "base_position": "-22,37",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "8f7f6493-8497-428a-b267-b99086368620",
+ "base_position": "40,-130",
+ "category_id": "art"
+ },
+ {
+ "place_id": "acd9db38-8b02-4442-b40a-ec865b2ea4ba",
+ "base_position": "-1,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "3af33c0d-6a6e-4274-88bb-c1c4f15ed96f",
+ "base_position": "-54,92",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0a2ea96e-3325-4e10-8c3e-36251026c134",
+ "base_position": "-120,-90",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e4c54a16-8f16-41de-a053-8bb3a97b9276",
+ "base_position": "-131,99",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2dd87a9e-dfa2-4de3-a94f-969561121084",
+ "base_position": "-36,92",
+ "category_id": "education"
+ },
+ {
+ "place_id": "6195f01a-0ca2-4f68-9340-6e7f0e3d91dd",
+ "base_position": "2,-103",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "3faca921-8b57-4d0c-91fb-6f13146635d4",
+ "base_position": "45,64",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "fa3db9c9-8f62-416b-b1f6-9e3bce386820",
+ "base_position": "-89,-19",
+ "category_id": "art"
+ },
+ {
+ "place_id": "86407ae4-5d94-49b2-828a-d3eb7ed9480c",
+ "base_position": "36,-95",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "86407ae4-5d94-49b2-828a-d3eb7ed9480c",
+ "base_position": "36,-95",
+ "category_id": "art"
+ },
+ {
+ "place_id": "fb007547-6e8e-4f24-abb3-b4d0841f60fa",
+ "base_position": "-58,21",
+ "category_id": "art"
+ },
+ {
+ "place_id": "fb007547-6e8e-4f24-abb3-b4d0841f60fa",
+ "base_position": "-58,21",
+ "category_id": "social"
+ },
+ {
+ "place_id": "fb007547-6e8e-4f24-abb3-b4d0841f60fa",
+ "base_position": "-58,21",
+ "category_id": "music"
+ },
+ {
+ "place_id": "b80866f4-f51c-4b86-a1d6-999debdbf225",
+ "base_position": "42,-66",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b80866f4-f51c-4b86-a1d6-999debdbf225",
+ "base_position": "42,-66",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "097a513c-a349-4476-8ef1-f612d138d569",
+ "base_position": "-86,-74",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "097a513c-a349-4476-8ef1-f612d138d569",
+ "base_position": "-86,-74",
+ "category_id": "art"
+ },
+ {
+ "place_id": "bb0071d0-0953-4359-ad10-4ca194ca194b",
+ "base_position": "43,144",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d3e49cbf-ecd6-4792-b500-80a9f27118d7",
+ "base_position": "23,127",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d3e49cbf-ecd6-4792-b500-80a9f27118d7",
+ "base_position": "23,127",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "5d57dc2c-ccf4-4749-b2e2-1cb48a4957c4",
+ "base_position": "-52,-133",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7d571466-e3df-401f-bdd5-8a13ebca4831",
+ "base_position": "130,-131",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "b638f4a5-9ac5-4f8a-9017-d3380f82535b",
+ "base_position": "0,141",
+ "category_id": "art"
+ },
+ {
+ "place_id": "df937446-9a11-4a9c-8a92-10db44755102",
+ "base_position": "-61,34",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "513ba5bd-0975-4810-ac7a-b9bf2a32b795",
+ "base_position": "-47,36",
+ "category_id": "social"
+ },
+ {
+ "place_id": "513ba5bd-0975-4810-ac7a-b9bf2a32b795",
+ "base_position": "-47,36",
+ "category_id": "music"
+ },
+ {
+ "place_id": "33572851-42ec-4f65-8799-acad8db14f33",
+ "base_position": "79,-123",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b09c02fe-cc19-4ac4-bd19-1dba75281900",
+ "base_position": "-96,-73",
+ "category_id": "game"
+ },
+ {
+ "place_id": "5fa4ea6e-cf91-4f8d-a6c1-0af738aa3d21",
+ "base_position": "-125,-67",
+ "category_id": "music"
+ },
+ {
+ "place_id": "adf214a2-e5e4-432a-8ed2-3809667368c2",
+ "base_position": "43,96",
+ "category_id": "education"
+ },
+ {
+ "place_id": "36d0b916-c254-4bf3-9922-fda32578bcf4",
+ "base_position": "-84,-142",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "9f23518b-9509-4c33-9beb-f06aa2a4e233",
+ "base_position": "-30,-110",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9f23518b-9509-4c33-9beb-f06aa2a4e233",
+ "base_position": "-30,-110",
+ "category_id": "social"
+ },
+ {
+ "place_id": "9f23518b-9509-4c33-9beb-f06aa2a4e233",
+ "base_position": "-30,-110",
+ "category_id": "music"
+ },
+ {
+ "place_id": "fb8d61a9-c014-4327-a65e-c30ea81266a0",
+ "base_position": "-129,-54",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "d6df5d6e-cd03-4234-902a-4a526be4aea8",
+ "base_position": "-45,-115",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "120e5649-b455-449e-8ad4-cf511f757628",
+ "base_position": "-133,101",
+ "category_id": "art"
+ },
+ {
+ "place_id": "edbdef6d-ce6e-4006-bcb6-a8cf737167b4",
+ "base_position": "-120,86",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d242a994-0478-4c2b-9e0a-8e5451ad1700",
+ "base_position": "-142,-82",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d242a994-0478-4c2b-9e0a-8e5451ad1700",
+ "base_position": "-142,-82",
+ "category_id": "education"
+ },
+ {
+ "place_id": "aba49dce-7154-4389-af28-add6cc4de986",
+ "base_position": "42,-111",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6d80fbc6-046a-4ee5-a358-5cce3ad33a66",
+ "base_position": "-130,-86",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6d80fbc6-046a-4ee5-a358-5cce3ad33a66",
+ "base_position": "-130,-86",
+ "category_id": "social"
+ },
+ {
+ "place_id": "6d80fbc6-046a-4ee5-a358-5cce3ad33a66",
+ "base_position": "-130,-86",
+ "category_id": "music"
+ },
+ {
+ "place_id": "01b74d7a-059b-485a-9da6-a2f142c83042",
+ "base_position": "49,41",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "789cd4b1-5129-4b5e-9e2c-1b456b0229e8",
+ "base_position": "-54,88",
+ "category_id": "social"
+ },
+ {
+ "place_id": "789cd4b1-5129-4b5e-9e2c-1b456b0229e8",
+ "base_position": "-54,88",
+ "category_id": "music"
+ },
+ {
+ "place_id": "abfa6a60-35a6-489f-ae8e-6b2bb4a925f7",
+ "base_position": "38,-64",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "0c69ae08-f0ad-44bf-a15c-f0630f771130",
+ "base_position": "-130,95",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d862b641-24e1-427a-9514-86d99d3b0007",
+ "base_position": "25,128",
+ "category_id": "art"
+ },
+ {
+ "place_id": "46da4566-4055-4cde-9cde-88832cd91e11",
+ "base_position": "-45,122",
+ "category_id": "education"
+ },
+ {
+ "place_id": "aea99e2a-9391-4099-9f2e-6e9cb5487970",
+ "base_position": "78,-127",
+ "category_id": "game"
+ },
+ {
+ "place_id": "d8d787a9-92dd-4e3f-8601-f2911957632b",
+ "base_position": "-89,-21",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c2038fa5-5f4e-45e5-92b3-c561118fdb53",
+ "base_position": "-134,-36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a20c218e-2d88-4758-b49c-e36dfa4d56d4",
+ "base_position": "43,9",
+ "category_id": "art"
+ },
+ {
+ "place_id": "83567e4f-9bd4-43b1-b82c-87781aa35711",
+ "base_position": "-13,30",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d0141b19-f59c-422e-9b1c-153730485a9c",
+ "base_position": "77,-127",
+ "category_id": "game"
+ },
+ {
+ "place_id": "6b9d8304-6cc3-4a9c-a7d2-930ef0eaa46a",
+ "base_position": "132,66",
+ "category_id": "social"
+ },
+ {
+ "place_id": "6b9d8304-6cc3-4a9c-a7d2-930ef0eaa46a",
+ "base_position": "132,66",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6b9d8304-6cc3-4a9c-a7d2-930ef0eaa46a",
+ "base_position": "132,66",
+ "category_id": "education"
+ },
+ {
+ "place_id": "f2276180-a5e2-4ec8-889a-3e3f39350a2d",
+ "base_position": "-41,-24",
+ "category_id": "art"
+ },
+ {
+ "place_id": "2465f2ef-7474-46ef-b6c2-44f397b89923",
+ "base_position": "-105,-79",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "20ca43a2-978e-4385-a710-3e0f39840d6f",
+ "base_position": "55,-113",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "0622834f-49be-462e-890c-c40b0d1b9378",
+ "base_position": "122,-34",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e6145670-bb22-428d-aa9a-b09eb0089367",
+ "base_position": "19,92",
+ "category_id": "social"
+ },
+ {
+ "place_id": "e6145670-bb22-428d-aa9a-b09eb0089367",
+ "base_position": "19,92",
+ "category_id": "music"
+ },
+ {
+ "place_id": "e6145670-bb22-428d-aa9a-b09eb0089367",
+ "base_position": "19,92",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "819b8654-3a21-4e21-b80c-757cef3fabfb",
+ "base_position": "44,-98",
+ "category_id": "art"
+ },
+ {
+ "place_id": "eb7dcdb4-3a23-4a57-9eb0-4232e9a1398a",
+ "base_position": "-88,12",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "3e7baa69-eea3-4d75-ac1f-27a3a38e8210",
+ "base_position": "-4,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a897bf16-bf06-4a67-a005-190fb9b83d23",
+ "base_position": "-46,147",
+ "category_id": "music"
+ },
+ {
+ "place_id": "9817b99e-5686-4c15-96d0-44bc4c2dfcb0",
+ "base_position": "-71,-130",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "1aaa4224-cbcb-44c6-bc97-c151276f122a",
+ "base_position": "82,-149",
+ "category_id": "education"
+ },
+ {
+ "place_id": "2663c6e6-6b30-4d28-8af0-4e08649bcc03",
+ "base_position": "-49,11",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "4dc41eef-79c4-4da5-b4dc-e49fe177d90a",
+ "base_position": "26,129",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "0a27daf9-31f1-4a3c-9c92-82b1271a95fc",
+ "base_position": "-31,37",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "aa1a82f4-7280-41cb-a6a1-feeafc8af38a",
+ "base_position": "35,-62",
+ "category_id": "social"
+ },
+ {
+ "place_id": "aa1a82f4-7280-41cb-a6a1-feeafc8af38a",
+ "base_position": "35,-62",
+ "category_id": "music"
+ },
+ {
+ "place_id": "2f2f120b-ec7f-4cee-be1d-6b499740235f",
+ "base_position": "62,-77",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d4e5af2c-cbfe-4dfa-979f-f0dbaad03881",
+ "base_position": "-148,-146",
+ "category_id": "social"
+ },
+ {
+ "place_id": "c3e55ec6-0a43-425b-a5ec-e8e058af4e9b",
+ "base_position": "82,-127",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c3e55ec6-0a43-425b-a5ec-e8e058af4e9b",
+ "base_position": "82,-127",
+ "category_id": "education"
+ },
+ {
+ "place_id": "c3e55ec6-0a43-425b-a5ec-e8e058af4e9b",
+ "base_position": "82,-127",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "42d5a291-3495-4257-b710-cf178ab8acc4",
+ "base_position": "76,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "7646df0c-f683-41f7-b12a-a109b36d5f8a",
+ "base_position": "149,-32",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "80d7a9b2-f178-4663-86e0-51fa2c834aa2",
+ "base_position": "12,-126",
+ "category_id": "art"
+ },
+ {
+ "place_id": "272d7347-d512-4a8b-894e-29d173dd884e",
+ "base_position": "-15,-60",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "03f09fa5-cf67-4262-8680-93bada04e5f8",
+ "base_position": "84,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "c14452c8-cacc-4de7-a00a-439552d597c5",
+ "base_position": "88,29",
+ "category_id": "game"
+ },
+ {
+ "place_id": "fd066f26-15be-4988-9e91-130b44c9ce99",
+ "base_position": "-129,92",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c973e285-ae54-46d4-acf2-5f345ce50a69",
+ "base_position": "-142,-81",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8451c027-4cdb-4a6e-b5b9-c9b43e830fa2",
+ "base_position": "121,-140",
+ "category_id": "music"
+ },
+ {
+ "place_id": "e2946f8f-5b38-4646-8f86-3792571bd9cd",
+ "base_position": "-70,14",
+ "category_id": "education"
+ },
+ {
+ "place_id": "14b8f43c-6372-46fd-88ef-eb0e2c63cc0a",
+ "base_position": "-35,92",
+ "category_id": "education"
+ },
+ {
+ "place_id": "048f308a-8282-43c8-a7b2-72a6cb755522",
+ "base_position": "10,-117",
+ "category_id": "social"
+ },
+ {
+ "place_id": "048f308a-8282-43c8-a7b2-72a6cb755522",
+ "base_position": "10,-117",
+ "category_id": "music"
+ },
+ {
+ "place_id": "048f308a-8282-43c8-a7b2-72a6cb755522",
+ "base_position": "10,-117",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f0ac3ae2-34d9-4a81-aad5-daca96550955",
+ "base_position": "-51,116",
+ "category_id": "social"
+ },
+ {
+ "place_id": "f0ac3ae2-34d9-4a81-aad5-daca96550955",
+ "base_position": "-51,116",
+ "category_id": "music"
+ },
+ {
+ "place_id": "50d0ef2f-8ee2-4403-a442-156b796dfa33",
+ "base_position": "-127,-76",
+ "category_id": "art"
+ },
+ {
+ "place_id": "464bf368-b28b-4bd0-ae1f-5b6e923623fc",
+ "base_position": "62,43",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f568f503-549e-4050-ac87-4cfe461e9ca7",
+ "base_position": "-57,21",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f568f503-549e-4050-ac87-4cfe461e9ca7",
+ "base_position": "-57,21",
+ "category_id": "social"
+ },
+ {
+ "place_id": "f568f503-549e-4050-ac87-4cfe461e9ca7",
+ "base_position": "-57,21",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a964ecb4-2934-4853-ac2d-ab7df0fcad4d",
+ "base_position": "-57,150",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6b15ff88-bd90-46dd-91c6-02344cafc67a",
+ "base_position": "-66,41",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a2d4960d-c054-4809-a873-23575f58ed51",
+ "base_position": "-47,96",
+ "category_id": "music"
+ },
+ {
+ "place_id": "8c384dec-6550-4a6b-a5a4-66ad2bf591a4",
+ "base_position": "-123,-31",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "6a1ef185-207c-4d0b-987e-4bb3ba0b92ef",
+ "base_position": "-113,-27",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6a1ef185-207c-4d0b-987e-4bb3ba0b92ef",
+ "base_position": "-113,-27",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "06363f44-2aa1-423c-9e4f-194665aa93ab",
+ "base_position": "-123,-27",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4e534538-98ed-4fdf-8c9d-e335c13c6bc5",
+ "base_position": "30,23",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4e16141b-33a0-4b8a-a827-2c4999234f71",
+ "base_position": "-121,96",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1e29232a-5c7c-436a-b675-2e26e99a0f93",
+ "base_position": "69,-124",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "cac5e3d5-2c43-4eb9-a6cd-204f1e32c893",
+ "base_position": "-125,20",
+ "category_id": "social"
+ },
+ {
+ "place_id": "13d5373a-f40d-43a5-a98d-c2de41419830",
+ "base_position": "-127,80",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7f117ad2-326b-4cba-a6ee-9df9bfd41fcd",
+ "base_position": "-123,-68",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "7aa4fbc8-6413-4899-85bf-49972545848b",
+ "base_position": "-42,85",
+ "category_id": "game"
+ },
+ {
+ "place_id": "7efce3ec-306a-4583-a5e1-204656db95ae",
+ "base_position": "149,-18",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "cc574383-283d-4a1f-a9b4-dea2765d5583",
+ "base_position": "-146,-147",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "cc27e5d4-d70a-4cea-8b67-0991eb556c4a",
+ "base_position": "24,-145",
+ "category_id": "game"
+ },
+ {
+ "place_id": "13ba878c-1809-439d-93d3-b2536143d9b9",
+ "base_position": "-119,17",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3868236a-46d7-45cd-88b0-f5aaa17c8e75",
+ "base_position": "63,-116",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "8e72fc35-53c4-44c4-9f7d-69c9d878312a",
+ "base_position": "149,-41",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "9593a25c-08de-4135-b6c3-388aeca12ef7",
+ "base_position": "-34,90",
+ "category_id": "education"
+ },
+ {
+ "place_id": "12a66b25-fa64-4711-be3c-2a8a9f96ca91",
+ "base_position": "-131,-71",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b5f7aa22-7f23-47cb-a210-d751c1c0c522",
+ "base_position": "-21,-102",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ea622d05-48a8-43ab-a1c6-0e8a847b890d",
+ "base_position": "-54,125",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "dd04b2dc-5b76-41fb-b85b-80768a4aa3bf",
+ "base_position": "46,-122",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "57a80f54-5628-42d7-aa8a-3daa2fd82606",
+ "base_position": "-88,13",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ed5fdc9f-2e87-4e2f-b9b0-a0e9974f016e",
+ "base_position": "-20,-143",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "cd9b29c5-1f41-4358-8d9c-172ebb36fae4",
+ "base_position": "51,-130",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "925dc8d7-e3e3-46f4-959a-bea33e3d03f3",
+ "base_position": "-58,106",
+ "category_id": "game"
+ },
+ {
+ "place_id": "9672c369-3736-47fc-84ac-4fd62b945c16",
+ "base_position": "-34,92",
+ "category_id": "education"
+ },
+ {
+ "place_id": "9f544f58-1b26-42f7-8425-b15b652f2740",
+ "base_position": "-49,-37",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e43383f9-3c8d-461d-bef0-664083667492",
+ "base_position": "-85,-104",
+ "category_id": "art"
+ },
+ {
+ "place_id": "f5428f13-1286-4e01-8856-9fb541b2434b",
+ "base_position": "-52,-30",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6787c8d8-d86d-4580-8289-b1cefd5c18b8",
+ "base_position": "49,-78",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9cb10dac-6767-44a6-a379-9208fb9afc4b",
+ "base_position": "-10,-113",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b0586ca4-ac8c-4d31-bf99-de8a3f71b1af",
+ "base_position": "72,44",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5dfee0f5-8c40-4cc3-97f7-f8a71fa2a9ff",
+ "base_position": "119,76",
+ "category_id": "education"
+ },
+ {
+ "place_id": "7a3c6be5-c055-4df4-a485-0678ee10bde2",
+ "base_position": "-42,129",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "dab4890c-e9e0-4b4e-88e2-db1b585e761e",
+ "base_position": "-19,-146",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b1990a3b-884e-420c-b46c-894aeda00a36",
+ "base_position": "-140,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "87aea680-ec3c-4aa9-a740-e9f8acc97151",
+ "base_position": "-129,-67",
+ "category_id": "art"
+ },
+ {
+ "place_id": "20717f87-5dcb-414c-84e7-7ad89acf6287",
+ "base_position": "-10,-120",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ca1f2218-d4b3-4ad2-9ab9-f672a9f2da56",
+ "base_position": "-127,86",
+ "category_id": "art"
+ },
+ {
+ "place_id": "723aaada-af42-4bac-b018-e33d4e1a8ff9",
+ "base_position": "24,-144",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b9e0224f-9290-4a34-8845-e2e0dfb6ac18",
+ "base_position": "131,-127",
+ "category_id": "social"
+ },
+ {
+ "place_id": "b9e0224f-9290-4a34-8845-e2e0dfb6ac18",
+ "base_position": "131,-127",
+ "category_id": "music"
+ },
+ {
+ "place_id": "40cc0290-bcb7-4de7-9753-44c355525c57",
+ "base_position": "20,129",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b8911434-07db-4177-8c9e-b50a02deb127",
+ "base_position": "-10,-69",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b8911434-07db-4177-8c9e-b50a02deb127",
+ "base_position": "-10,-69",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b8911434-07db-4177-8c9e-b50a02deb127",
+ "base_position": "-10,-69",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ce13cb0b-a522-451b-a8fe-ae3770feca8a",
+ "base_position": "34,14",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3e280feb-0091-498f-a8b8-d8338a4379a5",
+ "base_position": "-112,-47",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6474bba6-3cd9-4b0c-86f7-a27f3697bcc4",
+ "base_position": "133,-35",
+ "category_id": "social"
+ },
+ {
+ "place_id": "839009ef-43a4-46cf-a8b6-6ef03089c871",
+ "base_position": "20,-141",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "559bdbb4-e65f-4b82-bbcb-af3e295dac73",
+ "base_position": "84,-123",
+ "category_id": "game"
+ },
+ {
+ "place_id": "292f1c8b-472e-421a-9673-b33791ff994c",
+ "base_position": "36,-18",
+ "category_id": "social"
+ },
+ {
+ "place_id": "292f1c8b-472e-421a-9673-b33791ff994c",
+ "base_position": "36,-18",
+ "category_id": "music"
+ },
+ {
+ "place_id": "bbdb796f-5f98-4fe8-821a-7d4cfee3a314",
+ "base_position": "-92,-53",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "3442e3ac-b784-41cd-b5af-8d3f63284528",
+ "base_position": "-73,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "c3b801e1-7009-4596-a253-792375c5deed",
+ "base_position": "-126,86",
+ "category_id": "art"
+ },
+ {
+ "place_id": "98fce399-d445-4396-b66e-b87ea0dfa6d1",
+ "base_position": "-40,96",
+ "category_id": "education"
+ },
+ {
+ "place_id": "2c7c4d6d-4849-46dd-b7b7-6595c9247082",
+ "base_position": "45,-99",
+ "category_id": "art"
+ },
+ {
+ "place_id": "251a2efb-20e4-4881-a9d5-e4a3f582e7ed",
+ "base_position": "-56,-8",
+ "category_id": "social"
+ },
+ {
+ "place_id": "251a2efb-20e4-4881-a9d5-e4a3f582e7ed",
+ "base_position": "-56,-8",
+ "category_id": "music"
+ },
+ {
+ "place_id": "47c11973-dcb3-4611-ab8c-33124003b789",
+ "base_position": "-77,-68",
+ "category_id": "art"
+ },
+ {
+ "place_id": "47c11973-dcb3-4611-ab8c-33124003b789",
+ "base_position": "-77,-68",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "08501c66-9c68-42a4-a919-73c1e39d0a2c",
+ "base_position": "-130,-85",
+ "category_id": "art"
+ },
+ {
+ "place_id": "14d7a673-2db9-460c-ae3e-079ae7c777eb",
+ "base_position": "44,-99",
+ "category_id": "art"
+ },
+ {
+ "place_id": "fdca3957-d622-43a6-a40d-42b0339145da",
+ "base_position": "-11,25",
+ "category_id": "art"
+ },
+ {
+ "place_id": "bc11c1f8-38fd-4875-bdf1-0e8cfe688e79",
+ "base_position": "39,-71",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4d552034-2801-4c85-af7f-73e91ebf4bfb",
+ "base_position": "43,10",
+ "category_id": "art"
+ },
+ {
+ "place_id": "775376a3-dbac-4cd6-b0ca-82adc6e50b14",
+ "base_position": "-13,-66",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "d763352e-8acc-4d7f-8a98-cb13996b3ae9",
+ "base_position": "-127,-67",
+ "category_id": "social"
+ },
+ {
+ "place_id": "a051822d-b28d-406d-9789-40196e593f7a",
+ "base_position": "84,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "1f032bcb-68ce-447c-99f5-d1f44d2cb929",
+ "base_position": "41,84",
+ "category_id": "art"
+ },
+ {
+ "place_id": "087409f5-694c-47a6-841f-bda844d58ad9",
+ "base_position": "81,-127",
+ "category_id": "game"
+ },
+ {
+ "place_id": "c0367799-b0fb-4162-b500-9ae22b56f404",
+ "base_position": "77,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "3a0fdc14-1630-4788-96b9-8cf31503cb34",
+ "base_position": "41,-66",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b29f8805-a2d0-4a2e-baf1-e37bfc711d15",
+ "base_position": "84,-124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "0122d2e7-333a-403e-9180-377f36d337f9",
+ "base_position": "-17,-143",
+ "category_id": "education"
+ },
+ {
+ "place_id": "2f85d4a6-4404-42b5-9ea8-46e2ddf13c73",
+ "base_position": "-81,-17",
+ "category_id": "social"
+ },
+ {
+ "place_id": "7bfe3147-79e4-4f55-8cbd-651313484003",
+ "base_position": "80,-124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "2a5b78d1-b9b9-4be2-aad3-ea4232d100a2",
+ "base_position": "-131,-59",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "310bfbd1-c4e2-499b-94e3-98e9f8adfc28",
+ "base_position": "-43,-28",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9d878667-e178-4aa0-964a-8ffe26b10635",
+ "base_position": "120,66",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "8bc15dd1-746b-491e-ab34-da09d5ed5044",
+ "base_position": "-148,40",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "d00a07b0-2813-4dea-ba43-4592cd1e8c69",
+ "base_position": "-125,86",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0de9397c-f413-4ae3-be85-2bfed659ca6e",
+ "base_position": "-87,32",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "014cdbfb-b6c3-4b01-b4c7-5faab01a7515",
+ "base_position": "80,-127",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b64fb7c8-9558-43bc-8601-3b607673b415",
+ "base_position": "-123,101",
+ "category_id": "social"
+ },
+ {
+ "place_id": "80db52e2-7a62-46ce-820a-d6fb5f2ef895",
+ "base_position": "13,-142",
+ "category_id": "music"
+ },
+ {
+ "place_id": "80db52e2-7a62-46ce-820a-d6fb5f2ef895",
+ "base_position": "13,-142",
+ "category_id": "art"
+ },
+ {
+ "place_id": "80016432-bd53-4798-b04b-39ab23e232ae",
+ "base_position": "-57,149",
+ "category_id": "game"
+ },
+ {
+ "place_id": "4808f101-a0b4-43ca-96e8-91810c4a4d3b",
+ "base_position": "147,-54",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6b99b9b2-1064-4de6-81f4-127a00432e34",
+ "base_position": "-82,-105",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "bcb9f6c8-1339-4fbf-86e2-138cbaf6a483",
+ "base_position": "-145,-149",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "56a8240e-6eb0-4837-9c1a-f43d8f5a2733",
+ "base_position": "83,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "d8391e07-90d2-4732-bf2b-5ad4faf749af",
+ "base_position": "25,129",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b8bfebb6-749c-4aa6-be4d-33edd23a5ad6",
+ "base_position": "62,-104",
+ "category_id": "casino"
+ },
+ {
+ "place_id": "954690e9-c84e-4b27-8531-7dcef6ec84aa",
+ "base_position": "42,103",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "a9c05901-b8f6-490f-8a39-c98cb03a1cd9",
+ "base_position": "38,116",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0b005584-8292-4906-beb9-cf3151605070",
+ "base_position": "-129,98",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8de2b87b-ea14-4b79-a690-ffb9bf3b405b",
+ "base_position": "42,8",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8de2b87b-ea14-4b79-a690-ffb9bf3b405b",
+ "base_position": "42,8",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "06f9b8ef-13c1-4bdc-94ef-15b5ec329e87",
+ "base_position": "-42,-102",
+ "category_id": "art"
+ },
+ {
+ "place_id": "90d91d0c-e28c-4f59-bc94-8e33bed8f744",
+ "base_position": "-133,-84",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ddc9d247-cae5-4ac7-9b6d-b77a4444aab3",
+ "base_position": "19,-56",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b891310c-2497-4ead-83de-d356aebec25a",
+ "base_position": "-125,101",
+ "category_id": "art"
+ },
+ {
+ "place_id": "773d1796-319e-4c36-8a92-cbcd2360d09f",
+ "base_position": "-91,33",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a3fa55e5-93ac-481d-87d6-fd612d0b3e14",
+ "base_position": "-55,-3",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a3fa55e5-93ac-481d-87d6-fd612d0b3e14",
+ "base_position": "-55,-3",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "568ae721-f56e-4596-832e-8df2f2680484",
+ "base_position": "-56,100",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0ef83995-dc60-4817-a850-665286beadce",
+ "base_position": "139,-42",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "da0629f0-1275-497b-b534-606819637d97",
+ "base_position": "111,-37",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "3ea7a08b-6bc1-45cd-b9ec-8153e5234533",
+ "base_position": "75,124",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ae3a9e12-cb89-429b-afab-b7d133ccb1d3",
+ "base_position": "76,36",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "583d64e6-7dca-405f-8262-43cb2b121ca2",
+ "base_position": "22,-145",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "19c2e29c-9f13-4198-9acd-646e4b8fb52f",
+ "base_position": "-71,-32",
+ "category_id": "art"
+ },
+ {
+ "place_id": "46b238cc-b1be-4590-8f8f-845197fb6099",
+ "base_position": "-121,90",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ccf012dc-0cee-4dfd-ac02-6076ff8a44b6",
+ "base_position": "134,-16",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ccf012dc-0cee-4dfd-ac02-6076ff8a44b6",
+ "base_position": "134,-16",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "8d7c968a-95f2-4149-85c2-46c41786472e",
+ "base_position": "30,-22",
+ "category_id": "game"
+ },
+ {
+ "place_id": "ac69ac98-166a-4299-a42f-df9ef0d83404",
+ "base_position": "-92,-140",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "66291483-c75e-44b1-b111-715e20f5a7ab",
+ "base_position": "-123,-63",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "c6c693b6-a7f3-40f2-9d04-a66174bc5c26",
+ "base_position": "-84,-103",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c0a156af-4c4c-44cd-b5b6-7d1f71940223",
+ "base_position": "-125,98",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c0a156af-4c4c-44cd-b5b6-7d1f71940223",
+ "base_position": "-125,98",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "1f8ddf0e-bee4-4d08-b67f-cb44e7038633",
+ "base_position": "-48,-142",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "c26daba6-cf04-4333-9e42-e78f74dec636",
+ "base_position": "-13,-71",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e7b7e6c5-67c9-468f-9cbe-d41c003704ce",
+ "base_position": "-9,-68",
+ "category_id": "art"
+ },
+ {
+ "place_id": "220c7d36-6ff0-45d8-83f4-3cee2176fec8",
+ "base_position": "149,10",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ef79f6d3-66e1-41b4-bf6d-da4e02668abe",
+ "base_position": "-121,94",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c88b7019-2ddb-478c-ad4e-6a8afc71a4f4",
+ "base_position": "-61,21",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b2200ad1-62b5-45d1-a092-557292c9d0f1",
+ "base_position": "-52,-33",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b2200ad1-62b5-45d1-a092-557292c9d0f1",
+ "base_position": "-52,-33",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "f78a4c92-e828-466e-b1db-50248767a5dd",
+ "base_position": "144,-24",
+ "category_id": "education"
+ },
+ {
+ "place_id": "39cedf57-25ba-4803-a197-2882980396c5",
+ "base_position": "-81,-26",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "fdf32704-dc75-438f-a6e5-597f9f781861",
+ "base_position": "0,148",
+ "category_id": "art"
+ },
+ {
+ "place_id": "fdf32704-dc75-438f-a6e5-597f9f781861",
+ "base_position": "0,148",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "0c2337c3-f3d5-400e-bd2f-9b2f490d9374",
+ "base_position": "124,-18",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0c2337c3-f3d5-400e-bd2f-9b2f490d9374",
+ "base_position": "124,-18",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "1992db16-c596-44d5-a542-7bb48ae16363",
+ "base_position": "73,34",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1992db16-c596-44d5-a542-7bb48ae16363",
+ "base_position": "73,34",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "bf8b5412-7155-44e6-93b6-28c93ebb2d12",
+ "base_position": "18,-125",
+ "category_id": "art"
+ },
+ {
+ "place_id": "19303821-e960-4453-b04e-c632774fc65a",
+ "base_position": "-65,107",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "fb0ae26e-12fa-401d-90b6-c2c9b2b48a5b",
+ "base_position": "74,-127",
+ "category_id": "art"
+ },
+ {
+ "place_id": "fb0ae26e-12fa-401d-90b6-c2c9b2b48a5b",
+ "base_position": "74,-127",
+ "category_id": "education"
+ },
+ {
+ "place_id": "fb0ae26e-12fa-401d-90b6-c2c9b2b48a5b",
+ "base_position": "74,-127",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "b3b09362-3126-49fa-9d0e-c9e46a96157b",
+ "base_position": "-130,-48",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "19bb34f5-972e-4223-a99a-6aa0a4bd7424",
+ "base_position": "75,-123",
+ "category_id": "game"
+ },
+ {
+ "place_id": "63cbe634-115b-4f88-8d23-07260a8d4dc9",
+ "base_position": "-62,34",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "e5766a27-c519-489a-a3f5-a87314f6cba4",
+ "base_position": "-82,-35",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "9f64d741-1bae-43ab-b837-f8c28d349971",
+ "base_position": "75,-25",
+ "category_id": "game"
+ },
+ {
+ "place_id": "437b6268-bd4e-40cc-8632-7a78b8cc39c0",
+ "base_position": "50,131",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f9bc9d60-4caa-4ebb-8691-a9c50a6e180c",
+ "base_position": "39,67",
+ "category_id": "social"
+ },
+ {
+ "place_id": "f9bc9d60-4caa-4ebb-8691-a9c50a6e180c",
+ "base_position": "39,67",
+ "category_id": "music"
+ },
+ {
+ "place_id": "cc8114ac-5f4d-4998-b0c7-fd23e5f7852c",
+ "base_position": "5,-148",
+ "category_id": "education"
+ },
+ {
+ "place_id": "d2aeba3f-1343-47e8-b92c-94fa5fe08972",
+ "base_position": "-93,-39",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d2aeba3f-1343-47e8-b92c-94fa5fe08972",
+ "base_position": "-93,-39",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "a00fc873-b7e4-4a21-bceb-e5fb9ce7270b",
+ "base_position": "78,-128",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ec2bb9a1-553b-4a31-9f59-b45238db44f4",
+ "base_position": "-109,-67",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "6033499e-69ed-4ff7-9419-0491579363ac",
+ "base_position": "21,92",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "6033499e-69ed-4ff7-9419-0491579363ac",
+ "base_position": "21,92",
+ "category_id": "social"
+ },
+ {
+ "place_id": "6033499e-69ed-4ff7-9419-0491579363ac",
+ "base_position": "21,92",
+ "category_id": "education"
+ },
+ {
+ "place_id": "fe218a3f-c452-46e9-bb42-1dc1fd0825f2",
+ "base_position": "150,1",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "b1ba91e8-3a81-406f-b79c-ee53ea8cc053",
+ "base_position": "2,-95",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "cd8b888e-2468-472d-9dc1-fe5b53a7e5e9",
+ "base_position": "-121,86",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0bca2310-7115-4cf0-b28d-9246f516b067",
+ "base_position": "-70,-20",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6f386b8a-cbf2-49c9-8f1b-cef35a757995",
+ "base_position": "-60,-140",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d908a731-ba00-4b23-a902-2be50344ae74",
+ "base_position": "-43,20",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6b362fc1-c884-4c85-9f0a-d1c831d0b850",
+ "base_position": "-126,81",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c1ace50d-f73d-4793-ab94-c7ab0515fcc3",
+ "base_position": "-6,-59",
+ "category_id": "art"
+ },
+ {
+ "place_id": "186448fb-9fad-41ae-a288-cca5287d0072",
+ "base_position": "76,28",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d41a3863-b855-4aa3-87a9-1f39ae7ec01c",
+ "base_position": "-146,25",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "d41a3863-b855-4aa3-87a9-1f39ae7ec01c",
+ "base_position": "-146,25",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "cd0e4861-7f0a-4d2c-98e7-fc076f3cdd34",
+ "base_position": "53,-94",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cd0e4861-7f0a-4d2c-98e7-fc076f3cdd34",
+ "base_position": "53,-94",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "78bb2bbe-d5cc-4adc-bd78-b80f8b29a382",
+ "base_position": "134,-17",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "30ace8c5-dc67-437e-a47d-f21c1c86e26b",
+ "base_position": "-132,-54",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "ea4971fb-4c66-4e05-9d82-a5ad8711f789",
+ "base_position": "36,-61",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ea4971fb-4c66-4e05-9d82-a5ad8711f789",
+ "base_position": "36,-61",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "6ec10702-315b-48e0-8b77-077787696745",
+ "base_position": "82,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "7cb9fbe3-bfd3-4871-bdca-2c90de8c8497",
+ "base_position": "-61,35",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "9f1f608e-8475-4a02-95f5-70cdd7cbcafc",
+ "base_position": "81,-124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b80859ed-9d8e-4b37-b273-42522a23f8a5",
+ "base_position": "82,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "f999ed47-8451-4be7-bbbc-d6ce9fe53f85",
+ "base_position": "103,-31",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "d5fa195c-2501-4b29-9665-7b4cdff727f7",
+ "base_position": "20,-56",
+ "category_id": "art"
+ },
+ {
+ "place_id": "849de926-3fba-4120-b8d2-a1072abb73af",
+ "base_position": "-1,-100",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "7aa2a1d7-5263-4eca-81c2-97de63807b3e",
+ "base_position": "-135,-56",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "e5dff831-7715-44d7-bd73-825c59bb6018",
+ "base_position": "-110,-60",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "2348ed9d-8d36-448a-8561-a4a6f8f235a9",
+ "base_position": "23,-144",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "a3c5d73f-530a-45ba-950f-b39ed66c9915",
+ "base_position": "134,37",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "2b5af553-c6e6-4e29-9277-077cea1a4eaf",
+ "base_position": "3,-94",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "92265390-a2ca-47ab-9215-0f1cd34d7d1a",
+ "base_position": "22,89",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "bb1be474-46e4-426e-9301-6877af46aa01",
+ "base_position": "-38,96",
+ "category_id": "education"
+ },
+ {
+ "place_id": "f4cf4509-930d-4989-891e-02cd945e2b09",
+ "base_position": "-110,-25",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "08a3d3e3-a6ca-4b72-a19e-63cb6bdae318",
+ "base_position": "-123,96",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1fc7ba19-0d93-44be-bd45-28acc90b74b0",
+ "base_position": "23,-104",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ae5b61a6-7ee1-4c6e-bf18-ba7e38080b88",
+ "base_position": "-19,-143",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "4ef5eb84-9b40-4eff-a22b-dc587c3fe199",
+ "base_position": "-118,-66",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "18dd8040-2963-4974-a1a9-bc8bba8123a5",
+ "base_position": "104,-36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "18dd8040-2963-4974-a1a9-bc8bba8123a5",
+ "base_position": "104,-36",
+ "category_id": "social"
+ },
+ {
+ "place_id": "18dd8040-2963-4974-a1a9-bc8bba8123a5",
+ "base_position": "104,-36",
+ "category_id": "music"
+ },
+ {
+ "place_id": "df55a54b-bbbd-4757-9fd0-438e55ae0b4a",
+ "base_position": "121,150",
+ "category_id": "art"
+ },
+ {
+ "place_id": "29521766-93e0-4c0f-ab72-922a04593e08",
+ "base_position": "-78,-31",
+ "category_id": "art"
+ },
+ {
+ "place_id": "29521766-93e0-4c0f-ab72-922a04593e08",
+ "base_position": "-78,-31",
+ "category_id": "social"
+ },
+ {
+ "place_id": "29521766-93e0-4c0f-ab72-922a04593e08",
+ "base_position": "-78,-31",
+ "category_id": "music"
+ },
+ {
+ "place_id": "ee3fbe7e-4f51-47ed-a47f-a921c1118eb1",
+ "base_position": "7,-95",
+ "category_id": "game"
+ },
+ {
+ "place_id": "5f9fb8c8-89da-417b-b1b2-1e330f3d7e4f",
+ "base_position": "-70,141",
+ "category_id": "art"
+ },
+ {
+ "place_id": "8f4c2d11-6f91-4a35-846e-4c1a09dccdd2",
+ "base_position": "-109,-36",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c98ac65a-0323-4291-87e6-3e27231beffd",
+ "base_position": "70,-139",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1b8b06c7-a1e9-426e-a652-f2811670fdf1",
+ "base_position": "-130,-83",
+ "category_id": "art"
+ },
+ {
+ "place_id": "a2b3805f-ed0d-4e80-9e64-4c2ee1662df1",
+ "base_position": "79,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "e22a07af-30e4-4273-9a2b-a09d460e08c6",
+ "base_position": "18,90",
+ "category_id": "social"
+ },
+ {
+ "place_id": "e22a07af-30e4-4273-9a2b-a09d460e08c6",
+ "base_position": "18,90",
+ "category_id": "music"
+ },
+ {
+ "place_id": "aabb01b2-1204-4de4-9b02-f6d0ea85cf64",
+ "base_position": "80,-123",
+ "category_id": "art"
+ },
+ {
+ "place_id": "aabb01b2-1204-4de4-9b02-f6d0ea85cf64",
+ "base_position": "80,-123",
+ "category_id": "education"
+ },
+ {
+ "place_id": "aabb01b2-1204-4de4-9b02-f6d0ea85cf64",
+ "base_position": "80,-123",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "1b184cc9-0d37-4ef3-bb7b-ec90394fd36b",
+ "base_position": "-135,102",
+ "category_id": "sports"
+ },
+ {
+ "place_id": "1b184cc9-0d37-4ef3-bb7b-ec90394fd36b",
+ "base_position": "-135,102",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "f040e23c-b96b-4ea8-9af0-770277e83834",
+ "base_position": "83,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "a2dbdde6-ca41-43fd-9209-3c9909ec8321",
+ "base_position": "-46,111",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d64bac7c-9b5b-480a-b4a7-d3e19a8d62bf",
+ "base_position": "83,-123",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d64bac7c-9b5b-480a-b4a7-d3e19a8d62bf",
+ "base_position": "83,-123",
+ "category_id": "education"
+ },
+ {
+ "place_id": "d64bac7c-9b5b-480a-b4a7-d3e19a8d62bf",
+ "base_position": "83,-123",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "d9244963-3373-4ae7-bcb9-95232ae6af05",
+ "base_position": "79,-124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "c6d4d912-d124-4688-971d-fde3d0ab95ae",
+ "base_position": "-62,-104",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c0a6ed1f-8834-4259-8cea-475f1c47c874",
+ "base_position": "17,-102",
+ "category_id": "art"
+ },
+ {
+ "place_id": "489cb16b-ac5b-4cfd-9140-12151a32e007",
+ "base_position": "-55,-127",
+ "category_id": "social"
+ },
+ {
+ "place_id": "489cb16b-ac5b-4cfd-9140-12151a32e007",
+ "base_position": "-55,-127",
+ "category_id": "music"
+ },
+ {
+ "place_id": "ad046fe7-c708-4dc7-8f3f-0e2ac9bcba01",
+ "base_position": "-110,30",
+ "category_id": "social"
+ },
+ {
+ "place_id": "ad046fe7-c708-4dc7-8f3f-0e2ac9bcba01",
+ "base_position": "-110,30",
+ "category_id": "music"
+ },
+ {
+ "place_id": "6f6c5538-888a-46f3-9ff8-c85380775ca5",
+ "base_position": "-142,-45",
+ "category_id": "art"
+ },
+ {
+ "place_id": "bc01649f-fc03-4a70-8553-2f2d43308627",
+ "base_position": "78,-123",
+ "category_id": "game"
+ },
+ {
+ "place_id": "0c08b598-bf08-4cc3-87f5-70eb92045382",
+ "base_position": "16,60",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "73849b3d-0f2f-4970-b97e-5604594e1724",
+ "base_position": "74,-123",
+ "category_id": "art"
+ },
+ {
+ "place_id": "73849b3d-0f2f-4970-b97e-5604594e1724",
+ "base_position": "74,-123",
+ "category_id": "education"
+ },
+ {
+ "place_id": "73849b3d-0f2f-4970-b97e-5604594e1724",
+ "base_position": "74,-123",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "38328286-df3b-4ef2-a2fa-7d5c4d60d66a",
+ "base_position": "119,-142",
+ "category_id": "art"
+ },
+ {
+ "place_id": "edfaf471-88d8-40df-866a-8e7e04fe5013",
+ "base_position": "32,-149",
+ "category_id": "social"
+ },
+ {
+ "place_id": "edfaf471-88d8-40df-866a-8e7e04fe5013",
+ "base_position": "32,-149",
+ "category_id": "art"
+ },
+ {
+ "place_id": "edfaf471-88d8-40df-866a-8e7e04fe5013",
+ "base_position": "32,-149",
+ "category_id": "education"
+ },
+ {
+ "place_id": "3b9972ad-053c-461f-b5d9-90cb25355733",
+ "base_position": "75,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "f03b8001-c658-4fb3-8f26-76d395912467",
+ "base_position": "-118,-25",
+ "category_id": "social"
+ },
+ {
+ "place_id": "f03b8001-c658-4fb3-8f26-76d395912467",
+ "base_position": "-118,-25",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a96b702b-6204-49c6-8e74-d536e8594803",
+ "base_position": "77,-124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "cc93632a-d577-4023-878e-7d0d6a5dcaaa",
+ "base_position": "-40,97",
+ "category_id": "education"
+ },
+ {
+ "place_id": "74e7abf8-f899-4e6c-b116-292777317900",
+ "base_position": "19,-57",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "f7eba3cb-90d4-4cb0-92f2-6510e3880940",
+ "base_position": "81,-123",
+ "category_id": "game"
+ },
+ {
+ "place_id": "bb0687c8-56cd-465f-90ab-d7ab08004f3d",
+ "base_position": "20,-60",
+ "category_id": "game"
+ },
+ {
+ "place_id": "bb0687c8-56cd-465f-90ab-d7ab08004f3d",
+ "base_position": "20,-60",
+ "category_id": "social"
+ },
+ {
+ "place_id": "bb0687c8-56cd-465f-90ab-d7ab08004f3d",
+ "base_position": "20,-60",
+ "category_id": "music"
+ },
+ {
+ "place_id": "bf7b858b-0341-4b4f-bbee-53c8c2c7ac2f",
+ "base_position": "75,-124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "a434e8c4-78ea-4aec-bbf4-67f4cd07ab77",
+ "base_position": "-41,81",
+ "category_id": "social"
+ },
+ {
+ "place_id": "e7e815da-a207-41ab-8761-9f2d4a8fc92d",
+ "base_position": "41,58",
+ "category_id": "game"
+ },
+ {
+ "place_id": "20b78a66-6f5b-41bb-b646-98f4ce36db9d",
+ "base_position": "-121,85",
+ "category_id": "art"
+ },
+ {
+ "place_id": "25f059fc-0941-48b1-a8fd-8a88dd850f85",
+ "base_position": "-124,98",
+ "category_id": "art"
+ },
+ {
+ "place_id": "af31f2c4-dc1c-467a-b953-087fc60fcf81",
+ "base_position": "-64,116",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9cd45159-63c3-4971-97e3-7c0a994f428b",
+ "base_position": "143,-124",
+ "category_id": "art"
+ },
+ {
+ "place_id": "04c24b62-b0d7-469f-9d7f-890cf7745a9a",
+ "base_position": "-139,-45",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "31463d79-f643-494b-a1db-a48769090f5d",
+ "base_position": "-121,-65",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "9622e4e4-b85a-4b57-b139-6fb5f22396c0",
+ "base_position": "13,-86",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "938d303a-b1d9-4edc-b780-4d86bd831b4d",
+ "base_position": "-77,-140",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "bcdb66c8-624e-4940-a6c3-ec4ae77673b8",
+ "base_position": "-106,-73",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "c03c7b1b-b568-4ab6-ba7b-c228560fa538",
+ "base_position": "-17,-97",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "0f229c31-14ee-4da2-8b8e-d8ae7ff06d5e",
+ "base_position": "-78,-15",
+ "category_id": "game"
+ },
+ {
+ "place_id": "c9d8a644-b79f-4ef4-8c3c-c6beefddfcea",
+ "base_position": "74,91",
+ "category_id": "art"
+ },
+ {
+ "place_id": "6cd86e7c-9a58-4317-b61c-fa22594efcb9",
+ "base_position": "-38,95",
+ "category_id": "education"
+ },
+ {
+ "place_id": "c12f60f2-ec08-4782-894a-f891868cb90b",
+ "base_position": "-38,79",
+ "category_id": "game"
+ },
+ {
+ "place_id": "22dabedc-5f4a-4858-8443-bf90e4ec2cbf",
+ "base_position": "31,-20",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "3de5fadd-9a86-4f9c-8426-3a9660cf0dca",
+ "base_position": "-84,-104",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1ddbdca1-1d9c-4d71-ae84-6e6a7158446d",
+ "base_position": "83,-124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "e8e98142-ff65-4bc4-80ce-ca0fe0094e81",
+ "base_position": "-79,12",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "6c6c5dbf-ee67-4ebf-8659-9cad5fa1abfa",
+ "base_position": "139,-56",
+ "category_id": "art"
+ },
+ {
+ "place_id": "daef216e-19e6-4fec-8731-d2e87322b3a9",
+ "base_position": "12,-65",
+ "category_id": "art"
+ },
+ {
+ "place_id": "daef216e-19e6-4fec-8731-d2e87322b3a9",
+ "base_position": "12,-65",
+ "category_id": "education"
+ },
+ {
+ "place_id": "80652d08-f853-4fca-8267-b03e61294868",
+ "base_position": "76,-123",
+ "category_id": "game"
+ },
+ {
+ "place_id": "586a5877-bfbf-4315-bb4a-02f4cc50eccd",
+ "base_position": "40,60",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "4ac22a89-97cd-4033-98f6-39b9ab5d5a03",
+ "base_position": "80,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "588770e8-515c-4667-a7b0-0442883b6180",
+ "base_position": "-110,20",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "55cf5719-b444-438a-bb34-4607d758494e",
+ "base_position": "78,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "aa9e9142-b212-494b-900f-1e374d017315",
+ "base_position": "77,-123",
+ "category_id": "art"
+ },
+ {
+ "place_id": "aa9e9142-b212-494b-900f-1e374d017315",
+ "base_position": "77,-123",
+ "category_id": "education"
+ },
+ {
+ "place_id": "aa9e9142-b212-494b-900f-1e374d017315",
+ "base_position": "77,-123",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "25b634af-9934-4a74-ac52-a07f98031b0b",
+ "base_position": "80,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "05d3287e-da9b-469f-8748-938c88755a78",
+ "base_position": "-41,132",
+ "category_id": "art"
+ },
+ {
+ "place_id": "82d094c7-2575-4145-bfe7-3c1accd09783",
+ "base_position": "84,-127",
+ "category_id": "game"
+ },
+ {
+ "place_id": "b6ff840e-4b7d-452f-9875-63e8921a51ce",
+ "base_position": "81,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "1c9983e8-e148-4b53-9cfe-84fd936ffb91",
+ "base_position": "66,-91",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "747a7f07-efa9-4086-82a5-8dc677e95232",
+ "base_position": "-133,99",
+ "category_id": "art"
+ },
+ {
+ "place_id": "dfe04a83-56ab-4193-b019-af8b34b38d3a",
+ "base_position": "36,-89",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "8e35e55e-cb02-4787-96bb-c3ba92b2e28b",
+ "base_position": "25,-144",
+ "category_id": "game"
+ },
+ {
+ "place_id": "cd904995-fe88-4397-af88-3e9f2b715630",
+ "base_position": "-120,90",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "d33f676f-49fd-448c-82a0-8c706bccac0d",
+ "base_position": "-126,-66",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ff8aa589-cc46-4ce4-82d6-93be2c9f84e6",
+ "base_position": "-118,26",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "d1cd43f8-a210-4d5e-a46f-152ccb9e6b70",
+ "base_position": "-4,-103",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "4ed9bc09-1950-497e-8d4e-575f4b107b9f",
+ "base_position": "-49,90",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b1f9b811-9283-4e34-9433-066dadf526c8",
+ "base_position": "150,20",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e7e40bc7-e314-48b9-8780-894c5ea92e96",
+ "base_position": "-74,-74",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "eaff60f7-822e-4970-9550-cd00f2d6072f",
+ "base_position": "-19,-150",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "f849736f-5da7-439b-a9bf-d57879de83b0",
+ "base_position": "-130,-54",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "bc633f0c-3deb-463a-b35c-2d652f0d761f",
+ "base_position": "-146,31",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "4699114e-b20b-4b5e-91d1-e73db664e280",
+ "base_position": "138,-18",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "b30b13fc-bc14-49b5-8052-cdac46b88791",
+ "base_position": "11,-150",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b30b13fc-bc14-49b5-8052-cdac46b88791",
+ "base_position": "11,-150",
+ "category_id": "education"
+ },
+ {
+ "place_id": "8728bbc3-9bbb-4362-826d-1c95fa226038",
+ "base_position": "23,-146",
+ "category_id": "game"
+ },
+ {
+ "place_id": "841da901-c5a6-427e-a85c-039bc9c1bb4f",
+ "base_position": "69,95",
+ "category_id": "art"
+ },
+ {
+ "place_id": "227e2a74-ed02-4075-a6aa-3de2f741cb2d",
+ "base_position": "-56,149",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "8feb2195-2750-446b-b986-3eb3512fc6c0",
+ "base_position": "22,-45",
+ "category_id": "game"
+ },
+ {
+ "place_id": "d23c5b43-c479-443c-8ec7-e5d0369dc7ac",
+ "base_position": "21,125",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d23c5b43-c479-443c-8ec7-e5d0369dc7ac",
+ "base_position": "21,125",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d23c5b43-c479-443c-8ec7-e5d0369dc7ac",
+ "base_position": "21,125",
+ "category_id": "music"
+ },
+ {
+ "place_id": "f458ebed-51ba-4d66-9187-ad4283d59bb8",
+ "base_position": "19,-84",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "79ce457a-e109-4f09-b07f-0d847916e5fc",
+ "base_position": "74,-124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "60e39481-1383-48e2-b1d9-0b31d99d3196",
+ "base_position": "26,-146",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "2b7647f6-c0c6-4e1d-9d74-ac4ceeeb3ec6",
+ "base_position": "82,-124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "7297c7af-7fc8-4c50-9445-cb4039182252",
+ "base_position": "134,89",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "def5f56c-3c48-47a2-b31b-092cc5f5e3af",
+ "base_position": "6,-125",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c51fb516-8079-473f-b79c-cd7695a5dd17",
+ "base_position": "76,-127",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c51fb516-8079-473f-b79c-cd7695a5dd17",
+ "base_position": "76,-127",
+ "category_id": "education"
+ },
+ {
+ "place_id": "c51fb516-8079-473f-b79c-cd7695a5dd17",
+ "base_position": "76,-127",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "2654775a-ac74-4d88-8c9d-56d515b1ad17",
+ "base_position": "82,-123",
+ "category_id": "game"
+ },
+ {
+ "place_id": "f23027e7-60dd-4989-b40f-7dc32fc15f83",
+ "base_position": "85,-124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "077b169c-87e3-497a-b39a-d4a58c75408e",
+ "base_position": "77,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "1b8b6bd6-778d-461e-a9f1-f785c7228052",
+ "base_position": "103,-32",
+ "category_id": "music"
+ },
+ {
+ "place_id": "1b8b6bd6-778d-461e-a9f1-f785c7228052",
+ "base_position": "103,-32",
+ "category_id": "social"
+ },
+ {
+ "place_id": "cef0ad5b-51de-43d7-89a5-d894364dfc69",
+ "base_position": "-69,135",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cef0ad5b-51de-43d7-89a5-d894364dfc69",
+ "base_position": "-69,135",
+ "category_id": "education"
+ },
+ {
+ "place_id": "1157a723-5af3-4490-8aa8-826dcb0b064a",
+ "base_position": "-101,-70",
+ "category_id": "game"
+ },
+ {
+ "place_id": "f314fa45-1490-4d7e-b7b2-678935807f13",
+ "base_position": "49,-91",
+ "category_id": "game"
+ },
+ {
+ "place_id": "441b1a36-bd8c-4b23-ac27-ebcac8fcd602",
+ "base_position": "25,-145",
+ "category_id": "game"
+ },
+ {
+ "place_id": "9833df86-5f92-47f7-9de3-d82d053a65cb",
+ "base_position": "-143,19",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "ff620b65-e6dd-402c-aebc-86eec7cd985c",
+ "base_position": "121,-142",
+ "category_id": "art"
+ },
+ {
+ "place_id": "08f2335f-9abb-4003-8f80-c456a478425f",
+ "base_position": "-5,-105",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "60b54df7-ca53-4452-a2f7-76dbc280102d",
+ "base_position": "-136,-95",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "afd79f6c-de18-44e7-8619-ec7b2f46481a",
+ "base_position": "-126,101",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7dc3ead9-d642-47ca-9a7f-cf57f041e5d2",
+ "base_position": "30,-138",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "bfc335c1-98f7-4e5f-803e-063cf7cb1e93",
+ "base_position": "18,-84",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5028ed9f-6eaf-4eb6-a2d8-4593e67eadb6",
+ "base_position": "120,151",
+ "category_id": "social"
+ },
+ {
+ "place_id": "17b8b623-0d66-48ff-8f75-02b2719acebe",
+ "base_position": "-45,113",
+ "category_id": "art"
+ },
+ {
+ "place_id": "843ca881-f484-409f-97ad-1d979becd23f",
+ "base_position": "141,-56",
+ "category_id": "game"
+ },
+ {
+ "place_id": "843ca881-f484-409f-97ad-1d979becd23f",
+ "base_position": "141,-56",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "c1d9984e-6655-4701-889a-786145e070c2",
+ "base_position": "-63,37",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cc1248e9-189c-4eb8-a2c5-62107c027cc9",
+ "base_position": "-52,-31",
+ "category_id": "art"
+ },
+ {
+ "place_id": "cc1248e9-189c-4eb8-a2c5-62107c027cc9",
+ "base_position": "-52,-31",
+ "category_id": "social"
+ },
+ {
+ "place_id": "cc1248e9-189c-4eb8-a2c5-62107c027cc9",
+ "base_position": "-52,-31",
+ "category_id": "music"
+ },
+ {
+ "place_id": "a0066e1d-bd77-498c-ab91-0989f31b41b4",
+ "base_position": "70,-83",
+ "category_id": "social"
+ },
+ {
+ "place_id": "a0066e1d-bd77-498c-ab91-0989f31b41b4",
+ "base_position": "70,-83",
+ "category_id": "music"
+ },
+ {
+ "place_id": "7293aba4-eca6-4850-b585-2a342df7329b",
+ "base_position": "47,96",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "00f650cb-0e12-454f-8f80-67a835a60f36",
+ "base_position": "-60,-11",
+ "category_id": "social"
+ },
+ {
+ "place_id": "00f650cb-0e12-454f-8f80-67a835a60f36",
+ "base_position": "-60,-11",
+ "category_id": "music"
+ },
+ {
+ "place_id": "9771c163-d1fe-4271-9838-6fdb43a80fde",
+ "base_position": "-62,35",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "f5cae6bc-7c91-4b94-9e43-dc03431ded92",
+ "base_position": "-53,-14",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ecf7a1f9-19d1-49c6-9d9b-b2bc6c98597b",
+ "base_position": "26,128",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ecf7a1f9-19d1-49c6-9d9b-b2bc6c98597b",
+ "base_position": "26,128",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5e90b669-9dcf-40d3-8093-3d8bcebdc7b8",
+ "base_position": "-37,27",
+ "category_id": "art"
+ },
+ {
+ "place_id": "5e90b669-9dcf-40d3-8093-3d8bcebdc7b8",
+ "base_position": "-37,27",
+ "category_id": "social"
+ },
+ {
+ "place_id": "5e90b669-9dcf-40d3-8093-3d8bcebdc7b8",
+ "base_position": "-37,27",
+ "category_id": "music"
+ },
+ {
+ "place_id": "dde4271d-d3db-4cb8-af6d-e184f0c21c55",
+ "base_position": "27,-92",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "dde4271d-d3db-4cb8-af6d-e184f0c21c55",
+ "base_position": "27,-92",
+ "category_id": "education"
+ },
+ {
+ "place_id": "70134a74-a3fd-4573-8747-e79697e51ee2",
+ "base_position": "-88,33",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "13e28d63-97bd-4fb2-9f03-98d050f1177a",
+ "base_position": "-140,-85",
+ "category_id": "education"
+ },
+ {
+ "place_id": "9dfff6b6-03aa-4764-bbb8-e814a583bf16",
+ "base_position": "30,-63",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ecd076a3-8369-4177-af0f-73e65c6be780",
+ "base_position": "74,-125",
+ "category_id": "art"
+ },
+ {
+ "place_id": "ecd076a3-8369-4177-af0f-73e65c6be780",
+ "base_position": "74,-125",
+ "category_id": "education"
+ },
+ {
+ "place_id": "ecd076a3-8369-4177-af0f-73e65c6be780",
+ "base_position": "74,-125",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "05cdfc25-1f2e-4291-8d07-72a17b64eeea",
+ "base_position": "81,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "16dba404-0536-4e78-8836-1d22956c6b0b",
+ "base_position": "79,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "deff5e9a-98db-44be-9088-356d9a27d407",
+ "base_position": "75,-127",
+ "category_id": "game"
+ },
+ {
+ "place_id": "cddb24f1-2ec2-4846-a49d-dd181b16536f",
+ "base_position": "-38,-142",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "c772e022-7a1f-4c21-b5ed-ef068610d9cc",
+ "base_position": "-44,131",
+ "category_id": "education"
+ },
+ {
+ "place_id": "066d8d56-74d1-4a14-afe0-8423a858263e",
+ "base_position": "-37,-140",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "9f347e93-b611-4584-9baf-136c64b46b86",
+ "base_position": "30,79",
+ "category_id": "art"
+ },
+ {
+ "place_id": "3db948b9-5137-4eca-ab8c-ca0be6ff58bc",
+ "base_position": "30,-137",
+ "category_id": "art"
+ },
+ {
+ "place_id": "49568d1e-3e20-46c5-8a8a-9844879f5589",
+ "base_position": "-121,83",
+ "category_id": "art"
+ },
+ {
+ "place_id": "38d35174-94c1-475c-92c6-41756bb86cd1",
+ "base_position": "-125,97",
+ "category_id": "art"
+ },
+ {
+ "place_id": "d51d167b-480a-48e9-bdd7-014a1c085e1c",
+ "base_position": "-150,-8",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "5feba452-9e75-41ca-b3bc-64c8599f0eb3",
+ "base_position": "-124,86",
+ "category_id": "art"
+ },
+ {
+ "place_id": "00177852-0be7-4473-a57a-1819a2113af3",
+ "base_position": "149,-26",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "1c5fd570-2852-44ec-9bbc-6ec064b7a718",
+ "base_position": "-22,-100",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "cee9b0c5-7b02-48e1-a228-f15d68201499",
+ "base_position": "-130,-82",
+ "category_id": "game"
+ },
+ {
+ "place_id": "ec095a0e-2a7e-4794-81e8-5edda505b83f",
+ "base_position": "-4,-108",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "8b549cdf-b94c-4d37-930c-6b35e0b48fc2",
+ "base_position": "119,-141",
+ "category_id": "art"
+ },
+ {
+ "place_id": "1b68044f-ecb3-455b-81b1-4eef8fbc324f",
+ "base_position": "139,-90",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "20451461-d6cb-4177-90a9-6d64319d6fbb",
+ "base_position": "29,-144",
+ "category_id": "social"
+ },
+ {
+ "place_id": "20451461-d6cb-4177-90a9-6d64319d6fbb",
+ "base_position": "29,-144",
+ "category_id": "music"
+ },
+ {
+ "place_id": "bf6d6683-37d5-4451-a19e-acdbc77cf8c9",
+ "base_position": "-107,30",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9c1d8aa0-b2d6-4016-ba2c-4ec5915d6756",
+ "base_position": "-72,-21",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e20cdde2-d37c-4bfa-b2de-942c279f4928",
+ "base_position": "-140,-30",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d30af03a-25a7-434b-b58c-3023966ecf1a",
+ "base_position": "-124,99",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b263f86f-ec86-4dbd-a79d-bc6352879672",
+ "base_position": "-102,-57",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4d343b85-f319-43c3-8c9b-308b7966e546",
+ "base_position": "-83,-52",
+ "category_id": "art"
+ },
+ {
+ "place_id": "4d343b85-f319-43c3-8c9b-308b7966e546",
+ "base_position": "-83,-52",
+ "category_id": "education"
+ },
+ {
+ "place_id": "7fcbd4ff-9ef0-4d4b-9aa1-21b5b428d99e",
+ "base_position": "-133,-36",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7fcbd4ff-9ef0-4d4b-9aa1-21b5b428d99e",
+ "base_position": "-133,-36",
+ "category_id": "social"
+ },
+ {
+ "place_id": "7fcbd4ff-9ef0-4d4b-9aa1-21b5b428d99e",
+ "base_position": "-133,-36",
+ "category_id": "music"
+ },
+ {
+ "place_id": "9a257621-5a24-4460-a223-49a3348ad4b9",
+ "base_position": "-11,-55",
+ "category_id": "art"
+ },
+ {
+ "place_id": "9a257621-5a24-4460-a223-49a3348ad4b9",
+ "base_position": "-11,-55",
+ "category_id": "social"
+ },
+ {
+ "place_id": "9a257621-5a24-4460-a223-49a3348ad4b9",
+ "base_position": "-11,-55",
+ "category_id": "music"
+ },
+ {
+ "place_id": "b2d4e9af-a742-4e31-beb3-77c10d7f70d1",
+ "base_position": "-26,-140",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "249312e3-9b2f-497d-ad13-5989acbdbfba",
+ "base_position": "-34,-33",
+ "category_id": "social"
+ },
+ {
+ "place_id": "78953d65-145d-4bff-914d-1533dc423915",
+ "base_position": "76,-125",
+ "category_id": "game"
+ },
+ {
+ "place_id": "5471aba3-9d7a-456d-a270-f097eda25f08",
+ "base_position": "-141,-89",
+ "category_id": "social"
+ },
+ {
+ "place_id": "5471aba3-9d7a-456d-a270-f097eda25f08",
+ "base_position": "-141,-89",
+ "category_id": "music"
+ },
+ {
+ "place_id": "d6a4d95f-8ab2-4fdf-9e4c-d41e8297b9ca",
+ "base_position": "-130,52",
+ "category_id": "fashion"
+ },
+ {
+ "place_id": "5238bab6-4cd6-4854-9f61-de5176abf2da",
+ "base_position": "139,90",
+ "category_id": "education"
+ },
+ {
+ "place_id": "40cd54c9-35ee-45ab-bd91-a6f0fde37fef",
+ "base_position": "-106,-70",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d4496472-a64a-4ddf-a508-abe4b9123983",
+ "base_position": "-121,89",
+ "category_id": "art"
+ },
+ {
+ "place_id": "b07fa471-d882-4e0b-b65d-c63002d1995b",
+ "base_position": "45,-71",
+ "category_id": "art"
+ },
+ {
+ "place_id": "e6004563-a4a7-42d1-b24e-4d8694cf0172",
+ "base_position": "-33,90",
+ "category_id": "education"
+ },
+ {
+ "place_id": "60514f90-4c62-4572-9249-5834fda5756a",
+ "base_position": "123,151",
+ "category_id": "social"
+ },
+ {
+ "place_id": "3ad74e27-0b10-46c5-96f4-9d213c303860",
+ "base_position": "-78,34",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "09322f5b-fedd-478f-9130-b3efd344a1af",
+ "base_position": "21,89",
+ "category_id": "art"
+ },
+ {
+ "place_id": "09322f5b-fedd-478f-9130-b3efd344a1af",
+ "base_position": "21,89",
+ "category_id": "social"
+ },
+ {
+ "place_id": "09322f5b-fedd-478f-9130-b3efd344a1af",
+ "base_position": "21,89",
+ "category_id": "music"
+ },
+ {
+ "place_id": "0b6cb444-bf18-4669-b12d-02cd0d4798a5",
+ "base_position": "7,-125",
+ "category_id": "art"
+ },
+ {
+ "place_id": "0b6cb444-bf18-4669-b12d-02cd0d4798a5",
+ "base_position": "7,-125",
+ "category_id": "social"
+ },
+ {
+ "place_id": "0b6cb444-bf18-4669-b12d-02cd0d4798a5",
+ "base_position": "7,-125",
+ "category_id": "music"
+ },
+ {
+ "place_id": "fdf9af0a-91ac-4d08-b9b3-0c58d481ef12",
+ "base_position": "18,-102",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "39c66803-c632-4412-bbed-390cd28a5169",
+ "base_position": "130,19",
+ "category_id": "social"
+ },
+ {
+ "place_id": "39c66803-c632-4412-bbed-390cd28a5169",
+ "base_position": "130,19",
+ "category_id": "music"
+ },
+ {
+ "place_id": "ed44e80e-321a-4733-a114-a642e2a1cfd7",
+ "base_position": "-139,-94",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "d7d799f1-0a2f-4a2a-944c-b4d493f3d4ad",
+ "base_position": "18,-83",
+ "category_id": "art"
+ },
+ {
+ "place_id": "c8acbd21-6925-49c5-a7bc-13ce1821f11e",
+ "base_position": "19,60",
+ "category_id": "ads"
+ },
+ {
+ "place_id": "7c2ec5f9-e2f4-46b7-9622-76d70c494d6e",
+ "base_position": "-127,-83",
+ "category_id": "art"
+ },
+ {
+ "place_id": "7c2ec5f9-e2f4-46b7-9622-76d70c494d6e",
+ "base_position": "-127,-83",
+ "category_id": "crypto"
+ },
+ {
+ "place_id": "5afbef2a-94a4-4e51-a6d7-2046c55fbc45",
+ "base_position": "78,-126",
+ "category_id": "game"
+ },
+ {
+ "place_id": "1760ef81-e1cc-4636-bf3a-96d75ff33395",
+ "base_position": "-57,130",
+ "category_id": "shop"
+ },
+ {
+ "place_id": "bfe04b29-520d-46a3-805d-25dd12ce170e",
+ "base_position": "76,-124",
+ "category_id": "game"
+ },
+ {
+ "place_id": "3b3c4149-0d49-444e-8d5e-6c64f6eb2f4e",
+ "base_position": "40,124",
+ "category_id": "social"
+ },
+ {
+ "place_id": "d59261e0-68b9-4225-a87a-5957b6311cee",
+ "base_position": "78,-124",
+ "category_id": "game"
+ }
+ ]
+}
diff --git a/src/server.ts b/src/server.ts
index a91005f2..157ae67b 100644
--- a/src/server.ts
+++ b/src/server.ts
@@ -27,6 +27,7 @@ import { register } from "prom-client"
import categoryRoute from "./entities/Category/routes"
import { createSceneConsumerTask } from "./entities/CheckScenes/task/checkScenes"
import placeRoute from "./entities/Place/routes"
+import { checkPoisForCategoryUpdate } from "./entities/PlaceCategories/tasks/poi"
import reportRoute from "./entities/Report/routes"
import socialRoutes from "./entities/Social/routes"
import userFavoriteRoute from "./entities/UserFavorite/routes"
@@ -49,6 +50,7 @@ tasks.use(
)
)
tasks.use(checkWorldsIndexingTask)
+tasks.use(checkPoisForCategoryUpdate)
const app = express()
app.set("x-powered-by", false)