A React component library for rendering common AT Protocol records for applications such as Bluesky and Leaflet.

init

+26
.gitignore
···
+
# Logs
+
logs
+
*.log
+
npm-debug.log*
+
yarn-debug.log*
+
yarn-error.log*
+
pnpm-debug.log*
+
lerna-debug.log*
+
+
node_modules
+
dist
+
lib-dist
+
dist-ssr
+
*.local
+
*.zip
+
+
# Editor directories and files
+
.vscode/*
+
!.vscode/extensions.json
+
.idea
+
.DS_Store
+
*.suo
+
*.ntvs*
+
*.njsproj
+
*.sln
+
*.sw?
+131
README.md
···
+
# atproto-ui
+
+
atproto-ui is a component library and set of hooks for rendering records from the AT Protocol (Bluesky, Leaflet, and friends) in React applications. It handles DID resolution, PDS endpoint discovery, and record fetching so you can focus on UI.
+
+
## Features
+
+
- Drop-in components for common record types (`BlueskyPost`, `BlueskyProfile`, `TangledString`, etc.).
+
- Hooks and helpers for composing your own renderers for your own applications, (PRs welcome!)
+
- Built on the lightweight [`@atcute/*`](https://github.com/atcute) clients.
+
+
## Installation
+
+
```bash
+
npm install atproto-ui
+
```
+
+
## Quick start
+
+
1. Wrap your app (once) with the `AtProtoProvider`.
+
2. Drop any of the ready-made components inside that provider.
+
3. Use the hooks to prefetch handles, blobs, or latest records when you want to control the render flow yourself.
+
+
```tsx
+
import { AtProtoProvider, BlueskyPost } from 'atproto-ui';
+
+
export function App() {
+
return (
+
<AtProtoProvider>
+
<BlueskyPost did="did:plc:example" rkey="3k2aexample" />
+
{/* you can use handles in the components as well. */}
+
<LeafletDocument did="nekomimi.pet" rkey="3m2seagm2222c" />
+
</AtProtoProvider>
+
);
+
}
+
```
+
+
### Available building blocks
+
+
| Component / Hook | What it does |
+
| --- | --- |
+
| `AtProtoProvider` | Configures PLC directory (defaults to `https://plc.directory`) and shares protocol clients via React context. |
+
| `BlueskyProfile` | Renders a profile card for a DID/handle. Accepts `fallback`, `loadingIndicator`, `renderer`, and `colorScheme`. |
+
| `BlueskyPost` / `BlueskyQuotePost` | Shows a single Bluesky post, with quotation support, custom renderer overrides, and the same loading/fallback knobs. |
+
| `BlueskyPostList` | Lists the latest posts with built-in pagination (defaults: 5 per page, pagination controls on). |
+
| `TangledString` | Renders a Tangled string (gist-like record) with optional renderer overrides. |
+
| `LeafletDocument` | Displays long-form Leaflet documents with blocks, theme support, and renderer overrides. |
+
| `useDidResolution`, `useLatestRecord`, `usePaginatedRecords`, … | Hook-level access to records if you want to own the markup or prefill components. |
+
+
All components accept a `colorScheme` of `'light' | 'dark' | 'system'` so they can blend into your design. They also accept `fallback` and `loadingIndicator` props to control what renders before or during network work, and most expose a `renderer` override when you need total control of the final markup.
+
+
### Prefill components with the latest record
+
+
`useLatestRecord` gives you the most recent record for any collection along with its `rkey`. You can use that key to pre-populate components like `BlueskyPost`, `LeafletDocument`, or `TangledString`.
+
+
```tsx
+
import { useLatestRecord, BlueskyPost } from 'atproto-ui';
+
import type { FeedPostRecord } from 'atproto-ui';
+
+
const LatestBlueskyPost: React.FC<{ did: string }> = ({ did }) => {
+
const { rkey, loading, error, empty } = useLatestRecord<FeedPostRecord>(did, 'app.bsky.feed.post');
+
+
if (loading) return <p>Fetching latest post…</p>;
+
if (error) return <p>Could not load: {error.message}</p>;
+
if (empty || !rkey) return <p>No posts yet.</p>;
+
+
return (
+
<BlueskyPost
+
did={did}
+
rkey={rkey}
+
colorScheme="system"
+
/>
+
);
+
};
+
```
+
+
The same pattern works for other components: swap the collection NSID and the component you render once you have an `rkey`.
+
+
```tsx
+
const LatestLeafletDocument: React.FC<{ did: string }> = ({ did }) => {
+
const { rkey } = useLatestRecord(did, 'pub.leaflet.document');
+
return rkey ? <LeafletDocument did={did} rkey={rkey} colorScheme="light" /> : null;
+
};
+
```
+
+
## Compose your own component
+
+
The helpers let you stitch together custom experiences without reimplementing protocol plumbing. The example below pulls a creator’s latest post and renders a minimal summary:
+
+
```tsx
+
import { useLatestRecord, useColorScheme, AtProtoRecord } from 'atproto-ui';
+
import type { FeedPostRecord } from 'atproto-ui';
+
+
const LatestPostSummary: React.FC<{ did: string }> = ({ did }) => {
+
const scheme = useColorScheme('system');
+
const { rkey, loading, error } = useLatestRecord<FeedPostRecord>(did, 'app.bsky.feed.post');
+
+
if (loading) return <span>Loading…</span>;
+
if (error || !rkey) return <span>No post yet.</span>;
+
+
return (
+
<AtProtoRecord<FeedPostRecord>
+
did={did}
+
collection="app.bsky.feed.post"
+
rkey={rkey}
+
renderer={({ record }) => (
+
<article data-color-scheme={scheme}>
+
<strong>{record?.text ?? 'Empty post'}</strong>
+
</article>
+
)}
+
/>
+
);
+
};
+
```
+
+
There is a [demo](https://wisp.place/s/ana.pds.nkp.pet/ATComponents) where you can see the components in live action.
+
+
## Running the demo locally
+
+
```bash
+
npm install
+
npm run dev
+
```
+
+
Then open the printed Vite URL and try entering a Bluesky handle to see the components in action.
+
+
## Next steps
+
+
- Expand renderer coverage (e.g., Grain.social photos).
+
- Expand documentation with TypeScript API references and theming guidelines.
+
+
Contributions and ideas are welcome—feel free to open an issue or PR!
+23
eslint.config.js
···
+
import js from '@eslint/js'
+
import globals from 'globals'
+
import reactHooks from 'eslint-plugin-react-hooks'
+
import reactRefresh from 'eslint-plugin-react-refresh'
+
import tseslint from 'typescript-eslint'
+
import { defineConfig, globalIgnores } from 'eslint/config'
+
+
export default defineConfig([
+
globalIgnores(['dist']),
+
{
+
files: ['**/*.{ts,tsx}'],
+
extends: [
+
js.configs.recommended,
+
tseslint.configs.recommended,
+
reactHooks.configs['recommended-latest'],
+
reactRefresh.configs.vite,
+
],
+
languageOptions: {
+
ecmaVersion: 2020,
+
globals: globals.browser,
+
},
+
},
+
])
+1
global.d.ts
···
+
declare module '*.css';
+13
index.html
···
+
<!doctype html>
+
<html lang="en">
+
<head>
+
<meta charset="UTF-8" />
+
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
+
<title>atproto-ui</title>
+
</head>
+
<body>
+
<div id="root"></div>
+
<script type="module" src="/src/main.tsx"></script>
+
</body>
+
</html>
+50
lib/components/BlueskyIcon.tsx
···
+
import React from 'react';
+
+
/**
+
* Configuration for the `BlueskyIcon` component.
+
*/
+
export interface BlueskyIconProps {
+
/**
+
* Pixel dimensions applied to both the width and height of the SVG element.
+
* Defaults to `16`.
+
*/
+
size?: number;
+
/**
+
* Hex, RGB, or any valid CSS color string used to fill the icon path.
+
* Defaults to the standard Bluesky blue `#1185fe`.
+
*/
+
color?: string;
+
/**
+
* Accessible title that will be exposed via `aria-label` for screen readers.
+
* Defaults to `'Bluesky'`.
+
*/
+
title?: string;
+
}
+
+
/**
+
* Renders the Bluesky butterfly glyph as a scalable, accessible SVG.
+
*
+
* @param size - Pixel dimensions applied to both width and height of the SVG.
+
* @param color - CSS color string used to fill the icon path.
+
* @param title - Accessible label exposed via `aria-label`.
+
* @returns A JSX `<svg>` element suitable for inline usage.
+
*/
+
export const BlueskyIcon: React.FC<BlueskyIconProps> = ({ size = 16, color = '#1185fe', title = 'Bluesky' }) => (
+
<svg
+
xmlns="http://www.w3.org/2000/svg"
+
width={size}
+
height={size}
+
viewBox="0 0 16 16"
+
role="img"
+
aria-label={title}
+
focusable="false"
+
style={{ display: 'block' }}
+
>
+
<path
+
fill={color}
+
d="M3.468 1.948C5.303 3.325 7.276 6.118 8 7.616c.725-1.498 2.698-4.29 4.532-5.668C13.855.955 16 .186 16 2.632c0 .489-.28 4.105-.444 4.692-.572 2.04-2.653 2.561-4.504 2.246 3.236.551 4.06 2.375 2.281 4.2-3.376 3.464-4.852-.87-5.23-1.98-.07-.204-.103-.3-.103-.218 0-.081-.033.014-.102.218-.379 1.11-1.855 5.444-5.231 1.98-1.778-1.825-.955-3.65 2.28-4.2-1.85.315-3.932-.205-4.503-2.246C.28 6.737 0 3.12 0 2.632 0 .186 2.145.955 3.468 1.948"
+
/>
+
</svg>
+
);
+
+
export default BlueskyIcon;
+159
lib/components/BlueskyPost.tsx
···
+
import React from 'react';
+
import { AtProtoRecord } from '../core/AtProtoRecord';
+
import { BlueskyPostRenderer } from '../renderers/BlueskyPostRenderer';
+
import type { FeedPostRecord, ProfileRecord } from '../types/bluesky';
+
import { useDidHandle } from '../hooks/useDidHandle';
+
import { useAtProtoRecord } from '../hooks/useAtProtoRecord';
+
import { useBlob } from '../hooks/useBlob';
+
import { BLUESKY_PROFILE_COLLECTION } from './BlueskyProfile';
+
import { getAvatarCid } from '../utils/profile';
+
+
/**
+
* Props for rendering a single Bluesky post with optional customization hooks.
+
*/
+
export interface BlueskyPostProps {
+
/**
+
* Decentralized identifier for the repository that owns the post.
+
*/
+
did: string;
+
/**
+
* Record key identifying the specific post within the collection.
+
*/
+
rkey: string;
+
/**
+
* Custom renderer component that receives resolved post data and status flags.
+
*/
+
renderer?: React.ComponentType<BlueskyPostRendererInjectedProps>;
+
/**
+
* React node shown while the post query has not yet produced data or an error.
+
*/
+
fallback?: React.ReactNode;
+
/**
+
* React node displayed while the post fetch is actively loading.
+
*/
+
loadingIndicator?: React.ReactNode;
+
/**
+
* Preferred color scheme to pass through to renderers.
+
*/
+
colorScheme?: 'light' | 'dark' | 'system';
+
/**
+
* Whether the default renderer should show the Bluesky icon.
+
* Defaults to `true`.
+
*/
+
showIcon?: boolean;
+
/**
+
* Placement strategy for the icon when it is rendered.
+
* Defaults to `'timestamp'`.
+
*/
+
iconPlacement?: 'cardBottomRight' | 'timestamp' | 'linkInline';
+
}
+
+
/**
+
* Values injected by `BlueskyPost` into a downstream renderer component.
+
*/
+
export type BlueskyPostRendererInjectedProps = {
+
/**
+
* Resolved record payload for the post.
+
*/
+
record: FeedPostRecord;
+
/**
+
* `true` while network operations are in-flight.
+
*/
+
loading: boolean;
+
/**
+
* Error encountered during loading, if any.
+
*/
+
error?: Error;
+
/**
+
* The author's public handle derived from the DID.
+
*/
+
authorHandle: string;
+
/**
+
* The DID that owns the post record.
+
*/
+
authorDid: string;
+
/**
+
* Resolved URL for the author's avatar blob, if available.
+
*/
+
avatarUrl?: string;
+
/**
+
* Preferred color scheme bubbled down to children.
+
*/
+
colorScheme?: 'light' | 'dark' | 'system';
+
/**
+
* Placement strategy for the Bluesky icon.
+
*/
+
iconPlacement?: 'cardBottomRight' | 'timestamp' | 'linkInline';
+
/**
+
* Controls whether the icon should render at all.
+
*/
+
showIcon?: boolean;
+
/**
+
* Fully qualified AT URI of the post.
+
*/
+
atUri: string;
+
/**
+
* Optional override for the rendered embed contents.
+
*/
+
embed?: React.ReactNode;
+
};
+
+
/** NSID for the canonical Bluesky feed post collection. */
+
export const BLUESKY_POST_COLLECTION = 'app.bsky.feed.post';
+
+
/**
+
* Fetches a Bluesky feed post, resolves metadata such as author handle and avatar,
+
* and renders it via a customizable renderer component.
+
*
+
* @param did - DID of the repository that stores the post.
+
* @param rkey - Record key for the post within the feed collection.
+
* @param renderer - Optional renderer component to override the default.
+
* @param fallback - Node rendered before the first fetch attempt resolves.
+
* @param loadingIndicator - Node rendered while the post is loading.
+
* @param colorScheme - Preferred color scheme forwarded to downstream components.
+
* @param showIcon - Controls whether the Bluesky icon should render alongside the post. Defaults to `true`.
+
* @param iconPlacement - Determines where the icon is positioned in the rendered post. Defaults to `'timestamp'`.
+
* @returns A component that renders loading/fallback states and the resolved post.
+
*/
+
export const BlueskyPost: React.FC<BlueskyPostProps> = ({ did, rkey, renderer, fallback, loadingIndicator, colorScheme, showIcon = true, iconPlacement = 'timestamp' }) => {
+
const { handle, loading: handleLoading } = useDidHandle(did);
+
const { record: profile } = useAtProtoRecord<ProfileRecord>({ did, collection: BLUESKY_PROFILE_COLLECTION, rkey: 'self' });
+
const avatarCid = getAvatarCid(profile);
+
const { url: avatarUrl } = useBlob(did, avatarCid);
+
+
const Comp: React.ComponentType<BlueskyPostRendererInjectedProps> = renderer ?? ((props) => <BlueskyPostRenderer {...props} />);
+
+
if (!handle && handleLoading) {
+
return <div style={{ padding: 8 }}>Resolving handle…</div>;
+
}
+
if (!handle) {
+
return <div style={{ padding: 8, color: 'crimson' }}>Could not resolve handle.</div>;
+
}
+
+
const atUri = `at://${did}/${BLUESKY_POST_COLLECTION}/${rkey}`;
+
+
const Wrapped: React.FC<{ record: FeedPostRecord; loading: boolean; error?: Error }> = (props) => (
+
<Comp
+
{...props}
+
authorHandle={handle}
+
authorDid={did}
+
avatarUrl={avatarUrl}
+
colorScheme={colorScheme}
+
iconPlacement={iconPlacement}
+
showIcon={showIcon}
+
atUri={atUri}
+
/>
+
);
+
return (
+
<AtProtoRecord<FeedPostRecord>
+
did={did}
+
collection={BLUESKY_POST_COLLECTION}
+
rkey={rkey}
+
renderer={Wrapped}
+
fallback={fallback}
+
loadingIndicator={loadingIndicator}
+
/>
+
);
+
};
+
+
export default BlueskyPost;
+421
lib/components/BlueskyPostList.tsx
···
+
import React, { useMemo } from 'react';
+
import { usePaginatedRecords } from '../hooks/usePaginatedRecords';
+
import { useColorScheme } from '../hooks/useColorScheme';
+
import type { FeedPostRecord } from '../types/bluesky';
+
import { useDidHandle } from '../hooks/useDidHandle';
+
import { BlueskyIcon } from './BlueskyIcon';
+
+
/**
+
* Options for rendering a paginated list of Bluesky posts.
+
*/
+
export interface BlueskyPostListProps {
+
/**
+
* DID whose feed posts should be fetched.
+
*/
+
did: string;
+
/**
+
* Maximum number of records to list per page. Defaults to `5`.
+
*/
+
limit?: number;
+
/**
+
* Enables pagination controls when `true`. Defaults to `true`.
+
*/
+
enablePagination?: boolean;
+
/**
+
* Preferred color scheme passed through to styling helpers.
+
* Defaults to `'system'` which follows the OS preference.
+
*/
+
colorScheme?: 'light' | 'dark' | 'system';
+
}
+
+
/**
+
* Fetches a DID's feed posts and renders them with rich pagination and theming.
+
*
+
* @param did - DID whose posts should be displayed.
+
* @param limit - Maximum number of posts per page. Default `5`.
+
* @param enablePagination - Whether pagination controls should render. Default `true`.
+
* @param colorScheme - Preferred color scheme used for styling. Default `'system'`.
+
* @returns A card-like list element with loading, empty, and error handling.
+
*/
+
export const BlueskyPostList: React.FC<BlueskyPostListProps> = ({ did, limit = 5, enablePagination = true, colorScheme = 'system' }) => {
+
const scheme = useColorScheme(colorScheme);
+
const palette: ListPalette = scheme === 'dark' ? darkPalette : lightPalette;
+
const { handle } = useDidHandle(did);
+
+
const { records, loading, error, hasNext, hasPrev, loadNext, loadPrev, pageIndex, pagesCount } = usePaginatedRecords<FeedPostRecord>({ did, collection: 'app.bsky.feed.post', limit });
+
+
const pageLabel = useMemo(() => {
+
const knownTotal = Math.max(pageIndex + 1, pagesCount);
+
if (!enablePagination) return undefined;
+
if (hasNext && knownTotal === pageIndex + 1) return `${pageIndex + 1}/…`;
+
return `${pageIndex + 1}/${knownTotal}`;
+
}, [enablePagination, hasNext, pageIndex, pagesCount]);
+
+
if (error) return <div style={{ padding: 8, color: 'crimson' }}>Failed to load posts.</div>;
+
+
return (
+
<div style={{ ...listStyles.card, ...palette.card }}>
+
<div style={{ ...listStyles.header, ...palette.header }}>
+
<div style={listStyles.headerInfo}>
+
<div style={listStyles.headerIcon}>
+
<BlueskyIcon size={20} />
+
</div>
+
<div style={listStyles.headerText}>
+
<span style={listStyles.title}>Latest Posts</span>
+
<span style={{ ...listStyles.subtitle, ...palette.subtitle }}>@{handle ?? formatDid(did)}</span>
+
</div>
+
</div>
+
{pageLabel && <span style={{ ...listStyles.pageMeta, ...palette.pageMeta }}>{pageLabel}</span>}
+
</div>
+
<div style={listStyles.items}>
+
{loading && records.length === 0 && <div style={{ ...listStyles.empty, ...palette.empty }}>Loading posts…</div>}
+
{records.map((record, idx) => (
+
<ListRow
+
key={record.rkey}
+
record={record.value}
+
rkey={record.rkey}
+
did={did}
+
palette={palette}
+
hasDivider={idx < records.length - 1}
+
/>
+
))}
+
{!loading && records.length === 0 && <div style={{ ...listStyles.empty, ...palette.empty }}>No posts found.</div>}
+
</div>
+
{enablePagination && (
+
<div style={{ ...listStyles.footer, ...palette.footer }}>
+
<button
+
type="button"
+
style={{
+
...listStyles.navButton,
+
...palette.navButton,
+
cursor: hasPrev ? 'pointer' : 'not-allowed',
+
opacity: hasPrev ? 1 : 0.5
+
}}
+
onClick={loadPrev}
+
disabled={!hasPrev}
+
>
+
‹ Prev
+
</button>
+
<div style={listStyles.pageChips}>
+
<span style={{ ...listStyles.pageChipActive, ...palette.pageChipActive }}>{pageIndex + 1}</span>
+
{(hasNext || pagesCount > pageIndex + 1) && (
+
<span style={{ ...listStyles.pageChip, ...palette.pageChip }}>{pageIndex + 2}</span>
+
)}
+
</div>
+
<button
+
type="button"
+
style={{
+
...listStyles.navButton,
+
...palette.navButton,
+
cursor: hasNext ? 'pointer' : 'not-allowed',
+
opacity: hasNext ? 1 : 0.5
+
}}
+
onClick={loadNext}
+
disabled={!hasNext}
+
>
+
Next ›
+
</button>
+
</div>
+
)}
+
{loading && records.length > 0 && <div style={{ ...listStyles.loadingBar, ...palette.loadingBar }}>Updating…</div>}
+
</div>
+
);
+
};
+
+
interface ListRowProps {
+
record: FeedPostRecord;
+
rkey: string;
+
did: string;
+
palette: ListPalette;
+
hasDivider: boolean;
+
}
+
+
const ListRow: React.FC<ListRowProps> = ({ record, rkey, did, palette, hasDivider }) => {
+
const text = record.text?.trim() ?? '';
+
const relative = record.createdAt ? formatRelativeTime(record.createdAt) : undefined;
+
const absolute = record.createdAt ? new Date(record.createdAt).toLocaleString() : undefined;
+
const href = `https://bsky.app/profile/${did}/post/${rkey}`;
+
+
return (
+
<a href={href} target="_blank" rel="noopener noreferrer" style={{ ...listStyles.row, ...palette.row, borderBottom: hasDivider ? `1px solid ${palette.divider}` : 'none' }}>
+
{relative && (
+
<span style={{ ...listStyles.rowTime, ...palette.rowTime }} title={absolute}>
+
{relative}
+
</span>
+
)}
+
{text && <p style={{ ...listStyles.rowBody, ...palette.rowBody }}>{text}</p>}
+
{!text && <p style={{ ...listStyles.rowBody, ...palette.rowBody, fontStyle: 'italic' }}>No text content.</p>}
+
</a>
+
);
+
};
+
+
function formatDid(did: string) {
+
return did.replace(/^did:(plc:)?/, '');
+
}
+
+
function formatRelativeTime(iso: string): string {
+
const date = new Date(iso);
+
const diffSeconds = (date.getTime() - Date.now()) / 1000;
+
const absSeconds = Math.abs(diffSeconds);
+
const thresholds: Array<{ limit: number; unit: Intl.RelativeTimeFormatUnit; divisor: number }> = [
+
{ limit: 60, unit: 'second', divisor: 1 },
+
{ limit: 3600, unit: 'minute', divisor: 60 },
+
{ limit: 86400, unit: 'hour', divisor: 3600 },
+
{ limit: 604800, unit: 'day', divisor: 86400 },
+
{ limit: 2629800, unit: 'week', divisor: 604800 },
+
{ limit: 31557600, unit: 'month', divisor: 2629800 },
+
{ limit: Infinity, unit: 'year', divisor: 31557600 }
+
];
+
const threshold = thresholds.find(t => absSeconds < t.limit) ?? thresholds[thresholds.length - 1];
+
const value = diffSeconds / threshold.divisor;
+
const rtf = new Intl.RelativeTimeFormat('en', { numeric: 'auto' });
+
return rtf.format(Math.round(value), threshold.unit);
+
}
+
+
interface ListPalette {
+
card: { background: string; borderColor: string };
+
header: { borderBottomColor: string; color: string };
+
pageMeta: { color: string };
+
subtitle: { color: string };
+
empty: { color: string };
+
row: { color: string };
+
rowTime: { color: string };
+
rowBody: { color: string };
+
divider: string;
+
footer: { borderTopColor: string; color: string };
+
navButton: { color: string; background: string };
+
pageChip: { color: string; borderColor: string; background: string };
+
pageChipActive: { color: string; background: string; borderColor: string };
+
loadingBar: { color: string };
+
}
+
+
const listStyles = {
+
card: {
+
borderRadius: 16,
+
border: '1px solid transparent',
+
boxShadow: '0 8px 18px -12px rgba(15, 23, 42, 0.25)',
+
overflow: 'hidden',
+
display: 'flex',
+
flexDirection: 'column'
+
} satisfies React.CSSProperties,
+
header: {
+
display: 'flex',
+
alignItems: 'center',
+
justifyContent: 'space-between',
+
padding: '14px 18px',
+
fontSize: 14,
+
fontWeight: 500,
+
borderBottom: '1px solid transparent'
+
} satisfies React.CSSProperties,
+
headerInfo: {
+
display: 'flex',
+
alignItems: 'center',
+
gap: 12
+
} satisfies React.CSSProperties,
+
headerIcon: {
+
width: 28,
+
height: 28,
+
display: 'flex',
+
alignItems: 'center',
+
justifyContent: 'center',
+
//background: 'rgba(17, 133, 254, 0.14)',
+
borderRadius: '50%'
+
} satisfies React.CSSProperties,
+
headerText: {
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 2
+
} satisfies React.CSSProperties,
+
title: {
+
fontSize: 15,
+
fontWeight: 600
+
} satisfies React.CSSProperties,
+
subtitle: {
+
fontSize: 12,
+
fontWeight: 500
+
} satisfies React.CSSProperties,
+
pageMeta: {
+
fontSize: 12
+
} satisfies React.CSSProperties,
+
items: {
+
display: 'flex',
+
flexDirection: 'column'
+
} satisfies React.CSSProperties,
+
empty: {
+
padding: '24px 18px',
+
fontSize: 13,
+
textAlign: 'center'
+
} satisfies React.CSSProperties,
+
row: {
+
padding: '18px',
+
textDecoration: 'none',
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 6,
+
transition: 'background-color 120ms ease'
+
} satisfies React.CSSProperties,
+
rowHeader: {
+
display: 'flex',
+
gap: 6,
+
alignItems: 'baseline',
+
fontSize: 13
+
} satisfies React.CSSProperties,
+
rowTime: {
+
fontSize: 12,
+
fontWeight: 500
+
} satisfies React.CSSProperties,
+
rowBody: {
+
margin: 0,
+
whiteSpace: 'pre-wrap',
+
fontSize: 14,
+
lineHeight: 1.45
+
} satisfies React.CSSProperties,
+
footer: {
+
display: 'flex',
+
alignItems: 'center',
+
justifyContent: 'space-between',
+
padding: '12px 18px',
+
borderTop: '1px solid transparent',
+
fontSize: 13
+
} satisfies React.CSSProperties,
+
navButton: {
+
border: 'none',
+
borderRadius: 999,
+
padding: '6px 12px',
+
fontSize: 13,
+
fontWeight: 500,
+
background: 'transparent',
+
display: 'flex',
+
alignItems: 'center',
+
gap: 4,
+
transition: 'background-color 120ms ease'
+
} satisfies React.CSSProperties,
+
pageChips: {
+
display: 'flex',
+
gap: 6,
+
alignItems: 'center'
+
} satisfies React.CSSProperties,
+
pageChip: {
+
padding: '4px 10px',
+
borderRadius: 999,
+
fontSize: 13,
+
border: '1px solid transparent'
+
} satisfies React.CSSProperties,
+
pageChipActive: {
+
padding: '4px 10px',
+
borderRadius: 999,
+
fontSize: 13,
+
fontWeight: 600,
+
border: '1px solid transparent'
+
} satisfies React.CSSProperties,
+
loadingBar: {
+
padding: '4px 18px 14px',
+
fontSize: 12,
+
textAlign: 'right',
+
color: '#64748b'
+
} satisfies React.CSSProperties
+
};
+
+
const lightPalette: ListPalette = {
+
card: {
+
background: '#ffffff',
+
borderColor: '#e2e8f0'
+
},
+
header: {
+
borderBottomColor: '#e2e8f0',
+
color: '#0f172a'
+
},
+
pageMeta: {
+
color: '#64748b'
+
},
+
subtitle: {
+
color: '#475569'
+
},
+
empty: {
+
color: '#64748b'
+
},
+
row: {
+
color: '#0f172a'
+
},
+
rowTime: {
+
color: '#94a3b8'
+
},
+
rowBody: {
+
color: '#0f172a'
+
},
+
divider: '#e2e8f0',
+
footer: {
+
borderTopColor: '#e2e8f0',
+
color: '#0f172a'
+
},
+
navButton: {
+
color: '#0f172a',
+
background: '#f1f5f9'
+
},
+
pageChip: {
+
color: '#475569',
+
borderColor: '#e2e8f0',
+
background: '#ffffff'
+
},
+
pageChipActive: {
+
color: '#ffffff',
+
background: '#0f172a',
+
borderColor: '#0f172a'
+
},
+
loadingBar: {
+
color: '#64748b'
+
}
+
};
+
+
const darkPalette: ListPalette = {
+
card: {
+
background: '#0f172a',
+
borderColor: '#1e293b'
+
},
+
header: {
+
borderBottomColor: '#1e293b',
+
color: '#e2e8f0'
+
},
+
pageMeta: {
+
color: '#94a3b8'
+
},
+
subtitle: {
+
color: '#94a3b8'
+
},
+
empty: {
+
color: '#94a3b8'
+
},
+
row: {
+
color: '#e2e8f0'
+
},
+
rowTime: {
+
color: '#94a3b8'
+
},
+
rowBody: {
+
color: '#e2e8f0'
+
},
+
divider: '#1e293b',
+
footer: {
+
borderTopColor: '#1e293b',
+
color: '#e2e8f0'
+
},
+
navButton: {
+
color: '#e2e8f0',
+
background: '#111c31'
+
},
+
pageChip: {
+
color: '#cbd5f5',
+
borderColor: '#1e293b',
+
background: '#0f172a'
+
},
+
pageChipActive: {
+
color: '#0f172a',
+
background: '#38bdf8',
+
borderColor: '#38bdf8'
+
},
+
loadingBar: {
+
color: '#94a3b8'
+
}
+
};
+
+
export default BlueskyPostList;
+112
lib/components/BlueskyProfile.tsx
···
+
import React from 'react';
+
import { AtProtoRecord } from '../core/AtProtoRecord';
+
import { BlueskyProfileRenderer } from '../renderers/BlueskyProfileRenderer';
+
import type { ProfileRecord } from '../types/bluesky';
+
import { useBlob } from '../hooks/useBlob';
+
import { getAvatarCid } from '../utils/profile';
+
+
/**
+
* Props used to render a Bluesky actor profile record.
+
*/
+
export interface BlueskyProfileProps {
+
/**
+
* DID of the target actor whose profile should be loaded.
+
*/
+
did: string;
+
/**
+
* Record key within the profile collection. Typically `'self'`.
+
*/
+
rkey?: string;
+
/**
+
* Optional renderer override for custom presentation.
+
*/
+
renderer?: React.ComponentType<BlueskyProfileRendererInjectedProps>;
+
/**
+
* Fallback node shown before a request begins yielding data.
+
*/
+
fallback?: React.ReactNode;
+
/**
+
* Loading indicator shown during in-flight fetches.
+
*/
+
loadingIndicator?: React.ReactNode;
+
/**
+
* Pre-resolved handle to display when available externally.
+
*/
+
handle?: string;
+
/**
+
* Preferred color scheme forwarded to renderer implementations.
+
*/
+
colorScheme?: 'light' | 'dark' | 'system';
+
}
+
+
/**
+
* Props injected into custom profile renderer implementations.
+
*/
+
export type BlueskyProfileRendererInjectedProps = {
+
/**
+
* Loaded profile record value.
+
*/
+
record: ProfileRecord;
+
/**
+
* Indicates whether the record is currently being fetched.
+
*/
+
loading: boolean;
+
/**
+
* Any error encountered while fetching the profile.
+
*/
+
error?: Error;
+
/**
+
* DID associated with the profile.
+
*/
+
did: string;
+
/**
+
* Human-readable handle for the DID, when known.
+
*/
+
handle?: string;
+
/**
+
* Blob URL for the user's avatar, when available.
+
*/
+
avatarUrl?: string;
+
/**
+
* Preferred color scheme for theming downstream components.
+
*/
+
colorScheme?: 'light' | 'dark' | 'system';
+
};
+
+
/** NSID for the canonical Bluesky profile collection. */
+
export const BLUESKY_PROFILE_COLLECTION = 'app.bsky.actor.profile';
+
+
/**
+
* Fetches and renders a Bluesky actor profile, optionally injecting custom presentation
+
* and providing avatar resolution support.
+
*
+
* @param did - DID whose profile record should be fetched.
+
* @param rkey - Record key within the profile collection (default `'self'`).
+
* @param renderer - Optional component override for custom rendering.
+
* @param fallback - Node rendered prior to loading state initialization.
+
* @param loadingIndicator - Node rendered while the profile request is in-flight.
+
* @param handle - Optional pre-resolved handle to display.
+
* @param colorScheme - Preferred color scheme forwarded to the renderer.
+
* @returns A rendered profile component with loading/error states handled.
+
*/
+
export const BlueskyProfile: React.FC<BlueskyProfileProps> = ({ did, rkey = 'self', renderer, fallback, loadingIndicator, handle, colorScheme }) => {
+
const Component: React.ComponentType<BlueskyProfileRendererInjectedProps> = renderer ?? ((props) => <BlueskyProfileRenderer {...props} />);
+
+
const Wrapped: React.FC<{ record: ProfileRecord; loading: boolean; error?: Error }> = (props) => {
+
const avatarCid = getAvatarCid(props.record);
+
const { url: avatarUrl } = useBlob(did, avatarCid);
+
return <Component {...props} did={did} handle={handle} avatarUrl={avatarUrl} colorScheme={colorScheme} />;
+
};
+
return (
+
<AtProtoRecord<ProfileRecord>
+
did={did}
+
collection={BLUESKY_PROFILE_COLLECTION}
+
rkey={rkey}
+
renderer={Wrapped}
+
fallback={fallback}
+
loadingIndicator={loadingIndicator}
+
/>
+
);
+
};
+
+
export default BlueskyProfile;
+110
lib/components/BlueskyQuotePost.tsx
···
+
import React, { useMemo } from 'react';
+
import { BlueskyPost, type BlueskyPostRendererInjectedProps, BLUESKY_POST_COLLECTION } from './BlueskyPost';
+
import { BlueskyPostRenderer } from '../renderers/BlueskyPostRenderer';
+
import type { FeedPostRecord } from '../types/bluesky';
+
import { parseAtUri } from '../utils/at-uri';
+
+
/**
+
* Props for rendering a Bluesky post that quotes another Bluesky post.
+
*/
+
export interface BlueskyQuotePostProps {
+
/**
+
* DID of the repository that owns the parent post.
+
*/
+
did: string;
+
/**
+
* Record key of the parent post.
+
*/
+
rkey: string;
+
/**
+
* Preferred color scheme propagated to nested renders.
+
*/
+
colorScheme?: 'light' | 'dark' | 'system';
+
/**
+
* Custom renderer override applied to the parent post.
+
*/
+
renderer?: React.ComponentType<BlueskyPostRendererInjectedProps>;
+
/**
+
* Fallback content rendered before any request completes.
+
*/
+
fallback?: React.ReactNode;
+
/**
+
* Loading indicator rendered while the parent post is resolving.
+
*/
+
loadingIndicator?: React.ReactNode;
+
/**
+
* Controls whether the Bluesky icon is shown. Defaults to `true`.
+
*/
+
showIcon?: boolean;
+
/**
+
* Placement for the Bluesky icon. Defaults to `'timestamp'`.
+
*/
+
iconPlacement?: 'cardBottomRight' | 'timestamp' | 'linkInline';
+
}
+
+
/**
+
* Renders a Bluesky post while embedding its quoted post inline via a nested `BlueskyPost`.
+
*
+
* @param did - DID that owns the quoted parent post.
+
* @param rkey - Record key identifying the parent post.
+
* @param colorScheme - Preferred color scheme for both parent and quoted posts.
+
* @param renderer - Optional renderer override applied to the parent post.
+
* @param fallback - Node rendered before parent post data loads.
+
* @param loadingIndicator - Node rendered while the parent post request is in-flight.
+
* @param showIcon - Controls whether the Bluesky icon renders. Defaults to `true`.
+
* @param iconPlacement - Placement location for the icon. Defaults to `'timestamp'`.
+
* @returns A `BlueskyPost` element configured with an augmented renderer.
+
*/
+
export const BlueskyQuotePost: React.FC<BlueskyQuotePostProps> = ({ did, rkey, colorScheme, renderer, fallback, loadingIndicator, showIcon = true, iconPlacement = 'timestamp' }) => {
+
const BaseRenderer = renderer ?? BlueskyPostRenderer;
+
const Renderer = useMemo(() => {
+
const QuoteRenderer: React.FC<BlueskyPostRendererInjectedProps> = (props) => {
+
const embedNode = createQuoteEmbed(props.record, props.colorScheme ?? colorScheme);
+
return <BaseRenderer {...props} embed={embedNode} />;
+
};
+
QuoteRenderer.displayName = 'BlueskyQuotePostRenderer';
+
return QuoteRenderer;
+
}, [BaseRenderer, colorScheme]);
+
+
return (
+
<BlueskyPost
+
did={did}
+
rkey={rkey}
+
colorScheme={colorScheme}
+
renderer={Renderer}
+
fallback={fallback}
+
loadingIndicator={loadingIndicator}
+
showIcon={showIcon}
+
iconPlacement={iconPlacement}
+
/>
+
);
+
};
+
+
/**
+
* Builds the quoted post embed node when the parent record contains a record embed.
+
*
+
* @param record - Feed post containing a possible quote reference.
+
* @param colorScheme - Desired visual theme for the nested quote.
+
* @returns A nested `BlueskyPost` or `null` if no compatible embed exists.
+
*/
+
function createQuoteEmbed(record: FeedPostRecord, colorScheme?: 'light' | 'dark' | 'system') {
+
const embed = record.embed as { $type?: string; record?: { uri?: string } } | undefined;
+
if (!embed || embed.$type !== 'app.bsky.embed.record') return null;
+
const quoted = embed.record;
+
const quotedUri = quoted?.uri;
+
const parsed = parseAtUri(quotedUri);
+
if (!parsed || parsed.collection !== BLUESKY_POST_COLLECTION) return null;
+
return (
+
<div style={quoteWrapperStyle}>
+
<BlueskyPost did={parsed.did} rkey={parsed.rkey} colorScheme={colorScheme} showIcon={false} />
+
</div>
+
);
+
}
+
+
const quoteWrapperStyle: React.CSSProperties = {
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 8
+
};
+
+
export default BlueskyQuotePost;
+116
lib/components/ColorSchemeToggle.tsx
···
+
import React from 'react';
+
import type { ColorSchemePreference } from '../hooks/useColorScheme';
+
+
/**
+
* Props for the `ColorSchemeToggle` segmented control.
+
*/
+
export interface ColorSchemeToggleProps {
+
/**
+
* Current color scheme preference selection.
+
*/
+
value: ColorSchemePreference;
+
/**
+
* Change handler invoked when the user selects a new scheme.
+
*/
+
onChange: (value: ColorSchemePreference) => void;
+
/**
+
* Theme used to style the control itself; defaults to `'light'`.
+
*/
+
scheme?: 'light' | 'dark';
+
}
+
+
const options: Array<{ label: string; value: ColorSchemePreference; description: string }> = [
+
{ label: 'System', value: 'system', description: 'Follow OS preference' },
+
{ label: 'Light', value: 'light', description: 'Always light mode' },
+
{ label: 'Dark', value: 'dark', description: 'Always dark mode' }
+
];
+
+
/**
+
* A button group that lets users choose between light, dark, or system color modes.
+
*
+
* @param value - Current scheme selection displayed as active.
+
* @param onChange - Callback fired when a new option is selected.
+
* @param scheme - Theme used to style the control itself. Defaults to `'light'`.
+
* @returns A fully keyboard-accessible toggle rendered as a radio group.
+
*/
+
export const ColorSchemeToggle: React.FC<ColorSchemeToggleProps> = ({ value, onChange, scheme = 'light' }) => {
+
const palette = scheme === 'dark' ? darkTheme : lightTheme;
+
+
return (
+
<div aria-label="Color scheme" role="radiogroup" style={{ ...containerStyle, ...palette.container }}>
+
{options.map(option => {
+
const isActive = option.value === value;
+
const activeStyles = isActive ? palette.active : undefined;
+
return (
+
<button
+
key={option.value}
+
role="radio"
+
aria-checked={isActive}
+
type="button"
+
onClick={() => onChange(option.value)}
+
style={{
+
...buttonStyle,
+
...palette.button,
+
...(activeStyles ?? {})
+
}}
+
title={option.description}
+
>
+
{option.label}
+
</button>
+
);
+
})}
+
</div>
+
);
+
};
+
+
const containerStyle: React.CSSProperties = {
+
display: 'inline-flex',
+
borderRadius: 999,
+
padding: 4,
+
gap: 4,
+
border: '1px solid transparent',
+
background: '#f8fafc'
+
};
+
+
const buttonStyle: React.CSSProperties = {
+
border: '1px solid transparent',
+
borderRadius: 999,
+
padding: '4px 12px',
+
fontSize: 12,
+
fontWeight: 500,
+
cursor: 'pointer',
+
background: 'transparent',
+
transition: 'background-color 160ms ease, border-color 160ms ease, color 160ms ease'
+
};
+
+
const lightTheme = {
+
container: {
+
borderColor: '#e2e8f0',
+
background: 'rgba(241, 245, 249, 0.8)'
+
},
+
button: {
+
color: '#334155'
+
},
+
active: {
+
background: '#2563eb',
+
borderColor: '#2563eb',
+
color: '#f8fafc'
+
}
+
} satisfies Record<string, React.CSSProperties>;
+
+
const darkTheme = {
+
container: {
+
borderColor: '#2e3540ff',
+
background: 'rgba(30, 38, 49, 0.6)'
+
},
+
button: {
+
color: '#e2e8f0'
+
},
+
active: {
+
background: '#38bdf8',
+
borderColor: '#38bdf8',
+
color: '#020617'
+
}
+
} satisfies Record<string, React.CSSProperties>;
+
+
export default ColorSchemeToggle;
+117
lib/components/LeafletDocument.tsx
···
+
import React, { useMemo } from 'react';
+
import { AtProtoRecord } from '../core/AtProtoRecord';
+
import { LeafletDocumentRenderer, type LeafletDocumentRendererProps } from '../renderers/LeafletDocumentRenderer';
+
import type { LeafletDocumentRecord, LeafletPublicationRecord } from '../types/leaflet';
+
import type { ColorSchemePreference } from '../hooks/useColorScheme';
+
import { parseAtUri, toBlueskyPostUrl, leafletRkeyUrl, normalizeLeafletBasePath } from '../utils/at-uri';
+
import { useAtProtoRecord } from '../hooks/useAtProtoRecord';
+
+
/**
+
* Props for rendering a Leaflet document record.
+
*/
+
export interface LeafletDocumentProps {
+
/**
+
* DID of the Leaflet publisher.
+
*/
+
did: string;
+
/**
+
* Record key of the document within the Leaflet collection.
+
*/
+
rkey: string;
+
/**
+
* Optional custom renderer for advanced layouts.
+
*/
+
renderer?: React.ComponentType<LeafletDocumentRendererInjectedProps>;
+
/**
+
* React node rendered before data begins loading.
+
*/
+
fallback?: React.ReactNode;
+
/**
+
* Indicator rendered while data is being fetched from the PDS.
+
*/
+
loadingIndicator?: React.ReactNode;
+
/**
+
* Preferred color scheme to forward to the renderer.
+
*/
+
colorScheme?: ColorSchemePreference;
+
}
+
+
/**
+
* Props provided to renderer overrides for Leaflet documents.
+
*/
+
export type LeafletDocumentRendererInjectedProps = LeafletDocumentRendererProps;
+
+
/** NSID for Leaflet document records. */
+
export const LEAFLET_DOCUMENT_COLLECTION = 'pub.leaflet.document';
+
+
/**
+
* Loads a Leaflet document along with its associated publication record and renders it
+
* using the provided or default renderer.
+
*
+
* @param did - DID of the Leaflet publisher.
+
* @param rkey - Record key of the Leaflet document.
+
* @param renderer - Optional renderer override used in place of the default.
+
* @param fallback - Node rendered before loading begins.
+
* @param loadingIndicator - Node rendered while the document or publication records are loading.
+
* @param colorScheme - Preferred color scheme forwarded to the renderer.
+
* @returns A JSX subtree that renders a Leaflet document with contextual metadata.
+
*/
+
export const LeafletDocument: React.FC<LeafletDocumentProps> = ({ did, rkey, renderer, fallback, loadingIndicator, colorScheme }) => {
+
const Comp: React.ComponentType<LeafletDocumentRendererInjectedProps> = renderer ?? ((props) => <LeafletDocumentRenderer {...props} />);
+
+
const Wrapped: React.FC<{ record: LeafletDocumentRecord; loading: boolean; error?: Error }> = (props) => {
+
const publicationUri = useMemo(() => parseAtUri(props.record.publication), [props.record.publication]);
+
const { record: publicationRecord } = useAtProtoRecord<LeafletPublicationRecord>({
+
did: publicationUri?.did,
+
collection: publicationUri?.collection ?? 'pub.leaflet.publication',
+
rkey: publicationUri?.rkey ?? ''
+
});
+
const publicationBaseUrl = normalizeLeafletBasePath(publicationRecord?.base_path);
+
const canonicalUrl = resolveCanonicalUrl(props.record, did, rkey, publicationRecord?.base_path);
+
return (
+
<Comp
+
{...props}
+
colorScheme={colorScheme}
+
did={did}
+
rkey={rkey}
+
canonicalUrl={canonicalUrl}
+
publicationBaseUrl={publicationBaseUrl}
+
publicationRecord={publicationRecord}
+
/>
+
);
+
};
+
+
return (
+
<AtProtoRecord<LeafletDocumentRecord>
+
did={did}
+
collection={LEAFLET_DOCUMENT_COLLECTION}
+
rkey={rkey}
+
renderer={Wrapped}
+
fallback={fallback}
+
loadingIndicator={loadingIndicator}
+
/>
+
);
+
};
+
+
/**
+
* Determines the best canonical URL to expose for a Leaflet document.
+
*
+
* @param record - Leaflet document record under review.
+
* @param did - Publisher DID.
+
* @param rkey - Record key for the document.
+
* @param publicationBasePath - Optional base path configured by the publication.
+
* @returns A URL to use for canonical links.
+
*/
+
function resolveCanonicalUrl(record: LeafletDocumentRecord, did: string, rkey: string, publicationBasePath?: string): string {
+
const publicationUrl = leafletRkeyUrl(publicationBasePath, rkey);
+
if (publicationUrl) return publicationUrl;
+
const postUri = record.postRef?.uri;
+
if (postUri) {
+
const parsed = parseAtUri(postUri);
+
const href = parsed ? toBlueskyPostUrl(parsed) : undefined;
+
if (href) return href;
+
}
+
return `https://bsky.app/leaflet/${encodeURIComponent(did)}/${encodeURIComponent(rkey)}`;
+
}
+
+
export default LeafletDocument;
+81
lib/components/TangledString.tsx
···
+
import React from 'react';
+
import { AtProtoRecord } from '../core/AtProtoRecord';
+
import { TangledStringRenderer } from '../renderers/TangledStringRenderer';
+
import type { TangledStringRecord } from '../renderers/TangledStringRenderer';
+
+
/**
+
* Props for rendering Tangled String records.
+
*/
+
export interface TangledStringProps {
+
/** DID of the repository that stores the string record. */
+
did: string;
+
/** Record key within the `sh.tangled.string` collection. */
+
rkey: string;
+
/** Optional renderer override for custom presentation. */
+
renderer?: React.ComponentType<TangledStringRendererInjectedProps>;
+
/** Fallback node displayed before loading begins. */
+
fallback?: React.ReactNode;
+
/** Indicator node shown while data is loading. */
+
loadingIndicator?: React.ReactNode;
+
/** Preferred color scheme for theming. */
+
colorScheme?: 'light' | 'dark' | 'system';
+
}
+
+
/**
+
* Values injected into custom Tangled String renderer implementations.
+
*/
+
export type TangledStringRendererInjectedProps = {
+
/** Loaded Tangled String record value. */
+
record: TangledStringRecord;
+
/** Indicates whether the record is currently loading. */
+
loading: boolean;
+
/** Fetch error, if any. */
+
error?: Error;
+
/** Preferred color scheme for downstream components. */
+
colorScheme?: 'light' | 'dark' | 'system';
+
/** DID associated with the record. */
+
did: string;
+
/** Record key for the string. */
+
rkey: string;
+
/** Canonical external URL for linking to the string. */
+
canonicalUrl: string;
+
};
+
+
/** NSID for Tangled String records. */
+
export const TANGLED_COLLECTION = 'sh.tangled.string';
+
+
/**
+
* Resolves a Tangled String record and renders it with optional overrides while computing a canonical link.
+
*
+
* @param did - DID whose Tangled String should be fetched.
+
* @param rkey - Record key within the Tangled String collection.
+
* @param renderer - Optional component override that will receive injected props.
+
* @param fallback - Node rendered before the first load begins.
+
* @param loadingIndicator - Node rendered while the Tangled String is loading.
+
* @param colorScheme - Preferred color scheme for theming the renderer.
+
* @returns A JSX subtree representing the Tangled String record with loading states handled.
+
*/
+
export const TangledString: React.FC<TangledStringProps> = ({ did, rkey, renderer, fallback, loadingIndicator, colorScheme }) => {
+
const Comp: React.ComponentType<TangledStringRendererInjectedProps> = renderer ?? ((props) => <TangledStringRenderer {...props} />);
+
const Wrapped: React.FC<{ record: TangledStringRecord; loading: boolean; error?: Error }> = (props) => (
+
<Comp
+
{...props}
+
colorScheme={colorScheme}
+
did={did}
+
rkey={rkey}
+
canonicalUrl={`https://tangled.org/strings/${did}/${encodeURIComponent(rkey)}`}
+
/>
+
);
+
return (
+
<AtProtoRecord<TangledStringRecord>
+
did={did}
+
collection={TANGLED_COLLECTION}
+
rkey={rkey}
+
renderer={Wrapped}
+
fallback={fallback}
+
loadingIndicator={loadingIndicator}
+
/>
+
);
+
};
+
+
export default TangledString;
+25
lib/core/AtProtoRecord.tsx
···
+
import React from 'react';
+
import { useAtProtoRecord } from '../hooks/useAtProtoRecord';
+
import { useDidResolution } from '../hooks/useDidResolution';
+
+
export interface AtProtoRecordProps<T = unknown> {
+
did: string;
+
collection: string;
+
rkey: string;
+
renderer?: React.ComponentType<{ record: T; loading: boolean; error?: Error }>;
+
fallback?: React.ReactNode;
+
loadingIndicator?: React.ReactNode;
+
}
+
+
export function AtProtoRecord<T = unknown>({ did: handleOrDid, collection, rkey, renderer: Renderer, fallback = null, loadingIndicator = 'Loading…' }: AtProtoRecordProps<T>) {
+
const { did, error: resolutionError, loading: resolving } = useDidResolution(handleOrDid);
+
const { record, error: recordError, loading: recordLoading } = useAtProtoRecord<T>({ did, collection, rkey });
+
+
const loading = resolving || recordLoading;
+
const error = resolutionError || recordError;
+
+
if (error) return <>{fallback}</>;
+
if (!record) return <>{loading ? loadingIndicator : fallback}</>;
+
if (Renderer) return <Renderer record={record} loading={loading} error={error} />;
+
return <pre style={{ fontSize: 12, padding: 8, background: '#f5f5f5', overflow: 'auto' }}>{JSON.stringify(record, null, 2)}</pre>;
+
}
+65
lib/hooks/useAtProtoRecord.ts
···
+
import { useEffect, useState } from 'react';
+
import { usePdsEndpoint } from './usePdsEndpoint';
+
import { createAtprotoClient } from '../utils/atproto-client';
+
+
/**
+
* Identifier trio required to address an AT Protocol record.
+
*/
+
export interface AtProtoRecordKey {
+
/** Repository DID (or handle prior to resolution) containing the record. */
+
did?: string;
+
/** NSID collection in which the record resides. */
+
collection: string;
+
/** Record key string uniquely identifying the record within the collection. */
+
rkey: string;
+
}
+
+
/**
+
* Loading state returned by {@link useAtProtoRecord}.
+
*/
+
export interface AtProtoRecordState<T = unknown> {
+
/** Resolved record value when fetch succeeds. */
+
record?: T;
+
/** Error thrown while loading, if any. */
+
error?: Error;
+
/** Indicates whether the hook is in a loading state. */
+
loading: boolean;
+
}
+
+
/**
+
* React hook that fetches a single AT Protocol record and tracks loading/error state.
+
*
+
* @param did - DID (or handle before resolution) that owns the record.
+
* @param collection - NSID collection from which to fetch the record.
+
* @param rkey - Record key identifying the record within the collection.
+
* @returns {AtProtoRecordState<T>} Object containing the resolved record, any error, and a loading flag.
+
*/
+
export function useAtProtoRecord<T = unknown>({ did, collection, rkey }: AtProtoRecordKey): AtProtoRecordState<T> {
+
const { endpoint, error: endpointError } = usePdsEndpoint(did);
+
const [state, setState] = useState<AtProtoRecordState<T>>({ loading: !!did });
+
+
useEffect(() => {
+
let cancelled = false;
+
async function load() {
+
if (!did || !endpoint) return;
+
setState(s => ({ ...s, loading: true }));
+
try {
+
const { rpc } = await createAtprotoClient({ service: endpoint });
+
// Type of getRecord lexicon not available in generic Client here, so cast through unknown.
+
const res = await (rpc as unknown as { get: (nsid: string, opts: { params: { repo: string; collection: string; rkey: string } }) => Promise<{ ok: boolean; data: { value: T } }> }).get('com.atproto.repo.getRecord', {
+
params: { repo: did, collection, rkey }
+
});
+
if (!res.ok) throw new Error('Failed to load record');
+
const record = (res.data as { value: T }).value;
+
if (!cancelled) setState({ record, loading: false });
+
} catch (e) {
+
if (!cancelled) setState({ error: e as Error, loading: false });
+
}
+
}
+
load();
+
return () => { cancelled = true; };
+
}, [did, endpoint, collection, rkey]);
+
+
if (endpointError && !state.error) return { ...state, error: endpointError };
+
return state;
+
}
+51
lib/hooks/useBlob.ts
···
+
import { useEffect, useState } from 'react';
+
import { usePdsEndpoint } from './usePdsEndpoint';
+
+
/**
+
* Status returned by {@link useBlob} containing blob URL and metadata flags.
+
*/
+
export interface UseBlobState {
+
/** Object URL pointing to the fetched blob, when available. */
+
url?: string;
+
/** Indicates whether a fetch is in progress. */
+
loading: boolean;
+
/** Error encountered while fetching the blob. */
+
error?: Error;
+
}
+
+
/**
+
* Fetches a blob from the DID's PDS, exposes it as an object URL, and cleans up on unmount.
+
*
+
* @param did - DID whose PDS hosts the blob.
+
* @param cid - Content identifier for the desired blob.
+
* @returns {UseBlobState} Object containing the object URL, loading flag, and any error.
+
*/
+
export function useBlob(did: string | undefined, cid: string | undefined): UseBlobState {
+
const { endpoint } = usePdsEndpoint(did);
+
const [state, setState] = useState<UseBlobState>({ loading: !!(did && cid) });
+
+
useEffect(() => {
+
let cancelled = false;
+
let objectUrl: string | undefined;
+
async function run() {
+
if (!did || !cid || !endpoint) { setState({ loading: false }); return; }
+
setState(s => ({ ...s, loading: true }));
+
try {
+
const res = await fetch(`${endpoint}/xrpc/com.atproto.sync.getBlob?did=${encodeURIComponent(did)}&cid=${encodeURIComponent(cid)}`);
+
if (!res.ok) throw new Error('Blob fetch failed');
+
const blob = await res.blob();
+
objectUrl = URL.createObjectURL(blob);
+
if (!cancelled) setState({ url: objectUrl, loading: false });
+
} catch (e) {
+
if (!cancelled) setState({ error: e as Error, loading: false });
+
}
+
}
+
run();
+
return () => {
+
cancelled = true;
+
if (objectUrl) URL.revokeObjectURL(objectUrl);
+
};
+
}, [did, cid, endpoint]);
+
+
return state;
+
}
+61
lib/hooks/useBlueskyProfile.ts
···
+
import { useEffect, useState } from 'react';
+
import { usePdsEndpoint } from './usePdsEndpoint';
+
import { createAtprotoClient } from '../utils/atproto-client';
+
+
/**
+
* Minimal profile fields returned by the Bluesky actor profile endpoint.
+
*/
+
export interface BlueskyProfileData {
+
/** Actor DID. */
+
did: string;
+
/** Actor handle. */
+
handle: string;
+
/** Display name configured by the actor. */
+
displayName?: string;
+
/** Profile description/bio. */
+
description?: string;
+
/** Avatar blob (CID reference). */
+
avatar?: string;
+
/** Banner image blob (CID reference). */
+
banner?: string;
+
/** Creation timestamp for the profile. */
+
createdAt?: string;
+
}
+
+
/**
+
* Fetches a Bluesky actor profile for a DID and exposes loading/error state.
+
*
+
* @param did - Actor DID whose profile should be retrieved.
+
* @returns {{ data: BlueskyProfileData | undefined; loading: boolean; error: Error | undefined }} Object exposing the profile payload, loading flag, and any error.
+
*/
+
export function useBlueskyProfile(did: string | undefined) {
+
const { endpoint } = usePdsEndpoint(did);
+
const [data, setData] = useState<BlueskyProfileData | undefined>();
+
const [loading, setLoading] = useState<boolean>(!!did);
+
const [error, setError] = useState<Error | undefined>();
+
+
useEffect(() => {
+
let cancelled = false;
+
async function run() {
+
if (!did || !endpoint) return;
+
setLoading(true);
+
try {
+
const { rpc } = await createAtprotoClient({ service: endpoint });
+
const client = rpc as unknown as {
+
get: (nsid: string, options: { params: { actor: string } }) => Promise<{ ok: boolean; data: unknown }>;
+
};
+
const res = await client.get('app.bsky.actor.getProfile', { params: { actor: did } });
+
if (!res.ok) throw new Error('Profile request failed');
+
if (!cancelled) setData(res.data as BlueskyProfileData);
+
} catch (e) {
+
if (!cancelled) setError(e as Error);
+
} finally {
+
if (!cancelled) setLoading(false);
+
}
+
}
+
run();
+
return () => { cancelled = true; };
+
}, [did, endpoint]);
+
+
return { data, loading, error };
+
}
+56
lib/hooks/useColorScheme.ts
···
+
import { useEffect, useState } from 'react';
+
+
/**
+
* Possible user-facing color scheme preferences.
+
*/
+
export type ColorSchemePreference = 'light' | 'dark' | 'system';
+
+
const MEDIA_QUERY = '(prefers-color-scheme: dark)';
+
+
/**
+
* Resolves a persisted preference into an explicit light/dark value.
+
*
+
* @param pref - Stored preference value (`light`, `dark`, or `system`).
+
* @returns Explicit light/dark scheme suitable for rendering.
+
*/
+
function resolveScheme(pref: ColorSchemePreference): 'light' | 'dark' {
+
if (pref === 'light' || pref === 'dark') return pref;
+
if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {
+
return 'light';
+
}
+
return window.matchMedia(MEDIA_QUERY).matches ? 'dark' : 'light';
+
}
+
+
/**
+
* React hook that returns the effective light/dark scheme, respecting system preferences.
+
*
+
* @param preference - User preference; defaults to following the OS setting.
+
* @returns {'light' | 'dark'} Explicit scheme that should be used for rendering.
+
*/
+
export function useColorScheme(preference: ColorSchemePreference = 'system'): 'light' | 'dark' {
+
const [scheme, setScheme] = useState<'light' | 'dark'>(() => resolveScheme(preference));
+
+
useEffect(() => {
+
if (preference === 'light' || preference === 'dark') {
+
setScheme(preference);
+
return;
+
}
+
if (typeof window === 'undefined' || typeof window.matchMedia !== 'function') {
+
setScheme('light');
+
return;
+
}
+
const media = window.matchMedia(MEDIA_QUERY);
+
const update = (event: MediaQueryListEvent | MediaQueryList) => {
+
setScheme(event.matches ? 'dark' : 'light');
+
};
+
update(media);
+
if (typeof media.addEventListener === 'function') {
+
media.addEventListener('change', update);
+
return () => media.removeEventListener('change', update);
+
}
+
media.addListener(update);
+
return () => media.removeListener(update);
+
}, [preference]);
+
+
return scheme;
+
}
+41
lib/hooks/useDidHandle.ts
···
+
import { useEffect, useState } from 'react';
+
import { useAtProto } from '../providers/AtProtoProvider';
+
+
/**
+
* Resolves a DID document and extracts the associated Bluesky handle from `alsoKnownAs`.
+
*
+
* @param did - DID to resolve.
+
* @returns {{ handle: string | undefined; loading: boolean }} Object containing the derived handle and a loading flag.
+
*/
+
export function useDidHandle(did: string | undefined) {
+
const { resolver } = useAtProto();
+
const [handle, setHandle] = useState<string | undefined>();
+
const [loading, setLoading] = useState<boolean>(!!did);
+
+
useEffect(() => {
+
let cancelled = false;
+
if (!did) {
+
setHandle(undefined);
+
setLoading(false);
+
return () => { cancelled = true; };
+
}
+
setLoading(true);
+
const input = did;
+
async function run() {
+
try {
+
const doc = await resolver.resolveDidDoc(input);
+
const aka = doc.alsoKnownAs?.find(a => a.startsWith('at://'));
+
const extracted = aka ? aka.replace('at://', '') : undefined;
+
if (!cancelled) setHandle(extracted);
+
} catch {
+
if (!cancelled) setHandle(undefined);
+
} finally {
+
if (!cancelled) setLoading(false);
+
}
+
}
+
run();
+
return () => { cancelled = true; };
+
}, [did, resolver]);
+
+
return { handle, loading };
+
}
+46
lib/hooks/useDidResolution.ts
···
+
import { useEffect, useState } from 'react';
+
import { useAtProto } from '../providers/AtProtoProvider';
+
+
/**
+
* Resolves a handle to its DID, or returns the DID immediately when provided.
+
*
+
* @param handleOrDid - Bluesky handle or DID string.
+
* @returns {{ did: string | undefined; error: Error | undefined; loading: boolean }} Object containing the resolved DID, error (if any), and loading state.
+
*/
+
export function useDidResolution(handleOrDid: string | undefined) {
+
const { resolver } = useAtProto();
+
const [did, setDid] = useState<string | undefined>();
+
const [error, setError] = useState<Error | undefined>();
+
const [loading, setLoading] = useState(false);
+
+
useEffect(() => {
+
let cancelled = false;
+
if (!handleOrDid) {
+
setDid(undefined);
+
setLoading(false);
+
return () => { cancelled = true; };
+
}
+
setLoading(true);
+
setError(undefined);
+
const input = handleOrDid;
+
async function run() {
+
try {
+
if (input.startsWith('did:')) {
+
if (!cancelled) setDid(input);
+
} else {
+
const resolved = await resolver.resolveHandle(input);
+
if (!cancelled) setDid(resolved);
+
}
+
} catch (e) {
+
if (!cancelled) setError(e as Error);
+
if (!cancelled) setDid(undefined);
+
} finally {
+
if (!cancelled) setLoading(false);
+
}
+
}
+
run();
+
return () => { cancelled = true; };
+
}, [handleOrDid, resolver]);
+
+
return { did, error, loading };
+
}
+67
lib/hooks/useLatestRecord.ts
···
+
import { usePdsEndpoint } from './usePdsEndpoint';
+
import { createAtprotoClient } from '../utils/atproto-client';
+
import { useEffect, useState } from 'react';
+
+
/**
+
* Shape of the state returned by {@link useLatestRecord}.
+
*/
+
export interface LatestRecordState<T = unknown> {
+
/** Latest record value if one exists. */
+
record?: T;
+
/** Record key for the fetched record, when derivable. */
+
rkey?: string;
+
/** Error encountered while fetching. */
+
error?: Error;
+
/** Indicates whether a fetch is in progress. */
+
loading: boolean;
+
/** `true` when the collection has zero records. */
+
empty: boolean;
+
}
+
+
/**
+
* Fetches the most recent record from a collection using `listRecords(limit=1)`.
+
*
+
* @param did - DID that owns the collection.
+
* @param collection - NSID of the collection to query.
+
* @returns {LatestRecordState<T>} Object reporting the latest record value, derived rkey, loading status, emptiness, and any error.
+
*/
+
export function useLatestRecord<T = unknown>(did: string | undefined, collection: string): LatestRecordState<T> {
+
const { endpoint, error: endpointError } = usePdsEndpoint(did);
+
const [state, setState] = useState<LatestRecordState<T>>({ loading: !!did, empty: false });
+
// simple one-shot fetch; no refresh logic
+
+
useEffect(() => {
+
let cancelled = false;
+
async function run() {
+
if (!did || !endpoint) return;
+
setState(s => ({ ...s, loading: true }));
+
try {
+
const { rpc } = await createAtprotoClient({ service: endpoint });
+
const res = await (rpc as unknown as { get: (nsid: string, opts: { params: Record<string, string | number | boolean> }) => Promise<{ ok: boolean; data: { records: Array<{ uri: string; rkey?: string; value: T }> } }> }).get('com.atproto.repo.listRecords', {
+
params: { repo: did, collection, limit: 1, reverse: false }
+
});
+
if (!res.ok) throw new Error('Failed to list records');
+
const list = res.data.records;
+
if (list.length === 0) {
+
if (!cancelled) setState({ loading: false, empty: true });
+
return;
+
}
+
const first = list[0];
+
// derive rkey if not present
+
let rkey = first.rkey;
+
if (!rkey && first.uri) {
+
const parts = first.uri.split('/');
+
rkey = parts[parts.length - 1];
+
}
+
if (!cancelled) setState({ record: first.value, rkey, loading: false, empty: false });
+
} catch (e) {
+
if (!cancelled) setState({ error: e as Error, loading: false, empty: false });
+
}
+
}
+
run();
+
return () => { cancelled = true; };
+
}, [did, endpoint, collection]);
+
+
if (endpointError && !state.error) return { ...state, error: endpointError };
+
return state;
+
}
+186
lib/hooks/usePaginatedRecords.ts
···
+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
+
import { usePdsEndpoint } from './usePdsEndpoint';
+
import { createAtprotoClient } from '../utils/atproto-client';
+
+
/**
+
* Record envelope returned by paginated AT Protocol queries.
+
*/
+
export interface PaginatedRecord<T> {
+
/** Fully qualified AT URI for the record. */
+
uri: string;
+
/** Record key extracted from the URI or provided by the API. */
+
rkey: string;
+
/** Raw record value. */
+
value: T;
+
}
+
+
interface PageData<T> {
+
records: PaginatedRecord<T>[];
+
cursor?: string;
+
}
+
+
/**
+
* Options accepted by {@link usePaginatedRecords}.
+
*/
+
export interface UsePaginatedRecordsOptions {
+
/** DID whose repository should be queried. */
+
did?: string;
+
/** NSID collection containing the target records. */
+
collection: string;
+
/** Maximum page size to request; defaults to `5`. */
+
limit?: number;
+
}
+
+
/**
+
* Result returned from {@link usePaginatedRecords} describing records and pagination state.
+
*/
+
export interface UsePaginatedRecordsResult<T> {
+
/** Records for the active page. */
+
records: PaginatedRecord<T>[];
+
/** Indicates whether a page load is in progress. */
+
loading: boolean;
+
/** Error produced during the latest fetch, if any. */
+
error?: Error;
+
/** `true` when another page can be fetched forward. */
+
hasNext: boolean;
+
/** `true` when a previous page exists in memory. */
+
hasPrev: boolean;
+
/** Requests the next page (if available). */
+
loadNext: () => void;
+
/** Returns to the previous page when possible. */
+
loadPrev: () => void;
+
/** Index of the currently displayed page. */
+
pageIndex: number;
+
/** Number of pages fetched so far (or inferred total when known). */
+
pagesCount: number;
+
}
+
+
/**
+
* React hook that fetches a repository collection with cursor-based pagination and prefetching.
+
*
+
* @param did - DID whose repository should be queried.
+
* @param collection - NSID collection to read from.
+
* @param limit - Maximum number of records to request per page. Defaults to `5`.
+
* @returns {UsePaginatedRecordsResult<T>} Object containing the current page, pagination metadata, and navigation callbacks.
+
*/
+
export function usePaginatedRecords<T>({ did, collection, limit = 5 }: UsePaginatedRecordsOptions): UsePaginatedRecordsResult<T> {
+
const { endpoint, error: endpointError } = usePdsEndpoint(did);
+
const [pages, setPages] = useState<PageData<T>[]>([]);
+
const [pageIndex, setPageIndex] = useState(0);
+
const [loading, setLoading] = useState(false);
+
const [error, setError] = useState<Error | undefined>(undefined);
+
const inFlight = useRef<Set<string>>(new Set());
+
+
const resetState = useCallback(() => {
+
setPages([]);
+
setPageIndex(0);
+
setError(undefined);
+
}, []);
+
+
const fetchPage = useCallback(async (cursor: string | undefined, targetIndex: number, mode: 'active' | 'prefetch') => {
+
if (!did || !endpoint) return;
+
const key = `${targetIndex}:${cursor ?? 'start'}`;
+
if (inFlight.current.has(key)) return;
+
inFlight.current.add(key);
+
if (mode === 'active') {
+
setLoading(true);
+
setError(undefined);
+
}
+
try {
+
const { rpc } = await createAtprotoClient({ service: endpoint });
+
const res = await (rpc as unknown as {
+
get: (
+
nsid: string,
+
opts: { params: Record<string, string | number | boolean | undefined> }
+
) => Promise<{ ok: boolean; data: { records: Array<{ uri: string; rkey?: string; value: T }>; cursor?: string } }>;
+
}).get('com.atproto.repo.listRecords', {
+
params: {
+
repo: did,
+
collection,
+
limit,
+
cursor,
+
reverse: false
+
}
+
});
+
if (!res.ok) throw new Error('Failed to list records');
+
const { records, cursor: nextCursor } = res.data;
+
const mapped: PaginatedRecord<T>[] = records.map((item) => ({
+
uri: item.uri,
+
rkey: item.rkey ?? extractRkey(item.uri),
+
value: item.value
+
}));
+
setPages(prev => {
+
const next = [...prev];
+
next[targetIndex] = { records: mapped, cursor: nextCursor };
+
return next;
+
});
+
if (mode === 'active') setPageIndex(targetIndex);
+
return nextCursor;
+
} catch (e) {
+
if (mode === 'active') setError(e as Error);
+
} finally {
+
if (mode === 'active') setLoading(false);
+
inFlight.current.delete(key);
+
}
+
return undefined;
+
}, [did, endpoint, collection, limit]);
+
+
useEffect(() => {
+
resetState();
+
if (!did || !endpoint) return;
+
fetchPage(undefined, 0, 'active').catch(() => {
+
/* error handled in state */
+
});
+
}, [did, endpoint, fetchPage, resetState]);
+
+
const currentPage = pages[pageIndex];
+
const hasNext = !!currentPage?.cursor || !!pages[pageIndex + 1];
+
const hasPrev = pageIndex > 0;
+
+
const loadNext = useCallback(() => {
+
const page = pages[pageIndex];
+
if (!page?.cursor && !pages[pageIndex + 1]) return;
+
if (pages[pageIndex + 1]) {
+
setPageIndex(pageIndex + 1);
+
return;
+
}
+
fetchPage(page.cursor, pageIndex + 1, 'active').catch(() => {
+
/* handled via error state */
+
});
+
}, [fetchPage, pageIndex, pages]);
+
+
const loadPrev = useCallback(() => {
+
if (pageIndex === 0) return;
+
setPageIndex(pageIndex - 1);
+
}, [pageIndex]);
+
+
const records = useMemo(() => currentPage?.records ?? [], [currentPage]);
+
+
const effectiveError = error ?? (endpointError as Error | undefined);
+
+
useEffect(() => {
+
const cursor = pages[pageIndex]?.cursor;
+
if (!cursor) return;
+
if (pages[pageIndex + 1]) return;
+
fetchPage(cursor, pageIndex + 1, 'prefetch').catch(() => {
+
/* ignore prefetch errors */
+
});
+
}, [fetchPage, pageIndex, pages]);
+
+
return {
+
records,
+
loading,
+
error: effectiveError,
+
hasNext,
+
hasPrev,
+
loadNext,
+
loadPrev,
+
pageIndex,
+
pagesCount: pages.length || (currentPage ? pageIndex + 1 : 0)
+
};
+
}
+
+
function extractRkey(uri: string): string {
+
const parts = uri.split('/');
+
return parts[parts.length - 1];
+
}
+28
lib/hooks/usePdsEndpoint.ts
···
+
import { useEffect, useState } from 'react';
+
import { useAtProto } from '../providers/AtProtoProvider';
+
+
/**
+
* Resolves the PDS service endpoint for a given DID and tracks loading state.
+
*
+
* @param did - DID whose PDS endpoint should be discovered.
+
* @returns {{ endpoint: string | undefined; error: Error | undefined; loading: boolean }} Object containing the resolved endpoint, error (if any), and loading flag.
+
*/
+
export function usePdsEndpoint(did: string | undefined) {
+
const { resolver } = useAtProto();
+
const [endpoint, setEndpoint] = useState<string | undefined>();
+
const [error, setError] = useState<Error | undefined>();
+
const [loading, setLoading] = useState(false);
+
+
useEffect(() => {
+
let cancelled = false;
+
if (!did) return;
+
setLoading(true);
+
resolver.pdsEndpointForDid(did)
+
.then(url => { if (!cancelled) setEndpoint(url); })
+
.catch(e => { if (!cancelled) setError(e as Error); })
+
.finally(() => { if (!cancelled) setLoading(false); });
+
return () => { cancelled = true; };
+
}, [did, resolver]);
+
+
return { endpoint, error, loading };
+
}
+41
lib/index.ts
···
+
// Master exporter for the AT React component library.
+
+
// Providers & core primitives
+
export * from './providers/AtProtoProvider';
+
export * from './core/AtProtoRecord';
+
+
// Components
+
export * from './components/BlueskyIcon';
+
export * from './components/BlueskyPost';
+
export * from './components/BlueskyPostList';
+
export * from './components/BlueskyProfile';
+
export * from './components/BlueskyQuotePost';
+
export * from './components/ColorSchemeToggle';
+
export * from './components/LeafletDocument';
+
export * from './components/TangledString';
+
+
// Hooks
+
export * from './hooks/useAtProtoRecord';
+
export * from './hooks/useBlob';
+
export * from './hooks/useBlueskyProfile';
+
export * from './hooks/useColorScheme';
+
export * from './hooks/useDidHandle';
+
export * from './hooks/useDidResolution';
+
export * from './hooks/useLatestRecord';
+
export * from './hooks/usePaginatedRecords';
+
export * from './hooks/usePdsEndpoint';
+
+
// Renderers
+
export * from './renderers/BlueskyPostRenderer';
+
export * from './renderers/BlueskyProfileRenderer';
+
export * from './renderers/LeafletDocumentRenderer';
+
export * from './renderers/TangledStringRenderer';
+
+
// Types
+
export * from './types/bluesky';
+
export * from './types/leaflet';
+
+
// Utilities
+
export * from './utils/at-uri';
+
export * from './utils/atproto-client';
+
export * from './utils/profile';
+24
lib/lexicons/pub/leaflet/blocks/blockquote.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.blocks.blockquote",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [
+
"plaintext"
+
],
+
"properties": {
+
"plaintext": {
+
"type": "string"
+
},
+
"facets": {
+
"type": "array",
+
"items": {
+
"type": "ref",
+
"ref": "pub.leaflet.richtext.facet"
+
}
+
}
+
}
+
}
+
}
+
}
+18
lib/lexicons/pub/leaflet/blocks/bskyPost.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.blocks.bskyPost",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [
+
"postRef"
+
],
+
"properties": {
+
"postRef": {
+
"type": "ref",
+
"ref": "com.atproto.repo.strongRef"
+
}
+
}
+
}
+
}
+
}
+23
lib/lexicons/pub/leaflet/blocks/code.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.blocks.code",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [
+
"plaintext"
+
],
+
"properties": {
+
"plaintext": {
+
"type": "string"
+
},
+
"language": {
+
"type": "string"
+
},
+
"syntaxHighlightingTheme": {
+
"type": "string"
+
}
+
}
+
}
+
}
+
}
+29
lib/lexicons/pub/leaflet/blocks/header.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.blocks.header",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [
+
"plaintext"
+
],
+
"properties": {
+
"level": {
+
"type": "integer",
+
"minimum": 1,
+
"maximum": 6
+
},
+
"plaintext": {
+
"type": "string"
+
},
+
"facets": {
+
"type": "array",
+
"items": {
+
"type": "ref",
+
"ref": "pub.leaflet.richtext.facet"
+
}
+
}
+
}
+
}
+
}
+
}
+11
lib/lexicons/pub/leaflet/blocks/horizontalRule.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.blocks.horizontalRule",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [],
+
"properties": {}
+
}
+
}
+
}
+23
lib/lexicons/pub/leaflet/blocks/iframe.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.blocks.iframe",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [
+
"url"
+
],
+
"properties": {
+
"url": {
+
"type": "string",
+
"format": "uri"
+
},
+
"height": {
+
"type": "integer",
+
"minimum": 16,
+
"maximum": 1600
+
}
+
}
+
}
+
}
+
}
+45
lib/lexicons/pub/leaflet/blocks/image.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.blocks.image",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [
+
"image",
+
"aspectRatio"
+
],
+
"properties": {
+
"image": {
+
"type": "blob",
+
"accept": [
+
"image/*"
+
],
+
"maxSize": 1000000
+
},
+
"alt": {
+
"type": "string",
+
"description": "Alt text description of the image, for accessibility."
+
},
+
"aspectRatio": {
+
"type": "ref",
+
"ref": "#aspectRatio"
+
}
+
}
+
},
+
"aspectRatio": {
+
"type": "object",
+
"required": [
+
"width",
+
"height"
+
],
+
"properties": {
+
"width": {
+
"type": "integer"
+
},
+
"height": {
+
"type": "integer"
+
}
+
}
+
}
+
}
+
}
+17
lib/lexicons/pub/leaflet/blocks/math.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.blocks.math",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [
+
"tex"
+
],
+
"properties": {
+
"tex": {
+
"type": "string"
+
}
+
}
+
}
+
}
+
}
+24
lib/lexicons/pub/leaflet/blocks/text.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.blocks.text",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [
+
"plaintext"
+
],
+
"properties": {
+
"plaintext": {
+
"type": "string"
+
},
+
"facets": {
+
"type": "array",
+
"items": {
+
"type": "ref",
+
"ref": "pub.leaflet.richtext.facet"
+
}
+
}
+
}
+
}
+
}
+
}
+44
lib/lexicons/pub/leaflet/blocks/unorderedList.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.blocks.unorderedList",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [
+
"children"
+
],
+
"properties": {
+
"children": {
+
"type": "array",
+
"items": {
+
"type": "ref",
+
"ref": "#listItem"
+
}
+
}
+
}
+
},
+
"listItem": {
+
"type": "object",
+
"required": [
+
"content"
+
],
+
"properties": {
+
"content": {
+
"type": "union",
+
"refs": [
+
"pub.leaflet.blocks.text",
+
"pub.leaflet.blocks.header",
+
"pub.leaflet.blocks.image"
+
]
+
},
+
"children": {
+
"type": "array",
+
"items": {
+
"type": "ref",
+
"ref": "#listItem"
+
}
+
}
+
}
+
}
+
}
+
}
+31
lib/lexicons/pub/leaflet/blocks/website.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.blocks.website",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [
+
"src"
+
],
+
"properties": {
+
"previewImage": {
+
"type": "blob",
+
"accept": [
+
"image/*"
+
],
+
"maxSize": 1000000
+
},
+
"title": {
+
"type": "string"
+
},
+
"description": {
+
"type": "string"
+
},
+
"src": {
+
"type": "string",
+
"format": "uri"
+
}
+
}
+
}
+
}
+
}
+80
lib/lexicons/pub/leaflet/comment.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.comment",
+
"revision": 1,
+
"description": "A lexicon for comments on documents",
+
"defs": {
+
"main": {
+
"type": "record",
+
"key": "tid",
+
"description": "Record containing a comment",
+
"record": {
+
"type": "object",
+
"required": [
+
"subject",
+
"plaintext",
+
"createdAt"
+
],
+
"properties": {
+
"subject": {
+
"type": "string",
+
"format": "at-uri"
+
},
+
"createdAt": {
+
"type": "string",
+
"format": "datetime"
+
},
+
"reply": {
+
"type": "ref",
+
"ref": "#replyRef"
+
},
+
"plaintext": {
+
"type": "string"
+
},
+
"facets": {
+
"type": "array",
+
"items": {
+
"type": "ref",
+
"ref": "pub.leaflet.richtext.facet"
+
}
+
},
+
"attachment": {
+
"type": "union",
+
"refs": [
+
"#linearDocumentQuote"
+
]
+
}
+
}
+
}
+
},
+
"linearDocumentQuote": {
+
"type": "object",
+
"required": [
+
"document",
+
"quote"
+
],
+
"properties": {
+
"document": {
+
"type": "string",
+
"format": "at-uri"
+
},
+
"quote": {
+
"type": "ref",
+
"ref": "pub.leaflet.pages.linearDocument#quote"
+
}
+
}
+
},
+
"replyRef": {
+
"type": "object",
+
"required": [
+
"parent"
+
],
+
"properties": {
+
"parent": {
+
"type": "string",
+
"format": "at-uri"
+
}
+
}
+
}
+
}
+
}
+59
lib/lexicons/pub/leaflet/document.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.document",
+
"revision": 1,
+
"description": "A lexicon for long form rich media documents",
+
"defs": {
+
"main": {
+
"type": "record",
+
"key": "tid",
+
"description": "Record containing a document",
+
"record": {
+
"type": "object",
+
"required": [
+
"pages",
+
"author",
+
"title",
+
"publication"
+
],
+
"properties": {
+
"title": {
+
"type": "string",
+
"maxLength": 1280,
+
"maxGraphemes": 128
+
},
+
"postRef": {
+
"type": "ref",
+
"ref": "com.atproto.repo.strongRef"
+
},
+
"description": {
+
"type": "string",
+
"maxLength": 3000,
+
"maxGraphemes": 300
+
},
+
"publishedAt": {
+
"type": "string",
+
"format": "datetime"
+
},
+
"publication": {
+
"type": "string",
+
"format": "at-uri"
+
},
+
"author": {
+
"type": "string",
+
"format": "at-identifier"
+
},
+
"pages": {
+
"type": "array",
+
"items": {
+
"type": "union",
+
"refs": [
+
"pub.leaflet.pages.linearDocument"
+
]
+
}
+
}
+
}
+
}
+
}
+
}
+
}
+23
lib/lexicons/pub/leaflet/graph/subscription.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.graph.subscription",
+
"defs": {
+
"main": {
+
"type": "record",
+
"key": "tid",
+
"description": "Record declaring a subscription to a publication",
+
"record": {
+
"type": "object",
+
"required": [
+
"publication"
+
],
+
"properties": {
+
"publication": {
+
"type": "string",
+
"format": "at-uri"
+
}
+
}
+
}
+
}
+
}
+
}
+95
lib/lexicons/pub/leaflet/pages/linearDocument.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.pages.linearDocument",
+
"defs": {
+
"main": {
+
"type": "object",
+
"properties": {
+
"blocks": {
+
"type": "array",
+
"items": {
+
"type": "ref",
+
"ref": "#block"
+
}
+
}
+
}
+
},
+
"block": {
+
"type": "object",
+
"required": [
+
"block"
+
],
+
"properties": {
+
"block": {
+
"type": "union",
+
"refs": [
+
"pub.leaflet.blocks.iframe",
+
"pub.leaflet.blocks.text",
+
"pub.leaflet.blocks.blockquote",
+
"pub.leaflet.blocks.header",
+
"pub.leaflet.blocks.image",
+
"pub.leaflet.blocks.unorderedList",
+
"pub.leaflet.blocks.website",
+
"pub.leaflet.blocks.math",
+
"pub.leaflet.blocks.code",
+
"pub.leaflet.blocks.horizontalRule",
+
"pub.leaflet.blocks.bskyPost"
+
]
+
},
+
"alignment": {
+
"type": "string",
+
"knownValues": [
+
"#textAlignLeft",
+
"#textAlignCenter",
+
"#textAlignRight",
+
"#textAlignJustify"
+
]
+
}
+
}
+
},
+
"textAlignLeft": {
+
"type": "token"
+
},
+
"textAlignCenter": {
+
"type": "token"
+
},
+
"textAlignRight": {
+
"type": "token"
+
},
+
"quote": {
+
"type": "object",
+
"required": [
+
"start",
+
"end"
+
],
+
"properties": {
+
"start": {
+
"type": "ref",
+
"ref": "#position"
+
},
+
"end": {
+
"type": "ref",
+
"ref": "#position"
+
}
+
}
+
},
+
"position": {
+
"type": "object",
+
"required": [
+
"block",
+
"offset"
+
],
+
"properties": {
+
"block": {
+
"type": "array",
+
"items": {
+
"type": "integer"
+
}
+
},
+
"offset": {
+
"type": "integer"
+
}
+
}
+
}
+
}
+
}
+107
lib/lexicons/pub/leaflet/publication.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.publication",
+
"defs": {
+
"main": {
+
"type": "record",
+
"key": "tid",
+
"description": "Record declaring a publication",
+
"record": {
+
"type": "object",
+
"required": [
+
"name"
+
],
+
"properties": {
+
"name": {
+
"type": "string",
+
"maxLength": 2000
+
},
+
"base_path": {
+
"type": "string",
+
"format": "uri"
+
},
+
"description": {
+
"type": "string",
+
"maxLength": 2000
+
},
+
"icon": {
+
"type": "blob",
+
"accept": [
+
"image/*"
+
],
+
"maxSize": 1000000
+
},
+
"theme": {
+
"type": "ref",
+
"ref": "#theme"
+
},
+
"preferences": {
+
"type": "ref",
+
"ref": "#preferences"
+
}
+
}
+
}
+
},
+
"preferences": {
+
"type": "object",
+
"properties": {
+
"showInDiscover": {
+
"type": "boolean",
+
"default": true
+
},
+
"showComments": {
+
"type": "boolean",
+
"default": true
+
}
+
}
+
},
+
"theme": {
+
"type": "object",
+
"properties": {
+
"backgroundColor": {
+
"type": "union",
+
"refs": [
+
"pub.leaflet.theme.color#rgba",
+
"pub.leaflet.theme.color#rgb"
+
]
+
},
+
"backgroundImage": {
+
"type": "ref",
+
"ref": "pub.leaflet.theme.backgroundImage"
+
},
+
"primary": {
+
"type": "union",
+
"refs": [
+
"pub.leaflet.theme.color#rgba",
+
"pub.leaflet.theme.color#rgb"
+
]
+
},
+
"pageBackground": {
+
"type": "union",
+
"refs": [
+
"pub.leaflet.theme.color#rgba",
+
"pub.leaflet.theme.color#rgb"
+
]
+
},
+
"showPageBackground": {
+
"type": "boolean",
+
"default": false
+
},
+
"accentBackground": {
+
"type": "union",
+
"refs": [
+
"pub.leaflet.theme.color#rgba",
+
"pub.leaflet.theme.color#rgb"
+
]
+
},
+
"accentText": {
+
"type": "union",
+
"refs": [
+
"pub.leaflet.theme.color#rgba",
+
"pub.leaflet.theme.color#rgb"
+
]
+
}
+
}
+
}
+
}
+
}
+112
lib/lexicons/pub/leaflet/richtext/facet.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.richtext.facet",
+
"defs": {
+
"main": {
+
"type": "object",
+
"description": "Annotation of a sub-string within rich text.",
+
"required": [
+
"index",
+
"features"
+
],
+
"properties": {
+
"index": {
+
"type": "ref",
+
"ref": "#byteSlice"
+
},
+
"features": {
+
"type": "array",
+
"items": {
+
"type": "union",
+
"refs": [
+
"#link",
+
"#code",
+
"#highlight",
+
"#underline",
+
"#strikethrough",
+
"#id",
+
"#bold",
+
"#italic"
+
]
+
}
+
}
+
}
+
},
+
"byteSlice": {
+
"type": "object",
+
"description": "Specifies the sub-string range a facet feature applies to. Start index is inclusive, end index is exclusive. Indices are zero-indexed, counting bytes of the UTF-8 encoded text. NOTE: some languages, like Javascript, use UTF-16 or Unicode codepoints for string slice indexing; in these languages, convert to byte arrays before working with facets.",
+
"required": [
+
"byteStart",
+
"byteEnd"
+
],
+
"properties": {
+
"byteStart": {
+
"type": "integer",
+
"minimum": 0
+
},
+
"byteEnd": {
+
"type": "integer",
+
"minimum": 0
+
}
+
}
+
},
+
"link": {
+
"type": "object",
+
"description": "Facet feature for a URL. The text URL may have been simplified or truncated, but the facet reference should be a complete URL.",
+
"required": [
+
"uri"
+
],
+
"properties": {
+
"uri": {
+
"type": "string"
+
}
+
}
+
},
+
"code": {
+
"type": "object",
+
"description": "Facet feature for inline code.",
+
"required": [],
+
"properties": {}
+
},
+
"highlight": {
+
"type": "object",
+
"description": "Facet feature for highlighted text.",
+
"required": [],
+
"properties": {}
+
},
+
"underline": {
+
"type": "object",
+
"description": "Facet feature for underline markup",
+
"required": [],
+
"properties": {}
+
},
+
"strikethrough": {
+
"type": "object",
+
"description": "Facet feature for strikethrough markup",
+
"required": [],
+
"properties": {}
+
},
+
"id": {
+
"type": "object",
+
"description": "Facet feature for an identifier. Used for linking to a segment",
+
"required": [],
+
"properties": {
+
"id": {
+
"type": "string"
+
}
+
}
+
},
+
"bold": {
+
"type": "object",
+
"description": "Facet feature for bold text",
+
"required": [],
+
"properties": {}
+
},
+
"italic": {
+
"type": "object",
+
"description": "Facet feature for italic text",
+
"required": [],
+
"properties": {}
+
}
+
}
+
}
+27
lib/lexicons/pub/leaflet/theme/backgroundImage.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.theme.backgroundImage",
+
"defs": {
+
"main": {
+
"type": "object",
+
"required": [
+
"image"
+
],
+
"properties": {
+
"image": {
+
"type": "blob",
+
"accept": [
+
"image/*"
+
],
+
"maxSize": 1000000
+
},
+
"width": {
+
"type": "integer"
+
},
+
"repeat": {
+
"type": "boolean"
+
}
+
}
+
}
+
}
+
}
+62
lib/lexicons/pub/leaflet/theme/color.json
···
+
{
+
"lexicon": 1,
+
"id": "pub.leaflet.theme.color",
+
"defs": {
+
"rgba": {
+
"type": "object",
+
"required": [
+
"r",
+
"g",
+
"b",
+
"a"
+
],
+
"properties": {
+
"r": {
+
"type": "integer",
+
"maximum": 255,
+
"minimum": 0
+
},
+
"g": {
+
"type": "integer",
+
"maximum": 255,
+
"minimum": 0
+
},
+
"b": {
+
"type": "integer",
+
"maximum": 255,
+
"minimum": 0
+
},
+
"a": {
+
"type": "integer",
+
"maximum": 100,
+
"minimum": 0
+
}
+
}
+
},
+
"rgb": {
+
"type": "object",
+
"required": [
+
"r",
+
"g",
+
"b"
+
],
+
"properties": {
+
"r": {
+
"type": "integer",
+
"maximum": 255,
+
"minimum": 0
+
},
+
"g": {
+
"type": "integer",
+
"maximum": 255,
+
"minimum": 0
+
},
+
"b": {
+
"type": "integer",
+
"maximum": 255,
+
"minimum": 0
+
}
+
}
+
}
+
}
+
}
+28
lib/providers/AtProtoProvider.tsx
···
+
/* eslint-disable react-refresh/only-export-components */
+
import React, { createContext, useContext, useMemo } from 'react';
+
import { ServiceResolver, normalizeBaseUrl } from '../utils/atproto-client';
+
+
export interface AtProtoProviderProps {
+
children: React.ReactNode;
+
plcDirectory?: string;
+
}
+
+
interface AtProtoContextValue {
+
resolver: ServiceResolver;
+
plcDirectory: string;
+
}
+
+
const AtProtoContext = createContext<AtProtoContextValue | undefined>(undefined);
+
+
export function AtProtoProvider({ children, plcDirectory }: AtProtoProviderProps) {
+
const normalizedPlc = useMemo(() => normalizeBaseUrl(plcDirectory && plcDirectory.trim() ? plcDirectory : 'https://plc.directory'), [plcDirectory]);
+
const resolver = useMemo(() => new ServiceResolver({ plcDirectory: normalizedPlc }), [normalizedPlc]);
+
const value = useMemo<AtProtoContextValue>(() => ({ resolver, plcDirectory: normalizedPlc }), [resolver, normalizedPlc]);
+
return <AtProtoContext.Provider value={value}>{children}</AtProtoContext.Provider>;
+
}
+
+
export function useAtProto() {
+
const ctx = useContext(AtProtoContext);
+
if (!ctx) throw new Error('useAtProto must be used within AtProtoProvider');
+
return ctx;
+
}
+472
lib/renderers/BlueskyPostRenderer.tsx
···
+
import React from 'react';
+
import type { FeedPostRecord } from '../types/bluesky';
+
import { useColorScheme, type ColorSchemePreference } from '../hooks/useColorScheme';
+
import { parseAtUri, toBlueskyPostUrl, formatDidForLabel, type ParsedAtUri } from '../utils/at-uri';
+
import { useDidHandle } from '../hooks/useDidHandle';
+
import { useBlob } from '../hooks/useBlob';
+
import { BlueskyIcon } from '../components/BlueskyIcon';
+
+
export interface BlueskyPostRendererProps {
+
record: FeedPostRecord;
+
loading: boolean;
+
error?: Error;
+
// Optionally pass in actor display info if pre-fetched
+
authorHandle?: string;
+
authorDisplayName?: string;
+
avatarUrl?: string;
+
colorScheme?: ColorSchemePreference;
+
authorDid?: string;
+
embed?: React.ReactNode;
+
iconPlacement?: 'cardBottomRight' | 'timestamp' | 'linkInline';
+
showIcon?: boolean;
+
atUri?: string;
+
}
+
+
export const BlueskyPostRenderer: React.FC<BlueskyPostRendererProps> = ({ record, loading, error, authorDisplayName, authorHandle, avatarUrl, colorScheme = 'system', authorDid, embed, iconPlacement = 'timestamp', showIcon = true, atUri }) => {
+
const scheme = useColorScheme(colorScheme);
+
const replyParentUri = record.reply?.parent?.uri;
+
const replyTarget = replyParentUri ? parseAtUri(replyParentUri) : undefined;
+
const { handle: parentHandle, loading: parentHandleLoading } = useDidHandle(replyTarget?.did);
+
+
if (error) return <div style={{ padding: 8, color: 'crimson' }}>Failed to load post.</div>;
+
if (loading && !record) return <div style={{ padding: 8 }}>Loading…</div>;
+
+
const palette = scheme === 'dark' ? themeStyles.dark : themeStyles.light;
+
+
const text = record.text;
+
const createdDate = new Date(record.createdAt);
+
const created = createdDate.toLocaleString(undefined, {
+
dateStyle: 'medium',
+
timeStyle: 'short'
+
});
+
const primaryName = authorDisplayName || authorHandle || '…';
+
const replyHref = replyTarget ? toBlueskyPostUrl(replyTarget) : undefined;
+
const replyLabel = replyTarget ? formatReplyLabel(replyTarget, parentHandle, parentHandleLoading) : undefined;
+
+
const makeIcon = () => (showIcon ? <BlueskyIcon size={16} /> : null);
+
const resolvedEmbed = embed ?? createAutoEmbed(record, authorDid, scheme);
+
const parsedSelf = atUri ? parseAtUri(atUri) : undefined;
+
const postUrl = parsedSelf ? toBlueskyPostUrl(parsedSelf) : undefined;
+
const cardPadding = typeof baseStyles.card.padding === 'number' ? baseStyles.card.padding : 12;
+
const cardStyle: React.CSSProperties = {
+
...baseStyles.card,
+
...palette.card,
+
...(iconPlacement === 'cardBottomRight' && showIcon ? { paddingBottom: cardPadding + 16 } : {})
+
};
+
+
return (
+
<article style={cardStyle} aria-busy={loading}>
+
<header style={baseStyles.header}>
+
{avatarUrl ? (
+
<img src={avatarUrl} alt="avatar" style={baseStyles.avatarImg} />
+
) : (
+
<div style={{ ...baseStyles.avatarPlaceholder, ...palette.avatarPlaceholder }} aria-hidden />
+
)}
+
<div style={{ display: 'flex', flexDirection: 'column' }}>
+
<strong style={{ fontSize: 14 }}>{primaryName}</strong>
+
{authorDisplayName && authorHandle && <span style={{ ...baseStyles.handle, ...palette.handle }}>@{authorHandle}</span>}
+
</div>
+
{iconPlacement === 'timestamp' && showIcon && (
+
<div style={baseStyles.headerIcon}>{makeIcon()}</div>
+
)}
+
</header>
+
{replyHref && replyLabel && (
+
<div style={{ ...baseStyles.replyLine, ...palette.replyLine }}>
+
Replying to{' '}
+
<a href={replyHref} target="_blank" rel="noopener noreferrer" style={{ ...baseStyles.replyLink, ...palette.replyLink }}>
+
{replyLabel}
+
</a>
+
</div>
+
)}
+
<div style={baseStyles.body}>
+
<p style={{ ...baseStyles.text, ...palette.text }}>{text}</p>
+
{record.facets && record.facets.length > 0 && (
+
<div style={baseStyles.facets}>
+
{record.facets.map((_, idx) => (
+
<span key={idx} style={{ ...baseStyles.facetTag, ...palette.facetTag }}>facet</span>
+
))}
+
</div>
+
)}
+
<div style={baseStyles.timestampRow}>
+
<time style={{ ...baseStyles.time, ...palette.time }} dateTime={record.createdAt}>{created}</time>
+
{postUrl && (
+
<span style={baseStyles.linkWithIcon}>
+
<a href={postUrl} target="_blank" rel="noopener noreferrer" style={{ ...baseStyles.postLink, ...palette.postLink }}>
+
View on Bluesky
+
</a>
+
{iconPlacement === 'linkInline' && showIcon && (
+
<span style={baseStyles.inlineIcon} aria-hidden>
+
{makeIcon()}
+
</span>
+
)}
+
</span>
+
)}
+
</div>
+
{resolvedEmbed && (
+
<div style={{ ...baseStyles.embedContainer, ...palette.embedContainer }}>
+
{resolvedEmbed}
+
</div>
+
)}
+
</div>
+
{iconPlacement === 'cardBottomRight' && showIcon && (
+
<div style={baseStyles.iconCorner} aria-hidden>
+
{makeIcon()}
+
</div>
+
)}
+
</article>
+
);
+
};
+
+
const baseStyles: Record<string, React.CSSProperties> = {
+
card: {
+
borderRadius: 12,
+
padding: 12,
+
fontFamily: 'system-ui, sans-serif',
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 8,
+
maxWidth: 600,
+
transition: 'background-color 180ms ease, border-color 180ms ease, color 180ms ease',
+
position: 'relative'
+
},
+
header: {
+
display: 'flex',
+
alignItems: 'center',
+
gap: 8
+
},
+
headerIcon: {
+
marginLeft: 'auto',
+
display: 'flex',
+
alignItems: 'center'
+
},
+
avatarPlaceholder: {
+
width: 40,
+
height: 40,
+
borderRadius: '50%'
+
},
+
avatarImg: {
+
width: 40,
+
height: 40,
+
borderRadius: '50%',
+
objectFit: 'cover'
+
},
+
handle: {
+
fontSize: 12
+
},
+
time: {
+
fontSize: 11
+
},
+
timestampIcon: {
+
display: 'flex',
+
alignItems: 'center',
+
justifyContent: 'center'
+
},
+
body: {
+
fontSize: 14,
+
lineHeight: 1.4
+
},
+
text: {
+
margin: 0,
+
whiteSpace: 'pre-wrap'
+
},
+
facets: {
+
marginTop: 8,
+
display: 'flex',
+
gap: 4
+
},
+
embedContainer: {
+
marginTop: 12,
+
padding: 8,
+
borderRadius: 12,
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 8
+
},
+
timestampRow: {
+
display: 'flex',
+
justifyContent: 'flex-end',
+
alignItems: 'center',
+
gap: 12,
+
marginTop: 12,
+
flexWrap: 'wrap'
+
},
+
linkWithIcon: {
+
display: 'inline-flex',
+
alignItems: 'center',
+
gap: 6
+
},
+
postLink: {
+
fontSize: 11,
+
textDecoration: 'none',
+
fontWeight: 600
+
},
+
inlineIcon: {
+
display: 'inline-flex',
+
alignItems: 'center'
+
},
+
facetTag: {
+
padding: '2px 6px',
+
borderRadius: 4,
+
fontSize: 11
+
},
+
replyLine: {
+
fontSize: 12
+
},
+
replyLink: {
+
textDecoration: 'none',
+
fontWeight: 500
+
},
+
iconCorner: {
+
position: 'absolute',
+
right: 12,
+
bottom: 12,
+
display: 'flex',
+
alignItems: 'center',
+
justifyContent: 'flex-end'
+
}
+
};
+
+
const themeStyles = {
+
light: {
+
card: {
+
border: '1px solid #e2e8f0',
+
background: '#ffffff',
+
color: '#0f172a'
+
},
+
avatarPlaceholder: {
+
background: '#cbd5e1'
+
},
+
handle: {
+
color: '#64748b'
+
},
+
time: {
+
color: '#94a3b8'
+
},
+
text: {
+
color: '#0f172a'
+
},
+
facetTag: {
+
background: '#f1f5f9',
+
color: '#475569'
+
},
+
replyLine: {
+
color: '#475569'
+
},
+
replyLink: {
+
color: '#2563eb'
+
},
+
embedContainer: {
+
border: '1px solid #e2e8f0',
+
borderRadius: 12,
+
background: '#f8fafc'
+
},
+
postLink: {
+
color: '#2563eb'
+
}
+
},
+
dark: {
+
card: {
+
border: '1px solid #1e293b',
+
background: '#0f172a',
+
color: '#e2e8f0'
+
},
+
avatarPlaceholder: {
+
background: '#1e293b'
+
},
+
handle: {
+
color: '#cbd5f5'
+
},
+
time: {
+
color: '#94a3ff'
+
},
+
text: {
+
color: '#e2e8f0'
+
},
+
facetTag: {
+
background: '#1e293b',
+
color: '#e0f2fe'
+
},
+
replyLine: {
+
color: '#cbd5f5'
+
},
+
replyLink: {
+
color: '#38bdf8'
+
},
+
embedContainer: {
+
border: '1px solid #1e293b',
+
borderRadius: 12,
+
background: '#0b1120'
+
},
+
postLink: {
+
color: '#38bdf8'
+
}
+
}
+
} satisfies Record<'light' | 'dark', Record<string, React.CSSProperties>>;
+
+
function formatReplyLabel(target: ParsedAtUri, resolvedHandle?: string, loading?: boolean): string {
+
if (resolvedHandle) return `@${resolvedHandle}`;
+
if (loading) return '…';
+
return `@${formatDidForLabel(target.did)}`;
+
}
+
+
function createAutoEmbed(record: FeedPostRecord, authorDid: string | undefined, scheme: 'light' | 'dark'): React.ReactNode {
+
const embed = record.embed as { $type?: string } | undefined;
+
if (!embed) return null;
+
if (embed.$type === 'app.bsky.embed.images') {
+
return <ImagesEmbed embed={embed as ImagesEmbedType} did={authorDid} scheme={scheme} />;
+
}
+
if (embed.$type === 'app.bsky.embed.recordWithMedia') {
+
const media = (embed as RecordWithMediaEmbed).media;
+
if (media?.$type === 'app.bsky.embed.images') {
+
return <ImagesEmbed embed={media as ImagesEmbedType} did={authorDid} scheme={scheme} />;
+
}
+
}
+
return null;
+
}
+
+
type ImagesEmbedType = {
+
$type: 'app.bsky.embed.images';
+
images: Array<{
+
alt?: string;
+
mime?: string;
+
size?: number;
+
image?: {
+
$type?: string;
+
ref?: { $link?: string };
+
cid?: string;
+
};
+
aspectRatio?: {
+
width: number;
+
height: number;
+
};
+
}>;
+
};
+
+
type RecordWithMediaEmbed = {
+
$type: 'app.bsky.embed.recordWithMedia';
+
record?: unknown;
+
media?: { $type?: string };
+
};
+
+
interface ImagesEmbedProps {
+
embed: ImagesEmbedType;
+
did?: string;
+
scheme: 'light' | 'dark';
+
}
+
+
const ImagesEmbed: React.FC<ImagesEmbedProps> = ({ embed, did, scheme }) => {
+
if (!embed.images || embed.images.length === 0) return null;
+
const palette = scheme === 'dark' ? imagesPalette.dark : imagesPalette.light;
+
const columns = embed.images.length > 1 ? 'repeat(auto-fit, minmax(160px, 1fr))' : '1fr';
+
return (
+
<div style={{ ...imagesBase.container, ...palette.container, gridTemplateColumns: columns }}>
+
{embed.images.map((image, idx) => (
+
<PostImage key={idx} image={image} did={did} scheme={scheme} />
+
))}
+
</div>
+
);
+
};
+
+
interface PostImageProps {
+
image: ImagesEmbedType['images'][number];
+
did?: string;
+
scheme: 'light' | 'dark';
+
}
+
+
const PostImage: React.FC<PostImageProps> = ({ image, did, scheme }) => {
+
const cid = image.image?.ref?.$link ?? image.image?.cid;
+
const { url, loading, error } = useBlob(did, cid);
+
const alt = image.alt?.trim() || 'Bluesky attachment';
+
const palette = scheme === 'dark' ? imagesPalette.dark : imagesPalette.light;
+
const aspect = image.aspectRatio && image.aspectRatio.height > 0
+
? `${image.aspectRatio.width} / ${image.aspectRatio.height}`
+
: undefined;
+
+
return (
+
<figure style={{ ...imagesBase.item, ...palette.item }}>
+
<div style={{ ...imagesBase.media, ...palette.media, aspectRatio: aspect }}>
+
{url ? (
+
<img src={url} alt={alt} style={imagesBase.img} />
+
) : (
+
<div style={{ ...imagesBase.placeholder, ...palette.placeholder }}>
+
{loading ? 'Loading image…' : error ? 'Image failed to load' : 'Image unavailable'}
+
</div>
+
)}
+
</div>
+
{image.alt && image.alt.trim().length > 0 && (
+
<figcaption style={{ ...imagesBase.caption, ...palette.caption }}>{image.alt}</figcaption>
+
)}
+
</figure>
+
);
+
};
+
+
const imagesBase = {
+
container: {
+
display: 'grid',
+
gap: 8,
+
width: '100%'
+
} satisfies React.CSSProperties,
+
item: {
+
margin: 0,
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 4
+
} satisfies React.CSSProperties,
+
media: {
+
position: 'relative',
+
width: '100%',
+
borderRadius: 12,
+
overflow: 'hidden'
+
} satisfies React.CSSProperties,
+
img: {
+
width: '100%',
+
height: '100%',
+
objectFit: 'cover'
+
} satisfies React.CSSProperties,
+
placeholder: {
+
display: 'flex',
+
alignItems: 'center',
+
justifyContent: 'center',
+
width: '100%',
+
height: '100%'
+
} satisfies React.CSSProperties,
+
caption: {
+
fontSize: 12,
+
lineHeight: 1.3
+
} satisfies React.CSSProperties
+
};
+
+
const imagesPalette = {
+
light: {
+
container: {
+
padding: 0
+
} satisfies React.CSSProperties,
+
item: {},
+
media: {
+
background: '#e2e8f0'
+
} satisfies React.CSSProperties,
+
placeholder: {
+
color: '#475569'
+
} satisfies React.CSSProperties,
+
caption: {
+
color: '#475569'
+
} satisfies React.CSSProperties
+
},
+
dark: {
+
container: {
+
padding: 0
+
} satisfies React.CSSProperties,
+
item: {},
+
media: {
+
background: '#1e293b'
+
} satisfies React.CSSProperties,
+
placeholder: {
+
color: '#cbd5f5'
+
} satisfies React.CSSProperties,
+
caption: {
+
color: '#94a3b8'
+
} satisfies React.CSSProperties
+
}
+
} as const;
+
+
export default BlueskyPostRenderer;
+190
lib/renderers/BlueskyProfileRenderer.tsx
···
+
import React from 'react';
+
import type { ProfileRecord } from '../types/bluesky';
+
import { useColorScheme, type ColorSchemePreference } from '../hooks/useColorScheme';
+
import { BlueskyIcon } from '../components/BlueskyIcon';
+
+
export interface BlueskyProfileRendererProps {
+
record: ProfileRecord;
+
loading: boolean;
+
error?: Error;
+
did: string;
+
handle?: string;
+
avatarUrl?: string;
+
colorScheme?: ColorSchemePreference;
+
}
+
+
export const BlueskyProfileRenderer: React.FC<BlueskyProfileRendererProps> = ({ record, loading, error, did, handle, avatarUrl, colorScheme = 'system' }) => {
+
const scheme = useColorScheme(colorScheme);
+
+
if (error) return <div style={{ padding: 8, color: 'crimson' }}>Failed to load profile.</div>;
+
if (loading && !record) return <div style={{ padding: 8 }}>Loading…</div>;
+
+
const palette = scheme === 'dark' ? theme.dark : theme.light;
+
const profileUrl = `https://bsky.app/profile/${encodeURIComponent(did)}`;
+
const rawWebsite = record.website?.trim();
+
const websiteHref = rawWebsite ? (rawWebsite.match(/^https?:\/\//i) ? rawWebsite : `https://${rawWebsite}`) : undefined;
+
const websiteLabel = rawWebsite ? rawWebsite.replace(/^https?:\/\//i, '') : undefined;
+
+
return (
+
<div style={{ ...base.card, ...palette.card }}>
+
<div style={base.header}>
+
{avatarUrl ? <img src={avatarUrl} alt="avatar" style={base.avatarImg} /> : <div style={{ ...base.avatar, ...palette.avatar }} aria-label="avatar" />}
+
<div style={{ flex: 1 }}>
+
<div style={{ ...base.display, ...palette.display }}>{record.displayName ?? handle ?? did}</div>
+
<div style={{ ...base.handleLine, ...palette.handleLine }}>@{handle ?? did}</div>
+
{record.pronouns && <div style={{ ...base.pronouns, ...palette.pronouns }}>{record.pronouns}</div>}
+
</div>
+
</div>
+
{record.description && <p style={{ ...base.desc, ...palette.desc }}>{record.description}</p>}
+
{record.createdAt && <div style={{ ...base.meta, ...palette.meta }}>Joined {new Date(record.createdAt).toLocaleDateString()}</div>}
+
<div style={base.links}>
+
{websiteHref && websiteLabel && (
+
<a href={websiteHref} target="_blank" rel="noopener noreferrer" style={{ ...base.link, ...palette.link }}>
+
{websiteLabel}
+
</a>
+
)}
+
<a href={profileUrl} target="_blank" rel="noopener noreferrer" style={{ ...base.link, ...palette.link }}>
+
View on Bluesky
+
</a>
+
</div>
+
<div style={base.iconCorner} aria-hidden>
+
<BlueskyIcon size={18} />
+
</div>
+
</div>
+
);
+
};
+
+
const base: Record<string, React.CSSProperties> = {
+
card: {
+
borderRadius: 12,
+
padding: 16,
+
fontFamily: 'system-ui, sans-serif',
+
maxWidth: 480,
+
transition: 'background-color 180ms ease, border-color 180ms ease, color 180ms ease',
+
position: 'relative'
+
},
+
header: {
+
display: 'flex',
+
gap: 12,
+
marginBottom: 8
+
},
+
avatar: {
+
width: 64,
+
height: 64,
+
borderRadius: '50%'
+
},
+
avatarImg: {
+
width: 64,
+
height: 64,
+
borderRadius: '50%',
+
objectFit: 'cover'
+
},
+
display: {
+
fontSize: 20,
+
fontWeight: 600
+
},
+
handleLine: {
+
fontSize: 13
+
},
+
desc: {
+
whiteSpace: 'pre-wrap',
+
fontSize: 14,
+
lineHeight: 1.4
+
},
+
meta: {
+
marginTop: 12,
+
fontSize: 12
+
},
+
pronouns: {
+
display: 'inline-flex',
+
alignItems: 'center',
+
gap: 4,
+
fontSize: 12,
+
fontWeight: 500,
+
borderRadius: 999,
+
padding: '2px 8px',
+
marginTop: 6
+
},
+
links: {
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 8,
+
marginTop: 12
+
},
+
link: {
+
display: 'inline-flex',
+
alignItems: 'center',
+
gap: 4,
+
fontSize: 12,
+
fontWeight: 600,
+
textDecoration: 'none'
+
},
+
iconCorner: {
+
position: 'absolute',
+
right: 12,
+
bottom: 12
+
}
+
};
+
+
const theme = {
+
light: {
+
card: {
+
border: '1px solid #e2e8f0',
+
background: '#ffffff',
+
color: '#0f172a'
+
},
+
avatar: {
+
background: '#cbd5e1'
+
},
+
display: {
+
color: '#0f172a'
+
},
+
handleLine: {
+
color: '#64748b'
+
},
+
desc: {
+
color: '#0f172a'
+
},
+
meta: {
+
color: '#94a3b8'
+
},
+
pronouns: {
+
background: '#e2e8f0',
+
color: '#1e293b'
+
},
+
link: {
+
color: '#2563eb'
+
}
+
},
+
dark: {
+
card: {
+
border: '1px solid #1e293b',
+
background: '#0b1120',
+
color: '#e2e8f0'
+
},
+
avatar: {
+
background: '#1e293b'
+
},
+
display: {
+
color: '#e2e8f0'
+
},
+
handleLine: {
+
color: '#cbd5f5'
+
},
+
desc: {
+
color: '#e2e8f0'
+
},
+
meta: {
+
color: '#a5b4fc'
+
},
+
pronouns: {
+
background: '#1e293b',
+
color: '#e2e8f0'
+
},
+
link: {
+
color: '#38bdf8'
+
}
+
}
+
} satisfies Record<'light' | 'dark', Record<string, React.CSSProperties>>;
+
+
export default BlueskyProfileRenderer;
+944
lib/renderers/LeafletDocumentRenderer.tsx
···
+
import React, { useMemo, useRef } from 'react';
+
import { useColorScheme, type ColorSchemePreference } from '../hooks/useColorScheme';
+
import { useDidHandle } from '../hooks/useDidHandle';
+
import { useBlob } from '../hooks/useBlob';
+
import { parseAtUri, formatDidForLabel, toBlueskyPostUrl, leafletRkeyUrl, normalizeLeafletBasePath } from '../utils/at-uri';
+
import { BlueskyPost } from '../components/BlueskyPost';
+
import type {
+
LeafletDocumentRecord,
+
LeafletLinearDocumentPage,
+
LeafletLinearDocumentBlock,
+
LeafletBlock,
+
LeafletTextBlock,
+
LeafletHeaderBlock,
+
LeafletBlockquoteBlock,
+
LeafletImageBlock,
+
LeafletUnorderedListBlock,
+
LeafletListItem,
+
LeafletWebsiteBlock,
+
LeafletIFrameBlock,
+
LeafletMathBlock,
+
LeafletCodeBlock,
+
LeafletBskyPostBlock,
+
LeafletAlignmentValue,
+
LeafletRichTextFacet,
+
LeafletRichTextFeature,
+
LeafletPublicationRecord
+
} from '../types/leaflet';
+
+
export interface LeafletDocumentRendererProps {
+
record: LeafletDocumentRecord;
+
loading: boolean;
+
error?: Error;
+
colorScheme?: ColorSchemePreference;
+
did: string;
+
rkey: string;
+
canonicalUrl?: string;
+
publicationBaseUrl?: string;
+
publicationRecord?: LeafletPublicationRecord;
+
}
+
+
export const LeafletDocumentRenderer: React.FC<LeafletDocumentRendererProps> = ({ record, loading, error, colorScheme = 'system', did, rkey, canonicalUrl, publicationBaseUrl, publicationRecord }) => {
+
const scheme = useColorScheme(colorScheme);
+
const palette = scheme === 'dark' ? theme.dark : theme.light;
+
const authorDid = record.author?.startsWith('did:') ? record.author : undefined;
+
const publicationUri = useMemo(() => parseAtUri(record.publication), [record.publication]);
+
const postUrl = useMemo(() => {
+
const postRefUri = record.postRef?.uri;
+
if (!postRefUri) return undefined;
+
const parsed = parseAtUri(postRefUri);
+
return parsed ? toBlueskyPostUrl(parsed) : undefined;
+
}, [record.postRef?.uri]);
+
const { handle: publicationHandle } = useDidHandle(publicationUri?.did);
+
const fallbackAuthorLabel = useAuthorLabel(record.author, authorDid);
+
const resolvedPublicationLabel = publicationRecord?.name?.trim()
+
?? (publicationHandle ? `@${publicationHandle}` : publicationUri ? formatDidForLabel(publicationUri.did) : undefined);
+
const authorLabel = resolvedPublicationLabel ?? fallbackAuthorLabel;
+
const authorHref = publicationUri ? `https://bsky.app/profile/${publicationUri.did}` : undefined;
+
+
if (error) return <div style={{ padding: 12, color: 'crimson' }}>Failed to load leaflet.</div>;
+
if (loading && !record) return <div style={{ padding: 12 }}>Loading leaflet…</div>;
+
if (!record) return <div style={{ padding: 12, color: 'crimson' }}>Leaflet record missing.</div>;
+
+
const publishedAt = record.publishedAt ? new Date(record.publishedAt) : undefined;
+
const publishedLabel = publishedAt ? publishedAt.toLocaleString(undefined, { dateStyle: 'long', timeStyle: 'short' }) : undefined;
+
const fallbackLeafletUrl = `https://bsky.app/leaflet/${encodeURIComponent(did)}/${encodeURIComponent(rkey)}`;
+
const publicationRoot = publicationBaseUrl ?? (publicationRecord?.base_path ?? undefined);
+
const resolvedPublicationRoot = publicationRoot ? normalizeLeafletBasePath(publicationRoot) : undefined;
+
const publicationLeafletUrl = leafletRkeyUrl(publicationRoot, rkey);
+
const viewUrl = canonicalUrl ?? publicationLeafletUrl ?? postUrl ?? (publicationUri ? `https://bsky.app/profile/${publicationUri.did}` : undefined) ?? fallbackLeafletUrl;
+
+
const metaItems: React.ReactNode[] = [];
+
if (authorLabel) {
+
const authorNode = authorHref
+
? (
+
<a href={authorHref} target="_blank" rel="noopener noreferrer" style={palette.metaLink}>
+
{authorLabel}
+
</a>
+
)
+
: authorLabel;
+
metaItems.push(<span>By {authorNode}</span>);
+
}
+
if (publishedLabel) metaItems.push(<time dateTime={record.publishedAt}>{publishedLabel}</time>);
+
if (resolvedPublicationRoot) {
+
metaItems.push(
+
<a href={resolvedPublicationRoot} target="_blank" rel="noopener noreferrer" style={palette.metaLink}>
+
{resolvedPublicationRoot.replace(/^https?:\/\//, '')}
+
</a>
+
);
+
}
+
if (viewUrl) {
+
metaItems.push(
+
<a href={viewUrl} target="_blank" rel="noopener noreferrer" style={palette.metaLink}>
+
View source
+
</a>
+
);
+
}
+
+
return (
+
<article style={{ ...base.container, ...palette.container }}>
+
<header style={{ ...base.header, ...palette.header }}>
+
<div style={base.headerContent}>
+
<h1 style={{ ...base.title, ...palette.title }}>{record.title}</h1>
+
{record.description && (
+
<p style={{ ...base.subtitle, ...palette.subtitle }}>{record.description}</p>
+
)}
+
</div>
+
<div style={{ ...base.meta, ...palette.meta }}>
+
{metaItems.map((item, idx) => (
+
<React.Fragment key={`meta-${idx}`}>
+
{idx > 0 && <span style={palette.metaSeparator}>•</span>}
+
{item}
+
</React.Fragment>
+
))}
+
</div>
+
</header>
+
<div style={base.body}>
+
{record.pages?.map((page, pageIndex) => (
+
<LeafletPageRenderer
+
key={`page-${pageIndex}`}
+
page={page}
+
documentDid={did}
+
colorScheme={scheme}
+
/>
+
))}
+
</div>
+
</article>
+
);
+
};
+
+
const LeafletPageRenderer: React.FC<{ page: LeafletLinearDocumentPage; documentDid: string; colorScheme: 'light' | 'dark' }> = ({ page, documentDid, colorScheme }) => {
+
if (!page.blocks?.length) return null;
+
return (
+
<div style={base.page}>
+
{page.blocks.map((blockWrapper, idx) => (
+
<LeafletBlockRenderer
+
key={`block-${idx}`}
+
wrapper={blockWrapper}
+
documentDid={documentDid}
+
colorScheme={colorScheme}
+
isFirst={idx === 0}
+
/>
+
))}
+
</div>
+
);
+
};
+
+
interface LeafletBlockRendererProps {
+
wrapper: LeafletLinearDocumentBlock;
+
documentDid: string;
+
colorScheme: 'light' | 'dark';
+
isFirst?: boolean;
+
}
+
+
const LeafletBlockRenderer: React.FC<LeafletBlockRendererProps> = ({ wrapper, documentDid, colorScheme, isFirst }) => {
+
const block = wrapper.block;
+
if (!block || !('$type' in block) || !block.$type) {
+
return null;
+
}
+
const alignment = alignmentValue(wrapper.alignment);
+
+
switch (block.$type) {
+
case 'pub.leaflet.blocks.header':
+
return <LeafletHeaderBlockView block={block} alignment={alignment} colorScheme={colorScheme} isFirst={isFirst} />;
+
case 'pub.leaflet.blocks.blockquote':
+
return <LeafletBlockquoteBlockView block={block} alignment={alignment} colorScheme={colorScheme} isFirst={isFirst} />;
+
case 'pub.leaflet.blocks.image':
+
return <LeafletImageBlockView block={block} alignment={alignment} documentDid={documentDid} colorScheme={colorScheme} />;
+
case 'pub.leaflet.blocks.unorderedList':
+
return <LeafletListBlockView block={block} alignment={alignment} documentDid={documentDid} colorScheme={colorScheme} />;
+
case 'pub.leaflet.blocks.website':
+
return <LeafletWebsiteBlockView block={block} alignment={alignment} documentDid={documentDid} colorScheme={colorScheme} />;
+
case 'pub.leaflet.blocks.iframe':
+
return <LeafletIframeBlockView block={block} alignment={alignment} />;
+
case 'pub.leaflet.blocks.math':
+
return <LeafletMathBlockView block={block} alignment={alignment} colorScheme={colorScheme} />;
+
case 'pub.leaflet.blocks.code':
+
return <LeafletCodeBlockView block={block} alignment={alignment} colorScheme={colorScheme} />;
+
case 'pub.leaflet.blocks.horizontalRule':
+
return <LeafletHorizontalRuleBlockView alignment={alignment} colorScheme={colorScheme} />;
+
case 'pub.leaflet.blocks.bskyPost':
+
return <LeafletBskyPostBlockView block={block} colorScheme={colorScheme} />;
+
case 'pub.leaflet.blocks.text':
+
default:
+
return <LeafletTextBlockView block={block as LeafletTextBlock} alignment={alignment} colorScheme={colorScheme} isFirst={isFirst} />;
+
}
+
};
+
+
const LeafletTextBlockView: React.FC<{ block: LeafletTextBlock; alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark'; isFirst?: boolean }> = ({ block, alignment, colorScheme, isFirst }) => {
+
const segments = useMemo(() => createFacetedSegments(block.plaintext, block.facets), [block.plaintext, block.facets]);
+
const textContent = block.plaintext ?? '';
+
if (!textContent.trim() && segments.length === 0) {
+
return null;
+
}
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
+
const style: React.CSSProperties = {
+
...base.paragraph,
+
...palette.paragraph,
+
...(alignment ? { textAlign: alignment } : undefined),
+
...(isFirst ? { marginTop: 0 } : undefined)
+
};
+
return (
+
<p style={style}>
+
{segments.map((segment, idx) => (
+
<React.Fragment key={`text-${idx}`}>
+
{renderSegment(segment, colorScheme)}
+
</React.Fragment>
+
))}
+
</p>
+
);
+
};
+
+
const LeafletHeaderBlockView: React.FC<{ block: LeafletHeaderBlock; alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark'; isFirst?: boolean }> = ({ block, alignment, colorScheme, isFirst }) => {
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
+
const level = block.level && block.level >= 1 && block.level <= 6 ? block.level : 2;
+
const segments = useMemo(() => createFacetedSegments(block.plaintext, block.facets), [block.plaintext, block.facets]);
+
const normalizedLevel = Math.min(Math.max(level, 1), 6) as 1 | 2 | 3 | 4 | 5 | 6;
+
const headingTag = (['h1', 'h2', 'h3', 'h4', 'h5', 'h6'] as const)[normalizedLevel - 1];
+
const headingStyles = palette.heading[normalizedLevel];
+
const style: React.CSSProperties = {
+
...base.heading,
+
...headingStyles,
+
...(alignment ? { textAlign: alignment } : undefined),
+
...(isFirst ? { marginTop: 0 } : undefined)
+
};
+
+
return React.createElement(
+
headingTag,
+
{ style },
+
segments.map((segment, idx) => (
+
<React.Fragment key={`header-${idx}`}>
+
{renderSegment(segment, colorScheme)}
+
</React.Fragment>
+
))
+
);
+
};
+
+
const LeafletBlockquoteBlockView: React.FC<{ block: LeafletBlockquoteBlock; alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark'; isFirst?: boolean }> = ({ block, alignment, colorScheme, isFirst }) => {
+
const segments = useMemo(() => createFacetedSegments(block.plaintext, block.facets), [block.plaintext, block.facets]);
+
const textContent = block.plaintext ?? '';
+
if (!textContent.trim() && segments.length === 0) {
+
return null;
+
}
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
+
return (
+
<blockquote style={{ ...base.blockquote, ...palette.blockquote, ...(alignment ? { textAlign: alignment } : undefined), ...(isFirst ? { marginTop: 0 } : undefined) }}>
+
{segments.map((segment, idx) => (
+
<React.Fragment key={`quote-${idx}`}>
+
{renderSegment(segment, colorScheme)}
+
</React.Fragment>
+
))}
+
</blockquote>
+
);
+
};
+
+
const LeafletImageBlockView: React.FC<{ block: LeafletImageBlock; alignment?: React.CSSProperties['textAlign']; documentDid: string; colorScheme: 'light' | 'dark' }> = ({ block, alignment, documentDid, colorScheme }) => {
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
+
const cid = block.image?.ref?.$link ?? block.image?.cid;
+
const { url, loading, error } = useBlob(documentDid, cid);
+
const aspectRatio = block.aspectRatio?.height && block.aspectRatio?.width
+
? `${block.aspectRatio.width} / ${block.aspectRatio.height}`
+
: undefined;
+
+
return (
+
<figure style={{ ...base.figure, ...palette.figure, ...(alignment ? { textAlign: alignment } : undefined) }}>
+
<div style={{ ...base.imageWrapper, ...palette.imageWrapper, ...(aspectRatio ? { aspectRatio } : {}) }}>
+
{url && !error ? (
+
<img src={url} alt={block.alt ?? ''} style={{ ...base.image, ...palette.image }} />
+
) : (
+
<div style={{ ...base.imagePlaceholder, ...palette.imagePlaceholder }}>
+
{loading ? 'Loading image…' : error ? 'Image unavailable' : 'No image'}
+
</div>
+
)}
+
</div>
+
{block.alt && block.alt.trim().length > 0 && (
+
<figcaption style={{ ...base.caption, ...palette.caption }}>{block.alt}</figcaption>
+
)}
+
</figure>
+
);
+
};
+
+
const LeafletListBlockView: React.FC<{ block: LeafletUnorderedListBlock; alignment?: React.CSSProperties['textAlign']; documentDid: string; colorScheme: 'light' | 'dark' }> = ({ block, alignment, documentDid, colorScheme }) => {
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
+
return (
+
<ul style={{ ...base.list, ...palette.list, ...(alignment ? { textAlign: alignment } : undefined) }}>
+
{block.children?.map((child, idx) => (
+
<LeafletListItemRenderer
+
key={`list-item-${idx}`}
+
item={child}
+
documentDid={documentDid}
+
colorScheme={colorScheme}
+
alignment={alignment}
+
/>
+
))}
+
</ul>
+
);
+
};
+
+
const LeafletListItemRenderer: React.FC<{ item: LeafletListItem; documentDid: string; colorScheme: 'light' | 'dark'; alignment?: React.CSSProperties['textAlign'] }> = ({ item, documentDid, colorScheme, alignment }) => {
+
return (
+
<li style={{ ...base.listItem, ...(alignment ? { textAlign: alignment } : undefined) }}>
+
<div>
+
<LeafletInlineBlock block={item.content} colorScheme={colorScheme} documentDid={documentDid} alignment={alignment} />
+
</div>
+
{item.children && item.children.length > 0 && (
+
<ul style={{ ...base.nestedList, ...(alignment ? { textAlign: alignment } : undefined) }}>
+
{item.children.map((child, idx) => (
+
<LeafletListItemRenderer key={`nested-${idx}`} item={child} documentDid={documentDid} colorScheme={colorScheme} alignment={alignment} />
+
))}
+
</ul>
+
)}
+
</li>
+
);
+
};
+
+
const LeafletInlineBlock: React.FC<{ block: LeafletBlock; colorScheme: 'light' | 'dark'; documentDid: string; alignment?: React.CSSProperties['textAlign'] }> = ({ block, colorScheme, documentDid, alignment }) => {
+
switch (block.$type) {
+
case 'pub.leaflet.blocks.header':
+
return <LeafletHeaderBlockView block={block as LeafletHeaderBlock} colorScheme={colorScheme} alignment={alignment} />;
+
case 'pub.leaflet.blocks.blockquote':
+
return <LeafletBlockquoteBlockView block={block as LeafletBlockquoteBlock} colorScheme={colorScheme} alignment={alignment} />;
+
case 'pub.leaflet.blocks.image':
+
return <LeafletImageBlockView block={block as LeafletImageBlock} documentDid={documentDid} colorScheme={colorScheme} alignment={alignment} />;
+
default:
+
return <LeafletTextBlockView block={block as LeafletTextBlock} colorScheme={colorScheme} alignment={alignment} />;
+
}
+
};
+
+
const LeafletWebsiteBlockView: React.FC<{ block: LeafletWebsiteBlock; alignment?: React.CSSProperties['textAlign']; documentDid: string; colorScheme: 'light' | 'dark' }> = ({ block, alignment, documentDid, colorScheme }) => {
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
+
const previewCid = block.previewImage?.ref?.$link ?? block.previewImage?.cid;
+
const { url, loading, error } = useBlob(documentDid, previewCid);
+
+
return (
+
<a href={block.src} target="_blank" rel="noopener noreferrer" style={{ ...base.linkCard, ...palette.linkCard, ...(alignment ? { textAlign: alignment } : undefined) }}>
+
{url && !error ? (
+
<img src={url} alt={block.title ?? 'Website preview'} style={{ ...base.linkPreview, ...palette.linkPreview }} />
+
) : (
+
<div style={{ ...base.linkPreviewPlaceholder, ...palette.linkPreviewPlaceholder }}>
+
{loading ? 'Loading preview…' : 'Open link'}
+
</div>
+
)}
+
<div style={base.linkContent}>
+
{block.title && <strong style={palette.linkTitle}>{block.title}</strong>}
+
{block.description && <p style={palette.linkDescription}>{block.description}</p>}
+
<span style={palette.linkUrl}>{block.src}</span>
+
</div>
+
</a>
+
);
+
};
+
+
const LeafletIframeBlockView: React.FC<{ block: LeafletIFrameBlock; alignment?: React.CSSProperties['textAlign'] }> = ({ block, alignment }) => {
+
return (
+
<div style={{ ...(alignment ? { textAlign: alignment } : undefined) }}>
+
<iframe
+
src={block.url}
+
title={block.url}
+
style={{ ...base.iframe, ...(block.height ? { height: Math.min(Math.max(block.height, 120), 800) } : {}) }}
+
loading="lazy"
+
allowFullScreen
+
/>
+
</div>
+
);
+
};
+
+
const LeafletMathBlockView: React.FC<{ block: LeafletMathBlock; alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark' }> = ({ block, alignment, colorScheme }) => {
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
+
return (
+
<pre style={{ ...base.math, ...palette.math, ...(alignment ? { textAlign: alignment } : undefined) }}>{block.tex}</pre>
+
);
+
};
+
+
const LeafletCodeBlockView: React.FC<{ block: LeafletCodeBlock; alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark' }> = ({ block, alignment, colorScheme }) => {
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
+
const codeRef = useRef<HTMLElement | null>(null);
+
const langClass = block.language ? `language-${block.language.toLowerCase()}` : undefined;
+
return (
+
<pre style={{ ...base.code, ...palette.code, ...(alignment ? { textAlign: alignment } : undefined) }}>
+
<code ref={codeRef} className={langClass}>{block.plaintext}</code>
+
</pre>
+
);
+
};
+
+
const LeafletHorizontalRuleBlockView: React.FC<{ alignment?: React.CSSProperties['textAlign']; colorScheme: 'light' | 'dark' }> = ({ alignment, colorScheme }) => {
+
const palette = colorScheme === 'dark' ? theme.dark : theme.light;
+
return <hr style={{ ...base.hr, ...palette.hr, marginLeft: alignment ? 'auto' : undefined, marginRight: alignment ? 'auto' : undefined }} />;
+
};
+
+
const LeafletBskyPostBlockView: React.FC<{ block: LeafletBskyPostBlock; colorScheme: 'light' | 'dark' }> = ({ block, colorScheme }) => {
+
const parsed = parseAtUri(block.postRef?.uri);
+
if (!parsed) {
+
return <div style={base.embedFallback}>Referenced post unavailable.</div>;
+
}
+
return <BlueskyPost did={parsed.did} rkey={parsed.rkey} colorScheme={colorScheme} iconPlacement="linkInline" />;
+
};
+
+
function alignmentValue(value?: LeafletAlignmentValue): React.CSSProperties['textAlign'] | undefined {
+
if (!value) return undefined;
+
let normalized = value.startsWith('#') ? value.slice(1) : value;
+
if (normalized.includes('#')) {
+
normalized = normalized.split('#').pop() ?? normalized;
+
}
+
if (normalized.startsWith('lex:')) {
+
normalized = normalized.split(':').pop() ?? normalized;
+
}
+
switch (normalized) {
+
case 'textAlignLeft':
+
return 'left';
+
case 'textAlignCenter':
+
return 'center';
+
case 'textAlignRight':
+
return 'right';
+
case 'textAlignJustify':
+
return 'justify';
+
default:
+
return undefined;
+
}
+
}
+
+
function useAuthorLabel(author: string | undefined, authorDid: string | undefined): string | undefined {
+
const { handle } = useDidHandle(authorDid);
+
if (!author) return undefined;
+
if (handle) return `@${handle}`;
+
if (authorDid) return formatDidForLabel(authorDid);
+
return author;
+
}
+
+
interface Segment {
+
text: string;
+
features: LeafletRichTextFeature[];
+
}
+
+
function createFacetedSegments(plaintext: string, facets?: LeafletRichTextFacet[]): Segment[] {
+
if (!facets?.length) {
+
return [{ text: plaintext, features: [] }];
+
}
+
const prefix = buildBytePrefix(plaintext);
+
const startEvents = new Map<number, LeafletRichTextFeature[]>();
+
const endEvents = new Map<number, LeafletRichTextFeature[]>();
+
const boundaries = new Set<number>([0, prefix.length - 1]);
+
for (const facet of facets) {
+
const { byteStart, byteEnd } = facet.index ?? {};
+
if (typeof byteStart !== 'number' || typeof byteEnd !== 'number' || byteStart >= byteEnd) continue;
+
const start = byteOffsetToCharIndex(prefix, byteStart);
+
const end = byteOffsetToCharIndex(prefix, byteEnd);
+
if (start >= end) continue;
+
boundaries.add(start);
+
boundaries.add(end);
+
if (facet.features?.length) {
+
startEvents.set(start, [...(startEvents.get(start) ?? []), ...facet.features]);
+
endEvents.set(end, [...(endEvents.get(end) ?? []), ...facet.features]);
+
}
+
}
+
const sortedBounds = [...boundaries].sort((a, b) => a - b);
+
const segments: Segment[] = [];
+
let active: LeafletRichTextFeature[] = [];
+
for (let i = 0; i < sortedBounds.length - 1; i++) {
+
const boundary = sortedBounds[i];
+
const next = sortedBounds[i + 1];
+
const endFeatures = endEvents.get(boundary);
+
if (endFeatures?.length) {
+
active = active.filter((feature) => !endFeatures.includes(feature));
+
}
+
const startFeatures = startEvents.get(boundary);
+
if (startFeatures?.length) {
+
active = [...active, ...startFeatures];
+
}
+
if (boundary === next) continue;
+
const text = sliceByCharRange(plaintext, boundary, next);
+
segments.push({ text, features: active.slice() });
+
}
+
return segments;
+
}
+
+
function buildBytePrefix(text: string): number[] {
+
const encoder = new TextEncoder();
+
const prefix: number[] = [0];
+
let byteCount = 0;
+
for (let i = 0; i < text.length;) {
+
const codePoint = text.codePointAt(i)!;
+
const char = String.fromCodePoint(codePoint);
+
const encoded = encoder.encode(char);
+
byteCount += encoded.length;
+
prefix.push(byteCount);
+
i += codePoint > 0xffff ? 2 : 1;
+
}
+
return prefix;
+
}
+
+
function byteOffsetToCharIndex(prefix: number[], byteOffset: number): number {
+
for (let i = 0; i < prefix.length; i++) {
+
if (prefix[i] === byteOffset) return i;
+
if (prefix[i] > byteOffset) return Math.max(0, i - 1);
+
}
+
return prefix.length - 1;
+
}
+
+
function sliceByCharRange(text: string, start: number, end: number): string {
+
if (start <= 0 && end >= text.length) return text;
+
let result = '';
+
let charIndex = 0;
+
for (let i = 0; i < text.length && charIndex < end;) {
+
const codePoint = text.codePointAt(i)!;
+
const char = String.fromCodePoint(codePoint);
+
if (charIndex >= start && charIndex < end) result += char;
+
i += codePoint > 0xffff ? 2 : 1;
+
charIndex++;
+
}
+
return result;
+
}
+
+
function renderSegment(segment: Segment, colorScheme: 'light' | 'dark'): React.ReactNode {
+
const parts = segment.text.split('\n');
+
return parts.flatMap((part, idx) => {
+
const key = `${segment.text}-${idx}-${part.length}`;
+
const wrapped = applyFeatures(part.length ? part : '\u00a0', segment.features, key, colorScheme);
+
if (idx === parts.length - 1) return wrapped;
+
return [wrapped, <br key={`${key}-br`} />];
+
});
+
}
+
+
function applyFeatures(content: React.ReactNode, features: LeafletRichTextFeature[], key: string, colorScheme: 'light' | 'dark'): React.ReactNode {
+
if (!features?.length) return <React.Fragment key={key}>{content}</React.Fragment>;
+
return (
+
<React.Fragment key={key}>
+
{features.reduce<React.ReactNode>((child, feature, idx) => wrapFeature(child, feature, `${key}-feature-${idx}`, colorScheme), content)}
+
</React.Fragment>
+
);
+
}
+
+
function wrapFeature(child: React.ReactNode, feature: LeafletRichTextFeature, key: string, colorScheme: 'light' | 'dark'): React.ReactNode {
+
switch (feature.$type) {
+
case 'pub.leaflet.richtext.facet#link':
+
return <a key={key} href={feature.uri} target="_blank" rel="noopener noreferrer" style={linkStyles[colorScheme]}>{child}</a>;
+
case 'pub.leaflet.richtext.facet#code':
+
return <code key={key} style={inlineCodeStyles[colorScheme]}>{child}</code>;
+
case 'pub.leaflet.richtext.facet#highlight':
+
return <mark key={key} style={highlightStyles[colorScheme]}>{child}</mark>;
+
case 'pub.leaflet.richtext.facet#underline':
+
return <span key={key} style={{ textDecoration: 'underline' }}>{child}</span>;
+
case 'pub.leaflet.richtext.facet#strikethrough':
+
return <span key={key} style={{ textDecoration: 'line-through' }}>{child}</span>;
+
case 'pub.leaflet.richtext.facet#bold':
+
return <strong key={key}>{child}</strong>;
+
case 'pub.leaflet.richtext.facet#italic':
+
return <em key={key}>{child}</em>;
+
case 'pub.leaflet.richtext.facet#id':
+
return <span key={key} id={feature.id}>{child}</span>;
+
default:
+
return <span key={key}>{child}</span>;
+
}
+
}
+
+
const base: Record<string, React.CSSProperties> = {
+
container: {
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 24,
+
padding: '24px 28px',
+
borderRadius: 20,
+
border: '1px solid transparent',
+
maxWidth: 720,
+
width: '100%',
+
fontFamily: 'system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif'
+
},
+
header: {
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 16
+
},
+
headerContent: {
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 8
+
},
+
title: {
+
fontSize: 32,
+
margin: 0,
+
lineHeight: 1.15
+
},
+
subtitle: {
+
margin: 0,
+
fontSize: 16,
+
lineHeight: 1.5
+
},
+
meta: {
+
display: 'flex',
+
flexWrap: 'wrap',
+
gap: 8,
+
alignItems: 'center',
+
fontSize: 14
+
},
+
body: {
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 18
+
},
+
page: {
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 18
+
},
+
paragraph: {
+
margin: '1em 0 0',
+
lineHeight: 1.65,
+
fontSize: 16
+
},
+
heading: {
+
margin: '0.5em 0 0',
+
fontWeight: 700
+
},
+
blockquote: {
+
margin: '1em 0 0',
+
padding: '0.6em 1em',
+
borderLeft: '4px solid'
+
},
+
figure: {
+
margin: '1.2em 0 0',
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 12
+
},
+
imageWrapper: {
+
borderRadius: 16,
+
overflow: 'hidden',
+
width: '100%',
+
position: 'relative',
+
background: '#e2e8f0'
+
},
+
image: {
+
width: '100%',
+
height: '100%',
+
objectFit: 'cover',
+
display: 'block'
+
},
+
imagePlaceholder: {
+
width: '100%',
+
padding: '24px 16px',
+
textAlign: 'center'
+
},
+
caption: {
+
fontSize: 13,
+
lineHeight: 1.4
+
},
+
list: {
+
paddingLeft: 28,
+
margin: '1em 0 0',
+
listStyleType: 'disc',
+
listStylePosition: 'outside'
+
},
+
nestedList: {
+
paddingLeft: 20,
+
marginTop: 8,
+
listStyleType: 'circle',
+
listStylePosition: 'outside'
+
},
+
listItem: {
+
marginTop: 8,
+
display: 'list-item'
+
},
+
linkCard: {
+
borderRadius: 16,
+
border: '1px solid',
+
display: 'flex',
+
flexDirection: 'column',
+
overflow: 'hidden',
+
textDecoration: 'none'
+
},
+
linkPreview: {
+
width: '100%',
+
height: 180,
+
objectFit: 'cover'
+
},
+
linkPreviewPlaceholder: {
+
width: '100%',
+
height: 180,
+
display: 'flex',
+
alignItems: 'center',
+
justifyContent: 'center',
+
fontSize: 14
+
},
+
linkContent: {
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 6,
+
padding: '16px 18px'
+
},
+
iframe: {
+
width: '100%',
+
height: 360,
+
border: '1px solid #cbd5f5',
+
borderRadius: 16
+
},
+
math: {
+
margin: '1em 0 0',
+
padding: '14px 16px',
+
borderRadius: 12,
+
fontFamily: 'Menlo, Consolas, "SFMono-Regular", ui-monospace',
+
overflowX: 'auto'
+
},
+
code: {
+
margin: '1em 0 0',
+
padding: '14px 16px',
+
borderRadius: 12,
+
overflowX: 'auto',
+
fontSize: 14
+
},
+
hr: {
+
border: 0,
+
borderTop: '1px solid',
+
margin: '24px 0 0'
+
},
+
embedFallback: {
+
padding: '12px 16px',
+
borderRadius: 12,
+
border: '1px solid #e2e8f0',
+
fontSize: 14
+
}
+
};
+
+
const theme = {
+
light: {
+
container: {
+
background: '#ffffff',
+
borderColor: '#e2e8f0',
+
color: '#0f172a',
+
boxShadow: '0 4px 18px rgba(15, 23, 42, 0.06)'
+
},
+
header: {},
+
title: {
+
color: '#0f172a'
+
},
+
subtitle: {
+
color: '#475569'
+
},
+
meta: {
+
color: '#64748b'
+
},
+
metaLink: {
+
color: '#2563eb',
+
textDecoration: 'none'
+
} satisfies React.CSSProperties,
+
metaSeparator: {
+
margin: '0 4px'
+
} satisfies React.CSSProperties,
+
paragraph: {
+
color: '#1f2937'
+
},
+
heading: {
+
1: { color: '#0f172a', fontSize: 30 },
+
2: { color: '#0f172a', fontSize: 28 },
+
3: { color: '#0f172a', fontSize: 24 },
+
4: { color: '#0f172a', fontSize: 20 },
+
5: { color: '#0f172a', fontSize: 18 },
+
6: { color: '#0f172a', fontSize: 16 }
+
} satisfies Record<number, React.CSSProperties>,
+
blockquote: {
+
background: '#f8fafc',
+
borderColor: '#cbd5f5',
+
color: '#1f2937'
+
},
+
figure: {},
+
imageWrapper: {
+
background: '#e2e8f0'
+
},
+
image: {},
+
imagePlaceholder: {
+
color: '#475569'
+
},
+
caption: {
+
color: '#475569'
+
},
+
list: {
+
color: '#1f2937'
+
},
+
linkCard: {
+
borderColor: '#e2e8f0',
+
background: '#f8fafc',
+
color: '#0f172a'
+
},
+
linkPreview: {},
+
linkPreviewPlaceholder: {
+
background: '#e2e8f0',
+
color: '#475569'
+
},
+
linkTitle: {
+
fontSize: 16,
+
color: '#0f172a'
+
} satisfies React.CSSProperties,
+
linkDescription: {
+
margin: 0,
+
fontSize: 14,
+
color: '#475569',
+
lineHeight: 1.5
+
} satisfies React.CSSProperties,
+
linkUrl: {
+
fontSize: 13,
+
color: '#2563eb',
+
wordBreak: 'break-all'
+
} satisfies React.CSSProperties,
+
math: {
+
background: '#f1f5f9',
+
color: '#1f2937',
+
border: '1px solid #e2e8f0'
+
},
+
code: {
+
background: '#0f172a',
+
color: '#e2e8f0'
+
},
+
hr: {
+
borderColor: '#e2e8f0'
+
}
+
},
+
dark: {
+
container: {
+
background: 'rgba(15, 23, 42, 0.6)',
+
borderColor: 'rgba(148, 163, 184, 0.3)',
+
color: '#e2e8f0',
+
backdropFilter: 'blur(8px)',
+
boxShadow: '0 10px 40px rgba(2, 6, 23, 0.45)'
+
},
+
header: {},
+
title: {
+
color: '#f8fafc'
+
},
+
subtitle: {
+
color: '#cbd5f5'
+
},
+
meta: {
+
color: '#94a3b8'
+
},
+
metaLink: {
+
color: '#38bdf8',
+
textDecoration: 'none'
+
} satisfies React.CSSProperties,
+
metaSeparator: {
+
margin: '0 4px'
+
} satisfies React.CSSProperties,
+
paragraph: {
+
color: '#e2e8f0'
+
},
+
heading: {
+
1: { color: '#f8fafc', fontSize: 30 },
+
2: { color: '#f8fafc', fontSize: 28 },
+
3: { color: '#f8fafc', fontSize: 24 },
+
4: { color: '#e2e8f0', fontSize: 20 },
+
5: { color: '#e2e8f0', fontSize: 18 },
+
6: { color: '#e2e8f0', fontSize: 16 }
+
} satisfies Record<number, React.CSSProperties>,
+
blockquote: {
+
background: 'rgba(30, 41, 59, 0.6)',
+
borderColor: '#38bdf8',
+
color: '#e2e8f0'
+
},
+
figure: {},
+
imageWrapper: {
+
background: '#1e293b'
+
},
+
image: {},
+
imagePlaceholder: {
+
color: '#94a3b8'
+
},
+
caption: {
+
color: '#94a3b8'
+
},
+
list: {
+
color: '#f1f5f9'
+
},
+
linkCard: {
+
borderColor: 'rgba(148, 163, 184, 0.3)',
+
background: 'rgba(15, 23, 42, 0.8)',
+
color: '#e2e8f0'
+
},
+
linkPreview: {},
+
linkPreviewPlaceholder: {
+
background: '#1e293b',
+
color: '#94a3b8'
+
},
+
linkTitle: {
+
fontSize: 16,
+
color: '#e0f2fe'
+
} satisfies React.CSSProperties,
+
linkDescription: {
+
margin: 0,
+
fontSize: 14,
+
color: '#cbd5f5',
+
lineHeight: 1.5
+
} satisfies React.CSSProperties,
+
linkUrl: {
+
fontSize: 13,
+
color: '#38bdf8',
+
wordBreak: 'break-all'
+
} satisfies React.CSSProperties,
+
math: {
+
background: 'rgba(15, 23, 42, 0.8)',
+
color: '#e2e8f0',
+
border: '1px solid rgba(148, 163, 184, 0.35)'
+
},
+
code: {
+
background: '#020617',
+
color: '#e2e8f0'
+
},
+
hr: {
+
borderColor: 'rgba(148, 163, 184, 0.3)'
+
}
+
}
+
} as const;
+
+
const linkStyles = {
+
light: {
+
color: '#2563eb',
+
textDecoration: 'underline'
+
} satisfies React.CSSProperties,
+
dark: {
+
color: '#38bdf8',
+
textDecoration: 'underline'
+
} satisfies React.CSSProperties
+
} as const;
+
+
const inlineCodeStyles = {
+
light: {
+
fontFamily: 'Menlo, Consolas, "SFMono-Regular", ui-monospace',
+
background: '#f1f5f9',
+
padding: '0 4px',
+
borderRadius: 4
+
} satisfies React.CSSProperties,
+
dark: {
+
fontFamily: 'Menlo, Consolas, "SFMono-Regular", ui-monospace',
+
background: '#1e293b',
+
padding: '0 4px',
+
borderRadius: 4
+
} satisfies React.CSSProperties
+
} as const;
+
+
const highlightStyles = {
+
light: {
+
background: '#fef08a'
+
} satisfies React.CSSProperties,
+
dark: {
+
background: '#facc15',
+
color: '#0f172a'
+
} satisfies React.CSSProperties
+
} as const;
+
+
export default LeafletDocumentRenderer;
+166
lib/renderers/TangledStringRenderer.tsx
···
+
import React from 'react';
+
import type { ShTangledString } from '@atcute/tangled';
+
import { useColorScheme, type ColorSchemePreference } from '../hooks/useColorScheme';
+
+
export type TangledStringRecord = ShTangledString.Main;
+
+
export interface TangledStringRendererProps {
+
record: TangledStringRecord;
+
error?: Error;
+
loading: boolean;
+
colorScheme?: ColorSchemePreference;
+
did: string;
+
rkey: string;
+
canonicalUrl?: string;
+
}
+
+
export const TangledStringRenderer: React.FC<TangledStringRendererProps> = ({ record, error, loading, colorScheme = 'system', did, rkey, canonicalUrl }) => {
+
const scheme = useColorScheme(colorScheme);
+
+
if (error) return <div style={{ padding: 8, color: 'crimson' }}>Failed to load snippet.</div>;
+
if (loading && !record) return <div style={{ padding: 8 }}>Loading…</div>;
+
+
const palette = scheme === 'dark' ? theme.dark : theme.light;
+
const viewUrl = canonicalUrl ?? `https://tangled.org/strings/${did}/${encodeURIComponent(rkey)}`;
+
const timestamp = new Date(record.createdAt).toLocaleString(undefined, { dateStyle: 'medium', timeStyle: 'short' });
+
return (
+
<div style={{ ...base.container, ...palette.container }}>
+
<div style={{ ...base.header, ...palette.header }}>
+
<strong style={{ ...base.filename, ...palette.filename }}>{record.filename}</strong>
+
<div style={{ ...base.headerRight, ...palette.headerRight }}>
+
<time style={{ ...base.timestamp, ...palette.timestamp }} dateTime={record.createdAt}>{timestamp}</time>
+
<a href={viewUrl} target="_blank" rel="noopener noreferrer" style={{ ...base.headerLink, ...palette.headerLink }}>
+
View on Tangled
+
</a>
+
</div>
+
</div>
+
{record.description && (
+
<div style={{ ...base.description, ...palette.description }}>{record.description}</div>
+
)}
+
<pre style={{ ...base.codeBlock, ...palette.codeBlock }}>
+
<code>{record.contents}</code>
+
</pre>
+
</div>
+
);
+
};
+
+
const base: Record<string, React.CSSProperties> = {
+
container: {
+
fontFamily: 'system-ui, sans-serif',
+
borderRadius: 6,
+
overflow: 'hidden',
+
transition: 'background-color 180ms ease, border-color 180ms ease, color 180ms ease, box-shadow 180ms ease',
+
width: '100%'
+
},
+
header: {
+
padding: '10px 16px',
+
display: 'flex',
+
justifyContent: 'space-between',
+
alignItems: 'center',
+
gap: 12
+
},
+
headerRight: {
+
display: 'flex',
+
alignItems: 'center',
+
gap: 12,
+
flexWrap: 'wrap',
+
justifyContent: 'flex-end'
+
},
+
filename: {
+
fontFamily: 'SFMono-Regular, ui-monospace, Menlo, Monaco, "Courier New", monospace',
+
fontSize: 13,
+
wordBreak: 'break-all'
+
},
+
timestamp: {
+
fontSize: 12
+
},
+
headerLink: {
+
fontSize: 12,
+
fontWeight: 600,
+
textDecoration: 'none'
+
},
+
description: {
+
padding: '10px 16px',
+
fontSize: 13,
+
borderTop: '1px solid transparent'
+
},
+
codeBlock: {
+
margin: 0,
+
padding: '16px',
+
fontSize: 13,
+
overflowX: 'auto',
+
borderTop: '1px solid transparent',
+
fontFamily: 'SFMono-Regular, ui-monospace, Menlo, Monaco, "Courier New", monospace'
+
}
+
};
+
+
const theme = {
+
light: {
+
container: {
+
border: '1px solid #d0d7de',
+
background: '#f6f8fa',
+
color: '#1f2328',
+
boxShadow: '0 1px 2px rgba(31,35,40,0.05)'
+
},
+
header: {
+
background: '#f6f8fa',
+
borderBottom: '1px solid #d0d7de'
+
},
+
headerRight: {},
+
filename: {
+
color: '#1f2328'
+
},
+
timestamp: {
+
color: '#57606a'
+
},
+
headerLink: {
+
color: '#2563eb'
+
},
+
description: {
+
background: '#ffffff',
+
borderBottom: '1px solid #d0d7de',
+
borderTopColor: '#d0d7de',
+
color: '#1f2328'
+
},
+
codeBlock: {
+
background: '#ffffff',
+
color: '#1f2328',
+
borderTopColor: '#d0d7de'
+
}
+
},
+
dark: {
+
container: {
+
border: '1px solid #30363d',
+
background: '#0d1117',
+
color: '#c9d1d9',
+
boxShadow: '0 0 0 1px rgba(1,4,9,0.3) inset'
+
},
+
header: {
+
background: '#161b22',
+
borderBottom: '1px solid #30363d'
+
},
+
headerRight: {},
+
filename: {
+
color: '#c9d1d9'
+
},
+
timestamp: {
+
color: '#8b949e'
+
},
+
headerLink: {
+
color: '#58a6ff'
+
},
+
description: {
+
background: '#161b22',
+
borderBottom: '1px solid #30363d',
+
borderTopColor: '#30363d',
+
color: '#c9d1d9'
+
},
+
codeBlock: {
+
background: '#0d1117',
+
color: '#c9d1d9',
+
borderTopColor: '#30363d'
+
}
+
}
+
} satisfies Record<'light' | 'dark', Record<string, React.CSSProperties>>;
+
+
export default TangledStringRenderer;
+120
lib/styles/highlight.css
···
+
:root {
+
--hljs-foreground: #1f2328;
+
--hljs-background: transparent;
+
--hljs-comment: #6e7781;
+
--hljs-keyword: #cf222e;
+
--hljs-attr: #0550ae;
+
--hljs-string: #0a3069;
+
--hljs-title: #24292f;
+
--hljs-number: #953800;
+
--hljs-addition: #116329;
+
--hljs-deletion: #cf222e;
+
}
+
+
:root[data-color-scheme='light'],
+
[data-color-scheme='light'] {
+
--hljs-foreground: #1f2328;
+
--hljs-background: rgba(15, 23, 42, 0.03);
+
--hljs-comment: #6e7781;
+
--hljs-keyword: #0f59d1;
+
--hljs-attr: #1d4ed8;
+
--hljs-string: #0f766e;
+
--hljs-title: #1f2937;
+
--hljs-number: #b45309;
+
--hljs-addition: #15803d;
+
--hljs-deletion: #dc2626;
+
}
+
+
:root[data-color-scheme='dark'],
+
[data-color-scheme='dark'] {
+
--hljs-foreground: #c9d1d9;
+
--hljs-background: rgba(8, 16, 32, 0.55);
+
--hljs-comment: #8b949e;
+
--hljs-keyword: #ff7b72;
+
--hljs-attr: #79c0ff;
+
--hljs-string: #a5d6ff;
+
--hljs-title: #d2a8ff;
+
--hljs-number: #ffa657;
+
--hljs-addition: #1a7f37;
+
--hljs-deletion: #ff7b72;
+
}
+
+
:root:not([data-color-scheme]),
+
[data-color-scheme]:not([data-color-scheme='light']):not([data-color-scheme='dark']) {
+
--hljs-foreground: #1f2328;
+
--hljs-background: transparent;
+
--hljs-comment: #6e7781;
+
--hljs-keyword: #cf222e;
+
--hljs-attr: #0550ae;
+
--hljs-string: #0a3069;
+
--hljs-title: #24292f;
+
--hljs-number: #953800;
+
--hljs-addition: #116329;
+
--hljs-deletion: #cf222e;
+
}
+
+
.hljs {
+
display: block;
+
overflow-x: auto;
+
padding: 0;
+
background: var(--hljs-background);
+
color: var(--hljs-foreground);
+
}
+
+
.hljs-comment,
+
.hljs-quote {
+
color: var(--hljs-comment);
+
font-style: italic;
+
}
+
+
.hljs-keyword,
+
.hljs-selector-tag,
+
.hljs-literal {
+
color: var(--hljs-keyword);
+
}
+
+
.hljs-attr,
+
.hljs-attribute,
+
.hljs-symbol,
+
.hljs-bullet,
+
.hljs-built_in,
+
.hljs-link,
+
.hljs-meta,
+
.hljs-selector-attr,
+
.hljs-selector-pseudo {
+
color: var(--hljs-attr);
+
}
+
+
.hljs-number,
+
.hljs-variable,
+
.hljs-template-variable,
+
.hljs-title,
+
.hljs-name,
+
.hljs-tag {
+
color: var(--hljs-number);
+
}
+
+
.hljs-string,
+
.hljs-doctag,
+
.hljs-regexp,
+
.hljs-addition {
+
color: var(--hljs-string);
+
}
+
+
.hljs-type,
+
.hljs-class .hljs-title {
+
color: var(--hljs-title);
+
font-weight: 600;
+
}
+
+
.hljs-deletion {
+
color: var(--hljs-deletion);
+
}
+
+
.hljs-emphasis {
+
font-style: italic;
+
}
+
+
.hljs-strong {
+
font-weight: 600;
+
}
+6
lib/types/bluesky.ts
···
+
// Re-export precise lexicon types from @atcute/bluesky instead of redefining.
+
import type { AppBskyFeedPost, AppBskyActorProfile } from '@atcute/bluesky';
+
+
// The atcute lexicon modules expose Main interface for record input shapes.
+
export type FeedPostRecord = AppBskyFeedPost.Main;
+
export type ProfileRecord = AppBskyActorProfile.Main;
+240
lib/types/leaflet.ts
···
+
export interface StrongRef {
+
uri: string;
+
cid: string;
+
}
+
+
export interface LeafletDocumentRecord {
+
$type?: "pub.leaflet.document";
+
title: string;
+
postRef?: StrongRef;
+
description?: string;
+
publishedAt?: string;
+
publication: string;
+
author: string;
+
pages: LeafletDocumentPage[];
+
}
+
+
export type LeafletDocumentPage = LeafletLinearDocumentPage;
+
+
export interface LeafletLinearDocumentPage {
+
$type?: "pub.leaflet.pages.linearDocument";
+
blocks?: LeafletLinearDocumentBlock[];
+
}
+
+
export type LeafletAlignmentValue =
+
| "#textAlignLeft"
+
| "#textAlignCenter"
+
| "#textAlignRight"
+
| "#textAlignJustify"
+
| "textAlignLeft"
+
| "textAlignCenter"
+
| "textAlignRight"
+
| "textAlignJustify";
+
+
export interface LeafletLinearDocumentBlock {
+
block: LeafletBlock;
+
alignment?: LeafletAlignmentValue;
+
}
+
+
export type LeafletBlock =
+
| LeafletTextBlock
+
| LeafletHeaderBlock
+
| LeafletBlockquoteBlock
+
| LeafletImageBlock
+
| LeafletUnorderedListBlock
+
| LeafletWebsiteBlock
+
| LeafletIFrameBlock
+
| LeafletMathBlock
+
| LeafletCodeBlock
+
| LeafletHorizontalRuleBlock
+
| LeafletBskyPostBlock;
+
+
export interface LeafletBaseTextBlock {
+
plaintext: string;
+
facets?: LeafletRichTextFacet[];
+
}
+
+
export interface LeafletTextBlock extends LeafletBaseTextBlock {
+
$type?: "pub.leaflet.blocks.text";
+
}
+
+
export interface LeafletHeaderBlock extends LeafletBaseTextBlock {
+
$type?: "pub.leaflet.blocks.header";
+
level?: number;
+
}
+
+
export interface LeafletBlockquoteBlock extends LeafletBaseTextBlock {
+
$type?: "pub.leaflet.blocks.blockquote";
+
}
+
+
export interface LeafletImageBlock {
+
$type?: "pub.leaflet.blocks.image";
+
image: LeafletBlobRef;
+
alt?: string;
+
aspectRatio: {
+
width: number;
+
height: number;
+
};
+
}
+
+
export interface LeafletUnorderedListBlock {
+
$type?: "pub.leaflet.blocks.unorderedList";
+
children: LeafletListItem[];
+
}
+
+
export interface LeafletListItem {
+
content: LeafletListContent;
+
children?: LeafletListItem[];
+
}
+
+
export type LeafletListContent = LeafletTextBlock | LeafletHeaderBlock | LeafletImageBlock;
+
+
export interface LeafletWebsiteBlock {
+
$type?: "pub.leaflet.blocks.website";
+
src: string;
+
title?: string;
+
description?: string;
+
previewImage?: LeafletBlobRef;
+
}
+
+
export interface LeafletIFrameBlock {
+
$type?: "pub.leaflet.blocks.iframe";
+
url: string;
+
height?: number;
+
}
+
+
export interface LeafletMathBlock {
+
$type?: "pub.leaflet.blocks.math";
+
tex: string;
+
}
+
+
export interface LeafletCodeBlock {
+
$type?: "pub.leaflet.blocks.code";
+
plaintext: string;
+
language?: string;
+
syntaxHighlightingTheme?: string;
+
}
+
+
export interface LeafletHorizontalRuleBlock {
+
$type?: "pub.leaflet.blocks.horizontalRule";
+
}
+
+
export interface LeafletBskyPostBlock {
+
$type?: "pub.leaflet.blocks.bskyPost";
+
postRef: StrongRef;
+
}
+
+
export interface LeafletRichTextFacet {
+
index: LeafletByteSlice;
+
features: LeafletRichTextFeature[];
+
}
+
+
export interface LeafletByteSlice {
+
byteStart: number;
+
byteEnd: number;
+
}
+
+
export type LeafletRichTextFeature =
+
| LeafletRichTextLinkFeature
+
| LeafletRichTextCodeFeature
+
| LeafletRichTextHighlightFeature
+
| LeafletRichTextUnderlineFeature
+
| LeafletRichTextStrikethroughFeature
+
| LeafletRichTextIdFeature
+
| LeafletRichTextBoldFeature
+
| LeafletRichTextItalicFeature;
+
+
export interface LeafletRichTextLinkFeature {
+
$type: "pub.leaflet.richtext.facet#link";
+
uri: string;
+
}
+
+
export interface LeafletRichTextCodeFeature {
+
$type: "pub.leaflet.richtext.facet#code";
+
}
+
+
export interface LeafletRichTextHighlightFeature {
+
$type: "pub.leaflet.richtext.facet#highlight";
+
}
+
+
export interface LeafletRichTextUnderlineFeature {
+
$type: "pub.leaflet.richtext.facet#underline";
+
}
+
+
export interface LeafletRichTextStrikethroughFeature {
+
$type: "pub.leaflet.richtext.facet#strikethrough";
+
}
+
+
export interface LeafletRichTextIdFeature {
+
$type: "pub.leaflet.richtext.facet#id";
+
id?: string;
+
}
+
+
export interface LeafletRichTextBoldFeature {
+
$type: "pub.leaflet.richtext.facet#bold";
+
}
+
+
export interface LeafletRichTextItalicFeature {
+
$type: "pub.leaflet.richtext.facet#italic";
+
}
+
+
export interface LeafletBlobRef {
+
$type?: string;
+
ref?: {
+
$link?: string;
+
};
+
cid?: string;
+
mimeType?: string;
+
size?: number;
+
}
+
+
export interface LeafletPublicationRecord {
+
$type?: "pub.leaflet.publication";
+
name: string;
+
base_path?: string;
+
description?: string;
+
icon?: LeafletBlobRef;
+
theme?: LeafletTheme;
+
preferences?: LeafletPublicationPreferences;
+
}
+
+
export interface LeafletPublicationPreferences {
+
showInDiscover?: boolean;
+
showComments?: boolean;
+
}
+
+
export interface LeafletTheme {
+
backgroundColor?: LeafletThemeColor;
+
backgroundImage?: LeafletThemeBackgroundImage;
+
primary?: LeafletThemeColor;
+
pageBackground?: LeafletThemeColor;
+
showPageBackground?: boolean;
+
accentBackground?: LeafletThemeColor;
+
accentText?: LeafletThemeColor;
+
}
+
+
export type LeafletThemeColor = LeafletThemeColorRgb | LeafletThemeColorRgba;
+
+
export interface LeafletThemeColorRgb {
+
$type?: "pub.leaflet.theme.color#rgb";
+
r: number;
+
g: number;
+
b: number;
+
}
+
+
export interface LeafletThemeColorRgba {
+
$type?: "pub.leaflet.theme.color#rgba";
+
r: number;
+
g: number;
+
b: number;
+
a: number;
+
}
+
+
export interface LeafletThemeBackgroundImage {
+
$type?: "pub.leaflet.theme.backgroundImage";
+
image: LeafletBlobRef;
+
width?: number;
+
repeat?: boolean;
+
}
+
+
export type LeafletInlineRenderable = LeafletTextBlock | LeafletHeaderBlock | LeafletBlockquoteBlock;
+44
lib/utils/at-uri.ts
···
+
export interface ParsedAtUri {
+
did: string;
+
collection: string;
+
rkey: string;
+
}
+
+
export function parseAtUri(uri?: string): ParsedAtUri | undefined {
+
if (!uri || !uri.startsWith('at://')) return undefined;
+
const withoutScheme = uri.slice('at://'.length);
+
const [did, collection, rkey] = withoutScheme.split('/');
+
if (!did || !collection || !rkey) return undefined;
+
return { did, collection, rkey };
+
}
+
+
export function toBlueskyPostUrl(target: ParsedAtUri): string | undefined {
+
if (target.collection !== 'app.bsky.feed.post') return undefined;
+
return `https://bsky.app/profile/${target.did}/post/${target.rkey}`;
+
}
+
+
export function formatDidForLabel(did: string): string {
+
return did.replace(/^did:(plc:)?/, '');
+
}
+
+
const ABSOLUTE_URL_PATTERN = /^[a-zA-Z][a-zA-Z\d+\-.]*:/;
+
+
export function normalizeLeafletBasePath(basePath?: string): string | undefined {
+
if (!basePath) return undefined;
+
const trimmed = basePath.trim();
+
if (!trimmed) return undefined;
+
const withScheme = ABSOLUTE_URL_PATTERN.test(trimmed) ? trimmed : `https://${trimmed}`;
+
try {
+
const url = new URL(withScheme);
+
url.hash = '';
+
return url.href.replace(/\/?$/, '');
+
} catch {
+
return undefined;
+
}
+
}
+
+
export function leafletRkeyUrl(basePath: string | undefined, rkey: string): string | undefined {
+
const normalized = normalizeLeafletBasePath(basePath);
+
if (!normalized) return undefined;
+
return `${normalized}/${encodeURIComponent(rkey)}`;
+
}
+90
lib/utils/atproto-client.ts
···
+
import { Client, simpleFetchHandler } from '@atcute/client';
+
import { CompositeDidDocumentResolver, PlcDidDocumentResolver, WebDidDocumentResolver, XrpcHandleResolver } from '@atcute/identity-resolver';
+
import type { DidDocument } from '@atcute/identity';
+
import type { Did, Handle } from '@atcute/lexicons/syntax';
+
import type {} from '@atcute/tangled';
+
import type {} from '@atcute/atproto';
+
+
export interface ServiceResolverOptions {
+
plcDirectory?: string;
+
identityService?: string;
+
fetch?: typeof fetch;
+
}
+
+
const DEFAULT_PLC = 'https://plc.directory';
+
const DEFAULT_IDENTITY_SERVICE = 'https://public.api.bsky.app';
+
const ABSOLUTE_URL_RE = /^[a-zA-Z][a-zA-Z\d+\-.]*:/;
+
const SUPPORTED_DID_METHODS = ['plc', 'web'] as const;
+
type SupportedDidMethod = (typeof SUPPORTED_DID_METHODS)[number];
+
type SupportedDid = Did<SupportedDidMethod>;
+
+
export const normalizeBaseUrl = (input: string): string => {
+
const trimmed = input.trim();
+
if (!trimmed) throw new Error('Service URL cannot be empty');
+
const withScheme = ABSOLUTE_URL_RE.test(trimmed) ? trimmed : `https://${trimmed.replace(/^\/+/, '')}`;
+
const url = new URL(withScheme);
+
const pathname = url.pathname.replace(/\/+$/, '');
+
return pathname ? `${url.origin}${pathname}` : url.origin;
+
};
+
+
export class ServiceResolver {
+
private plc: string;
+
private didResolver: CompositeDidDocumentResolver<SupportedDidMethod>;
+
private handleResolver: XrpcHandleResolver;
+
constructor(opts: ServiceResolverOptions = {}) {
+
const plcSource = opts.plcDirectory && opts.plcDirectory.trim() ? opts.plcDirectory : DEFAULT_PLC;
+
const identitySource = opts.identityService && opts.identityService.trim() ? opts.identityService : DEFAULT_IDENTITY_SERVICE;
+
this.plc = normalizeBaseUrl(plcSource);
+
const identityBase = normalizeBaseUrl(identitySource);
+
const fetchImpl = opts.fetch ?? fetch;
+
const plcResolver = new PlcDidDocumentResolver({ apiUrl: this.plc, fetch: fetchImpl });
+
const webResolver = new WebDidDocumentResolver({ fetch: fetchImpl });
+
this.didResolver = new CompositeDidDocumentResolver({ methods: { plc: plcResolver, web: webResolver } });
+
this.handleResolver = new XrpcHandleResolver({ serviceUrl: identityBase, fetch: fetchImpl });
+
}
+
+
async resolveDidDoc(did: string): Promise<DidDocument> {
+
const trimmed = did.trim();
+
if (!trimmed.startsWith('did:')) throw new Error(`Invalid DID ${did}`);
+
const methodEnd = trimmed.indexOf(':', 4);
+
const method = (methodEnd === -1 ? trimmed.slice(4) : trimmed.slice(4, methodEnd)) as string;
+
if (!SUPPORTED_DID_METHODS.includes(method as SupportedDidMethod)) {
+
throw new Error(`Unsupported DID method ${method ?? '<unknown>'}`);
+
}
+
return this.didResolver.resolve(trimmed as SupportedDid);
+
}
+
+
async pdsEndpointForDid(did: string): Promise<string> {
+
const doc = await this.resolveDidDoc(did);
+
const svc = doc.service?.find(s => s.type === 'AtprotoPersonalDataServer');
+
if (!svc || !svc.serviceEndpoint || typeof svc.serviceEndpoint !== 'string') {
+
throw new Error(`No PDS endpoint in DID doc for ${did}`);
+
}
+
return svc.serviceEndpoint.replace(/\/$/, '');
+
}
+
+
async resolveHandle(handle: string): Promise<string> {
+
const normalized = handle.trim().toLowerCase();
+
if (!normalized) throw new Error('Handle cannot be empty');
+
return this.handleResolver.resolve(normalized as Handle);
+
}
+
}
+
+
export interface CreateClientOptions extends ServiceResolverOptions {
+
did?: string; // optional to create a DID-scoped client
+
service?: string; // override service base url
+
}
+
+
export async function createAtprotoClient(opts: CreateClientOptions = {}) {
+
let service = opts.service;
+
const resolver = new ServiceResolver(opts);
+
if (!service && opts.did) {
+
service = await resolver.pdsEndpointForDid(opts.did);
+
}
+
if (!service) throw new Error('service or did required');
+
const handler = simpleFetchHandler({ service: normalizeBaseUrl(service) });
+
const rpc = new Client({ handler });
+
return { rpc, service, resolver };
+
}
+
+
export type AtprotoClient = Awaited<ReturnType<typeof createAtprotoClient>>['rpc'];
+13
lib/utils/profile.ts
···
+
import type { ProfileRecord } from '../types/bluesky';
+
+
interface LegacyBlobRef {
+
ref?: { $link?: string };
+
cid?: string;
+
}
+
+
export function getAvatarCid(record: ProfileRecord | undefined): string | undefined {
+
const avatar = record?.avatar as LegacyBlobRef | undefined;
+
if (!avatar) return undefined;
+
if (typeof avatar.cid === 'string') return avatar.cid;
+
return avatar.ref?.$link;
+
}
+2863
package-lock.json
···
+
{
+
"name": "atproto-ui",
+
"version": "0.1.1",
+
"lockfileVersion": 3,
+
"requires": true,
+
"packages": {
+
"": {
+
"name": "atproto-ui",
+
"version": "0.1.0",
+
"dependencies": {
+
"@atcute/atproto": "^3.1.7",
+
"@atcute/bluesky": "^3.2.3",
+
"@atcute/client": "^4.0.3",
+
"@atcute/identity-resolver": "^1.1.3",
+
"@atcute/tangled": "^1.0.6"
+
},
+
"devDependencies": {
+
"@eslint/js": "^9.36.0",
+
"@types/node": "^24.6.0",
+
"@types/react": "^19.1.16",
+
"@types/react-dom": "^19.1.9",
+
"@vitejs/plugin-react": "^5.0.4",
+
"eslint": "^9.36.0",
+
"eslint-plugin-react-hooks": "^5.2.0",
+
"eslint-plugin-react-refresh": "^0.4.22",
+
"globals": "^16.4.0",
+
"react": "^19.1.1",
+
"react-dom": "^19.1.1",
+
"typescript": "~5.9.3",
+
"typescript-eslint": "^8.45.0",
+
"vite": "npm:rolldown-vite@7.1.14"
+
},
+
"peerDependencies": {
+
"react": "^18.2.0 || ^19.0.0",
+
"react-dom": "^18.2.0 || ^19.0.0"
+
},
+
"peerDependenciesMeta": {
+
"react-dom": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/@atcute/atproto": {
+
"version": "3.1.7",
+
"resolved": "https://registry.npmjs.org/@atcute/atproto/-/atproto-3.1.7.tgz",
+
"integrity": "sha512-3Ym8qaVZg2vf8qw0KO1aue39z/5oik5J+UDoSes1vr8ddw40UVLA5sV4bXSKmLnhzQHiLLgoVZXe4zaKfozPoQ==",
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/lexicons": "^1.2.2"
+
}
+
},
+
"node_modules/@atcute/bluesky": {
+
"version": "3.2.3",
+
"resolved": "https://registry.npmjs.org/@atcute/bluesky/-/bluesky-3.2.3.tgz",
+
"integrity": "sha512-IdPQQ54F1BLhW5z49k81ZUC/GQl/tVygZ+CzLHYvQySHA6GJRcvPzwEf8aV21u0SZOJF+yF4CWEGNgtryyxPmg==",
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/atproto": "^3.1.4",
+
"@atcute/lexicons": "^1.1.1"
+
}
+
},
+
"node_modules/@atcute/client": {
+
"version": "4.0.3",
+
"resolved": "https://registry.npmjs.org/@atcute/client/-/client-4.0.3.tgz",
+
"integrity": "sha512-RIOZWFVLca/HiPAAUDqQPOdOreCxTbL5cb+WUf5yqQOKIu5yEAP3eksinmlLmgIrlr5qVOE7brazUUzaskFCfw==",
+
"license": "MIT",
+
"dependencies": {
+
"@atcute/identity": "^1.0.2",
+
"@atcute/lexicons": "^1.0.3"
+
}
+
},
+
"node_modules/@atcute/identity": {
+
"version": "1.1.0",
+
"resolved": "https://registry.npmjs.org/@atcute/identity/-/identity-1.1.0.tgz",
+
"integrity": "sha512-6vRvRqJatDB+JUQsb+UswYmtBGQnSZcqC3a2y6H5DB/v5KcIh+6nFFtc17G0+3W9rxdk7k9M4KkgkdKf/YDNoQ==",
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/lexicons": "^1.1.1",
+
"@badrap/valita": "^0.4.5"
+
}
+
},
+
"node_modules/@atcute/identity-resolver": {
+
"version": "1.1.4",
+
"resolved": "https://registry.npmjs.org/@atcute/identity-resolver/-/identity-resolver-1.1.4.tgz",
+
"integrity": "sha512-/SVh8vf2cXFJenmBnGeYF2aY3WGQm3cJeew5NWTlkqoy3LvJ5wkvKq9PWu4Tv653VF40rPOp6LOdVr9Fa+q5rA==",
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/lexicons": "^1.2.2",
+
"@atcute/util-fetch": "^1.0.3",
+
"@badrap/valita": "^0.4.6"
+
},
+
"peerDependencies": {
+
"@atcute/identity": "^1.0.0"
+
}
+
},
+
"node_modules/@atcute/lexicons": {
+
"version": "1.2.2",
+
"resolved": "https://registry.npmjs.org/@atcute/lexicons/-/lexicons-1.2.2.tgz",
+
"integrity": "sha512-bgEhJq5Z70/0TbK5sx+tAkrR8FsCODNiL2gUEvS5PuJfPxmFmRYNWaMGehxSPaXWpU2+Oa9ckceHiYbrItDTkA==",
+
"license": "0BSD",
+
"dependencies": {
+
"@standard-schema/spec": "^1.0.0",
+
"esm-env": "^1.2.2"
+
}
+
},
+
"node_modules/@atcute/tangled": {
+
"version": "1.0.6",
+
"resolved": "https://registry.npmjs.org/@atcute/tangled/-/tangled-1.0.6.tgz",
+
"integrity": "sha512-eEOtrKRbjKfeLYtb5hmkhE45w8h4sV6mT4E2CQzJmhOMGCiK31GX7Vqfh59rhNLb9AlbW72RcQTV737pxx+ksw==",
+
"license": "0BSD",
+
"dependencies": {
+
"@atcute/atproto": "^3.1.4",
+
"@atcute/lexicons": "^1.1.1"
+
}
+
},
+
"node_modules/@atcute/util-fetch": {
+
"version": "1.0.3",
+
"resolved": "https://registry.npmjs.org/@atcute/util-fetch/-/util-fetch-1.0.3.tgz",
+
"integrity": "sha512-f8zzTb/xlKIwv2OQ31DhShPUNCmIIleX6p7qIXwWwEUjX6x8skUtpdISSjnImq01LXpltGV5y8yhV4/Mlb7CRQ==",
+
"license": "0BSD",
+
"dependencies": {
+
"@badrap/valita": "^0.4.6"
+
}
+
},
+
"node_modules/@babel/code-frame": {
+
"version": "7.27.1",
+
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz",
+
"integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-validator-identifier": "^7.27.1",
+
"js-tokens": "^4.0.0",
+
"picocolors": "^1.1.1"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/compat-data": {
+
"version": "7.28.4",
+
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.4.tgz",
+
"integrity": "sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/core": {
+
"version": "7.28.4",
+
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz",
+
"integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/code-frame": "^7.27.1",
+
"@babel/generator": "^7.28.3",
+
"@babel/helper-compilation-targets": "^7.27.2",
+
"@babel/helper-module-transforms": "^7.28.3",
+
"@babel/helpers": "^7.28.4",
+
"@babel/parser": "^7.28.4",
+
"@babel/template": "^7.27.2",
+
"@babel/traverse": "^7.28.4",
+
"@babel/types": "^7.28.4",
+
"@jridgewell/remapping": "^2.3.5",
+
"convert-source-map": "^2.0.0",
+
"debug": "^4.1.0",
+
"gensync": "^1.0.0-beta.2",
+
"json5": "^2.2.3",
+
"semver": "^6.3.1"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/babel"
+
}
+
},
+
"node_modules/@babel/generator": {
+
"version": "7.28.3",
+
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz",
+
"integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/parser": "^7.28.3",
+
"@babel/types": "^7.28.2",
+
"@jridgewell/gen-mapping": "^0.3.12",
+
"@jridgewell/trace-mapping": "^0.3.28",
+
"jsesc": "^3.0.2"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-compilation-targets": {
+
"version": "7.27.2",
+
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz",
+
"integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/compat-data": "^7.27.2",
+
"@babel/helper-validator-option": "^7.27.1",
+
"browserslist": "^4.24.0",
+
"lru-cache": "^5.1.1",
+
"semver": "^6.3.1"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-globals": {
+
"version": "7.28.0",
+
"resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz",
+
"integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-module-imports": {
+
"version": "7.27.1",
+
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz",
+
"integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/traverse": "^7.27.1",
+
"@babel/types": "^7.27.1"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-module-transforms": {
+
"version": "7.28.3",
+
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz",
+
"integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-module-imports": "^7.27.1",
+
"@babel/helper-validator-identifier": "^7.27.1",
+
"@babel/traverse": "^7.28.3"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
},
+
"peerDependencies": {
+
"@babel/core": "^7.0.0"
+
}
+
},
+
"node_modules/@babel/helper-plugin-utils": {
+
"version": "7.27.1",
+
"resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz",
+
"integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-string-parser": {
+
"version": "7.27.1",
+
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-validator-identifier": {
+
"version": "7.27.1",
+
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+
"integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helper-validator-option": {
+
"version": "7.27.1",
+
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz",
+
"integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/helpers": {
+
"version": "7.28.4",
+
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.4.tgz",
+
"integrity": "sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/template": "^7.27.2",
+
"@babel/types": "^7.28.4"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/parser": {
+
"version": "7.28.4",
+
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.4.tgz",
+
"integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/types": "^7.28.4"
+
},
+
"bin": {
+
"parser": "bin/babel-parser.js"
+
},
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/@babel/plugin-transform-react-jsx-self": {
+
"version": "7.27.1",
+
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz",
+
"integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-plugin-utils": "^7.27.1"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
},
+
"peerDependencies": {
+
"@babel/core": "^7.0.0-0"
+
}
+
},
+
"node_modules/@babel/plugin-transform-react-jsx-source": {
+
"version": "7.27.1",
+
"resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz",
+
"integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-plugin-utils": "^7.27.1"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
},
+
"peerDependencies": {
+
"@babel/core": "^7.0.0-0"
+
}
+
},
+
"node_modules/@babel/template": {
+
"version": "7.27.2",
+
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz",
+
"integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/code-frame": "^7.27.1",
+
"@babel/parser": "^7.27.2",
+
"@babel/types": "^7.27.1"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/traverse": {
+
"version": "7.28.4",
+
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.4.tgz",
+
"integrity": "sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/code-frame": "^7.27.1",
+
"@babel/generator": "^7.28.3",
+
"@babel/helper-globals": "^7.28.0",
+
"@babel/parser": "^7.28.4",
+
"@babel/template": "^7.27.2",
+
"@babel/types": "^7.28.4",
+
"debug": "^4.3.1"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@babel/types": {
+
"version": "7.28.4",
+
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.4.tgz",
+
"integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/helper-string-parser": "^7.27.1",
+
"@babel/helper-validator-identifier": "^7.27.1"
+
},
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/@badrap/valita": {
+
"version": "0.4.6",
+
"resolved": "https://registry.npmjs.org/@badrap/valita/-/valita-0.4.6.tgz",
+
"integrity": "sha512-4kdqcjyxo/8RQ8ayjms47HCWZIF5981oE5nIenbfThKDxWXtEHKipAOWlflpPJzZx9y/JWYQkp18Awr7VuepFg==",
+
"license": "MIT",
+
"engines": {
+
"node": ">= 18"
+
}
+
},
+
"node_modules/@eslint-community/eslint-utils": {
+
"version": "4.9.0",
+
"resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.0.tgz",
+
"integrity": "sha512-ayVFHdtZ+hsq1t2Dy24wCmGXGe4q9Gu3smhLYALJrr473ZH27MsnSL+LKUlimp4BWJqMDMLmPpx/Q9R3OAlL4g==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"eslint-visitor-keys": "^3.4.3"
+
},
+
"engines": {
+
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+
}
+
},
+
"node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+
"version": "3.4.3",
+
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+
"integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
}
+
},
+
"node_modules/@eslint-community/regexpp": {
+
"version": "4.12.1",
+
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+
"integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+
}
+
},
+
"node_modules/@eslint/config-array": {
+
"version": "0.21.0",
+
"resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz",
+
"integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@eslint/object-schema": "^2.1.6",
+
"debug": "^4.3.1",
+
"minimatch": "^3.1.2"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@eslint/config-helpers": {
+
"version": "0.4.0",
+
"resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.4.0.tgz",
+
"integrity": "sha512-WUFvV4WoIwW8Bv0KeKCIIEgdSiFOsulyN0xrMu+7z43q/hkOLXjvb5u7UC9jDxvRzcrbEmuZBX5yJZz1741jog==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@eslint/core": "^0.16.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@eslint/core": {
+
"version": "0.16.0",
+
"resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.16.0.tgz",
+
"integrity": "sha512-nmC8/totwobIiFcGkDza3GIKfAw1+hLiYVrh3I1nIomQ8PEr5cxg34jnkmGawul/ep52wGRAcyeDCNtWKSOj4Q==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@types/json-schema": "^7.0.15"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@eslint/eslintrc": {
+
"version": "3.3.1",
+
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz",
+
"integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"ajv": "^6.12.4",
+
"debug": "^4.3.2",
+
"espree": "^10.0.1",
+
"globals": "^14.0.0",
+
"ignore": "^5.2.0",
+
"import-fresh": "^3.2.1",
+
"js-yaml": "^4.1.0",
+
"minimatch": "^3.1.2",
+
"strip-json-comments": "^3.1.1"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
}
+
},
+
"node_modules/@eslint/eslintrc/node_modules/globals": {
+
"version": "14.0.0",
+
"resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+
"integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=18"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/@eslint/js": {
+
"version": "9.37.0",
+
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.37.0.tgz",
+
"integrity": "sha512-jaS+NJ+hximswBG6pjNX0uEJZkrT0zwpVi3BA3vX22aFGjJjmgSTSmPpZCRKmoBL5VY/M6p0xsSJx7rk7sy5gg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"url": "https://eslint.org/donate"
+
}
+
},
+
"node_modules/@eslint/object-schema": {
+
"version": "2.1.6",
+
"resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz",
+
"integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@eslint/plugin-kit": {
+
"version": "0.4.0",
+
"resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.4.0.tgz",
+
"integrity": "sha512-sB5uyeq+dwCWyPi31B2gQlVlo+j5brPlWx4yZBrEaRo/nhdDE8Xke1gsGgtiBdaBTxuTkceLVuVt/pclrasb0A==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@eslint/core": "^0.16.0",
+
"levn": "^0.4.1"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
}
+
},
+
"node_modules/@humanfs/core": {
+
"version": "0.19.1",
+
"resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+
"integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">=18.18.0"
+
}
+
},
+
"node_modules/@humanfs/node": {
+
"version": "0.16.7",
+
"resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.7.tgz",
+
"integrity": "sha512-/zUx+yOsIrG4Y43Eh2peDeKCxlRt/gET6aHfaKpuq267qXdYDFViVHfMaLyygZOnl0kGWxFIgsBy8QFuTLUXEQ==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"dependencies": {
+
"@humanfs/core": "^0.19.1",
+
"@humanwhocodes/retry": "^0.4.0"
+
},
+
"engines": {
+
"node": ">=18.18.0"
+
}
+
},
+
"node_modules/@humanwhocodes/module-importer": {
+
"version": "1.0.1",
+
"resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+
"integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">=12.22"
+
},
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/nzakas"
+
}
+
},
+
"node_modules/@humanwhocodes/retry": {
+
"version": "0.4.3",
+
"resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz",
+
"integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">=18.18"
+
},
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/nzakas"
+
}
+
},
+
"node_modules/@jridgewell/gen-mapping": {
+
"version": "0.3.13",
+
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz",
+
"integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/sourcemap-codec": "^1.5.0",
+
"@jridgewell/trace-mapping": "^0.3.24"
+
}
+
},
+
"node_modules/@jridgewell/remapping": {
+
"version": "2.3.5",
+
"resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz",
+
"integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/gen-mapping": "^0.3.5",
+
"@jridgewell/trace-mapping": "^0.3.24"
+
}
+
},
+
"node_modules/@jridgewell/resolve-uri": {
+
"version": "3.1.2",
+
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.0.0"
+
}
+
},
+
"node_modules/@jridgewell/sourcemap-codec": {
+
"version": "1.5.5",
+
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@jridgewell/trace-mapping": {
+
"version": "0.3.31",
+
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz",
+
"integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@jridgewell/resolve-uri": "^3.1.0",
+
"@jridgewell/sourcemap-codec": "^1.4.14"
+
}
+
},
+
"node_modules/@nodelib/fs.scandir": {
+
"version": "2.1.5",
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+
"integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@nodelib/fs.stat": "2.0.5",
+
"run-parallel": "^1.1.9"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/@nodelib/fs.stat": {
+
"version": "2.0.5",
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+
"integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/@nodelib/fs.walk": {
+
"version": "1.2.8",
+
"resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+
"integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@nodelib/fs.scandir": "2.1.5",
+
"fastq": "^1.6.0"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/@oxc-project/runtime": {
+
"version": "0.92.0",
+
"resolved": "https://registry.npmjs.org/@oxc-project/runtime/-/runtime-0.92.0.tgz",
+
"integrity": "sha512-Z7x2dZOmznihvdvCvLKMl+nswtOSVxS2H2ocar+U9xx6iMfTp0VGIrX6a4xB1v80IwOPC7dT1LXIJrY70Xu3Jw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@oxc-project/types": {
+
"version": "0.93.0",
+
"resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.93.0.tgz",
+
"integrity": "sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==",
+
"dev": true,
+
"license": "MIT",
+
"funding": {
+
"url": "https://github.com/sponsors/Boshen"
+
}
+
},
+
"node_modules/@rolldown/binding-darwin-arm64": {
+
"version": "1.0.0-beta.41",
+
"resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-beta.41.tgz",
+
"integrity": "sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
}
+
},
+
"node_modules/@rolldown/pluginutils": {
+
"version": "1.0.0-beta.38",
+
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.38.tgz",
+
"integrity": "sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@standard-schema/spec": {
+
"version": "1.0.0",
+
"resolved": "https://registry.npmjs.org/@standard-schema/spec/-/spec-1.0.0.tgz",
+
"integrity": "sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==",
+
"license": "MIT"
+
},
+
"node_modules/@types/babel__core": {
+
"version": "7.20.5",
+
"resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+
"integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/parser": "^7.20.7",
+
"@babel/types": "^7.20.7",
+
"@types/babel__generator": "*",
+
"@types/babel__template": "*",
+
"@types/babel__traverse": "*"
+
}
+
},
+
"node_modules/@types/babel__generator": {
+
"version": "7.27.0",
+
"resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz",
+
"integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/types": "^7.0.0"
+
}
+
},
+
"node_modules/@types/babel__template": {
+
"version": "7.4.4",
+
"resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+
"integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/parser": "^7.1.0",
+
"@babel/types": "^7.0.0"
+
}
+
},
+
"node_modules/@types/babel__traverse": {
+
"version": "7.28.0",
+
"resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz",
+
"integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/types": "^7.28.2"
+
}
+
},
+
"node_modules/@types/estree": {
+
"version": "1.0.8",
+
"resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz",
+
"integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@types/json-schema": {
+
"version": "7.0.15",
+
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/@types/node": {
+
"version": "24.7.0",
+
"resolved": "https://registry.npmjs.org/@types/node/-/node-24.7.0.tgz",
+
"integrity": "sha512-IbKooQVqUBrlzWTi79E8Fw78l8k1RNtlDDNWsFZs7XonuQSJ8oNYfEeclhprUldXISRMLzBpILuKgPlIxm+/Yw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"undici-types": "~7.14.0"
+
}
+
},
+
"node_modules/@types/react": {
+
"version": "19.2.2",
+
"resolved": "https://registry.npmjs.org/@types/react/-/react-19.2.2.tgz",
+
"integrity": "sha512-6mDvHUFSjyT2B2yeNx2nUgMxh9LtOWvkhIU3uePn2I2oyNymUAX1NIsdgviM4CH+JSrp2D2hsMvJOkxY+0wNRA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"csstype": "^3.0.2"
+
}
+
},
+
"node_modules/@types/react-dom": {
+
"version": "19.2.1",
+
"resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.2.1.tgz",
+
"integrity": "sha512-/EEvYBdT3BflCWvTMO7YkYBHVE9Ci6XdqZciZANQgKpaiDRGOLIlRo91jbTNRQjgPFWVaRxcYc0luVNFitz57A==",
+
"dev": true,
+
"license": "MIT",
+
"peerDependencies": {
+
"@types/react": "^19.2.0"
+
}
+
},
+
"node_modules/@typescript-eslint/eslint-plugin": {
+
"version": "8.46.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.46.0.tgz",
+
"integrity": "sha512-hA8gxBq4ukonVXPy0OKhiaUh/68D0E88GSmtC1iAEnGaieuDi38LhS7jdCHRLi6ErJBNDGCzvh5EnzdPwUc0DA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@eslint-community/regexpp": "^4.10.0",
+
"@typescript-eslint/scope-manager": "8.46.0",
+
"@typescript-eslint/type-utils": "8.46.0",
+
"@typescript-eslint/utils": "8.46.0",
+
"@typescript-eslint/visitor-keys": "8.46.0",
+
"graphemer": "^1.4.0",
+
"ignore": "^7.0.0",
+
"natural-compare": "^1.4.0",
+
"ts-api-utils": "^2.1.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"@typescript-eslint/parser": "^8.46.0",
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <6.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/eslint-plugin/node_modules/ignore": {
+
"version": "7.0.5",
+
"resolved": "https://registry.npmjs.org/ignore/-/ignore-7.0.5.tgz",
+
"integrity": "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 4"
+
}
+
},
+
"node_modules/@typescript-eslint/parser": {
+
"version": "8.46.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-8.46.0.tgz",
+
"integrity": "sha512-n1H6IcDhmmUEG7TNVSspGmiHHutt7iVKtZwRppD7e04wha5MrkV1h3pti9xQLcCMt6YWsncpoT0HMjkH1FNwWQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/scope-manager": "8.46.0",
+
"@typescript-eslint/types": "8.46.0",
+
"@typescript-eslint/typescript-estree": "8.46.0",
+
"@typescript-eslint/visitor-keys": "8.46.0",
+
"debug": "^4.3.4"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <6.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/project-service": {
+
"version": "8.46.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/project-service/-/project-service-8.46.0.tgz",
+
"integrity": "sha512-OEhec0mH+U5Je2NZOeK1AbVCdm0ChyapAyTeXVIYTPXDJ3F07+cu87PPXcGoYqZ7M9YJVvFnfpGg1UmCIqM+QQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/tsconfig-utils": "^8.46.0",
+
"@typescript-eslint/types": "^8.46.0",
+
"debug": "^4.3.4"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"typescript": ">=4.8.4 <6.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/scope-manager": {
+
"version": "8.46.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-8.46.0.tgz",
+
"integrity": "sha512-lWETPa9XGcBes4jqAMYD9fW0j4n6hrPtTJwWDmtqgFO/4HF4jmdH/Q6wggTw5qIT5TXjKzbt7GsZUBnWoO3dqw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/types": "8.46.0",
+
"@typescript-eslint/visitor-keys": "8.46.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
}
+
},
+
"node_modules/@typescript-eslint/tsconfig-utils": {
+
"version": "8.46.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/tsconfig-utils/-/tsconfig-utils-8.46.0.tgz",
+
"integrity": "sha512-WrYXKGAHY836/N7zoK/kzi6p8tXFhasHh8ocFL9VZSAkvH956gfeRfcnhs3xzRy8qQ/dq3q44v1jvQieMFg2cw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"typescript": ">=4.8.4 <6.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/type-utils": {
+
"version": "8.46.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-8.46.0.tgz",
+
"integrity": "sha512-hy+lvYV1lZpVs2jRaEYvgCblZxUoJiPyCemwbQZ+NGulWkQRy0HRPYAoef/CNSzaLt+MLvMptZsHXHlkEilaeg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/types": "8.46.0",
+
"@typescript-eslint/typescript-estree": "8.46.0",
+
"@typescript-eslint/utils": "8.46.0",
+
"debug": "^4.3.4",
+
"ts-api-utils": "^2.1.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <6.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/types": {
+
"version": "8.46.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-8.46.0.tgz",
+
"integrity": "sha512-bHGGJyVjSE4dJJIO5yyEWt/cHyNwga/zXGJbJJ8TiO01aVREK6gCTu3L+5wrkb1FbDkQ+TKjMNe9R/QQQP9+rA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
}
+
},
+
"node_modules/@typescript-eslint/typescript-estree": {
+
"version": "8.46.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-8.46.0.tgz",
+
"integrity": "sha512-ekDCUfVpAKWJbRfm8T1YRrCot1KFxZn21oV76v5Fj4tr7ELyk84OS+ouvYdcDAwZL89WpEkEj2DKQ+qg//+ucg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/project-service": "8.46.0",
+
"@typescript-eslint/tsconfig-utils": "8.46.0",
+
"@typescript-eslint/types": "8.46.0",
+
"@typescript-eslint/visitor-keys": "8.46.0",
+
"debug": "^4.3.4",
+
"fast-glob": "^3.3.2",
+
"is-glob": "^4.0.3",
+
"minimatch": "^9.0.4",
+
"semver": "^7.6.0",
+
"ts-api-utils": "^2.1.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"typescript": ">=4.8.4 <6.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": {
+
"version": "2.0.2",
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz",
+
"integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"balanced-match": "^1.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": {
+
"version": "9.0.5",
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz",
+
"integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"brace-expansion": "^2.0.1"
+
},
+
"engines": {
+
"node": ">=16 || 14 >=14.17"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/isaacs"
+
}
+
},
+
"node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+
"version": "7.7.3",
+
"resolved": "https://registry.npmjs.org/semver/-/semver-7.7.3.tgz",
+
"integrity": "sha512-SdsKMrI9TdgjdweUSR9MweHA4EJ8YxHn8DFaDisvhVlUOe4BF1tLD7GAj0lIqWVl+dPb/rExr0Btby5loQm20Q==",
+
"dev": true,
+
"license": "ISC",
+
"bin": {
+
"semver": "bin/semver.js"
+
},
+
"engines": {
+
"node": ">=10"
+
}
+
},
+
"node_modules/@typescript-eslint/utils": {
+
"version": "8.46.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-8.46.0.tgz",
+
"integrity": "sha512-nD6yGWPj1xiOm4Gk0k6hLSZz2XkNXhuYmyIrOWcHoPuAhjT9i5bAG+xbWPgFeNR8HPHHtpNKdYUXJl/D3x7f5g==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@eslint-community/eslint-utils": "^4.7.0",
+
"@typescript-eslint/scope-manager": "8.46.0",
+
"@typescript-eslint/types": "8.46.0",
+
"@typescript-eslint/typescript-estree": "8.46.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <6.0.0"
+
}
+
},
+
"node_modules/@typescript-eslint/visitor-keys": {
+
"version": "8.46.0",
+
"resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-8.46.0.tgz",
+
"integrity": "sha512-FrvMpAK+hTbFy7vH5j1+tMYHMSKLE6RzluFJlkFNKD0p9YsUT75JlBSmr5so3QRzvMwU5/bIEdeNrxm8du8l3Q==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/types": "8.46.0",
+
"eslint-visitor-keys": "^4.2.1"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
}
+
},
+
"node_modules/@vitejs/plugin-react": {
+
"version": "5.0.4",
+
"resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-5.0.4.tgz",
+
"integrity": "sha512-La0KD0vGkVkSk6K+piWDKRUyg8Rl5iAIKRMH0vMJI0Eg47bq1eOxmoObAaQG37WMW9MSyk7Cs8EIWwJC1PtzKA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@babel/core": "^7.28.4",
+
"@babel/plugin-transform-react-jsx-self": "^7.27.1",
+
"@babel/plugin-transform-react-jsx-source": "^7.27.1",
+
"@rolldown/pluginutils": "1.0.0-beta.38",
+
"@types/babel__core": "^7.20.5",
+
"react-refresh": "^0.17.0"
+
},
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
},
+
"peerDependencies": {
+
"vite": "^4.2.0 || ^5.0.0 || ^6.0.0 || ^7.0.0"
+
}
+
},
+
"node_modules/acorn": {
+
"version": "8.15.0",
+
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
+
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
+
"dev": true,
+
"license": "MIT",
+
"bin": {
+
"acorn": "bin/acorn"
+
},
+
"engines": {
+
"node": ">=0.4.0"
+
}
+
},
+
"node_modules/acorn-jsx": {
+
"version": "5.3.2",
+
"resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+
"integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+
"dev": true,
+
"license": "MIT",
+
"peerDependencies": {
+
"acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+
}
+
},
+
"node_modules/ajv": {
+
"version": "6.12.6",
+
"resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+
"integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"fast-deep-equal": "^3.1.1",
+
"fast-json-stable-stringify": "^2.0.0",
+
"json-schema-traverse": "^0.4.1",
+
"uri-js": "^4.2.2"
+
},
+
"funding": {
+
"type": "github",
+
"url": "https://github.com/sponsors/epoberezkin"
+
}
+
},
+
"node_modules/ansi-styles": {
+
"version": "4.3.0",
+
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"color-convert": "^2.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
+
}
+
},
+
"node_modules/ansis": {
+
"version": "4.2.0",
+
"resolved": "https://registry.npmjs.org/ansis/-/ansis-4.2.0.tgz",
+
"integrity": "sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==",
+
"dev": true,
+
"license": "ISC",
+
"engines": {
+
"node": ">=14"
+
}
+
},
+
"node_modules/argparse": {
+
"version": "2.0.1",
+
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+
"dev": true,
+
"license": "Python-2.0"
+
},
+
"node_modules/balanced-match": {
+
"version": "1.0.2",
+
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+
"integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/baseline-browser-mapping": {
+
"version": "2.8.13",
+
"resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.8.13.tgz",
+
"integrity": "sha512-7s16KR8io8nIBWQyCYhmFhd+ebIzb9VKTzki+wOJXHTxTnV6+mFGH3+Jwn1zoKaY9/H9T/0BcKCZnzXljPnpSQ==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"bin": {
+
"baseline-browser-mapping": "dist/cli.js"
+
}
+
},
+
"node_modules/brace-expansion": {
+
"version": "1.1.12",
+
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz",
+
"integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"balanced-match": "^1.0.0",
+
"concat-map": "0.0.1"
+
}
+
},
+
"node_modules/braces": {
+
"version": "3.0.3",
+
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"fill-range": "^7.1.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/browserslist": {
+
"version": "4.26.3",
+
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.26.3.tgz",
+
"integrity": "sha512-lAUU+02RFBuCKQPj/P6NgjlbCnLBMp4UtgTx7vNHd3XSIJF87s9a5rA3aH2yw3GS9DqZAUbOtZdCCiZeVRqt0w==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/browserslist"
+
},
+
{
+
"type": "tidelift",
+
"url": "https://tidelift.com/funding/github/npm/browserslist"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"baseline-browser-mapping": "^2.8.9",
+
"caniuse-lite": "^1.0.30001746",
+
"electron-to-chromium": "^1.5.227",
+
"node-releases": "^2.0.21",
+
"update-browserslist-db": "^1.1.3"
+
},
+
"bin": {
+
"browserslist": "cli.js"
+
},
+
"engines": {
+
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+
}
+
},
+
"node_modules/callsites": {
+
"version": "3.1.0",
+
"resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+
"integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/caniuse-lite": {
+
"version": "1.0.30001748",
+
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001748.tgz",
+
"integrity": "sha512-5P5UgAr0+aBmNiplks08JLw+AW/XG/SurlgZLgB1dDLfAw7EfRGxIwzPHxdSCGY/BTKDqIVyJL87cCN6s0ZR0w==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/browserslist"
+
},
+
{
+
"type": "tidelift",
+
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "CC-BY-4.0"
+
},
+
"node_modules/chalk": {
+
"version": "4.1.2",
+
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"ansi-styles": "^4.1.0",
+
"supports-color": "^7.1.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/chalk/chalk?sponsor=1"
+
}
+
},
+
"node_modules/color-convert": {
+
"version": "2.0.1",
+
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"color-name": "~1.1.4"
+
},
+
"engines": {
+
"node": ">=7.0.0"
+
}
+
},
+
"node_modules/color-name": {
+
"version": "1.1.4",
+
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/concat-map": {
+
"version": "0.0.1",
+
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+
"integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/convert-source-map": {
+
"version": "2.0.0",
+
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/cross-spawn": {
+
"version": "7.0.6",
+
"resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+
"integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"path-key": "^3.1.0",
+
"shebang-command": "^2.0.0",
+
"which": "^2.0.1"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/csstype": {
+
"version": "3.1.3",
+
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+
"integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/debug": {
+
"version": "4.4.3",
+
"resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz",
+
"integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"ms": "^2.1.3"
+
},
+
"engines": {
+
"node": ">=6.0"
+
},
+
"peerDependenciesMeta": {
+
"supports-color": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/deep-is": {
+
"version": "0.1.4",
+
"resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+
"integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/detect-libc": {
+
"version": "2.1.2",
+
"resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz",
+
"integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/electron-to-chromium": {
+
"version": "1.5.232",
+
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.232.tgz",
+
"integrity": "sha512-ENirSe7wf8WzyPCibqKUG1Cg43cPaxH4wRR7AJsX7MCABCHBIOFqvaYODSLKUuZdraxUTHRE/0A2Aq8BYKEHOg==",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/escalade": {
+
"version": "3.2.0",
+
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+
"integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/escape-string-regexp": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+
"integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/eslint": {
+
"version": "9.37.0",
+
"resolved": "https://registry.npmjs.org/eslint/-/eslint-9.37.0.tgz",
+
"integrity": "sha512-XyLmROnACWqSxiGYArdef1fItQd47weqB7iwtfr9JHwRrqIXZdcFMvvEcL9xHCmL0SNsOvF0c42lWyM1U5dgig==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@eslint-community/eslint-utils": "^4.8.0",
+
"@eslint-community/regexpp": "^4.12.1",
+
"@eslint/config-array": "^0.21.0",
+
"@eslint/config-helpers": "^0.4.0",
+
"@eslint/core": "^0.16.0",
+
"@eslint/eslintrc": "^3.3.1",
+
"@eslint/js": "9.37.0",
+
"@eslint/plugin-kit": "^0.4.0",
+
"@humanfs/node": "^0.16.6",
+
"@humanwhocodes/module-importer": "^1.0.1",
+
"@humanwhocodes/retry": "^0.4.2",
+
"@types/estree": "^1.0.6",
+
"@types/json-schema": "^7.0.15",
+
"ajv": "^6.12.4",
+
"chalk": "^4.0.0",
+
"cross-spawn": "^7.0.6",
+
"debug": "^4.3.2",
+
"escape-string-regexp": "^4.0.0",
+
"eslint-scope": "^8.4.0",
+
"eslint-visitor-keys": "^4.2.1",
+
"espree": "^10.4.0",
+
"esquery": "^1.5.0",
+
"esutils": "^2.0.2",
+
"fast-deep-equal": "^3.1.3",
+
"file-entry-cache": "^8.0.0",
+
"find-up": "^5.0.0",
+
"glob-parent": "^6.0.2",
+
"ignore": "^5.2.0",
+
"imurmurhash": "^0.1.4",
+
"is-glob": "^4.0.0",
+
"json-stable-stringify-without-jsonify": "^1.0.1",
+
"lodash.merge": "^4.6.2",
+
"minimatch": "^3.1.2",
+
"natural-compare": "^1.4.0",
+
"optionator": "^0.9.3"
+
},
+
"bin": {
+
"eslint": "bin/eslint.js"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"url": "https://eslint.org/donate"
+
},
+
"peerDependencies": {
+
"jiti": "*"
+
},
+
"peerDependenciesMeta": {
+
"jiti": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/eslint-plugin-react-hooks": {
+
"version": "5.2.0",
+
"resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz",
+
"integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=10"
+
},
+
"peerDependencies": {
+
"eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0"
+
}
+
},
+
"node_modules/eslint-plugin-react-refresh": {
+
"version": "0.4.23",
+
"resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.23.tgz",
+
"integrity": "sha512-G4j+rv0NmbIR45kni5xJOrYvCtyD3/7LjpVH8MPPcudXDcNu8gv+4ATTDXTtbRR8rTCM5HxECvCSsRmxKnWDsA==",
+
"dev": true,
+
"license": "MIT",
+
"peerDependencies": {
+
"eslint": ">=8.40"
+
}
+
},
+
"node_modules/eslint-scope": {
+
"version": "8.4.0",
+
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz",
+
"integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"dependencies": {
+
"esrecurse": "^4.3.0",
+
"estraverse": "^5.2.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
}
+
},
+
"node_modules/eslint-visitor-keys": {
+
"version": "4.2.1",
+
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz",
+
"integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
}
+
},
+
"node_modules/esm-env": {
+
"version": "1.2.2",
+
"resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.2.2.tgz",
+
"integrity": "sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==",
+
"license": "MIT"
+
},
+
"node_modules/espree": {
+
"version": "10.4.0",
+
"resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz",
+
"integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"dependencies": {
+
"acorn": "^8.15.0",
+
"acorn-jsx": "^5.3.2",
+
"eslint-visitor-keys": "^4.2.1"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"url": "https://opencollective.com/eslint"
+
}
+
},
+
"node_modules/esquery": {
+
"version": "1.6.0",
+
"resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+
"integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+
"dev": true,
+
"license": "BSD-3-Clause",
+
"dependencies": {
+
"estraverse": "^5.1.0"
+
},
+
"engines": {
+
"node": ">=0.10"
+
}
+
},
+
"node_modules/esrecurse": {
+
"version": "4.3.0",
+
"resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+
"integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"dependencies": {
+
"estraverse": "^5.2.0"
+
},
+
"engines": {
+
"node": ">=4.0"
+
}
+
},
+
"node_modules/estraverse": {
+
"version": "5.3.0",
+
"resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+
"integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"engines": {
+
"node": ">=4.0"
+
}
+
},
+
"node_modules/esutils": {
+
"version": "2.0.3",
+
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/fast-deep-equal": {
+
"version": "3.1.3",
+
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/fast-glob": {
+
"version": "3.3.3",
+
"resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz",
+
"integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@nodelib/fs.stat": "^2.0.2",
+
"@nodelib/fs.walk": "^1.2.3",
+
"glob-parent": "^5.1.2",
+
"merge2": "^1.3.0",
+
"micromatch": "^4.0.8"
+
},
+
"engines": {
+
"node": ">=8.6.0"
+
}
+
},
+
"node_modules/fast-glob/node_modules/glob-parent": {
+
"version": "5.1.2",
+
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"is-glob": "^4.0.1"
+
},
+
"engines": {
+
"node": ">= 6"
+
}
+
},
+
"node_modules/fast-json-stable-stringify": {
+
"version": "2.1.0",
+
"resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+
"integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/fast-levenshtein": {
+
"version": "2.0.6",
+
"resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+
"integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/fastq": {
+
"version": "1.19.1",
+
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.19.1.tgz",
+
"integrity": "sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"reusify": "^1.0.4"
+
}
+
},
+
"node_modules/file-entry-cache": {
+
"version": "8.0.0",
+
"resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+
"integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"flat-cache": "^4.0.0"
+
},
+
"engines": {
+
"node": ">=16.0.0"
+
}
+
},
+
"node_modules/fill-range": {
+
"version": "7.1.1",
+
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"to-regex-range": "^5.0.1"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/find-up": {
+
"version": "5.0.0",
+
"resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+
"integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"locate-path": "^6.0.0",
+
"path-exists": "^4.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/flat-cache": {
+
"version": "4.0.1",
+
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+
"integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"flatted": "^3.2.9",
+
"keyv": "^4.5.4"
+
},
+
"engines": {
+
"node": ">=16"
+
}
+
},
+
"node_modules/flatted": {
+
"version": "3.3.3",
+
"resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz",
+
"integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/fsevents": {
+
"version": "2.3.3",
+
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
+
"integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
+
"dev": true,
+
"hasInstallScript": true,
+
"license": "MIT",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+
}
+
},
+
"node_modules/gensync": {
+
"version": "1.0.0-beta.2",
+
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6.9.0"
+
}
+
},
+
"node_modules/glob-parent": {
+
"version": "6.0.2",
+
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+
"integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"is-glob": "^4.0.3"
+
},
+
"engines": {
+
"node": ">=10.13.0"
+
}
+
},
+
"node_modules/globals": {
+
"version": "16.4.0",
+
"resolved": "https://registry.npmjs.org/globals/-/globals-16.4.0.tgz",
+
"integrity": "sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=18"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/graphemer": {
+
"version": "1.4.0",
+
"resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+
"integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/has-flag": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/ignore": {
+
"version": "5.3.2",
+
"resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+
"integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 4"
+
}
+
},
+
"node_modules/import-fresh": {
+
"version": "3.3.1",
+
"resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz",
+
"integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"parent-module": "^1.0.0",
+
"resolve-from": "^4.0.0"
+
},
+
"engines": {
+
"node": ">=6"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/imurmurhash": {
+
"version": "0.1.4",
+
"resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+
"integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.8.19"
+
}
+
},
+
"node_modules/is-extglob": {
+
"version": "2.1.1",
+
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/is-glob": {
+
"version": "4.0.3",
+
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"is-extglob": "^2.1.1"
+
},
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/is-number": {
+
"version": "7.0.0",
+
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.12.0"
+
}
+
},
+
"node_modules/isexe": {
+
"version": "2.0.0",
+
"resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+
"integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/js-tokens": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/js-yaml": {
+
"version": "4.1.0",
+
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"argparse": "^2.0.1"
+
},
+
"bin": {
+
"js-yaml": "bin/js-yaml.js"
+
}
+
},
+
"node_modules/jsesc": {
+
"version": "3.1.0",
+
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz",
+
"integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==",
+
"dev": true,
+
"license": "MIT",
+
"bin": {
+
"jsesc": "bin/jsesc"
+
},
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/json-buffer": {
+
"version": "3.0.1",
+
"resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+
"integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/json-schema-traverse": {
+
"version": "0.4.1",
+
"resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+
"integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/json-stable-stringify-without-jsonify": {
+
"version": "1.0.1",
+
"resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+
"integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/json5": {
+
"version": "2.2.3",
+
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+
"dev": true,
+
"license": "MIT",
+
"bin": {
+
"json5": "lib/cli.js"
+
},
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/keyv": {
+
"version": "4.5.4",
+
"resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+
"integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"json-buffer": "3.0.1"
+
}
+
},
+
"node_modules/levn": {
+
"version": "0.4.1",
+
"resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+
"integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"prelude-ls": "^1.2.1",
+
"type-check": "~0.4.0"
+
},
+
"engines": {
+
"node": ">= 0.8.0"
+
}
+
},
+
"node_modules/lightningcss": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.2.tgz",
+
"integrity": "sha512-utfs7Pr5uJyyvDETitgsaqSyjCb2qNRAtuqUeWIAKztsOYdcACf2KtARYXg2pSvhkt+9NfoaNY7fxjl6nuMjIQ==",
+
"dev": true,
+
"license": "MPL-2.0",
+
"dependencies": {
+
"detect-libc": "^2.0.3"
+
},
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
},
+
"optionalDependencies": {
+
"lightningcss-android-arm64": "1.30.2",
+
"lightningcss-darwin-arm64": "1.30.2",
+
"lightningcss-darwin-x64": "1.30.2",
+
"lightningcss-freebsd-x64": "1.30.2",
+
"lightningcss-linux-arm-gnueabihf": "1.30.2",
+
"lightningcss-linux-arm64-gnu": "1.30.2",
+
"lightningcss-linux-arm64-musl": "1.30.2",
+
"lightningcss-linux-x64-gnu": "1.30.2",
+
"lightningcss-linux-x64-musl": "1.30.2",
+
"lightningcss-win32-arm64-msvc": "1.30.2",
+
"lightningcss-win32-x64-msvc": "1.30.2"
+
}
+
},
+
"node_modules/lightningcss-darwin-arm64": {
+
"version": "1.30.2",
+
"resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.2.tgz",
+
"integrity": "sha512-ylTcDJBN3Hp21TdhRT5zBOIi73P6/W0qwvlFEk22fkdXchtNTOU4Qc37SkzV+EKYxLouZ6M4LG9NfZ1qkhhBWA==",
+
"cpu": [
+
"arm64"
+
],
+
"dev": true,
+
"license": "MPL-2.0",
+
"optional": true,
+
"os": [
+
"darwin"
+
],
+
"engines": {
+
"node": ">= 12.0.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/parcel"
+
}
+
},
+
"node_modules/locate-path": {
+
"version": "6.0.0",
+
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+
"integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"p-locate": "^5.0.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/lodash.merge": {
+
"version": "4.6.2",
+
"resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+
"integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/lru-cache": {
+
"version": "5.1.1",
+
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+
"integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"yallist": "^3.0.2"
+
}
+
},
+
"node_modules/merge2": {
+
"version": "1.4.1",
+
"resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+
"integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/micromatch": {
+
"version": "4.0.8",
+
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+
"integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"braces": "^3.0.3",
+
"picomatch": "^2.3.1"
+
},
+
"engines": {
+
"node": ">=8.6"
+
}
+
},
+
"node_modules/minimatch": {
+
"version": "3.1.2",
+
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+
"integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"brace-expansion": "^1.1.7"
+
},
+
"engines": {
+
"node": "*"
+
}
+
},
+
"node_modules/ms": {
+
"version": "2.1.3",
+
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/nanoid": {
+
"version": "3.3.11",
+
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
+
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"bin": {
+
"nanoid": "bin/nanoid.cjs"
+
},
+
"engines": {
+
"node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+
}
+
},
+
"node_modules/natural-compare": {
+
"version": "1.4.0",
+
"resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+
"integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/node-releases": {
+
"version": "2.0.23",
+
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.23.tgz",
+
"integrity": "sha512-cCmFDMSm26S6tQSDpBCg/NR8NENrVPhAJSf+XbxBG4rPFaaonlEoE9wHQmun+cls499TQGSb7ZyPBRlzgKfpeg==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/optionator": {
+
"version": "0.9.4",
+
"resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+
"integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"deep-is": "^0.1.3",
+
"fast-levenshtein": "^2.0.6",
+
"levn": "^0.4.1",
+
"prelude-ls": "^1.2.1",
+
"type-check": "^0.4.0",
+
"word-wrap": "^1.2.5"
+
},
+
"engines": {
+
"node": ">= 0.8.0"
+
}
+
},
+
"node_modules/p-limit": {
+
"version": "3.1.0",
+
"resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+
"integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"yocto-queue": "^0.1.0"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/p-locate": {
+
"version": "5.0.0",
+
"resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+
"integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"p-limit": "^3.0.2"
+
},
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/parent-module": {
+
"version": "1.0.1",
+
"resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+
"integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"callsites": "^3.0.0"
+
},
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/path-exists": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+
"integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/path-key": {
+
"version": "3.1.1",
+
"resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/picocolors": {
+
"version": "1.1.1",
+
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/picomatch": {
+
"version": "2.3.1",
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8.6"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/jonschlinkert"
+
}
+
},
+
"node_modules/postcss": {
+
"version": "8.5.6",
+
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
+
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/postcss/"
+
},
+
{
+
"type": "tidelift",
+
"url": "https://tidelift.com/funding/github/npm/postcss"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"nanoid": "^3.3.11",
+
"picocolors": "^1.1.1",
+
"source-map-js": "^1.2.1"
+
},
+
"engines": {
+
"node": "^10 || ^12 || >=14"
+
}
+
},
+
"node_modules/prelude-ls": {
+
"version": "1.2.1",
+
"resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+
"integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">= 0.8.0"
+
}
+
},
+
"node_modules/punycode": {
+
"version": "2.3.1",
+
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=6"
+
}
+
},
+
"node_modules/queue-microtask": {
+
"version": "1.2.3",
+
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+
"integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/feross"
+
},
+
{
+
"type": "patreon",
+
"url": "https://www.patreon.com/feross"
+
},
+
{
+
"type": "consulting",
+
"url": "https://feross.org/support"
+
}
+
],
+
"license": "MIT"
+
},
+
"node_modules/react": {
+
"version": "19.2.0",
+
"resolved": "https://registry.npmjs.org/react/-/react-19.2.0.tgz",
+
"integrity": "sha512-tmbWg6W31tQLeB5cdIBOicJDJRR2KzXsV7uSK9iNfLWQ5bIZfxuPEHp7M8wiHyHnn0DD1i7w3Zmin0FtkrwoCQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/react-dom": {
+
"version": "19.2.0",
+
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.2.0.tgz",
+
"integrity": "sha512-UlbRu4cAiGaIewkPyiRGJk0imDN2T3JjieT6spoL2UeSf5od4n5LB/mQ4ejmxhCFT1tYe8IvaFulzynWovsEFQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"scheduler": "^0.27.0"
+
},
+
"peerDependencies": {
+
"react": "^19.2.0"
+
}
+
},
+
"node_modules/react-refresh": {
+
"version": "0.17.0",
+
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz",
+
"integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/resolve-from": {
+
"version": "4.0.0",
+
"resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+
"integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=4"
+
}
+
},
+
"node_modules/reusify": {
+
"version": "1.1.0",
+
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz",
+
"integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"iojs": ">=1.0.0",
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/rolldown": {
+
"version": "1.0.0-beta.41",
+
"resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-beta.41.tgz",
+
"integrity": "sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@oxc-project/types": "=0.93.0",
+
"@rolldown/pluginutils": "1.0.0-beta.41",
+
"ansis": "=4.2.0"
+
},
+
"bin": {
+
"rolldown": "bin/cli.mjs"
+
},
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
},
+
"optionalDependencies": {
+
"@rolldown/binding-android-arm64": "1.0.0-beta.41",
+
"@rolldown/binding-darwin-arm64": "1.0.0-beta.41",
+
"@rolldown/binding-darwin-x64": "1.0.0-beta.41",
+
"@rolldown/binding-freebsd-x64": "1.0.0-beta.41",
+
"@rolldown/binding-linux-arm-gnueabihf": "1.0.0-beta.41",
+
"@rolldown/binding-linux-arm64-gnu": "1.0.0-beta.41",
+
"@rolldown/binding-linux-arm64-musl": "1.0.0-beta.41",
+
"@rolldown/binding-linux-x64-gnu": "1.0.0-beta.41",
+
"@rolldown/binding-linux-x64-musl": "1.0.0-beta.41",
+
"@rolldown/binding-openharmony-arm64": "1.0.0-beta.41",
+
"@rolldown/binding-wasm32-wasi": "1.0.0-beta.41",
+
"@rolldown/binding-win32-arm64-msvc": "1.0.0-beta.41",
+
"@rolldown/binding-win32-ia32-msvc": "1.0.0-beta.41",
+
"@rolldown/binding-win32-x64-msvc": "1.0.0-beta.41"
+
}
+
},
+
"node_modules/rolldown/node_modules/@rolldown/pluginutils": {
+
"version": "1.0.0-beta.41",
+
"resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-beta.41.tgz",
+
"integrity": "sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/run-parallel": {
+
"version": "1.2.0",
+
"resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+
"integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/feross"
+
},
+
{
+
"type": "patreon",
+
"url": "https://www.patreon.com/feross"
+
},
+
{
+
"type": "consulting",
+
"url": "https://feross.org/support"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"queue-microtask": "^1.2.2"
+
}
+
},
+
"node_modules/scheduler": {
+
"version": "0.27.0",
+
"resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz",
+
"integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/semver": {
+
"version": "6.3.1",
+
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+
"integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+
"dev": true,
+
"license": "ISC",
+
"bin": {
+
"semver": "bin/semver.js"
+
}
+
},
+
"node_modules/shebang-command": {
+
"version": "2.0.0",
+
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+
"integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"shebang-regex": "^3.0.0"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/shebang-regex": {
+
"version": "3.0.0",
+
"resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+
"integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/source-map-js": {
+
"version": "1.2.1",
+
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+
"dev": true,
+
"license": "BSD-3-Clause",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/strip-json-comments": {
+
"version": "3.1.1",
+
"resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+
"integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=8"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
},
+
"node_modules/supports-color": {
+
"version": "7.2.0",
+
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"has-flag": "^4.0.0"
+
},
+
"engines": {
+
"node": ">=8"
+
}
+
},
+
"node_modules/tinyglobby": {
+
"version": "0.2.15",
+
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz",
+
"integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"fdir": "^6.5.0",
+
"picomatch": "^4.0.3"
+
},
+
"engines": {
+
"node": ">=12.0.0"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/SuperchupuDev"
+
}
+
},
+
"node_modules/tinyglobby/node_modules/fdir": {
+
"version": "6.5.0",
+
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=12.0.0"
+
},
+
"peerDependencies": {
+
"picomatch": "^3 || ^4"
+
},
+
"peerDependenciesMeta": {
+
"picomatch": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/tinyglobby/node_modules/picomatch": {
+
"version": "4.0.3",
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/jonschlinkert"
+
}
+
},
+
"node_modules/to-regex-range": {
+
"version": "5.0.1",
+
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"is-number": "^7.0.0"
+
},
+
"engines": {
+
"node": ">=8.0"
+
}
+
},
+
"node_modules/ts-api-utils": {
+
"version": "2.1.0",
+
"resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-2.1.0.tgz",
+
"integrity": "sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=18.12"
+
},
+
"peerDependencies": {
+
"typescript": ">=4.8.4"
+
}
+
},
+
"node_modules/type-check": {
+
"version": "0.4.0",
+
"resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+
"integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"prelude-ls": "^1.2.1"
+
},
+
"engines": {
+
"node": ">= 0.8.0"
+
}
+
},
+
"node_modules/typescript": {
+
"version": "5.9.3",
+
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
+
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
+
"dev": true,
+
"license": "Apache-2.0",
+
"bin": {
+
"tsc": "bin/tsc",
+
"tsserver": "bin/tsserver"
+
},
+
"engines": {
+
"node": ">=14.17"
+
}
+
},
+
"node_modules/typescript-eslint": {
+
"version": "8.46.0",
+
"resolved": "https://registry.npmjs.org/typescript-eslint/-/typescript-eslint-8.46.0.tgz",
+
"integrity": "sha512-6+ZrB6y2bT2DX3K+Qd9vn7OFOJR+xSLDj+Aw/N3zBwUt27uTw2sw2TE2+UcY1RiyBZkaGbTkVg9SSdPNUG6aUw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@typescript-eslint/eslint-plugin": "8.46.0",
+
"@typescript-eslint/parser": "8.46.0",
+
"@typescript-eslint/typescript-estree": "8.46.0",
+
"@typescript-eslint/utils": "8.46.0"
+
},
+
"engines": {
+
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+
},
+
"funding": {
+
"type": "opencollective",
+
"url": "https://opencollective.com/typescript-eslint"
+
},
+
"peerDependencies": {
+
"eslint": "^8.57.0 || ^9.0.0",
+
"typescript": ">=4.8.4 <6.0.0"
+
}
+
},
+
"node_modules/undici-types": {
+
"version": "7.14.0",
+
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz",
+
"integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==",
+
"dev": true,
+
"license": "MIT"
+
},
+
"node_modules/update-browserslist-db": {
+
"version": "1.1.3",
+
"resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz",
+
"integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==",
+
"dev": true,
+
"funding": [
+
{
+
"type": "opencollective",
+
"url": "https://opencollective.com/browserslist"
+
},
+
{
+
"type": "tidelift",
+
"url": "https://tidelift.com/funding/github/npm/browserslist"
+
},
+
{
+
"type": "github",
+
"url": "https://github.com/sponsors/ai"
+
}
+
],
+
"license": "MIT",
+
"dependencies": {
+
"escalade": "^3.2.0",
+
"picocolors": "^1.1.1"
+
},
+
"bin": {
+
"update-browserslist-db": "cli.js"
+
},
+
"peerDependencies": {
+
"browserslist": ">= 4.21.0"
+
}
+
},
+
"node_modules/uri-js": {
+
"version": "4.4.1",
+
"resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+
"integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+
"dev": true,
+
"license": "BSD-2-Clause",
+
"dependencies": {
+
"punycode": "^2.1.0"
+
}
+
},
+
"node_modules/vite": {
+
"name": "rolldown-vite",
+
"version": "7.1.14",
+
"resolved": "https://registry.npmjs.org/rolldown-vite/-/rolldown-vite-7.1.14.tgz",
+
"integrity": "sha512-eSiiRJmovt8qDJkGyZuLnbxAOAdie6NCmmd0NkTC0RJI9duiSBTfr8X2mBYJOUFzxQa2USaHmL99J9uMxkjCyw==",
+
"dev": true,
+
"license": "MIT",
+
"dependencies": {
+
"@oxc-project/runtime": "0.92.0",
+
"fdir": "^6.5.0",
+
"lightningcss": "^1.30.1",
+
"picomatch": "^4.0.3",
+
"postcss": "^8.5.6",
+
"rolldown": "1.0.0-beta.41",
+
"tinyglobby": "^0.2.15"
+
},
+
"bin": {
+
"vite": "bin/vite.js"
+
},
+
"engines": {
+
"node": "^20.19.0 || >=22.12.0"
+
},
+
"funding": {
+
"url": "https://github.com/vitejs/vite?sponsor=1"
+
},
+
"optionalDependencies": {
+
"fsevents": "~2.3.3"
+
},
+
"peerDependencies": {
+
"@types/node": "^20.19.0 || >=22.12.0",
+
"esbuild": "^0.25.0",
+
"jiti": ">=1.21.0",
+
"less": "^4.0.0",
+
"sass": "^1.70.0",
+
"sass-embedded": "^1.70.0",
+
"stylus": ">=0.54.8",
+
"sugarss": "^5.0.0",
+
"terser": "^5.16.0",
+
"tsx": "^4.8.1",
+
"yaml": "^2.4.2"
+
},
+
"peerDependenciesMeta": {
+
"@types/node": {
+
"optional": true
+
},
+
"esbuild": {
+
"optional": true
+
},
+
"jiti": {
+
"optional": true
+
},
+
"less": {
+
"optional": true
+
},
+
"sass": {
+
"optional": true
+
},
+
"sass-embedded": {
+
"optional": true
+
},
+
"stylus": {
+
"optional": true
+
},
+
"sugarss": {
+
"optional": true
+
},
+
"terser": {
+
"optional": true
+
},
+
"tsx": {
+
"optional": true
+
},
+
"yaml": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/vite/node_modules/fdir": {
+
"version": "6.5.0",
+
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz",
+
"integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=12.0.0"
+
},
+
"peerDependencies": {
+
"picomatch": "^3 || ^4"
+
},
+
"peerDependenciesMeta": {
+
"picomatch": {
+
"optional": true
+
}
+
}
+
},
+
"node_modules/vite/node_modules/picomatch": {
+
"version": "4.0.3",
+
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz",
+
"integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=12"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/jonschlinkert"
+
}
+
},
+
"node_modules/which": {
+
"version": "2.0.2",
+
"resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+
"integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+
"dev": true,
+
"license": "ISC",
+
"dependencies": {
+
"isexe": "^2.0.0"
+
},
+
"bin": {
+
"node-which": "bin/node-which"
+
},
+
"engines": {
+
"node": ">= 8"
+
}
+
},
+
"node_modules/word-wrap": {
+
"version": "1.2.5",
+
"resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+
"integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=0.10.0"
+
}
+
},
+
"node_modules/yallist": {
+
"version": "3.1.1",
+
"resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+
"integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+
"dev": true,
+
"license": "ISC"
+
},
+
"node_modules/yocto-queue": {
+
"version": "0.1.0",
+
"resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+
"integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+
"dev": true,
+
"license": "MIT",
+
"engines": {
+
"node": ">=10"
+
},
+
"funding": {
+
"url": "https://github.com/sponsors/sindresorhus"
+
}
+
}
+
}
+
}
+67
package.json
···
+
{
+
"name": "atproto-ui",
+
"version": "0.1.1",
+
"type": "module",
+
"description": "React components and hooks for rendering AT Protocol records.",
+
"main": "./lib-dist/index.js",
+
"module": "./lib-dist/index.js",
+
"types": "./lib-dist/index.d.ts",
+
"exports": {
+
".": {
+
"types": "./lib-dist/index.d.ts",
+
"import": "./lib-dist/index.js",
+
"default": "./lib-dist/index.js"
+
},
+
"./styles/highlight.css": "./lib/styles/highlight.css"
+
},
+
"files": [
+
"lib-dist",
+
"lib/styles",
+
"README.md"
+
],
+
"sideEffects": [
+
"./lib/styles/highlight.css"
+
],
+
"scripts": {
+
"dev": "vite",
+
"build": "tsc -b && vite build",
+
"lint": "eslint .",
+
"preview": "vite preview",
+
"prepublishOnly": "npm run build"
+
},
+
"peerDependencies": {
+
"react": "^18.2.0 || ^19.0.0",
+
"react-dom": "^18.2.0 || ^19.0.0"
+
},
+
"peerDependenciesMeta": {
+
"react-dom": {
+
"optional": true
+
}
+
},
+
"dependencies": {
+
"@atcute/atproto": "^3.1.7",
+
"@atcute/bluesky": "^3.2.3",
+
"@atcute/client": "^4.0.3",
+
"@atcute/identity-resolver": "^1.1.3",
+
"@atcute/tangled": "^1.0.6"
+
},
+
"devDependencies": {
+
"@eslint/js": "^9.36.0",
+
"@types/node": "^24.6.0",
+
"@types/react": "^19.1.16",
+
"@types/react-dom": "^19.1.9",
+
"@vitejs/plugin-react": "^5.0.4",
+
"eslint": "^9.36.0",
+
"eslint-plugin-react-hooks": "^5.2.0",
+
"eslint-plugin-react-refresh": "^0.4.22",
+
"globals": "^16.4.0",
+
"react": "^19.1.1",
+
"react-dom": "^19.1.1",
+
"typescript": "~5.9.3",
+
"typescript-eslint": "^8.45.0",
+
"vite": "npm:rolldown-vite@7.1.14"
+
},
+
"overrides": {
+
"vite": "npm:rolldown-vite@7.1.14"
+
}
+
}
+385
src/App.tsx
···
+
import React, { useState, useCallback, useEffect, useMemo, useRef } from 'react';
+
import { AtProtoProvider } from '../lib/providers/AtProtoProvider';
+
import { AtProtoRecord } from '../lib/core/AtProtoRecord';
+
import { TangledString } from '../lib/components/TangledString';
+
import { LeafletDocument } from '../lib/components/LeafletDocument';
+
import { BlueskyProfile } from '../lib/components/BlueskyProfile';
+
import { BlueskyPost, BLUESKY_POST_COLLECTION } from '../lib/components/BlueskyPost';
+
import { BlueskyPostList } from '../lib/components/BlueskyPostList';
+
import { BlueskyQuotePost } from '../lib/components/BlueskyQuotePost';
+
import { useDidResolution } from '../lib/hooks/useDidResolution';
+
import { useLatestRecord } from '../lib/hooks/useLatestRecord';
+
import { ColorSchemeToggle } from '../lib/components/ColorSchemeToggle.tsx';
+
import { useColorScheme, type ColorSchemePreference } from '../lib/hooks/useColorScheme';
+
import type { FeedPostRecord } from '../lib/types/bluesky';
+
+
const COLOR_SCHEME_STORAGE_KEY = 'atproto-ui-color-scheme';
+
+
const basicUsageSnippet = `import { AtProtoProvider, BlueskyPost } from 'atproto-ui';
+
+
export function App() {
+
return (
+
<AtProtoProvider>
+
<BlueskyPost did="did:plc:example" rkey="3k2aexample" />
+
</AtProtoProvider>
+
);
+
}`;
+
+
const customComponentSnippet = `import { useLatestRecord, useColorScheme, AtProtoRecord } from 'atproto-ui';
+
import type { FeedPostRecord } from 'atproto-ui';
+
+
const LatestPostSummary: React.FC<{ did: string }> = ({ did }) => {
+
const scheme = useColorScheme('system');
+
const { rkey, loading, error } = useLatestRecord<FeedPostRecord>(did, 'app.bsky.feed.post');
+
+
if (loading) return <span>Loading…</span>;
+
if (error || !rkey) return <span>No post yet.</span>;
+
+
return (
+
<AtProtoRecord<FeedPostRecord>
+
did={did}
+
collection="app.bsky.feed.post"
+
rkey={rkey}
+
renderer={({ record }) => (
+
<article data-color-scheme={scheme}>
+
<strong>{record?.text ?? 'Empty post'}</strong>
+
</article>
+
)}
+
/>
+
);
+
};`;
+
+
const codeBlockBase: React.CSSProperties = {
+
fontFamily: 'Menlo, Consolas, "SFMono-Regular", ui-monospace, monospace',
+
fontSize: 12,
+
whiteSpace: 'pre',
+
overflowX: 'auto',
+
borderRadius: 10,
+
padding: '12px 14px',
+
lineHeight: 1.6
+
};
+
+
const FullDemo: React.FC = () => {
+
const handleInputRef = useRef<HTMLInputElement | null>(null);
+
const [submitted, setSubmitted] = useState<string | null>(null);
+
const [colorSchemePreference, setColorSchemePreference] = useState<ColorSchemePreference>(() => {
+
if (typeof window === 'undefined') return 'system';
+
try {
+
const stored = window.localStorage.getItem(COLOR_SCHEME_STORAGE_KEY);
+
if (stored === 'light' || stored === 'dark' || stored === 'system') return stored;
+
} catch {
+
/* ignore */
+
}
+
return 'system';
+
});
+
const scheme = useColorScheme(colorSchemePreference);
+
const { did, loading: resolvingDid } = useDidResolution(submitted ?? undefined);
+
const onSubmit = useCallback<React.FormEventHandler>((e) => {
+
e.preventDefault();
+
const rawValue = handleInputRef.current?.value;
+
const nextValue = rawValue?.trim();
+
if (!nextValue) return;
+
if (handleInputRef.current) {
+
handleInputRef.current.value = nextValue;
+
}
+
setSubmitted(nextValue);
+
}, []);
+
+
useEffect(() => {
+
if (typeof window === 'undefined') return;
+
try {
+
window.localStorage.setItem(COLOR_SCHEME_STORAGE_KEY, colorSchemePreference);
+
} catch {
+
/* ignore */
+
}
+
}, [colorSchemePreference]);
+
+
useEffect(() => {
+
if (typeof document === 'undefined') return;
+
const root = document.documentElement;
+
const body = document.body;
+
const prevScheme = root.dataset.colorScheme;
+
const prevBg = body.style.backgroundColor;
+
const prevColor = body.style.color;
+
root.dataset.colorScheme = scheme;
+
body.style.backgroundColor = scheme === 'dark' ? '#020617' : '#f8fafc';
+
body.style.color = scheme === 'dark' ? '#e2e8f0' : '#0f172a';
+
return () => {
+
root.dataset.colorScheme = prevScheme ?? '';
+
body.style.backgroundColor = prevBg;
+
body.style.color = prevColor;
+
};
+
}, [scheme]);
+
+
const showHandle = submitted && !submitted.startsWith('did:') ? submitted : undefined;
+
+
const mutedTextColor = useMemo(() => (scheme === 'dark' ? '#94a3b8' : '#555'), [scheme]);
+
const panelStyle = useMemo<React.CSSProperties>(() => ({
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 8,
+
padding: 10,
+
borderRadius: 12,
+
borderColor: scheme === 'dark' ? '#1e293b' : '#e2e8f0',
+
}), [scheme]);
+
const baseTextColor = useMemo(() => (scheme === 'dark' ? '#e2e8f0' : '#0f172a'), [scheme]);
+
const gistPanelStyle = useMemo<React.CSSProperties>(() => ({
+
...panelStyle,
+
padding: 0,
+
border: 'none',
+
background: 'transparent',
+
backdropFilter: 'none',
+
marginTop: 32
+
}), [panelStyle]);
+
const leafletPanelStyle = useMemo<React.CSSProperties>(() => ({
+
...panelStyle,
+
padding: 0,
+
border: 'none',
+
background: 'transparent',
+
backdropFilter: 'none',
+
marginTop: 32,
+
alignItems: 'center'
+
}), [panelStyle]);
+
const primaryGridStyle = useMemo<React.CSSProperties>(() => ({
+
display: 'grid',
+
gap: 32,
+
gridTemplateColumns: 'repeat(auto-fit, minmax(320px, 1fr))'
+
}), []);
+
const columnStackStyle = useMemo<React.CSSProperties>(() => ({
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 32
+
}), []);
+
const codeBlockStyle = useMemo<React.CSSProperties>(() => ({
+
...codeBlockBase,
+
background: scheme === 'dark' ? '#0b1120' : '#f1f5f9',
+
border: `1px solid ${scheme === 'dark' ? '#1e293b' : '#e2e8f0'}`
+
}), [scheme]);
+
const codeTextStyle = useMemo<React.CSSProperties>(() => ({
+
margin: 0,
+
display: 'block',
+
fontFamily: codeBlockBase.fontFamily,
+
fontSize: 12,
+
lineHeight: 1.6,
+
whiteSpace: 'pre'
+
}), []);
+
const basicCodeRef = useRef<HTMLElement | null>(null);
+
const customCodeRef = useRef<HTMLElement | null>(null);
+
+
// Latest Bluesky post
+
const {
+
rkey: latestPostRkey,
+
loading: loadingLatestPost,
+
empty: noPosts,
+
error: latestPostError
+
} = useLatestRecord<unknown>(did, BLUESKY_POST_COLLECTION);
+
+
const quoteSampleDid = 'did:plc:ttdrpj45ibqunmfhdsb4zdwq';
+
const quoteSampleRkey = '3m2prlq6xxc2v';
+
+
return (
+
<div style={{ display: 'flex', flexDirection: 'column', gap: 20, color: baseTextColor }}>
+
<div style={{ display: 'flex', flexWrap: 'wrap', gap: 12, alignItems: 'center', justifyContent: 'space-between' }}>
+
<form onSubmit={onSubmit} style={{ display: 'flex', gap: 8, flexWrap: 'wrap', flex: '1 1 320px' }}>
+
<input
+
placeholder="Handle or DID (e.g. alice.bsky.social or did:plc:...)"
+
ref={handleInputRef}
+
style={{ flex: '1 1 260px', padding: '6px 8px', borderRadius: 8, border: '1px solid', borderColor: scheme === 'dark' ? '#1e293b' : '#cbd5f5', background: scheme === 'dark' ? '#0b1120' : '#fff', color: scheme === 'dark' ? '#e2e8f0' : '#0f172a' }}
+
/>
+
<button type="submit" style={{ padding: '6px 16px', borderRadius: 8, border: 'none', background: '#2563eb', color: '#fff', cursor: 'pointer' }}>Load</button>
+
</form>
+
<ColorSchemeToggle value={colorSchemePreference} onChange={setColorSchemePreference} scheme={scheme} />
+
</div>
+
{!submitted && <p style={{ color: mutedTextColor }}>Enter a handle to fetch your profile, latest Bluesky post, a Tangled string, and a Leaflet document.</p>}
+
{submitted && resolvingDid && <p style={{ color: mutedTextColor }}>Resolving DID…</p>}
+
{did && (
+
<>
+
<div style={primaryGridStyle}>
+
<div style={columnStackStyle}>
+
<section style={panelStyle}>
+
<h3 style={sectionHeaderStyle}>Profile</h3>
+
<BlueskyProfile did={did} handle={showHandle} colorScheme={colorSchemePreference} />
+
</section>
+
<section style={panelStyle}>
+
<h3 style={sectionHeaderStyle}>Recent Posts</h3>
+
<BlueskyPostList did={did} colorScheme={colorSchemePreference} />
+
</section>
+
</div>
+
<div style={columnStackStyle}>
+
<section style={panelStyle}>
+
<h3 style={sectionHeaderStyle}>Latest Bluesky Post</h3>
+
{loadingLatestPost && <div style={loadingBox}>Loading latest post…</div>}
+
{latestPostError && <div style={errorBox}>Failed to load latest post.</div>}
+
{noPosts && <div style={{ ...infoBox, color: mutedTextColor }}>No posts found.</div>}
+
{!loadingLatestPost && latestPostRkey && (
+
<BlueskyPost did={did} rkey={latestPostRkey} colorScheme={colorSchemePreference} />
+
)}
+
</section>
+
<section style={panelStyle}>
+
<h3 style={sectionHeaderStyle}>Quote Post Demo</h3>
+
<BlueskyQuotePost did={quoteSampleDid} rkey={quoteSampleRkey} colorScheme={colorSchemePreference} />
+
</section>
+
</div>
+
</div>
+
<section style={gistPanelStyle}>
+
<h3 style={sectionHeaderStyle}>A Tangled String</h3>
+
<TangledString did="nekomimi.pet" rkey="3m2p4gjptg522" colorScheme={colorSchemePreference} />
+
</section>
+
<section style={leafletPanelStyle}>
+
<h3 style={sectionHeaderStyle}>A Leaflet Document.</h3>
+
<div style={{ width: '100%', display: 'flex', justifyContent: 'center' }}>
+
<LeafletDocument did={"did:plc:ttdrpj45ibqunmfhdsb4zdwq"} rkey={"3m2seagm2222c"} colorScheme={colorSchemePreference} />
+
</div>
+
</section>
+
</>
+
)}
+
<section style={{ ...panelStyle, marginTop: 32 }}>
+
<h3 style={sectionHeaderStyle}>Build your own component</h3>
+
<p style={{ color: mutedTextColor, margin: '4px 0 8px' }}>
+
Wrap your app with the provider once and drop the ready-made components wherever you need them.
+
</p>
+
<pre style={codeBlockStyle}>
+
<code ref={basicCodeRef} className="language-tsx" style={codeTextStyle}>{basicUsageSnippet}</code>
+
</pre>
+
<p style={{ color: mutedTextColor, margin: '16px 0 8px' }}>
+
Need to make your own component? Compose your own renderer with the hooks and utilities that ship with the library.
+
</p>
+
<pre style={codeBlockStyle}>
+
<code ref={customCodeRef} className="language-tsx" style={codeTextStyle}>{customComponentSnippet}</code>
+
</pre>
+
{did && (
+
<div style={{ marginTop: 16, display: 'flex', flexDirection: 'column', gap: 12 }}>
+
<p style={{ color: mutedTextColor, margin: 0 }}>
+
Live example with your handle:
+
</p>
+
<LatestPostSummary did={did} handle={showHandle} colorScheme={colorSchemePreference} />
+
</div>
+
)}
+
</section>
+
</div>
+
);
+
};
+
+
const LatestPostSummary: React.FC<{ did: string; handle?: string; colorScheme: ColorSchemePreference }> = ({ did, colorScheme }) => {
+
const { rkey, loading, error } = useLatestRecord<FeedPostRecord>(did, BLUESKY_POST_COLLECTION);
+
const scheme = useColorScheme(colorScheme);
+
const palette = scheme === 'dark' ? latestSummaryPalette.dark : latestSummaryPalette.light;
+
+
if (loading) return <div style={palette.muted}>Loading summary…</div>;
+
if (error) return <div style={palette.error}>Failed to load the latest post.</div>;
+
if (!rkey) return <div style={palette.muted}>No posts published yet.</div>;
+
+
return (
+
<AtProtoRecord<FeedPostRecord>
+
did={did}
+
collection="app.bsky.feed.post"
+
rkey={rkey}
+
renderer={({ record }) => (
+
<article data-color-scheme={scheme}>
+
<strong>{record?.text ?? 'Empty post'}</strong>
+
</article>
+
)}
+
/>
+
);
+
};
+
+
const sectionHeaderStyle: React.CSSProperties = { margin: '4px 0', fontSize: 16 };
+
const loadingBox: React.CSSProperties = { padding: 8 };
+
const errorBox: React.CSSProperties = { padding: 8, color: 'crimson' };
+
const infoBox: React.CSSProperties = { padding: 8, color: '#555' };
+
+
const latestSummaryPalette = {
+
light: {
+
card: {
+
border: '1px solid #e2e8f0',
+
background: '#ffffff',
+
borderRadius: 12,
+
padding: 12,
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 8
+
} satisfies React.CSSProperties,
+
header: {
+
display: 'flex',
+
alignItems: 'baseline',
+
justifyContent: 'space-between',
+
gap: 12,
+
color: '#0f172a'
+
} satisfies React.CSSProperties,
+
time: {
+
fontSize: 12,
+
color: '#64748b'
+
} satisfies React.CSSProperties,
+
text: {
+
margin: 0,
+
color: '#1f2937',
+
whiteSpace: 'pre-wrap'
+
} satisfies React.CSSProperties,
+
link: {
+
color: '#2563eb',
+
fontWeight: 600,
+
fontSize: 12,
+
textDecoration: 'none'
+
} satisfies React.CSSProperties,
+
muted: {
+
color: '#64748b'
+
} satisfies React.CSSProperties,
+
error: {
+
color: 'crimson'
+
} satisfies React.CSSProperties
+
},
+
dark: {
+
card: {
+
border: '1px solid #1e293b',
+
background: '#0f172a',
+
borderRadius: 12,
+
padding: 12,
+
display: 'flex',
+
flexDirection: 'column',
+
gap: 8
+
} satisfies React.CSSProperties,
+
header: {
+
display: 'flex',
+
alignItems: 'baseline',
+
justifyContent: 'space-between',
+
gap: 12,
+
color: '#e2e8f0'
+
} satisfies React.CSSProperties,
+
time: {
+
fontSize: 12,
+
color: '#cbd5f5'
+
} satisfies React.CSSProperties,
+
text: {
+
margin: 0,
+
color: '#e2e8f0',
+
whiteSpace: 'pre-wrap'
+
} satisfies React.CSSProperties,
+
link: {
+
color: '#38bdf8',
+
fontWeight: 600,
+
fontSize: 12,
+
textDecoration: 'none'
+
} satisfies React.CSSProperties,
+
muted: {
+
color: '#94a3b8'
+
} satisfies React.CSSProperties,
+
error: {
+
color: '#f472b6'
+
} satisfies React.CSSProperties
+
}
+
} as const;
+
+
export const App: React.FC = () => {
+
return (
+
<AtProtoProvider>
+
<div style={{ maxWidth: 860, margin: '40px auto', padding: '0 20px', fontFamily: 'system-ui, sans-serif' }}>
+
<h1 style={{ marginTop: 0 }}>atproto-ui Demo</h1>
+
<p style={{ lineHeight: 1.4 }}>A component library for rendering common AT Protocol records for applications such as Bluesky and Tangled.</p>
+
<hr style={{ margin: '32px 0' }} />
+
<FullDemo />
+
</div>
+
</AtProtoProvider>
+
);
+
};
+
+
export default App;
+8
src/main.tsx
···
+
import { createRoot } from 'react-dom/client';
+
import App from './App';
+
+
const el = document.getElementById('root');
+
if (el) {
+
const root = createRoot(el);
+
root.render(<App />);
+
}
+28
tsconfig.app.json
···
+
{
+
"compilerOptions": {
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.app.tsbuildinfo",
+
"target": "ES2022",
+
"useDefineForClassFields": true,
+
"lib": ["ES2022", "DOM", "DOM.Iterable"],
+
"module": "ESNext",
+
"types": ["vite/client"],
+
"skipLibCheck": true,
+
+
/* Bundler mode */
+
"moduleResolution": "bundler",
+
"allowImportingTsExtensions": true,
+
"verbatimModuleSyntax": true,
+
"moduleDetection": "force",
+
"noEmit": true,
+
"jsx": "react-jsx",
+
+
/* Linting */
+
"strict": true,
+
"noUnusedLocals": true,
+
"noUnusedParameters": true,
+
"erasableSyntaxOnly": true,
+
"noFallthroughCasesInSwitch": true,
+
"noUncheckedSideEffectImports": true
+
},
+
"include": ["src"]
+
}
+8
tsconfig.json
···
+
{
+
"files": [],
+
"references": [
+
{ "path": "./tsconfig.app.json" },
+
{ "path": "./tsconfig.lib.json" },
+
{ "path": "./tsconfig.node.json" }
+
]
+
}
+22
tsconfig.lib.json
···
+
{
+
"compilerOptions": {
+
"composite": true,
+
"target": "ES2020",
+
"module": "ESNext",
+
"lib": ["ES2020", "DOM", "DOM.Iterable"],
+
"moduleResolution": "bundler",
+
"moduleDetection": "force",
+
"jsx": "react-jsx",
+
"strict": true,
+
"skipLibCheck": true,
+
"allowSyntheticDefaultImports": true,
+
"esModuleInterop": true,
+
"resolveJsonModule": true,
+
"declaration": true,
+
"declarationMap": false,
+
"sourceMap": false,
+
"outDir": "./lib-dist",
+
"rootDir": "./lib"
+
},
+
"include": ["lib/**/*.ts", "lib/**/*.tsx"]
+
}
+1
tsconfig.lib.tsbuildinfo
···
+
{"fileNames":["./node_modules/typescript/lib/lib.es5.d.ts","./node_modules/typescript/lib/lib.es2015.d.ts","./node_modules/typescript/lib/lib.es2016.d.ts","./node_modules/typescript/lib/lib.es2017.d.ts","./node_modules/typescript/lib/lib.es2018.d.ts","./node_modules/typescript/lib/lib.es2019.d.ts","./node_modules/typescript/lib/lib.es2020.d.ts","./node_modules/typescript/lib/lib.dom.d.ts","./node_modules/typescript/lib/lib.dom.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.core.d.ts","./node_modules/typescript/lib/lib.es2015.collection.d.ts","./node_modules/typescript/lib/lib.es2015.generator.d.ts","./node_modules/typescript/lib/lib.es2015.iterable.d.ts","./node_modules/typescript/lib/lib.es2015.promise.d.ts","./node_modules/typescript/lib/lib.es2015.proxy.d.ts","./node_modules/typescript/lib/lib.es2015.reflect.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.d.ts","./node_modules/typescript/lib/lib.es2015.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2016.array.include.d.ts","./node_modules/typescript/lib/lib.es2016.intl.d.ts","./node_modules/typescript/lib/lib.es2017.arraybuffer.d.ts","./node_modules/typescript/lib/lib.es2017.date.d.ts","./node_modules/typescript/lib/lib.es2017.object.d.ts","./node_modules/typescript/lib/lib.es2017.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2017.string.d.ts","./node_modules/typescript/lib/lib.es2017.intl.d.ts","./node_modules/typescript/lib/lib.es2017.typedarrays.d.ts","./node_modules/typescript/lib/lib.es2018.asyncgenerator.d.ts","./node_modules/typescript/lib/lib.es2018.asynciterable.d.ts","./node_modules/typescript/lib/lib.es2018.intl.d.ts","./node_modules/typescript/lib/lib.es2018.promise.d.ts","./node_modules/typescript/lib/lib.es2018.regexp.d.ts","./node_modules/typescript/lib/lib.es2019.array.d.ts","./node_modules/typescript/lib/lib.es2019.object.d.ts","./node_modules/typescript/lib/lib.es2019.string.d.ts","./node_modules/typescript/lib/lib.es2019.symbol.d.ts","./node_modules/typescript/lib/lib.es2019.intl.d.ts","./node_modules/typescript/lib/lib.es2020.bigint.d.ts","./node_modules/typescript/lib/lib.es2020.date.d.ts","./node_modules/typescript/lib/lib.es2020.promise.d.ts","./node_modules/typescript/lib/lib.es2020.sharedmemory.d.ts","./node_modules/typescript/lib/lib.es2020.string.d.ts","./node_modules/typescript/lib/lib.es2020.symbol.wellknown.d.ts","./node_modules/typescript/lib/lib.es2020.intl.d.ts","./node_modules/typescript/lib/lib.es2020.number.d.ts","./node_modules/typescript/lib/lib.esnext.disposable.d.ts","./node_modules/typescript/lib/lib.esnext.float16.d.ts","./node_modules/typescript/lib/lib.decorators.d.ts","./node_modules/typescript/lib/lib.decorators.legacy.d.ts","./node_modules/@types/react/global.d.ts","./node_modules/csstype/index.d.ts","./node_modules/@types/react/index.d.ts","./node_modules/@types/react/jsx-runtime.d.ts","./node_modules/@atcute/lexicons/dist/syntax/did.d.ts","./node_modules/@atcute/lexicons/dist/syntax/handle.d.ts","./node_modules/@atcute/lexicons/dist/syntax/at-identifier.d.ts","./node_modules/@atcute/lexicons/dist/syntax/nsid.d.ts","./node_modules/@atcute/lexicons/dist/syntax/record-key.d.ts","./node_modules/@atcute/lexicons/dist/utils.d.ts","./node_modules/@atcute/lexicons/dist/syntax/at-uri.d.ts","./node_modules/@atcute/lexicons/dist/syntax/cid.d.ts","./node_modules/@atcute/lexicons/dist/syntax/datetime.d.ts","./node_modules/@atcute/lexicons/dist/syntax/language.d.ts","./node_modules/@atcute/lexicons/dist/syntax/tid.d.ts","./node_modules/@atcute/lexicons/dist/syntax/uri.d.ts","./node_modules/@atcute/lexicons/dist/interfaces/cid-link.d.ts","./node_modules/@atcute/lexicons/dist/interfaces/blob.d.ts","./node_modules/@atcute/lexicons/dist/interfaces/bytes.d.ts","./node_modules/@atcute/lexicons/dist/types/brand.d.ts","./node_modules/@standard-schema/spec/dist/index.d.ts","./node_modules/@atcute/lexicons/dist/syntax/index.d.ts","./node_modules/@atcute/lexicons/dist/interfaces/index.d.ts","./node_modules/@atcute/lexicons/dist/validations/index.d.ts","./node_modules/@atcute/lexicons/dist/index.d.ts","./node_modules/@atcute/lexicons/dist/ambient.d.ts","./node_modules/@atcute/client/dist/fetch-handler.d.ts","./node_modules/@atcute/client/dist/client.d.ts","./node_modules/@atcute/client/dist/credential-manager.d.ts","./node_modules/@atcute/client/dist/index.d.ts","./node_modules/@badrap/valita/dist/mjs/index.d.mts","./node_modules/@atcute/identity/dist/types.d.ts","./node_modules/@atcute/identity/dist/typedefs.d.ts","./node_modules/@atcute/identity/dist/utils.d.ts","./node_modules/@atcute/identity/dist/did.d.ts","./node_modules/@atcute/identity/dist/methods/key.d.ts","./node_modules/@atcute/identity/dist/methods/plc.d.ts","./node_modules/@atcute/identity/dist/methods/web.d.ts","./node_modules/@atcute/identity/dist/index.d.ts","./node_modules/@atcute/identity-resolver/dist/types.d.ts","./node_modules/@atcute/identity-resolver/dist/did/composite.d.ts","./node_modules/@atcute/identity-resolver/dist/did/methods/plc.d.ts","./node_modules/@atcute/identity-resolver/dist/did/methods/web.d.ts","./node_modules/@atcute/identity-resolver/dist/did/methods/xrpc.d.ts","./node_modules/@atcute/identity-resolver/dist/handle/composite.d.ts","./node_modules/@atcute/identity-resolver/dist/handle/methods/doh-json.d.ts","./node_modules/@atcute/identity-resolver/dist/handle/methods/well-known.d.ts","./node_modules/@atcute/identity-resolver/dist/handle/methods/xrpc.d.ts","./node_modules/@atcute/identity-resolver/dist/errors.d.ts","./node_modules/@atcute/identity-resolver/dist/index.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/actor/profile.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/feed/reaction.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/feed/star.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/git/refupdate.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/graph/follow.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/knot.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/knot/listkeys.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/knot/member.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/knot/version.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/owner.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/pipeline.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/pipeline/status.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/publickey.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/addsecret.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/archive.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/artifact.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/blob.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/branch.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/branches.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/collaborator.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/compare.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/create.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/delete.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/diff.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/forkstatus.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/forksync.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/getdefaultbranch.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/hiddenref.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/issue.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/issue/comment.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/issue/state.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/issue/state/closed.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/issue/state/open.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/languages.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/listsecrets.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/log.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/merge.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/mergecheck.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull/comment.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull/status.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull/status/closed.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull/status/merged.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/pull/status/open.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/removesecret.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/setdefaultbranch.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/tags.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/repo/tree.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/spindle.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/spindle/member.d.ts","./node_modules/@atcute/tangled/dist/lexicons/types/sh/tangled/string.d.ts","./node_modules/@atcute/tangled/dist/lexicons/index.d.ts","./node_modules/@atcute/tangled/dist/index.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/deleteaccount.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/disableaccountinvites.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/disableinvitecodes.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/enableaccountinvites.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/getaccountinfo.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/getaccountinfos.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/getinvitecodes.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/strongref.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/getsubjectstatus.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/searchaccounts.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/sendemail.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/updateaccountemail.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/updateaccounthandle.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/updateaccountpassword.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/updateaccountsigningkey.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/admin/updatesubjectstatus.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/getrecommendeddidcredentials.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/refreshidentity.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/requestplcoperationsignature.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/resolvedid.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/resolvehandle.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/resolveidentity.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/signplcoperation.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/submitplcoperation.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/identity/updatehandle.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/label/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/label/querylabels.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/label/subscribelabels.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/lexicon/schema.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/moderation/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/moderation/createreport.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/applywrites.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/createrecord.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/deleterecord.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/describerepo.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/getrecord.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/importrepo.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/listmissingblobs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/listrecords.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/putrecord.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/repo/uploadblob.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/activateaccount.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/checkaccountstatus.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/confirmemail.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/createaccount.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/createapppassword.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/createinvitecode.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/createinvitecodes.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/createsession.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/deactivateaccount.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/deleteaccount.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/deletesession.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/describeserver.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/getaccountinvitecodes.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/getserviceauth.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/getsession.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/listapppasswords.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/refreshsession.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/requestaccountdelete.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/requestemailconfirmation.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/requestemailupdate.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/requestpasswordreset.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/reservesigningkey.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/resetpassword.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/revokeapppassword.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/server/updateemail.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/defs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getblob.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getblocks.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getcheckout.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/gethead.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/gethoststatus.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getlatestcommit.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getrecord.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getrepo.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/getrepostatus.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/listblobs.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/listhosts.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/listrepos.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/listreposbycollection.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/notifyofupdate.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/requestcrawl.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/sync/subscriberepos.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/addreservedhandle.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/checkhandleavailability.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/checksignupqueue.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/dereferencescope.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/fetchlabels.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/requestphoneverification.d.ts","./node_modules/@atcute/atproto/dist/lexicons/types/com/atproto/temp/revokeaccountcredentials.d.ts","./node_modules/@atcute/atproto/dist/lexicons/index.d.ts","./node_modules/@atcute/atproto/dist/index.d.ts","./lib/utils/atproto-client.ts","./lib/providers/atprotoprovider.tsx","./lib/hooks/usepdsendpoint.ts","./lib/hooks/useatprotorecord.ts","./lib/hooks/usedidresolution.ts","./lib/core/atprotorecord.tsx","./lib/components/blueskyicon.tsx","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/external.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/postgate.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/threadgate.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/images.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/video.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/recordwithmedia.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/labeler/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/embed/record.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/richtext/facet.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/getpreferences.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/getprofile.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/getprofiles.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/getsuggestions.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/profile.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/putpreferences.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/searchactors.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/searchactorstypeahead.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/actor/status.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/bookmark/createbookmark.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/bookmark/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/bookmark/deletebookmark.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/bookmark/getbookmarks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/describefeedgenerator.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/generator.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getactorfeeds.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getactorlikes.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getauthorfeed.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getfeed.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getfeedgenerator.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getfeedgenerators.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getfeedskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getlikes.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getlistfeed.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getpostthread.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getposts.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getquotes.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getrepostedby.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/getsuggestedfeeds.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/gettimeline.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/like.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/post.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/repost.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/searchposts.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/feed/sendinteractions.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/block.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/follow.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getactorstarterpacks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getblocks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getfollowers.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getfollows.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getknownfollowers.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getlist.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getlistblocks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getlistmutes.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getlists.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getlistswithmembership.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getmutes.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getrelationships.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getstarterpack.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getstarterpacks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getstarterpackswithmembership.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/getsuggestedfollowsbyactor.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/list.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/listblock.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/listitem.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/muteactor.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/muteactorlist.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/mutethread.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/searchstarterpacks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/starterpack.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/unmuteactor.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/unmuteactorlist.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/unmutethread.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/graph/verification.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/labeler/getservices.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/labeler/service.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/declaration.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/getpreferences.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/getunreadcount.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/listactivitysubscriptions.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/listnotifications.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/putactivitysubscription.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/putpreferences.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/putpreferencesv2.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/registerpush.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/unregisterpush.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/notification/updateseen.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getageassurancestate.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getconfig.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getpopularfeedgenerators.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getpostthreadotherv2.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getpostthreadv2.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedfeeds.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedfeedsskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedstarterpacks.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedstarterpacksskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedusers.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestedusersskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/getsuggestionsskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/gettaggedsuggestions.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/gettrendingtopics.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/gettrends.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/gettrendsskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/initageassurance.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/searchactorsskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/searchpostsskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/unspecced/searchstarterpacksskeleton.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/video/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/video/getjobstatus.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/video/getuploadlimits.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/app/bsky/video/uploadvideo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/actor/declaration.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/actor/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/actor/deleteaccount.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/actor/exportaccountdata.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/acceptconvo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/defs.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/addreaction.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/deletemessageforself.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/getconvo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/getconvoavailability.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/getconvoformembers.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/getlog.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/getmessages.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/leaveconvo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/listconvos.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/muteconvo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/removereaction.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/sendmessage.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/sendmessagebatch.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/unmuteconvo.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/updateallread.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/convo/updateread.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/moderation/getactormetadata.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/moderation/getmessagecontext.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/types/chat/bsky/moderation/updateactoraccess.d.ts","./node_modules/@atcute/bluesky/dist/lexicons/index.d.ts","./node_modules/@atcute/bluesky/dist/utilities/embeds.d.ts","./node_modules/@atcute/bluesky/dist/utilities/list.d.ts","./node_modules/@atcute/bluesky/dist/utilities/profile.d.ts","./node_modules/@atcute/bluesky/dist/utilities/starterpack.d.ts","./node_modules/@atcute/bluesky/dist/index.d.ts","./lib/types/bluesky.ts","./lib/hooks/usecolorscheme.ts","./lib/utils/at-uri.ts","./lib/hooks/usedidhandle.ts","./lib/hooks/useblob.ts","./lib/renderers/blueskypostrenderer.tsx","./lib/renderers/blueskyprofilerenderer.tsx","./lib/utils/profile.ts","./lib/components/blueskyprofile.tsx","./lib/components/blueskypost.tsx","./lib/hooks/usepaginatedrecords.ts","./lib/components/blueskypostlist.tsx","./lib/components/blueskyquotepost.tsx","./lib/components/colorschemetoggle.tsx","./lib/types/leaflet.ts","./lib/renderers/leafletdocumentrenderer.tsx","./lib/components/leafletdocument.tsx","./lib/renderers/tangledstringrenderer.tsx","./lib/components/tangledstring.tsx","./lib/hooks/useblueskyprofile.ts","./lib/hooks/uselatestrecord.ts","./lib/index.ts","./node_modules/@babel/types/lib/index.d.ts","./node_modules/@types/babel__generator/index.d.ts","./node_modules/@babel/parser/typings/babel-parser.d.ts","./node_modules/@types/babel__template/index.d.ts","./node_modules/@types/babel__traverse/index.d.ts","./node_modules/@types/babel__core/index.d.ts","./node_modules/@types/estree/index.d.ts","./node_modules/@types/json-schema/index.d.ts","./node_modules/@types/node/compatibility/iterators.d.ts","./node_modules/@types/node/globals.typedarray.d.ts","./node_modules/@types/node/buffer.buffer.d.ts","./node_modules/@types/node/globals.d.ts","./node_modules/@types/node/web-globals/abortcontroller.d.ts","./node_modules/@types/node/web-globals/crypto.d.ts","./node_modules/@types/node/web-globals/domexception.d.ts","./node_modules/@types/node/web-globals/events.d.ts","./node_modules/undici-types/utility.d.ts","./node_modules/undici-types/header.d.ts","./node_modules/undici-types/readable.d.ts","./node_modules/undici-types/fetch.d.ts","./node_modules/undici-types/formdata.d.ts","./node_modules/undici-types/connector.d.ts","./node_modules/undici-types/client-stats.d.ts","./node_modules/undici-types/client.d.ts","./node_modules/undici-types/errors.d.ts","./node_modules/undici-types/dispatcher.d.ts","./node_modules/undici-types/global-dispatcher.d.ts","./node_modules/undici-types/global-origin.d.ts","./node_modules/undici-types/pool-stats.d.ts","./node_modules/undici-types/pool.d.ts","./node_modules/undici-types/handlers.d.ts","./node_modules/undici-types/balanced-pool.d.ts","./node_modules/undici-types/h2c-client.d.ts","./node_modules/undici-types/agent.d.ts","./node_modules/undici-types/mock-interceptor.d.ts","./node_modules/undici-types/mock-call-history.d.ts","./node_modules/undici-types/mock-agent.d.ts","./node_modules/undici-types/mock-client.d.ts","./node_modules/undici-types/mock-pool.d.ts","./node_modules/undici-types/snapshot-agent.d.ts","./node_modules/undici-types/mock-errors.d.ts","./node_modules/undici-types/proxy-agent.d.ts","./node_modules/undici-types/env-http-proxy-agent.d.ts","./node_modules/undici-types/retry-handler.d.ts","./node_modules/undici-types/retry-agent.d.ts","./node_modules/undici-types/api.d.ts","./node_modules/undici-types/cache-interceptor.d.ts","./node_modules/undici-types/interceptors.d.ts","./node_modules/undici-types/util.d.ts","./node_modules/undici-types/cookies.d.ts","./node_modules/undici-types/patch.d.ts","./node_modules/undici-types/websocket.d.ts","./node_modules/undici-types/eventsource.d.ts","./node_modules/undici-types/diagnostics-channel.d.ts","./node_modules/undici-types/content-type.d.ts","./node_modules/undici-types/cache.d.ts","./node_modules/undici-types/index.d.ts","./node_modules/@types/node/web-globals/fetch.d.ts","./node_modules/@types/node/web-globals/navigator.d.ts","./node_modules/@types/node/web-globals/storage.d.ts","./node_modules/@types/node/web-globals/streams.d.ts","./node_modules/@types/node/assert.d.ts","./node_modules/@types/node/assert/strict.d.ts","./node_modules/@types/node/async_hooks.d.ts","./node_modules/@types/node/buffer.d.ts","./node_modules/@types/node/child_process.d.ts","./node_modules/@types/node/cluster.d.ts","./node_modules/@types/node/console.d.ts","./node_modules/@types/node/constants.d.ts","./node_modules/@types/node/crypto.d.ts","./node_modules/@types/node/dgram.d.ts","./node_modules/@types/node/diagnostics_channel.d.ts","./node_modules/@types/node/dns.d.ts","./node_modules/@types/node/dns/promises.d.ts","./node_modules/@types/node/domain.d.ts","./node_modules/@types/node/events.d.ts","./node_modules/@types/node/fs.d.ts","./node_modules/@types/node/fs/promises.d.ts","./node_modules/@types/node/http.d.ts","./node_modules/@types/node/http2.d.ts","./node_modules/@types/node/https.d.ts","./node_modules/@types/node/inspector.d.ts","./node_modules/@types/node/inspector.generated.d.ts","./node_modules/@types/node/module.d.ts","./node_modules/@types/node/net.d.ts","./node_modules/@types/node/os.d.ts","./node_modules/@types/node/path.d.ts","./node_modules/@types/node/perf_hooks.d.ts","./node_modules/@types/node/process.d.ts","./node_modules/@types/node/punycode.d.ts","./node_modules/@types/node/querystring.d.ts","./node_modules/@types/node/readline.d.ts","./node_modules/@types/node/readline/promises.d.ts","./node_modules/@types/node/repl.d.ts","./node_modules/@types/node/sea.d.ts","./node_modules/@types/node/sqlite.d.ts","./node_modules/@types/node/stream.d.ts","./node_modules/@types/node/stream/promises.d.ts","./node_modules/@types/node/stream/consumers.d.ts","./node_modules/@types/node/stream/web.d.ts","./node_modules/@types/node/string_decoder.d.ts","./node_modules/@types/node/test.d.ts","./node_modules/@types/node/timers.d.ts","./node_modules/@types/node/timers/promises.d.ts","./node_modules/@types/node/tls.d.ts","./node_modules/@types/node/trace_events.d.ts","./node_modules/@types/node/tty.d.ts","./node_modules/@types/node/url.d.ts","./node_modules/@types/node/util.d.ts","./node_modules/@types/node/v8.d.ts","./node_modules/@types/node/vm.d.ts","./node_modules/@types/node/wasi.d.ts","./node_modules/@types/node/worker_threads.d.ts","./node_modules/@types/node/zlib.d.ts","./node_modules/@types/node/index.d.ts","./node_modules/@types/react-dom/index.d.ts"],"fileIdsList":[[52,53,437,491,508,509],[52,53,253,255,405,408,409,410,412,413,437,491,508,509],[52,53,256,405,406,408,415,437,491,508,509],[52,53,255,405,409,411,412,437,491,508,509],[52,53,405,407,410,414,437,491,508,509],[52,53,406,437,491,508,509],[52,53,253,255,406,407,419,420,437,491,508,509],[52,53,255,422,437,491,508,509],[52,53,253,254,437,491,508,509],[52,53,250,252,437,491,508,509],[52,53,252,437,491,508,509],[52,53,251,437,491,508,509],[53,250,251,252,253,254,255,256,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,437,491,508,509],[52,53,250,437,491,508,509],[52,53,256,405,406,407,408,409,437,491,508,509],[52,53,256,405,406,437,491,508,509],[52,53,406,407,408,409,414,419,437,491,508,509],[52,53,153,406,437,491,508,509],[53,404,437,491,508,509],[53,437,491,508,509],[53,71,79,88,99,153,249,437,491,508,509],[53,405,437,491,508,509],[248,437,491,508,509],[154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,437,491,508,509],[73,154,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,160,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,154,156,157,158,159,160,161,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,160,161,162,163,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,160,161,162,164,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,172,173,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,172,173,174,175,176,177,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,186,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,188,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,188,189,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,188,189,190,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,188,189,190,191,192,193,194,195,196,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,154,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[399,400,401,402,403,437,491,508,509],[257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,163,182,257,258,259,268,269,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,257,258,259,271,272,273,274,275,276,277,278,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,163,267,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,281,282,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,260,437,491,508,509],[73,163,182,257,261,262,263,264,267,268,270,437,491,508,509],[73,257,261,262,265,437,491,508,509],[73,182,257,261,262,263,265,266,268,270,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,266,271,272,273,274,275,276,277,278,279,280,282,283,284,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,257,258,259,261,262,263,265,266,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,182,266,267,270,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,266,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,266,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,182,186,270,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,264,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,264,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,269,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,182,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,269,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,269,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,267,270,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,267,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,268,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,270,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,182,270,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,265,266,375,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,437,491,508,509],[74,263,265,267,302,437,491,508,509],[399,437,491,508,509],[73,74,75,76,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[74,76,437,491,508,509],[437,491,508,509],[76,77,78,437,491,508,509],[71,88,89,437,491,508,509],[71,437,491,508,509],[71,89,437,491,508,509],[89,90,91,92,93,94,95,96,97,98,437,491,508,509],[71,88,437,491,508,509],[81,82,83,84,85,86,87,437,491,508,509],[74,437,491,508,509],[80,81,437,491,508,509],[74,81,437,491,508,509],[54,55,56,57,58,60,61,62,63,64,65,66,67,68,69,73,437,491,508,509],[61,66,437,491,508,509],[61,437,491,508,509],[66,67,68,437,491,508,509],[54,55,437,491,508,509],[54,56,57,58,59,437,491,508,509],[54,55,56,57,58,60,61,62,63,64,65,437,491,508,509],[69,70,71,72,437,491,508,509],[152,437,491,508,509],[100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,437,491,508,509],[73,75,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,134,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,135,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,136,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,137,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,138,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,139,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,140,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,141,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,145,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,146,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,147,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,148,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,149,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,150,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,151,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[73,75,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,134,135,136,137,138,139,140,141,145,146,147,148,149,150,156,157,158,159,160,161,162,164,165,166,167,168,169,170,171,173,174,175,176,177,178,179,180,181,183,184,185,187,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,258,259,271,272,273,274,275,276,277,278,279,280,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,371,372,373,374,376,377,378,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,437,491,508,509],[427,437,491,508,509],[427,428,429,430,431,437,491,508,509],[427,429,437,491,508,509],[437,488,489,491,508,509],[437,490,491,508,509],[491,508,509],[437,491,496,508,509,526],[437,491,492,497,502,508,509,511,523,534],[437,491,492,493,502,508,509,511],[437,491,494,508,509,535],[437,491,495,496,503,508,509,512],[437,491,496,508,509,523,531],[437,491,497,499,502,508,509,511],[437,490,491,498,508,509],[437,491,499,500,508,509],[437,491,501,502,508,509],[437,490,491,502,508,509],[437,491,502,503,504,508,509,523,534],[437,491,502,503,504,508,509,518,523,526],[437,483,491,499,502,505,508,509,511,523,534],[437,491,502,503,505,506,508,509,511,523,531,534],[437,491,505,507,508,509,523,531,534],[435,436,437,438,439,440,441,442,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540],[437,491,502,508,509],[437,491,508,509,510,534],[437,491,499,502,508,509,511,523],[437,491,508,509,512],[437,491,508,509,513],[437,490,491,508,509,514],[437,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540],[437,491,508,509,516],[437,491,508,509,517],[437,491,502,508,509,518,519],[437,491,508,509,518,520,535,537],[437,491,502,508,509,523,524,526],[437,491,508,509,525,526],[437,491,508,509,523,524],[437,491,508,509,526],[437,491,508,509,527],[437,488,491,508,509,523,528],[437,491,502,508,509,529,530],[437,491,508,509,529,530],[437,491,496,508,509,511,523,531],[437,491,508,509,532],[437,491,508,509,511,533],[437,491,505,508,509,517,534],[437,491,496,508,509,535],[437,491,508,509,523,536],[437,491,508,509,510,537],[437,491,508,509,538],[437,491,496,508,509],[437,483,491,508,509],[437,491,508,509,539],[437,483,491,502,504,508,509,514,523,526,534,536,537,539],[437,491,508,509,523,540],[52,437,491,508,509],[50,51,437,491,508,509],[437,449,452,455,456,491,508,509,534],[437,452,491,508,509,523,534],[437,452,456,491,508,509,534],[437,491,508,509,523],[437,446,491,508,509],[437,450,491,508,509],[437,448,449,452,491,508,509,534],[437,491,508,509,511,531],[437,491,508,509,541],[437,446,491,508,509,541],[437,448,452,491,508,509,511,534],[437,443,444,445,447,451,491,502,508,509,523,534],[437,452,460,468,491,508,509],[437,444,450,491,508,509],[437,452,477,478,491,508,509],[437,444,447,452,491,508,509,526,534,541],[437,452,491,508,509],[437,448,452,491,508,509,534],[437,443,491,508,509],[437,446,447,448,450,451,452,453,454,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,478,479,480,481,482,491,508,509],[437,452,470,473,491,499,508,509],[437,452,460,461,462,491,508,509],[437,450,452,461,463,491,508,509],[437,451,491,508,509],[437,444,446,452,491,508,509],[437,452,456,461,463,491,508,509],[437,456,491,508,509],[437,450,452,455,491,508,509,534],[437,444,448,452,460,491,508,509],[437,452,470,491,508,509],[437,463,491,508,509],[437,446,452,477,491,508,509,526,539,541]],"fileInfos":[{"version":"c430d44666289dae81f30fa7b2edebf186ecc91a2d4c71266ea6ae76388792e1","affectsGlobalScope":true,"impliedFormat":1},{"version":"45b7ab580deca34ae9729e97c13cfd999df04416a79116c3bfb483804f85ded4","impliedFormat":1},{"version":"3facaf05f0c5fc569c5649dd359892c98a85557e3e0c847964caeb67076f4d75","impliedFormat":1},{"version":"e44bb8bbac7f10ecc786703fe0a6a4b952189f908707980ba8f3c8975a760962","impliedFormat":1},{"version":"5e1c4c362065a6b95ff952c0eab010f04dcd2c3494e813b493ecfd4fcb9fc0d8","impliedFormat":1},{"version":"68d73b4a11549f9c0b7d352d10e91e5dca8faa3322bfb77b661839c42b1ddec7","impliedFormat":1},{"version":"5efce4fc3c29ea84e8928f97adec086e3dc876365e0982cc8479a07954a3efd4","impliedFormat":1},{"version":"080941d9f9ff9307f7e27a83bcd888b7c8270716c39af943532438932ec1d0b9","affectsGlobalScope":true,"impliedFormat":1},{"version":"2e80ee7a49e8ac312cc11b77f1475804bee36b3b2bc896bead8b6e1266befb43","affectsGlobalScope":true,"impliedFormat":1},{"version":"c57796738e7f83dbc4b8e65132f11a377649c00dd3eee333f672b8f0a6bea671","affectsGlobalScope":true,"impliedFormat":1},{"version":"dc2df20b1bcdc8c2d34af4926e2c3ab15ffe1160a63e58b7e09833f616efff44","affectsGlobalScope":true,"impliedFormat":1},{"version":"515d0b7b9bea2e31ea4ec968e9edd2c39d3eebf4a2d5cbd04e88639819ae3b71","affectsGlobalScope":true,"impliedFormat":1},{"version":"0559b1f683ac7505ae451f9a96ce4c3c92bdc71411651ca6ddb0e88baaaad6a3","affectsGlobalScope":true,"impliedFormat":1},{"version":"0dc1e7ceda9b8b9b455c3a2d67b0412feab00bd2f66656cd8850e8831b08b537","affectsGlobalScope":true,"impliedFormat":1},{"version":"ce691fb9e5c64efb9547083e4a34091bcbe5bdb41027e310ebba8f7d96a98671","affectsGlobalScope":true,"impliedFormat":1},{"version":"8d697a2a929a5fcb38b7a65594020fcef05ec1630804a33748829c5ff53640d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"4ff2a353abf8a80ee399af572debb8faab2d33ad38c4b4474cff7f26e7653b8d","affectsGlobalScope":true,"impliedFormat":1},{"version":"fb0f136d372979348d59b3f5020b4cdb81b5504192b1cacff5d1fbba29378aa1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d15bea3d62cbbdb9797079416b8ac375ae99162a7fba5de2c6c505446486ac0a","affectsGlobalScope":true,"impliedFormat":1},{"version":"68d18b664c9d32a7336a70235958b8997ebc1c3b8505f4f1ae2b7e7753b87618","affectsGlobalScope":true,"impliedFormat":1},{"version":"eb3d66c8327153d8fa7dd03f9c58d351107fe824c79e9b56b462935176cdf12a","affectsGlobalScope":true,"impliedFormat":1},{"version":"38f0219c9e23c915ef9790ab1d680440d95419ad264816fa15009a8851e79119","affectsGlobalScope":true,"impliedFormat":1},{"version":"69ab18c3b76cd9b1be3d188eaf8bba06112ebbe2f47f6c322b5105a6fbc45a2e","affectsGlobalScope":true,"impliedFormat":1},{"version":"a680117f487a4d2f30ea46f1b4b7f58bef1480456e18ba53ee85c2746eeca012","affectsGlobalScope":true,"impliedFormat":1},{"version":"2f11ff796926e0832f9ae148008138ad583bd181899ab7dd768a2666700b1893","affectsGlobalScope":true,"impliedFormat":1},{"version":"4de680d5bb41c17f7f68e0419412ca23c98d5749dcaaea1896172f06435891fc","affectsGlobalScope":true,"impliedFormat":1},{"version":"954296b30da6d508a104a3a0b5d96b76495c709785c1d11610908e63481ee667","affectsGlobalScope":true,"impliedFormat":1},{"version":"ac9538681b19688c8eae65811b329d3744af679e0bdfa5d842d0e32524c73e1c","affectsGlobalScope":true,"impliedFormat":1},{"version":"0a969edff4bd52585473d24995c5ef223f6652d6ef46193309b3921d65dd4376","affectsGlobalScope":true,"impliedFormat":1},{"version":"9e9fbd7030c440b33d021da145d3232984c8bb7916f277e8ffd3dc2e3eae2bdb","affectsGlobalScope":true,"impliedFormat":1},{"version":"811ec78f7fefcabbda4bfa93b3eb67d9ae166ef95f9bff989d964061cbf81a0c","affectsGlobalScope":true,"impliedFormat":1},{"version":"717937616a17072082152a2ef351cb51f98802fb4b2fdabd32399843875974ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"d7e7d9b7b50e5f22c915b525acc5a49a7a6584cf8f62d0569e557c5cfc4b2ac2","affectsGlobalScope":true,"impliedFormat":1},{"version":"71c37f4c9543f31dfced6c7840e068c5a5aacb7b89111a4364b1d5276b852557","affectsGlobalScope":true,"impliedFormat":1},{"version":"576711e016cf4f1804676043e6a0a5414252560eb57de9faceee34d79798c850","affectsGlobalScope":true,"impliedFormat":1},{"version":"89c1b1281ba7b8a96efc676b11b264de7a8374c5ea1e6617f11880a13fc56dc6","affectsGlobalScope":true,"impliedFormat":1},{"version":"74f7fa2d027d5b33eb0471c8e82a6c87216223181ec31247c357a3e8e2fddc5b","affectsGlobalScope":true,"impliedFormat":1},{"version":"d6d7ae4d1f1f3772e2a3cde568ed08991a8ae34a080ff1151af28b7f798e22ca","affectsGlobalScope":true,"impliedFormat":1},{"version":"063600664504610fe3e99b717a1223f8b1900087fab0b4cad1496a114744f8df","affectsGlobalScope":true,"impliedFormat":1},{"version":"934019d7e3c81950f9a8426d093458b65d5aff2c7c1511233c0fd5b941e608ab","affectsGlobalScope":true,"impliedFormat":1},{"version":"52ada8e0b6e0482b728070b7639ee42e83a9b1c22d205992756fe020fd9f4a47","affectsGlobalScope":true,"impliedFormat":1},{"version":"3bdefe1bfd4d6dee0e26f928f93ccc128f1b64d5d501ff4a8cf3c6371200e5e6","affectsGlobalScope":true,"impliedFormat":1},{"version":"59fb2c069260b4ba00b5643b907ef5d5341b167e7d1dbf58dfd895658bda2867","affectsGlobalScope":true,"impliedFormat":1},{"version":"639e512c0dfc3fad96a84caad71b8834d66329a1f28dc95e3946c9b58176c73a","affectsGlobalScope":true,"impliedFormat":1},{"version":"368af93f74c9c932edd84c58883e736c9e3d53cec1fe24c0b0ff451f529ceab1","affectsGlobalScope":true,"impliedFormat":1},{"version":"51ad4c928303041605b4d7ae32e0c1ee387d43a24cd6f1ebf4a2699e1076d4fa","affectsGlobalScope":true,"impliedFormat":1},{"version":"196cb558a13d4533a5163286f30b0509ce0210e4b316c56c38d4c0fd2fb38405","affectsGlobalScope":true,"impliedFormat":1},{"version":"8e7f8264d0fb4c5339605a15daadb037bf238c10b654bb3eee14208f860a32ea","affectsGlobalScope":true,"impliedFormat":1},{"version":"782dec38049b92d4e85c1585fbea5474a219c6984a35b004963b00beb1aab538","affectsGlobalScope":true,"impliedFormat":1},{"version":"170d4db14678c68178ee8a3d5a990d5afb759ecb6ec44dbd885c50f6da6204f6","affectsGlobalScope":true,"impliedFormat":1},{"version":"8a8eb4ebffd85e589a1cc7c178e291626c359543403d58c9cd22b81fab5b1fb9","impliedFormat":1},{"version":"0ff1b165090b491f5e1407ae680b9a0bc3806dc56827ec85f93c57390491e732","impliedFormat":1},{"version":"42c169fb8c2d42f4f668c624a9a11e719d5d07dacbebb63cbcf7ef365b0a75b3","impliedFormat":1},{"version":"ea72cc9550b89d2fd7b8ac2ab4a6ad5b179bf897de7859bba0dc7a934bbca734","impliedFormat":99},{"version":"aa45d08c94931e0b7a9a4c418b33ab895aaf240e192839b36866ad84198c062a","impliedFormat":99},{"version":"dbddbfd48c1d54d619891c895f6e8ff16d30717f4a0952e701387e8040d99f85","impliedFormat":99},{"version":"3361e3db8cb33aa91beaf33b3c79c108f2410e6414498e79d2c7da1838fdfc4d","impliedFormat":99},{"version":"4d54ec33bb701c533741e8abc4233d5f378805166d3a5999d234ae189702d93f","impliedFormat":99},{"version":"f1eed69ccd2798f31d0996306c51d648e19e6e09088f9a7f57c3dcb4367cef51","impliedFormat":99},{"version":"da276fcfe4fb73d74245eee5d1dfb7776bd450d77c591f6e03b54d60be5299b4","impliedFormat":99},{"version":"b402b88cf99c4dc208e5fd337e198e9ee703f48b239dbc8d08ec3b6389e5b55b","impliedFormat":99},{"version":"6f99fbd5ea27a199f84fbc41105525d207d8c6838d62babcbe12e5be0c4a0271","impliedFormat":99},{"version":"528939385e62838eb5631e339475ba93c2ce3ba7e3819cacd42d8ba9adfe5025","impliedFormat":99},{"version":"ef7d56a3fff2aa6476c694027c4844905d40ecc7e8b775dd8743dfd8378353fe","impliedFormat":99},{"version":"3894b5833c452b46d1c59f7d58a8c45e55bcc75a0248af65e1c9c9dd88afeac7","impliedFormat":99},{"version":"1ef2ed1e48da7d651f705bc0131d1028725841d4a97652ef0905367360ba3f73","impliedFormat":99},{"version":"47c221ec0b8802eb5887d6a1be6d7a33ddcd10116185a15c36803e0ae1c0539c","impliedFormat":99},{"version":"0d42fe6c9f1fab8c308ab1ec0ec2ad814a1bd2fb685e2f12cabc0c7732c089b9","impliedFormat":99},{"version":"74967284243720aad05a852617f2891ae384d7a6470c824169a351ad31cab9fb","impliedFormat":99},{"version":"76af14c3cce62da183aaf30375e3a4613109d16c7f16d30702f16d625a95e62c","impliedFormat":99},{"version":"19bc69921209ad7269f886c69e5f812499e133ce318e1aa5d53ac82427c1a477","impliedFormat":99},{"version":"31c17a52735cb1f6cc5a4c452857f568341f95424f07fdb5ee2fbcd6a4a4c094","impliedFormat":99},{"version":"06b419067158787fe33af288531a1df891b452a11e485896bded780b2ef70732","impliedFormat":99},{"version":"44c976b666ef022c74dc1405abb2b167346f9b8ebed3ab4bd9464711c8caa1f5","impliedFormat":99},{"version":"8e52008b516a7a7301f9d43884dc899019695eab471312b72be8a72f89850327","impliedFormat":99},{"version":"f47d865499c8b58d931d7f16e4432c69a3501cb324ead037804e8f292ff195a3","impliedFormat":99},{"version":"1e2f699820214b98d8d16c57137c7adb04b13f3ac573b4f0bbe7b7a601d09495","impliedFormat":99},{"version":"3fc902025baa4cbc0b4648466ac6be6117dc4b0e5b56d245d959839e58fdca8f","impliedFormat":99},{"version":"8ca7d6aee90a5a1d40d356c70c8d5b0ca55ab31a3d17ba73ffb51604674c48f4","impliedFormat":99},{"version":"8de5552b84830fba2143c18d43ebfc3c1289c67402c51a378c32daa7ff7adf32","impliedFormat":99},{"version":"651b59286248bd10267c630f728172866ae427f4036372bcd63f1502532454f8","impliedFormat":99},{"version":"1be150449268e28edc1a1d31acb2b9fa030aee87897a41856d50ddccc124ea53","impliedFormat":99},{"version":"ae0bff9b2245fc399295d0572519a2833ff1a47550b7fdddf96e648eca5271ea","impliedFormat":99},{"version":"0b903757cdc9fe17029ff023c454ae06941499fbf9ae0f733c5e7314555797aa","impliedFormat":99},{"version":"f7ff68ca4ababc2bea9fe21a476be0f6096b8f9f54d34f3408f921850b770e24","impliedFormat":99},{"version":"fa689046e96fc6bd92d2f6edcdb9c0c45efedcfe23443ae1fd4a470bf6e9eda3","impliedFormat":99},{"version":"cb54ec232cad4e0c94cebfd4f560de0907e65c1b55b62a7c1063ab73fe2b014d","impliedFormat":99},{"version":"39f0d3b66804b002c2f462c9ee61bfca709b607559893cccb4ade202f01028d6","impliedFormat":99},{"version":"1f0316a5da01034b17aed99fdd5ec8fe805bb65c5181587c8da353e7c1c31466","impliedFormat":99},{"version":"56442d4cc6dbee39651e056fa1497720913f1f801791b84e50e892cfbe078bd4","impliedFormat":99},{"version":"03cd861598cd715ca2bac8148c04a5f0ed2d21e90bf8db13de771be632f28c66","impliedFormat":99},{"version":"bd1578e4ca78d8de0d3dc05f95d147e45b4dfda47186ce874b3c0d7539e2098f","impliedFormat":99},{"version":"735c117db157cdfd07b4a18b777995e5ce23e535f49cbb12f5fd2c9111c5db18","impliedFormat":99},{"version":"303e57dc66fb6f7e6a79344e5135d48c73ed024cb311d2babf4df5b89fbcf3c8","impliedFormat":99},{"version":"d334f6d54e3907bf5a76f95119c4cc3f91220e96eb113487062d416c3bb70667","impliedFormat":99},{"version":"41178e3f5b546481e0a44eb7aaee78751843dffd525360d953550e8704880445","impliedFormat":99},{"version":"6d0cffb06c980b1ded7ed62302284696b2e9c88ed2608a36acee3ae30cebf88c","impliedFormat":99},{"version":"c57d47d923b6851e8880b395d0935d0b3bccc5c3691e7ce33abb247195b262ba","impliedFormat":99},{"version":"aedbbff1a84bb4cc113b3aa603afd19ea5a53e505744f971b715c412dae0505d","impliedFormat":99},{"version":"e04ad05711a15421294f32c07c87f23a99e792e44a2109700cec6e031038e5a8","impliedFormat":99},{"version":"05b4b78a0fe3f591b9f46700396ec760bf4785c238f8a27cbf78037357615994","impliedFormat":99},{"version":"54469d80797325cac80ddf053a12afe121953b9f327a3865925c1ea5fedc1e04","impliedFormat":99},{"version":"8ac43b3a5564c1b963aa0598ce3fe1d2b5673f220a2d0900a05cc03a2098433c","impliedFormat":99},{"version":"9555fc148c875680bb94cf7afd8c96cb6bd39575833f4d57755a3b8e3639937e","impliedFormat":99},{"version":"2dd5d9fe6995942adf82fff82e624e5aac2965a605587cc777c852981670f7c7","impliedFormat":99},{"version":"09ded16b94109529ea27304a7292084332eea0fec7960361650feaa57f738763","impliedFormat":99},{"version":"89bfc04207450b25e880200f4b1548391b539fc60bc2f2945fc0edfb23e23634","impliedFormat":99},{"version":"7c9600f96f56cb5356fb26046a60d5ea86f4e3a48709d316244395a8ca007029","impliedFormat":99},{"version":"8b10bff76988431e8f68b2a0dbb79df3ee0331753c4fac29b40ab62801f2aa06","impliedFormat":99},{"version":"724ce9a87bbacc89ff4ab317df599f77a55ee6545d76e056d8b36bb55f24c58b","impliedFormat":99},{"version":"79ddbd060c4878d83b491a4f8469794c8184f59ec9d1b022bc5b14c29215f590","impliedFormat":99},{"version":"c80b21e0bc14336675fe80924a468b9ecbda995c0b4705988f53c38dddf41922","impliedFormat":99},{"version":"aefa7fd02617fd165f8f06e921b8c0d8e60867af6634a622ddd017c158c5a505","impliedFormat":99},{"version":"bab81fad10b35ea3ec3886895b7b2e44716d7c73e009b1b3c6aabcff8dd28b42","impliedFormat":99},{"version":"78c2b0c973739c69dc21745ccb2c8dfaabd0bc97f27675a11eec5ddcb44f04e2","impliedFormat":99},{"version":"8883a6e862b5f07b07fccf8a0100ca73d35a2117fa2656d4368fbe089dc45ad5","impliedFormat":99},{"version":"9262edf59574bb4b69221a2289c08e9d8d9b83f51ac9838191dc43c176e26312","impliedFormat":99},{"version":"8f3e70c49f9abb6115f25ad78fc1d65edaa463f2d6d5a5a1554cc83bae5fb284","impliedFormat":99},{"version":"17aa7e05470aee99f362246e3b2fbccb3833d155b103bc85fcf3cd0166e8385d","impliedFormat":99},{"version":"c47eedce9426b4a330be6cc94f31ab0430557bf3d66b2f6fdaa8bc2a9fe3dc63","impliedFormat":99},{"version":"8fc134de25055444c3f7cf24895245a20009342b7d27fefe046a23f06050775d","impliedFormat":99},{"version":"5f291db565a8a521639a3f6414c1d7484b1692ced3fab25d5f6d9c7622412239","impliedFormat":99},{"version":"9d97d4c094e8fb4a39dc3c9c61a5ab3750df7f640f10d7cc1f0cc95254867a46","impliedFormat":99},{"version":"13b381b958471357ea0e5d55331fe8da40ef6dd444c765620f5ac6ed8604fea5","impliedFormat":99},{"version":"c7b04352ef5338a362cb852b254bcef5fd9f299611830722ca96bef2272a727d","impliedFormat":99},{"version":"5b7cc254748cfad68a29f1708899c3c053ab74088d08ab4a55488eb2a2a6ffc3","impliedFormat":99},{"version":"32d7684d69e6fb0d6b0b9526c81791c866e379d890969248ec033b76014e5ae3","impliedFormat":99},{"version":"3004fd440a0ce893bde0047ded249354f17fc5bf5f0e18cb443ad5875ce624af","impliedFormat":99},{"version":"616bd5a947e0f6c9b3b1115ff93e6bf6bde37f0f8874ad22ce1b94972210ecbb","impliedFormat":99},{"version":"e93070a564ab221196230b074e5316c1780fd97e32d134984662d77686a03da0","impliedFormat":99},{"version":"f14fb34a1756869066dcf0101061dc28a3125165a19033870b99da489aef7b8a","impliedFormat":99},{"version":"d8c6ddb39e8570cfe28b4bff78b60c3b0f8989b18f1cff11b65b3bce72cc8b7b","impliedFormat":99},{"version":"bc676aee1c0487b866e6c4879c44b4022726bd4aabdda10d8a869bfff2fc4fd1","impliedFormat":99},{"version":"94fdd74bb75c869bb49cff84e2cc0d96847e54550d07f190e6aa2f66f48df3cd","impliedFormat":99},{"version":"df87131c4e90121f3735d75f8687fd6593a2cf532f584f1c007929b2a30a5f9b","impliedFormat":99},{"version":"ede4c4fa5909299b5ef08f59bdca60f233b267dbd1cba1dad89977aca2d2a832","impliedFormat":99},{"version":"64e5054bb3a621b29863c2af6682d288c14635b2d14ffb5b446a17a63b88dd87","impliedFormat":99},{"version":"bb1fb4df5b57dd20edc2b411f0b0149f15ab5a106cdc8a953b4209f645034785","impliedFormat":99},{"version":"060c85a4fc9199e1f44449c4496e50da8803b007aa3fdd20f2285978060c33c0","impliedFormat":99},{"version":"0acc2626aeba6dec96b73ec578bc3bc823af3fce72c12c5309ac1863604c076b","impliedFormat":99},{"version":"9a761443a08143aab9c4de9693e72f6d8d23247186eb8889bcd10393dc3532c0","impliedFormat":99},{"version":"da1417971dd43589cf2f64e5f39da372a9413bbdaf4fc535b0a3bb132b1657e3","impliedFormat":99},{"version":"8889a09c6af3130c89f3447054fa5460754471e0a1f98a527e71fdfde899cb2f","impliedFormat":99},{"version":"ba77a7192b018f6e461de533baed7b4c7e574d708bb65217c42201c2ed10abfb","impliedFormat":99},{"version":"78ac78b6372510eeba34d59c12baf2f2d3e711b466161dce30d73c935340a8f7","impliedFormat":99},{"version":"a8d4f94ba30bf367db014cbef8d6ece4cb664e69aeba758567acb8c02b0bfe2c","impliedFormat":99},{"version":"8f489b6a9e3d21271875f468482bc0418341e23a0688734c3ee7e6b9ff74d7c4","impliedFormat":99},{"version":"787633e9a13f49fe7403439b33388a99637c899236a6cfbf381a063cdbe92542","impliedFormat":99},{"version":"e78023dc028d670a73c72661acbed753764a505e2f464d9d7e118046508c26bb","impliedFormat":99},{"version":"b0486c6fe4f9e68f2105cabed1c388aaf94c06774305d712013fdb5043e46bb7","impliedFormat":99},{"version":"b617febcd2b87748a5896415458836838cc7a047c9ba3c1f93e145ba972117bc","impliedFormat":99},{"version":"c2ed7a65f90e182168b8946ec12ff5aec58c10e9927b04745875843c0568846f","impliedFormat":99},{"version":"e4813e26203d7c6caee2675461cb8694d0a5a2a692fe955b3becdffb1b229726","impliedFormat":99},{"version":"90740a4740eb94a7cfa4c346de4ce38329d161423444f13d86153ad503571cc8","impliedFormat":99},{"version":"f419f04277f873a6c9cddb78465d66a7fc89453768283bc66610f4d563c1fa16","impliedFormat":99},{"version":"85c11e5e250abb4a591509a61e9db2202e7a186cadbd4184d77357f6d768ed1d","impliedFormat":99},{"version":"5fe57966bc656055ea2e4c1657dcc16edc32a08ef87dc30c09671004bdd4cc14","impliedFormat":99},{"version":"ead716385d47a7d5ee147bd5a7fdc0d156c989b4c8806a76f220649c6accde95","impliedFormat":99},{"version":"bc16ae537239eb39d5020afb0958f401befba9d0aa17bb8f895984c6c688569f","impliedFormat":99},{"version":"e551cfaaa5020ea281dbe01991d644059e60cb22b1dcc9634192db9238542723","impliedFormat":99},{"version":"21fc8b8d6387a8a5cc9e62c31fee3c8da8249fb3bc4a8ba79c5092057c892f7d","impliedFormat":99},{"version":"19082f3df1f25f7fb304a911d1a153c9391f464e3001080a524c995e4028a3c4","impliedFormat":99},{"version":"e0f6aafed1acaba5854688e6fdaf8d124383a9282c111b41e22c63f3eb3634ce","impliedFormat":99},{"version":"6562b25cdd9cf562a6d9c614d6294a5b4a5d53013a337b684198672aaa1d61e7","impliedFormat":99},{"version":"3a99f401d0459a24124f6510c9fd84c3ddc94cc9dda88bc092b2c328a2316f10","impliedFormat":99},{"version":"25f8badc9dcd1b4ed1b670442a5cb3bce3855aa2273600123ca82f7105cbd05f","impliedFormat":99},{"version":"df348ecd79b09037176daee7995ddd749a1862a11ed6ac4b0c8a3e7a27cfad27","impliedFormat":99},{"version":"36b1f70dafde83b308cf0d9605fe43900cd340320a5943c79085e39b7ce9c344","impliedFormat":99},{"version":"d5631a56aeb2279698572bf985113de7e1deee43c56cd9dd85aa2be1a41bb998","impliedFormat":99},{"version":"108a85619ed468d15c2f5ea49aa19be365c18a123d2c096cdb682533cafddee5","impliedFormat":99},{"version":"e8e65217abc06cbbd6f5d331cc2fecc278491350423f03ac47aec6978456716b","impliedFormat":99},{"version":"0ae17e04bf71b5eaa46a509bccf6d58cf793a33e39c27077820fb010d4f9521a","impliedFormat":99},{"version":"60d25f66f4b6ef80e0f66f3b2ffbdc88b9ee98d925838d5964fccaa792bb7bc6","impliedFormat":99},{"version":"fce7a2dfbc5f0e8cc50b843e3b4dc606a98832cd6d4a5ebe6ddd054a92dc2597","impliedFormat":99},{"version":"c30274fdea2366b5a293415a6a09124c85b42cc6c02b8d0fc72af5a05351f55e","impliedFormat":99},{"version":"5dd427cc3c26d8e97c7dc0b287e06297717f7a148829fb7fc5875e93bf40956c","impliedFormat":99},{"version":"3abfe64fea01a095950c9f1782ca2ef01ae5391fe5b7fe6443222e5a6adc5d08","impliedFormat":99},{"version":"17a168032c270ec761481e277ac16efeac6530b01870720c17ea6649c9db518b","impliedFormat":99},{"version":"b9e54097ce2e07b1911e42f1c578d9304ca3e2c824f989759bc2199d54e4db0a","impliedFormat":99},{"version":"52256083681cca90fcbf3796937308d94e1c8e3ced04a7974b49ec4209f2ab4f","impliedFormat":99},{"version":"7086e03c6bbd58177835da26104c3124e985afbd9a91b3a148e0cb88fbadcbf0","impliedFormat":99},{"version":"d46dc9978eefe051bc8f6679dc6b6a8be7594247effd2563ac488afee31ce9c7","impliedFormat":99},{"version":"2baba9d417f5388ecf1f2b1a9a58a4b6d4ed7df15509d60de9d7caf1f0043ba1","impliedFormat":99},{"version":"fa412c9f26d7be8ccbbd56ab3f1fad78eb9cf87af63fd8c6fb29dd0450b47622","impliedFormat":99},{"version":"4da7dcbb288a72cb7488728930efa47e46fb3dc042f25aa7d50468f0949bd1a0","impliedFormat":99},{"version":"b0b15e47e8d7e2875b28284ea08678baf6f4dcd420241046fc91743c905d0947","impliedFormat":99},{"version":"7eef51f067c640ef085973e8e13608a0b91c912297514e3264fa6596f328c9fe","impliedFormat":99},{"version":"4afc590f38f8051eec35231e6946ecf2151d7a23ad4e138047b01c800d94d9d0","impliedFormat":99},{"version":"4c42c37e1f02b327024ecb1edf1b5a12e4d45092bc51b405985a791ce32598e0","impliedFormat":99},{"version":"8adbcb728b2d3bd8282e1a657a45f6f9103a7eb43f6fbe36c554bfef17df9656","impliedFormat":99},{"version":"ae061bc7af2f9ea15a742b07e471c27fc4d82e2b940509f9e7da3f129595e03e","impliedFormat":99},{"version":"d15f78dca6c2afbdd2596cb17983fc60a79d95dc0142408d224d671f8b6564dc","impliedFormat":99},{"version":"2307f448951cae8a6b9bf7b09c114369e42d590c53fb99c99fb1cc34ead0f0dc","impliedFormat":99},{"version":"71ceec981852d2a8b0fb281799199344a6ec90aa55e13302916f38b48debd10a","impliedFormat":99},{"version":"5c943d5009f2f31841d04d8ba9e853a13201a9e81fb96234c90191f00a50a713","impliedFormat":99},{"version":"cf7f50328f9916c083247e28d938b986a9d9fd60ba956a90ce540ff676e3deff","impliedFormat":99},{"version":"9005e5cc014620c428d72c3333d6430f4be9ab113c7c41400ea4babe458907fb","impliedFormat":99},{"version":"5040c1eb043d900faf3cbc181831b7aefda2fa75bc08cac59897baefe2666e43","impliedFormat":99},{"version":"83e5ae91867c4b4d94ef5c43b9652401642b80f3a4b86af579390dc2fa97ed10","impliedFormat":99},{"version":"b87b16115bb301284968c766678ee98ab1c2276f1bc4e437945db172718a22b3","impliedFormat":99},{"version":"ec78470f53dc3905513b87992cae127a1d5b793ea42cd48c8ff809ebf576f19a","impliedFormat":99},{"version":"a22df7d38217bf9917cd51c7df7da7965d6a5f57b56b5e612f48ecb34a693c1e","impliedFormat":99},{"version":"df740e512060283334dc9f4d608bb7ddf9097b6e1613dd2b3145d1455bc4f73d","impliedFormat":99},{"version":"b7eea3116456adebb14baa549db35cd82759bdf2f5b161e8ba12768e634b10e8","impliedFormat":99},{"version":"930612d51e2a0cb1402f15a758d8bd025ee29b4c47a13d038faa3fc8ee16e3ba","impliedFormat":99},{"version":"da4d4b60a3c4a12f155b1ca908ff6500c81262168dd39bf6b7f2a632661beb4a","impliedFormat":99},{"version":"1c7a163091d67b9af010e10f5c43ceccde78320486d2901053b4d5af2b751b2a","impliedFormat":99},{"version":"6fb3541ebbb5e2a930fea38603d4c0cbfb4dfbbb7df8999396a8a90939131ef1","impliedFormat":99},{"version":"545dc958d8101a8e3c9932370a7b6c2f8599df0cd53449114fadd7f59fa9d6f6","impliedFormat":99},{"version":"cc8b39d1f46ad8e39ebbc27d5664594a82625199459a9ddbe54ef17b4239ce24","impliedFormat":99},{"version":"08c3b01490d49ce93d06bcb7593ef9ad02dc2d91cd583eb9cd0f3d2fa75e440a","impliedFormat":99},{"version":"6ba19623201e7dda0bda2eb91bc7d1ee6ed719be167f999564a42ad8535e2f9b","impliedFormat":99},{"version":"482f77de2d4972e66c7c6a3aa53b524e20eca97cdaa3220cd2ab7acd3a7a54f3","impliedFormat":99},{"version":"634708acac0aa7d170f03a37a9d8cf6a9febefad220477649f6ec3e1ac1f7adc","impliedFormat":99},{"version":"89b2f499dba3c24fdb44acef871860328553cc46a4802874e17de01d530056f8","impliedFormat":99},{"version":"0288e5f29c1d2b678afce4d682a7ce94c323b86c479f28a4a33928261a5fe4ef","impliedFormat":99},{"version":"4e0c84783c17101df536fa4018dad2c210ba3a41daca0c1df4957f7e8dbabbaf","impliedFormat":99},{"version":"bf17c4d237818052f7f3bdd00fa2433e5ee151e1dbbaa1700edd2d229bacfb03","impliedFormat":99},{"version":"862052995b61cdf46e9fdf9b83acb076975dcfe2f44e45c07b23ffa70f9dde0a","impliedFormat":99},{"version":"8a85e856fe6d7a45e4acac5406bf440ec274ac46171d08567d38a7ff36796c3b","impliedFormat":99},{"version":"b48976ad99fc88001f7c2757d84a6bcc5e8830f7e95fb3c73d774e7710b51aa0","impliedFormat":99},{"version":"40ec8dd574cfdd80de30ba61a0dda32c83d6b60b783ddd5c9afe21187a8b0353","impliedFormat":99},{"version":"4ef67ffb70b66a188eb391c50965ce59a997e5995a060cb0eb803e7937f80cc1","impliedFormat":99},{"version":"bd3f53621504b6b6fb460130652d71bedc7b48c4fe26e81a62f9976de519700a","impliedFormat":99},{"version":"1a94fffe1807952952587e8d392df98582a90f034abdce57217cdf8409a0a16d","impliedFormat":99},{"version":"b7b4608cddbb582012556d2016b1704bb77c9b320770cbde8b98ebbaccdc6056","impliedFormat":99},{"version":"7ff126c2720906e2edc4917be8a00ff52597dd050a0ba8deb82ae1dfff440432","impliedFormat":99},{"version":"53aaccfcf252817f557afc4e9aa18084dcc90e5c096411b9f60b6b7de4fcc41c","impliedFormat":99},{"version":"a7f0bf6a7172f6c4a33877693190c8dca6b5ca0bf0deb5130bfad368b61e16c8","impliedFormat":99},{"version":"fe428bc5c0d6ce416defb7a7e67fa6a10b182b7ee2c16b42419f9538cac0fe10","impliedFormat":99},{"version":"5f19171239190089286ae47ff6d0c9d6fd2b29342dfd0acf6cc6f66f9d1bb4d5","impliedFormat":99},{"version":"d2a502e2c30b775339bfea8c1d51d3dd5244980a3cd5063ba12227cfe03fef44","impliedFormat":99},{"version":"a64913d689476c4743b020c801672718d1a736ab243907396312b832b65cbdc4","impliedFormat":99},{"version":"2d7bd36015925a348793ebfbc2e2a1fbd390bf335be8b9ec780696ed6dde26d4","impliedFormat":99},{"version":"336e86ff9f1abe22105776c7e757e9580446aac47cf8429ca78e6ce980f284e9","impliedFormat":99},{"version":"1416b07f727c918e532f4134a45e3b07b0a116d9def6d9d347a00c50dc01060e","impliedFormat":99},{"version":"a44330e93e4a7f8759a73736215eef4590b74b3421d955d980ba3db8e6b5a7fe","impliedFormat":99},{"version":"ac84b7a6fdece6cbb0ee141a09b505890c3f11c83446f6304ab9d8e972eee60b","impliedFormat":99},{"version":"97ce0d7c831f1fa7934651c878f1af14090ba5d9ee471db035f465a7dc113202","impliedFormat":99},{"version":"cbcc2f6b5fa06c91e2a35cec35066fd14dacccf185dc8c64c5143381bc2d4b30","impliedFormat":99},{"version":"02bfa3730c6288cac5928a0fb08f01f8c236992b0ef57806c478f0f7bdb6eb83","impliedFormat":99},{"version":"5af40b9066886960f300ad8efd6dd8f77eddeb475903989841cf0385a1edf4c7","impliedFormat":99},{"version":"09d52052be4f3e0f4c8fd5d4954cb215a96e20bf6fade80f95706fbdd5cee318","impliedFormat":99},{"version":"f61822dc28d52652fd897fa846364a0c6e2f9d18c4488c104f4887b4627b3fb4","impliedFormat":99},{"version":"55a4f8c04961c6cb99a6d2c79a375e4ef107339c3ccfabd8d986f2a177dface2","impliedFormat":99},{"version":"a5433e2b1359ac2672f3dd287d58e0733fe778ef7dd71a4f913b01e794104119","impliedFormat":99},{"version":"19d3750d9f8f570936cea4be2a6feac27e1cb88391d7c54e3209f479019c1bb1","impliedFormat":99},{"version":"acc3dd66b849dbe92d07581baef23754c6bd3d4cc453d6d8f5d52e261304a3bc","impliedFormat":99},{"version":"e4813e26203d7c6caee2675461cb8694d0a5a2a692fe955b3becdffb1b229726","impliedFormat":99},{"version":"63e92d208753fa0737072880b8ebfc8a054b8bd4c7af89b620605b7438d7a9d7","signature":"0c1a5de0fe6a22e6065eea7dcbb344229ab4e0f07e5f92f14a9db66cf751df8d"},{"version":"1c1daf58c1c6dd6a31251c58281451563d72fef70981c26f088c175ac531bb1b","signature":"fc1a017c014bc3d02e347c6c45cbb9b2f446bcbddf1444be8885635ce9c10d55"},{"version":"cbd765214348178d45423a3d2b490ecc208c1b14161bcee412e1c675fe8f85f1","signature":"201d60dd52e618046236c6d3fcbc68b5cc0265267c6e3cf680f414666b21ab44"},{"version":"0f4d743600482c51737fda2a6595aac1673da0d2bc468bef49352d3892f9745b","signature":"f4ffdeecb5c6637cebbd072c6b157c4ddebb2de8738d7be1e5456b34bdb5e3dc"},{"version":"dd56a5146cceacc25f0da3ed5210792064e755be6b670f7c9ba0aa82a329dbed","signature":"f5086f68cea44c2b66d7bad5000fcfdbcc08d5fd0ad46461376023d966d04e23"},{"version":"077cddec2a22d3eb1ecb4455d5b488d84270858537e795ac0c51d37e3b8f4cf3","signature":"62c681fe11c849a28fd2ec36e7dd717a90b3892de59b68123594fdfa0b2f7ab0"},{"version":"959734acd7d29267ec7e15a4975ac091e0e806c65fe3367c19c791412720bd99","signature":"fb151c164a917f6ada3b9783fbee8518a8ea80695189b66920aa777aa76419af"},{"version":"b06d9380eb2fb5c35f16d03445b1963e8fef5647c592642f5d8dfbb11cebc1d0","impliedFormat":99},{"version":"33e160560eddf2de63ec16a76b8c1d91cba0f5906ff2f29819e07521d6382f6c","impliedFormat":99},{"version":"c35a50ae47731c15c54b6f359590d24776fdd74374bc85031afb800212181af0","impliedFormat":99},{"version":"f34a1a6965c0bbfa374873432849ec319413414ec186261e97ea70d5dc4d4654","impliedFormat":99},{"version":"a3f4b311af4127148f5dbb1a1ea80468a20725f10ae78001a8dada6e4a618696","impliedFormat":99},{"version":"790d03a802369d9a8ff78db3ece0cab418ec75a120dd5ab9aaeeb1c534493d3a","impliedFormat":99},{"version":"2aba871159bc6021308c5f1d05d7917e0c896c7436dcc3619038f381859fbd68","impliedFormat":99},{"version":"adaa0d941bbf9d3f11262c3739579aef70fea7af193718f8fd67e10a771fff8b","impliedFormat":99},{"version":"f178ad620e827581f2baf23c9c7fabb77d36ead92c15e149012934a30151dcf3","impliedFormat":99},{"version":"ef73187b0072b9b148b03acb62dd12615d704589772ce88e2e2e1bbf0255c802","impliedFormat":99},{"version":"417f252d9e1048c6b47d8a8a5a8e7ff5e9a4de37d6d3468152f2e8eb35b88c29","impliedFormat":99},{"version":"f3b2ef02288170cb72b7d412a7cc67dfd85dd24c168b78b77554f1ec515b5701","impliedFormat":99},{"version":"590460ef9a2cf9ab9e34504aba42d6daffe4ff7c347ded7bd8d9a989e0920c3b","impliedFormat":99},{"version":"da45f9cde46eaf3ef2d3135b5354bd3739897d72b406e0f0ec1f5455108580a1","impliedFormat":99},{"version":"cdfaab58a31962eb873192959e14bca891669fa0edfd469c9c35babc36e490a3","impliedFormat":99},{"version":"206d171772d21c82353069668d680a40df7489bde0446fb70f378256ad9d33ff","impliedFormat":99},{"version":"b6104978f6a9921d214c58df950900dc2a9319815a843d354881fd1bad7e62f0","impliedFormat":99},{"version":"1202e02184a9fcfafad7333bfac2da836eaff83653845e00c9495d9c82c9f635","impliedFormat":99},{"version":"6899200d51b7d7491d15521da878142c5fe50d711afe22e60e359f6db6c98088","impliedFormat":99},{"version":"c5e79b84695297cc596924039842c2ab7821470f1c97c4b1aa9d6a7f5f2d2e3f","impliedFormat":99},{"version":"630927db336d1990af0f696dec46f8844c44c507e3a72069f50754541dfcdf5b","impliedFormat":99},{"version":"b4e7867fcdc8d3c7a23b45cd2d705d2dc576a7f7a70156b17aadd7e01f334315","impliedFormat":99},{"version":"c89ac8740afdfc27b2166cad337e716fe843eba690167cbec823bd689f613e6b","impliedFormat":99},{"version":"23c280c11bce285e8f022b0009e083a1bdfc3839f348a38df9dde0c3c571820c","impliedFormat":99},{"version":"dd5be7220598df4a07b6281e01170d0dad5fcd74bcd27daad19619b1fdacc6e0","impliedFormat":99},{"version":"c526474a2770a981d08d9f00644e2a390475b0f9910888d426a6b2e6686b77ec","impliedFormat":99},{"version":"d5cd7c1300ee1f45cc7ef5afef746a1a34c701b94958532a88d265a9f0068063","impliedFormat":99},{"version":"a01c5aaacdd5362cda056105f2acea8b8c4699ce28ccfe641399dd0b49239419","impliedFormat":99},{"version":"6ca50db42bff8c322c4a7449cb09545ff575a1c4bd4fe6d32a9adb563f3fac2b","impliedFormat":99},{"version":"2a45ce8c09f2f343ac47fede405b833cd0ccb325f9b313fd2febfff8ccebd8bd","impliedFormat":99},{"version":"c67e3783cb681d6277dec8ada124cea535c8c7f4d99f5d6f0fed69bca38f3807","impliedFormat":99},{"version":"76ff4e5304fd22a8ebe6cb01ca297feaa0dbe14988ff43746345b55ab3504e19","impliedFormat":99},{"version":"361cb330385d846fbabf3d4db59be3655d45d7c76a483a03c71b0082014f4e9d","impliedFormat":99},{"version":"43b526d382577c18840fb6c10030753b82eb60a377c50233959437dc6493b047","impliedFormat":99},{"version":"7529eb5b698818410c1858e22ddd689fc3fb6f86d54af06872e40423574d15ab","impliedFormat":99},{"version":"3ee6957c2293a69d9f7ff232da8425d396e3115e9ba261a3e532d350e2bebdb0","impliedFormat":99},{"version":"6f70230fab4be1aebb2ef95828669b89dda35280965c55ce88aecaf94848f036","impliedFormat":99},{"version":"8d87cfe48ed90323bac6da16f46aff7fa293e32057cee38d14aab11e9f66e4c5","impliedFormat":99},{"version":"eaa88006a1ba314595330bf47f08eb4a468e7764a1060d6e133183aed7babe13","impliedFormat":99},{"version":"0645cd3e93a26c8a7c16595dc63a169d137f6b58bf50cca98449ea23b333475f","impliedFormat":99},{"version":"1586cdd29126d1a54dee78b46eae7b26c7d473bfd7eaa8bbfc5bf2a76946c545","impliedFormat":99},{"version":"accf489fbfb2dac5d38e71b2fe81687fd44d64b21b5631f6084b9acff57b4d48","impliedFormat":99},{"version":"0c5390e201ce2722d720a82c2105e07606576903e599ed3af15fb8e4e45ea2f4","impliedFormat":99},{"version":"b556cdad15c625405519814fac6ef355484a25c1cc9344e6e5dc110d57a8cdff","impliedFormat":99},{"version":"3e810c39b288e419bc933c293cf5703b948b73bbf07050527c9d73f7107c0c4e","impliedFormat":99},{"version":"9278bac0ed6d0d99fcee6f0f217399ec12edc1d10a9b3c0873c7b97a25223384","impliedFormat":99},{"version":"6f3dccb219fdfb3816c02e9a99d959c853c855c7b7beadecd3a3d3b0a374d953","impliedFormat":99},{"version":"2eeaf63552fd9c5d3ab821464d8f4a5db0de7132331acafafce577f58d871a39","impliedFormat":99},{"version":"9025d4254c18b31d9220e4d33dad5035507ee1e863d1858891e56ffe0eb2ff13","impliedFormat":99},{"version":"001a2571401e839a4b68cec0af11c6188f766ebba01cc1e1895027e3d35030b1","impliedFormat":99},{"version":"846715a4679c9be48434e2b6dfcc466588301a733f51ba0ea15e348fc7312528","impliedFormat":99},{"version":"0b77894d2bbddb9024a230e9d00eb9df633c8d190887f92959d9683a81286c39","impliedFormat":99},{"version":"fe438b40de8ec7fb4a1734f8a3c8315aafcc90dcd15512484e7dcafac310e856","impliedFormat":99},{"version":"96d53f66b4fa3ab1ef688b676450895730863e298e62dc6bc051442195aa1a5f","impliedFormat":99},{"version":"877f538909bb2120565ca0c39e93341e5a4a737bc5fda014c5148c3676fec8df","impliedFormat":99},{"version":"fba10fca31d18ed5fafacb21e2ed389ae5b347b552c5b7a69023a563e27fdf5d","impliedFormat":99},{"version":"600beaefece9011d792a4e165db46b9de5563e025e941aebd069b95cb30e7af5","impliedFormat":99},{"version":"bdc387fdccb98bd48da4cd4cbc8f29342586c2f8ac7215396547442c3b0ff8be","impliedFormat":99},{"version":"7ed291bf246832b2745528de9e68b2bd3e2fe7cdf32631665a326740c3905836","impliedFormat":99},{"version":"e61bc77843da1980c2b6851df589e730bbbdada172986ecb47101974f44aeb5a","impliedFormat":99},{"version":"00d79566e3d5682a968b44aed9eba1557b1f62c884546fee2bca88be8c477104","impliedFormat":99},{"version":"f82d26f23d5e3093ca86458544b54befaf0957a5535149f673976187a60f9e6b","impliedFormat":99},{"version":"9f0d621f43198d0db510779ba65ca3d1a8fbca37f408efa5e25ac5ca01f74875","impliedFormat":99},{"version":"9bc53a206914661c0f98bb869eeda7214778367683a5e3e0fe7c6eaa6c474556","impliedFormat":99},{"version":"71987002d6409ea81e705fbfb97afc644851c16d9fbb5e90fcb3bc3e00e4ac5d","impliedFormat":99},{"version":"70e86eda2938040292fac398debcbe47114a3b9bd6eb8f632a89dcd23ac0e2f0","impliedFormat":99},{"version":"6241345f59b24be6e85c159db51cfd937f853aa8020b38b2aac5345813b25a8d","impliedFormat":99},{"version":"583eb3b56fc84b730641e623070f6eefa3fbacae4e15a6a3f19e1b09c81a7685","impliedFormat":99},{"version":"1c96afc9b678d9f15ec1b045864ea6cff25c134fd594cdddd42d66d99c8663b5","impliedFormat":99},{"version":"cd37c2470a4ac1ad7e1bdbd29bc8953589a4da6a7326a3bfd885bb7b220ffcde","impliedFormat":99},{"version":"ce82368397e5c926481222b9adb2547e4f9e0206982ac71c301284d107e77ebb","impliedFormat":99},{"version":"602a7beeec46d5f481d8f017adc1e01314101dea37f8f9ba3debcf88c83a44d5","impliedFormat":99},{"version":"d4e62d466b6302ad6419cf38669dda1eabe141200b15928a120ec32423904fdb","impliedFormat":99},{"version":"7baac7cf35ef7ef1b049fdfaa215f66891fd677bd617ec7e9a89ca9d430406d1","impliedFormat":99},{"version":"7869a702c21d4fe08180df0919c6365d4662cbdd9e0cbfd17bae7222d10fae58","impliedFormat":99},{"version":"e2944368a3fc08ea1ecde61384f2aea35d8551f02e20373f26f19a1e15f33c01","impliedFormat":99},{"version":"1e13585db16f3406755c1f7a3b32a2003d0b04f83df215fafae61c665de938a1","impliedFormat":99},{"version":"5dbbbf480819904753f84c454eba9bebc455b19966195e97f6b365e7cdcae4b6","impliedFormat":99},{"version":"a96af1a20dbd8aeffb9dc6c2461c7d9d131979390a8b41ca6975f652e2a897a4","impliedFormat":99},{"version":"46f1bf29bd4165fe2bff54eecd23a31f45b1432ab50ba3a0304100697dce91b0","impliedFormat":99},{"version":"1b5cbd26dd659f174a672c6d81b3088c9f46ae0dfd160ce93d2afad5bb7151a6","impliedFormat":99},{"version":"261790ad96cccfe94b94e4825a11a719210f9251d430e05829ed4f0b3d90fe48","impliedFormat":99},{"version":"55eca0dcf8f3192e5906e73aa8c7b88d898b1351bba84c69f4c5c38ab4e43f6f","impliedFormat":99},{"version":"686832a82159a4ea4dd25329c3a99c0a94d9b2a83e7b4ceeb6dfa58bd6707aa6","impliedFormat":99},{"version":"ac339c5b90464b77c2f28dcc686944c9d084f62e680960619f6832471da398ef","impliedFormat":99},{"version":"5090c4c9eb11d488fe455e985891f55e90d65365933d5797b30c188fdbe8015c","impliedFormat":99},{"version":"959c4529d03aebf8f76af7e58797800a25a6a14f560228a69235edcac4e8bfde","impliedFormat":99},{"version":"e893479eb9d99a9c479248a70650f43d3630614ccd0ef07352e208a23988f7cd","impliedFormat":99},{"version":"04d51092411e37e0df07828195cf9e0462861523461eba25eb9dc52344ead7d6","impliedFormat":99},{"version":"a2bf25976a0749263db4e003c2db061217b6e63aaa674f3f2e9dbaeb75f0cf87","impliedFormat":99},{"version":"92bf26f78ac596c9f643b340974854edb633f4719c7d9ad812367883e90272b0","impliedFormat":99},{"version":"afc885e843cf91a18e1c9b674d958c5c71ad3b8d2c9762c6983025d4a30d0918","impliedFormat":99},{"version":"01ff8948288663a825d5d4b5a48fc4dd54adfd4136c00c11d2a01eaf19084340","impliedFormat":99},{"version":"fc61c6168137297ec33f5720835a8f1e7fc424b00e0faab2d24e980dd0bd03c2","impliedFormat":99},{"version":"0b1cdbb2aef2c6ce308de85e80148059f7e16bf727eb3830a2e3e744c4aba6ad","impliedFormat":99},{"version":"1568200178c3ffe44819798eab91cbede3b302ff487149b18aa814a9410645c9","impliedFormat":99},{"version":"3ccf7553bce15ff3fd0b3a0cf4ee9177e9835577aeaeff17c1c6e04a5fa60b4b","impliedFormat":99},{"version":"44182cb6be79f471d6c4a40937a8d6d183af1a87cb26a3bad310c613d006351e","impliedFormat":99},{"version":"261e48dbb899ec4e2de4b9a72b8127a3314d28828b357288bcdebf39be32c126","impliedFormat":99},{"version":"80b3a4c879b86f31611611d628c61546a3924a17609d2abce5af75ab1526bd17","impliedFormat":99},{"version":"69260d8b8cd174b1fa69eb05cad51051da0cb9bad809cf391c1d8234d4b403a6","impliedFormat":99},{"version":"79992568ff244f34b7112942a3d52eb9375885d7e1d8099fc1a17552d14c6fe5","impliedFormat":99},{"version":"dde1fa7a49e820b8801d01bfe9e9b7829d9c62e8eb82a29ef2c28f239aadb5f2","impliedFormat":99},{"version":"e0cd63cf24da521cea60545e5573cbd7eb13d024cca52cc342032e2db987e7b0","impliedFormat":99},{"version":"b1c80011f3a457bbf2e1dec4b6016e63121e60de3b4ff805f261f69016aeada5","impliedFormat":99},{"version":"0bc0511027cff18f7025fdb354850e43083e16d2af2a48da869e095b8df05616","impliedFormat":99},{"version":"70aa4b70c1ebd45e76e4dc63b414d0a7e12fd41ed860da7d9e42737e2a11559b","impliedFormat":99},{"version":"7602bb9744aa13918f0dc9713e4a84e9e97cb099317eaf164c042a636311963d","impliedFormat":99},{"version":"de557ce115571688c6a8dbd486281e4d5a8068ba9c8339ab483014d4aee792a0","impliedFormat":99},{"version":"d942ff22d0bd25a2f26c50d2cc59d6cde2bf7a6cd428e3dd26356033015391ad","impliedFormat":99},{"version":"06e3997ff9c559d21c94113cb949cd03bc44f16cd77c2d7bd42f85c9be29a70f","impliedFormat":99},{"version":"f0029f53c3acc648f4215bc446cd60d92e8c29a8e73cd4008c1e1b37f91eb811","impliedFormat":99},{"version":"b59791581c6df3f62a81a0e96fb3e833a2f5b36304bcb074d765fd79d2fba320","impliedFormat":99},{"version":"627109c27f42261a2148c5758e5529e0694e09ffb74c2cb20e86a7a3682134c5","impliedFormat":99},{"version":"233ab9a64155ad15a070b03a52f8192ace79a29c03a9d4f7cea88929afeb1d45","impliedFormat":99},{"version":"fa7781b202e5845b1609eb84653dfc54189ce4e891909259a9aea73cba9859e9","impliedFormat":99},{"version":"a54b716354950f63c6e8ad298bdc90f94dab416eaecb3d32e9c6dd1bccc79eb0","impliedFormat":99},{"version":"38e6306d5a856a848f6737da319f79b703006b16ced089b2c4e80d04efa58adf","impliedFormat":99},{"version":"0f1434bb4e24cb50e9e73f0144414af44c1610514cb1ba0665936fb4993a3db3","impliedFormat":99},{"version":"1f15564e79f492da5842d1fd5f29cae75d37737e5abb4690b3b4bb9e7e856f3b","impliedFormat":99},{"version":"91d60e5b5441b738133c095fa2d6a809a3c3c4b75556d7f13cc19df48e20de12","impliedFormat":99},{"version":"6beeccd58698b2f72df8cff766e658f4adf98ef39ce1402799d4c18db1b2d803","impliedFormat":99},{"version":"980b920f853e57fd46983d0f5a2e7164f2d2e9dac780aa04d4325aa235c0a75e","impliedFormat":99},{"version":"3a39f3263b853937eca381775fb7558b4867a2714a89d770ea98c30dd1fadaa7","impliedFormat":99},{"version":"ced0b20e13a057c20d802a11870ff310579c6e80a5e5e45166de9e5f0e88f8d3","impliedFormat":99},{"version":"62f73fab1b97e50ee8092499cd5a8b5085abf700b372c24aa53e1879a3d68979","impliedFormat":99},{"version":"a393c298d0678e3e0b610c1069e3721de31dcdf1f885d6ecd813b837330156aa","impliedFormat":99},{"version":"e4784320828932df26b306ec4839c8f9496b959173179a29b29163efe301a7b6","impliedFormat":99},{"version":"5dbb45a20780dd90e28869e05035e681c90afa007364f01c3c3cf14c4cc04467","impliedFormat":99},{"version":"c9e1e15b8ab027dbbe4a2d85c0669905497e0d55a09c702f06c79e57645e347b","impliedFormat":99},{"version":"4078ccf4490cf97463a7ff2f9e02ff30a36ed2e4b18e8566445838d0d4d603a3","impliedFormat":99},{"version":"727d10cd972ba9b52da4defa702f65739323f9ff9949a7e9c7bd55fa76c37ac5","impliedFormat":99},{"version":"9420bd92184bda15c9a04daf532afae98df4fbbb17a930983ca664e929fe6c6a","impliedFormat":99},{"version":"684ad94c713c5f22951e9f433d52786c8508447510005459b6d9764c75cd2c74","impliedFormat":99},{"version":"3e00971f3dcbbe00de774d5387485454c98b8873bb636b8e6bcd4d9915ee0a2d","impliedFormat":99},{"version":"931674e02ae4a041ad822756dd4dbd30236bb3b52e21201aabe678b734baedbf","impliedFormat":99},{"version":"940961ea4bd1da98cef1edca26d6380eeb0c3e06df2e9d7a29dcb57303fb0326","impliedFormat":99},{"version":"581f0278df053736226f58d9a4671e2bdba6508f8be23751247c846e82736a0a","impliedFormat":99},{"version":"ff7eebe9610f96732e29782294ee55529ca5ff804e2325ba992cab0c2ca4c05f","impliedFormat":99},{"version":"e0138d7c2408df5bcc623e3e3b496ffbc405421c7dd7ae6ecf897a657926e2c4","impliedFormat":99},{"version":"18bbffdecf7eed3cefa4a37f34dc879050e629231ba0bd011e2ec6f7503a6cfa","impliedFormat":99},{"version":"fd2e67b97e27962b7c2a6083a2ebf936e7dc2b2335286df2ef5cfc09eb8522b9","impliedFormat":99},{"version":"2e1ccba239f8919e62f83719bc95b4d47b1d1e0187cc6968b5481c86dbbffe3c","impliedFormat":99},{"version":"983bd1482518c10b3e7549f6fe3f51cb7b9868f38ea715cc0c19c8ad6c5c34ca","impliedFormat":99},{"version":"728cf2a025de44eb3e43b3e87d9c8bb2feafe8a34de5ba9b2158317b265125f0","impliedFormat":99},{"version":"54977f121205ea7c7a6c86b42d813dc55d7db6e69c9554a262fc64cae0c7eacf","impliedFormat":99},{"version":"2f94e898529d71f48c841206140ac13988a5ab275bddf852922ad75b7021537d","impliedFormat":99},{"version":"d27f8ee9a610635b566109a359d00923f7e8f286ab7936894671c39a006e8b1a","impliedFormat":99},{"version":"5822d798e08ca6c321c2e5deb337e3b6d6472f2133440c4a2468f0ddee71ab75","signature":"f3688333654359ade219d4e94fb2a91f12339e46c19e03e451714a21e577435c"},{"version":"8db3f96517a120bade1643b55b24ed75a18970f4d38221402d9eccdbb5106fdb","signature":"f9a16b54b8913022325e94f69c48805664e20b6556089e3f3506306b97fe129e"},{"version":"e34e93f5498ed7bc9c53a9ee97d679f90fb941b9ab4190b5ba0747184ef12ad3","signature":"6411762007a15dd690acee3a833c9d06863ca69119d48bca9527fe1f81789e17"},{"version":"826dbed35d26577d6f4b5e24f43c7872739c3f2e2710c611bd916c71e7ead76c","signature":"0fce6ce21d226f06ee4ec92d02505e204c3923a1142ca5f35b337057129b8945"},{"version":"188689411ae7835d75f866021a4ee438a20786cf2b2713ddc5ea50da56e8dcb1","signature":"77686fe8104e5c58fe273a2e8d3e7b423f26cd950395ddf4f453921c66060073"},{"version":"cecf275eda8f9503ed2596ae41c9af7bf59d56ab70f57dcd65ebfcbbb876a1c5","signature":"a0cee837e5373cf7095c21e187a4580b8216a64ecd64aa80d19a6967e6d1bb59"},{"version":"e7434e5f90aaa3c85f4658f7e3d3dbe8fc90d286ec4338c282f90d3a6bda0e60","signature":"006d76e50e7f1e25a37da6d436aad571aeb2d646c47f833f9bff146080c9605d"},{"version":"f5c96a4ee0e61f5664d81620d619f5db8aee48c11dd320d767701570438cf0f4","signature":"52a7d02b1fe8db0b42f5259d721b5c7f6bea6d862b8c5ba4331b7169d058305f"},{"version":"bbf69504a153645773109c5955c205947bab3599ee4040e23435f29b528f3b79","signature":"652b463ed1eaf99f278d254973cffb72ea7ef2e76ed166857abe2161fc04d04c"},{"version":"0dac072a14e3269d00b11eae5125b109761eb554887e30a44cc32d669643372d","signature":"ce9182df67b7ff5fd39e4b85aa35925a415d42f479d042c6798ab79a302fc3da"},{"version":"3efdcb8d23bbac7462611f4c50817e856d8e705886412a99c6c60e5fd56578db","signature":"16e36f8bdc965f654e88ae74de905ed84df7bc77cd00bf8f1cee2a20a5a77783"},{"version":"55f15686670e197a8ead330f882ab203109f0386b928bd9b19d1d7291f0f22aa","signature":"cafc2d90a1946bf6b9447683f11a384aeca03cb10c38b8945e4ceb287f8a97fb"},{"version":"695ec5bc819d592000baba9c4e6b34770a1853a60eb27ea02582412698db23f4","signature":"a15b80466a1f3ed8be589bff280561373c2b0dfa7b22f14ce7dbdd0b0d64ec49"},{"version":"64e4a36aabd778ea468c12dba55fb5990d2c711b295f1b580c6c859e667492d0","signature":"404049eff8654148369e62fb3e430ac039e762b0f5e25f1aeec5b5c35499710e"},{"version":"002a6f95435929fb339cf9495f6faecc314a30fc0b434f08b7ece78e5152339f","signature":"b46a7be2bec9c094170bd64ff5e51062de78828862893ccb070c57c58948abf4"},{"version":"f6cd17ae210c40fb0bd4105e9053842942956a8434d55755f1630313c71f658d","signature":"b0f87819f7baf6659bf4531fcf0687f9333c26d56bf86c00a5162165d68a2aeb"},{"version":"9628ac25df4cabcb3d7510fb0c46609851fd475327917bbedcd2b4f258657212","signature":"a0ad37ab2c1f847fe8bb1e9bdfef18ee4719429f1ed808f8aa543d363f23069a"},{"version":"fb7a0827a700b2998bc668b649c22d0cb606ff9557b0990672449e9f518fda72","signature":"e034180f88ee9195af896f639e7cee117b277e3b765995424f8991b3f6b4dda2"},{"version":"d6bc387f53aaf1f3d8cb4c5ea4e4c84865e4fa26d42472ee446bac50e0f7125b","signature":"b871a827a3198ec8b0e0281e1a5dad54d3a3cd2b319f4fd162d55c35833d91f8"},{"version":"ab596340e3c0d463ad4207a8c70118746d30d011de74dc13cd576754169b3b8f","signature":"842f5c6f3899cd852c58d006876c188b06c9093b7372f967948198882a9c32ba"},{"version":"2dbbbcc4278e15615c72a84c5fc531eb40c20251e1957fbc0940cb10ac54adc0","signature":"7a17b7e9cc71135e7ef3bc471a24c78944735953b2854b2f04ee038af64d1a5a"},{"version":"31cfe5c565546aa6c6499ddc519adabe52a4bb5aefcffaefb3aa87f4a9b191a5","signature":"641ebb426775fd4f2777542ad3e5d27181fb14d48d2817282d598262a540ffc4"},{"version":"a28ac3e717907284b3910b8e9b3f9844a4e0b0a861bea7b923e5adf90f620330","impliedFormat":1},{"version":"b6d03c9cfe2cf0ba4c673c209fcd7c46c815b2619fd2aad59fc4229aaef2ed43","impliedFormat":1},{"version":"82e5a50e17833a10eb091923b7e429dc846d42f1c6161eb6beeb964288d98a15","impliedFormat":1},{"version":"670a76db379b27c8ff42f1ba927828a22862e2ab0b0908e38b671f0e912cc5ed","impliedFormat":1},{"version":"13b77ab19ef7aadd86a1e54f2f08ea23a6d74e102909e3c00d31f231ed040f62","impliedFormat":1},{"version":"069bebfee29864e3955378107e243508b163e77ab10de6a5ee03ae06939f0bb9","impliedFormat":1},{"version":"151ff381ef9ff8da2da9b9663ebf657eac35c4c9a19183420c05728f31a6761d","impliedFormat":1},{"version":"f3d8c757e148ad968f0d98697987db363070abada5f503da3c06aefd9d4248c1","impliedFormat":1},{"version":"d153a11543fd884b596587ccd97aebbeed950b26933ee000f94009f1ab142848","affectsGlobalScope":true,"impliedFormat":1},{"version":"c0671b50bb99cc7ad46e9c68fa0e7f15ba4bc898b59c31a17ea4611fab5095da","affectsGlobalScope":true,"impliedFormat":1},{"version":"d802f0e6b5188646d307f070d83512e8eb94651858de8a82d1e47f60fb6da4e2","affectsGlobalScope":true,"impliedFormat":1},{"version":"aa83e100f0c74a06c9d24f40a096c9e9cc3c02704250d01541e22c0ae9264eda","affectsGlobalScope":true,"impliedFormat":1},{"version":"1db0b7dca579049ca4193d034d835f6bfe73096c73663e5ef9a0b5779939f3d0","affectsGlobalScope":true,"impliedFormat":1},{"version":"387a023d363f755eb63450a66c28b14cdd7bc30a104565e2dbf0a8988bb4a56c","affectsGlobalScope":true,"impliedFormat":1},{"version":"9798340ffb0d067d69b1ae5b32faa17ab31b82466a3fc00d8f2f2df0c8554aaa","affectsGlobalScope":true,"impliedFormat":1},{"version":"f26b11d8d8e4b8028f1c7d618b22274c892e4b0ef5b3678a8ccbad85419aef43","affectsGlobalScope":true,"impliedFormat":1},{"version":"cdcf9ea426ad970f96ac930cd176d5c69c6c24eebd9fc580e1572d6c6a88f62c","impliedFormat":1},{"version":"23cd712e2ce083d68afe69224587438e5914b457b8acf87073c22494d706a3d0","impliedFormat":1},{"version":"487b694c3de27ddf4ad107d4007ad304d29effccf9800c8ae23c2093638d906a","impliedFormat":1},{"version":"3a80bc85f38526ca3b08007ee80712e7bb0601df178b23fbf0bf87036fce40ce","impliedFormat":1},{"version":"ccf4552357ce3c159ef75f0f0114e80401702228f1898bdc9402214c9499e8c0","impliedFormat":1},{"version":"c6fd2c5a395f2432786c9cb8deb870b9b0e8ff7e22c029954fabdd692bff6195","impliedFormat":1},{"version":"68834d631c8838c715f225509cfc3927913b9cc7a4870460b5b60c8dbdb99baf","impliedFormat":1},{"version":"2931540c47ee0ff8a62860e61782eb17b155615db61e36986e54645ec67f67c2","impliedFormat":1},{"version":"3c8e93af4d6ce21eb4c8d005ad6dc02e7b5e6781f429d52a35290210f495a674","impliedFormat":1},{"version":"f6faf5f74e4c4cc309a6c6a6c4da02dbb840be5d3e92905a23dcd7b2b0bd1986","impliedFormat":1},{"version":"ea6bc8de8b59f90a7a3960005fd01988f98fd0784e14bc6922dde2e93305ec7d","impliedFormat":1},{"version":"36107995674b29284a115e21a0618c4c2751b32a8766dd4cb3ba740308b16d59","impliedFormat":1},{"version":"914a0ae30d96d71915fc519ccb4efbf2b62c0ddfb3a3fc6129151076bc01dc60","impliedFormat":1},{"version":"33e981bf6376e939f99bd7f89abec757c64897d33c005036b9a10d9587d80187","impliedFormat":1},{"version":"7fd1b31fd35876b0aa650811c25ec2c97a3c6387e5473eb18004bed86cdd76b6","impliedFormat":1},{"version":"b41767d372275c154c7ea6c9d5449d9a741b8ce080f640155cc88ba1763e35b3","impliedFormat":1},{"version":"3bacf516d686d08682751a3bd2519ea3b8041a164bfb4f1d35728993e70a2426","impliedFormat":1},{"version":"00b21ef538da5a2bbe419e2144f3be50661768e1e039ef2b57bb89f96aff9b18","impliedFormat":1},{"version":"0a60a292b89ca7218b8616f78e5bbd1c96b87e048849469cccb4355e98af959a","impliedFormat":1},{"version":"0b6e25234b4eec6ed96ab138d96eb70b135690d7dd01f3dd8a8ab291c35a683a","impliedFormat":1},{"version":"9666f2f84b985b62400d2e5ab0adae9ff44de9b2a34803c2c5bd3c8325b17dc0","impliedFormat":1},{"version":"40cd35c95e9cf22cfa5bd84e96408b6fcbca55295f4ff822390abb11afbc3dca","impliedFormat":1},{"version":"b1616b8959bf557feb16369c6124a97a0e74ed6f49d1df73bb4b9ddf68acf3f3","impliedFormat":1},{"version":"e843e840f484f7e59b2ef9488501a301e3300a8e3e56aa84a02ddf915c7ce07d","impliedFormat":1},{"version":"40b463c6766ca1b689bfcc46d26b5e295954f32ad43e37ee6953c0a677e4ae2b","impliedFormat":1},{"version":"249b9cab7f5d628b71308c7d9bb0a808b50b091e640ba3ed6e2d0516f4a8d91d","impliedFormat":1},{"version":"80aae6afc67faa5ac0b32b5b8bc8cc9f7fa299cff15cf09cc2e11fd28c6ae29e","impliedFormat":1},{"version":"f473cd2288991ff3221165dcf73cd5d24da30391f87e85b3dd4d0450c787a391","impliedFormat":1},{"version":"499e5b055a5aba1e1998f7311a6c441a369831c70905cc565ceac93c28083d53","impliedFormat":1},{"version":"54c3e2371e3d016469ad959697fd257e5621e16296fa67082c2575d0bf8eced0","impliedFormat":1},{"version":"beb8233b2c220cfa0feea31fbe9218d89fa02faa81ef744be8dce5acb89bb1fd","impliedFormat":1},{"version":"78b29846349d4dfdd88bd6650cc5d2baaa67f2e89dc8a80c8e26ef7995386583","impliedFormat":1},{"version":"5d0375ca7310efb77e3ef18d068d53784faf62705e0ad04569597ae0e755c401","impliedFormat":1},{"version":"59af37caec41ecf7b2e76059c9672a49e682c1a2aa6f9d7dc78878f53aa284d6","impliedFormat":1},{"version":"addf417b9eb3f938fddf8d81e96393a165e4be0d4a8b6402292f9c634b1cb00d","impliedFormat":1},{"version":"48cc3ec153b50985fb95153258a710782b25975b10dd4ac8a4f3920632d10790","impliedFormat":1},{"version":"adf27937dba6af9f08a68c5b1d3fce0ca7d4b960c57e6d6c844e7d1a8e53adae","impliedFormat":1},{"version":"18f8cfbb14ba9405e67d30968ae67b8d19133867d13ebc49c8ed37ec64ce9bdb","impliedFormat":1},{"version":"2e85db9e6fd73cfa3d7f28e0ab6b55417ea18931423bd47b409a96e4a169e8e6","impliedFormat":1},{"version":"c46e079fe54c76f95c67fb89081b3e399da2c7d109e7dca8e4b58d83e332e605","impliedFormat":1},{"version":"866078923a56d026e39243b4392e282c1c63159723996fa89243140e1388a98d","impliedFormat":1},{"version":"830171b27c5fdf9bcbe4cf7d428fcf3ae2c67780fb7fbdccdf70d1623d938bc4","affectsGlobalScope":true,"impliedFormat":1},{"version":"1cf059eaf468efcc649f8cf6075d3cb98e9a35a0fe9c44419ec3d2f5428d7123","affectsGlobalScope":true,"impliedFormat":1},{"version":"e7721c4f69f93c91360c26a0a84ee885997d748237ef78ef665b153e622b36c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"d97fb21da858fb18b8ae72c314e9743fd52f73ebe2764e12af1db32fc03f853f","affectsGlobalScope":true,"impliedFormat":1},{"version":"f68328826a275104d92bd576c796c570f66365f25ea8bbaaa208727bce132d5f","impliedFormat":1},{"version":"7cf69dd5502c41644c9e5106210b5da7144800670cbe861f66726fa209e231c4","impliedFormat":1},{"version":"72c1f5e0a28e473026074817561d1bc9647909cf253c8d56c41d1df8d95b85f7","impliedFormat":1},{"version":"18334defc3d0a0e1966f5f3c23c7c83b62c77811e51045c5a7ff3883b446f81f","affectsGlobalScope":true,"impliedFormat":1},{"version":"8b17fcd63aa13734bf1d01419f4d6031b1c6a5fb2cbdb45e9839fb1762bdf0df","impliedFormat":1},{"version":"c4e8e8031808b158cfb5ac5c4b38d4a26659aec4b57b6a7e2ba0a141439c208c","impliedFormat":1},{"version":"2c91d8366ff2506296191c26fd97cc1990bab3ee22576275d28b654a21261a44","affectsGlobalScope":true,"impliedFormat":1},{"version":"5524481e56c48ff486f42926778c0a3cce1cc85dc46683b92b1271865bcf015a","impliedFormat":1},{"version":"beb77fcd86c8cee62c32b2fb82753f5bc0e171d938e20af3cb0b8925db78d60b","impliedFormat":1},{"version":"289e9894a4668c61b5ffed09e196c1f0c2f87ca81efcaebdf6357cfb198dac14","impliedFormat":1},{"version":"25a1105595236f09f5bce42398be9f9ededc8d538c258579ab662d509aa3b98e","impliedFormat":1},{"version":"aa9224557befad144262c85b463c0a7ba8a3a0ad2a7c907349f8bb8bc3fe4abc","impliedFormat":1},{"version":"a2e2bbde231b65c53c764c12313897ffdfb6c49183dd31823ee2405f2f7b5378","impliedFormat":1},{"version":"ad1cc0ed328f3f708771272021be61ab146b32ecf2b78f3224959ff1e2cd2a5c","impliedFormat":1},{"version":"8d86c8d8c43e04cc3dde9953e571656812c8964a3651203af7b3a1df832a34df","affectsGlobalScope":true,"impliedFormat":1},{"version":"0121911fcc364eb821d058cf4c3b9339f197eccbe298098a4c6be0396b607d90","impliedFormat":1},{"version":"c6176c7b9f3769ba7f076c7a791588562c653cc0ba08fb2184f87bf78db2a87c","impliedFormat":1},{"version":"6def204d0b267101d3a42300a7363f53406c5d86b932e76e2365bf89689a85c4","impliedFormat":1},{"version":"4f766affd1281935fe5f7fd5d7af693a7c26d81adef7c1aefb84b9cd573a9cbb","impliedFormat":1},{"version":"165a0c1f95bc939c72f18a280fc707fba6f2f349539246b050cfc09eb1d9f446","impliedFormat":1},{"version":"bbf42f98a5819f4f06e18c8b669a994afe9a17fe520ae3454a195e6eabf7700d","impliedFormat":1},{"version":"c0bb1b65757c72bbf8ddf7eaa532223bacf58041ff16c883e76f45506596e925","impliedFormat":1},{"version":"c8b85f7aed29f8f52b813f800611406b0bfe5cf3224d20a4bdda7c7f73ce368e","affectsGlobalScope":true,"impliedFormat":1},{"version":"7baae9bf5b50e572e7742c886c73c6f8fa50b34190bc5f0fd20dd7e706fda832","impliedFormat":1},{"version":"e99b0e71f07128fc32583e88ccd509a1aaa9524c290efb2f48c22f9bf8ba83b1","impliedFormat":1},{"version":"76957a6d92b94b9e2852cf527fea32ad2dc0ef50f67fe2b14bd027c9ceef2d86","impliedFormat":1},{"version":"5e9f8c1e042b0f598a9be018fc8c3cb670fe579e9f2e18e3388b63327544fe16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a8a99a5e6ed33c4a951b67cc1fd5b64fd6ad719f5747845c165ca12f6c21ba16","affectsGlobalScope":true,"impliedFormat":1},{"version":"a58a15da4c5ba3df60c910a043281256fa52d36a0fcdef9b9100c646282e88dd","impliedFormat":1},{"version":"b36beffbf8acdc3ebc58c8bb4b75574b31a2169869c70fc03f82895b93950a12","impliedFormat":1},{"version":"de263f0089aefbfd73c89562fb7254a7468b1f33b61839aafc3f035d60766cb4","impliedFormat":1},{"version":"70b57b5529051497e9f6482b76d91c0dcbb103d9ead8a0549f5bab8f65e5d031","impliedFormat":1},{"version":"8c81fd4a110490c43d7c578e8c6f69b3af01717189196899a6a44f93daa57a3a","impliedFormat":1},{"version":"1013eb2e2547ad8c100aca52ef9df8c3f209edee32bb387121bb3227f7c00088","impliedFormat":1},{"version":"b827f8800f42858f0a751a605c003b7ab571ff7af184436f36cef9bdfebae808","impliedFormat":1},{"version":"363eedb495912790e867da6ff96e81bf792c8cfe386321e8163b71823a35719a","impliedFormat":1},{"version":"37ba7b45141a45ce6e80e66f2a96c8a5ab1bcef0fc2d0f56bb58df96ec67e972","impliedFormat":1},{"version":"125d792ec6c0c0f657d758055c494301cc5fdb327d9d9d5960b3f129aff76093","impliedFormat":1},{"version":"6b306cd4282bbb54d4a6bb23cfb7a271160983dfc38c67b5a132504cfcc34896","affectsGlobalScope":true,"impliedFormat":1},{"version":"ea713aa14a670b1ea0fbaaca4fd204e645f71ca7653a834a8ec07ee889c45de6","impliedFormat":1},{"version":"450172a56b944c2d83f45cc11c9a388ea967cd301a21202aa0a23c34c7506a18","impliedFormat":1},{"version":"9705cd157ffbb91c5cab48bdd2de5a437a372e63f870f8a8472e72ff634d47c1","affectsGlobalScope":true,"impliedFormat":1},{"version":"ae86f30d5d10e4f75ce8dcb6e1bd3a12ecec3d071a21e8f462c5c85c678efb41","impliedFormat":1},{"version":"3af7d02e5d6ecbf363e61fb842ee55d3518a140fd226bdfb24a3bca6768c58df","impliedFormat":1},{"version":"e03460fe72b259f6d25ad029f085e4bedc3f90477da4401d8fbc1efa9793230e","impliedFormat":1},{"version":"4286a3a6619514fca656089aee160bb6f2e77f4dd53dc5a96b26a0b4fc778055","impliedFormat":1},{"version":"7dfa742c23851808a77ec27062fbbd381c8c36bb3cfdff46cb8af6c6c233bfc1","affectsGlobalScope":true,"impliedFormat":1},{"version":"cb078cfcd14dc0b1700a48272958f803f30f13f99111c5978c75c3a0aa07e40e","affectsGlobalScope":true,"impliedFormat":1},{"version":"784490137935e1e38c49b9289110e74a1622baf8a8907888dcbe9e476d7c5e44","impliedFormat":1},{"version":"420fdd37c51263be9db3fcac35ffd836216c71e6000e6a9740bb950fb0540654","impliedFormat":1},{"version":"73b0bff83ee76e3a9320e93c7fc15596e858b33c687c39a57567e75c43f2a324","impliedFormat":1},{"version":"3c947600f6f5664cca690c07fcf8567ca58d029872b52c31c2f51d06fbdb581b","affectsGlobalScope":true,"impliedFormat":1},{"version":"493c64d062139b1849b0e9c4c3a6465e1227d2b42be9e26ec577ca728984c041","impliedFormat":1},{"version":"d7e9ab1b0996639047c61c1e62f85c620e4382206b3abb430d9a21fb7bc23c77","impliedFormat":1},{"version":"be1cc4d94ea60cbe567bc29ed479d42587bf1e6cba490f123d329976b0fe4ee5","impliedFormat":1}],"root":[[250,256],[405,426]],"options":{"allowSyntheticDefaultImports":true,"composite":true,"declaration":true,"declarationMap":false,"esModuleInterop":true,"jsx":4,"module":99,"outDir":"./lib-dist","rootDir":"./lib","skipLibCheck":true,"sourceMap":false,"strict":true,"target":7},"referencedMap":[[256,1],[414,2],[416,3],[413,4],[417,5],[418,6],[421,7],[423,8],[255,9],[253,10],[409,11],[424,10],[406,1],[408,12],[254,12],[425,10],[415,10],[252,12],[426,13],[251,14],[410,15],[411,16],[420,17],[422,18],[405,19],[419,20],[407,20],[250,21],[412,22],[249,23],[248,24],[155,25],[156,26],[157,27],[158,28],[159,29],[160,30],[161,31],[162,32],[164,33],[165,34],[166,35],[167,36],[168,37],[169,38],[170,39],[171,40],[172,41],[173,42],[174,43],[175,44],[176,45],[177,46],[178,47],[179,48],[180,49],[181,50],[182,41],[183,51],[184,52],[185,53],[187,54],[186,41],[189,55],[190,56],[188,41],[191,57],[192,58],[193,59],[194,60],[195,61],[196,62],[197,63],[163,41],[198,64],[199,65],[200,66],[201,67],[202,68],[203,69],[204,70],[205,71],[206,72],[207,73],[154,41],[208,74],[209,75],[210,76],[211,77],[212,78],[213,79],[214,80],[215,81],[216,82],[217,83],[218,84],[219,85],[220,86],[221,87],[222,88],[223,89],[224,41],[225,90],[226,91],[227,92],[228,93],[229,94],[230,95],[231,96],[232,97],[233,98],[234,99],[235,100],[236,101],[237,102],[238,103],[239,104],[240,105],[241,106],[242,107],[243,108],[244,109],[245,110],[246,111],[247,112],[404,113],[399,114],[270,115],[271,116],[272,117],[273,118],[274,119],[275,120],[276,121],[277,122],[278,123],[279,124],[280,125],[281,126],[282,127],[283,128],[260,41],[257,41],[261,129],[265,130],[263,131],[262,129],[267,132],[284,133],[285,134],[286,135],[287,136],[288,137],[289,138],[290,139],[291,140],[292,141],[293,142],[294,143],[296,144],[295,145],[297,146],[298,147],[299,148],[300,149],[301,150],[302,151],[258,152],[303,153],[304,154],[305,155],[259,156],[306,157],[268,158],[307,159],[308,160],[309,161],[310,162],[311,163],[312,164],[313,165],[314,166],[315,167],[316,168],[317,169],[318,170],[319,171],[320,172],[321,173],[322,174],[323,175],[324,176],[325,177],[326,178],[327,179],[328,180],[329,181],[330,182],[331,183],[332,184],[333,185],[334,186],[335,187],[264,188],[336,189],[337,190],[338,191],[269,41],[339,192],[340,193],[341,194],[342,195],[343,196],[344,197],[345,198],[346,199],[347,200],[348,201],[266,41],[349,202],[350,203],[351,204],[352,205],[353,206],[354,207],[355,208],[356,209],[357,210],[358,211],[359,212],[360,213],[361,214],[362,215],[363,216],[364,217],[365,218],[366,219],[367,220],[368,221],[369,222],[370,41],[371,223],[372,224],[373,225],[374,226],[375,227],[376,228],[377,229],[378,230],[380,231],[379,232],[381,233],[382,234],[383,235],[384,236],[385,237],[386,238],[387,239],[388,240],[389,241],[390,242],[391,243],[392,244],[393,245],[394,246],[395,247],[396,248],[397,249],[398,250],[400,251],[401,252],[402,252],[403,252],[77,253],[78,254],[76,255],[79,256],[90,257],[91,257],[92,257],[93,257],[98,258],[94,259],[95,259],[96,259],[97,259],[99,260],[89,261],[84,258],[88,262],[85,263],[86,258],[87,258],[82,264],[81,263],[83,265],[75,255],[74,266],[67,267],[68,255],[66,268],[72,269],[56,270],[60,271],[61,255],[62,255],[54,255],[55,255],[71,272],[63,255],[57,255],[58,255],[64,255],[65,255],[69,255],[59,255],[73,273],[153,274],[152,275],[100,276],[101,277],[102,278],[103,279],[104,280],[105,281],[106,282],[107,283],[108,284],[109,285],[110,286],[111,287],[112,288],[113,289],[114,290],[115,291],[116,292],[117,293],[118,294],[119,295],[120,296],[121,297],[122,298],[123,299],[124,300],[125,301],[126,302],[127,303],[128,304],[129,305],[130,306],[131,307],[132,41],[133,41],[134,308],[135,309],[136,310],[137,311],[138,312],[139,313],[140,314],[141,315],[142,41],[143,41],[144,41],[145,316],[146,317],[147,318],[148,319],[149,320],[150,321],[151,322],[429,323],[427,255],[80,255],[70,255],[432,324],[428,323],[430,325],[431,323],[433,255],[434,255],[488,326],[489,326],[490,327],[437,328],[491,329],[492,330],[493,331],[435,255],[494,332],[495,333],[496,334],[497,335],[498,336],[499,337],[500,337],[501,338],[502,339],[503,340],[504,341],[438,255],[436,255],[505,342],[506,343],[507,344],[541,345],[508,346],[509,255],[510,347],[511,348],[512,349],[513,350],[514,351],[515,352],[516,353],[517,354],[518,355],[519,355],[520,356],[521,255],[522,255],[523,357],[525,358],[524,359],[526,360],[527,361],[528,362],[529,363],[530,364],[531,365],[532,366],[533,367],[534,368],[535,369],[536,370],[537,371],[538,372],[439,255],[440,373],[441,255],[442,255],[484,374],[485,375],[486,255],[487,360],[539,376],[540,377],[542,378],[50,255],[52,379],[53,378],[51,255],[48,255],[49,255],[8,255],[9,255],[11,255],[10,255],[2,255],[12,255],[13,255],[14,255],[15,255],[16,255],[17,255],[18,255],[19,255],[3,255],[20,255],[21,255],[4,255],[22,255],[26,255],[23,255],[24,255],[25,255],[27,255],[28,255],[29,255],[5,255],[30,255],[31,255],[32,255],[33,255],[6,255],[37,255],[34,255],[35,255],[36,255],[38,255],[7,255],[39,255],[44,255],[45,255],[40,255],[41,255],[42,255],[43,255],[1,255],[46,255],[47,255],[460,380],[472,381],[458,382],[473,383],[482,384],[449,385],[450,386],[448,387],[481,388],[476,389],[480,390],[452,391],[469,392],[451,393],[479,394],[446,395],[447,389],[453,396],[454,255],[459,397],[457,396],[444,398],[483,399],[474,400],[463,401],[462,396],[464,402],[467,403],[461,404],[465,405],[477,388],[455,406],[456,407],[468,408],[445,383],[471,409],[470,396],[466,410],[475,255],[443,255],[478,411]],"latestChangedDtsFile":"./lib-dist/index.d.ts","version":"5.9.3"}
+26
tsconfig.node.json
···
+
{
+
"compilerOptions": {
+
"tsBuildInfoFile": "./node_modules/.tmp/tsconfig.node.tsbuildinfo",
+
"target": "ES2023",
+
"lib": ["ES2023"],
+
"module": "ESNext",
+
"types": ["node"],
+
"skipLibCheck": true,
+
+
/* Bundler mode */
+
"moduleResolution": "bundler",
+
"allowImportingTsExtensions": true,
+
"verbatimModuleSyntax": true,
+
"moduleDetection": "force",
+
"noEmit": true,
+
+
/* Linting */
+
"strict": true,
+
"noUnusedLocals": true,
+
"noUnusedParameters": true,
+
"erasableSyntaxOnly": true,
+
"noFallthroughCasesInSwitch": true,
+
"noUncheckedSideEffectImports": true
+
},
+
"include": ["vite.config.ts"]
+
}
+7
vite.config.ts
···
+
import { defineConfig } from 'vite'
+
import react from '@vitejs/plugin-react'
+
+
// https://vite.dev/config/
+
export default defineConfig({
+
plugins: [react()],
+
})