@mradex77/google-play-scraper 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["MICROS_PER_UNIT","microsToUnits","shape","microsToUnits","MICROS_PER_UNIT","shape","resolveUrl","microsToUnits","isFree","CLUSTER_MAPPINGS","CLUSTER_MAPPINGS","STATIC_QUERY_PARAMS","MICROS_PER_UNIT","shape","resolveUrl","microsToUnits","isFree","collectionConstants","categoryConstants","ageConstants","shape","resolveUrl","MICROS_PER_UNIT","shape","resolveUrl","microsToUnits","isFree","shape"],"sources":["../src/constants.ts","../src/core/errors.ts","../src/core/http.ts","../src/core/options.ts","../src/core/scriptData.ts","../src/core/path.ts","../src/core/spec.ts","../src/features/app/schema.ts","../src/features/app/transforms.ts","../src/features/app/specs.ts","../src/features/app/app.ts","../src/core/batchexecute.ts","../src/core/pagination.ts","../src/core/fullDetail.ts","../src/core/appItem.ts","../src/features/search/schema.ts","../src/features/search/specs.ts","../src/features/search/search.ts","../src/features/suggest/specs.ts","../src/features/suggest/suggest.ts","../src/features/list/schema.ts","../src/features/list/specs.ts","../src/features/list/list.ts","../src/features/categories/categories.ts","../src/core/clusterItem.ts","../src/features/developer/schema.ts","../src/features/developer/specs.ts","../src/features/developer/developer.ts","../src/features/similar/schema.ts","../src/features/similar/specs.ts","../src/features/similar/similar.ts","../src/features/reviews/schema.ts","../src/features/reviews/specs.ts","../src/features/reviews/reviews.ts","../src/features/permissions/schema.ts","../src/features/permissions/specs.ts","../src/features/permissions/permissions.ts","../src/features/datasafety/schema.ts","../src/features/datasafety/specs.ts","../src/features/datasafety/datasafety.ts","../src/features/memoized/memoized.ts","../src/index.ts"],"sourcesContent":["export const BASE_URL = 'https://play.google.com';\n\nexport const clusters = {\n new: 'new',\n top: 'top',\n} as const;\n\nexport type Cluster = (typeof clusters)[keyof typeof clusters];\n\nexport const category = {\n APPLICATION: 'APPLICATION',\n ANDROID_WEAR: 'ANDROID_WEAR',\n ART_AND_DESIGN: 'ART_AND_DESIGN',\n AUTO_AND_VEHICLES: 'AUTO_AND_VEHICLES',\n BEAUTY: 'BEAUTY',\n BOOKS_AND_REFERENCE: 'BOOKS_AND_REFERENCE',\n BUSINESS: 'BUSINESS',\n COMICS: 'COMICS',\n COMMUNICATION: 'COMMUNICATION',\n DATING: 'DATING',\n EDUCATION: 'EDUCATION',\n ENTERTAINMENT: 'ENTERTAINMENT',\n EVENTS: 'EVENTS',\n FINANCE: 'FINANCE',\n FOOD_AND_DRINK: 'FOOD_AND_DRINK',\n HEALTH_AND_FITNESS: 'HEALTH_AND_FITNESS',\n HOUSE_AND_HOME: 'HOUSE_AND_HOME',\n LIBRARIES_AND_DEMO: 'LIBRARIES_AND_DEMO',\n LIFESTYLE: 'LIFESTYLE',\n MAPS_AND_NAVIGATION: 'MAPS_AND_NAVIGATION',\n MEDICAL: 'MEDICAL',\n MUSIC_AND_AUDIO: 'MUSIC_AND_AUDIO',\n NEWS_AND_MAGAZINES: 'NEWS_AND_MAGAZINES',\n PARENTING: 'PARENTING',\n PERSONALIZATION: 'PERSONALIZATION',\n PHOTOGRAPHY: 'PHOTOGRAPHY',\n PRODUCTIVITY: 'PRODUCTIVITY',\n SHOPPING: 'SHOPPING',\n SOCIAL: 'SOCIAL',\n SPORTS: 'SPORTS',\n TOOLS: 'TOOLS',\n TRAVEL_AND_LOCAL: 'TRAVEL_AND_LOCAL',\n VIDEO_PLAYERS: 'VIDEO_PLAYERS',\n WATCH_FACE: 'WATCH_FACE',\n WEATHER: 'WEATHER',\n GAME: 'GAME',\n GAME_ACTION: 'GAME_ACTION',\n GAME_ADVENTURE: 'GAME_ADVENTURE',\n GAME_ARCADE: 'GAME_ARCADE',\n GAME_BOARD: 'GAME_BOARD',\n GAME_CARD: 'GAME_CARD',\n GAME_CASINO: 'GAME_CASINO',\n GAME_CASUAL: 'GAME_CASUAL',\n GAME_EDUCATIONAL: 'GAME_EDUCATIONAL',\n GAME_MUSIC: 'GAME_MUSIC',\n GAME_PUZZLE: 'GAME_PUZZLE',\n GAME_RACING: 'GAME_RACING',\n GAME_ROLE_PLAYING: 'GAME_ROLE_PLAYING',\n GAME_SIMULATION: 'GAME_SIMULATION',\n GAME_SPORTS: 'GAME_SPORTS',\n GAME_STRATEGY: 'GAME_STRATEGY',\n GAME_TRIVIA: 'GAME_TRIVIA',\n GAME_WORD: 'GAME_WORD',\n FAMILY: 'FAMILY',\n FAMILY_ACTION: 'FAMILY_ACTION',\n FAMILY_BRAINGAMES: 'FAMILY_BRAINGAMES',\n FAMILY_CREATE: 'FAMILY_CREATE',\n FAMILY_EDUCATION: 'FAMILY_EDUCATION',\n FAMILY_MUSICVIDEO: 'FAMILY_MUSICVIDEO',\n FAMILY_PRETEND: 'FAMILY_PRETEND',\n} as const;\n\nexport type Category = (typeof category)[keyof typeof category];\n\nexport const collection = {\n TOP_FREE: 'TOP_FREE',\n TOP_PAID: 'TOP_PAID',\n GROSSING: 'GROSSING',\n} as const;\n\nexport type Collection = (typeof collection)[keyof typeof collection];\n\nexport const sort = {\n NEWEST: 2,\n RATING: 3,\n HELPFULNESS: 1,\n} as const;\n\nexport type Sort = (typeof sort)[keyof typeof sort];\n\nexport const age = {\n FIVE_UNDER: 'AGE_RANGE1',\n SIX_EIGHT: 'AGE_RANGE2',\n NINE_UP: 'AGE_RANGE3',\n} as const;\n\nexport type Age = (typeof age)[keyof typeof age];\n\nexport const permission = {\n COMMON: 0,\n OTHER: 1,\n} as const;\n\nexport type Permission = (typeof permission)[keyof typeof permission];\n\nObject.freeze(clusters);\nObject.freeze(category);\nObject.freeze(collection);\nObject.freeze(sort);\nObject.freeze(age);\nObject.freeze(permission);\n","import type { ZodError } from 'zod';\n\nexport class GooglePlayError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GooglePlayError';\n }\n}\n\nexport class ValidationError extends GooglePlayError {\n constructor(message: string) {\n super(message);\n this.name = 'ValidationError';\n }\n\n static fromZod(error: ZodError, context: string): ValidationError {\n const details = error.issues\n .map((issue) => {\n const path = issue.path.join('.');\n return path ? `${path}: ${issue.message}` : issue.message;\n })\n .join('; ');\n return new ValidationError(`${context}: ${details}`);\n }\n}\n\nexport class HttpError extends GooglePlayError {\n readonly status: number;\n readonly url: string;\n\n constructor(message: string, status: number, url: string) {\n super(message);\n this.name = 'HttpError';\n this.status = status;\n this.url = url;\n }\n}\n\nexport class NotFoundError extends HttpError {\n constructor(message: string, status: number, url: string) {\n super(message, status, url);\n this.name = 'NotFoundError';\n }\n}\n\nexport class RateLimitError extends HttpError {\n constructor(message: string, status: number, url: string) {\n super(message, status, url);\n this.name = 'RateLimitError';\n }\n}\n\nexport class BlockedError extends GooglePlayError {\n constructor(message: string) {\n super(message);\n this.name = 'BlockedError';\n }\n}\n\nexport class ParseError extends GooglePlayError {\n constructor(message: string) {\n super(message);\n this.name = 'ParseError';\n }\n}\n\nexport interface SpecFailure {\n field: string;\n paths: readonly (readonly (string | number)[])[];\n message: string;\n}\n\nexport class SpecError extends ParseError {\n readonly context: string;\n readonly failures: SpecFailure[];\n\n constructor(context: string, failures: SpecFailure[]) {\n super(SpecError.buildMessage(context, failures));\n this.name = 'SpecError';\n this.context = context;\n this.failures = failures;\n }\n\n private static buildMessage(context: string, failures: SpecFailure[]): string {\n const lines = failures.map((failure) => {\n const paths = failure.paths.map((path) => `[${path.join(', ')}]`).join(' | ');\n return ` ${failure.field} (${paths}): ${failure.message}`;\n });\n return [`${context} failed to parse ${failures.length.toString()} field(s):`, ...lines].join(\n '\\n',\n );\n }\n}\n","import type { RequestOptions } from './options.js';\nimport {\n BlockedError,\n GooglePlayError,\n HttpError,\n NotFoundError,\n RateLimitError,\n} from './errors.js';\n\nexport interface HttpRequest {\n url: string;\n method?: 'GET' | 'POST';\n body?: string;\n headers?: Record<string, string>;\n}\n\nexport interface HttpClientConfig {\n fetchImpl?: typeof fetch;\n throttle?: number;\n retries?: number;\n timeoutMs?: number;\n headers?: Record<string, string>;\n}\n\nexport interface HttpClient {\n request(req: HttpRequest): Promise<string>;\n}\n\nconst DEFAULT_RETRIES = 2;\nconst DEFAULT_TIMEOUT_MS = 30000;\nconst BASE_BACKOFF_MS = 500;\nconst THROTTLE_WINDOW_MS = 1000;\n\nconst USER_AGENT =\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';\n\nconst ANY_MIME = '*';\n\nconst DEFAULT_HEADERS: Record<string, string> = {\n 'User-Agent': USER_AGENT,\n Accept: `text/html,${ANY_MIME}/${ANY_MIME}`,\n 'Accept-Language': 'en-US,en;q=0.9',\n};\n\nconst FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded;charset=UTF-8';\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));\n\nfunction createRateLimiter(rate: number): () => Promise<void> {\n let timestamps: number[] = [];\n let tail: Promise<void> = Promise.resolve();\n\n const reserve = async (): Promise<void> => {\n const now = Date.now();\n const windowStart = now - THROTTLE_WINDOW_MS;\n timestamps = timestamps.filter((timestamp) => timestamp > windowStart);\n if (timestamps.length >= rate) {\n const oldest = timestamps[0] ?? now;\n await sleep(oldest + THROTTLE_WINDOW_MS - now);\n return reserve();\n }\n timestamps.push(Date.now());\n };\n\n return () => {\n const result = tail.then(reserve);\n tail = result.catch(() => undefined);\n return result;\n };\n}\n\nfunction buildHeaders(\n method: 'GET' | 'POST',\n configHeaders: Record<string, string> | undefined,\n requestHeaders: Record<string, string> | undefined,\n): Record<string, string> {\n const headers: Record<string, string> = { ...DEFAULT_HEADERS };\n if (method === 'POST') {\n headers['Content-Type'] = FORM_CONTENT_TYPE;\n }\n Object.assign(headers, configHeaders ?? {}, requestHeaders ?? {});\n return headers;\n}\n\nfunction isRetryableStatus(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction parseRetryAfter(response: Response): number | undefined {\n const header = response.headers.get('retry-after');\n if (header === null) {\n return undefined;\n }\n const seconds = Number(header);\n return Number.isFinite(seconds) && seconds >= 0 ? seconds : undefined;\n}\n\nfunction computeBackoff(attempt: number, retryAfterSeconds: number | undefined): number {\n if (retryAfterSeconds !== undefined) {\n return retryAfterSeconds * 1000;\n }\n const ceiling = BASE_BACKOFF_MS * 2 ** attempt;\n return Math.random() * ceiling;\n}\n\nfunction mapStatusToError(status: number, url: string): GooglePlayError {\n if (status === 404) {\n return new NotFoundError('App not found (404)', status, url);\n }\n if (status === 429) {\n return new RateLimitError('Rate limited by Google Play (429)', status, url);\n }\n return new HttpError(`Request to ${url} failed with status ${status.toString()}`, status, url);\n}\n\nfunction hostIsConsent(finalUrl: string): boolean {\n if (!finalUrl) {\n return false;\n }\n try {\n return new URL(finalUrl).host === 'consent.google.com';\n } catch {\n return false;\n }\n}\n\nfunction assertNotBlocked(response: Response, body: string): void {\n if (\n hostIsConsent(response.url) ||\n body.includes('www.google.com/recaptcha') ||\n body.includes('unusual traffic')\n ) {\n throw new BlockedError('Blocked by Google Play (consent wall or captcha)');\n }\n}\n\nexport function createHttpClient(config: HttpClientConfig = {}): HttpClient {\n const fetchImpl = config.fetchImpl ?? fetch;\n const retries = config.retries ?? DEFAULT_RETRIES;\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const limiter = config.throttle !== undefined ? createRateLimiter(config.throttle) : undefined;\n\n const request = async (req: HttpRequest): Promise<string> => {\n const method = req.method ?? 'GET';\n const headers = buildHeaders(method, config.headers, req.headers);\n\n for (let attempt = 0; ; attempt += 1) {\n if (limiter) {\n await limiter();\n }\n try {\n const response = await fetchImpl(req.url, {\n method,\n headers,\n body: req.body,\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (response.ok) {\n const body = await response.text();\n assertNotBlocked(response, body);\n return body;\n }\n\n if (isRetryableStatus(response.status) && attempt < retries) {\n await sleep(computeBackoff(attempt, parseRetryAfter(response)));\n continue;\n }\n\n throw mapStatusToError(response.status, req.url);\n } catch (error) {\n if (error instanceof GooglePlayError) {\n throw error;\n }\n if (attempt < retries) {\n await sleep(computeBackoff(attempt, undefined));\n continue;\n }\n const httpError = new HttpError(`Network request to ${req.url} failed`, 0, req.url);\n httpError.cause = error;\n throw httpError;\n }\n }\n };\n\n return { request };\n}\n\nexport function clientFromOptions(opts: {\n throttle?: number;\n requestOptions?: RequestOptions;\n}): HttpClient {\n return createHttpClient({\n throttle: opts.throttle,\n fetchImpl: opts.requestOptions?.fetchImpl,\n retries: opts.requestOptions?.retries,\n timeoutMs: opts.requestOptions?.timeoutMs,\n headers: opts.requestOptions?.headers,\n });\n}\n","import { z } from 'zod';\nimport { ValidationError } from './errors.js';\n\nexport const requestOptionsSchema = z.object({\n headers: z.record(z.string(), z.string()).optional(),\n fetchImpl: z.custom<typeof fetch>((value) => typeof value === 'function').optional(),\n timeoutMs: z.number().int().positive().max(120000).optional(),\n retries: z.number().int().min(0).max(5).optional(),\n});\n\nexport type RequestOptions = z.infer<typeof requestOptionsSchema>;\n\nexport const baseOptionsSchema = z.object({\n lang: z.string().min(2).max(7).default('en'),\n country: z.string().length(2).default('us'),\n throttle: z.number().positive().max(50).optional(),\n requestOptions: requestOptionsSchema.optional(),\n});\n\nexport type BaseOptions = z.infer<typeof baseOptionsSchema>;\n\nexport function parseOptions<Schema extends z.ZodType>(\n schema: Schema,\n input: unknown,\n context: string,\n): z.infer<Schema> {\n const result = schema.safeParse(input);\n if (!result.success) {\n throw ValidationError.fromZod(result.error, context);\n }\n return result.data;\n}\n","export interface ScriptData {\n blocks: Record<string, unknown>;\n serviceRequests: Record<string, string>;\n}\n\nconst SCRIPT_BLOCK_REGEX = />AF_initDataCallback[\\s\\S]*?<\\/script/g;\nconst BLOCK_KEY_REGEX = /(ds:.*?)'/;\nconst BLOCK_PAYLOAD_REGEX = /data:([\\s\\S]*?), sideChannel: {}}\\);<\\//;\nconst SERVICE_TABLE_REGEX = /; var AF_dataServiceRequests[\\s\\S]*?; var AF_initDataChunkQueue/;\nconst SERVICE_PAIR_REGEX = /'(ds:\\d+)'\\s*:\\s*\\{\\s*id:\\s*'([^']+)'/g;\n\nfunction parseBlocks(html: string): Record<string, unknown> {\n const blocks: Record<string, unknown> = {};\n const matches = html.match(SCRIPT_BLOCK_REGEX);\n if (matches === null) {\n return blocks;\n }\n for (const block of matches) {\n const keyMatch = BLOCK_KEY_REGEX.exec(block);\n const payloadMatch = BLOCK_PAYLOAD_REGEX.exec(block);\n const key = keyMatch?.[1];\n const payload = payloadMatch?.[1];\n if (key === undefined || payload === undefined) {\n continue;\n }\n try {\n blocks[key] = JSON.parse(payload);\n } catch {\n continue;\n }\n }\n return blocks;\n}\n\nfunction parseServiceRequests(html: string): Record<string, string> {\n const requests: Record<string, string> = {};\n const tableMatch = SERVICE_TABLE_REGEX.exec(html);\n const table = tableMatch?.[0];\n if (table === undefined) {\n return requests;\n }\n for (const pair of table.matchAll(SERVICE_PAIR_REGEX)) {\n const dsKey = pair[1];\n const rpcId = pair[2];\n if (dsKey !== undefined && rpcId !== undefined) {\n requests[dsKey] = rpcId;\n }\n }\n return requests;\n}\n\nexport function parseScriptData(html: string): ScriptData {\n return {\n blocks: parseBlocks(html),\n serviceRequests: parseServiceRequests(html),\n };\n}\n\nexport function resolveDsKey(data: ScriptData, rpcId: string): string | undefined {\n for (const [dsKey, id] of Object.entries(data.serviceRequests)) {\n if (id === rpcId) {\n return dsKey;\n }\n }\n return undefined;\n}\n","export type PathSegment = number | string;\nexport type Path = readonly PathSegment[];\n\nfunction isIndexable(value: unknown): value is readonly unknown[] {\n return Array.isArray(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction step(value: unknown, segment: PathSegment): unknown {\n if (typeof segment === 'number') {\n if (!isIndexable(value)) {\n return undefined;\n }\n const index = segment < 0 ? value.length + segment : segment;\n return value[index];\n }\n if (isRecord(value)) {\n return value[segment];\n }\n return undefined;\n}\n\nexport function getPath(value: unknown, path: Path): unknown {\n let current = value;\n for (const segment of path) {\n if (current === undefined || current === null) {\n return undefined;\n }\n current = step(current, segment);\n }\n return current;\n}\n","import { z } from 'zod';\nimport type { Path } from './path.js';\nimport { getPath } from './path.js';\nimport type { ScriptData } from './scriptData.js';\nimport { resolveDsKey } from './scriptData.js';\nimport type { SpecFailure } from './errors.js';\nimport { SpecError } from './errors.js';\n\nexport interface FieldSpec<T = unknown> {\n paths: readonly Path[];\n schema: z.ZodType<T>;\n serviceRequestId?: string;\n transform?: (value: unknown, source: unknown) => unknown;\n}\n\nexport type SpecMap = Record<string, FieldSpec>;\nexport type Extracted<M extends SpecMap> = { [K in keyof M]: z.infer<M[K]['schema']> };\n\nfunction isScriptData(source: unknown): source is ScriptData {\n return (\n typeof source === 'object' &&\n source !== null &&\n 'blocks' in source &&\n 'serviceRequests' in source\n );\n}\n\nfunction candidatePaths(spec: FieldSpec, source: unknown): readonly Path[] {\n if (spec.serviceRequestId !== undefined && isScriptData(source)) {\n const dsKey = resolveDsKey(source, spec.serviceRequestId);\n if (dsKey !== undefined) {\n return spec.paths.map((path) => [dsKey, ...path]);\n }\n }\n return spec.paths;\n}\n\nfunction resolveValue(root: unknown, paths: readonly Path[]): unknown {\n for (const path of paths) {\n const value = getPath(root, path);\n if (value !== undefined && value !== null) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction failureMessage(error: unknown): string {\n if (error instanceof z.ZodError) {\n return error.issues\n .map((issue) => {\n const path = issue.path.join('.');\n return path ? `${path}: ${issue.message}` : issue.message;\n })\n .join('; ');\n }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return 'non-error thrown during extraction';\n}\n\nexport function extract<M extends SpecMap>(\n source: unknown,\n specs: M,\n context: string,\n): Extracted<M>;\nexport function extract(source: unknown, specs: SpecMap, context: string): Record<string, unknown> {\n const root = isScriptData(source) ? source.blocks : source;\n const result: Record<string, unknown> = {};\n const failures: SpecFailure[] = [];\n\n for (const [field, spec] of Object.entries(specs)) {\n const paths = candidatePaths(spec, source);\n const raw = resolveValue(root, paths);\n try {\n const input = spec.transform ? spec.transform(raw, source) : raw;\n result[field] = spec.schema.parse(input);\n } catch (error) {\n failures.push({ field, paths, message: failureMessage(error) });\n }\n }\n\n if (failures.length > 0) {\n throw new SpecError(context, failures);\n }\n\n return result;\n}\n","import { z } from 'zod';\n\nexport const appCategorySchema = z.object({\n name: z.string(),\n id: z.string().nullable(),\n});\n\nexport type AppCategory = z.infer<typeof appCategorySchema>;\n\nconst histogramSchema = z.object({\n '1': z.number(),\n '2': z.number(),\n '3': z.number(),\n '4': z.number(),\n '5': z.number(),\n});\n\nexport const appSchema = z.object({\n title: z.string(),\n description: z.string(),\n descriptionHTML: z.string(),\n summary: z.string().optional(),\n installs: z.string().optional(),\n minInstalls: z.number().optional(),\n maxInstalls: z.number().optional(),\n score: z.number().min(0).max(5).optional(),\n scoreText: z.string().optional(),\n ratings: z.number().optional(),\n reviews: z.number().optional(),\n histogram: histogramSchema,\n price: z.number(),\n originalPrice: z.number().optional(),\n discountEndDate: z.number().optional(),\n free: z.boolean(),\n currency: z.string().optional(),\n priceText: z.string(),\n available: z.boolean(),\n offersIAP: z.boolean(),\n IAPRange: z.string().optional(),\n androidVersion: z.string(),\n androidVersionText: z.string(),\n androidMaxVersion: z.string(),\n developer: z.string(),\n developerId: z.string(),\n developerEmail: z.string().optional(),\n developerWebsite: z.string().optional(),\n developerAddress: z.string().optional(),\n developerLegalName: z.string().optional(),\n developerLegalEmail: z.string().optional(),\n developerLegalAddress: z.string().optional(),\n developerLegalPhoneNumber: z.string().optional(),\n privacyPolicy: z.string().optional(),\n developerInternalID: z.string(),\n genre: z.string(),\n genreId: z.string(),\n categories: z.array(appCategorySchema),\n icon: z.string(),\n headerImage: z.string().optional(),\n screenshots: z.array(z.string()),\n video: z.string().optional(),\n videoImage: z.string().optional(),\n previewVideo: z.string().optional(),\n contentRating: z.string().optional(),\n contentRatingDescription: z.string().optional(),\n adSupported: z.boolean(),\n released: z.string().optional(),\n updated: z.number(),\n version: z.string(),\n recentChanges: z.string().optional(),\n comments: z.array(z.string()),\n preregister: z.boolean(),\n earlyAccessEnabled: z.boolean(),\n isAvailableInPlayPass: z.boolean(),\n appId: z.string(),\n url: z.string(),\n});\n\nexport type App = z.infer<typeof appSchema>;\n","import * as cheerio from 'cheerio';\nimport { getPath } from '../../core/path.js';\nimport type { AppCategory } from './schema.js';\n\nconst COMMENT_ROOTS = ['ds:8', 'ds:9'] as const;\nconst MAX_COMMENTS = 5;\nconst MICROS_PER_UNIT = 1_000_000;\n\nexport function descriptionHtmlLocalized(value: unknown): string | undefined {\n const translated = getPath(value, [12, 0, 0, 1]);\n const original = getPath(value, [72, 0, 1]);\n const resolved = typeof translated === 'string' && translated.length > 0 ? translated : original;\n return typeof resolved === 'string' ? resolved : undefined;\n}\n\nexport function descriptionText(html: unknown): string | undefined {\n if (typeof html !== 'string') {\n return undefined;\n }\n const document = cheerio.load(`<div>${html.replace(/<br>/g, '\\r\\n')}</div>`);\n return document('div').text();\n}\n\nexport function priceText(value: unknown): string {\n return typeof value === 'string' && value.length > 0 ? value : 'Free';\n}\n\nexport function normalizeAndroidVersion(value: unknown): string {\n if (typeof value !== 'string') {\n return 'VARY';\n }\n const token = value.split(' ')[0];\n if (token !== undefined && parseFloat(token)) {\n return token;\n }\n return 'VARY';\n}\n\nexport function buildHistogram(container: unknown): Record<number, number> {\n return {\n 1: histogramCount(container, 1),\n 2: histogramCount(container, 2),\n 3: histogramCount(container, 3),\n 4: histogramCount(container, 4),\n 5: histogramCount(container, 5),\n };\n}\n\nfunction histogramCount(container: unknown, star: number): number {\n const bucket = getPath(container, [star, 1]);\n return typeof bucket === 'number' ? bucket : 0;\n}\n\nexport function microsToUnits(value: unknown): number {\n if (typeof value !== 'number') {\n return 0;\n }\n return value / MICROS_PER_UNIT || 0;\n}\n\nexport function developerIdFromUrl(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n return value.split('id=')[1];\n}\n\nexport function extractComments(source: unknown): string[] {\n for (const root of COMMENT_ROOTS) {\n const author = getPath(source, [root, 0, 0, 1, 0]);\n const version = getPath(source, [root, 0, 0, 10]);\n const date = getPath(source, [root, 0, 0, 5, 0]);\n if (author && version && date) {\n const comments = getPath(source, [root, 0]);\n if (Array.isArray(comments)) {\n return comments\n .map((comment) => getPath(comment, [4]))\n .filter((text): text is string => typeof text === 'string')\n .slice(0, MAX_COMMENTS);\n }\n }\n }\n return [];\n}\n\nexport function extractScreenshots(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((shot) => getPath(shot, [3, 2]))\n .filter((url): url is string => typeof url === 'string');\n}\n\nexport function extractCategories(value: unknown, categories: AppCategory[] = []): AppCategory[] {\n if (!Array.isArray(value) || value.length === 0) {\n return categories;\n }\n if (value.length >= 4 && typeof value[0] === 'string') {\n categories.push({ name: value[0], id: nullableString(value[2]) });\n return categories;\n }\n for (const sub of value) {\n extractCategories(sub, categories);\n }\n return categories;\n}\n\nexport function categoriesFromDetail(value: unknown): AppCategory[] {\n const categories = extractCategories(getPath(value, [118]));\n if (categories.length > 0) {\n return categories;\n }\n const name = getPath(value, [79, 0, 0, 0]);\n if (typeof name === 'string') {\n return [{ name, id: nullableString(getPath(value, [79, 0, 0, 2])) }];\n }\n return categories;\n}\n\nfunction nullableString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n","import { getPath } from '../../core/path.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { appSchema } from './schema.js';\nimport {\n buildHistogram,\n categoriesFromDetail,\n descriptionHtmlLocalized,\n descriptionText,\n developerIdFromUrl,\n extractComments,\n extractScreenshots,\n microsToUnits,\n normalizeAndroidVersion,\n priceText,\n} from './transforms.js';\n\nconst shape = appSchema.shape;\n\nexport const appSpecs = {\n title: { paths: [['ds:5', 1, 2, 0, 0]], schema: shape.title },\n description: {\n paths: [['ds:5', 1, 2]],\n schema: shape.description,\n transform: (value) => descriptionText(descriptionHtmlLocalized(value)),\n },\n descriptionHTML: {\n paths: [['ds:5', 1, 2]],\n schema: shape.descriptionHTML,\n transform: descriptionHtmlLocalized,\n },\n summary: { paths: [['ds:5', 1, 2, 73, 0, 1]], schema: shape.summary },\n installs: { paths: [['ds:5', 1, 2, 13, 0]], schema: shape.installs },\n minInstalls: { paths: [['ds:5', 1, 2, 13, 1]], schema: shape.minInstalls },\n maxInstalls: { paths: [['ds:5', 1, 2, 13, 2]], schema: shape.maxInstalls },\n score: { paths: [['ds:5', 1, 2, 51, 0, 1]], schema: shape.score },\n scoreText: { paths: [['ds:5', 1, 2, 51, 0, 0]], schema: shape.scoreText },\n ratings: { paths: [['ds:5', 1, 2, 51, 2, 1]], schema: shape.ratings },\n reviews: { paths: [['ds:5', 1, 2, 51, 3, 1]], schema: shape.reviews },\n histogram: {\n paths: [['ds:5', 1, 2, 51, 1]],\n schema: shape.histogram,\n transform: buildHistogram,\n },\n price: {\n paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 1, 0, 0]],\n schema: shape.price,\n transform: microsToUnits,\n },\n originalPrice: {\n paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 1, 1, 0]],\n schema: shape.originalPrice,\n transform: (value) =>\n typeof value === 'number' && value !== 0 ? microsToUnits(value) : undefined,\n },\n discountEndDate: {\n paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 14, 1]],\n schema: shape.discountEndDate,\n },\n free: {\n paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 1, 0, 0]],\n schema: shape.free,\n transform: (value) => value === 0,\n },\n currency: { paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 1, 0, 1]], schema: shape.currency },\n priceText: {\n paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 1, 0, 2]],\n schema: shape.priceText,\n transform: priceText,\n },\n available: {\n paths: [['ds:5', 1, 2, 18, 0]],\n schema: shape.available,\n transform: (value) => Boolean(value),\n },\n offersIAP: {\n paths: [['ds:5', 1, 2, 19, 0]],\n schema: shape.offersIAP,\n transform: (value) => Boolean(value),\n },\n IAPRange: { paths: [['ds:5', 1, 2, 19, 0]], schema: shape.IAPRange },\n androidVersion: {\n paths: [\n ['ds:5', 1, 2, 140, 1, 1, 0, 0, 1],\n ['ds:5', 1, 2, -1, '141', 1, 1, 0, 0, 1],\n ],\n schema: shape.androidVersion,\n transform: normalizeAndroidVersion,\n },\n androidVersionText: {\n paths: [\n ['ds:5', 1, 2, 140, 1, 1, 0, 0, 1],\n ['ds:5', 1, 2, -1, '141', 1, 1, 0, 0, 1],\n ],\n schema: shape.androidVersionText,\n transform: (value) =>\n typeof value === 'string' && value.length > 0 ? value : 'Varies with device',\n },\n androidMaxVersion: {\n paths: [\n ['ds:5', 1, 2, 140, 1, 1, 0, 1, 1],\n ['ds:5', 1, 2, -1, '141', 1, 1, 0, 1, 1],\n ],\n schema: shape.androidMaxVersion,\n transform: normalizeAndroidVersion,\n },\n developer: { paths: [['ds:5', 1, 2, 68, 0]], schema: shape.developer },\n developerId: {\n paths: [['ds:5', 1, 2, 68, 1, 4, 2]],\n schema: shape.developerId,\n transform: developerIdFromUrl,\n },\n developerEmail: { paths: [['ds:5', 1, 2, 69, 1, 0]], schema: shape.developerEmail },\n developerWebsite: { paths: [['ds:5', 1, 2, 69, 0, 5, 2]], schema: shape.developerWebsite },\n developerAddress: { paths: [['ds:5', 1, 2, 69, 2, 0]], schema: shape.developerAddress },\n developerLegalName: { paths: [['ds:5', 1, 2, 69, 4, 0]], schema: shape.developerLegalName },\n developerLegalEmail: { paths: [['ds:5', 1, 2, 69, 4, 1, 0]], schema: shape.developerLegalEmail },\n developerLegalAddress: {\n paths: [['ds:5', 1, 2, 69]],\n schema: shape.developerLegalAddress,\n transform: (value) => {\n const address = getPath(value, [4, 2, 0]);\n return typeof address === 'string' ? address.replace(/\\n/g, ', ') : undefined;\n },\n },\n developerLegalPhoneNumber: {\n paths: [['ds:5', 1, 2, 69, 4, 3]],\n schema: shape.developerLegalPhoneNumber,\n },\n privacyPolicy: { paths: [['ds:5', 1, 2, 99, 0, 5, 2]], schema: shape.privacyPolicy },\n developerInternalID: {\n paths: [['ds:5', 1, 2, 68, 1, 4, 2]],\n schema: shape.developerInternalID,\n transform: developerIdFromUrl,\n },\n genre: { paths: [['ds:5', 1, 2, 79, 0, 0, 0]], schema: shape.genre },\n genreId: { paths: [['ds:5', 1, 2, 79, 0, 0, 2]], schema: shape.genreId },\n categories: {\n paths: [['ds:5', 1, 2]],\n schema: shape.categories,\n transform: categoriesFromDetail,\n },\n icon: { paths: [['ds:5', 1, 2, 95, 0, 3, 2]], schema: shape.icon },\n headerImage: { paths: [['ds:5', 1, 2, 96, 0, 3, 2]], schema: shape.headerImage },\n screenshots: {\n paths: [['ds:5', 1, 2, 78, 0]],\n schema: shape.screenshots,\n transform: extractScreenshots,\n },\n video: { paths: [['ds:5', 1, 2, 100, 0, 0, 3, 2]], schema: shape.video },\n videoImage: { paths: [['ds:5', 1, 2, 100, 1, 0, 3, 2]], schema: shape.videoImage },\n previewVideo: { paths: [['ds:5', 1, 2, 100, 1, 2, 0, 2]], schema: shape.previewVideo },\n contentRating: { paths: [['ds:5', 1, 2, 9, 0]], schema: shape.contentRating },\n contentRatingDescription: {\n paths: [['ds:5', 1, 2, 9, 2, 1]],\n schema: shape.contentRatingDescription,\n },\n adSupported: {\n paths: [['ds:5', 1, 2, 48]],\n schema: shape.adSupported,\n transform: (value) => Boolean(value),\n },\n released: { paths: [['ds:5', 1, 2, 10, 0]], schema: shape.released },\n updated: {\n paths: [\n ['ds:5', 1, 2, 145, 0, 1, 0],\n ['ds:5', 1, 2, -1, '146', 0, 1, 0],\n ],\n schema: shape.updated,\n transform: (value) => (typeof value === 'number' ? value * 1000 : value),\n },\n version: {\n paths: [\n ['ds:5', 1, 2, 140, 0, 0, 0],\n ['ds:5', 1, 2, -1, '141', 0, 0, 0],\n ],\n schema: shape.version,\n transform: (value) => (typeof value === 'string' && value.length > 0 ? value : 'VARY'),\n },\n recentChanges: {\n paths: [\n ['ds:5', 1, 2, 144, 1, 1],\n ['ds:5', 1, 2, -1, '145', 1, 1],\n ],\n schema: shape.recentChanges,\n },\n comments: { paths: [[]], schema: shape.comments, transform: extractComments },\n preregister: {\n paths: [['ds:5', 1, 2, 18, 0]],\n schema: shape.preregister,\n transform: (value) => value === 1,\n },\n earlyAccessEnabled: {\n paths: [['ds:5', 1, 2, 18, 2]],\n schema: shape.earlyAccessEnabled,\n transform: (value) => typeof value === 'string',\n },\n isAvailableInPlayPass: {\n paths: [['ds:5', 1, 2, 62]],\n schema: shape.isAvailableInPlayPass,\n transform: (value) => Boolean(value),\n },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport { BASE_URL } from '../../constants.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { parseScriptData } from '../../core/scriptData.js';\nimport { extract } from '../../core/spec.js';\nimport { appSchema, type App } from './schema.js';\nimport { appSpecs } from './specs.js';\n\nexport const appOptionsSchema = baseOptionsSchema.extend({\n appId: z.string().min(1),\n});\n\nexport type AppOptions = z.input<typeof appOptionsSchema>;\n\nconst DETAILS_URL = `${BASE_URL}/store/apps/details`;\n\nexport async function app(options: AppOptions): Promise<App> {\n const parsed = parseOptions(appOptionsSchema, options, 'app');\n\n const params = new URLSearchParams({\n id: parsed.appId,\n hl: parsed.lang,\n gl: parsed.country,\n });\n const url = `${DETAILS_URL}?${params.toString()}`;\n\n const client = clientFromOptions(parsed);\n const html = await client.request({ url });\n const data = parseScriptData(html);\n const extracted = extract(data, appSpecs, 'app');\n\n return appSchema.parse({ ...extracted, appId: parsed.appId, url });\n}\n","import { BASE_URL } from '../constants.js';\nimport { ParseError } from './errors.js';\n\nexport const BATCH_URL = `${BASE_URL}/_/PlayStoreUi/data/batchexecute`;\n\nconst DEFAULT_ENVELOPE_TAIL: readonly unknown[] = [null, 'generic'];\nconst WRB_FRAME_MARKER = 'wrb.fr';\nconst SNIPPET_LENGTH = 200;\n\nfunction isArray(value: unknown): value is readonly unknown[] {\n return Array.isArray(value);\n}\n\nfunction snippet(text: string): string {\n return text.slice(0, SNIPPET_LENGTH);\n}\n\nexport function buildBatchBody(\n rpcId: string,\n payload: unknown,\n envelopeTail: readonly unknown[] = DEFAULT_ENVELOPE_TAIL,\n): string {\n const inner: unknown[] = [rpcId, JSON.stringify(payload), ...envelopeTail];\n const envelope = [[inner]];\n return new URLSearchParams({ 'f.req': JSON.stringify(envelope) }).toString();\n}\n\ninterface EnvelopeMatch {\n found: boolean;\n value: unknown;\n}\n\nfunction matchEnvelope(frames: readonly unknown[], rpcId: string): EnvelopeMatch {\n for (const frame of frames) {\n if (!isArray(frame)) {\n continue;\n }\n if (frame[0] === WRB_FRAME_MARKER && frame[1] === rpcId) {\n const raw = frame[2];\n if (typeof raw === 'string') {\n return { found: true, value: JSON.parse(raw) };\n }\n return { found: true, value: null };\n }\n }\n return { found: false, value: undefined };\n}\n\nfunction tryParseArray(text: string): readonly unknown[] | undefined {\n try {\n const parsed: unknown = JSON.parse(text);\n return isArray(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function parseBatchResponse(text: string, rpcId: string): unknown {\n const start = text.indexOf('[');\n if (start === -1) {\n throw new ParseError(`batchexecute response missing array start: ${snippet(text)}`);\n }\n const body = text.slice(start);\n\n for (const line of body.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('[')) {\n continue;\n }\n const frames = tryParseArray(trimmed);\n if (frames === undefined) {\n continue;\n }\n const match = matchEnvelope(frames, rpcId);\n if (match.found) {\n return match.value;\n }\n }\n\n const whole = tryParseArray(body);\n if (whole !== undefined) {\n const match = matchEnvelope(whole, rpcId);\n if (match.found) {\n return match.value;\n }\n }\n\n throw new ParseError(`batchexecute response has no envelope for rpc ${rpcId}: ${snippet(body)}`);\n}\n","import { BATCH_URL, parseBatchResponse } from './batchexecute.js';\nimport type { HttpClient } from './http.js';\nimport { getPath, type Path } from './path.js';\nimport { extract, type Extracted, type SpecMap } from './spec.js';\n\nexport const CLUSTER_RPC_ID = 'qnKhOb';\nexport const CLUSTER_PAGE_SIZE = 100;\n\nconst CLUSTER_STATIC_QUERY =\n 'rpcids=qnKhOb&f.sid=-697906427155521722&bl=boq_playuiserver_20190903.08_p0';\nconst CLUSTER_TRAILING_QUERY = 'authuser&soc-app=121&soc-platform=1&soc-device=1&_reqid=1065213';\n\nexport function clusterUrl(lang: string, country: string): string {\n return `${BATCH_URL}?${CLUSTER_STATIC_QUERY}&hl=${lang}&gl=${country}&${CLUSTER_TRAILING_QUERY}`;\n}\n\nexport function buildClusterBody(numberOfApps: number, withToken: string): string {\n return `f.req=%5B%5B%5B%22qnKhOb%22%2C%22%5B%5Bnull%2C%5B%5B10%2C%5B10%2C${numberOfApps.toString()}%5D%5D%2Ctrue%2Cnull%2C%5B96%2C27%2C4%2C8%2C57%2C30%2C110%2C79%2C11%2C16%2C49%2C1%2C3%2C9%2C12%2C104%2C55%2C56%2C51%2C10%2C34%2C77%5D%5D%2Cnull%2C%5C%22${withToken}%5C%22%5D%5D%22%2Cnull%2C%22generic%22%5D%5D%5D`;\n}\n\nfunction asToken(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nexport interface FetchClusterAppsParams<M extends SpecMap> {\n client: HttpClient;\n lang: string;\n country: string;\n num: number;\n initialApps: Extracted<M>[];\n initialToken: string | undefined;\n itemSpecs: M;\n appsPath: Path;\n tokenPath: Path;\n context: string;\n}\n\nexport async function fetchClusterApps<M extends SpecMap>(\n params: FetchClusterAppsParams<M>,\n): Promise<Extracted<M>[]> {\n const { client, lang, country, num, itemSpecs, appsPath, tokenPath, context } = params;\n const collected: Extracted<M>[] = [...params.initialApps];\n let token = asToken(params.initialToken);\n\n while (collected.length < num && token !== undefined) {\n const body = buildClusterBody(CLUSTER_PAGE_SIZE, token);\n const text = await client.request({ url: clusterUrl(lang, country), method: 'POST', body });\n const payload = parseBatchResponse(text, CLUSTER_RPC_ID);\n\n const apps = getPath(payload, appsPath);\n if (!Array.isArray(apps) || apps.length === 0) {\n break;\n }\n for (const item of apps) {\n collected.push(extract(item, itemSpecs, context));\n }\n token = asToken(getPath(payload, tokenPath));\n }\n\n return collected.slice(0, num);\n}\n","import type { RequestOptions } from './options.js';\n\nexport interface FullDetailOptions {\n lang: string;\n country: string;\n throttle?: number;\n requestOptions?: RequestOptions;\n}\n\nexport interface GetAppParams {\n appId: string;\n lang: string;\n country: string;\n throttle?: number;\n requestOptions?: RequestOptions;\n}\n\nexport type GetApp<Result> = (params: GetAppParams) => Promise<Result>;\n\nconst DEFAULT_CONCURRENCY = 3;\n\nexport async function resolveFullDetail<Result>(\n items: readonly { appId: string }[],\n options: FullDetailOptions,\n getApp: GetApp<Result>,\n concurrency = DEFAULT_CONCURRENCY,\n): Promise<Result[]> {\n const results: Result[] = new Array<Result>(items.length);\n let cursor = 0;\n\n const worker = async (): Promise<void> => {\n while (cursor < items.length) {\n const index = cursor;\n cursor += 1;\n const item = items[index];\n if (item === undefined) {\n continue;\n }\n results[index] = await getApp({\n appId: item.appId,\n lang: options.lang,\n country: options.country,\n throttle: options.throttle,\n requestOptions: options.requestOptions,\n });\n }\n };\n\n const workerCount = Math.min(concurrency, items.length);\n await Promise.all(Array.from({ length: workerCount }, () => worker()));\n\n return results;\n}\n","import { z } from 'zod';\n\nexport const appItemSchema = z.object({\n title: z.string(),\n appId: z.string(),\n url: z.string(),\n icon: z.string(),\n developer: z.string(),\n developerId: z.string().optional(),\n currency: z.string().optional(),\n price: z.number(),\n free: z.boolean(),\n summary: z.string().optional(),\n scoreText: z.string().optional(),\n score: z.number().min(0).max(5).optional(),\n});\n\nexport type AppItem = z.infer<typeof appItemSchema>;\n","import { appItemSchema, type AppItem } from '../../core/appItem.js';\n\nexport const searchResultSchema = appItemSchema;\n\nexport type SearchResult = AppItem;\n","import { BASE_URL } from '../../constants.js';\nimport type { Path } from '../../core/path.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { searchResultSchema } from './schema.js';\n\nconst MICROS_PER_UNIT = 1_000_000;\nconst shape = searchResultSchema.shape;\n\nexport type PriceFilter = 'all' | 'free' | 'paid';\n\nfunction resolveUrl(value: unknown): string | undefined {\n return typeof value === 'string' ? new URL(value, BASE_URL).toString() : undefined;\n}\n\nfunction microsToUnits(value: unknown): number {\n return typeof value === 'number' ? value / MICROS_PER_UNIT || 0 : 0;\n}\n\nfunction isFree(value: unknown): boolean {\n return value === 0;\n}\n\nfunction developerIdFromLink(value: unknown): string | undefined {\n return typeof value === 'string' ? value.split('?id=')[1] : undefined;\n}\n\nexport const INITIAL_MAPPINGS = {\n app: ['ds:4', 0, 1, 0, 23],\n sections: ['ds:4', 0, 1],\n} satisfies Record<string, Path>;\n\nexport const SECTIONS_MAPPING = {\n apps: [22, 0],\n token: [22, 1, 3, 1],\n} satisfies Record<string, Path>;\n\nexport const CLUSTER_MAPPINGS = {\n apps: [0, 0, 0],\n token: [0, 0, 7, 1],\n} satisfies Record<string, Path>;\n\nexport const searchItemSpecs = {\n title: { paths: [[0, 3]], schema: shape.title },\n appId: { paths: [[0, 0, 0]], schema: shape.appId },\n url: { paths: [[0, 10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[0, 1, 3, 2]], schema: shape.icon },\n developer: { paths: [[0, 14]], schema: shape.developer },\n currency: { paths: [[0, 8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[0, 8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[0, 8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[0, 13, 1]], schema: shape.summary },\n scoreText: { paths: [[0, 4, 0]], schema: shape.scoreText },\n score: { paths: [[0, 4, 1]], schema: shape.score },\n} satisfies SpecMap;\n\nexport const searchPageItemSpecs = {\n title: { paths: [[3]], schema: shape.title },\n appId: { paths: [[0, 0]], schema: shape.appId },\n url: { paths: [[10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[1, 3, 2]], schema: shape.icon },\n developer: { paths: [[14]], schema: shape.developer },\n currency: { paths: [[8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[13, 1]], schema: shape.summary },\n scoreText: { paths: [[4, 0]], schema: shape.scoreText },\n score: { paths: [[4, 1]], schema: shape.score },\n} satisfies SpecMap;\n\nexport const exactMatchSpecs = {\n title: { paths: [[16, 2, 0, 0]], schema: shape.title },\n appId: { paths: [[16, 3, '12', 0, 0]], schema: shape.appId },\n url: { paths: [[17, 0, 0, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[16, 2, 95, 0, 3, 2]], schema: shape.icon },\n developer: { paths: [[16, 2, 68, 0]], schema: shape.developer },\n developerId: {\n paths: [[16, 2, 68, 1, 4, 2]],\n schema: shape.developerId,\n transform: developerIdFromLink,\n },\n currency: { paths: [[17, 0, 2, 0, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[17, 0, 2, 0, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[17, 0, 2, 0, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[16, 2, 73, 0, 1]], schema: shape.summary },\n scoreText: { paths: [[16, 2, 51, 0, 0]], schema: shape.scoreText },\n score: { paths: [[16, 2, 51, 0, 1]], schema: shape.score },\n} satisfies SpecMap;\n\nexport function priceGoogleValue(value: PriceFilter): number {\n switch (value) {\n case 'free':\n return 1;\n case 'paid':\n return 2;\n default:\n return 0;\n }\n}\n","import { z } from 'zod';\nimport { BASE_URL } from '../../constants.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport { fetchClusterApps } from '../../core/pagination.js';\nimport { resolveFullDetail, type GetApp } from '../../core/fullDetail.js';\nimport { parseScriptData, type ScriptData } from '../../core/scriptData.js';\nimport { extract, type Extracted } from '../../core/spec.js';\nimport { app } from '../app/app.js';\nimport type { App } from '../app/schema.js';\nimport { searchResultSchema, type SearchResult } from './schema.js';\nimport {\n CLUSTER_MAPPINGS,\n exactMatchSpecs,\n INITIAL_MAPPINGS,\n priceGoogleValue,\n searchItemSpecs,\n searchPageItemSpecs,\n SECTIONS_MAPPING,\n} from './specs.js';\n\nexport const searchOptionsSchema = baseOptionsSchema.extend({\n term: z.string().min(1),\n num: z.number().int().min(1).max(250).default(20),\n price: z.enum(['all', 'free', 'paid']).default('all'),\n fullDetail: z.boolean().default(false),\n});\n\nexport type SearchOptions = z.input<typeof searchOptionsSchema>;\n\nconst SEARCH_URL = `${BASE_URL}/store/search`;\nconst SEARCH_CONTEXT = 'search';\n\ntype SearchItem = Extracted<typeof searchPageItemSpecs>;\n\ninterface FirstPage {\n apps: SearchItem[];\n token: string | undefined;\n}\n\nfunction prependExactMatch(data: ScriptData, apps: SearchItem[]): SearchItem[] {\n const exactMatchData = getPath(data.blocks, INITIAL_MAPPINGS.app);\n if (exactMatchData === undefined || exactMatchData === null) {\n return apps;\n }\n let exactMatch: SearchItem;\n try {\n exactMatch = extract(exactMatchData, exactMatchSpecs, SEARCH_CONTEXT);\n } catch {\n return apps;\n }\n if (apps.some((item) => item.appId === exactMatch.appId)) {\n return apps;\n }\n return [exactMatch, ...apps];\n}\n\nfunction firstPage(data: ScriptData): FirstPage {\n const sections = getPath(data.blocks, INITIAL_MAPPINGS.sections);\n if (!Array.isArray(sections)) {\n return { apps: [], token: undefined };\n }\n for (const section of sections) {\n const apps = getPath(section, SECTIONS_MAPPING.apps);\n if (Array.isArray(apps) && apps.length > 0) {\n const extracted = apps.map((item) => extract(item, searchItemSpecs, SEARCH_CONTEXT));\n const token = getPath(section, SECTIONS_MAPPING.token);\n return {\n apps: prependExactMatch(data, extracted),\n token: typeof token === 'string' ? token : undefined,\n };\n }\n }\n return { apps: [], token: undefined };\n}\n\nexport function createSearch(getApp: GetApp<App>) {\n return async function search(options: SearchOptions): Promise<SearchResult[] | App[]> {\n const parsed = parseOptions(searchOptionsSchema, options, SEARCH_CONTEXT);\n\n const params = new URLSearchParams({\n c: 'apps',\n q: parsed.term,\n hl: parsed.lang,\n gl: parsed.country,\n price: priceGoogleValue(parsed.price).toString(),\n });\n\n const client = clientFromOptions(parsed);\n const html = await client.request({ url: `${SEARCH_URL}?${params.toString()}` });\n const data = parseScriptData(html);\n const page = firstPage(data);\n\n const items = await fetchClusterApps({\n client,\n lang: parsed.lang,\n country: parsed.country,\n num: parsed.num,\n initialApps: page.apps,\n initialToken: page.token,\n itemSpecs: searchPageItemSpecs,\n appsPath: CLUSTER_MAPPINGS.apps,\n tokenPath: CLUSTER_MAPPINGS.token,\n context: SEARCH_CONTEXT,\n });\n\n const sliced = items.slice(0, parsed.num);\n\n if (parsed.fullDetail) {\n return resolveFullDetail(sliced, parsed, getApp);\n }\n\n return z.array(searchResultSchema).parse(sliced);\n };\n}\n\nexport const search = createSearch(app);\n","import { BATCH_URL } from '../../core/batchexecute.js';\nimport type { Path } from '../../core/path.js';\n\nexport const SUGGEST_RPC_ID = 'IJ4APc';\n\nconst STATIC_QUERY_PARAMS = {\n rpcids: SUGGEST_RPC_ID,\n 'f.sid': '-697906427155521722',\n bl: 'boq_playuiserver_20190903.08_p0',\n 'soc-app': '121',\n 'soc-platform': '1',\n 'soc-device': '1',\n _reqid: '1065213',\n} as const;\n\nconst SUGGEST_LIMIT = 10;\nconst SUGGEST_DATASET = 2;\nconst SUGGEST_MODE = 4;\n\nexport function suggestUrl(lang: string, country: string): string {\n const params = new URLSearchParams({ ...STATIC_QUERY_PARAMS, hl: lang, gl: country });\n return `${BATCH_URL}?${params.toString()}`;\n}\n\nexport function buildSuggestPayload(term: string): unknown[] {\n return [[null, [term], [SUGGEST_LIMIT], [SUGGEST_DATASET], SUGGEST_MODE]];\n}\n\nexport const SUGGESTIONS_PATH: Path = [0, 0];\nexport const SUGGESTION_TEXT_PATH: Path = [0];\n","import { z } from 'zod';\nimport { buildBatchBody, parseBatchResponse } from '../../core/batchexecute.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport {\n buildSuggestPayload,\n SUGGEST_RPC_ID,\n SUGGESTION_TEXT_PATH,\n SUGGESTIONS_PATH,\n suggestUrl,\n} from './specs.js';\n\nexport const suggestOptionsSchema = baseOptionsSchema.extend({\n term: z.string().min(1),\n});\n\nexport type SuggestOptions = z.input<typeof suggestOptionsSchema>;\n\nconst SUGGEST_CONTEXT = 'suggest';\nconst MAX_SUGGESTIONS = 5;\n\nexport async function suggest(options: SuggestOptions): Promise<string[]> {\n const parsed = parseOptions(suggestOptionsSchema, options, SUGGEST_CONTEXT);\n\n const client = clientFromOptions(parsed);\n const body = buildBatchBody(SUGGEST_RPC_ID, buildSuggestPayload(parsed.term), []);\n const text = await client.request({\n url: suggestUrl(parsed.lang, parsed.country),\n method: 'POST',\n body,\n });\n\n const payload = parseBatchResponse(text, SUGGEST_RPC_ID);\n if (payload === null) {\n return [];\n }\n\n const entries = getPath(payload, SUGGESTIONS_PATH);\n if (!Array.isArray(entries)) {\n return [];\n }\n\n const suggestions = z\n .array(z.string())\n .parse(entries.map((entry) => getPath(entry, SUGGESTION_TEXT_PATH)));\n\n return suggestions.slice(0, MAX_SUGGESTIONS);\n}\n","import { appItemSchema, type AppItem } from '../../core/appItem.js';\n\nexport const listItemSchema = appItemSchema;\n\nexport type ListItem = AppItem;\n","import { BATCH_URL } from '../../core/batchexecute.js';\nimport { BASE_URL } from '../../constants.js';\nimport type { Category, Collection } from '../../constants.js';\nimport type { Path } from '../../core/path.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { appItemSchema } from '../../core/appItem.js';\n\nexport const LIST_RPC_ID = 'vyAe2';\n\nconst MICROS_PER_UNIT = 1_000_000;\nconst shape = appItemSchema.shape;\n\nconst STATIC_QUERY_PARAMS = {\n rpcids: LIST_RPC_ID,\n 'source-path': '/store/apps',\n 'f.sid': '-4178618388443751758',\n bl: 'boq_playuiserver_20220612.08_p0',\n authuser: '0',\n 'soc-app': '121',\n 'soc-platform': '1',\n 'soc-device': '1',\n _reqid: '82003',\n rt: 'c',\n} as const;\n\nexport const CLUSTER_NAMES: Record<Collection, string> = {\n TOP_FREE: 'topselling_free',\n TOP_PAID: 'topselling_paid',\n GROSSING: 'topgrossing',\n};\n\nexport function listUrl(lang: string, country: string, age?: string): string {\n const params = new URLSearchParams({ ...STATIC_QUERY_PARAMS, hl: lang, gl: country });\n if (age !== undefined) {\n params.set('age', age);\n }\n return `${BATCH_URL}?${params.toString()}`;\n}\n\ninterface ListBodyParams {\n num: string;\n collection: string;\n category: Category;\n}\n\nexport function buildListBody({ num, collection, category }: ListBodyParams): string {\n return `f.req=%5B%5B%5B%22vyAe2%22%2C%22%5B%5Bnull%2C%5B%5B8%2C%5B20%2C${num}%5D%5D%2Ctrue%2Cnull%2C%5B64%2C1%2C195%2C71%2C8%2C72%2C9%2C10%2C11%2C139%2C12%2C16%2C145%2C148%2C150%2C151%2C152%2C27%2C30%2C31%2C96%2C32%2C34%2C163%2C100%2C165%2C104%2C169%2C108%2C110%2C113%2C55%2C56%2C57%2C122%5D%2C%5Bnull%2Cnull%2C%5B%5B%5Btrue%5D%2Cnull%2C%5B%5Bnull%2C%5B%5D%5D%5D%2Cnull%2Cnull%2Cnull%2Cnull%2C%5Bnull%2C2%5D%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2C%5B1%5D%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2C%5B1%5D%5D%2C%5Bnull%2C%5B%5Bnull%2C%5B%5D%5D%5D%5D%2C%5Bnull%2C%5B%5Bnull%2C%5B%5D%5D%5D%2Cnull%2C%5Btrue%5D%5D%2C%5Bnull%2C%5B%5Bnull%2C%5B%5D%5D%5D%5D%2Cnull%2Cnull%2Cnull%2Cnull%2C%5B%5B%5Bnull%2C%5B%5D%5D%5D%5D%2C%5B%5B%5Bnull%2C%5B%5D%5D%5D%5D%5D%2C%5B%5B%5B%5B7%2C1%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C31%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C104%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C9%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C8%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C27%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C12%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C65%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C110%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C88%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C11%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C56%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C55%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C96%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C10%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C122%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C72%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C71%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C64%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C113%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C139%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C150%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C169%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C165%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C151%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C163%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C32%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C16%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C108%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C100%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B9%2C1%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C31%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C104%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C9%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C8%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C27%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C12%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C65%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C110%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C88%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C11%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C56%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C55%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C96%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C10%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C122%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C72%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C71%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C64%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C113%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C139%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C150%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C169%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C165%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C151%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C163%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C32%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C16%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C108%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C100%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B17%2C1%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C31%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C104%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C9%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C8%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C27%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C12%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C65%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C110%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C88%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C11%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C56%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C55%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C96%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C10%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C122%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C72%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C71%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C64%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C113%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C139%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C150%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C169%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C165%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C151%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C163%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C32%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C16%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C108%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C100%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B10%2C1%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C31%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C104%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C9%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C8%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C27%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C12%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C65%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C110%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C88%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C11%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C56%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C55%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C96%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C10%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C122%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C72%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C71%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C64%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C113%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C139%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C150%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C169%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C165%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C151%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C163%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C32%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C16%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C108%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C100%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B1%2C1%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C31%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C104%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C9%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C8%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C27%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C12%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C65%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C110%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C88%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C11%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C56%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C55%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C96%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C10%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C122%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C72%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C71%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C64%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C113%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C139%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C150%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C169%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C165%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C151%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C163%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C32%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C16%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C108%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C100%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B4%2C1%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C31%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C104%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C9%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C8%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C27%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C12%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C65%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C110%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C88%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C11%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C56%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C55%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C96%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C10%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C122%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C72%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C71%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C64%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C113%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C139%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C150%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C169%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C165%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C151%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C163%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C32%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C16%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C108%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C100%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B3%2C1%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C31%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C104%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C9%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C8%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C27%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C12%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C65%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C110%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C88%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C11%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C56%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C55%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C96%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C10%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C122%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C72%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C71%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C64%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C113%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C139%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C150%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C169%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C165%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C151%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C163%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C32%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C16%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C108%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C100%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B2%2C1%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C31%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C104%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C9%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C8%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C27%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C12%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C65%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C110%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C88%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C11%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C56%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C55%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C96%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C10%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C122%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C72%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C71%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C64%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C113%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C139%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C150%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C169%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C165%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C151%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C163%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C32%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C16%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C108%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C100%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%5D%5D%5D%2Cnull%2Cnull%2C%5B%5B%5B1%2C2%5D%2C%5B10%2C8%2C9%5D%2C%5B%5D%2C%5B%5D%5D%5D%5D%2C%5B2%2C%5C%22${collection}%5C%22%2C%5C%22${category}%5C%22%5D%5D%5D%22%2Cnull%2C%22generic%22%5D%5D%5D&at=AFSRYlx8XZfN8-O-IKASbNBDkB6T%3A1655531200971&`;\n}\n\nfunction resolveUrl(value: unknown): string | undefined {\n return typeof value === 'string' ? new URL(value, BASE_URL).toString() : undefined;\n}\n\nfunction microsToUnits(value: unknown): number {\n return typeof value === 'number' ? value / MICROS_PER_UNIT || 0 : 0;\n}\n\nfunction isFree(value: unknown): boolean {\n return value === 0;\n}\n\nexport const APPS_PATH: Path = [0, 1, 0, 28, 0];\n\nexport const listItemSpecs = {\n title: { paths: [[0, 3]], schema: shape.title },\n appId: { paths: [[0, 0, 0]], schema: shape.appId },\n url: { paths: [[0, 10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[0, 1, 3, 2]], schema: shape.icon },\n developer: { paths: [[0, 14]], schema: shape.developer },\n currency: { paths: [[0, 8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[0, 8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[0, 8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[0, 13, 1]], schema: shape.summary },\n scoreText: { paths: [[0, 4, 0]], schema: shape.scoreText },\n score: { paths: [[0, 4, 1]], schema: shape.score },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport {\n age as ageConstants,\n category as categoryConstants,\n collection as collectionConstants,\n} from '../../constants.js';\nimport { parseBatchResponse } from '../../core/batchexecute.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport { resolveFullDetail, type GetApp } from '../../core/fullDetail.js';\nimport { extract } from '../../core/spec.js';\nimport { app } from '../app/app.js';\nimport type { App } from '../app/schema.js';\nimport { listItemSchema, type ListItem } from './schema.js';\nimport {\n APPS_PATH,\n buildListBody,\n CLUSTER_NAMES,\n listItemSpecs,\n LIST_RPC_ID,\n listUrl,\n} from './specs.js';\n\nexport const listOptionsSchema = baseOptionsSchema.extend({\n collection: z.enum(collectionConstants).default('TOP_FREE'),\n category: z.enum(categoryConstants).default('APPLICATION'),\n age: z.enum(ageConstants).optional(),\n num: z.number().int().min(1).default(500),\n fullDetail: z.boolean().default(false),\n});\n\nexport type ListOptions = z.input<typeof listOptionsSchema>;\n\nconst LIST_CONTEXT = 'list';\n\nexport function createList(getApp: GetApp<App>) {\n return async function list(options: ListOptions): Promise<ListItem[] | App[]> {\n const parsed = parseOptions(listOptionsSchema, options, LIST_CONTEXT);\n\n const client = clientFromOptions(parsed);\n const body = buildListBody({\n num: parsed.num.toString(),\n collection: CLUSTER_NAMES[parsed.collection],\n category: parsed.category,\n });\n\n const text = await client.request({\n url: listUrl(parsed.lang, parsed.country, parsed.age),\n method: 'POST',\n body,\n });\n\n const payload = parseBatchResponse(text, LIST_RPC_ID);\n const appsData = getPath(payload, APPS_PATH);\n const items = Array.isArray(appsData)\n ? appsData.map((item) => extract(item, listItemSpecs, LIST_CONTEXT))\n : [];\n\n if (parsed.fullDetail) {\n return resolveFullDetail(items, parsed, getApp);\n }\n\n return z.array(listItemSchema).parse(items);\n };\n}\n\nexport const list = createList(app);\n","import { z } from 'zod';\nimport { category } from '../../constants.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\n\nexport const categoriesOptionsSchema = baseOptionsSchema.pick({\n throttle: true,\n requestOptions: true,\n});\n\nexport type CategoriesOptions = z.input<typeof categoriesOptionsSchema>;\n\nconst CATEGORIES_CONTEXT = 'categories';\nconst categoryListSchema = z.array(z.string()).min(1);\nconst CATEGORY_IDS: readonly string[] = Object.values(category);\n\nexport function categories(options?: CategoriesOptions): Promise<string[]> {\n return Promise.resolve().then(() => {\n parseOptions(categoriesOptionsSchema, options ?? {}, CATEGORIES_CONTEXT);\n return categoryListSchema.parse([...CATEGORY_IDS]);\n });\n}\n","import { BASE_URL } from '../constants.js';\nimport { appItemSchema } from './appItem.js';\nimport type { SpecMap } from './spec.js';\n\nconst shape = appItemSchema.shape;\nconst PRICE_NUMBER = /([0-9.,]+)/;\n\nfunction resolveUrl(value: unknown): string | undefined {\n return typeof value === 'string' ? new URL(value, BASE_URL).toString() : undefined;\n}\n\nfunction priceFromText(value: unknown): number {\n if (typeof value !== 'string') {\n return 0;\n }\n const match = PRICE_NUMBER.exec(value);\n return match === null ? 0 : Number.parseFloat(match[0]);\n}\n\nfunction isFreeText(value: unknown): boolean {\n return value === undefined || value === null;\n}\n\nexport const clusterItemSpecs = {\n title: { paths: [[2]], schema: shape.title },\n appId: { paths: [[12, 0]], schema: shape.appId },\n url: { paths: [[9, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[1, 1, 0, 3, 2]], schema: shape.icon },\n developer: { paths: [[4, 0, 0, 0]], schema: shape.developer },\n currency: { paths: [[7, 0, 3, 2, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[7, 0, 3, 2, 1, 0, 2]], schema: shape.price, transform: priceFromText },\n free: { paths: [[7, 0, 3, 2, 1, 0, 2]], schema: shape.free, transform: isFreeText },\n summary: { paths: [[4, 1, 1, 1, 1]], schema: shape.summary },\n scoreText: { paths: [[6, 0, 2, 1, 0]], schema: shape.scoreText },\n score: { paths: [[6, 0, 2, 1, 1]], schema: shape.score },\n} satisfies SpecMap;\n","import { appItemSchema, type AppItem } from '../../core/appItem.js';\n\nexport const developerAppSchema = appItemSchema;\n\nexport type DeveloperApp = AppItem;\n","import { BASE_URL } from '../../constants.js';\nimport type { Path } from '../../core/path.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { developerAppSchema } from './schema.js';\n\nconst MICROS_PER_UNIT = 1_000_000;\nconst shape = developerAppSchema.shape;\n\nconst NUMERIC_ID = /^\\d+$/;\n\nexport function isNumericDevId(devId: string): boolean {\n return NUMERIC_ID.test(devId);\n}\n\nexport function developerUrl(devId: string, lang: string, country: string): string {\n const path = isNumericDevId(devId) ? '/store/apps/dev' : '/store/apps/developer';\n const params = new URLSearchParams({ id: devId, hl: lang, gl: country });\n return `${BASE_URL}${path}?${params.toString()}`;\n}\n\nexport const NUMERIC_INITIAL_MAPPINGS = {\n apps: ['ds:3', 0, 1, 0, 21, 0],\n token: ['ds:3', 0, 1, 0, 21, 1, 3, 1],\n} satisfies Record<string, Path>;\n\nexport const NAME_INITIAL_MAPPINGS = {\n apps: ['ds:3', 0, 1, 0, 22, 0],\n token: ['ds:3', 0, 1, 0, 22, 1, 3, 1],\n} satisfies Record<string, Path>;\n\nexport const CLUSTER_MAPPINGS = {\n apps: [0, 6, 0],\n token: [0, 6, 7, 1],\n} satisfies Record<string, Path>;\n\nfunction resolveUrl(value: unknown): string | undefined {\n return typeof value === 'string' ? new URL(value, BASE_URL).toString() : undefined;\n}\n\nfunction microsToUnits(value: unknown): number {\n return typeof value === 'number' ? value / MICROS_PER_UNIT || 0 : 0;\n}\n\nfunction isFree(value: unknown): boolean {\n return value === 0;\n}\n\nexport const nameItemSpecs = {\n title: { paths: [[0, 3]], schema: shape.title },\n appId: { paths: [[0, 0, 0]], schema: shape.appId },\n url: { paths: [[0, 10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[0, 1, 3, 2]], schema: shape.icon },\n developer: { paths: [[0, 14]], schema: shape.developer },\n currency: { paths: [[0, 8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[0, 8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[0, 8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[0, 13, 1]], schema: shape.summary },\n scoreText: { paths: [[0, 4, 0]], schema: shape.scoreText },\n score: { paths: [[0, 4, 1]], schema: shape.score },\n} satisfies SpecMap;\n\nexport const numericItemSpecs = {\n title: { paths: [[3]], schema: shape.title },\n appId: { paths: [[0, 0]], schema: shape.appId },\n url: { paths: [[10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[1, 3, 2]], schema: shape.icon },\n developer: { paths: [[14]], schema: shape.developer },\n currency: { paths: [[8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[13, 1]], schema: shape.summary },\n scoreText: { paths: [[4, 0]], schema: shape.scoreText },\n score: { paths: [[4, 1]], schema: shape.score },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport { clusterItemSpecs } from '../../core/clusterItem.js';\nimport { fetchClusterApps } from '../../core/pagination.js';\nimport { resolveFullDetail, type GetApp } from '../../core/fullDetail.js';\nimport { parseScriptData } from '../../core/scriptData.js';\nimport { extract, type Extracted } from '../../core/spec.js';\nimport { app } from '../app/app.js';\nimport type { App } from '../app/schema.js';\nimport { developerAppSchema, type DeveloperApp } from './schema.js';\nimport {\n CLUSTER_MAPPINGS,\n developerUrl,\n isNumericDevId,\n NAME_INITIAL_MAPPINGS,\n nameItemSpecs,\n NUMERIC_INITIAL_MAPPINGS,\n numericItemSpecs,\n} from './specs.js';\n\nexport const developerOptionsSchema = baseOptionsSchema.extend({\n devId: z.string().min(1),\n num: z.number().int().min(1).default(60),\n fullDetail: z.boolean().default(false),\n});\n\nexport type DeveloperOptions = z.input<typeof developerOptionsSchema>;\n\nconst DEVELOPER_CONTEXT = 'developer';\n\ntype DeveloperItem = Extracted<typeof numericItemSpecs>;\n\nfunction extractInitial(\n blocks: Record<string, unknown>,\n numeric: boolean,\n): { apps: DeveloperItem[]; token: string | undefined } {\n const mappings = numeric ? NUMERIC_INITIAL_MAPPINGS : NAME_INITIAL_MAPPINGS;\n const itemSpecs = numeric ? numericItemSpecs : nameItemSpecs;\n const appsData = getPath(blocks, mappings.apps);\n const apps = Array.isArray(appsData)\n ? appsData.map((item) => extract(item, itemSpecs, DEVELOPER_CONTEXT))\n : [];\n const token = getPath(blocks, mappings.token);\n return { apps, token: typeof token === 'string' ? token : undefined };\n}\n\nexport function createDeveloper(getApp: GetApp<App>) {\n return async function developer(options: DeveloperOptions): Promise<DeveloperApp[] | App[]> {\n const parsed = parseOptions(developerOptionsSchema, options, DEVELOPER_CONTEXT);\n const numeric = isNumericDevId(parsed.devId);\n\n const client = clientFromOptions(parsed);\n const html = await client.request({\n url: developerUrl(parsed.devId, parsed.lang, parsed.country),\n });\n const data = parseScriptData(html);\n const initial = extractInitial(data.blocks, numeric);\n\n const items = await fetchClusterApps({\n client,\n lang: parsed.lang,\n country: parsed.country,\n num: parsed.num,\n initialApps: initial.apps,\n initialToken: initial.token,\n itemSpecs: clusterItemSpecs,\n appsPath: CLUSTER_MAPPINGS.apps,\n tokenPath: CLUSTER_MAPPINGS.token,\n context: DEVELOPER_CONTEXT,\n });\n\n const sliced = items.slice(0, parsed.num);\n\n if (parsed.fullDetail) {\n return resolveFullDetail(sliced, parsed, getApp);\n }\n\n return z.array(developerAppSchema).parse(sliced);\n };\n}\n\nexport const developer = createDeveloper(app);\n","import { appItemSchema, type AppItem } from '../../core/appItem.js';\n\nexport const similarAppSchema = appItemSchema;\n\nexport type SimilarApp = AppItem;\n","import { BASE_URL } from '../../constants.js';\nimport { getPath, type Path } from '../../core/path.js';\nimport { resolveDsKey, type ScriptData } from '../../core/scriptData.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { similarAppSchema } from './schema.js';\n\nconst MICROS_PER_UNIT = 1_000_000;\nconst shape = similarAppSchema.shape;\n\nexport const CLUSTERS_RPC_ID = 'ag2B9c';\nexport const SIMILAR_MAX_APPS = 100;\n\nconst CLUSTERS_PATH: Path = [1, 1];\n\nexport const CLUSTER_MAPPING = {\n title: [21, 1, 0],\n url: [21, 1, 2, 4, 2],\n} satisfies Record<string, Path>;\n\nconst SIMILAR_APPS = 'Similar apps';\nconst SIMILAR_GAMES = 'Similar games';\n\nexport const CLUSTER_PAGE_MAPPINGS = {\n apps: ['ds:3', 0, 1, 0, 21, 0],\n token: ['ds:3', 0, 1, 0, 21, 1, 3, 1],\n} satisfies Record<string, Path>;\n\nexport const PAGINATION_MAPPINGS = {\n apps: [0, 0, 0],\n token: [0, 0, 7, 1],\n} satisfies Record<string, Path>;\n\nexport function similarDetailsUrl(appId: string, country: string): string {\n const params = new URLSearchParams({ id: appId, hl: 'en', gl: country });\n return `${BASE_URL}/store/apps/details?${params.toString()}`;\n}\n\nexport function similarClusterUrl(clusterPath: string, lang: string, country: string): string {\n return `${BASE_URL}${clusterPath}&gl=${country}&hl=${lang}`;\n}\n\nexport function findSimilarClusterPath(data: ScriptData): string | undefined {\n const dsKey = resolveDsKey(data, CLUSTERS_RPC_ID);\n if (dsKey === undefined) {\n return undefined;\n }\n const clusters = getPath(data.blocks, [dsKey, ...CLUSTERS_PATH]);\n if (!Array.isArray(clusters)) {\n return undefined;\n }\n for (const cluster of clusters) {\n const title = getPath(cluster, CLUSTER_MAPPING.title);\n if (title === SIMILAR_APPS || title === SIMILAR_GAMES) {\n const clusterPath = getPath(cluster, CLUSTER_MAPPING.url);\n if (typeof clusterPath === 'string') {\n return clusterPath;\n }\n }\n }\n return undefined;\n}\n\nfunction resolveUrl(value: unknown): string | undefined {\n return typeof value === 'string' ? new URL(value, BASE_URL).toString() : undefined;\n}\n\nfunction microsToUnits(value: unknown): number {\n return typeof value === 'number' ? value / MICROS_PER_UNIT || 0 : 0;\n}\n\nfunction isFree(value: unknown): boolean {\n return value === 0;\n}\n\nexport const similarItemSpecs = {\n title: { paths: [[3]], schema: shape.title },\n appId: { paths: [[0, 0]], schema: shape.appId },\n url: { paths: [[10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[1, 3, 2]], schema: shape.icon },\n developer: { paths: [[14]], schema: shape.developer },\n currency: { paths: [[8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[13, 1]], schema: shape.summary },\n scoreText: { paths: [[4, 0]], schema: shape.scoreText },\n score: { paths: [[4, 1]], schema: shape.score },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport { clusterItemSpecs } from '../../core/clusterItem.js';\nimport { fetchClusterApps } from '../../core/pagination.js';\nimport { resolveFullDetail, type GetApp } from '../../core/fullDetail.js';\nimport { parseScriptData } from '../../core/scriptData.js';\nimport { extract, type Extracted } from '../../core/spec.js';\nimport { app } from '../app/app.js';\nimport type { App } from '../app/schema.js';\nimport { similarAppSchema, type SimilarApp } from './schema.js';\nimport {\n CLUSTER_PAGE_MAPPINGS,\n findSimilarClusterPath,\n PAGINATION_MAPPINGS,\n SIMILAR_MAX_APPS,\n similarClusterUrl,\n similarDetailsUrl,\n similarItemSpecs,\n} from './specs.js';\n\nexport const similarOptionsSchema = baseOptionsSchema.extend({\n appId: z.string().min(1),\n fullDetail: z.boolean().default(false),\n});\n\nexport type SimilarOptions = z.input<typeof similarOptionsSchema>;\n\nconst SIMILAR_CONTEXT = 'similar';\n\ntype SimilarItem = Extracted<typeof similarItemSpecs>;\n\nfunction extractClusterPage(blocks: Record<string, unknown>): {\n apps: SimilarItem[];\n token: string | undefined;\n} {\n const appsData = getPath(blocks, CLUSTER_PAGE_MAPPINGS.apps);\n const apps = Array.isArray(appsData)\n ? appsData.map((item) => extract(item, similarItemSpecs, SIMILAR_CONTEXT))\n : [];\n const token = getPath(blocks, CLUSTER_PAGE_MAPPINGS.token);\n return { apps, token: typeof token === 'string' ? token : undefined };\n}\n\nexport function createSimilar(getApp: GetApp<App>) {\n return async function similar(options: SimilarOptions): Promise<SimilarApp[] | App[]> {\n const parsed = parseOptions(similarOptionsSchema, options, SIMILAR_CONTEXT);\n\n const client = clientFromOptions(parsed);\n const detailsHtml = await client.request({\n url: similarDetailsUrl(parsed.appId, parsed.country),\n });\n const details = parseScriptData(detailsHtml);\n\n const clusterPath = findSimilarClusterPath(details);\n if (clusterPath === undefined) {\n return z.array(similarAppSchema).parse([]);\n }\n\n const clusterHtml = await client.request({\n url: similarClusterUrl(clusterPath, parsed.lang, parsed.country),\n });\n const clusterData = parseScriptData(clusterHtml);\n const page = extractClusterPage(clusterData.blocks);\n\n const items = await fetchClusterApps({\n client,\n lang: parsed.lang,\n country: parsed.country,\n num: SIMILAR_MAX_APPS,\n initialApps: page.apps,\n initialToken: page.token,\n itemSpecs: clusterItemSpecs,\n appsPath: PAGINATION_MAPPINGS.apps,\n tokenPath: PAGINATION_MAPPINGS.token,\n context: SIMILAR_CONTEXT,\n });\n\n if (parsed.fullDetail) {\n return resolveFullDetail(items, parsed, getApp);\n }\n\n return z.array(similarAppSchema).parse(items);\n };\n}\n\nexport const similar = createSimilar(app);\n","import { z } from 'zod';\n\nexport const reviewCriteriaSchema = z.object({\n criteria: z.string(),\n rating: z.number().nullable(),\n});\n\nexport const reviewSchema = z.object({\n id: z.string(),\n userName: z.string(),\n userImage: z.url().optional(),\n date: z.iso.datetime(),\n score: z.number().min(1).max(5),\n title: z.string().nullable().optional(),\n text: z.string().optional(),\n replyDate: z.iso.datetime().optional(),\n replyText: z.string().optional(),\n version: z.string().optional(),\n thumbsUp: z.number().optional(),\n criterias: z.array(reviewCriteriaSchema).default([]),\n});\n\nexport type Review = z.infer<typeof reviewSchema>;\n\nexport const reviewsResultSchema = z.object({\n data: z.array(reviewSchema),\n nextPaginationToken: z.string().nullable(),\n});\n\nexport type ReviewsResult = z.infer<typeof reviewsResultSchema>;\n","import { BASE_URL } from '../../constants.js';\nimport type { Path } from '../../core/path.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { reviewSchema } from './schema.js';\n\nexport const REVIEWS_RPC_ID = 'UsvDTd';\nexport const REVIEWS_PER_REQUEST = 150;\n\nconst REVIEWS_STATIC_QUERY =\n 'rpcids=qnKhOb&f.sid=-697906427155521722&bl=boq_playuiserver_20190903.08_p0';\nconst REVIEWS_TRAILING_QUERY = 'authuser&soc-app=121&soc-platform=1&soc-device=1&_reqid=1065213';\n\nexport function reviewsUrl(lang: string, country: string): string {\n return `${BASE_URL}/_/PlayStoreUi/data/batchexecute?${REVIEWS_STATIC_QUERY}&hl=${lang}&gl=${country}&${REVIEWS_TRAILING_QUERY}`;\n}\n\nexport function buildInitialReviewsBody(sort: number, appId: string): string {\n return `f.req=%5B%5B%5B%22UsvDTd%22%2C%22%5Bnull%2Cnull%2C%5B2%2C${sort.toString()}%2C%5B${REVIEWS_PER_REQUEST.toString()}%2Cnull%2Cnull%5D%2Cnull%2C%5B%5D%5D%2C%5B%5C%22${appId}%5C%22%2C7%5D%5D%22%2Cnull%2C%22generic%22%5D%5D%5D`;\n}\n\nexport function buildPaginatedReviewsBody(sort: number, appId: string, withToken: string): string {\n return `f.req=%5B%5B%5B%22UsvDTd%22%2C%22%5Bnull%2Cnull%2C%5B2%2C${sort.toString()}%2C%5B${REVIEWS_PER_REQUEST.toString()}%2Cnull%2C%5C%22${withToken}%5C%22%5D%2Cnull%2C%5B%5D%5D%2C%5B%5C%22${appId}%5C%22%2C7%5D%5D%22%2Cnull%2C%22generic%22%5D%5D%5D`;\n}\n\nexport const REVIEWS_RESPONSE_PATHS = {\n reviews: [0],\n token: [1, 1],\n} satisfies Record<string, Path>;\n\nconst shape = reviewSchema.shape;\n\ninterface RawCriteria {\n criteria: unknown;\n rating: unknown;\n}\n\nfunction generateDate(value: unknown): string | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const seconds = Number(value[0]);\n const nanos = Number(value[1]);\n const nanoText = (Number.isFinite(nanos) && nanos !== 0 ? nanos.toString() : '000').substring(\n 0,\n 3,\n );\n const milliseconds = Number(`${seconds.toString()}${nanoText}`);\n const date = new Date(milliseconds);\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString();\n}\n\nfunction alwaysNull(): null {\n return null;\n}\n\nfunction emptyToUndefined(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction buildCriteria(entry: unknown): RawCriteria {\n if (!Array.isArray(entry)) {\n return { criteria: undefined, rating: null };\n }\n const fields: readonly unknown[] = entry;\n const ratingHolder = fields[1];\n const ratingFields: readonly unknown[] = Array.isArray(ratingHolder) ? ratingHolder : [];\n const rating = ratingFields.length > 0 ? ratingFields[0] : null;\n return { criteria: fields[0], rating };\n}\n\nfunction mapCriterias(value: unknown): RawCriteria[] {\n return Array.isArray(value) ? value.map(buildCriteria) : [];\n}\n\nexport const reviewItemSpecs = {\n id: { paths: [[0]], schema: shape.id },\n userName: { paths: [[1, 0]], schema: shape.userName },\n userImage: { paths: [[1, 1, 3, 2]], schema: shape.userImage },\n date: { paths: [[5]], schema: shape.date, transform: generateDate },\n score: { paths: [[2]], schema: shape.score },\n title: { paths: [[0]], schema: shape.title, transform: alwaysNull },\n text: { paths: [[4]], schema: shape.text },\n replyDate: { paths: [[7, 2]], schema: shape.replyDate, transform: generateDate },\n replyText: { paths: [[7, 1]], schema: shape.replyText, transform: emptyToUndefined },\n version: { paths: [[10]], schema: shape.version, transform: emptyToUndefined },\n thumbsUp: { paths: [[6]], schema: shape.thumbsUp },\n criterias: { paths: [[12, 0]], schema: shape.criterias, transform: mapCriterias },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport { sort } from '../../constants.js';\nimport { parseBatchResponse } from '../../core/batchexecute.js';\nimport { clientFromOptions, type HttpClient } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport { extract, type Extracted } from '../../core/spec.js';\nimport { reviewsResultSchema, type ReviewsResult } from './schema.js';\nimport {\n buildInitialReviewsBody,\n buildPaginatedReviewsBody,\n REVIEWS_RESPONSE_PATHS,\n REVIEWS_RPC_ID,\n reviewItemSpecs,\n reviewsUrl,\n} from './specs.js';\n\nconst REVIEWS_CONTEXT = 'reviews';\n\nconst sortSchema = z\n .union([z.literal(sort.NEWEST), z.literal(sort.RATING), z.literal(sort.HELPFULNESS)])\n .default(sort.NEWEST);\n\nexport const reviewsOptionsSchema = baseOptionsSchema.extend({\n appId: z.string().min(1),\n sort: sortSchema,\n num: z.number().int().min(1).default(150),\n paginate: z.boolean().default(false),\n nextPaginationToken: z.string().optional(),\n});\n\nexport type ReviewsOptions = z.input<typeof reviewsOptionsSchema>;\n\ntype ParsedReviewsOptions = z.infer<typeof reviewsOptionsSchema>;\ntype ReviewItem = Extracted<typeof reviewItemSpecs>;\n\ninterface ReviewsPage {\n reviews: ReviewItem[];\n token: string | undefined;\n}\n\nfunction reviewsBody(options: ParsedReviewsOptions, token: string | undefined): string {\n return token === undefined\n ? buildInitialReviewsBody(options.sort, options.appId)\n : buildPaginatedReviewsBody(options.sort, options.appId, token);\n}\n\nasync function fetchReviewsPage(\n client: HttpClient,\n options: ParsedReviewsOptions,\n token: string | undefined,\n): Promise<ReviewsPage> {\n const text = await client.request({\n url: reviewsUrl(options.lang, options.country),\n method: 'POST',\n body: reviewsBody(options, token),\n });\n\n const payload = parseBatchResponse(text, REVIEWS_RPC_ID);\n const rawReviews = getPath(payload, REVIEWS_RESPONSE_PATHS.reviews);\n const reviews = Array.isArray(rawReviews)\n ? rawReviews.map((item) => extract(item, reviewItemSpecs, REVIEWS_CONTEXT))\n : [];\n\n const rawToken = getPath(payload, REVIEWS_RESPONSE_PATHS.token);\n const nextToken = typeof rawToken === 'string' && rawToken.length > 0 ? rawToken : undefined;\n\n return { reviews, token: nextToken };\n}\n\nasync function fetchSinglePage(\n client: HttpClient,\n options: ParsedReviewsOptions,\n): Promise<ReviewsResult> {\n const page = await fetchReviewsPage(client, options, options.nextPaginationToken);\n return reviewsResultSchema.parse({\n data: page.reviews,\n nextPaginationToken: page.token ?? null,\n });\n}\n\nasync function accumulateReviews(\n client: HttpClient,\n options: ParsedReviewsOptions,\n): Promise<ReviewsResult> {\n const collected: ReviewItem[] = [];\n const seenTokens = new Set<string>();\n let token = options.nextPaginationToken;\n\n while (collected.length < options.num) {\n const page = await fetchReviewsPage(client, options, token);\n for (const review of page.reviews) {\n collected.push(review);\n }\n\n if (page.token === undefined || seenTokens.has(page.token)) {\n break;\n }\n seenTokens.add(page.token);\n token = page.token;\n }\n\n return reviewsResultSchema.parse({\n data: collected.slice(0, options.num),\n nextPaginationToken: null,\n });\n}\n\nexport async function reviews(options: ReviewsOptions): Promise<ReviewsResult> {\n const parsed = parseOptions(reviewsOptionsSchema, options, REVIEWS_CONTEXT);\n const client = clientFromOptions(parsed);\n\n return parsed.paginate ? fetchSinglePage(client, parsed) : accumulateReviews(client, parsed);\n}\n","import { z } from 'zod';\nimport { permission } from '../../constants.js';\n\nexport const permissionTypeSchema = z.union([\n z.literal(permission.COMMON),\n z.literal(permission.OTHER),\n]);\n\nexport const permissionSchema = z.object({\n permission: z.string(),\n type: permissionTypeSchema,\n});\n\nexport type AppPermission = z.infer<typeof permissionSchema>;\n","import { BASE_URL, permission } from '../../constants.js';\nimport { buildBatchBody } from '../../core/batchexecute.js';\nimport { getPath, type Path } from '../../core/path.js';\nimport type { AppPermission } from './schema.js';\n\nexport const PERMISSIONS_RPC_ID = 'xdSrCf';\n\nconst PERMISSIONS_STATIC_QUERY =\n 'rpcids=qnKhOb&f.sid=-697906427155521722&bl=boq_playuiserver_20190903.08_p0';\nconst PERMISSIONS_TRAILING_QUERY =\n 'authuser&soc-app=121&soc-platform=1&soc-device=1&_reqid=1065213';\n\nexport function permissionsUrl(lang: string, country: string): string {\n return `${BASE_URL}/_/PlayStoreUi/data/batchexecute?${PERMISSIONS_STATIC_QUERY}&hl=${lang}&gl=${country}&${PERMISSIONS_TRAILING_QUERY}`;\n}\n\nexport function buildPermissionsBody(appId: string): string {\n return buildBatchBody(PERMISSIONS_RPC_ID, [[null, [appId, 7], []]], [null, '1']);\n}\n\nconst PERMISSION_SECTIONS = [permission.COMMON, permission.OTHER] as const;\nconst GROUP_PERMISSIONS_PATH: Path = [2];\nconst PERMISSION_TEXT_PATH: Path = [1];\n\nfunction sectionEntries(section: unknown, type: AppPermission['type']): AppPermission[] {\n if (!Array.isArray(section)) {\n return [];\n }\n const entries: AppPermission[] = [];\n for (const group of section) {\n const groupPermissions = getPath(group, GROUP_PERMISSIONS_PATH);\n if (!Array.isArray(groupPermissions)) {\n continue;\n }\n for (const groupPermission of groupPermissions) {\n const text = getPath(groupPermission, PERMISSION_TEXT_PATH);\n if (typeof text === 'string' && text.length > 0) {\n entries.push({ permission: text, type });\n }\n }\n }\n return entries;\n}\n\nexport function mapPermissions(payload: unknown): AppPermission[] {\n if (!Array.isArray(payload)) {\n return [];\n }\n return PERMISSION_SECTIONS.flatMap((type) => sectionEntries(payload[type], type));\n}\n","import { z } from 'zod';\nimport { permission } from '../../constants.js';\nimport { parseBatchResponse } from '../../core/batchexecute.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { permissionSchema, type AppPermission } from './schema.js';\nimport {\n buildPermissionsBody,\n mapPermissions,\n PERMISSIONS_RPC_ID,\n permissionsUrl,\n} from './specs.js';\n\nconst PERMISSIONS_CONTEXT = 'permissions';\n\nexport const permissionsOptionsSchema = baseOptionsSchema.extend({\n appId: z.string().min(1),\n short: z.boolean().default(false),\n});\n\nexport type PermissionsOptions = z.input<typeof permissionsOptionsSchema>;\n\nconst permissionsResultSchema = z.array(permissionSchema);\n\nexport async function permissions(\n options: PermissionsOptions,\n): Promise<AppPermission[] | string[]> {\n const parsed = parseOptions(permissionsOptionsSchema, options, PERMISSIONS_CONTEXT);\n const client = clientFromOptions(parsed);\n\n const text = await client.request({\n url: permissionsUrl(parsed.lang, parsed.country),\n method: 'POST',\n body: buildPermissionsBody(parsed.appId),\n });\n\n const payload = parseBatchResponse(text, PERMISSIONS_RPC_ID);\n const entries = permissionsResultSchema.parse(mapPermissions(payload));\n\n if (!parsed.short) {\n return entries;\n }\n return entries\n .filter((entry) => entry.type === permission.COMMON)\n .map((entry) => entry.permission);\n}\n","import { z } from 'zod';\n\nexport const dataEntrySchema = z.object({\n data: z.string(),\n optional: z.boolean(),\n purpose: z.string().optional(),\n type: z.string(),\n});\n\nexport const securityPracticeSchema = z.object({\n practice: z.string(),\n description: z.string().optional(),\n});\n\nexport const dataSafetySchema = z.object({\n sharedData: z.array(dataEntrySchema).default([]),\n collectedData: z.array(dataEntrySchema).default([]),\n securityPractices: z.array(securityPracticeSchema).default([]),\n privacyPolicyUrl: z.url().optional(),\n});\n\nexport type DataEntry = z.infer<typeof dataEntrySchema>;\nexport type SecurityPractice = z.infer<typeof securityPracticeSchema>;\nexport type DataSafety = z.infer<typeof dataSafetySchema>;\n","import { z } from 'zod';\nimport { getPath, type Path } from '../../core/path.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { dataEntrySchema, securityPracticeSchema } from './schema.js';\n\nconst SHARED_DATA_PATH: Path = ['ds:3', 1, 2, 1, '138', 4, 0, 0];\nconst COLLECTED_DATA_PATH: Path = ['ds:3', 1, 2, 1, '138', 4, 1, 0];\nconst SECURITY_PRACTICES_PATH: Path = ['ds:3', 1, 2, 1, '138', 9, 2];\nconst PRIVACY_POLICY_PATH: Path = ['ds:3', 1, 2, 1, '100', 0, 5, 2];\n\nconst ENTRY_TYPE_PATH: Path = [0, 1];\nconst ENTRY_DETAILS_PATH: Path = [4];\nconst DETAIL_DATA_PATH: Path = [0];\nconst DETAIL_OPTIONAL_PATH: Path = [1];\nconst DETAIL_PURPOSE_PATH: Path = [2];\nconst PRACTICE_LABEL_PATH: Path = [1];\nconst PRACTICE_DESCRIPTION_PATH: Path = [2, 1];\n\nfunction mapDataEntries(value: unknown): unknown {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry) => {\n const type = getPath(entry, ENTRY_TYPE_PATH);\n const details = getPath(entry, ENTRY_DETAILS_PATH);\n if (!Array.isArray(details)) {\n return [];\n }\n return details.map((detail) => ({\n data: getPath(detail, DETAIL_DATA_PATH),\n optional: Boolean(getPath(detail, DETAIL_OPTIONAL_PATH)),\n purpose: getPath(detail, DETAIL_PURPOSE_PATH),\n type,\n }));\n });\n}\n\nfunction mapSecurityPractices(value: unknown): unknown {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.map((practice) => ({\n practice: getPath(practice, PRACTICE_LABEL_PATH),\n description: getPath(practice, PRACTICE_DESCRIPTION_PATH),\n }));\n}\n\nexport const dataSafetySpecs = {\n sharedData: {\n paths: [SHARED_DATA_PATH],\n schema: z.array(dataEntrySchema).default([]),\n transform: mapDataEntries,\n },\n collectedData: {\n paths: [COLLECTED_DATA_PATH],\n schema: z.array(dataEntrySchema).default([]),\n transform: mapDataEntries,\n },\n securityPractices: {\n paths: [SECURITY_PRACTICES_PATH],\n schema: z.array(securityPracticeSchema).default([]),\n transform: mapSecurityPractices,\n },\n privacyPolicyUrl: {\n paths: [PRIVACY_POLICY_PATH],\n schema: z.url().optional(),\n },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport { BASE_URL } from '../../constants.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { parseScriptData } from '../../core/scriptData.js';\nimport { extract } from '../../core/spec.js';\nimport { dataSafetySchema, type DataSafety } from './schema.js';\nimport { dataSafetySpecs } from './specs.js';\n\nconst DATA_SAFETY_CONTEXT = 'datasafety';\n\nexport const dataSafetyOptionsSchema = baseOptionsSchema.extend({\n appId: z.string().min(1),\n});\n\nexport type DataSafetyOptions = z.input<typeof dataSafetyOptionsSchema>;\n\nconst DATA_SAFETY_URL = `${BASE_URL}/store/apps/datasafety`;\n\nexport async function datasafety(options: DataSafetyOptions): Promise<DataSafety> {\n const parsed = parseOptions(dataSafetyOptionsSchema, options, DATA_SAFETY_CONTEXT);\n\n const params = new URLSearchParams({ id: parsed.appId, hl: parsed.lang });\n const url = `${DATA_SAFETY_URL}?${params.toString()}`;\n\n const client = clientFromOptions(parsed);\n const html = await client.request({ url });\n const data = parseScriptData(html);\n const extracted = extract(data, dataSafetySpecs, DATA_SAFETY_CONTEXT);\n\n return dataSafetySchema.parse(extracted);\n}\n","import { LRUCache } from 'lru-cache';\nimport {\n BASE_URL,\n age,\n category,\n clusters,\n collection,\n permission,\n sort,\n} from '../../constants.js';\nimport type { GooglePlayClient } from '../../index.js';\nimport { app } from '../app/app.js';\nimport { categories, type CategoriesOptions } from '../categories/categories.js';\nimport { datasafety } from '../datasafety/datasafety.js';\nimport { createDeveloper } from '../developer/developer.js';\nimport { createList } from '../list/list.js';\nimport { permissions } from '../permissions/permissions.js';\nimport { reviews } from '../reviews/reviews.js';\nimport { createSearch } from '../search/search.js';\nimport { createSimilar } from '../similar/similar.js';\nimport { suggest } from '../suggest/suggest.js';\n\nexport interface MemoizedOptions {\n maxAgeMs?: number;\n max?: number;\n}\n\nconst DEFAULT_MAX_AGE_MS = 1000 * 60 * 5;\nconst DEFAULT_MAX = 1000;\n\ntype AsyncMethod<Args, Result> = (options: Args) => Promise<Result>;\n\ntype Memoizer = <Args, Result>(\n name: string,\n fn: AsyncMethod<Args, Result>,\n) => AsyncMethod<Args, Result>;\n\nfunction createMemoizer(maxAgeMs: number, max: number): Memoizer {\n const lifecycle = new LRUCache<string, () => void>({\n max,\n ttl: maxAgeMs,\n ttlAutopurge: true,\n perf: { now: () => Date.now() },\n dispose: (drop) => {\n drop();\n },\n });\n\n return <Args, Result>(name: string, fn: AsyncMethod<Args, Result>): AsyncMethod<Args, Result> => {\n const store = new Map<string, Promise<Result>>();\n\n return (options: Args): Promise<Result> => {\n const key = `${name}:${JSON.stringify(options)}`;\n\n if (lifecycle.has(key)) {\n const cached = store.get(key);\n if (cached !== undefined) {\n return cached;\n }\n }\n\n const pending = fn(options);\n store.set(key, pending);\n lifecycle.set(key, () => {\n store.delete(key);\n });\n pending.catch(() => {\n store.delete(key);\n lifecycle.delete(key);\n });\n\n return pending;\n };\n };\n}\n\nexport function memoized(options?: MemoizedOptions): GooglePlayClient {\n const maxAgeMs = options?.maxAgeMs ?? DEFAULT_MAX_AGE_MS;\n const max = options?.max ?? DEFAULT_MAX;\n const memoize = createMemoizer(maxAgeMs, max);\n\n const memoApp = memoize('app', app);\n const memoCategories = memoize('categories', (input: CategoriesOptions | undefined) =>\n categories(input),\n );\n\n return {\n BASE_URL,\n age,\n category,\n clusters,\n collection,\n permission,\n sort,\n app: memoApp,\n search: memoize('search', createSearch(memoApp)),\n suggest: memoize('suggest', suggest),\n list: memoize('list', createList(memoApp)),\n categories: (input?: CategoriesOptions) => memoCategories(input),\n developer: memoize('developer', createDeveloper(memoApp)),\n similar: memoize('similar', createSimilar(memoApp)),\n reviews: memoize('reviews', reviews),\n permissions: memoize('permissions', permissions),\n datasafety: memoize('datasafety', datasafety),\n };\n}\n","export { BASE_URL, age, category, clusters, collection, permission, sort } from './constants.js';\nexport type { Age, Category, Cluster, Collection, Permission, Sort } from './constants.js';\n\nexport {\n BlockedError,\n GooglePlayError,\n HttpError,\n NotFoundError,\n ParseError,\n RateLimitError,\n SpecError,\n ValidationError,\n} from './core/errors.js';\nexport type { SpecFailure } from './core/errors.js';\n\nexport { app } from './features/app/app.js';\nexport type { AppOptions } from './features/app/app.js';\nexport type { App } from './features/app/schema.js';\n\nexport { search } from './features/search/search.js';\nexport type { SearchOptions } from './features/search/search.js';\nexport type { SearchResult } from './features/search/schema.js';\n\nexport { suggest } from './features/suggest/suggest.js';\nexport type { SuggestOptions } from './features/suggest/suggest.js';\n\nexport { list } from './features/list/list.js';\nexport type { ListOptions } from './features/list/list.js';\nexport type { ListItem } from './features/list/schema.js';\n\nexport { categories } from './features/categories/categories.js';\nexport type { CategoriesOptions } from './features/categories/categories.js';\n\nexport { developer } from './features/developer/developer.js';\nexport type { DeveloperOptions } from './features/developer/developer.js';\nexport type { DeveloperApp } from './features/developer/schema.js';\n\nexport { similar } from './features/similar/similar.js';\nexport type { SimilarOptions } from './features/similar/similar.js';\nexport type { SimilarApp } from './features/similar/schema.js';\n\nexport { reviews } from './features/reviews/reviews.js';\nexport type { ReviewsOptions } from './features/reviews/reviews.js';\nexport type { Review, ReviewsResult } from './features/reviews/schema.js';\n\nexport { permissions } from './features/permissions/permissions.js';\nexport type { PermissionsOptions } from './features/permissions/permissions.js';\nexport type { AppPermission } from './features/permissions/schema.js';\n\nexport { datasafety } from './features/datasafety/datasafety.js';\nexport type { DataSafetyOptions } from './features/datasafety/datasafety.js';\nexport type { DataEntry, DataSafety, SecurityPractice } from './features/datasafety/schema.js';\n\nexport { memoized } from './features/memoized/memoized.js';\nexport type { MemoizedOptions } from './features/memoized/memoized.js';\n\nimport { BASE_URL, age, category, clusters, collection, permission, sort } from './constants.js';\nimport { app } from './features/app/app.js';\nimport { search } from './features/search/search.js';\nimport { suggest } from './features/suggest/suggest.js';\nimport { list } from './features/list/list.js';\nimport { categories } from './features/categories/categories.js';\nimport { developer } from './features/developer/developer.js';\nimport { similar } from './features/similar/similar.js';\nimport { reviews } from './features/reviews/reviews.js';\nimport { permissions } from './features/permissions/permissions.js';\nimport { datasafety } from './features/datasafety/datasafety.js';\nimport { memoized } from './features/memoized/memoized.js';\n\nexport interface GooglePlayClient {\n BASE_URL: typeof BASE_URL;\n age: typeof age;\n category: typeof category;\n clusters: typeof clusters;\n collection: typeof collection;\n permission: typeof permission;\n sort: typeof sort;\n app: typeof app;\n search: typeof search;\n suggest: typeof suggest;\n list: typeof list;\n categories: typeof categories;\n developer: typeof developer;\n similar: typeof similar;\n reviews: typeof reviews;\n permissions: typeof permissions;\n datasafety: typeof datasafety;\n}\n\nconst gplay: GooglePlayClient & { memoized: typeof memoized } = {\n BASE_URL,\n age,\n category,\n clusters,\n collection,\n permission,\n sort,\n app,\n search,\n suggest,\n list,\n categories,\n developer,\n similar,\n reviews,\n permissions,\n datasafety,\n memoized,\n};\n\nexport default gplay;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["MICROS_PER_UNIT","microsToUnits","shape","microsToUnits","MICROS_PER_UNIT","shape","resolveUrl","microsToUnits","isFree","CLUSTER_MAPPINGS","CLUSTER_MAPPINGS","STATIC_QUERY_PARAMS","MICROS_PER_UNIT","shape","resolveUrl","microsToUnits","isFree","collectionConstants","categoryConstants","ageConstants","shape","resolveUrl","MICROS_PER_UNIT","shape","resolveUrl","microsToUnits","isFree","shape"],"sources":["../src/constants.ts","../src/core/errors.ts","../src/core/http.ts","../src/core/options.ts","../src/core/scriptData.ts","../src/core/path.ts","../src/core/spec.ts","../src/features/app/schema.ts","../src/core/text.ts","../src/features/app/transforms.ts","../src/features/app/specs.ts","../src/features/app/app.ts","../src/core/batchexecute.ts","../src/core/pagination.ts","../src/core/fullDetail.ts","../src/core/appItem.ts","../src/features/search/schema.ts","../src/features/search/specs.ts","../src/features/search/search.ts","../src/features/suggest/specs.ts","../src/features/suggest/suggest.ts","../src/features/list/schema.ts","../src/features/list/specs.ts","../src/features/list/list.ts","../src/features/categories/categories.ts","../src/core/clusterItem.ts","../src/features/developer/schema.ts","../src/features/developer/specs.ts","../src/features/developer/developer.ts","../src/features/similar/schema.ts","../src/features/similar/specs.ts","../src/features/similar/similar.ts","../src/features/reviews/schema.ts","../src/features/reviews/specs.ts","../src/features/reviews/reviews.ts","../src/features/permissions/schema.ts","../src/features/permissions/specs.ts","../src/features/permissions/permissions.ts","../src/features/datasafety/schema.ts","../src/features/datasafety/specs.ts","../src/features/datasafety/datasafety.ts","../src/features/memoized/memoized.ts","../src/index.ts"],"sourcesContent":["export const BASE_URL = 'https://play.google.com';\n\nexport const clusters = {\n new: 'new',\n top: 'top',\n} as const;\n\nexport type Cluster = (typeof clusters)[keyof typeof clusters];\n\nexport const category = {\n APPLICATION: 'APPLICATION',\n ANDROID_WEAR: 'ANDROID_WEAR',\n ART_AND_DESIGN: 'ART_AND_DESIGN',\n AUTO_AND_VEHICLES: 'AUTO_AND_VEHICLES',\n BEAUTY: 'BEAUTY',\n BOOKS_AND_REFERENCE: 'BOOKS_AND_REFERENCE',\n BUSINESS: 'BUSINESS',\n COMICS: 'COMICS',\n COMMUNICATION: 'COMMUNICATION',\n DATING: 'DATING',\n EDUCATION: 'EDUCATION',\n ENTERTAINMENT: 'ENTERTAINMENT',\n EVENTS: 'EVENTS',\n FINANCE: 'FINANCE',\n FOOD_AND_DRINK: 'FOOD_AND_DRINK',\n HEALTH_AND_FITNESS: 'HEALTH_AND_FITNESS',\n HOUSE_AND_HOME: 'HOUSE_AND_HOME',\n LIBRARIES_AND_DEMO: 'LIBRARIES_AND_DEMO',\n LIFESTYLE: 'LIFESTYLE',\n MAPS_AND_NAVIGATION: 'MAPS_AND_NAVIGATION',\n MEDICAL: 'MEDICAL',\n MUSIC_AND_AUDIO: 'MUSIC_AND_AUDIO',\n NEWS_AND_MAGAZINES: 'NEWS_AND_MAGAZINES',\n PARENTING: 'PARENTING',\n PERSONALIZATION: 'PERSONALIZATION',\n PHOTOGRAPHY: 'PHOTOGRAPHY',\n PRODUCTIVITY: 'PRODUCTIVITY',\n SHOPPING: 'SHOPPING',\n SOCIAL: 'SOCIAL',\n SPORTS: 'SPORTS',\n TOOLS: 'TOOLS',\n TRAVEL_AND_LOCAL: 'TRAVEL_AND_LOCAL',\n VIDEO_PLAYERS: 'VIDEO_PLAYERS',\n WATCH_FACE: 'WATCH_FACE',\n WEATHER: 'WEATHER',\n GAME: 'GAME',\n GAME_ACTION: 'GAME_ACTION',\n GAME_ADVENTURE: 'GAME_ADVENTURE',\n GAME_ARCADE: 'GAME_ARCADE',\n GAME_BOARD: 'GAME_BOARD',\n GAME_CARD: 'GAME_CARD',\n GAME_CASINO: 'GAME_CASINO',\n GAME_CASUAL: 'GAME_CASUAL',\n GAME_EDUCATIONAL: 'GAME_EDUCATIONAL',\n GAME_MUSIC: 'GAME_MUSIC',\n GAME_PUZZLE: 'GAME_PUZZLE',\n GAME_RACING: 'GAME_RACING',\n GAME_ROLE_PLAYING: 'GAME_ROLE_PLAYING',\n GAME_SIMULATION: 'GAME_SIMULATION',\n GAME_SPORTS: 'GAME_SPORTS',\n GAME_STRATEGY: 'GAME_STRATEGY',\n GAME_TRIVIA: 'GAME_TRIVIA',\n GAME_WORD: 'GAME_WORD',\n FAMILY: 'FAMILY',\n FAMILY_ACTION: 'FAMILY_ACTION',\n FAMILY_BRAINGAMES: 'FAMILY_BRAINGAMES',\n FAMILY_CREATE: 'FAMILY_CREATE',\n FAMILY_EDUCATION: 'FAMILY_EDUCATION',\n FAMILY_MUSICVIDEO: 'FAMILY_MUSICVIDEO',\n FAMILY_PRETEND: 'FAMILY_PRETEND',\n} as const;\n\nexport type Category = (typeof category)[keyof typeof category];\n\nexport const collection = {\n TOP_FREE: 'TOP_FREE',\n TOP_PAID: 'TOP_PAID',\n GROSSING: 'GROSSING',\n} as const;\n\nexport type Collection = (typeof collection)[keyof typeof collection];\n\nexport const sort = {\n NEWEST: 2,\n RATING: 3,\n HELPFULNESS: 1,\n} as const;\n\nexport type Sort = (typeof sort)[keyof typeof sort];\n\nexport const age = {\n FIVE_UNDER: 'AGE_RANGE1',\n SIX_EIGHT: 'AGE_RANGE2',\n NINE_UP: 'AGE_RANGE3',\n} as const;\n\nexport type Age = (typeof age)[keyof typeof age];\n\nexport const permission = {\n COMMON: 0,\n OTHER: 1,\n} as const;\n\nexport type Permission = (typeof permission)[keyof typeof permission];\n\nObject.freeze(clusters);\nObject.freeze(category);\nObject.freeze(collection);\nObject.freeze(sort);\nObject.freeze(age);\nObject.freeze(permission);\n","import type { ZodError } from 'zod';\n\nexport class GooglePlayError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'GooglePlayError';\n }\n}\n\nexport class ValidationError extends GooglePlayError {\n constructor(message: string) {\n super(message);\n this.name = 'ValidationError';\n }\n\n static fromZod(error: ZodError, context: string): ValidationError {\n const details = error.issues\n .map((issue) => {\n const path = issue.path.join('.');\n return path ? `${path}: ${issue.message}` : issue.message;\n })\n .join('; ');\n return new ValidationError(`${context}: ${details}`);\n }\n}\n\nexport class HttpError extends GooglePlayError {\n readonly status: number;\n readonly url: string;\n\n constructor(message: string, status: number, url: string) {\n super(message);\n this.name = 'HttpError';\n this.status = status;\n this.url = url;\n }\n}\n\nexport class NotFoundError extends HttpError {\n constructor(message: string, status: number, url: string) {\n super(message, status, url);\n this.name = 'NotFoundError';\n }\n}\n\nexport class RateLimitError extends HttpError {\n constructor(message: string, status: number, url: string) {\n super(message, status, url);\n this.name = 'RateLimitError';\n }\n}\n\nexport class BlockedError extends GooglePlayError {\n constructor(message: string) {\n super(message);\n this.name = 'BlockedError';\n }\n}\n\nexport class ParseError extends GooglePlayError {\n constructor(message: string) {\n super(message);\n this.name = 'ParseError';\n }\n}\n\nexport interface SpecFailure {\n field: string;\n paths: readonly (readonly (string | number)[])[];\n message: string;\n}\n\nexport class SpecError extends ParseError {\n readonly context: string;\n readonly failures: SpecFailure[];\n\n constructor(context: string, failures: SpecFailure[]) {\n super(SpecError.buildMessage(context, failures));\n this.name = 'SpecError';\n this.context = context;\n this.failures = failures;\n }\n\n private static buildMessage(context: string, failures: SpecFailure[]): string {\n const lines = failures.map((failure) => {\n const paths = failure.paths.map((path) => `[${path.join(', ')}]`).join(' | ');\n return ` ${failure.field} (${paths}): ${failure.message}`;\n });\n return [`${context} failed to parse ${failures.length.toString()} field(s):`, ...lines].join(\n '\\n',\n );\n }\n}\n","import type { RequestOptions } from './options.js';\nimport {\n BlockedError,\n GooglePlayError,\n HttpError,\n NotFoundError,\n RateLimitError,\n} from './errors.js';\n\nexport interface HttpRequest {\n url: string;\n method?: 'GET' | 'POST';\n body?: string;\n headers?: Record<string, string>;\n}\n\nexport interface HttpClientConfig {\n fetchImpl?: typeof fetch;\n throttle?: number;\n retries?: number;\n timeoutMs?: number;\n headers?: Record<string, string>;\n}\n\nexport interface HttpClient {\n request(req: HttpRequest): Promise<string>;\n}\n\nconst DEFAULT_RETRIES = 2;\nconst DEFAULT_TIMEOUT_MS = 30000;\nconst BASE_BACKOFF_MS = 500;\nconst THROTTLE_WINDOW_MS = 1000;\n\nconst USER_AGENT =\n 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36';\n\nconst ANY_MIME = '*';\n\nconst DEFAULT_HEADERS: Record<string, string> = {\n 'User-Agent': USER_AGENT,\n Accept: `text/html,${ANY_MIME}/${ANY_MIME}`,\n 'Accept-Language': 'en-US,en;q=0.9',\n};\n\nconst FORM_CONTENT_TYPE = 'application/x-www-form-urlencoded;charset=UTF-8';\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise((resolve) => setTimeout(resolve, Math.max(0, ms)));\n\nfunction createRateLimiter(rate: number): () => Promise<void> {\n let timestamps: number[] = [];\n let tail: Promise<void> = Promise.resolve();\n\n const reserve = async (): Promise<void> => {\n const now = Date.now();\n const windowStart = now - THROTTLE_WINDOW_MS;\n timestamps = timestamps.filter((timestamp) => timestamp > windowStart);\n if (timestamps.length >= rate) {\n const oldest = timestamps[0] ?? now;\n await sleep(oldest + THROTTLE_WINDOW_MS - now);\n return reserve();\n }\n timestamps.push(Date.now());\n };\n\n return () => {\n const result = tail.then(reserve);\n tail = result.catch(() => undefined);\n return result;\n };\n}\n\nfunction buildHeaders(\n method: 'GET' | 'POST',\n configHeaders: Record<string, string> | undefined,\n requestHeaders: Record<string, string> | undefined,\n): Record<string, string> {\n const headers: Record<string, string> = { ...DEFAULT_HEADERS };\n if (method === 'POST') {\n headers['Content-Type'] = FORM_CONTENT_TYPE;\n }\n Object.assign(headers, configHeaders ?? {}, requestHeaders ?? {});\n return headers;\n}\n\nfunction isRetryableStatus(status: number): boolean {\n return status === 429 || status >= 500;\n}\n\nfunction parseRetryAfter(response: Response): number | undefined {\n const header = response.headers.get('retry-after');\n if (header === null) {\n return undefined;\n }\n const seconds = Number(header);\n return Number.isFinite(seconds) && seconds >= 0 ? seconds : undefined;\n}\n\nfunction computeBackoff(attempt: number, retryAfterSeconds: number | undefined): number {\n if (retryAfterSeconds !== undefined) {\n return retryAfterSeconds * 1000;\n }\n const ceiling = BASE_BACKOFF_MS * 2 ** attempt;\n return Math.random() * ceiling;\n}\n\nfunction mapStatusToError(status: number, url: string): GooglePlayError {\n if (status === 404) {\n return new NotFoundError('App not found (404)', status, url);\n }\n if (status === 429) {\n return new RateLimitError('Rate limited by Google Play (429)', status, url);\n }\n return new HttpError(`Request to ${url} failed with status ${status.toString()}`, status, url);\n}\n\nfunction hostIsConsent(finalUrl: string): boolean {\n if (!finalUrl) {\n return false;\n }\n try {\n return new URL(finalUrl).host === 'consent.google.com';\n } catch {\n return false;\n }\n}\n\nfunction assertNotBlocked(response: Response, body: string): void {\n if (\n hostIsConsent(response.url) ||\n body.includes('www.google.com/recaptcha') ||\n body.includes('unusual traffic')\n ) {\n throw new BlockedError('Blocked by Google Play (consent wall or captcha)');\n }\n}\n\nexport function createHttpClient(config: HttpClientConfig = {}): HttpClient {\n const fetchImpl = config.fetchImpl ?? fetch;\n const retries = config.retries ?? DEFAULT_RETRIES;\n const timeoutMs = config.timeoutMs ?? DEFAULT_TIMEOUT_MS;\n const limiter = config.throttle !== undefined ? createRateLimiter(config.throttle) : undefined;\n\n const request = async (req: HttpRequest): Promise<string> => {\n const method = req.method ?? 'GET';\n const headers = buildHeaders(method, config.headers, req.headers);\n\n for (let attempt = 0; ; attempt += 1) {\n if (limiter) {\n await limiter();\n }\n try {\n const response = await fetchImpl(req.url, {\n method,\n headers,\n body: req.body,\n signal: AbortSignal.timeout(timeoutMs),\n });\n\n if (response.ok) {\n const body = await response.text();\n assertNotBlocked(response, body);\n return body;\n }\n\n if (isRetryableStatus(response.status) && attempt < retries) {\n await sleep(computeBackoff(attempt, parseRetryAfter(response)));\n continue;\n }\n\n throw mapStatusToError(response.status, req.url);\n } catch (error) {\n if (error instanceof GooglePlayError) {\n throw error;\n }\n if (attempt < retries) {\n await sleep(computeBackoff(attempt, undefined));\n continue;\n }\n const httpError = new HttpError(`Network request to ${req.url} failed`, 0, req.url);\n httpError.cause = error;\n throw httpError;\n }\n }\n };\n\n return { request };\n}\n\nexport function clientFromOptions(opts: {\n throttle?: number;\n requestOptions?: RequestOptions;\n}): HttpClient {\n return createHttpClient({\n throttle: opts.throttle,\n fetchImpl: opts.requestOptions?.fetchImpl,\n retries: opts.requestOptions?.retries,\n timeoutMs: opts.requestOptions?.timeoutMs,\n headers: opts.requestOptions?.headers,\n });\n}\n","import { z } from 'zod';\nimport { ValidationError } from './errors.js';\n\nexport const requestOptionsSchema = z.object({\n headers: z.record(z.string(), z.string()).optional(),\n fetchImpl: z.custom<typeof fetch>((value) => typeof value === 'function').optional(),\n timeoutMs: z.number().int().positive().max(120000).optional(),\n retries: z.number().int().min(0).max(5).optional(),\n});\n\nexport type RequestOptions = z.infer<typeof requestOptionsSchema>;\n\nexport const baseOptionsSchema = z.object({\n lang: z.string().min(2).max(7).default('en'),\n country: z.string().length(2).default('us'),\n throttle: z.number().positive().max(50).optional(),\n requestOptions: requestOptionsSchema.optional(),\n});\n\nexport type BaseOptions = z.infer<typeof baseOptionsSchema>;\n\nexport function parseOptions<Schema extends z.ZodType>(\n schema: Schema,\n input: unknown,\n context: string,\n): z.infer<Schema> {\n const result = schema.safeParse(input);\n if (!result.success) {\n throw ValidationError.fromZod(result.error, context);\n }\n return result.data;\n}\n","export interface ScriptData {\n blocks: Record<string, unknown>;\n serviceRequests: Record<string, string>;\n}\n\nconst SCRIPT_BLOCK_REGEX = />AF_initDataCallback[\\s\\S]*?<\\/script/g;\nconst BLOCK_KEY_REGEX = /(ds:.*?)'/;\nconst BLOCK_PAYLOAD_REGEX = /data:([\\s\\S]*?), sideChannel: {}}\\);<\\//;\nconst SERVICE_TABLE_REGEX = /; var AF_dataServiceRequests[\\s\\S]*?; var AF_initDataChunkQueue/;\nconst SERVICE_PAIR_REGEX = /'(ds:\\d+)'\\s*:\\s*\\{\\s*id:\\s*'([^']+)'/g;\n\nfunction parseBlocks(html: string): Record<string, unknown> {\n const blocks: Record<string, unknown> = {};\n const matches = html.match(SCRIPT_BLOCK_REGEX);\n if (matches === null) {\n return blocks;\n }\n for (const block of matches) {\n const keyMatch = BLOCK_KEY_REGEX.exec(block);\n const payloadMatch = BLOCK_PAYLOAD_REGEX.exec(block);\n const key = keyMatch?.[1];\n const payload = payloadMatch?.[1];\n if (key === undefined || payload === undefined) {\n continue;\n }\n try {\n blocks[key] = JSON.parse(payload);\n } catch {\n continue;\n }\n }\n return blocks;\n}\n\nfunction parseServiceRequests(html: string): Record<string, string> {\n const requests: Record<string, string> = {};\n const tableMatch = SERVICE_TABLE_REGEX.exec(html);\n const table = tableMatch?.[0];\n if (table === undefined) {\n return requests;\n }\n for (const pair of table.matchAll(SERVICE_PAIR_REGEX)) {\n const dsKey = pair[1];\n const rpcId = pair[2];\n if (dsKey !== undefined && rpcId !== undefined) {\n requests[dsKey] = rpcId;\n }\n }\n return requests;\n}\n\nexport function parseScriptData(html: string): ScriptData {\n return {\n blocks: parseBlocks(html),\n serviceRequests: parseServiceRequests(html),\n };\n}\n\nexport function resolveDsKey(data: ScriptData, rpcId: string): string | undefined {\n for (const [dsKey, id] of Object.entries(data.serviceRequests)) {\n if (id === rpcId) {\n return dsKey;\n }\n }\n return undefined;\n}\n","export type PathSegment = number | string;\nexport type Path = readonly PathSegment[];\n\nfunction isIndexable(value: unknown): value is readonly unknown[] {\n return Array.isArray(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null && !Array.isArray(value);\n}\n\nfunction step(value: unknown, segment: PathSegment): unknown {\n if (typeof segment === 'number') {\n if (!isIndexable(value)) {\n return undefined;\n }\n const index = segment < 0 ? value.length + segment : segment;\n return value[index];\n }\n if (isRecord(value)) {\n return value[segment];\n }\n return undefined;\n}\n\nexport function getPath(value: unknown, path: Path): unknown {\n let current = value;\n for (const segment of path) {\n if (current === undefined || current === null) {\n return undefined;\n }\n current = step(current, segment);\n }\n return current;\n}\n","import { z } from 'zod';\nimport type { Path } from './path.js';\nimport { getPath } from './path.js';\nimport type { ScriptData } from './scriptData.js';\nimport { resolveDsKey } from './scriptData.js';\nimport type { SpecFailure } from './errors.js';\nimport { SpecError } from './errors.js';\n\nexport interface FieldSpec<T = unknown> {\n paths: readonly Path[];\n schema: z.ZodType<T>;\n serviceRequestId?: string;\n transform?: (value: unknown, source: unknown) => unknown;\n}\n\nexport type SpecMap = Record<string, FieldSpec>;\nexport type Extracted<M extends SpecMap> = { [K in keyof M]: z.infer<M[K]['schema']> };\n\nfunction isScriptData(source: unknown): source is ScriptData {\n return (\n typeof source === 'object' &&\n source !== null &&\n 'blocks' in source &&\n 'serviceRequests' in source\n );\n}\n\nfunction candidatePaths(spec: FieldSpec, source: unknown): readonly Path[] {\n if (spec.serviceRequestId !== undefined && isScriptData(source)) {\n const dsKey = resolveDsKey(source, spec.serviceRequestId);\n if (dsKey !== undefined) {\n return spec.paths.map((path) => [dsKey, ...path]);\n }\n }\n return spec.paths;\n}\n\nfunction resolveValue(root: unknown, paths: readonly Path[]): unknown {\n for (const path of paths) {\n const value = getPath(root, path);\n if (value !== undefined && value !== null) {\n return value;\n }\n }\n return undefined;\n}\n\nfunction failureMessage(error: unknown): string {\n if (error instanceof z.ZodError) {\n return error.issues\n .map((issue) => {\n const path = issue.path.join('.');\n return path ? `${path}: ${issue.message}` : issue.message;\n })\n .join('; ');\n }\n if (error instanceof Error) {\n return error.message;\n }\n if (typeof error === 'string') {\n return error;\n }\n return 'non-error thrown during extraction';\n}\n\nexport function extract<M extends SpecMap>(\n source: unknown,\n specs: M,\n context: string,\n): Extracted<M>;\nexport function extract(source: unknown, specs: SpecMap, context: string): Record<string, unknown> {\n const root = isScriptData(source) ? source.blocks : source;\n const result: Record<string, unknown> = {};\n const failures: SpecFailure[] = [];\n\n for (const [field, spec] of Object.entries(specs)) {\n const paths = candidatePaths(spec, source);\n const raw = resolveValue(root, paths);\n try {\n const input = spec.transform ? spec.transform(raw, source) : raw;\n result[field] = spec.schema.parse(input);\n } catch (error) {\n failures.push({ field, paths, message: failureMessage(error) });\n }\n }\n\n if (failures.length > 0) {\n throw new SpecError(context, failures);\n }\n\n return result;\n}\n","import { z } from 'zod';\n\nexport const appCategorySchema = z.object({\n name: z.string(),\n id: z.string().nullable(),\n});\n\nexport type AppCategory = z.infer<typeof appCategorySchema>;\n\nconst histogramSchema = z.object({\n '1': z.number(),\n '2': z.number(),\n '3': z.number(),\n '4': z.number(),\n '5': z.number(),\n});\n\nexport const appSchema = z.object({\n title: z.string(),\n description: z.string(),\n descriptionHTML: z.string(),\n summary: z.string().optional(),\n installs: z.string().optional(),\n minInstalls: z.number().optional(),\n maxInstalls: z.number().optional(),\n score: z.number().min(0).max(5).optional(),\n scoreText: z.string().optional(),\n ratings: z.number().optional(),\n reviews: z.number().optional(),\n histogram: histogramSchema,\n price: z.number(),\n originalPrice: z.number().optional(),\n discountEndDate: z.number().optional(),\n free: z.boolean(),\n currency: z.string().optional(),\n priceText: z.string(),\n available: z.boolean(),\n offersIAP: z.boolean(),\n IAPRange: z.string().optional(),\n androidVersion: z.string(),\n androidVersionText: z.string(),\n androidMaxVersion: z.string(),\n developer: z.string(),\n developerId: z.string(),\n developerEmail: z.string().optional(),\n developerWebsite: z.string().optional(),\n developerAddress: z.string().optional(),\n developerLegalName: z.string().optional(),\n developerLegalEmail: z.string().optional(),\n developerLegalAddress: z.string().optional(),\n developerLegalPhoneNumber: z.string().optional(),\n privacyPolicy: z.string().optional(),\n developerInternalID: z.string(),\n genre: z.string(),\n genreId: z.string(),\n categories: z.array(appCategorySchema),\n icon: z.string(),\n headerImage: z.string().optional(),\n screenshots: z.array(z.string()),\n video: z.string().optional(),\n videoImage: z.string().optional(),\n previewVideo: z.string().optional(),\n contentRating: z.string().optional(),\n contentRatingDescription: z.string().optional(),\n adSupported: z.boolean(),\n released: z.string().optional(),\n updated: z.number(),\n version: z.string(),\n recentChanges: z.string().optional(),\n comments: z.array(z.string()),\n preregister: z.boolean(),\n earlyAccessEnabled: z.boolean(),\n isAvailableInPlayPass: z.boolean(),\n appId: z.string(),\n url: z.string(),\n});\n\nexport type App = z.infer<typeof appSchema>;\n","const TAB = 9;\nconst LINE_FEED = 10;\nconst CARRIAGE_RETURN = 13;\nconst UNIT_SEPARATOR = 31;\nconst DELETE = 127;\nconst C1_END = 159;\nconst SURROGATE_START = 0xd800;\nconst SURROGATE_END = 0xdfff;\n\nfunction isPreservedWhitespace(code: number): boolean {\n return code === TAB || code === LINE_FEED || code === CARRIAGE_RETURN;\n}\n\nfunction isControlCharacter(code: number): boolean {\n if (isPreservedWhitespace(code)) {\n return false;\n }\n return code <= UNIT_SEPARATOR || (code >= DELETE && code <= C1_END);\n}\n\nfunction isLoneSurrogate(code: number): boolean {\n return code >= SURROGATE_START && code <= SURROGATE_END;\n}\n\nexport function sanitizeText(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n let result = '';\n for (const character of value) {\n const code = character.codePointAt(0) ?? 0;\n if (isControlCharacter(code) || isLoneSurrogate(code)) {\n continue;\n }\n result += character;\n }\n return result;\n}\n","import * as cheerio from 'cheerio';\nimport { getPath } from '../../core/path.js';\nimport { sanitizeText } from '../../core/text.js';\nimport type { AppCategory } from './schema.js';\n\nconst COMMENT_ROOTS = ['ds:8', 'ds:9'] as const;\nconst MAX_COMMENTS = 5;\nconst MICROS_PER_UNIT = 1_000_000;\n\nexport function descriptionHtmlLocalized(value: unknown): string | undefined {\n const translated = getPath(value, [12, 0, 0, 1]);\n const original = getPath(value, [72, 0, 1]);\n const resolved = typeof translated === 'string' && translated.length > 0 ? translated : original;\n return sanitizeText(resolved);\n}\n\nexport function descriptionText(html: unknown): string | undefined {\n if (typeof html !== 'string') {\n return undefined;\n }\n const document = cheerio.load(`<div>${html.replace(/<br>/g, '\\r\\n')}</div>`);\n return sanitizeText(document('div').text());\n}\n\nexport function priceText(value: unknown): string {\n return typeof value === 'string' && value.length > 0 ? value : 'Free';\n}\n\nexport function normalizeAndroidVersion(value: unknown): string {\n if (typeof value !== 'string') {\n return 'VARY';\n }\n const token = value.split(' ')[0];\n if (token !== undefined && parseFloat(token)) {\n return token;\n }\n return 'VARY';\n}\n\nexport function buildHistogram(container: unknown): Record<number, number> {\n return {\n 1: histogramCount(container, 1),\n 2: histogramCount(container, 2),\n 3: histogramCount(container, 3),\n 4: histogramCount(container, 4),\n 5: histogramCount(container, 5),\n };\n}\n\nfunction histogramCount(container: unknown, star: number): number {\n const bucket = getPath(container, [star, 1]);\n return typeof bucket === 'number' ? bucket : 0;\n}\n\nexport function microsToUnits(value: unknown): number {\n if (typeof value !== 'number') {\n return 0;\n }\n return value / MICROS_PER_UNIT || 0;\n}\n\nexport function developerIdFromUrl(value: unknown): string | undefined {\n if (typeof value !== 'string') {\n return undefined;\n }\n return value.split('id=')[1];\n}\n\nexport function extractComments(source: unknown): string[] {\n for (const root of COMMENT_ROOTS) {\n const author = getPath(source, [root, 0, 0, 1, 0]);\n const version = getPath(source, [root, 0, 0, 10]);\n const date = getPath(source, [root, 0, 0, 5, 0]);\n if (author && version && date) {\n const comments = getPath(source, [root, 0]);\n if (Array.isArray(comments)) {\n return comments\n .map((comment) => getPath(comment, [4]))\n .filter((text): text is string => typeof text === 'string')\n .slice(0, MAX_COMMENTS);\n }\n }\n }\n return [];\n}\n\nexport function extractScreenshots(value: unknown): string[] {\n if (!Array.isArray(value)) {\n return [];\n }\n return value\n .map((shot) => getPath(shot, [3, 2]))\n .filter((url): url is string => typeof url === 'string');\n}\n\nexport function extractCategories(value: unknown, categories: AppCategory[] = []): AppCategory[] {\n if (!Array.isArray(value) || value.length === 0) {\n return categories;\n }\n if (value.length >= 4 && typeof value[0] === 'string') {\n categories.push({ name: value[0], id: nullableString(value[2]) });\n return categories;\n }\n for (const sub of value) {\n extractCategories(sub, categories);\n }\n return categories;\n}\n\nexport function categoriesFromDetail(value: unknown): AppCategory[] {\n const categories = extractCategories(getPath(value, [118]));\n if (categories.length > 0) {\n return categories;\n }\n const name = getPath(value, [79, 0, 0, 0]);\n if (typeof name === 'string') {\n return [{ name, id: nullableString(getPath(value, [79, 0, 0, 2])) }];\n }\n return categories;\n}\n\nfunction nullableString(value: unknown): string | null {\n return typeof value === 'string' ? value : null;\n}\n","import { getPath } from '../../core/path.js';\nimport { sanitizeText } from '../../core/text.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { appSchema } from './schema.js';\nimport {\n buildHistogram,\n categoriesFromDetail,\n descriptionHtmlLocalized,\n descriptionText,\n developerIdFromUrl,\n extractComments,\n extractScreenshots,\n microsToUnits,\n normalizeAndroidVersion,\n priceText,\n} from './transforms.js';\n\nconst shape = appSchema.shape;\n\nexport const appSpecs = {\n title: { paths: [['ds:5', 1, 2, 0, 0]], schema: shape.title },\n description: {\n paths: [['ds:5', 1, 2]],\n schema: shape.description,\n transform: (value) => descriptionText(descriptionHtmlLocalized(value)),\n },\n descriptionHTML: {\n paths: [['ds:5', 1, 2]],\n schema: shape.descriptionHTML,\n transform: descriptionHtmlLocalized,\n },\n summary: { paths: [['ds:5', 1, 2, 73, 0, 1]], schema: shape.summary },\n installs: { paths: [['ds:5', 1, 2, 13, 0]], schema: shape.installs },\n minInstalls: { paths: [['ds:5', 1, 2, 13, 1]], schema: shape.minInstalls },\n maxInstalls: { paths: [['ds:5', 1, 2, 13, 2]], schema: shape.maxInstalls },\n score: { paths: [['ds:5', 1, 2, 51, 0, 1]], schema: shape.score },\n scoreText: { paths: [['ds:5', 1, 2, 51, 0, 0]], schema: shape.scoreText },\n ratings: { paths: [['ds:5', 1, 2, 51, 2, 1]], schema: shape.ratings },\n reviews: { paths: [['ds:5', 1, 2, 51, 3, 1]], schema: shape.reviews },\n histogram: {\n paths: [['ds:5', 1, 2, 51, 1]],\n schema: shape.histogram,\n transform: buildHistogram,\n },\n price: {\n paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 1, 0, 0]],\n schema: shape.price,\n transform: microsToUnits,\n },\n originalPrice: {\n paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 1, 1, 0]],\n schema: shape.originalPrice,\n transform: (value) =>\n typeof value === 'number' && value !== 0 ? microsToUnits(value) : undefined,\n },\n discountEndDate: {\n paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 14, 1]],\n schema: shape.discountEndDate,\n },\n free: {\n paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 1, 0, 0]],\n schema: shape.free,\n transform: (value) => value === 0,\n },\n currency: { paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 1, 0, 1]], schema: shape.currency },\n priceText: {\n paths: [['ds:5', 1, 2, 57, 0, 0, 0, 0, 1, 0, 2]],\n schema: shape.priceText,\n transform: priceText,\n },\n available: {\n paths: [['ds:5', 1, 2, 18, 0]],\n schema: shape.available,\n transform: (value) => Boolean(value),\n },\n offersIAP: {\n paths: [['ds:5', 1, 2, 19, 0]],\n schema: shape.offersIAP,\n transform: (value) => Boolean(value),\n },\n IAPRange: { paths: [['ds:5', 1, 2, 19, 0]], schema: shape.IAPRange },\n androidVersion: {\n paths: [\n ['ds:5', 1, 2, 140, 1, 1, 0, 0, 1],\n ['ds:5', 1, 2, -1, '141', 1, 1, 0, 0, 1],\n ],\n schema: shape.androidVersion,\n transform: normalizeAndroidVersion,\n },\n androidVersionText: {\n paths: [\n ['ds:5', 1, 2, 140, 1, 1, 0, 0, 1],\n ['ds:5', 1, 2, -1, '141', 1, 1, 0, 0, 1],\n ],\n schema: shape.androidVersionText,\n transform: (value) =>\n typeof value === 'string' && value.length > 0 ? value : 'Varies with device',\n },\n androidMaxVersion: {\n paths: [\n ['ds:5', 1, 2, 140, 1, 1, 0, 1, 1],\n ['ds:5', 1, 2, -1, '141', 1, 1, 0, 1, 1],\n ],\n schema: shape.androidMaxVersion,\n transform: normalizeAndroidVersion,\n },\n developer: { paths: [['ds:5', 1, 2, 68, 0]], schema: shape.developer },\n developerId: {\n paths: [['ds:5', 1, 2, 68, 1, 4, 2]],\n schema: shape.developerId,\n transform: developerIdFromUrl,\n },\n developerEmail: { paths: [['ds:5', 1, 2, 69, 1, 0]], schema: shape.developerEmail },\n developerWebsite: { paths: [['ds:5', 1, 2, 69, 0, 5, 2]], schema: shape.developerWebsite },\n developerAddress: { paths: [['ds:5', 1, 2, 69, 2, 0]], schema: shape.developerAddress },\n developerLegalName: { paths: [['ds:5', 1, 2, 69, 4, 0]], schema: shape.developerLegalName },\n developerLegalEmail: { paths: [['ds:5', 1, 2, 69, 4, 1, 0]], schema: shape.developerLegalEmail },\n developerLegalAddress: {\n paths: [['ds:5', 1, 2, 69]],\n schema: shape.developerLegalAddress,\n transform: (value) => {\n const address = getPath(value, [4, 2, 0]);\n return typeof address === 'string' ? address.replace(/\\n/g, ', ') : undefined;\n },\n },\n developerLegalPhoneNumber: {\n paths: [['ds:5', 1, 2, 69, 4, 3]],\n schema: shape.developerLegalPhoneNumber,\n },\n privacyPolicy: { paths: [['ds:5', 1, 2, 99, 0, 5, 2]], schema: shape.privacyPolicy },\n developerInternalID: {\n paths: [['ds:5', 1, 2, 68, 1, 4, 2]],\n schema: shape.developerInternalID,\n transform: developerIdFromUrl,\n },\n genre: { paths: [['ds:5', 1, 2, 79, 0, 0, 0]], schema: shape.genre },\n genreId: { paths: [['ds:5', 1, 2, 79, 0, 0, 2]], schema: shape.genreId },\n categories: {\n paths: [['ds:5', 1, 2]],\n schema: shape.categories,\n transform: categoriesFromDetail,\n },\n icon: { paths: [['ds:5', 1, 2, 95, 0, 3, 2]], schema: shape.icon },\n headerImage: { paths: [['ds:5', 1, 2, 96, 0, 3, 2]], schema: shape.headerImage },\n screenshots: {\n paths: [['ds:5', 1, 2, 78, 0]],\n schema: shape.screenshots,\n transform: extractScreenshots,\n },\n video: { paths: [['ds:5', 1, 2, 100, 0, 0, 3, 2]], schema: shape.video },\n videoImage: { paths: [['ds:5', 1, 2, 100, 1, 0, 3, 2]], schema: shape.videoImage },\n previewVideo: { paths: [['ds:5', 1, 2, 100, 1, 2, 0, 2]], schema: shape.previewVideo },\n contentRating: { paths: [['ds:5', 1, 2, 9, 0]], schema: shape.contentRating },\n contentRatingDescription: {\n paths: [['ds:5', 1, 2, 9, 2, 1]],\n schema: shape.contentRatingDescription,\n },\n adSupported: {\n paths: [['ds:5', 1, 2, 48]],\n schema: shape.adSupported,\n transform: (value) => Boolean(value),\n },\n released: { paths: [['ds:5', 1, 2, 10, 0]], schema: shape.released },\n updated: {\n paths: [\n ['ds:5', 1, 2, 145, 0, 1, 0],\n ['ds:5', 1, 2, -1, '146', 0, 1, 0],\n ],\n schema: shape.updated,\n transform: (value) => (typeof value === 'number' ? value * 1000 : value),\n },\n version: {\n paths: [\n ['ds:5', 1, 2, 140, 0, 0, 0],\n ['ds:5', 1, 2, -1, '141', 0, 0, 0],\n ],\n schema: shape.version,\n transform: (value) => (typeof value === 'string' && value.length > 0 ? value : 'VARY'),\n },\n recentChanges: {\n paths: [\n ['ds:5', 1, 2, 144, 1, 1],\n ['ds:5', 1, 2, -1, '145', 1, 1],\n ],\n schema: shape.recentChanges,\n transform: sanitizeText,\n },\n comments: { paths: [[]], schema: shape.comments, transform: extractComments },\n preregister: {\n paths: [['ds:5', 1, 2, 18, 0]],\n schema: shape.preregister,\n transform: (value) => value === 1,\n },\n earlyAccessEnabled: {\n paths: [['ds:5', 1, 2, 18, 2]],\n schema: shape.earlyAccessEnabled,\n transform: (value) => typeof value === 'string',\n },\n isAvailableInPlayPass: {\n paths: [['ds:5', 1, 2, 62]],\n schema: shape.isAvailableInPlayPass,\n transform: (value) => Boolean(value),\n },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport { BASE_URL } from '../../constants.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { parseScriptData } from '../../core/scriptData.js';\nimport { extract } from '../../core/spec.js';\nimport { appSchema, type App } from './schema.js';\nimport { appSpecs } from './specs.js';\n\nexport const appOptionsSchema = baseOptionsSchema.extend({\n appId: z.string().min(1),\n});\n\nexport type AppOptions = z.input<typeof appOptionsSchema>;\n\nconst DETAILS_URL = `${BASE_URL}/store/apps/details`;\n\nexport async function app(options: AppOptions): Promise<App> {\n const parsed = parseOptions(appOptionsSchema, options, 'app');\n\n const params = new URLSearchParams({\n id: parsed.appId,\n hl: parsed.lang,\n gl: parsed.country,\n });\n const url = `${DETAILS_URL}?${params.toString()}`;\n\n const client = clientFromOptions(parsed);\n const html = await client.request({ url });\n const data = parseScriptData(html);\n const extracted = extract(data, appSpecs, 'app');\n\n return appSchema.parse({ ...extracted, appId: parsed.appId, url });\n}\n","import { BASE_URL } from '../constants.js';\nimport { ParseError } from './errors.js';\n\nexport const BATCH_URL = `${BASE_URL}/_/PlayStoreUi/data/batchexecute`;\n\nconst DEFAULT_ENVELOPE_TAIL: readonly unknown[] = [null, 'generic'];\nconst WRB_FRAME_MARKER = 'wrb.fr';\nconst SNIPPET_LENGTH = 200;\n\nfunction isArray(value: unknown): value is readonly unknown[] {\n return Array.isArray(value);\n}\n\nfunction snippet(text: string): string {\n return text.slice(0, SNIPPET_LENGTH);\n}\n\nexport function buildBatchBody(\n rpcId: string,\n payload: unknown,\n envelopeTail: readonly unknown[] = DEFAULT_ENVELOPE_TAIL,\n): string {\n const inner: unknown[] = [rpcId, JSON.stringify(payload), ...envelopeTail];\n const envelope = [[inner]];\n return new URLSearchParams({ 'f.req': JSON.stringify(envelope) }).toString();\n}\n\ninterface EnvelopeMatch {\n found: boolean;\n value: unknown;\n}\n\nfunction matchEnvelope(frames: readonly unknown[], rpcId: string): EnvelopeMatch {\n for (const frame of frames) {\n if (!isArray(frame)) {\n continue;\n }\n if (frame[0] === WRB_FRAME_MARKER && frame[1] === rpcId) {\n const raw = frame[2];\n if (typeof raw === 'string') {\n return { found: true, value: JSON.parse(raw) };\n }\n return { found: true, value: null };\n }\n }\n return { found: false, value: undefined };\n}\n\nfunction tryParseArray(text: string): readonly unknown[] | undefined {\n try {\n const parsed: unknown = JSON.parse(text);\n return isArray(parsed) ? parsed : undefined;\n } catch {\n return undefined;\n }\n}\n\nexport function parseBatchResponse(text: string, rpcId: string): unknown {\n const start = text.indexOf('[');\n if (start === -1) {\n throw new ParseError(`batchexecute response missing array start: ${snippet(text)}`);\n }\n const body = text.slice(start);\n\n for (const line of body.split('\\n')) {\n const trimmed = line.trim();\n if (!trimmed.startsWith('[')) {\n continue;\n }\n const frames = tryParseArray(trimmed);\n if (frames === undefined) {\n continue;\n }\n const match = matchEnvelope(frames, rpcId);\n if (match.found) {\n return match.value;\n }\n }\n\n const whole = tryParseArray(body);\n if (whole !== undefined) {\n const match = matchEnvelope(whole, rpcId);\n if (match.found) {\n return match.value;\n }\n }\n\n throw new ParseError(`batchexecute response has no envelope for rpc ${rpcId}: ${snippet(body)}`);\n}\n","import { BATCH_URL, parseBatchResponse } from './batchexecute.js';\nimport type { HttpClient } from './http.js';\nimport { getPath, type Path } from './path.js';\nimport { extract, type Extracted, type SpecMap } from './spec.js';\n\nexport const CLUSTER_RPC_ID = 'qnKhOb';\nexport const CLUSTER_PAGE_SIZE = 100;\n\nconst CLUSTER_STATIC_QUERY =\n 'rpcids=qnKhOb&f.sid=-697906427155521722&bl=boq_playuiserver_20190903.08_p0';\nconst CLUSTER_TRAILING_QUERY = 'authuser&soc-app=121&soc-platform=1&soc-device=1&_reqid=1065213';\n\nexport function clusterUrl(lang: string, country: string): string {\n return `${BATCH_URL}?${CLUSTER_STATIC_QUERY}&hl=${lang}&gl=${country}&${CLUSTER_TRAILING_QUERY}`;\n}\n\nexport function buildClusterBody(numberOfApps: number, withToken: string): string {\n return `f.req=%5B%5B%5B%22qnKhOb%22%2C%22%5B%5Bnull%2C%5B%5B10%2C%5B10%2C${numberOfApps.toString()}%5D%5D%2Ctrue%2Cnull%2C%5B96%2C27%2C4%2C8%2C57%2C30%2C110%2C79%2C11%2C16%2C49%2C1%2C3%2C9%2C12%2C104%2C55%2C56%2C51%2C10%2C34%2C77%5D%5D%2Cnull%2C%5C%22${withToken}%5C%22%5D%5D%22%2Cnull%2C%22generic%22%5D%5D%5D`;\n}\n\nfunction asToken(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nexport interface FetchClusterAppsParams<M extends SpecMap> {\n client: HttpClient;\n lang: string;\n country: string;\n num: number;\n initialApps: Extracted<M>[];\n initialToken: string | undefined;\n itemSpecs: M;\n appsPath: Path;\n tokenPath: Path;\n context: string;\n}\n\nexport async function fetchClusterApps<M extends SpecMap>(\n params: FetchClusterAppsParams<M>,\n): Promise<Extracted<M>[]> {\n const { client, lang, country, num, itemSpecs, appsPath, tokenPath, context } = params;\n const collected: Extracted<M>[] = [...params.initialApps];\n let token = asToken(params.initialToken);\n\n while (collected.length < num && token !== undefined) {\n const body = buildClusterBody(CLUSTER_PAGE_SIZE, token);\n const text = await client.request({ url: clusterUrl(lang, country), method: 'POST', body });\n const payload = parseBatchResponse(text, CLUSTER_RPC_ID);\n\n const apps = getPath(payload, appsPath);\n if (!Array.isArray(apps) || apps.length === 0) {\n break;\n }\n for (const item of apps) {\n collected.push(extract(item, itemSpecs, context));\n }\n token = asToken(getPath(payload, tokenPath));\n }\n\n return collected.slice(0, num);\n}\n","import type { RequestOptions } from './options.js';\n\nexport interface FullDetailOptions {\n lang: string;\n country: string;\n throttle?: number;\n requestOptions?: RequestOptions;\n}\n\nexport interface GetAppParams {\n appId: string;\n lang: string;\n country: string;\n throttle?: number;\n requestOptions?: RequestOptions;\n}\n\nexport type GetApp<Result> = (params: GetAppParams) => Promise<Result>;\n\nconst DEFAULT_CONCURRENCY = 3;\n\nexport async function resolveFullDetail<Result>(\n items: readonly { appId: string }[],\n options: FullDetailOptions,\n getApp: GetApp<Result>,\n concurrency = DEFAULT_CONCURRENCY,\n): Promise<Result[]> {\n const results: Result[] = new Array<Result>(items.length);\n let cursor = 0;\n\n const worker = async (): Promise<void> => {\n while (cursor < items.length) {\n const index = cursor;\n cursor += 1;\n const item = items[index];\n if (item === undefined) {\n continue;\n }\n results[index] = await getApp({\n appId: item.appId,\n lang: options.lang,\n country: options.country,\n throttle: options.throttle,\n requestOptions: options.requestOptions,\n });\n }\n };\n\n const workerCount = Math.min(concurrency, items.length);\n await Promise.all(Array.from({ length: workerCount }, () => worker()));\n\n return results;\n}\n","import { z } from 'zod';\n\nexport const appItemSchema = z.object({\n title: z.string(),\n appId: z.string(),\n url: z.string(),\n icon: z.string(),\n developer: z.string(),\n developerId: z.string().optional(),\n currency: z.string().optional(),\n price: z.number(),\n free: z.boolean(),\n summary: z.string().optional(),\n scoreText: z.string().optional(),\n score: z.number().min(0).max(5).optional(),\n});\n\nexport type AppItem = z.infer<typeof appItemSchema>;\n","import { appItemSchema, type AppItem } from '../../core/appItem.js';\n\nexport const searchResultSchema = appItemSchema;\n\nexport type SearchResult = AppItem;\n","import { BASE_URL } from '../../constants.js';\nimport type { Path } from '../../core/path.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { searchResultSchema } from './schema.js';\n\nconst MICROS_PER_UNIT = 1_000_000;\nconst shape = searchResultSchema.shape;\n\nexport type PriceFilter = 'all' | 'free' | 'paid';\n\nfunction resolveUrl(value: unknown): string | undefined {\n return typeof value === 'string' ? new URL(value, BASE_URL).toString() : undefined;\n}\n\nfunction microsToUnits(value: unknown): number {\n return typeof value === 'number' ? value / MICROS_PER_UNIT || 0 : 0;\n}\n\nfunction isFree(value: unknown): boolean {\n return value === 0;\n}\n\nfunction developerIdFromLink(value: unknown): string | undefined {\n return typeof value === 'string' ? value.split('?id=')[1] : undefined;\n}\n\nexport const INITIAL_MAPPINGS = {\n app: ['ds:4', 0, 1, 0, 23],\n sections: ['ds:4', 0, 1],\n} satisfies Record<string, Path>;\n\nexport const SECTIONS_MAPPING = {\n apps: [22, 0],\n token: [22, 1, 3, 1],\n} satisfies Record<string, Path>;\n\nexport const CLUSTER_MAPPINGS = {\n apps: [0, 0, 0],\n token: [0, 0, 7, 1],\n} satisfies Record<string, Path>;\n\nexport const searchItemSpecs = {\n title: { paths: [[0, 3]], schema: shape.title },\n appId: { paths: [[0, 0, 0]], schema: shape.appId },\n url: { paths: [[0, 10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[0, 1, 3, 2]], schema: shape.icon },\n developer: { paths: [[0, 14]], schema: shape.developer },\n currency: { paths: [[0, 8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[0, 8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[0, 8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[0, 13, 1]], schema: shape.summary },\n scoreText: { paths: [[0, 4, 0]], schema: shape.scoreText },\n score: { paths: [[0, 4, 1]], schema: shape.score },\n} satisfies SpecMap;\n\nexport const searchPageItemSpecs = {\n title: { paths: [[3]], schema: shape.title },\n appId: { paths: [[0, 0]], schema: shape.appId },\n url: { paths: [[10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[1, 3, 2]], schema: shape.icon },\n developer: { paths: [[14]], schema: shape.developer },\n currency: { paths: [[8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[13, 1]], schema: shape.summary },\n scoreText: { paths: [[4, 0]], schema: shape.scoreText },\n score: { paths: [[4, 1]], schema: shape.score },\n} satisfies SpecMap;\n\nexport const exactMatchSpecs = {\n title: { paths: [[16, 2, 0, 0]], schema: shape.title },\n appId: { paths: [[16, 3, '12', 0, 0]], schema: shape.appId },\n url: { paths: [[17, 0, 0, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[16, 2, 95, 0, 3, 2]], schema: shape.icon },\n developer: { paths: [[16, 2, 68, 0]], schema: shape.developer },\n developerId: {\n paths: [[16, 2, 68, 1, 4, 2]],\n schema: shape.developerId,\n transform: developerIdFromLink,\n },\n currency: { paths: [[17, 0, 2, 0, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[17, 0, 2, 0, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[17, 0, 2, 0, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[16, 2, 73, 0, 1]], schema: shape.summary },\n scoreText: { paths: [[16, 2, 51, 0, 0]], schema: shape.scoreText },\n score: { paths: [[16, 2, 51, 0, 1]], schema: shape.score },\n} satisfies SpecMap;\n\nexport function priceGoogleValue(value: PriceFilter): number {\n switch (value) {\n case 'free':\n return 1;\n case 'paid':\n return 2;\n default:\n return 0;\n }\n}\n\nexport function matchesPriceFilter(free: boolean, filter: PriceFilter): boolean {\n switch (filter) {\n case 'free':\n return free;\n case 'paid':\n return !free;\n default:\n return true;\n }\n}\n\nexport function filterByPrice<T extends { free: boolean }>(\n items: readonly T[],\n filter: PriceFilter,\n): T[] {\n if (filter === 'all') {\n return [...items];\n }\n return items.filter((item) => matchesPriceFilter(item.free, filter));\n}\n","import { z } from 'zod';\nimport { BASE_URL } from '../../constants.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport { fetchClusterApps } from '../../core/pagination.js';\nimport { resolveFullDetail, type GetApp } from '../../core/fullDetail.js';\nimport { parseScriptData, type ScriptData } from '../../core/scriptData.js';\nimport { extract, type Extracted } from '../../core/spec.js';\nimport { app } from '../app/app.js';\nimport type { App } from '../app/schema.js';\nimport { searchResultSchema, type SearchResult } from './schema.js';\nimport {\n CLUSTER_MAPPINGS,\n exactMatchSpecs,\n filterByPrice,\n INITIAL_MAPPINGS,\n priceGoogleValue,\n searchItemSpecs,\n searchPageItemSpecs,\n SECTIONS_MAPPING,\n} from './specs.js';\n\nexport const searchOptionsSchema = baseOptionsSchema.extend({\n term: z.string().min(1),\n num: z.number().int().min(1).max(250).default(20),\n price: z.enum(['all', 'free', 'paid']).default('all'),\n fullDetail: z.boolean().default(false),\n});\n\nexport type SearchOptions = z.input<typeof searchOptionsSchema>;\n\nconst SEARCH_URL = `${BASE_URL}/store/search`;\nconst SEARCH_CONTEXT = 'search';\n\ntype SearchItem = Extracted<typeof searchPageItemSpecs>;\n\ninterface FirstPage {\n apps: SearchItem[];\n token: string | undefined;\n}\n\nfunction prependExactMatch(data: ScriptData, apps: SearchItem[]): SearchItem[] {\n const exactMatchData = getPath(data.blocks, INITIAL_MAPPINGS.app);\n if (exactMatchData === undefined || exactMatchData === null) {\n return apps;\n }\n let exactMatch: SearchItem;\n try {\n exactMatch = extract(exactMatchData, exactMatchSpecs, SEARCH_CONTEXT);\n } catch {\n return apps;\n }\n if (apps.some((item) => item.appId === exactMatch.appId)) {\n return apps;\n }\n return [exactMatch, ...apps];\n}\n\nfunction firstPage(data: ScriptData): FirstPage {\n const sections = getPath(data.blocks, INITIAL_MAPPINGS.sections);\n if (!Array.isArray(sections)) {\n return { apps: [], token: undefined };\n }\n for (const section of sections) {\n const apps = getPath(section, SECTIONS_MAPPING.apps);\n if (Array.isArray(apps) && apps.length > 0) {\n const extracted = apps.map((item) => extract(item, searchItemSpecs, SEARCH_CONTEXT));\n const token = getPath(section, SECTIONS_MAPPING.token);\n return {\n apps: prependExactMatch(data, extracted),\n token: typeof token === 'string' ? token : undefined,\n };\n }\n }\n return { apps: [], token: undefined };\n}\n\nexport function createSearch(getApp: GetApp<App>) {\n return async function search(options: SearchOptions): Promise<SearchResult[] | App[]> {\n const parsed = parseOptions(searchOptionsSchema, options, SEARCH_CONTEXT);\n\n const params = new URLSearchParams({\n c: 'apps',\n q: parsed.term,\n hl: parsed.lang,\n gl: parsed.country,\n price: priceGoogleValue(parsed.price).toString(),\n });\n\n const client = clientFromOptions(parsed);\n const html = await client.request({ url: `${SEARCH_URL}?${params.toString()}` });\n const data = parseScriptData(html);\n const page = firstPage(data);\n\n const items = await fetchClusterApps({\n client,\n lang: parsed.lang,\n country: parsed.country,\n num: parsed.num,\n initialApps: page.apps,\n initialToken: page.token,\n itemSpecs: searchPageItemSpecs,\n appsPath: CLUSTER_MAPPINGS.apps,\n tokenPath: CLUSTER_MAPPINGS.token,\n context: SEARCH_CONTEXT,\n });\n\n const sliced = filterByPrice(items, parsed.price).slice(0, parsed.num);\n\n if (parsed.fullDetail) {\n return resolveFullDetail(sliced, parsed, getApp);\n }\n\n return z.array(searchResultSchema).parse(sliced);\n };\n}\n\nexport const search = createSearch(app);\n","import { BATCH_URL } from '../../core/batchexecute.js';\nimport type { Path } from '../../core/path.js';\n\nexport const SUGGEST_RPC_ID = 'IJ4APc';\n\nconst STATIC_QUERY_PARAMS = {\n rpcids: SUGGEST_RPC_ID,\n 'f.sid': '-697906427155521722',\n bl: 'boq_playuiserver_20190903.08_p0',\n 'soc-app': '121',\n 'soc-platform': '1',\n 'soc-device': '1',\n _reqid: '1065213',\n} as const;\n\nconst SUGGEST_LIMIT = 10;\nconst SUGGEST_DATASET = 2;\nconst SUGGEST_MODE = 4;\n\nexport function suggestUrl(lang: string, country: string): string {\n const params = new URLSearchParams({ ...STATIC_QUERY_PARAMS, hl: lang, gl: country });\n return `${BATCH_URL}?${params.toString()}`;\n}\n\nexport function buildSuggestPayload(term: string): unknown[] {\n return [[null, [term], [SUGGEST_LIMIT], [SUGGEST_DATASET], SUGGEST_MODE]];\n}\n\nexport const SUGGESTIONS_PATH: Path = [0, 0];\nexport const SUGGESTION_TEXT_PATH: Path = [0];\n","import { z } from 'zod';\nimport { buildBatchBody, parseBatchResponse } from '../../core/batchexecute.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport {\n buildSuggestPayload,\n SUGGEST_RPC_ID,\n SUGGESTION_TEXT_PATH,\n SUGGESTIONS_PATH,\n suggestUrl,\n} from './specs.js';\n\nexport const suggestOptionsSchema = baseOptionsSchema.extend({\n term: z.string().min(1),\n});\n\nexport type SuggestOptions = z.input<typeof suggestOptionsSchema>;\n\nconst SUGGEST_CONTEXT = 'suggest';\nconst MAX_SUGGESTIONS = 5;\n\nexport async function suggest(options: SuggestOptions): Promise<string[]> {\n const parsed = parseOptions(suggestOptionsSchema, options, SUGGEST_CONTEXT);\n\n const client = clientFromOptions(parsed);\n const body = buildBatchBody(SUGGEST_RPC_ID, buildSuggestPayload(parsed.term), []);\n const text = await client.request({\n url: suggestUrl(parsed.lang, parsed.country),\n method: 'POST',\n body,\n });\n\n const payload = parseBatchResponse(text, SUGGEST_RPC_ID);\n if (payload === null) {\n return [];\n }\n\n const entries = getPath(payload, SUGGESTIONS_PATH);\n if (!Array.isArray(entries)) {\n return [];\n }\n\n const suggestions = z\n .array(z.string())\n .parse(entries.map((entry) => getPath(entry, SUGGESTION_TEXT_PATH)));\n\n return suggestions.slice(0, MAX_SUGGESTIONS);\n}\n","import { appItemSchema, type AppItem } from '../../core/appItem.js';\n\nexport const listItemSchema = appItemSchema;\n\nexport type ListItem = AppItem;\n","import { BATCH_URL } from '../../core/batchexecute.js';\nimport { BASE_URL } from '../../constants.js';\nimport type { Category, Collection } from '../../constants.js';\nimport type { Path } from '../../core/path.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { appItemSchema } from '../../core/appItem.js';\n\nexport const LIST_RPC_ID = 'vyAe2';\n\nconst MICROS_PER_UNIT = 1_000_000;\nconst shape = appItemSchema.shape;\n\nconst STATIC_QUERY_PARAMS = {\n rpcids: LIST_RPC_ID,\n 'source-path': '/store/apps',\n 'f.sid': '-4178618388443751758',\n bl: 'boq_playuiserver_20220612.08_p0',\n authuser: '0',\n 'soc-app': '121',\n 'soc-platform': '1',\n 'soc-device': '1',\n _reqid: '82003',\n rt: 'c',\n} as const;\n\nexport const CLUSTER_NAMES: Record<Collection, string> = {\n TOP_FREE: 'topselling_free',\n TOP_PAID: 'topselling_paid',\n GROSSING: 'topgrossing',\n};\n\nexport function listUrl(lang: string, country: string, age?: string): string {\n const params = new URLSearchParams({ ...STATIC_QUERY_PARAMS, hl: lang, gl: country });\n if (age !== undefined) {\n params.set('age', age);\n }\n return `${BATCH_URL}?${params.toString()}`;\n}\n\ninterface ListBodyParams {\n num: string;\n collection: string;\n category: Category;\n}\n\nexport function buildListBody({ num, collection, category }: ListBodyParams): string {\n return `f.req=%5B%5B%5B%22vyAe2%22%2C%22%5B%5Bnull%2C%5B%5B8%2C%5B20%2C${num}%5D%5D%2Ctrue%2Cnull%2C%5B64%2C1%2C195%2C71%2C8%2C72%2C9%2C10%2C11%2C139%2C12%2C16%2C145%2C148%2C150%2C151%2C152%2C27%2C30%2C31%2C96%2C32%2C34%2C163%2C100%2C165%2C104%2C169%2C108%2C110%2C113%2C55%2C56%2C57%2C122%5D%2C%5Bnull%2Cnull%2C%5B%5B%5Btrue%5D%2Cnull%2C%5B%5Bnull%2C%5B%5D%5D%5D%2Cnull%2Cnull%2Cnull%2Cnull%2C%5Bnull%2C2%5D%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2C%5B1%5D%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2Cnull%2C%5B1%5D%5D%2C%5Bnull%2C%5B%5Bnull%2C%5B%5D%5D%5D%5D%2C%5Bnull%2C%5B%5Bnull%2C%5B%5D%5D%5D%2Cnull%2C%5Btrue%5D%5D%2C%5Bnull%2C%5B%5Bnull%2C%5B%5D%5D%5D%5D%2Cnull%2Cnull%2Cnull%2Cnull%2C%5B%5B%5Bnull%2C%5B%5D%5D%5D%5D%2C%5B%5B%5Bnull%2C%5B%5D%5D%5D%5D%5D%2C%5B%5B%5B%5B7%2C1%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C31%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C104%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C9%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C8%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C27%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C12%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C65%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C110%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C88%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C11%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C56%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C55%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C96%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C10%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C122%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C72%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C71%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C64%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C113%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C139%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C150%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C169%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C165%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C151%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C163%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C32%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C16%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C108%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B7%2C100%5D%2C%5B%5B1%2C73%2C96%2C103%2C97%2C58%2C50%2C92%2C52%2C112%2C69%2C19%2C31%2C101%2C123%2C74%2C49%2C80%2C38%2C20%2C10%2C14%2C79%2C43%2C42%2C139%5D%5D%5D%2C%5B%5B9%2C1%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C31%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C104%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C9%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C8%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C27%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C12%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C65%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C110%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C88%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C11%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C56%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C55%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C96%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C10%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C122%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C72%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C71%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C64%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C113%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C139%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C150%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C169%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C165%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C151%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C163%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C32%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C16%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C108%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B9%2C100%5D%2C%5B%5B1%2C7%2C9%2C24%2C12%2C31%2C5%2C15%2C27%2C8%2C13%2C10%5D%5D%5D%2C%5B%5B17%2C1%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C31%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C104%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C9%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C8%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C27%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C12%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C65%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C110%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C88%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C11%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C56%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C55%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C96%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C10%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C122%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C72%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C71%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C64%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C113%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C139%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C150%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C169%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C165%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C151%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C163%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C32%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C16%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C108%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B17%2C100%5D%2C%5B%5B1%2C7%2C9%2C25%2C13%2C31%2C5%2C41%2C27%2C8%2C14%2C10%5D%5D%5D%2C%5B%5B10%2C1%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C31%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C104%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C9%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C8%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C27%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C12%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C65%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C110%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C88%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C11%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C56%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C55%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C96%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C10%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C122%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C72%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C71%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C64%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C113%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C139%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C150%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C169%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C165%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C151%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C163%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C32%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C16%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C108%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B10%2C100%5D%2C%5B%5B1%2C7%2C6%2C9%5D%5D%5D%2C%5B%5B1%2C1%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C31%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C104%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C9%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C8%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C27%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C12%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C65%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C110%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C88%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C11%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C56%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C55%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C96%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C10%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C122%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C72%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C71%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C64%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C113%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C139%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C150%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C169%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C165%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C151%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C163%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C32%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C16%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C108%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B1%2C100%5D%2C%5B%5B1%2C5%2C14%2C38%2C19%2C29%2C34%2C4%2C12%2C11%2C6%2C30%2C43%2C40%2C42%2C16%2C10%2C7%5D%5D%5D%2C%5B%5B4%2C1%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C31%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C104%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C9%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C8%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C27%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C12%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C65%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C110%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C88%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C11%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C56%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C55%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C96%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C10%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C122%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C72%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C71%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C64%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C113%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C139%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C150%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C169%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C165%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C151%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C163%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C32%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C16%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C108%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B4%2C100%5D%2C%5B%5B1%2C3%2C5%2C4%2C7%2C6%2C11%2C19%2C21%2C17%2C15%2C12%2C16%2C20%5D%5D%5D%2C%5B%5B3%2C1%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C31%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C104%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C9%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C8%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C27%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C12%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C65%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C110%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C88%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C11%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C56%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C55%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C96%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C10%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C122%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C72%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C71%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C64%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C113%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C139%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C150%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C169%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C165%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C151%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C163%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C32%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C16%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C108%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B3%2C100%5D%2C%5B%5B1%2C5%2C14%2C4%2C10%2C17%5D%5D%5D%2C%5B%5B2%2C1%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C31%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C104%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C9%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C8%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C27%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C12%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C65%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C110%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C88%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C11%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C56%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C55%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C96%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C10%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C122%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C72%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C71%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C64%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C113%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C139%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C150%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C169%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C165%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C151%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C163%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C32%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C16%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C108%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%2C%5B%5B2%2C100%5D%2C%5B%5B1%2C5%2C7%2C4%2C13%2C16%2C12%2C18%5D%5D%5D%5D%5D%5D%2Cnull%2Cnull%2C%5B%5B%5B1%2C2%5D%2C%5B10%2C8%2C9%5D%2C%5B%5D%2C%5B%5D%5D%5D%5D%2C%5B2%2C%5C%22${collection}%5C%22%2C%5C%22${category}%5C%22%5D%5D%5D%22%2Cnull%2C%22generic%22%5D%5D%5D&at=AFSRYlx8XZfN8-O-IKASbNBDkB6T%3A1655531200971&`;\n}\n\nfunction resolveUrl(value: unknown): string | undefined {\n return typeof value === 'string' ? new URL(value, BASE_URL).toString() : undefined;\n}\n\nfunction microsToUnits(value: unknown): number {\n return typeof value === 'number' ? value / MICROS_PER_UNIT || 0 : 0;\n}\n\nfunction isFree(value: unknown): boolean {\n return value === 0;\n}\n\nexport const APPS_PATH: Path = [0, 1, 0, 28, 0];\n\nexport const listItemSpecs = {\n title: { paths: [[0, 3]], schema: shape.title },\n appId: { paths: [[0, 0, 0]], schema: shape.appId },\n url: { paths: [[0, 10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[0, 1, 3, 2]], schema: shape.icon },\n developer: { paths: [[0, 14]], schema: shape.developer },\n currency: { paths: [[0, 8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[0, 8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[0, 8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[0, 13, 1]], schema: shape.summary },\n scoreText: { paths: [[0, 4, 0]], schema: shape.scoreText },\n score: { paths: [[0, 4, 1]], schema: shape.score },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport {\n age as ageConstants,\n category as categoryConstants,\n collection as collectionConstants,\n} from '../../constants.js';\nimport { parseBatchResponse } from '../../core/batchexecute.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport { resolveFullDetail, type GetApp } from '../../core/fullDetail.js';\nimport { extract } from '../../core/spec.js';\nimport { app } from '../app/app.js';\nimport type { App } from '../app/schema.js';\nimport { listItemSchema, type ListItem } from './schema.js';\nimport {\n APPS_PATH,\n buildListBody,\n CLUSTER_NAMES,\n listItemSpecs,\n LIST_RPC_ID,\n listUrl,\n} from './specs.js';\n\nexport const listOptionsSchema = baseOptionsSchema.extend({\n collection: z.enum(collectionConstants).default('TOP_FREE'),\n category: z.enum(categoryConstants).default('APPLICATION'),\n age: z.enum(ageConstants).optional(),\n num: z.number().int().min(1).default(500),\n fullDetail: z.boolean().default(false),\n});\n\nexport type ListOptions = z.input<typeof listOptionsSchema>;\n\nconst LIST_CONTEXT = 'list';\n\nexport function createList(getApp: GetApp<App>) {\n return async function list(options: ListOptions): Promise<ListItem[] | App[]> {\n const parsed = parseOptions(listOptionsSchema, options, LIST_CONTEXT);\n\n const client = clientFromOptions(parsed);\n const body = buildListBody({\n num: parsed.num.toString(),\n collection: CLUSTER_NAMES[parsed.collection],\n category: parsed.category,\n });\n\n const text = await client.request({\n url: listUrl(parsed.lang, parsed.country, parsed.age),\n method: 'POST',\n body,\n });\n\n const payload = parseBatchResponse(text, LIST_RPC_ID);\n const appsData = getPath(payload, APPS_PATH);\n const items = Array.isArray(appsData)\n ? appsData.map((item) => extract(item, listItemSpecs, LIST_CONTEXT))\n : [];\n\n if (parsed.fullDetail) {\n return resolveFullDetail(items, parsed, getApp);\n }\n\n return z.array(listItemSchema).parse(items);\n };\n}\n\nexport const list = createList(app);\n","import { z } from 'zod';\nimport { category } from '../../constants.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\n\nexport const categoriesOptionsSchema = baseOptionsSchema.pick({\n throttle: true,\n requestOptions: true,\n});\n\nexport type CategoriesOptions = z.input<typeof categoriesOptionsSchema>;\n\nconst CATEGORIES_CONTEXT = 'categories';\nconst categoryListSchema = z.array(z.string()).min(1);\nconst CATEGORY_IDS: readonly string[] = Object.values(category);\n\nexport function categories(options?: CategoriesOptions): Promise<string[]> {\n return Promise.resolve().then(() => {\n parseOptions(categoriesOptionsSchema, options ?? {}, CATEGORIES_CONTEXT);\n return categoryListSchema.parse([...CATEGORY_IDS]);\n });\n}\n","import { BASE_URL } from '../constants.js';\nimport { appItemSchema } from './appItem.js';\nimport type { SpecMap } from './spec.js';\n\nconst shape = appItemSchema.shape;\nconst PRICE_NUMBER = /([0-9.,]+)/;\n\nfunction resolveUrl(value: unknown): string | undefined {\n return typeof value === 'string' ? new URL(value, BASE_URL).toString() : undefined;\n}\n\nfunction priceFromText(value: unknown): number {\n if (typeof value !== 'string') {\n return 0;\n }\n const match = PRICE_NUMBER.exec(value);\n return match === null ? 0 : Number.parseFloat(match[0]);\n}\n\nfunction isFreeText(value: unknown): boolean {\n return value === undefined || value === null;\n}\n\nexport const clusterItemSpecs = {\n title: { paths: [[2]], schema: shape.title },\n appId: { paths: [[12, 0]], schema: shape.appId },\n url: { paths: [[9, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[1, 1, 0, 3, 2]], schema: shape.icon },\n developer: { paths: [[4, 0, 0, 0]], schema: shape.developer },\n currency: { paths: [[7, 0, 3, 2, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[7, 0, 3, 2, 1, 0, 2]], schema: shape.price, transform: priceFromText },\n free: { paths: [[7, 0, 3, 2, 1, 0, 2]], schema: shape.free, transform: isFreeText },\n summary: { paths: [[4, 1, 1, 1, 1]], schema: shape.summary },\n scoreText: { paths: [[6, 0, 2, 1, 0]], schema: shape.scoreText },\n score: { paths: [[6, 0, 2, 1, 1]], schema: shape.score },\n} satisfies SpecMap;\n","import { appItemSchema, type AppItem } from '../../core/appItem.js';\n\nexport const developerAppSchema = appItemSchema;\n\nexport type DeveloperApp = AppItem;\n","import { BASE_URL } from '../../constants.js';\nimport type { Path } from '../../core/path.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { developerAppSchema } from './schema.js';\n\nconst MICROS_PER_UNIT = 1_000_000;\nconst shape = developerAppSchema.shape;\n\nconst NUMERIC_ID = /^\\d+$/;\n\nexport function isNumericDevId(devId: string): boolean {\n return NUMERIC_ID.test(devId);\n}\n\nexport function developerUrl(devId: string, lang: string, country: string): string {\n const path = isNumericDevId(devId) ? '/store/apps/dev' : '/store/apps/developer';\n const params = new URLSearchParams({ id: devId, hl: lang, gl: country });\n return `${BASE_URL}${path}?${params.toString()}`;\n}\n\nexport const NUMERIC_INITIAL_MAPPINGS = {\n apps: ['ds:3', 0, 1, 0, 21, 0],\n token: ['ds:3', 0, 1, 0, 21, 1, 3, 1],\n} satisfies Record<string, Path>;\n\nexport const NAME_INITIAL_MAPPINGS = {\n apps: ['ds:3', 0, 1, 0, 22, 0],\n token: ['ds:3', 0, 1, 0, 22, 1, 3, 1],\n} satisfies Record<string, Path>;\n\nexport const CLUSTER_MAPPINGS = {\n apps: [0, 6, 0],\n token: [0, 6, 7, 1],\n} satisfies Record<string, Path>;\n\nfunction resolveUrl(value: unknown): string | undefined {\n return typeof value === 'string' ? new URL(value, BASE_URL).toString() : undefined;\n}\n\nfunction microsToUnits(value: unknown): number {\n return typeof value === 'number' ? value / MICROS_PER_UNIT || 0 : 0;\n}\n\nfunction isFree(value: unknown): boolean {\n return value === 0;\n}\n\nexport const nameItemSpecs = {\n title: { paths: [[0, 3]], schema: shape.title },\n appId: { paths: [[0, 0, 0]], schema: shape.appId },\n url: { paths: [[0, 10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[0, 1, 3, 2]], schema: shape.icon },\n developer: { paths: [[0, 14]], schema: shape.developer },\n currency: { paths: [[0, 8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[0, 8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[0, 8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[0, 13, 1]], schema: shape.summary },\n scoreText: { paths: [[0, 4, 0]], schema: shape.scoreText },\n score: { paths: [[0, 4, 1]], schema: shape.score },\n} satisfies SpecMap;\n\nexport const numericItemSpecs = {\n title: { paths: [[3]], schema: shape.title },\n appId: { paths: [[0, 0]], schema: shape.appId },\n url: { paths: [[10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[1, 3, 2]], schema: shape.icon },\n developer: { paths: [[14]], schema: shape.developer },\n currency: { paths: [[8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[13, 1]], schema: shape.summary },\n scoreText: { paths: [[4, 0]], schema: shape.scoreText },\n score: { paths: [[4, 1]], schema: shape.score },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport { clusterItemSpecs } from '../../core/clusterItem.js';\nimport { fetchClusterApps } from '../../core/pagination.js';\nimport { resolveFullDetail, type GetApp } from '../../core/fullDetail.js';\nimport { parseScriptData } from '../../core/scriptData.js';\nimport { extract, type Extracted } from '../../core/spec.js';\nimport { app } from '../app/app.js';\nimport type { App } from '../app/schema.js';\nimport { developerAppSchema, type DeveloperApp } from './schema.js';\nimport {\n CLUSTER_MAPPINGS,\n developerUrl,\n isNumericDevId,\n NAME_INITIAL_MAPPINGS,\n nameItemSpecs,\n NUMERIC_INITIAL_MAPPINGS,\n numericItemSpecs,\n} from './specs.js';\n\nexport const developerOptionsSchema = baseOptionsSchema.extend({\n devId: z.string().min(1),\n num: z.number().int().min(1).default(60),\n fullDetail: z.boolean().default(false),\n});\n\nexport type DeveloperOptions = z.input<typeof developerOptionsSchema>;\n\nconst DEVELOPER_CONTEXT = 'developer';\n\ntype DeveloperItem = Extracted<typeof numericItemSpecs>;\n\ninterface DeveloperLayout {\n mappings: typeof NUMERIC_INITIAL_MAPPINGS;\n itemSpecs: typeof numericItemSpecs;\n}\n\nconst NUMERIC_LAYOUT: DeveloperLayout = {\n mappings: NUMERIC_INITIAL_MAPPINGS,\n itemSpecs: numericItemSpecs,\n};\n\nconst NAME_LAYOUT: DeveloperLayout = {\n mappings: NAME_INITIAL_MAPPINGS,\n itemSpecs: nameItemSpecs,\n};\n\nfunction extractLayout(\n blocks: Record<string, unknown>,\n layout: DeveloperLayout,\n): { apps: DeveloperItem[]; token: string | undefined } | undefined {\n const appsData = getPath(blocks, layout.mappings.apps);\n if (!Array.isArray(appsData) || appsData.length === 0) {\n return undefined;\n }\n const apps = appsData.map((item) => extract(item, layout.itemSpecs, DEVELOPER_CONTEXT));\n const token = getPath(blocks, layout.mappings.token);\n return { apps, token: typeof token === 'string' ? token : undefined };\n}\n\nfunction extractInitial(\n blocks: Record<string, unknown>,\n numeric: boolean,\n): { apps: DeveloperItem[]; token: string | undefined } {\n const ordered = numeric ? [NUMERIC_LAYOUT, NAME_LAYOUT] : [NAME_LAYOUT, NUMERIC_LAYOUT];\n for (const layout of ordered) {\n const extracted = extractLayout(blocks, layout);\n if (extracted !== undefined) {\n return extracted;\n }\n }\n return { apps: [], token: undefined };\n}\n\nexport function createDeveloper(getApp: GetApp<App>) {\n return async function developer(options: DeveloperOptions): Promise<DeveloperApp[] | App[]> {\n const parsed = parseOptions(developerOptionsSchema, options, DEVELOPER_CONTEXT);\n const numeric = isNumericDevId(parsed.devId);\n\n const client = clientFromOptions(parsed);\n const html = await client.request({\n url: developerUrl(parsed.devId, parsed.lang, parsed.country),\n });\n const data = parseScriptData(html);\n const initial = extractInitial(data.blocks, numeric);\n\n const items = await fetchClusterApps({\n client,\n lang: parsed.lang,\n country: parsed.country,\n num: parsed.num,\n initialApps: initial.apps,\n initialToken: initial.token,\n itemSpecs: clusterItemSpecs,\n appsPath: CLUSTER_MAPPINGS.apps,\n tokenPath: CLUSTER_MAPPINGS.token,\n context: DEVELOPER_CONTEXT,\n });\n\n const sliced = items.slice(0, parsed.num);\n\n if (parsed.fullDetail) {\n return resolveFullDetail(sliced, parsed, getApp);\n }\n\n return z.array(developerAppSchema).parse(sliced);\n };\n}\n\nexport const developer = createDeveloper(app);\n","import { appItemSchema, type AppItem } from '../../core/appItem.js';\n\nexport const similarAppSchema = appItemSchema;\n\nexport type SimilarApp = AppItem;\n","import { BASE_URL } from '../../constants.js';\nimport { getPath, type Path } from '../../core/path.js';\nimport { resolveDsKey, type ScriptData } from '../../core/scriptData.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { similarAppSchema } from './schema.js';\n\nconst MICROS_PER_UNIT = 1_000_000;\nconst shape = similarAppSchema.shape;\n\nexport const CLUSTERS_RPC_ID = 'ag2B9c';\nexport const SIMILAR_MAX_APPS = 100;\n\nconst CLUSTERS_PATH: Path = [1, 1];\n\nexport const CLUSTER_MAPPING = {\n title: [21, 1, 0],\n url: [21, 1, 2, 4, 2],\n} satisfies Record<string, Path>;\n\nconst SIMILAR_APPS = 'Similar apps';\nconst SIMILAR_GAMES = 'Similar games';\n\nexport const CLUSTER_PAGE_MAPPINGS = {\n apps: ['ds:3', 0, 1, 0, 21, 0],\n token: ['ds:3', 0, 1, 0, 21, 1, 3, 1],\n} satisfies Record<string, Path>;\n\nexport const PAGINATION_MAPPINGS = {\n apps: [0, 0, 0],\n token: [0, 0, 7, 1],\n} satisfies Record<string, Path>;\n\nexport function similarDetailsUrl(appId: string, country: string): string {\n const params = new URLSearchParams({ id: appId, hl: 'en', gl: country });\n return `${BASE_URL}/store/apps/details?${params.toString()}`;\n}\n\nexport function similarClusterUrl(clusterPath: string, lang: string, country: string): string {\n return `${BASE_URL}${clusterPath}&gl=${country}&hl=${lang}`;\n}\n\nexport function findSimilarClusterPath(data: ScriptData): string | undefined {\n const dsKey = resolveDsKey(data, CLUSTERS_RPC_ID);\n if (dsKey === undefined) {\n return undefined;\n }\n const clusters = getPath(data.blocks, [dsKey, ...CLUSTERS_PATH]);\n if (!Array.isArray(clusters)) {\n return undefined;\n }\n for (const cluster of clusters) {\n const title = getPath(cluster, CLUSTER_MAPPING.title);\n if (title === SIMILAR_APPS || title === SIMILAR_GAMES) {\n const clusterPath = getPath(cluster, CLUSTER_MAPPING.url);\n if (typeof clusterPath === 'string') {\n return clusterPath;\n }\n }\n }\n return undefined;\n}\n\nfunction resolveUrl(value: unknown): string | undefined {\n return typeof value === 'string' ? new URL(value, BASE_URL).toString() : undefined;\n}\n\nfunction microsToUnits(value: unknown): number {\n return typeof value === 'number' ? value / MICROS_PER_UNIT || 0 : 0;\n}\n\nfunction isFree(value: unknown): boolean {\n return value === 0;\n}\n\nexport const similarItemSpecs = {\n title: { paths: [[3]], schema: shape.title },\n appId: { paths: [[0, 0]], schema: shape.appId },\n url: { paths: [[10, 4, 2]], schema: shape.url, transform: resolveUrl },\n icon: { paths: [[1, 3, 2]], schema: shape.icon },\n developer: { paths: [[14]], schema: shape.developer },\n currency: { paths: [[8, 1, 0, 1]], schema: shape.currency },\n price: { paths: [[8, 1, 0, 0]], schema: shape.price, transform: microsToUnits },\n free: { paths: [[8, 1, 0, 0]], schema: shape.free, transform: isFree },\n summary: { paths: [[13, 1]], schema: shape.summary },\n scoreText: { paths: [[4, 0]], schema: shape.scoreText },\n score: { paths: [[4, 1]], schema: shape.score },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport { clusterItemSpecs } from '../../core/clusterItem.js';\nimport { fetchClusterApps } from '../../core/pagination.js';\nimport { resolveFullDetail, type GetApp } from '../../core/fullDetail.js';\nimport { parseScriptData } from '../../core/scriptData.js';\nimport { extract, type Extracted } from '../../core/spec.js';\nimport { app } from '../app/app.js';\nimport type { App } from '../app/schema.js';\nimport { similarAppSchema, type SimilarApp } from './schema.js';\nimport {\n CLUSTER_PAGE_MAPPINGS,\n findSimilarClusterPath,\n PAGINATION_MAPPINGS,\n SIMILAR_MAX_APPS,\n similarClusterUrl,\n similarDetailsUrl,\n similarItemSpecs,\n} from './specs.js';\n\nexport const similarOptionsSchema = baseOptionsSchema.extend({\n appId: z.string().min(1),\n fullDetail: z.boolean().default(false),\n});\n\nexport type SimilarOptions = z.input<typeof similarOptionsSchema>;\n\nconst SIMILAR_CONTEXT = 'similar';\n\ntype SimilarItem = Extracted<typeof similarItemSpecs>;\n\nfunction extractClusterPage(blocks: Record<string, unknown>): {\n apps: SimilarItem[];\n token: string | undefined;\n} {\n const appsData = getPath(blocks, CLUSTER_PAGE_MAPPINGS.apps);\n const apps = Array.isArray(appsData)\n ? appsData.map((item) => extract(item, similarItemSpecs, SIMILAR_CONTEXT))\n : [];\n const token = getPath(blocks, CLUSTER_PAGE_MAPPINGS.token);\n return { apps, token: typeof token === 'string' ? token : undefined };\n}\n\nexport function createSimilar(getApp: GetApp<App>) {\n return async function similar(options: SimilarOptions): Promise<SimilarApp[] | App[]> {\n const parsed = parseOptions(similarOptionsSchema, options, SIMILAR_CONTEXT);\n\n const client = clientFromOptions(parsed);\n const detailsHtml = await client.request({\n url: similarDetailsUrl(parsed.appId, parsed.country),\n });\n const details = parseScriptData(detailsHtml);\n\n const clusterPath = findSimilarClusterPath(details);\n if (clusterPath === undefined) {\n return z.array(similarAppSchema).parse([]);\n }\n\n const clusterHtml = await client.request({\n url: similarClusterUrl(clusterPath, parsed.lang, parsed.country),\n });\n const clusterData = parseScriptData(clusterHtml);\n const page = extractClusterPage(clusterData.blocks);\n\n const items = await fetchClusterApps({\n client,\n lang: parsed.lang,\n country: parsed.country,\n num: SIMILAR_MAX_APPS,\n initialApps: page.apps,\n initialToken: page.token,\n itemSpecs: clusterItemSpecs,\n appsPath: PAGINATION_MAPPINGS.apps,\n tokenPath: PAGINATION_MAPPINGS.token,\n context: SIMILAR_CONTEXT,\n });\n\n if (parsed.fullDetail) {\n return resolveFullDetail(items, parsed, getApp);\n }\n\n return z.array(similarAppSchema).parse(items);\n };\n}\n\nexport const similar = createSimilar(app);\n","import { z } from 'zod';\n\nexport const reviewCriteriaSchema = z.object({\n criteria: z.string(),\n rating: z.number().nullable(),\n});\n\nexport const reviewSchema = z.object({\n id: z.string(),\n userName: z.string(),\n userImage: z.url().optional(),\n date: z.iso.datetime(),\n score: z.number().min(1).max(5),\n title: z.string().nullable().optional(),\n text: z.string().optional(),\n replyDate: z.iso.datetime().optional(),\n replyText: z.string().optional(),\n version: z.string().optional(),\n thumbsUp: z.number().optional(),\n criterias: z.array(reviewCriteriaSchema).default([]),\n});\n\nexport type Review = z.infer<typeof reviewSchema>;\n\nexport const reviewsResultSchema = z.object({\n data: z.array(reviewSchema),\n nextPaginationToken: z.string().nullable(),\n});\n\nexport type ReviewsResult = z.infer<typeof reviewsResultSchema>;\n","import { BASE_URL } from '../../constants.js';\nimport type { Path } from '../../core/path.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { sanitizeText } from '../../core/text.js';\nimport { reviewSchema } from './schema.js';\n\nexport const REVIEWS_RPC_ID = 'UsvDTd';\nexport const REVIEWS_PER_REQUEST = 150;\n\nconst REVIEWS_STATIC_QUERY =\n 'rpcids=qnKhOb&f.sid=-697906427155521722&bl=boq_playuiserver_20190903.08_p0';\nconst REVIEWS_TRAILING_QUERY = 'authuser&soc-app=121&soc-platform=1&soc-device=1&_reqid=1065213';\n\nexport function reviewsUrl(lang: string, country: string): string {\n return `${BASE_URL}/_/PlayStoreUi/data/batchexecute?${REVIEWS_STATIC_QUERY}&hl=${lang}&gl=${country}&${REVIEWS_TRAILING_QUERY}`;\n}\n\nexport function buildInitialReviewsBody(sort: number, appId: string): string {\n return `f.req=%5B%5B%5B%22UsvDTd%22%2C%22%5Bnull%2Cnull%2C%5B2%2C${sort.toString()}%2C%5B${REVIEWS_PER_REQUEST.toString()}%2Cnull%2Cnull%5D%2Cnull%2C%5B%5D%5D%2C%5B%5C%22${appId}%5C%22%2C7%5D%5D%22%2Cnull%2C%22generic%22%5D%5D%5D`;\n}\n\nexport function buildPaginatedReviewsBody(sort: number, appId: string, withToken: string): string {\n return `f.req=%5B%5B%5B%22UsvDTd%22%2C%22%5Bnull%2Cnull%2C%5B2%2C${sort.toString()}%2C%5B${REVIEWS_PER_REQUEST.toString()}%2Cnull%2C%5C%22${withToken}%5C%22%5D%2Cnull%2C%5B%5D%5D%2C%5B%5C%22${appId}%5C%22%2C7%5D%5D%22%2Cnull%2C%22generic%22%5D%5D%5D`;\n}\n\nexport const REVIEWS_RESPONSE_PATHS = {\n reviews: [0],\n token: [1, 1],\n} satisfies Record<string, Path>;\n\nconst shape = reviewSchema.shape;\n\ninterface RawCriteria {\n criteria: unknown;\n rating: unknown;\n}\n\nfunction generateDate(value: unknown): string | undefined {\n if (!Array.isArray(value)) {\n return undefined;\n }\n const seconds = Number(value[0]);\n const nanos = Number(value[1]);\n const nanoText = (Number.isFinite(nanos) && nanos !== 0 ? nanos.toString() : '000').substring(\n 0,\n 3,\n );\n const milliseconds = Number(`${seconds.toString()}${nanoText}`);\n const date = new Date(milliseconds);\n return Number.isNaN(date.getTime()) ? undefined : date.toISOString();\n}\n\nfunction alwaysNull(): null {\n return null;\n}\n\nfunction emptyToUndefined(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction cleanReplyText(value: unknown): string | undefined {\n return emptyToUndefined(sanitizeText(value));\n}\n\nfunction buildCriteria(entry: unknown): RawCriteria {\n if (!Array.isArray(entry)) {\n return { criteria: undefined, rating: null };\n }\n const fields: readonly unknown[] = entry;\n const ratingHolder = fields[1];\n const ratingFields: readonly unknown[] = Array.isArray(ratingHolder) ? ratingHolder : [];\n const rating = ratingFields.length > 0 ? ratingFields[0] : null;\n return { criteria: fields[0], rating };\n}\n\nfunction mapCriterias(value: unknown): RawCriteria[] {\n return Array.isArray(value) ? value.map(buildCriteria) : [];\n}\n\nexport const reviewItemSpecs = {\n id: { paths: [[0]], schema: shape.id },\n userName: { paths: [[1, 0]], schema: shape.userName },\n userImage: { paths: [[1, 1, 3, 2]], schema: shape.userImage },\n date: { paths: [[5]], schema: shape.date, transform: generateDate },\n score: { paths: [[2]], schema: shape.score },\n title: { paths: [[0]], schema: shape.title, transform: alwaysNull },\n text: { paths: [[4]], schema: shape.text, transform: sanitizeText },\n replyDate: { paths: [[7, 2]], schema: shape.replyDate, transform: generateDate },\n replyText: { paths: [[7, 1]], schema: shape.replyText, transform: cleanReplyText },\n version: { paths: [[10]], schema: shape.version, transform: emptyToUndefined },\n thumbsUp: { paths: [[6]], schema: shape.thumbsUp },\n criterias: { paths: [[12, 0]], schema: shape.criterias, transform: mapCriterias },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport { sort } from '../../constants.js';\nimport { parseBatchResponse } from '../../core/batchexecute.js';\nimport { clientFromOptions, type HttpClient } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { getPath } from '../../core/path.js';\nimport { extract, type Extracted } from '../../core/spec.js';\nimport { reviewsResultSchema, type ReviewsResult } from './schema.js';\nimport {\n buildInitialReviewsBody,\n buildPaginatedReviewsBody,\n REVIEWS_RESPONSE_PATHS,\n REVIEWS_RPC_ID,\n reviewItemSpecs,\n reviewsUrl,\n} from './specs.js';\n\nconst REVIEWS_CONTEXT = 'reviews';\n\nconst sortSchema = z\n .union([z.literal(sort.NEWEST), z.literal(sort.RATING), z.literal(sort.HELPFULNESS)])\n .default(sort.NEWEST);\n\nexport const reviewsOptionsSchema = baseOptionsSchema.extend({\n appId: z.string().min(1),\n sort: sortSchema,\n num: z.number().int().min(1).default(150),\n paginate: z.boolean().default(false),\n nextPaginationToken: z.string().optional(),\n});\n\nexport type ReviewsOptions = z.input<typeof reviewsOptionsSchema>;\n\ntype ParsedReviewsOptions = z.infer<typeof reviewsOptionsSchema>;\ntype ReviewItem = Extracted<typeof reviewItemSpecs>;\n\ninterface ReviewsPage {\n reviews: ReviewItem[];\n token: string | undefined;\n}\n\nfunction reviewsBody(options: ParsedReviewsOptions, token: string | undefined): string {\n return token === undefined\n ? buildInitialReviewsBody(options.sort, options.appId)\n : buildPaginatedReviewsBody(options.sort, options.appId, token);\n}\n\nasync function fetchReviewsPage(\n client: HttpClient,\n options: ParsedReviewsOptions,\n token: string | undefined,\n): Promise<ReviewsPage> {\n const text = await client.request({\n url: reviewsUrl(options.lang, options.country),\n method: 'POST',\n body: reviewsBody(options, token),\n });\n\n const payload = parseBatchResponse(text, REVIEWS_RPC_ID);\n const rawReviews = getPath(payload, REVIEWS_RESPONSE_PATHS.reviews);\n const reviews = Array.isArray(rawReviews)\n ? rawReviews.map((item) => extract(item, reviewItemSpecs, REVIEWS_CONTEXT))\n : [];\n\n const rawToken = getPath(payload, REVIEWS_RESPONSE_PATHS.token);\n const nextToken = typeof rawToken === 'string' && rawToken.length > 0 ? rawToken : undefined;\n\n return { reviews, token: nextToken };\n}\n\nasync function fetchSinglePage(\n client: HttpClient,\n options: ParsedReviewsOptions,\n): Promise<ReviewsResult> {\n const page = await fetchReviewsPage(client, options, options.nextPaginationToken);\n return reviewsResultSchema.parse({\n data: page.reviews,\n nextPaginationToken: page.token ?? null,\n });\n}\n\nasync function accumulateReviews(\n client: HttpClient,\n options: ParsedReviewsOptions,\n): Promise<ReviewsResult> {\n const collected: ReviewItem[] = [];\n const seenTokens = new Set<string>();\n let token = options.nextPaginationToken;\n\n while (collected.length < options.num) {\n const page = await fetchReviewsPage(client, options, token);\n for (const review of page.reviews) {\n collected.push(review);\n }\n\n if (page.token === undefined || seenTokens.has(page.token)) {\n break;\n }\n seenTokens.add(page.token);\n token = page.token;\n }\n\n return reviewsResultSchema.parse({\n data: collected.slice(0, options.num),\n nextPaginationToken: null,\n });\n}\n\nexport async function reviews(options: ReviewsOptions): Promise<ReviewsResult> {\n const parsed = parseOptions(reviewsOptionsSchema, options, REVIEWS_CONTEXT);\n const client = clientFromOptions(parsed);\n\n return parsed.paginate ? fetchSinglePage(client, parsed) : accumulateReviews(client, parsed);\n}\n","import { z } from 'zod';\nimport { permission } from '../../constants.js';\n\nexport const permissionTypeSchema = z.union([\n z.literal(permission.COMMON),\n z.literal(permission.OTHER),\n]);\n\nexport const permissionSchema = z.object({\n permission: z.string(),\n type: permissionTypeSchema,\n});\n\nexport type AppPermission = z.infer<typeof permissionSchema>;\n","import { BASE_URL, permission } from '../../constants.js';\nimport { buildBatchBody } from '../../core/batchexecute.js';\nimport { getPath, type Path } from '../../core/path.js';\nimport type { AppPermission } from './schema.js';\n\nexport const PERMISSIONS_RPC_ID = 'xdSrCf';\n\nconst PERMISSIONS_STATIC_QUERY =\n 'rpcids=qnKhOb&f.sid=-697906427155521722&bl=boq_playuiserver_20190903.08_p0';\nconst PERMISSIONS_TRAILING_QUERY =\n 'authuser&soc-app=121&soc-platform=1&soc-device=1&_reqid=1065213';\n\nexport function permissionsUrl(lang: string, country: string): string {\n return `${BASE_URL}/_/PlayStoreUi/data/batchexecute?${PERMISSIONS_STATIC_QUERY}&hl=${lang}&gl=${country}&${PERMISSIONS_TRAILING_QUERY}`;\n}\n\nexport function buildPermissionsBody(appId: string): string {\n return buildBatchBody(PERMISSIONS_RPC_ID, [[null, [appId, 7], []]], [null, '1']);\n}\n\nconst PERMISSION_SECTIONS = [permission.COMMON, permission.OTHER] as const;\nconst GROUP_PERMISSIONS_PATH: Path = [2];\nconst PERMISSION_TEXT_PATH: Path = [1];\n\nfunction sectionEntries(section: unknown, type: AppPermission['type']): AppPermission[] {\n if (!Array.isArray(section)) {\n return [];\n }\n const entries: AppPermission[] = [];\n for (const group of section) {\n const groupPermissions = getPath(group, GROUP_PERMISSIONS_PATH);\n if (!Array.isArray(groupPermissions)) {\n continue;\n }\n for (const groupPermission of groupPermissions) {\n const text = getPath(groupPermission, PERMISSION_TEXT_PATH);\n if (typeof text === 'string' && text.length > 0) {\n entries.push({ permission: text, type });\n }\n }\n }\n return entries;\n}\n\nexport function mapPermissions(payload: unknown): AppPermission[] {\n if (!Array.isArray(payload)) {\n return [];\n }\n return PERMISSION_SECTIONS.flatMap((type) => sectionEntries(payload[type], type));\n}\n","import { z } from 'zod';\nimport { permission } from '../../constants.js';\nimport { parseBatchResponse } from '../../core/batchexecute.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { permissionSchema, type AppPermission } from './schema.js';\nimport {\n buildPermissionsBody,\n mapPermissions,\n PERMISSIONS_RPC_ID,\n permissionsUrl,\n} from './specs.js';\n\nconst PERMISSIONS_CONTEXT = 'permissions';\n\nexport const permissionsOptionsSchema = baseOptionsSchema.extend({\n appId: z.string().min(1),\n short: z.boolean().default(false),\n});\n\nexport type PermissionsOptions = z.input<typeof permissionsOptionsSchema>;\n\nconst permissionsResultSchema = z.array(permissionSchema);\n\nexport async function permissions(\n options: PermissionsOptions,\n): Promise<AppPermission[] | string[]> {\n const parsed = parseOptions(permissionsOptionsSchema, options, PERMISSIONS_CONTEXT);\n const client = clientFromOptions(parsed);\n\n const text = await client.request({\n url: permissionsUrl(parsed.lang, parsed.country),\n method: 'POST',\n body: buildPermissionsBody(parsed.appId),\n });\n\n const payload = parseBatchResponse(text, PERMISSIONS_RPC_ID);\n const entries = permissionsResultSchema.parse(mapPermissions(payload));\n\n if (!parsed.short) {\n return entries;\n }\n return entries\n .filter((entry) => entry.type === permission.COMMON)\n .map((entry) => entry.permission);\n}\n","import { z } from 'zod';\n\nexport const dataEntrySchema = z.object({\n data: z.string(),\n optional: z.boolean(),\n purpose: z.string().optional(),\n type: z.string(),\n});\n\nexport const securityPracticeSchema = z.object({\n practice: z.string(),\n description: z.string().optional(),\n});\n\nexport const dataSafetySchema = z.object({\n sharedData: z.array(dataEntrySchema).default([]),\n collectedData: z.array(dataEntrySchema).default([]),\n securityPractices: z.array(securityPracticeSchema).default([]),\n privacyPolicyUrl: z.url().optional(),\n});\n\nexport type DataEntry = z.infer<typeof dataEntrySchema>;\nexport type SecurityPractice = z.infer<typeof securityPracticeSchema>;\nexport type DataSafety = z.infer<typeof dataSafetySchema>;\n","import { z } from 'zod';\nimport { getPath, type Path } from '../../core/path.js';\nimport type { SpecMap } from '../../core/spec.js';\nimport { dataEntrySchema, securityPracticeSchema } from './schema.js';\n\nconst SHARED_DATA_PATH: Path = ['ds:3', 1, 2, 1, '138', 4, 0, 0];\nconst COLLECTED_DATA_PATH: Path = ['ds:3', 1, 2, 1, '138', 4, 1, 0];\nconst SECURITY_PRACTICES_PATH: Path = ['ds:3', 1, 2, 1, '138', 9, 2];\nconst PRIVACY_POLICY_PATH: Path = ['ds:3', 1, 2, 1, '100', 0, 5, 2];\n\nconst ENTRY_TYPE_PATH: Path = [0, 1];\nconst ENTRY_DETAILS_PATH: Path = [4];\nconst DETAIL_DATA_PATH: Path = [0];\nconst DETAIL_OPTIONAL_PATH: Path = [1];\nconst DETAIL_PURPOSE_PATH: Path = [2];\nconst PRACTICE_LABEL_PATH: Path = [1];\nconst PRACTICE_DESCRIPTION_PATH: Path = [2, 1];\n\nfunction mapDataEntries(value: unknown): unknown {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.flatMap((entry) => {\n const type = getPath(entry, ENTRY_TYPE_PATH);\n const details = getPath(entry, ENTRY_DETAILS_PATH);\n if (!Array.isArray(details)) {\n return [];\n }\n return details.map((detail) => ({\n data: getPath(detail, DETAIL_DATA_PATH),\n optional: Boolean(getPath(detail, DETAIL_OPTIONAL_PATH)),\n purpose: getPath(detail, DETAIL_PURPOSE_PATH),\n type,\n }));\n });\n}\n\nfunction mapSecurityPractices(value: unknown): unknown {\n if (!Array.isArray(value)) {\n return [];\n }\n return value.map((practice) => ({\n practice: getPath(practice, PRACTICE_LABEL_PATH),\n description: getPath(practice, PRACTICE_DESCRIPTION_PATH),\n }));\n}\n\nexport const dataSafetySpecs = {\n sharedData: {\n paths: [SHARED_DATA_PATH],\n schema: z.array(dataEntrySchema).default([]),\n transform: mapDataEntries,\n },\n collectedData: {\n paths: [COLLECTED_DATA_PATH],\n schema: z.array(dataEntrySchema).default([]),\n transform: mapDataEntries,\n },\n securityPractices: {\n paths: [SECURITY_PRACTICES_PATH],\n schema: z.array(securityPracticeSchema).default([]),\n transform: mapSecurityPractices,\n },\n privacyPolicyUrl: {\n paths: [PRIVACY_POLICY_PATH],\n schema: z.url().optional(),\n },\n} satisfies SpecMap;\n","import { z } from 'zod';\nimport { BASE_URL } from '../../constants.js';\nimport { clientFromOptions } from '../../core/http.js';\nimport { baseOptionsSchema, parseOptions } from '../../core/options.js';\nimport { parseScriptData } from '../../core/scriptData.js';\nimport { extract } from '../../core/spec.js';\nimport { dataSafetySchema, type DataSafety } from './schema.js';\nimport { dataSafetySpecs } from './specs.js';\n\nconst DATA_SAFETY_CONTEXT = 'datasafety';\n\nexport const dataSafetyOptionsSchema = baseOptionsSchema.extend({\n appId: z.string().min(1),\n});\n\nexport type DataSafetyOptions = z.input<typeof dataSafetyOptionsSchema>;\n\nconst DATA_SAFETY_URL = `${BASE_URL}/store/apps/datasafety`;\n\nexport async function datasafety(options: DataSafetyOptions): Promise<DataSafety> {\n const parsed = parseOptions(dataSafetyOptionsSchema, options, DATA_SAFETY_CONTEXT);\n\n const params = new URLSearchParams({ id: parsed.appId, hl: parsed.lang });\n const url = `${DATA_SAFETY_URL}?${params.toString()}`;\n\n const client = clientFromOptions(parsed);\n const html = await client.request({ url });\n const data = parseScriptData(html);\n const extracted = extract(data, dataSafetySpecs, DATA_SAFETY_CONTEXT);\n\n return dataSafetySchema.parse(extracted);\n}\n","import { LRUCache } from 'lru-cache';\nimport {\n BASE_URL,\n age,\n category,\n clusters,\n collection,\n permission,\n sort,\n} from '../../constants.js';\nimport type { GooglePlayClient } from '../../index.js';\nimport { app } from '../app/app.js';\nimport { categories, type CategoriesOptions } from '../categories/categories.js';\nimport { datasafety } from '../datasafety/datasafety.js';\nimport { createDeveloper } from '../developer/developer.js';\nimport { createList } from '../list/list.js';\nimport { permissions } from '../permissions/permissions.js';\nimport { reviews } from '../reviews/reviews.js';\nimport { createSearch } from '../search/search.js';\nimport { createSimilar } from '../similar/similar.js';\nimport { suggest } from '../suggest/suggest.js';\n\nexport interface MemoizedOptions {\n maxAgeMs?: number;\n max?: number;\n}\n\nconst DEFAULT_MAX_AGE_MS = 1000 * 60 * 5;\nconst DEFAULT_MAX = 1000;\n\ntype AsyncMethod<Args, Result> = (options: Args) => Promise<Result>;\n\ntype Memoizer = <Args, Result>(\n name: string,\n fn: AsyncMethod<Args, Result>,\n) => AsyncMethod<Args, Result>;\n\nfunction createMemoizer(maxAgeMs: number, max: number): Memoizer {\n const lifecycle = new LRUCache<string, () => void>({\n max,\n ttl: maxAgeMs,\n ttlAutopurge: true,\n perf: { now: () => Date.now() },\n dispose: (drop) => {\n drop();\n },\n });\n\n return <Args, Result>(name: string, fn: AsyncMethod<Args, Result>): AsyncMethod<Args, Result> => {\n const store = new Map<string, Promise<Result>>();\n\n return (options: Args): Promise<Result> => {\n const key = `${name}:${JSON.stringify(options)}`;\n\n if (lifecycle.has(key)) {\n const cached = store.get(key);\n if (cached !== undefined) {\n return cached;\n }\n }\n\n const pending = fn(options);\n store.set(key, pending);\n lifecycle.set(key, () => {\n store.delete(key);\n });\n pending.catch(() => {\n store.delete(key);\n lifecycle.delete(key);\n });\n\n return pending;\n };\n };\n}\n\nexport function memoized(options?: MemoizedOptions): GooglePlayClient {\n const maxAgeMs = options?.maxAgeMs ?? DEFAULT_MAX_AGE_MS;\n const max = options?.max ?? DEFAULT_MAX;\n const memoize = createMemoizer(maxAgeMs, max);\n\n const memoApp = memoize('app', app);\n const memoCategories = memoize('categories', (input: CategoriesOptions | undefined) =>\n categories(input),\n );\n\n return {\n BASE_URL,\n age,\n category,\n clusters,\n collection,\n permission,\n sort,\n app: memoApp,\n search: memoize('search', createSearch(memoApp)),\n suggest: memoize('suggest', suggest),\n list: memoize('list', createList(memoApp)),\n categories: (input?: CategoriesOptions) => memoCategories(input),\n developer: memoize('developer', createDeveloper(memoApp)),\n similar: memoize('similar', createSimilar(memoApp)),\n reviews: memoize('reviews', reviews),\n permissions: memoize('permissions', permissions),\n datasafety: memoize('datasafety', datasafety),\n };\n}\n","export { BASE_URL, age, category, clusters, collection, permission, sort } from './constants.js';\nexport type { Age, Category, Cluster, Collection, Permission, Sort } from './constants.js';\n\nexport {\n BlockedError,\n GooglePlayError,\n HttpError,\n NotFoundError,\n ParseError,\n RateLimitError,\n SpecError,\n ValidationError,\n} from './core/errors.js';\nexport type { SpecFailure } from './core/errors.js';\n\nexport { app } from './features/app/app.js';\nexport type { AppOptions } from './features/app/app.js';\nexport type { App } from './features/app/schema.js';\n\nexport { search } from './features/search/search.js';\nexport type { SearchOptions } from './features/search/search.js';\nexport type { SearchResult } from './features/search/schema.js';\n\nexport { suggest } from './features/suggest/suggest.js';\nexport type { SuggestOptions } from './features/suggest/suggest.js';\n\nexport { list } from './features/list/list.js';\nexport type { ListOptions } from './features/list/list.js';\nexport type { ListItem } from './features/list/schema.js';\n\nexport { categories } from './features/categories/categories.js';\nexport type { CategoriesOptions } from './features/categories/categories.js';\n\nexport { developer } from './features/developer/developer.js';\nexport type { DeveloperOptions } from './features/developer/developer.js';\nexport type { DeveloperApp } from './features/developer/schema.js';\n\nexport { similar } from './features/similar/similar.js';\nexport type { SimilarOptions } from './features/similar/similar.js';\nexport type { SimilarApp } from './features/similar/schema.js';\n\nexport { reviews } from './features/reviews/reviews.js';\nexport type { ReviewsOptions } from './features/reviews/reviews.js';\nexport type { Review, ReviewsResult } from './features/reviews/schema.js';\n\nexport { permissions } from './features/permissions/permissions.js';\nexport type { PermissionsOptions } from './features/permissions/permissions.js';\nexport type { AppPermission } from './features/permissions/schema.js';\n\nexport { datasafety } from './features/datasafety/datasafety.js';\nexport type { DataSafetyOptions } from './features/datasafety/datasafety.js';\nexport type { DataEntry, DataSafety, SecurityPractice } from './features/datasafety/schema.js';\n\nexport { memoized } from './features/memoized/memoized.js';\nexport type { MemoizedOptions } from './features/memoized/memoized.js';\n\nimport { BASE_URL, age, category, clusters, collection, permission, sort } from './constants.js';\nimport { app } from './features/app/app.js';\nimport { search } from './features/search/search.js';\nimport { suggest } from './features/suggest/suggest.js';\nimport { list } from './features/list/list.js';\nimport { categories } from './features/categories/categories.js';\nimport { developer } from './features/developer/developer.js';\nimport { similar } from './features/similar/similar.js';\nimport { reviews } from './features/reviews/reviews.js';\nimport { permissions } from './features/permissions/permissions.js';\nimport { datasafety } from './features/datasafety/datasafety.js';\nimport { memoized } from './features/memoized/memoized.js';\n\nexport interface GooglePlayClient {\n BASE_URL: typeof BASE_URL;\n age: typeof age;\n category: typeof category;\n clusters: typeof clusters;\n collection: typeof collection;\n permission: typeof permission;\n sort: typeof sort;\n app: typeof app;\n search: typeof search;\n suggest: typeof suggest;\n list: typeof list;\n categories: typeof categories;\n developer: typeof developer;\n similar: typeof similar;\n reviews: typeof reviews;\n permissions: typeof permissions;\n datasafety: typeof datasafety;\n}\n\nconst gplay: GooglePlayClient & { memoized: typeof memoized } = {\n BASE_URL,\n age,\n category,\n clusters,\n collection,\n permission,\n sort,\n app,\n search,\n suggest,\n list,\n categories,\n developer,\n similar,\n reviews,\n permissions,\n datasafety,\n memoized,\n};\n\nexport default gplay;\n"],"mappings":"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"}