[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-cabe9e10-8565-4b88-916c-b5af7180578a":3,"$fZsx_kcbuz-HutePJKEaffJK-vKz3zwovPQKCXM10T1Q":43},{"id":4,"title":5,"description":6,"categoryId":7,"moduleId":8,"tags":9,"prompt":10,"icon":11,"source":12,"sourceUrl":13,"authorId":14,"authorName":15,"isPublic":16,"stars":17,"runs":18,"createdAt":19,"updatedAt":19,"module":20,"category":27,"packages":34},"cabe9e10-8565-4b88-916c-b5af7180578a","segment-cdp","专家模式包括Segment客户数据平台","cat_life_career","mod_other","sickn33,other","---\nname: segment-cdp\ndescription: Expert patterns for Segment Customer Data Platform including\n  Analytics.js, server-side tracking, tracking plans with Protocols, identity\n  resolution, destinations configuration, and data governance best practices.\nrisk: safe\nsource: vibeship-spawner-skills (Apache 2.0)\ndate_added: 2026-02-27\n---\n\n# Segment CDP\n\nExpert patterns for Segment Customer Data Platform including Analytics.js,\nserver-side tracking, tracking plans with Protocols, identity resolution,\ndestinations configuration, and data governance best practices.\n\n## Patterns\n\n### Analytics.js Browser Integration\n\nClient-side tracking with Analytics.js. Include track, identify, page,\nand group calls. Anonymous ID persists until identify merges with user.\n\n\u002F\u002F Next.js - Analytics provider component\n\u002F\u002F lib\u002Fsegment.ts\nimport { AnalyticsBrowser } from '@segment\u002Fanalytics-next';\n\nexport const analytics = AnalyticsBrowser.load({\n  writeKey: process.env.NEXT_PUBLIC_SEGMENT_WRITE_KEY!,\n});\n\n\u002F\u002F Typed event helpers\nexport interface UserTraits {\n  email?: string;\n  name?: string;\n  plan?: 'free' | 'pro' | 'enterprise';\n  createdAt?: string;\n  company?: {\n    id: string;\n    name: string;\n  };\n}\n\nexport function identify(userId: string, traits?: UserTraits) {\n  analytics.identify(userId, traits);\n}\n\nexport function track\u003CT extends Record\u003Cstring, any>>(\n  event: string,\n  properties?: T\n) {\n  analytics.track(event, properties);\n}\n\nexport function page(name?: string, properties?: Record\u003Cstring, any>) {\n  analytics.page(name, properties);\n}\n\nexport function group(groupId: string, traits?: Record\u003Cstring, any>) {\n  analytics.group(groupId, traits);\n}\n\n\u002F\u002F React hook for analytics\n\u002F\u002F hooks\u002FuseAnalytics.ts\nimport { useEffect } from 'react';\nimport { usePathname, useSearchParams } from 'next\u002Fnavigation';\nimport { analytics, page } from '@\u002Flib\u002Fsegment';\n\nexport function usePageTracking() {\n  const pathname = usePathname();\n  const searchParams = useSearchParams();\n\n  useEffect(() => {\n    \u002F\u002F Track page view on route change\n    page(pathname, {\n      path: pathname,\n      search: searchParams.toString(),\n      url: window.location.href,\n      title: document.title,\n    });\n  }, [pathname, searchParams]);\n}\n\n\u002F\u002F Usage in _app.tsx or layout.tsx\nfunction RootLayout({ children }) {\n  usePageTracking();\n\n  return \u003Chtml>{children}\u003C\u002Fhtml>;\n}\n\n\u002F\u002F Event tracking in components\nfunction PricingButton({ plan }: { plan: string }) {\n  const handleClick = () => {\n    track('Plan Selected', {\n      plan_name: plan,\n      page: 'pricing',\n      source: 'pricing_page',\n    });\n  };\n\n  return \u003Cbutton onClick={handleClick}>Select {plan}\u003C\u002Fbutton>;\n}\n\n\u002F\u002F Identify on auth\nfunction onUserLogin(user: User) {\n  identify(user.id, {\n    email: user.email,\n    name: user.name,\n    plan: user.plan,\n    createdAt: user.createdAt,\n  });\n\n  track('User Signed In', {\n    method: 'email',\n  });\n}\n\n### Context\n\n- browser tracking\n- website analytics\n- client-side events\n\n### Server-Side Tracking with Node.js\n\nHigh-performance server-side tracking using @segment\u002Fanalytics-node.\nNon-blocking with internal batching. Essential for backend events,\nwebhooks, and sensitive data.\n\n\u002F\u002F lib\u002Fsegment-server.ts\nimport { Analytics } from '@segment\u002Fanalytics-node';\n\n\u002F\u002F Initialize once\nconst analytics = new Analytics({\n  writeKey: process.env.SEGMENT_WRITE_KEY!,\n  flushAt: 20,      \u002F\u002F Batch size before flush\n  flushInterval: 10000,  \u002F\u002F Flush every 10 seconds\n});\n\n\u002F\u002F Typed server-side tracking\nexport interface ServerContext {\n  ip?: string;\n  userAgent?: string;\n  locale?: string;\n}\n\nexport function serverIdentify(\n  userId: string,\n  traits: Record\u003Cstring, any>,\n  context?: ServerContext\n) {\n  analytics.identify({\n    userId,\n    traits,\n    context: {\n      ip: context?.ip,\n      userAgent: context?.userAgent,\n      locale: context?.locale,\n    },\n  });\n}\n\nexport function serverTrack(\n  userId: string,\n  event: string,\n  properties?: Record\u003Cstring, any>,\n  context?: ServerContext\n) {\n  analytics.track({\n    userId,\n    event,\n    properties,\n    timestamp: new Date(),\n    context: {\n      ip: context?.ip,\n      userAgent: context?.userAgent,\n    },\n  });\n}\n\n\u002F\u002F Flush on shutdown\nexport async function closeAnalytics() {\n  await analytics.closeAndFlush();\n}\n\n\u002F\u002F Usage in API routes\n\u002F\u002F app\u002Fapi\u002Fwebhooks\u002Fstripe\u002Froute.ts\nexport async function POST(req: Request) {\n  const event = await req.json();\n\n  switch (event.type) {\n    case 'checkout.session.completed':\n      const session = event.data.object;\n\n      serverTrack(\n        session.client_reference_id,\n        'Order Completed',\n        {\n          order_id: session.id,\n          total: session.amount_total \u002F 100,\n          currency: session.currency,\n          payment_method: session.payment_method_types[0],\n        },\n        { ip: req.headers.get('x-forwarded-for') || undefined }\n      );\n\n      \u002F\u002F Also update user traits\n      serverIdentify(session.client_reference_id, {\n        total_spent: session.amount_total \u002F 100,\n        last_purchase_date: new Date().toISOString(),\n      });\n      break;\n\n    case 'customer.subscription.created':\n      serverTrack(\n        event.data.object.metadata.user_id,\n        'Subscription Started',\n        {\n          plan: event.data.object.items.data[0].price.nickname,\n          amount: event.data.object.items.data[0].price.unit_amount \u002F 100,\n          interval: event.data.object.items.data[0].price.recurring.interval,\n        }\n      );\n      break;\n  }\n\n  return new Response('ok');\n}\n\n\u002F\u002F Graceful shutdown\nprocess.on('SIGTERM', async () => {\n  await closeAnalytics();\n  process.exit(0);\n});\n\n### Context\n\n- server-side tracking\n- backend events\n- webhook processing\n\n### Tracking Plan Design\n\nDesign event schemas using Object + Action naming convention.\nDefine required properties, types, and validation rules.\nConnect to Protocols for enforcement.\n\n\u002F\u002F Tracking plan definition (conceptual YAML structure)\n\u002F\u002F This maps to Segment Protocols configuration\n\u002F*\ntracking_plan:\n  display_name: \"MyApp Tracking Plan\"\n  rules:\n    events:\n      - name: \"User Signed Up\"\n        description: \"User completed registration\"\n        rules:\n          required:\n            - signup_method\n          properties:\n            signup_method:\n              type: string\n              enum: [email, google, github]\n            referral_code:\n              type: string\n            utm_source:\n              type: string\n\n      - name: \"Product Viewed\"\n        description: \"User viewed a product page\"\n        rules:\n          required:\n            - product_id\n            - product_name\n          properties:\n            product_id:\n              type: string\n            product_name:\n              type: string\n            category:\n              type: string\n            price:\n              type: number\n            currency:\n              type: string\n              default: USD\n\n      - name: \"Order Completed\"\n        description: \"User completed a purchase\"\n        rules:\n          required:\n            - order_id\n            - total\n            - products\n          properties:\n            order_id:\n              type: string\n            total:\n              type: number\n            currency:\n              type: string\n            products:\n              type: array\n              items:\n                type: object\n                properties:\n                  product_id: { type: string }\n                  name: { type: string }\n                  price: { type: number }\n                  quantity: { type: integer }\n\n    identify:\n      traits:\n        - name: email\n          type: string\n          required: true\n        - name: name\n          type: string\n        - name: plan\n          type: string\n          enum: [free, pro, enterprise]\n        - name: company\n          type: object\n          properties:\n            id: { type: string }\n            name: { type: string }\n*\u002F\n\n\u002F\u002F TypeScript implementation with type safety\n\u002F\u002F types\u002Fsegment-events.ts\nexport interface TrackingEvents {\n  'User Signed Up': {\n    signup_method: 'email' | 'google' | 'github';\n    referral_code?: string;\n    utm_source?: string;\n  };\n\n  'Product Viewed': {\n    product_id: string;\n    product_name: string;\n    category?: string;\n    price?: number;\n    currency?: string;\n  };\n\n  'Order Completed': {\n    order_id: string;\n    total: number;\n    currency?: string;\n    products: Array\u003C{\n      product_id: string;\n      name: string;\n      price: number;\n      quantity: number;\n    }>;\n  };\n\n  'Feature Used': {\n    feature_name: string;\n    usage_count?: number;\n  };\n}\n\n\u002F\u002F Type-safe track function\nexport function trackEvent\u003CT extends keyof TrackingEvents>(\n  event: T,\n  properties: TrackingEvents[T]\n) {\n  analytics.track(event, properties);\n}\n\n\u002F\u002F Usage - compile-time type checking\ntrackEvent('Order Completed', {\n  order_id: 'ord_123',\n  total: 99.99,\n  products: [\n    { product_id: 'prod_1', name: 'Widget', price: 49.99, quantity: 2 },\n  ],\n});\n\n\u002F\u002F This would be a TypeScript error:\n\u002F\u002F trackEvent('Order Completed', { total: 99.99 });  \u002F\u002F Missing order_id\n\n### Context\n\n- tracking plan\n- data governance\n- event schema\n\n### Identity Resolution\n\nTrack anonymous users, then merge with identified users via identify().\nUse alias() for identity merging between systems. Group users into\ncompanies\u002Forganizations.\n\n\u002F\u002F Identity flow implementation\n\u002F\u002F lib\u002Fidentity.ts\n\n\u002F\u002F Anonymous user tracking\nexport function trackAnonymousAction(event: string, properties?: object) {\n  \u002F\u002F Analytics.js automatically generates anonymousId\n  analytics.track(event, properties);\n}\n\n\u002F\u002F When user signs up or logs in\nexport async function identifyUser(user: {\n  id: string;\n  email: string;\n  name?: string;\n  plan?: string;\n}) {\n  \u002F\u002F This merges anonymous history with user profile\n  await analytics.identify(user.id, {\n    email: user.email,\n    name: user.name,\n    plan: user.plan,\n    created_at: new Date().toISOString(),\n  });\n\n  \u002F\u002F Track the identification event\n  analytics.track('User Identified', {\n    method: 'signup',\n  });\n}\n\n\u002F\u002F B2B: Associate user with company\nexport function associateWithCompany(company: {\n  id: string;\n  name: string;\n  plan?: string;\n  employees?: number;\n  industry?: string;\n}) {\n  analytics.group(company.id, {\n    name: company.name,\n    plan: company.plan,\n    employees: company.employees,\n    industry: company.industry,\n  });\n}\n\n\u002F\u002F Alias: Link identities (e.g., pre-signup email to user ID)\nexport function linkIdentities(previousId: string, newUserId: string) {\n  \u002F\u002F Use when you identified someone with a temporary ID\n  \u002F\u002F and now have their permanent user ID\n  analytics.alias(newUserId, previousId);\n}\n\n\u002F\u002F Full signup flow\nexport async function handleSignup(\n  email: string,\n  password: string,\n  company?: { name: string; size: string }\n) {\n  \u002F\u002F 1. Create user in your system\n  const user = await createUser(email, password);\n\n  \u002F\u002F 2. Identify with Segment (merges anonymous history)\n  await identifyUser({\n    id: user.id,\n    email: user.email,\n    name: user.name,\n    plan: 'free',\n  });\n\n  \u002F\u002F 3. Track signup event\n  analytics.track('User Signed Up', {\n    signup_method: 'email',\n    plan: 'free',\n  });\n\n  \u002F\u002F 4. If B2B, associate with company\n  if (company) {\n    const companyRecord = await createCompany(company, user.id);\n\n    associateWithCompany({\n      id: companyRecord.id,\n      name: company.name,\n      employees: parseInt(company.size),\n    });\n  }\n}\n\n### Context\n\n- user identification\n- anonymous tracking\n- b2b tracking\n\n### Destinations Configuration\n\nRoute data to analytics tools, data warehouses, and marketing platforms.\nUse device-mode for client-side tools, cloud-mode for server processing.\n\n\u002F\u002F Segment destinations are configured in the Segment UI\n\u002F\u002F but here's how to optimize your implementation\n\n\u002F\u002F Conditional tracking based on destination needs\n\u002F\u002F lib\u002Fsegment-destinations.ts\n\ninterface DestinationConfig {\n  mixpanel: boolean;\n  amplitude: boolean;\n  googleAnalytics: boolean;\n  warehouse: boolean;\n  hubspot: boolean;\n}\n\n\u002F\u002F Only send events needed by specific destinations\nexport function trackWithDestinations(\n  event: string,\n  properties: Record\u003Cstring, any>,\n  options?: {\n    integrations?: Partial\u003CDestinationConfig>;\n  }\n) {\n  analytics.track(event, properties, {\n    integrations: {\n      \u002F\u002F Override specific destinations\n      All: true,  \u002F\u002F Send to all by default\n      ...options?.integrations,\n    },\n  });\n}\n\n\u002F\u002F Example: Track revenue event only to revenue-tracking destinations\nexport function trackRevenue(order: {\n  orderId: string;\n  total: number;\n  currency: string;\n}) {\n  analytics.track('Order Completed', {\n    order_id: order.orderId,\n    revenue: order.total,\n    currency: order.currency,\n  }, {\n    integrations: {\n      \u002F\u002F Explicitly enable revenue destinations\n      'Google Analytics 4': true,\n      'Mixpanel': true,\n      'Amplitude': true,\n      \u002F\u002F Disable non-revenue destinations\n      'Intercom': false,\n      'Zendesk': false,\n    },\n  });\n}\n\n\u002F\u002F Send PII only to secure destinations\nexport function identifyWithPII(userId: string, traits: {\n  email: string;\n  phone?: string;\n  address?: string;\n}) {\n  analytics.identify(userId, traits, {\n    integrations: {\n      'All': false,  \u002F\u002F Disable all by default\n      \u002F\u002F Only send PII to trusted destinations\n      'HubSpot': true,\n      'Salesforce': true,\n      'Warehouse': true,  \u002F\u002F Your data warehouse\n      \u002F\u002F Don't send PII to analytics tools\n      'Mixpanel': false,\n      'Amplitude': false,\n    },\n  });\n}\n\n\u002F\u002F Context enrichment for all events\nexport function enrichedTrack(\n  event: string,\n  properties: Record\u003Cstring, any>\n) {\n  analytics.track(event, {\n    ...properties,\n    \u002F\u002F Add common context\n    app_version: process.env.NEXT_PUBLIC_APP_VERSION,\n    environment: process.env.NODE_ENV,\n    timestamp: new Date().toISOString(),\n  }, {\n    context: {\n      app: {\n        name: 'MyApp',\n        version: process.env.NEXT_PUBLIC_APP_VERSION,\n      },\n    },\n  });\n}\n\n### Context\n\n- data routing\n- destination setup\n- tool integration\n\n### HTTP Tracking API\n\nDirect HTTP API for any environment. Useful for edge functions,\nworkers, and non-Node.js backends. Batch up to 500KB per request.\n\n\u002F\u002F Edge\u002FServerless tracking via HTTP API\n\u002F\u002F lib\u002Fsegment-http.ts\n\nconst SEGMENT_WRITE_KEY = process.env.SEGMENT_WRITE_KEY!;\nconst SEGMENT_API = 'https:\u002F\u002Fapi.segment.io\u002Fv1';\n\n\u002F\u002F Base64 encode write key for auth\nconst authHeader = `Basic ${btoa(SEGMENT_WRITE_KEY + ':')}`;\n\ninterface SegmentEvent {\n  userId?: string;\n  anonymousId?: string;\n  event?: string;\n  name?: string;  \u002F\u002F For page calls\n  properties?: Record\u003Cstring, any>;\n  traits?: Record\u003Cstring, any>;\n  context?: Record\u003Cstring, any>;\n  timestamp?: string;\n}\n\nasync function segmentRequest(\n  endpoint: string,\n  payload: SegmentEvent\n): Promise\u003Cvoid> {\n  const response = await fetch(`${SEGMENT_API}${endpoint}`, {\n    method: 'POST',\n    headers: {\n      'Authorization': authHeader,\n      'Content-Type': 'application\u002Fjson',\n    },\n    body: JSON.stringify({\n      ...payload,\n      timestamp: payload.timestamp || new Date().toISOString(),\n    }),\n  });\n\n  if (!response.ok) {\n    console.error('Segment API error:', await response.text());\n  }\n}\n\n\u002F\u002F HTTP API methods\nexport async function httpIdentify(\n  userId: string,\n  traits: Record\u003Cstring, any>,\n  context?: Record\u003Cstring, any>\n) {\n  await segmentRequest('\u002Fidentify', {\n    userId,\n    traits,\n    context,\n  });\n}\n\nexport async function httpTrack(\n  userId: string,\n  event: string,\n  properties?: Record\u003Cstring, any>,\n  context?: Record\u003Cstring, any>\n) {\n  await segmentRequest('\u002Ftrack', {\n    userId,\n    event,\n    properties,\n    context,\n  });\n}\n\nexport async function httpPage(\n  userId: string,\n  name: string,\n  properties?: Record\u003Cstring, any>\n) {\n  await segmentRequest('\u002Fpage', {\n    userId,\n    name,\n    properties,\n  });\n}\n\n\u002F\u002F Batch API for high volume\nexport async function httpBatch(\n  events: Array\u003C{\n    type: 'identify' | 'track' | 'page' | 'group';\n    userId?: string;\n    anonymousId?: string;\n    event?: string;\n    name?: string;\n    properties?: Record\u003Cstring, any>;\n    traits?: Record\u003Cstring, any>;\n  }>\n) {\n  \u002F\u002F Max 500KB per batch, 32KB per event\n  await segmentRequest('\u002Fbatch', {\n    batch: events.map(e => ({\n      ...e,\n      timestamp: new Date().toISOString(),\n    })),\n  } as any);\n}\n\n\u002F\u002F Cloudflare Worker example\nexport default {\n  async fetch(request: Request): Promise\u003CResponse> {\n    const { userId, action, data } = await request.json();\n\n    \u002F\u002F Track in edge function\n    await httpTrack(userId, action, data, {\n      ip: request.headers.get('cf-connecting-ip'),\n      userAgent: request.headers.get('user-agent'),\n    });\n\n    return new Response('ok');\n  },\n};\n\n### Context\n\n- edge functions\n- serverless\n- http tracking\n\n## Sharp Edges\n\n### Anonymous ID Persists Until Explicit Reset\n\nSeverity: MEDIUM\n\n### Device Mode Bypasses Protocols Blocking\n\nSeverity: HIGH\n\n### HTTP API Has Strict Size Limits\n\nSeverity: MEDIUM\n\n### Track Calls Without Identify Are Anonymous\n\nSeverity: HIGH\n\n### Write Key in Client is Visible (But Intentional)\n\nSeverity: LOW\n\n### Events May Be Lost on Page Navigation\n\nSeverity: MEDIUM\n\n### Timestamps Without Timezone Cause Analytics Issues\n\nSeverity: MEDIUM\n\n### Tracking Before Consent Violates GDPR\n\nSeverity: HIGH\n\n## Validation Checks\n\n### Dynamic Event Name\n\nSeverity: ERROR\n\nEvent names should be static, not include dynamic values\n\nMessage: Dynamic event name detected. Use static event names with dynamic properties.\n\n### Inconsistent Event Name Casing\n\nSeverity: WARNING\n\nEvent names should follow consistent casing convention\n\nMessage: Mixed casing in event name. Use consistent convention (e.g., Title Case).\n\n### Track Without Prior Identify\n\nSeverity: WARNING\n\nUsers should be identified before tracking critical events\n\nMessage: Revenue\u002Fconversion event without identify. Ensure user is identified.\n\n### Missing Analytics Reset on Logout\n\nSeverity: WARNING\n\nAnalytics should be reset when user logs out\n\nMessage: Logout without analytics.reset(). Anonymous ID will persist to next user.\n\n### Hardcoded Segment Write Key\n\nSeverity: ERROR\n\nWrite key should use environment variables\n\nMessage: Hardcoded Segment write key. Use environment variables.\n\n### PII Sent to All Destinations\n\nSeverity: WARNING\n\nPII should have destination controls\n\nMessage: PII in tracking without destination controls. Consider limiting destinations.\n\n### Event Without Proper Timestamp\n\nSeverity: INFO\n\nExplicit timestamps help with historical data\n\nMessage: Server track without explicit timestamp. Consider adding timestamp.\n\n### Potentially Large Property Values\n\nSeverity: WARNING\n\nProperties over 32KB will be rejected\n\nMessage: Potentially large property value. Segment has 32KB per event limit.\n\n### Tracking Before Consent Check\n\nSeverity: ERROR\n\nGDPR requires consent before tracking\n\nMessage: Tracking without consent check. Implement consent management for GDPR.\n\n## Collaboration\n\n### Delegation Triggers\n\n- user needs A\u002FB testing -> analytics-specialist (Segment + LaunchDarkly\u002FOptimizely integration)\n- user needs data warehouse -> data-engineer (Segment to BigQuery\u002FSnowflake\u002FRedshift)\n- user needs customer support integration -> zendesk-integration (Identify calls syncing to support tools)\n- user needs marketing automation -> hubspot-integration (Segment to HubSpot destination)\n- user needs consent management -> privacy-specialist (GDPR\u002FCCPA compliance with Segment)\n\n## When to Use\n- User mentions or implies: segment\n- User mentions or implies: analytics.js\n- User mentions or implies: customer data platform\n- User mentions or implies: cdp\n- User mentions or implies: tracking plan\n- User mentions or implies: event tracking\n- User mentions or implies: identify track page\n- User mentions or implies: data routing\n\n## Limitations\n- Use this skill only when the task clearly matches the scope described above.\n- Do not treat the output as a substitute for environment-specific validation, testing, or expert review.\n- Stop and ask for clarification if required inputs, permissions, safety boundaries, or success criteria are missing.\n","","imported","https:\u002F\u002Fgithub.com\u002Fsickn33\u002Fantigravity-awesome-skills","user_system_seed","SkillOPIC",true,141,1423,"2026-05-16 13:38:35",{"id":8,"name":21,"slug":22,"icon":23,"description":24,"sort":25,"createdAt":26},"其他","other","mdi-page-next-outline","其他类型Skill",5,"2026-05-16 12:53:40",{"id":7,"name":28,"slug":29,"icon":30,"description":31,"moduleId":8,"sort":32,"skillCount":33,"createdAt":26},"职场发展","career","mdi-briefcase-outline","面试准备、简历优化、职业规划",4,575,[35],{"id":36,"skillId":4,"version":37,"fileName":38,"fileSize":39,"filePath":40,"fileHash":41,"manifest":42,"createdAt":19},"7472f37f-0f9c-4c83-87c2-c225fd6a1fd5","1.0.0","segment-cdp.zip",6449,"uploads\u002Fskills\u002Fcabe9e10-8565-4b88-916c-b5af7180578a\u002Fsegment-cdp.zip","e768b8952fdcd956bb1f24fbe3e9536ab246167ff27f7ca966223cafe9272e9f","[{\"path\":\"SKILL.md\",\"isDirectory\":false,\"size\":20101}]",{"code":44,"message":45,"data":46},200,"success",{"items":47,"stats":48,"page":51},[],{"averageRating":49,"totalRatings":49,"ratingCounts":50},0,[49,49,49,49,49],{"limit":52,"offset":49,"hasMore":53,"nextOffset":52,"ratedOnly":16},15,false]